6

NSLocalizedString以前はカスタム関数で使用していました。

たとえば、にアクセスするProfile.stringsには、次の関数を定義します。

func LocalizedProfile(key: String, comment: String?) { NSLocalizedString(key, tableName: "Profile", comment: comment ?? "") }

そして、次のように呼び出されます。

let localized = LocalizedProfile("Submit", comment: "For registration")

この方法は、XLIFF のエクスポートを除いて正常に機能します。

Xcode 6.3.2 では、実行Export for localizationするとエラーがスローされます。

ここに画像の説明を入力

エラー情報を取得するために、コマンド ラインから次のコマンドを実行しました。

xcodebuild -exportLocalizations -localizationPath ./xliff -project MyApp.xcodeproj -exportLanguage ja

そして、私はこのエラーを得ました:

Bad entry in file /Users/mono/Documents/Git/MyApp/Localization.swift (line = 29): Argument is not a literal string.

カスタムのローカリゼーション方法を定義することは私にとって非常に便利ですが、XLIFF 機能のエクスポートも使用したいと考えています。

この要求を解決する方法はありますか?

4

1 に答える 1

3

Export For Localizationxcodebuild -exportLocalizationsどちらもコード内の呼び出しを検索して文字列ファイルを生成しNSLocalizedString(_:tableName:bundle:value:comment:)、パラメーターに渡された静的な値を使用して適切な文字列ファイルを作成します。

keyこれは、 、commentvalue、およびに渡すことができる唯一の値tableNameが文字列リテラルであることを意味します。

文字列をローカライズするためにラッパー関数を使用しているためNSLocalizedString(_:comment:)、Xcode が呼び出しを確認するのNSLocalizedString(_:comment:)は、文字列リテラル以外の値を持つ 1 つのラッパー関数のみであり、これは無効です。

代わりに本当にやりたいことは、NSLocalizedString(_:tableName:comment:)直接呼び出すことです。

または、ラッパー関数を呼び出すこともできますがBundle.localizedString(forKey:value:table:)、これらのキーと値のペアに対して独自の文字列ファイルを手動で作成する必要があります。

/// - parameter comment: This value is ignored, but should be provided for 
///   context at the call site about the requested localized string.
func LocalizedProfile(key: String, comment: String?) -> String {
    return Bundle.main.localizedString(forKey: key, value: nil, table: "Profile")
}
于 2019-06-15T06:21:42.720 に答える