🫧

String Catalogs 細かいこと

2024/02/12に公開

テーブル名は実行時に決定したいのでプログラム上は変数になっているとき、勝手にLocalizable.xcstringsに吐き出されて困る

次のコードを、自動で吐き出し機能ONで使うと

struct StrData {
    let key: LocalizedStringKey
    let table: String
}

struct ContentView: View {
    let strData = StrData(key: "a", table: "aTable")
    var body: some View {
        VStack {
            Text(strData.key, tableName: strData.table)
            Text("b", tableName: "bTable")
        }
    }
}

b の方はbTable.xcstringsに吐き出されるが、a の方はLocalizable.xcstringsに吐き出される。テーブル名を指定しているので、デフォルトのLocalizable.xcstringsに吐かれても困る。

次のようにすると回避できる

struct StrData {
    let key: String
    let table: String
}

struct ContentView: View {
    let strData = StrData(key: "a", table: "aTable")
    var body: some View {
        VStack {
            Text(LocalizedStringKey(strData.key), tableName: strData.table)
            Text("b", tableName: "bTable")
        }
    }
}

どうも、コンパイル時にうまいことキーが発覚してしまうと、Localizable.xcstringsに吐き出されるらしい。下にいくつかのパターンを調べたのを載せる。

let tableName = "Test"

let test2str = "test2"
let test3lsk = LocalizedStringKey("test3") //🧹Localizable.xcstringsに吐かれる
let test4str = "test4"
let test4lsk = LocalizedStringKey(test4str)

struct ContentView: View {
    var body: some View {
        VStack {
            Text("test1", tableName: tableName) //🧹Localizable.xcstringsに吐かれる
            Text(LocalizedStringKey(test2str), tableName: tableName) //吐かれない
            Text(test3lsk, tableName: tableName) //LocalizedStringKey作成のところで吐かれる
            Text(test4lsk, tableName: tableName) //吐かれない
        }
    }
}

キーを変えたい

Automatically状態では変更できません。Manuallyに変更するとキーを変更できます。

.xcstringsからいらない言語を削除できない

基本的にプロジェクトの言語設定のところで言語を削除すると.xcstringsも連動して削除されるのですが、.xcstringsに削除したい言語のデータが残っていると連動削除が効かないようです。また、.xcstringsを表示しているところには言語を削除する機能はなさそうな感じです。

一旦.xcstrings内にいらない言語が残ってしまった場合は、

  • プロジェクトの言語設定でその言語を復活させる
  • .xcstrings内のいらない言語のデータを空にする
  • プロジェクトの言語設定でその言語を削除する

という手順で削除できるかと思います。

Localizable.xcstringsに書き出す状況じゃないのに裏で何がが残っていて書き出して困る。

Clean Build Folder..を行うと何かが消えてうまくいくことがある。

ビルド設定

ビルド設定のLocalization Prefers String Catalogs

翻訳者に渡すファイルの形式をどうするかとういう設定

想定している流れは

  1. ソフトウェア担当者がコードを書く
  2. 翻訳者に翻訳を依頼
  3. 翻訳者から翻訳データを受け取る
  4. ソフトウェア担当者がアプリに融合

WWDCのビデオ(女の人と男の人が交互に出てくるやつ)の中で言っていた。
翻訳者に渡すファイルというのが具体的に何かは私は知らない。

ビルド設定のUse Compiler to Extract Swift Strings

ビルド時にソースコード(など)からString Catalogに書き出すかどうか。
Objective-Cからの書き出しはこの設定のONOFFで挙動が変わらない(挙動は「書き出す」で固定)
Swiftからの書き出しはONOFFで挙動が変わる。
Objective-Cからの書き出しは%は出てこない

その他の細かいこと

String Catalogファイルはビルド時に、昔からある .strings (.stringsdict) 形式に変換される

String Catalogsのその他の記事です。

https://zenn.dev/samekard_dev/articles/436b1adb3f7890

Discussion