Интернационализация

Интернационализация является одной из основных особенностей CMintS. Идея является в использование общей структуры и синтаксиса в страницах, теме и предоставить дополнительные помощников для управления многоязычным сайтом.

Структура директории locales

файлы локалей должны находиться в каталогеlocales:

locales
├── de
│   ├── about.json
│   └── news.json
├── en
│   ├── about.json
│   ├── header.json
│   └── news.json
└── ru
    ├── about
    │   └── team.json
    ├── about.json
    ├── documentation
    │   ├── getting-started
    │   │   └── configuration.json
    │   └── i18n
    │       └── index.json
    ├── header.json
    ├── index.json
    └── news.json

Каталоги верхнего уровня в locales являются кодами локали(locale). Структура каталогов отражает путь к странице, например, переводы для about/teams.md страницы должны быть расположен в файле /de/about/teams.json, чтобы быть доступным через путь /de/about/teams сайта

Язык по умолчанию

Прежде чем использовать i18n функции, пользователь должен также указать "локаль" по умолчанию, который будет использоваться в качестве исходного языка. Для этого defaultLocale необходимо добавить в параметры i18n в config.js:

const i18nOptions = {
  defaultLocale: "en"
};

module.exports = {i18nOptions};

Файл локалей

Файлы локалей содержат список переводимых строк, строки перевода состоят из stringid, сообщения и необязательного описания.

{
  "heading-main": {
    "description": "Heading of the main page",
    "message": "Заголовок"
  },
  ...
}

Строки перевода

Строки перевода могут быть определены в исходных файлах, помещая их внутри открывающих и закрывающих фигурных скобок. Строка перевода состоит из stringId, необязательное описание и исходный текст

{stringId[Description] Source text}

Например, рассмотрим локаль ru в Локальном файле и строку перевода ниже:

{heading-main[Heading of the main page] Heading}

Будут преобразованы в Heading для языка по умолчанию и в Заголовок для русского языка.

Определение пути

Чтобы использовать строку перевода из определенного пути, а не определять исходного текста в содержимом страницы, можно определить путь к файлу рядом с stringID:

{menu-item-about(menu/header)}

Вышеприведенное выражение означает использование строки с идентификатором menu-item-about из файла %locale%/menu/header.json:

/* /en/menu/header.json */
{
  "menu-item-about": {
    "description": "Menu item label",
    "message": "about us"
  }
}
/* /ru/menu/header.json */
{
  "menu-item-about": {
    "description": "Menu item label",
    "message": "о нас"
  }
}
// Translation expression
{menu-item-about(menu/header)}

Учитывая en и ru языков выше, перевод выражения будут преобразованы в about us для en языка и о нас для ru локали.

Использование тегов

Текущие теги a, img, p, span, div, em, i, b, strong могут использоваться по умолчанию в переводе строки, на пример:

{stringId[Description] My awesome <em>source text</em> goes here}

<a>

Когда используется относительный путь с начинающимся / путём, то локаль и hreflang атрибут создаются автоматически в зависимости от языка целевой страницы. Конфигурация root может быть использована для спецификации корневого каталога веб-сайта, если это необходимо.

Порядок ссылок внутри строк перевода может быть различным в зависимости на языке, поэтому порядок в строке файла языкового стандарта должен быть , поэтому рассмотрим строку перевода ниже:

{paragraph-1 This is <a href="https://www.example1.com">first link</a>, <a href="/random1">second link</a> and <a href="/random2">third link</a>}

И файл Locale со строкой перевода

{
 "paragraph-1": {
   "description": "Paragraph with several links",
   "message": "Это <a2>вторая ссылка</a2>, <a1>первая</a1> и <a3>третья ссылка</a3>"
 },
 ...
}

Результат будет:

Это <a href="/en/random1" hreflang="en">вторая ссылка</a>, <a href="https://www.example1.com">первая</a> и <a href="/en/random2" hreflang="en">третья ссылка</a>

<fix>

Некоторые слова не надо переводить на веб-сайте (например, название бренда), для этого можно использовать тег <fix>:

{fixed-id <fix>CMintS</fix> uses <fix>fix</fix> tag}

и локали ниже:

"fixed-id": {
 "message": "<fix2> тэг используется <fix1>-ом"
}

Получится:

fix тэг используется CMintS-ом

<img>

Подобно тегам <a> и <fix> тег <img> также должен сохранять порядок в строках перевода:

{test-img1 This is <img href="/first.png"> and <img href="/second.png"> image}

и локали ниже:

"test-img1": {
   "description": "Test images order",
   "message": "Это <img2> картинка и <img1>"
}

Получится:

Это <img href="/second.png"> картинка и <img href="/first.png">

атрибуты title и alt

Некоторые атрибуты также должны быть переведены на разные языки, поэтому эти атрибуты также могут использоваться в тегах строки перевода:

{test-attribute1 <div title="Website Logo" id="logo"><img src="/random/path" alt="Jumping puma" />Picture</div>}

и локали ниже:

"test-img1": {
   "description": "Test images order",
   "message": "<div1 title='Логотип сайта'><img1 alt='Пума в прыжке'>Картинка</div1>"
}

Получится:

<div title="Логотип сайта" id="logo"><img src="/random/path" alt="Пума в прыжке" />Картинка</div>

prefix, postfix

Можно также редактировать префикс и постфикс для строк интернационализации в config.js. Это может быть полезно для исправления несовместимости с другими синтаксисами:

Рассмотрим:

/* config.js */

const i18nOptions = {
  defaultLocale: "en",
  prefix: "{{",
  postfix: "}}"
};

module.exports = {i18nOptions};

Для конфигурации, указанной выше можно использовать синтаксис ниже:

{{stringId[Description] Source text}}