4

Localizable.stringsプロジェクトのi18nのファイルがあり、libはを使用しますKYLocalizable.strings

Localizable.stringsから「サブクラス」を作ることを考えましたKYLocalizable.stringsが、私が知る限りではできません。代わりに、SDKのように関数マクロを定義したいと思います。

#define NSLocalizedString(key, comment) \
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
#define NSLocalizedStringFromTable(key, tbl, comment) \
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:(tbl)]

擬似コード:</ p>

#define CustomLocalizedString(key, comment) \
    // if key exists in Localizable.strings
    //   use it
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
    // else
    //   search it in KYLocalizable.strings
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:@"KYLocalizable"]

だから私はCustomLocalizedString(<key>, <comment>)自分のプロジェクトで使うことができます。
しかし、キーがに存在するかどうかを確認するにはどうすればLocalizable.stringsよいですか?

前もって感謝します!!

4

5 に答える 5

6

この呼び出しでは:

[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

指定されたキーを使用して文字列ファイルで文字列を見つけることができない場合は、valueパラメータ(現在は空の文字列)が使用されます。したがって...必要なのは、そのパラメータの値としてKYLocalizable.stringsへの2回目のルックアップを配置することだけです。コードは次のようになります(実際には実行しませんでしたが、近いはずです)。

[[NSBundle mainBundle] localizedStringForKey:(key) 
    value:[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:@"KYLocalizable"]
    table:nil]

その時点で、Localizable.stringsの文字列が見つかった場合に使用されます。それ以外の場合は、KYLocalizable.stringsの値が使用されます。どちらも見つからない場合は、空白の文字列が返されます(これは、ネストされたのパラメーターで指定されているためです)。

ただし、このアプローチの非効率的な点の1つは、アプリケーションが実際にすべての試行で最初にKYLocalizable.stringsでルックアップを試行することです(そのため、Localizable.stringsへの外部ルックアップを実行するときに、この結果をパラメーターとして後で渡すことができます)。実際にLocalized.stringsを最初にチェックし、文字列が見つからない場合にのみ2回目のルックアップを実行する場合は、そのロジックを含むメソッドを作成する必要があると思います(たとえば、 NSBundleのカテゴリ)。

于 2012-09-23T15:38:03.153 に答える
4

キーが存在しない場合、受け取る文字列はキー自体になります。キーをローカライズされた文字列として使用しないと想定している限り、NSLocalizableStringがキーを返したかどうかをテストできます。

于 2012-09-23T15:06:46.620 に答える
0

@Xvalに感謝します、私はそれを自分で理解しました、そしてここに簡単な関数があります(あなたがより良いアイデアを持っているならいくつかの提案を提供してください):

#define KYLocalizedString(key, comment) \
  [[[NSBundle mainBundle] localizedStringForKey:(key) value:nil table:nil] isEqualToString:(key)] ? \
  [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:@"KYLocalizable"] : \
  [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

localizedStringForKey:@Xvalが言ったようにNSStringを返します。:)

于 2012-09-23T15:14:46.217 に答える
0

Swiftの場合:

var key = "your_key"
NSBundle.mainBundle().localizedStringForKey(key,
                                             value: NSBundle.mainBundle().localizedStringForKey(key, value:"", table: nil),
                                             table: "Your_Custom_Localizable_File")

Appleのドキュメントによると、物事を明確にするためだけに:

If key is not found and value is nil or an empty string, returns key.

したがって、この手法を使用すると、必要な数のローカリゼーションファイルへの呼び出しをネストできます。

于 2016-05-30T10:12:57.497 に答える
0

ローカライズされた文字列用にこの便利な拡張機能を作成したので、localized()関数を使用してローカライズされた文字列を取得し(引数を渡すこともできます)、isLocalized計算されたプロパティを使用して文字列がローカライズされているかどうかを確認できます。

extension String {

    var isLocalized: Bool {
        return localized() != self
    }

    func localized(parameter: CVarArg? = nil) -> String {
        if let parameter = parameter {
            return String(format: NSLocalizedString(self, comment: ""), parameter)
        }
        else {
            return NSLocalizedString(self, comment: "")
        }
    }

    func localized(parameter0: CVarArg, parameter1: CVarArg) -> String {
        return String(format: NSLocalizedString(self, comment: ""), parameter0, parameter1)
    }

}
于 2017-05-29T07:39:25.903 に答える