昨今、世界はグローバル市場となっており、モバイル アプリケーションをさまざまな言語や文化に対応させることは単なるオプションではなく、必須事項です。ローカリゼーションにより、ユーザー エクスペリエンスが向上し、その範囲が広がり、国際レベルでのソフトウェアの成功に大きな影響を与える可能性があります。
iOS 開発者向けに、Swift はアプリケーションにローカリゼーションを簡単に組み込むための強力なツールを提供しています。このガイドでは、開発者がこれらの機能を最大限に活用できるように、初期の手法から最新のツールまで、Swift でのローカリゼーションの変遷について説明します。
当初、Swift が導入されたとき、Swift は Objective-C からローカリゼーション インフラストラクチャを継承しました。これは、 Localizable.strings
ファイルとNSLocalizedString
関数を中心に構築されていました。このため、開発者はローカライズされた文字列を手動で編集し、異なる言語ファイル間で同期する必要がありましたが、このプロセスはエラーが発生しやすく、時間がかかります。
Localizable.strings
の基本ローカライズ可能なファイルは、文字列が「キー」=「値」の形式で保存される単純なキーと値のペアのファイルです。ここで、 「キー」はコード識別子で、「値」はユーザーに表示されるローカライズされた文字列です。このファイルは、サポートされている各言語に複製して翻訳し、英語の場合は「en.lproj」 、ドイツ語の場合は「de.lproj」など、対応する適切な「.lproj」ディレクトリに配置する必要があります。
Localizable.strings
エントリの例: "hello_world_key" = "Hello, World!";
Swift コードでは、この文字列は次のように取得できます。
let greeting = NSLocalizedString("hello_world_key", comment: "The default greeting")
NSLocalizedString 関数を使用すると、 Localizable.strings
のキーを使用してローカライズされたコンテンツに簡単にアクセスできます。
この関数はキーを受け取り、フォールバック値を提供し、翻訳者向けのコメントを追加します。コメントを提供することは、翻訳者にサブテキストを提供して翻訳の正確性と適合性を向上させるため、非常に重要です。
例: 時刻に基づいてユーザーに挨拶する:
func greetingBasedOnTime() -> String { let hour = Calendar.current.component(.hour, from: Date()) let key = hour < 12 ? "good_morning_key" : "good_evening_key" return NSLocalizedString(key, comment: "Greeting based on time of day") }
対応するLocalizable.strings
では、エントリは次のようになります。
"good_morning_key" = "Good morning!"; "good_evening_key" = "Good evening!";
Localizable. 文字列に関して、次のような課題に直面する可能性がある。
1) スケーラビリティの問題。
文字列の数が増えると、処理が難しくなります。時間の経過とともに複数の .strings ファイルを管理するのは面倒になります。
2) 重複。
各言語には個別のファイルが必要で、文字列の管理において不整合や重複作業が発生する可能性があります。サポートする言語が 1 つだけであれば問題にならないかもしれませんが、複数の言語を管理する必要がある場合は面倒すぎることがあります。
3) 文脈の欠如。
ただし、コメントは NSLocalizedString に追加できます。コメントが必ずしも翻訳者のコンテキストを完全に理解するのに役立つとは限らず、翻訳が不正確になる可能性があります。開発者は、コメントを適切に入力するのが面倒な場合がよくあります。
stringsdict
への移行stringsdict
ファイルの導入により、Swift のローカリゼーションが大幅に改善され、主に複数形の問題が解消されました。主な原因は、言語の複数形は異なる方法で形成されるため、英語には効果的でも、ロシア語やアラビア語などの他の言語には効果的ではない可能性があることです。
stringsdict
が導入される前は、それらを管理するのは非常に困難でした。stringsdict stringsdict
使用すると、プログラマーは「1」、「少数」、「多数」、「その他」などのカテゴリのルールを決定でき、言語間での翻訳の正確さのレベルが同じになることが保証されます。
stringsdict
ファイルを理解する
Stringsdict
ファイルは、数値に応じてローカライズされた文字列を作成するために使用される XML プロパティ リストです。この機能は、言語によって複数形を処理するためのルールが異なるため、複数形を正しく処理することを目的としています。
stringsdict
ファイルの構造:
stringsdict
ファイルのサンプルには、複数形にする必要のあるすべての文字列のエントリが含まれています。各エントリはキーと辞書で構成され、ユーザーはその中で異なる複数形のカテゴリを表す 1 つ以上のサブキーを定義します。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>numberOfSongs</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@songs@</string> <key>songs</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>One song</string> <key>other</key> <string>%d songs</string> </dict> </dict> </dict> </plist>
複数形化にstringsdict
を使用する例
ユーザーが読んだ記事の数を表示するアプリケーションがあるとします。画面には、読んだ記事の数の正しい複数形を示すメッセージが表示されます。
英語とポーランド語のLocalizable.stringsdict
:
<!-- English --> <key>article_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@articles@</string> <key>articles</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>One article</string> <key>other</key> <string>%d articles</string> </dict> </dict> <!-- Polish --> <key>article_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@articles@</string> <key>articles</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>Jeden artykuł</string> <key>few</key> <string>%d artykuły</string> <key>many</key> <string>%d artykułów</string> <key>other</key> <string>%d artykułu</string> </dict> </dict>
ここで、ポーランド語のローカライズは、いくつかの言語における複数形の複雑さを明確に示しており、異なる数値コンテキストを正しく表すには、複数の複数カテゴリ (1、少数、多数、その他) を使用する必要があります。
迅速な実装:
NSLocalizedString
を呼び出すときに、ファイルで定義されたキーを参照するだけで、 stringsdict
エントリをコード内で利用できます。
let count = getArticleCount() let formatString = NSLocalizedString("article_count", comment: "Count of articles read by a user") let message = String(format: formatString, count)
このアプローチにより、サポートされている言語の文法に合わせて出力文字列を適応的に変更できます。これはすべて 1 行のコードで実行できます。
stringsdict
の利点
Xcode 15 で導入された新機能の 1 つに、開発者が iOS および macOS アプリケーションをこれまでよりもさらに簡単Localizable.strings
ローカライズできるようにする文字列カタログがあります。Localizable.strings とstringsdict
文字列を保存および整理するための便利なリソースでしたが、文字列カタログはローカライズされた文字列を管理するのにはるかにまとまりがあり、UI フレンドリです。
文字列カタログで強調する必要がある主な側面は次のとおりです。
stringsdict
の欠点のいくつかを克服します。
迅速な実装:
メッセージング アプリケーションで、ユーザーに未読のメッセージの数を通知する必要があるとします。通知は、受信したメッセージの数を表示して動的にする必要があり、コンテンツの種類に応じて調整する必要があります。
ステップバイステップのセットアップ:
文字列カタログを作成する:プロジェクトに新しい文字列カタログを追加します。これにより、 .stringcatalog
ファイルが生成されます。
エントリの追加:エディターを使用して、ローカライズする必要がある各文字列のエントリを追加します。次に、各エントリのキー、デフォルト値、および複数形のルールや適応パラメータを指定します。
コンテンツのローカライズ:サポートされている各言語の翻訳を提供し、複数形の異なる形式やデバイス タイプへの適応などを指定します。
コードで実装: Swift コードでローカライズされた識別子を使用してこれらの文字列を参照します。
<!-- String Catalog Entry --> <key>unread_messages_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@messages@</string> <key>messages</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>You have one unread message.</string> <key>other</key> <string>You have %d unread messages.</string> </dict> </dict>
この文字列には次のようにアクセスできます:
let unreadCount = fetchUnreadMessagesCount() let message = NSLocalizedString("unread_messages_count", value: "You have \(unreadCount) unread messages.", comment: "Notify about unread messages") print(message)
文字列カタログは大幅な改善をもたらしますが、課題も伴います。まず、学習曲線があります。新しいシステムや何かを作成する方法に慣れるには時間がかかります。開発者が直面する可能性のあるもう 1 つの潜在的な課題は、従来のローカリゼーション ファイルが既に作成され使用されている既存のプロジェクトに文字列カタログを統合するために必要な時間と調整に関連しています。
Swift の文字列カタログは、ローカリゼーション テクノロジをさらに改良した最新のもので、強力なだけでなく、柔軟で使いやすいツールを提供します。このテクノロジを開発ライフサイクルの一部として追加することで、チームはローカリゼーション プロセスの効率と品質を大幅に向上させ、より優れたグローバル製品を作成できます。
Swift ローカリゼーション ツールの最新の開発状況に合わせて、この記事を継続的に更新していきます。何か抜けている点があると感じた場合や、私の発言についてご意見がある場合は、下のコメント ボックスで共有してください。興味深い情報や最新ニュースをさらに入手するには、ぜひ私をフォローしてください。