Интернационализация флаттера - динамические струны
Я перевожу свое приложение на испанский с помощью пакета intl.
locales.dart
class AppLocale {
...
String get folder => Intl.message("Folder", name: 'folder');
...
}
messages_es.dart
class MessageLookup extends MessageLookupByLibrary {
get localeName => 'es';
final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => <String, Function> {
"folder": MessageLookupByLibrary.simpleMessage("Carpeta"),
};
}
Я звоню, используя следующий код:
AppLocale.of(context).folder
Работает нормально.
Однако мне нужно создавать "динамические" строки. Например:
"Привет, {$name}"
Тогда я бы назвал эту строку, передав это "имя" в качестве параметра, или что-то вроде этого. Это будет переводиться как "Hola, {$name}" на испанском языке.
Возможно ли использовать этот пакет intl?
4 ответа
ЧИТАНИЕ intl
пакет объясняет этот пример https://github.com/dart-lang/intl
Цель переноса сообщения в функцию - позволить ему иметь параметры, которые можно использовать в результате. Строка сообщения может использовать ограниченную форму интерполяции строки Дартс, где могут использоваться только параметры функции и только в простых выражениях. Нельзя использовать локальные переменные, а также выражения с фигурными скобками. Только строка сообщения может иметь интерполяцию. Имя, описание, аргументы и примеры должны быть литералами и не содержать интерполяции. Только параметр args может ссылаться на переменные, и в нем должен быть указан точно параметр функции. Если вы передаете числа или даты и хотите, чтобы они были отформатированы, вы должны выполнить форматирование вне функции и передать отформатированную строку в сообщение.
greetingMessage(name) => Intl.message( "Hello $name!", name: "greetingMessage", args: [name], desc: "Greet the user as they first open the application", examples: const {'name': "Emily"}); print(greetingMessage('Dan'));
Ниже этого раздела есть более сложные объясненные примеры, которые также касаются множественного числа и полов.
Если вы следуете официальным документам по интернационализации и указываете все свои фразы в
.arb
файлы, вы можете сделать такие параметры:
{
"greeting": "Hi, {name}!",
"@greeting": {
"description": "Greet the user by their name.",
"placeholders": {
"name": {
"type": "String",
"example": "Jane"
}
}
}
}
Когда вы компилируете свой код, для вас будет сгенерирована функция, подобная приведенной ниже, в комплекте с красивым документом для поддержки всплывающих подсказок IDE:
/// Greet the user by their name.
///
/// In en, this message translates to:
/// **'Hi, {name}!'**
String greeting(String name);
Так что вы можете просто использовать это так:
Text(AppLocalizations.of(context)!.greeting("Koos"))
Чтобы использовать заполнители в своих переводах, вам необходимо:
- Добавьте этот заполнитель как аргумент получателя
- Упомяните этот заполнитель с
$
префикс в переводе (т.е.$name
) - Добавьте заполнитель в
args
список при звонкеIntl.message
Полный пример выглядит так:
greetingMessage(name) => Intl.message(
"Hello $name!",
name: 'greetingMessage',
args: [name]
);
Однако вы можете использовать плагин Flutter Intl для VS Code и просто определять переводы в файле ARB, и он генерирует все эти геттеры для вас. В этом случае в файле ARB вы просто добавите пару ключ-значение, подобную этой:
"greetingMessage": "Hello {name}!"
Перейдите по этой ссылке . После того, как вы закончите все шаги, внесите следующие изменения в свой
.arb
файл:
{
"title": "App Title",
"helloWorld": "{name1} and {name2} must be different",
"@helloWorld": {
"description": "The conventional newborn programmer greeting",
"placeholders": {
"name1": {
"type": "String"
},
"name2": {
"type": "String"
}
}
},
"appInfo": "Information about your app",
}