Интернационализация флаттера - динамические струны

Я перевожу свое приложение на испанский с помощью пакета 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",
 }
Другие вопросы по тегам