Перейти к основному содержимому

Система переводов

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/:

Структура 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

Порядок поиска:

  1. Текущая локаль (de)
  2. Первый fallback (en)
  3. Основной fallback (ru)
  4. Ключ перевода как есть

Использование в 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>