Swift で NSLocalizedString に tableName を渡して初期化すると “Argument is not a literal string.” エラー

投稿者: Anonymous

Swift でアプリ制作を行っており、多言語対応のため、 NSLocalizedString メソッドを使用しております。

そこで、下記のようなコードを設定しました。(例は ViewController.swift ファイルの27行目に記入)

let textString: String = NSLocalizedString(
                            "keyString",
                            tableName: "tableNameString",
                            comment: "commentString")

ターミナルで genstrings *.swift を行うと、下記のメッセージが表示され、.strings ファイルが生成されません。

Bad entry in file ViewController.swift (line = 27): Argument is not a literal string.

そこで、tableName: を削除し、下記のように変更すると、

let textString: String = NSLocalizedString(
                            "keyString",
                            comment: "commentString")

localizable.strings がきちんと生成されます。

ドキュメント等を読むと、 tableName を設定するとファイルを分けられるようなので、そのようにしたいのですが、どうすればよいのでしょうか?

Objective-C では、 NSLocalizedString とは別に NSLocalizedStringFromTable を使うような説明があるのですが、 Swift では、そのような説明は見つかりませんでした。

よろしくお願いいたします。

解決

Swiftでテーブルにわけたローカライズファイルをgenstringsを利用して生成する。という質問として回答し直します

func AAALocalizedStringFromTable(key: String, tableName: String, comment: String) -> String {
        return NSLocalizedString(key, tableName: tableName, comment: comment)
}

を作って、

genstrings -s AAALocalizedString *.swift   #FromTableは不要

とすれば生成できます。(関数定義部でエラーは出ますが正しく生成されます)

let s = AAALocalizedStringFromTable("AAA", "BBB", "CCC")

なら
/* CCC */
“AAA” = “AAA”;
という内容のBBB.stringsファイルが生成されます

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *