Эта страница переведена с английского. Читать страницу на английском
Каждый текст, который видит пользователь, берётся из файлов локалей через t!. Компилятор проверяет, что ключ есть в каждом файле локали и что аргументы соответствуют плейсхолдерам, поэтому отсутствующий перевод это ошибка сборки, а не пустая подпись.
Файлы локалей
locales/<lang>.json содержит вложенные ключи. Во всех файлах должны быть одинаковые ключи.
{
"stock": {
"products": "Products",
"saved": "Product {code} saved."
}
}t!
Screen::new(t!("stock.products"))
ui.toast(t!("stock.saved", code = p.code));t! возвращает Text: ключ с аргументами, который разрешается на языке пользователя при отрисовке страницы. Опечатки приводят к ошибке на этапе компиляции:
error: t!: key `stock.prodcts` is missing in locales/tr.json
= help: add it to every file in locales/Подписи полей и choice
Подписи полей используют ключ <Model>.<field>, например Product.code. Подписи choice используют <Choice>.<Variant>. Если ключа нет, подпись берётся из #[label("...")] или из читаемой формы имени. zeyn check сообщает о ключах, которые есть в одних языках и отсутствуют в других.
{
"Product": { "code": "Code", "name": "Product name" },
"Unit": { "Piece": "Piece", "Kg": "Kilogram" }
}Регистрация языков
let i18n = I18n::new("en")
.catalog("en", include_str!("../locales/en.json"))
.and_then(|i| i.catalog("tr", include_str!("../locales/tr.json")))?;
App::new(t!("app.name")).i18n(i18n)Первый аргумент I18n::new это язык по умолчанию. Если каталогов больше одного, оболочка (shell) показывает выбор языка. Собственные тексты фреймворка (таблица, формы, оболочка) поставляются на английском и турецком.
Тексты фреймворка на других языках
Собственные тексты фреймворка есть также на китайском, русском, испанском, корейском, японском, хинди и арабском. Каждый язык включается отдельной Cargo feature, поэтому приложение платит только за включённые языки (каждый добавляет в бинарный файл от 35 до 60 КБ текста):
zeyn = { version = "0.0", features = ["lang-ru", "lang-ar"] }lang-all включает все языки. Приложение по-прежнему предлагает язык, только когда регистрирует для него собственный каталог, как показано выше. Без feature тексты фреймворка показываются на языке по умолчанию.
Тексты вне экранов
ctx.t(&text)превращаетTextвStringна языке пользователя, например для электронного письма.Text::english()даёт английский текст для журналов и тестов.Text::from("literal")это текст, который никогда не переводится, например код товара.
О том, как выбирается язык и как форматируются числа, деньги и даты, см. Time and languages.