[解決済み] NSLocalizedStringを使用したベストプラクティス
質問
私は (他の人と同じように)
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");
同じ文字列を別の場所で定義することになり、同じ英語でも文脈によって意味が異なるため、衝突する可能性があります (
OK
と
Cancel
が思い浮かびます)。
そのため、私はいつも無意味な全角文字列にモジュール固有の接頭辞をつけ、非常に正確な記述をするようにしています。
NSLocalizedString(@"DOWNLOAD_CANCEL_OR_CONTINUE", @"Cancel notice window title when a download takes too long to proceed");
同じ文字列を別の場所で使用する
同じ文字列を何度も使用する場合は、先ほどのようにマクロを使用するか、ビューコントローラまたはデータソースのインスタンス変数としてキャッシュします。 この方法では、同じローカライゼーションのインスタンス間で陳腐化し、一貫性がなくなる可能性のある記述を繰り返す必要がなくなり、常に混乱を招くことになります。 インスタンス変数はシンボルなので、最も一般的な翻訳に対して自動補完を使用し、特定の翻訳に対しては "manual"文字列を使用することができます。
これらのヒントにより、Cocoa ローカライゼーションがより生産的になることを願っています。
関連
-
[解決済み] Objective-Cでオブジェクトをキャストする方法
-
[解決済み] Objective-Cは構造体の使用を禁じていますか?
-
[解決済み] NSNumberをNSStringに変換する方法
-
非静的宣言に続く "****"の静的宣言
-
[解決済み] objcの "pi "と "M_PI "の違いは何ですか?
-
[解決済み】Cocoaでスタックトレースをコンソール/ログに出力するにはどうすればいいですか?
-
[解決済み】SwiftでNSLocalizedStringに相当するものは何ですか?
-
[解決済み】Windows版Objective-C
-
[解決済み】ベストプラクティスの多言語ウェブサイト
-
[解決済み】NSLocalizedStringが特定の言語を使用するように強制する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] MPProgressHUDとNSSessionを使用したデータシンクの読み込み
-
[解決済み] どのような場合に@synthesizeを明示的に使用する必要がありますか?
-
[解決済み] dispatch_after - GCD in Swift?
-
[解決済み] アーキテクチャ i386 のシンボルが見つかりませんでした。
-
[解決済み] NSNumberをNSStringに変換する方法
-
[解決済み] Objective-Cのtypedef enumとは何ですか?
-
[解決済み] NSStringをNSNumberに変換する方法
-
[解決済み] C言語で純粋にiOSアプリを書く方法
-
[解決済み】Cocoaでスタックトレースをコンソール/ログに出力するにはどうすればいいですか?
-
[解決済み】iOSでメールアドレスが有効であることを確認する【重複あり