web-dev-qa-db-ja.com

Flutterの国際化-動的な文字列

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パッケージを使用することは可能ですか?

11
Notheros

intlパッケージのREADMEは、その例を説明しています https://github.com/Dart-lang/intl

メッセージを関数でラップする目的は、結果で使用できるパラメーターをメッセージに持たせることです。メッセージ文字列は、関数のパラメータのみを使用でき、単純な式でのみ使用できる、制限された形式のDart文字列補間を使用できます。ローカル変数は使用できません。また、中括弧付きの式も使用できません。メッセージ文字列のみが補間できます。 name、desc、args、およびexamplesはリテラルである必要があり、補間を含めることはできません。変数を参照できるのは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'));

このセクションの下には、複数形や性別も扱う、より複雑な例が説明されています。

7