73028


Swiftでアプリを多言語対応させる場合、NSLocalizedStringを使用すると思います。  
以下のようなコードを実行すると、「設定アプリ→一般→言語と地域」で「iPhoneの使用言語」の項目によって選択した言語を表示できるようになると思います。

[code]

    let translated_text = NSLocalizedString("test", comment: "")
    print(translated_text)
    //出力結果:テスト
    
[/code]

しかし、上記の場合だと、必ず設定アプリの設定を参照してしまうので、英語に戻したい場合であったり、日本語圏のユーザーだけど中国語で表示したい場合などに困ります。

以下のようなコードの例で、翻訳するかどうかのフラグを設けることで、翻訳せずに英語を出力することはできると思うのですが、英語以外の言語を選択させる方法などはあるのでしょうか？また、if文を書かずに英語に直すような方法があるならそれも知りたいです。

[code]

    let translateEnableFlag = false
    var translated_text = "test"
    if translateEnableFlag == true
    {
       translated_text = NSLocalizedString("test", comment: "")
    }
    print(translated_text)
    //出力結果:test
    
[/code]


CC BY-SA 4.0
2021-01-02T11:21:05.437
73027
2021-01-02T13:36:58.037
2021-01-02T11:35:14.100
36446
36446
question
swift
NSLocalizedStringで設定アプリで選択した言語を無視して言語選択をするにはどうするのが良いか


まず、テキストのローカライズ方法の基本から説明します。

関数`func NSLocalizedString(_ key: String, comment: String) ->
String`は、リソースにある`Localizable.strings`ファイルを参照し、`key`値を検索して、その値の文字列を返り値とします。  
`Localizable.strings`ファイルに、

[code]

    "big" = "大きい";
    
[/code]

と書かれているとします。

[code]

    let bigText = NSLocalizedString("big", comment: "")
    print(bigText)
    
[/code]

というコードを実行すると、`大きい`が出力されます。`Localizable.strings`は変換表と見ることができます。

さて、XcodeのDeveloper Documentsで、`NSLocalizedString(〜`を検索してみてください。

[func NSLocalizedString(_ key: String, tableName: String? = nil, bundle:
Bundle = Bundle.main, value: String = "", comment: String) ->
String](https://developer.apple.com/documentation/foundation/1418095-nslocalizedstring)

引数は2つだと思っていたのが、5つもある関数であることがわかります。Swiftの規則では、デフォルト値を`=`で記述した引数は、省略可能になります。この規則によって、3つの引数を省略することができるのですね。  
省略される引数の中の`tableName`に注目します。Developer
Documentationには詳しい解説が載っていないので、何を意味する引数なのか不明ですが、いろいろ調べてみると、参照する変換表を、この引数で指定することができるようです。デフォルト値`nil`では、`Localizable.strings`ファイルを変換表とします。  
実験で、`Other.strings`というテキストファイルを作成し、プロジェクトに追加します。ファイルに

[code]

    "big" = "巨大な";
    
[/code]

と書いて、保存します。そして、

[code]

    let largeText = NSLocalizedString("big", tableName: "Other", comment: "")
    print(largeText)
    
[/code]

というコードを実行してみてください。`Localizable.strings`ではなく、`Other.strings`に保存した変換表に従って、`巨大な`が出力されるのがわかります。

* * *

以上の考察から、質問者さんの意図は、`Localizable.strings`以外の変換表となるテキストファイルを、拡張子`.strings`で保存し、それを引数`tableName`で指定することで、実現可能になるだろうと、考えられます。


CC BY-SA 4.0
2021-01-02T13:27:01.293
73028
2021-01-02T13:36:58.037
2021-01-02T13:36:58.037
18540
18540
73027
answer