1. ホーム
  2. objective-c

[解決済み] NSLocalizedStringを使用したベストプラクティス

2022-05-30 01:47:38

質問

私は (他の人と同じように) NSLocalizedString を使用してアプリをローカライズしています。

残念ながら、以下のようないくつかの欠点があります (必ずしも NSLocalizedString 自体のせいではありません)。

  • Xcode では、文字列のオートコンプリートがありません。このため、エラーが発生しやすいだけでなく、作業が面倒になります。
  • 同等の文字列が既に存在することを知らなかったために、単に文字列を再定義してしまうことがあります (例 "Please enter password" vs. "Enter password first")。
  • オートコンプリートの問題と同様に、コメント文字列を "記憶する"/コピーペーストする必要があり、さもなければ genstring という文字列は、1 つの文字列に対して複数のコメントを持つことになります。
  • を使用したい場合は genstring を使いたい場合、古いローカライズを失わないように注意しなければなりません。
  • 同じ文字列がプロジェクト全体に散らばっています。例えば、あなたが NSLocalizedString(@"Abort", @"Cancel action") を使っていたのに、Code Review でその文字列を NSLocalizedString(@"Cancel", @"Cancel action") に変更し、コードをより一貫性のあるものにするよう求めています。

私がやっているのは(SOで検索した結果、多くの人がやっていると思ったのですが)、独立した strings.h ファイルを作成することです。 #define のようなローカライズコードがあります。例えば

// In strings.h
#define NSLS_COMMON_CANCEL NSLocalizedString(@"Cancel", nil)
// Somewhere else
NSLog(@"%@", NSLS_COMMON_CANCEL);

これは本質的に、コード補完、変数名を変更するための単一の場所(だからもうgenstringは必要ない)、自動リファクタリングのためのユニークなキーワードを提供するものです。しかし、その代償として、たくさんの #define ステートメントが大量に発生することになります。

これはある程度うまくいくのですが、みなさんがプロジェクトでどのように行っているのか気になりました。NSLocalizedString の使用を簡略化する他のアプローチはありますか? それをカプセル化するフレームワークもあるのでしょうか。

どのように解決するのですか?

NSLocalizedString にはいくつかの制限がありますが、Cocoa の中心的なものなので、ローカライズを処理するためのカスタムコードを書くのは不合理であり、それを使用しなければならないことを意味します。とはいえ、少しのツールは役に立ちます。ここでは、私がどのように進めているかを説明します。

文字列ファイルを更新する

genstrings は文字列ファイルを上書きし、以前の翻訳をすべて破棄します。 私が書いた アップデート_文字列.py を実行して、古い文字列ファイルをパースします。 genstrings を実行して空白を埋めることで、既存の翻訳を手動で復元する必要がなくなります。 このスクリプトは、既存の文字列ファイルを更新するときに大きな差分が生じないように、できるだけ一致させようとします。

文字列の命名

もしあなたが NSLocalizedString を広告のように

NSLocalizedString(@"Cancel or continue?", @"Cancel notice message when a download takes too long to proceed");

同じ文字列を別の場所で定義することになり、同じ英語でも文脈によって意味が異なるため、衝突する可能性があります ( OKCancel が思い浮かびます)。 そのため、私はいつも無意味な全角文字列にモジュール固有の接頭辞をつけ、非常に正確な記述をするようにしています。

NSLocalizedString(@"DOWNLOAD_CANCEL_OR_CONTINUE", @"Cancel notice window title when a download takes too long to proceed");

同じ文字列を別の場所で使用する

同じ文字列を何度も使用する場合は、先ほどのようにマクロを使用するか、ビューコントローラまたはデータソースのインスタンス変数としてキャッシュします。 この方法では、同じローカライゼーションのインスタンス間で陳腐化し、一貫性がなくなる可能性のある記述を繰り返す必要がなくなり、常に混乱を招くことになります。 インスタンス変数はシンボルなので、最も一般的な翻訳に対して自動補完を使用し、特定の翻訳に対しては "manual"文字列を使用することができます。

これらのヒントにより、Cocoa ローカライゼーションがより生産的になることを願っています。