Skip to content

Локализация (i18n)

Pano поддерживает мощную систему локализации. Каталог src/main/resources/locales вашего плагина должен содержать файлы перевода для поддерживаемых языков.

  • Формат файла: Все файлы перевода должны быть действительными файлами .json.

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

Если перевод отсутствует для текущего языка пользователя, Pano автоматически переключится на en-US.json. Убедитесь, что этот файл существует и заполнен.

Пользовательская настройка и переопределения

Одной из мощных функций Pano является то, что администраторы могут изменять переводы вашего плагина непосредственно из панели Pano.

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

Эти настройки хранятся отдельно в Pano и сохраняются даже после выпуска обновлений для вашего плагина.

Определение переводов

Разрешения (Permissions)

Если ваш плагин использует систему разрешений Pano, вы должны предоставить человекочитаемые заголовки и описания для каждого узла разрешений.

Ключ внутри permissions соответствует имени вашего класса разрешения, преобразованному в SCREAMING_SNAKE_CASE.

Определение:

kotlin
@PermissionDefinition
class ManageFAQPermission : PanelPermission("fa-question-circle")
java
@PermissionDefinition
public class ManageFAQPermission extends PanelPermission {
    public ManageFAQPermission() {
        super("fa-question-circle");
    }
}

Перевод:

json
{
  "permissions": {
    "MANAGE_FAQ": {
      "title": "Manage FAQ",
      "description": "Позволяет управлять записями и категориями FAQ."
    }
  }
}

Эти заголовки и описания отображаются на странице Разрешения (Permissions) в панели Pano, позволяя администраторам понимать и эффективно назначать права доступа.

Журналы активности (Activity Logs)

Если ваш плагин записывает журналы активности, вам необходимо определить для них шаблоны внутри объекта activity-logs. Pano использует синтаксис {variable} (одинарные фигурные скобки) для динамических заполнителей в сообщениях журнала.

Ключ внутри activity-logs соответствует имени вашего класса журнала, преобразованному в SCREAMING_SNAKE_CASE (без суффикса 'Log').

Определение Kotlin:

kotlin
class CreatedFAQCategoryLog(
    userId: Long,
    username: String,
    pluginId: String,
    name: String
) : PluginActivityLog(
    userId = userId,
    pluginId = pluginId,
    details = JsonObject().put("target", name).put("username", username)
)

Перевод:

json
{
  "activity-logs": {
    "CREATED_FAQ_CATEGORY": "<b>{username}</b> создал категорию FAQ: {target}."
  }
}

Важно

И permissions, и activity-logs должны находиться на корневом уровне вашего JSON-файла. Система Pano автоматически управляет этими разделами для интеграции с основной платформой.

Пользовательские ключи

Вы можете определить произвольные пары ключ-значение для использования в интерфейсе вашего плагина или сообщениях бэкенда.

json
{
  "dashboard-title": "Панель моего плагина",
  "welcome-message": "С возвращением, {{username}}!"
}

Использование переводов

Бэкенд (Kotlin)

При отправке локализованных сообщений или уведомлений с бэкенда система локализации Pano обрабатывает замену Handlebars за вас. Вам просто нужно передать ключ перевода и карту (map) переменных.

Фронтенд (Svelte)

Фронтенд Pano опирается на svelte-i18n. Вы можете обратиться к его документации для продвинутого использования.

Помощник $_

Настройка Pano Boilerplate предоставляет удобный метод $_, который внедряется в ваши компоненты Svelte.

  • Назначение: Он действует как ярлык, который автоматически добавляет ID вашего плагина в качестве префикса к вашим ключам перевода.
  • Использование: $_('dashboard-title')
  • Эффект: Система ищет plugins.your-plugin-id.dashboard-title.

Прямой доступ (Без помощника)

Помощник $_ — это синтаксический сахар. Под капотом все переводы плагинов находятся в пространстве имен plugins.<plugin-id>.

Если вы не используете помощник или если вам нужно получить доступ к ключу перевода из-за пределов пространства имен вашего плагина (например, к глобальному тексту кнопки Pano), вы должны использовать полный путь:

javascript
// Ручной доступ к переводу вашего плагина
$t('plugins.your-plugin-id.dashboard-title')

// Доступ к глобальному переводу Pano
$t('global.save')