Система переводов
MMO-DEV WEB использует систему переводов на основе Symfony Translation с поддержкой ICU MessageFormat.
Фильтр |trans
Базовое использование
Базовое использование
{{ 'Welcome'|trans }}
{# Ищет перевод в домене по умолчанию (messages) #}
{{ 'site.welcome_message'|trans }}
Указание домена
Указание домена
{{ 'login.title'|trans({}, 'user') }}
{# Ищет перевод в домене "user" #}
{{ 'nav.home'|trans({}, 'navigation') }}
{{ 'market.buy_button'|trans({}, 'market') }}
Параметры подстановки
Параметры подстановки
{{ 'Hello, %name%!'|trans({'%name%': user.name}) }}
{{ 'You have %count% messages'|trans({'%count%': count}, 'cabinet') }}
Структура файлов переводов
Файлы переводов расположены в директории Language/:
Доступные домены
| Домен | Описание |
|---|---|
common | Общие фразы (кнопки, статусы, ошибки) |
site | Тексты основного сайта |
user | Авторизация, регистрация, профиль |
cabinet | Личный кабинет |
admin | Панель администрирования |
navigation | Навигационное меню |
market | Игровой магазин |
forum | Форум |
news | Новости |
tickets | Система тикетов |
Формат файлов переводов
Каждый файл перевода - PHP-файл, возвращающий массив:
// Language/ru/common.php
return [
'save' => 'Сохранить',
'cancel' => 'Отмена',
'delete' => 'Удалить',
'edit' => 'Редактировать',
'loading' => 'Загрузка...',
'error.not_found' => 'Не найдено',
'error.access_denied' => 'Доступ запрещён',
'status.active' => 'Активен',
'status.inactive' => 'Неактивен',
];
// Language/en/common.php
return [
'save' => 'Save',
'cancel' => 'Cancel',
'delete' => 'Delete',
'edit' => 'Edit',
'loading' => 'Loading...',
'error.not_found' => 'Not Found',
'error.access_denied' => 'Access Denied',
'status.active' => 'Active',
'status.inactive' => 'Inactive',
];
ICU MessageFormat
Для сложных переводов используется ICU MessageFormat.
Plurals (множественное число)
// Language/ru/cabinet.php
return [
'messages_count' => '{count, plural,
one {# сообщение}
few {# сообщения}
many {# сообщений}
other {# сообщений}
}',
];
Plurals (множественное число)
{{ 'messages_count'|trans({count: 1}, 'cabinet') }}
{# 1 сообщение #}
{{ 'messages_count'|trans({count: 3}, 'cabinet') }}
{# 3 сообщения #}
{{ 'messages_count'|trans({count: 5}, 'cabinet') }}
{# 5 сообщений #}
Gender (род)
return [
'user_action' => '{gender, select,
male {Он обновил профиль}
female {Она обновила профиль}
other {Профиль обновлён}
}',
];
Gender (род)
{{ 'user_action'|trans({gender: user.gender}, 'user') }}
Ordinal (порядковые числительные)
return [
'place' => '{place, selectordinal,
one {#-е место}
other {#-е место}
}',
];
Комбинирование
return [
'welcome' => '{gender, select,
male {Уважаемый {name}, у вас {count, plural,
one {# новое уведомление}
few {# новых уведомления}
many {# новых уведомлений}
other {# новых уведомлений}
}}
female {Уважаемая {name}, у вас {count, plural,
one {# новое уведомление}
few {# новых уведомления}
many {# новых уведомлений}
other {# новых уведомлений}
}}
other {Здравствуйте, {name}! У вас {count, plural,
one {# новое уведомление}
few {# новых уведомления}
many {# новых уведомлений}
other {# новых уведомлений}
}}
}',
];
Комбинирование
{{ 'welcome'|trans({
gender: user.gender,
name: user.name,
count: notifications|length
}, 'site') }}
Fallback-локали
Если перевод не найден в текущей локали, система ищет его в fallback-локали:
Запрос: de -> Fallback: en -> Fallback: ru
Порядок поиска:
- Текущая локаль (
de) - Первый fallback (
en) - Основной fallback (
ru) - Ключ перевода как есть
Использование в JavaScript
Переводы можно передать в JavaScript через data-атрибуты или глобальный объект:
Использование в JavaScript
<div data-confirm="{{ 'Вы уверены?'|trans({}, 'common') }}">
<script>
const translations = {{ {
save: 'save'|trans({}, 'common'),
cancel: 'cancel'|trans({}, 'common'),
confirm: 'confirm'|trans({}, 'common')
}|json_encode|raw }};
</script>