5872


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

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

[code]

    let textString: String = NSLocalizedString(
                                "keyString",
                                tableName: "tableNameString",
                                comment: "commentString")
    
[/code]

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

[code]

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

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

[code]

    let textString: String = NSLocalizedString(
                                "keyString",
                                comment: "commentString")
    
[/code]

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

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

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

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


CC BY-SA 3.0
2015-02-02T08:22:07.850
5769
2015-02-03T11:32:23.240
2015-02-02T08:34:35.950
4978
6006
question
swift ios8 localization
Swift で NSLocalizedString に tableName を渡して初期化すると "Argument is not a literal string." エラー


２つの問題を同時に提示していますが、genstringsの方だけ

Swiftの問題ではありません。

genstringsがSwiftに対応していないだけです。

genstringsのmanページ抜粋

> The genstrings utility generates a .strings file(s) from the C or
> Objective-C (.c or .m) source code  
>  file(s) given as the argument(s).

(Ｃ言語とObjective-Cのソースコードから .strings ファイルを生成する)


CC BY-SA 3.0
2015-02-02T08:56:17.083
5776
2015-02-02T08:56:17.083
2741
5769
answer


manコマンドを使用しても、自身の疑問に回答は得られませんでしたが、「genstringsがSwiftに対応していない」と、ご教示いただき、理解が進みました。

私の理解では、genstringsコマンドが、Objective-
CかSwiftかに関わらずソースコードの文字列のみを認識して、処置されていると想像されました。

あまりスマートな方法とは思えませんが、対処方法を考案したので、記載しておきます。

１．ソースコードで"NSLocalizedeString("を"NSLocalizedStringFromTable("に置換する。  
２．genstringsコマンドを実行する。→必要な.stringsファイルが作成される。  
３．ソースコードで"NSLocalizedStringFromTable("を"NSLocalizedeString("に置換する。

ファイルの数がそれほど多くなかったので、とりあえずこれで対応しました。  
もし、もっとよい解決方法、スマートな方法があれば、ご教示ください。  
よろしくお願いいたします。

また、この方法では、作成される.stringsファイルの内容にも、あまり大きな問題ではありませんが、所々問題があるようです。  
ひとえに、genstringsコマンドがSwiftに対応していないことが要因と思われます。ご留意ください。


CC BY-SA 3.0
2015-02-02T17:28:06.770
5803
2015-02-02T17:28:06.770
6006
5769
answer


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

[code]

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

を作って、

[code]

    genstrings -s AAALocalizedString *.swift   #FromTableは不要
    
[/code]

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

[code]

    let s = AAALocalizedStringFromTable("AAA", "BBB", "CCC")
    
[/code]

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


CC BY-SA 3.0
2015-02-03T11:23:57.510
5872
2015-02-03T11:32:23.240
2015-02-03T11:32:23.240
2741
2741
5769
answer