Локализация (i18n)
Pano поддерживает мощную систему локализации. Каталог src/main/resources/locales вашего плагина должен содержать файлы перевода для поддерживаемых языков.
- Формат файла: Все файлы перевода должны быть действительными файлами
.json.
Язык по умолчанию (Fallback)
Если перевод отсутствует для текущего языка пользователя, Pano автоматически переключится на en-US.json. Убедитесь, что этот файл существует и заполнен.
Пользовательская настройка и переопределения
Одной из мощных функций Pano является то, что администраторы могут изменять переводы вашего плагина непосредственно из панели Pano.
- Переопределения: Пользователи могут редактировать любой определенный вами ключ перевода, эффективно переопределяя ваш текст по умолчанию без изменения JAR-файла плагина.
- Новые языки: Пользователи могут добавлять поддержку языков, которые ваш плагин изначально не поддерживает, создавая новые записи перевода в панели.
Эти настройки хранятся отдельно в Pano и сохраняются даже после выпуска обновлений для вашего плагина.
Определение переводов
Разрешения (Permissions)
Если ваш плагин использует систему разрешений Pano, вы должны предоставить человекочитаемые заголовки и описания для каждого узла разрешений.
Ключ внутри permissions соответствует имени вашего класса разрешения, преобразованному в SCREAMING_SNAKE_CASE.
Определение:
@PermissionDefinition
class ManageFAQPermission : PanelPermission("fa-question-circle")@PermissionDefinition
public class ManageFAQPermission extends PanelPermission {
public ManageFAQPermission() {
super("fa-question-circle");
}
}Перевод:
{
"permissions": {
"MANAGE_FAQ": {
"title": "Manage FAQ",
"description": "Позволяет управлять записями и категориями FAQ."
}
}
}Эти заголовки и описания отображаются на странице Разрешения (Permissions) в панели Pano, позволяя администраторам понимать и эффективно назначать права доступа.
Журналы активности (Activity Logs)
Если ваш плагин записывает журналы активности, вам необходимо определить для них шаблоны внутри объекта activity-logs. Pano использует синтаксис {variable} (одинарные фигурные скобки) для динамических заполнителей в сообщениях журнала.
Ключ внутри activity-logs соответствует имени вашего класса журнала, преобразованному в SCREAMING_SNAKE_CASE (без суффикса 'Log').
Определение Kotlin:
class CreatedFAQCategoryLog(
userId: Long,
username: String,
pluginId: String,
name: String
) : PluginActivityLog(
userId = userId,
pluginId = pluginId,
details = JsonObject().put("target", name).put("username", username)
)Перевод:
{
"activity-logs": {
"CREATED_FAQ_CATEGORY": "<b>{username}</b> создал категорию FAQ: {target}."
}
}Важно
И permissions, и activity-logs должны находиться на корневом уровне вашего JSON-файла. Система Pano автоматически управляет этими разделами для интеграции с основной платформой.
Пользовательские ключи
Вы можете определить произвольные пары ключ-значение для использования в интерфейсе вашего плагина или сообщениях бэкенда.
{
"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), вы должны использовать полный путь:
// Ручной доступ к переводу вашего плагина
$t('plugins.your-plugin-id.dashboard-title')
// Доступ к глобальному переводу Pano
$t('global.save')