性の一致
言語によっては、文の主語となる人物の性別に応じて動詞や形容詞が語形変化します。英語ではほとんど変化しないため、{username} has been invited と書いたフレーズは、英語では1文でも、スペイン語・フランス語・ロシア語では2〜3文になります。Langsys は複数形を生成するときと同じように、翻訳時にこれを処理するため、渡す引数は1つだけです。
パイプラインが生成するもの
ターゲット言語で一致(呼応)が必要な場合、Langsys はそのロケールの文字列を、必要な分岐に書き換えます。これは ICU のselectです。ソースのフレーズが変わることはなく、分岐を手作業で書く必要もありません。
// Your source phrase, unchanged:
"{username} has been invited"
// What the Spanish translation becomes — note invitado / invitada:
"{username_gender, select, male {{username} ha sido invitado} \
female {{username} ha sido invitada} \
other {{username} ha sido invitado/a}}" 押さえておきたい点が2つあります。引数の名前は、活用の対象となる変数名に _gender を付けたものになります。たとえば {username} からは username_gender が生成されます。分岐は常に male、female、other の3つです。また、これは必要なロケールにのみ表示されるため、性のある言語でアプリを読み込む人が現れるまでは目に見えません。
渡し方
引数が分かる場合は常に渡してください。そうすれば、読み手には正しく語形変化した文が表示されます。
// The argument is named after the variable it inflects, + _gender.
// Branches are always male / female / other.
t('{username} has been invited', 'Team', {
username: user.name,
username_gender: user.gender ?? 'other',
}); 性別がわからない場合は、'other' を明示的に渡してください。これが中立の分岐です。引数が欠けている場合の表示は SDK によって異なり、各 SDK のページに記載されています。各 SDK のページでは、その SDK 固有の書き方で呼び出し例も紹介しています。
どのフレーズに必要ですか?
ご自身のコードからは判別できません。これは仕様上避けられないことです。この引数は翻訳時にターゲットロケールごとに追加されるため、元のフレーズにもコードベースにも手がかりはありません。確認する方法は3つあります。
カタログを読み取りましょう。アプリが取得する翻訳は、プロモートされた文字列そのものなので、答えはすでにクライアント側にあります。サポートしているロケールのカタログを取得し(どの SDK でも利用できます)、, select, を含むエントリを探してください。正確なフレーズと引数名がわかります。リリースする各ロケールに対して CI で実行できるほど軽量です。
// The catalog your app fetches IS the promoted strings — grep it.
const wanting = Object.entries(catalog)
.filter(([, translation]) => translation.includes(', select,'))
.map(([phrase]) => phrase);
// → every phrase (and, from the string, every argument) this locale needs デバッグを有効にする(JavaScript SDK)。初期化設定で debug: true を渡し、性別のあるロケールでアプリを閲覧してください。翻訳が必要とする引数が渡されていないフレーズごとに、SDK が引数名を示した Langsys Warning を 1 件ログ出力します。出力はフレーズごと・ロケールごとに 1 回のみで、本番環境では出力されません。注意点が 1 つあります。コンテンツブロックおよびフレーズのコンポーネント内では、念のため渡した _gender 自体が未対応のパラメータとして報告されます。このチェックは、select が現れないソーステキストに対して実行されるためです。
迷ったら渡しましょう。文字列にない引数の値はレンダリング時に無視されるため、人を表すすべての変数に _gender を送っても問題なく、まだ確認していないロケールにも対応できます。
1 つのフレーズにつき変数は 1 つ。一致を決める変数は 1 つだけです。数と性別のように、2 つの変数がある文字列は、入れ子の ICU には変換されず、そのまま 1 つのフラットな文として翻訳されます。