WWDC Quick Look 💓 By SwiftGGTeam
Discover String Catalogs

Discover String Catalogs

元の動画を見る

ハイライト

Xcode 15 では、.strings と .stringsdict ファイルを単一の JSON 形式ファイルに結合する文字列カタログが導入され、SwiftUI、Swift、Objective-C、C、および Interface Builder からの自動文字列抽出がサポートされ、翻訳の進行状況と複数のバリアントを管理するためのビジュアル エディターが提供されます。

主な内容

ローカリゼーション管理のこれまでの問題点

以前は、ローカリゼーションを行う場合、開発者は 2 つのファイル セットを維持する必要がありました。通常の文字列を保存する .strings と、複数のルールを保存する .stringsdict です。これらのファイルは、コードが変更されるたびに手動で同期する必要があります。文字列が欠落していると、ローカライズされていない英語のコンテンツがユーザーに表示されます。さらに厄介なのは、複数のルールが言語によって大きく異なることです。たとえば、英語には単数形と複数形の 2 つの複数形しかありませんが、ウクライナ語には 3 つの複数形があります。 .stringsdict の plist 形式を手動で維持すると、エラーが発生しやすくなります。

文字列カタログのソリューション

Xcode 15 では、ビジュアル エディターで文字列と複数のルールを管理するための文字列カタログ (.xcstrings ファイル) が導入されています。コンパイル時に、.xcstrings は自動的に .strings および .stringsdict に変換されるため、最小展開バージョンを増やす必要はありません。Xcode は、コードがビルドされるたびにコード内のローカライズ可能な文字列を自動的にスキャンし、自動的にカタログに追加し、翻訳の進行状況がサイドバーにリアルタイムで表示されます。

文字列のソースを自動的に抽出します。

(01:40) Xcode 15 は、複数のソースから文字列を自動的に抽出できます。

  • SwiftUI で受け入れられますLocalizedStringKeyコントロール (ラベル、ボタン、テキストなど)
  • Swiftで使用されるString(localized:)そしてLocalizedStringResourceコード
  • Objective-C で使用NSLocalizedStringマクロコード
  • C コードで使用されるCFCopyLocalizedStringコード
  • Interface Builder ファイル (Storyboard および xib)
  • Info.plist ファイル

翻訳ステータス管理

(13:30) 文字列カタログ エディターには、各文字列の 4 つの状態が表示されます。

  • 新規 (黄色): 新しく追加されましたが、まだ翻訳されていません
  • 要検討 (オレンジ): ソース文字列が変更されたため、翻訳をチェックする必要があります。
  • 翻訳済み (緑色): 翻訳が完了しました
  • 古い (グレー): コードは削除されましたが、翻訳はまだ残っています。

ステータスがサイドバーに進捗率としてリアルタイムで反映されるため、開発者は、App Store に送信する前にすべてのコンテンツがローカライズされていることを確信できます。

##詳細

SwiftUI のローカライズされた文字列

(07:36) SwiftUI によりローカリゼーションがシームレスになります。ビューで使用される文字列リテラルは、自動的にローカライズ可能とみなされます。

struct ContentView: View {
    var body: some View {
        VStack {
            Label("Thanks for shopping with us!", systemImage: "bag")
                .font(.title)

            HStack {
                Button("Clear Cart") { }
                Button("Checkout") { }
            }
        }
    }
}

キーポイント:

  • LabelButtonTextコントロールの文字列パラメータの型は次のとおりです。LocalizedStringKey, SwiftUI が自動的に抽出します。
  • これらの文字列は、という名前のファイルに入れられます。Localizable.xcstrings文字列カタログ内
  • 使用Textイニシャライザは、翻訳者がコンテキストを理解できるようにコメントを追加できます。

よりきめ細かい制御が必要な場合は、次を使用できます。LocalizedStringResource

struct CardView: View {
    let title: LocalizedStringResource
    let subtitle: LocalizedStringResource

    var body: some View {
        ZStack {
            RoundedRectangle(cornerRadius: 10.0)
            VStack {
                Text(title)
                Text(subtitle)
            }
            .padding()
        }
    }
}

CardView(title: "Recent Purchases", subtitle: "Items you've ordered in the past week.")

キーポイント:

  • LocalizedStringResourceローカライズ可能な文字列を渡す場合に推奨されるタイプです
  • Xcode は文字列リテラルによる初期化を認識しますLocalizedStringResource、この文字列をローカライズする必要があることがわかります。
  • コメント、テーブル名、デフォルト値の指定をサポート

Swift コードでのローカリゼーション

(09:03) モデル層または文字列の遅延読み込みが必要なシナリオでは、Foundation のlocalized:イニシャライザ:

import Foundation

func stringsToPresent() -> (String, AttributedString) {
    let deferredString = LocalizedStringResource("Title")

    return (
        String(localized: deferredString),
        AttributedString(localized: "**Attributed** _Subtitle_")
    )
}

キーポイント:

  • LocalizedStringResource実行時に変換できますStringまたはAttributedString
  • リッチテキストのローカリゼーションをサポート
  • ビルド設定で「コンパイラーを使用して Swift 文字列を抽出する」を有効にする必要があります

複数のバリエーション

(15:25) 文字列カタログ エディターには複数のバリアントのサポートが組み込まれています。文字列を右クリックし、「複数形で変化」を選択します。 Xcode は、デフォルトの言語に従って、対応する複数形のケースを自動的に作成します。

複数のパラメータを含む複雑な文字列の場合は、置換を使用します。

Text("\(birds.count) birds in \(backyards.count) backyards")

エディターでは、パラメーターごとに個別の複数のバリアントを設定して、次のようなものを作成できます。@birdsそして@yards2 つの置換では、実行時のパラメータ値に基づいて正しい複数形が自動的に選択されます。

キーポイント:

  • 言語によって複数の格の数が異なり、Xcode がその言語に適した格を自動的に生成します。
  • 英語対応可能oneそしてother、ウクライナ人はonefewmanyそしてother
  • 読みやすさを向上させるために置換名をカスタマイズできます

デバイスのバリエーション

(02:47) マルチプラットフォーム アプリでは、デバイスの種類に基づいて異なるテキストを表示する必要がある場合があります。たとえば、Mac では「タップして詳細を確認」は「クリックして詳細を確認」となります。

文字列を右クリック -> [デバイスごとに変更] -> Mac を選択すると、デバイスごとに異なる翻訳が提供されます。

翻訳のエクスポートとインポート

(23:02) [製品] > [ローカリゼーションのエクスポート] から XLIFF ファイルをエクスポートし、翻訳者に送信します。翻訳が完了したら、[製品] > [ローカリゼーションのインポート] を選択してインポートすると、翻訳は対応する文字列カタログに自動的にマージされます。

XLIFF のバリアント文字列では、新しい形式の識別子が使用されます。

<trans-unit id="%lld Recent Visitors|==|plural.one">
    <source>%lld Recent Visitor</source>
    <target>%lld Visitante Recente</target>
</trans-unit>

キーポイント:

  • フォーマットはkey|==|variation.specifier -複数、デバイスなどの複数のバリアント タイプをサポートします。
  • ビルド設定で「ローカリゼーションは文字列カタログを優先」を「はい」に設定できます

既存のプロジェクトを移行する

(28:51) 既存のプロジェクトは段階的に移行できます。.strings または .stringsdict ファイルを右クリックし、「Migrate to String Catalog」を選択すると、Xcode がすべての翻訳を自動的に変換します。文字列カタログは古い形式と共存でき、開発者は必要に応じてテーブルごとに移行できます。

Swift パッケージの場合は、Package.swift でデフォルトのローカリゼーションを設定し、.xcstrings ファイルを追加します。

// swift-tools-version:5.9
let package = Package(
    defaultLocalization: "en",
    // ...
)

重要ポイント

  1. ワンクリックでの多言語サポート
  • やるべきこと: 既存のアプリに 5 ~ 10 の言語サポートを追加する
  • 実行する価値がある理由: 文字列カタログは文字列を自動的に抽出し、翻訳の進行状況を視覚化し、ローカリゼーションのしきい値を大幅に下げます。
  • 開始方法: プロジェクトに追加Localizable.xcstrings、一度ビルドすると、Xcode がすべての文字列を自動的に抽出し、XLIFF をトランスレーターにエクスポートします。
  1. インテリジェントな複数処理
  • 対処法: 数量を表示する UI で複数形を使用する
  • 実行する価値がある理由: 「1 項目」などの文法エラーを回避し、さまざまな言語の複数形ルールに自動的に適応します
  • 開始方法: 文字列カタログ エディターで文字列を右クリックし、[複数で変化] を選択し、それぞれの場合に正しい翻訳を入力します。
  1. マルチプラットフォームのテキスト適応
  • 機能: iOS/iPadOS/macOS のコードベースを統合しますが、プラットフォーム固有のテキストを表示します
  • 実行する価値がある理由: 1 つのコード セットがすべてのプラットフォームで実行されますが、ユーザー エクスペリエンスは自然です (タップとクリック)。
  • 開始方法: カタログのキー文字列に「デバイスごとに異なる」を追加して、Mac と Apple Watch に適合したテキストを提供します
  1. リアルタイム翻訳進捗ダッシュボード
  • やるべきこと: 翻訳の整合性チェックを CI に統合する
  • 実行する価値がある理由: 不完全なローカライズ版が App Store に公開されるのを防ぐ
  • 開始方法: 文字列カタログのステータス タグ (新規/レビューが必要/翻訳済み) を使用して、ビルド スクリプト内の未翻訳の文字列を確認します。
  1. 迅速なパッケージのローカリゼーション
  • やるべきこと: オープンソースの Swift パッケージにローカリゼーション サポートを追加する
  • 実行する価値がある理由: 世界中の開発者にライブラリを使用してもらいましょう
  • 開始方法: Package.swift でのセットアップdefaultLocalization、.xcstrings ファイルをターゲットのリソースに追加します。

関連セッション

コメント

GitHub Issues · utterances