web-dev-qa-db-ja.com

iOSのローカリゼーション-Localizable.stringsを新しい文字列だけで更新する

GoogleStackOverflowを検索しましたが、これを行う簡単で自動化された方法について明確な答えはまだありませんが、ここにシナリオがあります:

  1. En、fr、de、es、itにローカライズされた1000個の文字列を持つアプリがあります。
  2. 10個の明確に新しいNSLocalizedString()キーを作成する新しい機能を構築します。
  3. これらの10個の新しい文字列をファイルの末尾に追加したいだけです:
    • en.lproj/Localizable.strings
    • fr.lproj/Localizable.strings
    • es.lproj/Localizable.strings
    • de.lproj/Localizable.strings
    • it.lproj/Localizable.strings

genstringsは、1010個の個別の文字列をすべて取得します。更新を行うたびに「干し草の山に針を刺す」必要があるため、これは面倒です。

UPDATE 19-SEP-2014 --XCode 6-AppleがついにXLIFFのエクスポートとインポートのサポートをリリースしました.stringsファイル XCode 6の新機能?ローカリゼーション

Linguan(v1.1.3)ほとんどの場合、それは素敵なツールですが、別の意味でツールになり始めています。変更をマージしますが、マージ時に一部の文字列が正しく一致しないため、ソースのスキャンを実行するたびに、100個の新しい重複キーと、後の10個の文字列が作成されるため、作業が増えます。

FileMerge以下に示すように、genstrings出力ファイルの古いバージョンと新しいバージョンを比較してみてください。 genstrings出力では文字列がアルファベット順にソートされているため、1000個に10個の文字列が散在しているため、確認する違いは200個あります。 /*...*/"..." = "..."を一致させ続け、...が更新されたことを示します。更新されておらず、ファイル内の新しい場所に移動されただけです。ますますカスタムツールを書かなければならないように見えます。

MacHG + FileMergeは、奇妙な理由で、Localizable.stringsの作業コピーを使用してリポジトリからdiffを実行することを好みません。左ペインと右ペインの両方が空で表示されます。 UPDATE:UTF-16として保存されているチェンジセットと、UTF-8が適切な差分を実行できるようになっているチェンジセットのバリエーションが判明しました。

Bashスクリプト+ FileMerge新しいNSLocalizedStringエントリを追加するたびに、英語の参照ファイルを維持するために、次のスクリプトを作成しました。

#LOCALISATION UPDATE SCRIPT
#
#This will create a temporary copy of the current 'en' reference file then generate the 
#latest reference file using the 'genstrings' tool. Finally forcing FileMerge to launch 
#and diff the changes.
#
#Last Updated: 2014-JAN-06
#Author(s): Josh Wilson

clear
#assuming this script is run from $SRCROOT

#Backup Existing 'en' reference
cp "en.lproj/Localizable.strings" "en.lproj/Localizable-src.strings"

#Scan source files for 'NSLocalizableString' macros
genstrings -q -u -o en.lproj Classes/*.{m,mm}
genstrings -q -u -a -o en.lproj Classes/iPad/*.{m,mm}
genstrings -q -u -a -o en.lproj Classes/iPhone/*.{m,mm}

#Force FileMerge to launch and diff the update (NOTE: piping to cat forces GUI to open)
opendiff "en.lproj/Localizable-src.strings" "en.lproj/Localizable.strings" | cat

#Cleanup up temporary file
rm "en.lproj/Localizable-src.strings"

しかし、これはENファイルを更新するだけであり、他の言語ファイルを新しいキーで更新する方法がありません。これは、キーとして英語の単語がなく、genstringsが"welcome_message" = "Welcome!""welcome_message" = "welcome_message"で爆撃する場合に適しています。

POEditorhttp://poeditor.com/ 。これは、1000文字列に基づくオンラインツールおよびサブスクリプションです。うまく機能しているようですが、サブスクリプションベースではないツールがあれば良いでしょう。

Traducto ProXCodeと統合し、文字列を抽出して、物事をマージするという問題のない仕事をしているようです。しかし、それが完全に翻訳されるまで、それから何かを取り戻すことは不可能であるため、あなたは彼らの翻訳サービスを使用するように強制されます。

確かに、この機能は以前に実装されています。 Appleはアプリをローカライズしておくにはどうすればよいですか?

スクリプト中毒者、私はあなたを呼びます! iOSの開発はしばらく前から行われており、ローカリゼーションは一般的なものですが、これに対する成熟したソリューションは確かにありますか?

Pythonスクリプトpdate_strings.pyStackoverflowは最終的に関連する質問を推奨し、 pythonこの回答のスクリプト NSLocalizedStringを使用したベストプラクティス 有望に見えます...

それをテストし、現在の形式(2013年5月31日)では、コメントエントリが重複している場合(単一行コメントを想定)、複数行コメントを処理しません。

正規表現を少し調整する必要があるかもしれません。

31
Josh Peak

チェックアウトBartyCrouch、それはあなたの問題を完全に解決します。また、オープンソースアクティブに保守され、簡単にインストールおよび統合できますプロジェクト内。


InstallBartyCrouch via Homebrew

brew install bartycrouch

または、 Mint :を介してインストールします。

mint install Flinesoft/BartyCrouch

Localizable.stringsファイルを段階的に更新します。

$ bartycrouch update

これはまさにあなたが探していたものを実行します。


Storyboards/XIBs Stringsファイルを保持するために時間の経過とともに更新ビルドスクリプトを追加することを強くお勧めします(追加方法の説明ビルドスクリプト ここ ):

if which bartycrouch > /dev/null; then
    bartycrouch update -x
    bartycrouch lint -x
else
    echo "warning: BartyCrouch not installed, download it from https://github.com/Flinesoft/BartyCrouch"
fi

Storyboards/XIBs Stringsファイルを段階的に更新することに加えて、これによりNSLocalizedStringを使用してコードに新しく追加されたキーでLocalizable.stringsファイルが更新されたままになります重複するキーまたは空の値に対する警告を表示します。

詳細については、 GitHub でBartyCrouchをチェックアウトしてください。

6
Dschee

以前のバージョンのgenstringがある場合は、新旧の「違い」だけでうまくいく可能性があります

編集:utf-16ファイルを処理するにはvimdiffを使用するのが最適です

1
Luis

あなたはここで私の解決策をチェックしたいかもしれません: SwiftyLocalization

設定するためのいくつかの手順で、Googleスプレッドシートで非常に柔軟なローカリゼーションが可能になります(コメント、カスタムカラー、ハイライト、フォント、複数のシートなど)。

簡単に言うと、手順は次のとおりです。Googleスプレッドシート-> CSVファイル-> Localizable.strings

さらに、Localizables.Swiftも生成します。これは、キーの取得とデコードへのインターフェイスのように機能する構造体です(手動で方法を指定する必要があります)。ただし、キーから文字列をデコードします)。

なぜこれが素晴らしいのですか?

  1. どこにでもプレーンな文字列としてキーを置く必要はもうありません。
  2. コンパイル時に間違ったキーが検出されます。
  3. Xcodeはオートコンプリートを実行できるため、次のように実行できます。
// It's defined as computed static var, so it's up-to-date every time you call. 
// You can also have your custom retrieval method there.

button.setTitle(Localizables.login.button_title_login, forState: .Normal)

プロジェクトはGoogleAppScriptを使用してスプレッドシートを変換します-> CSV Pythonスクリプトを使用してCSVファイルを変換します-> Localizable.stringsこれを簡単に確認できます サンプルシート =何が可能かを知る。

1
aunnnn

これをチェックしてください Xcodeプラグイン 私が作成した OneSky 、iOS/MacOSX開発者のローカリゼーションワークフローを改善することを目的としています。

プラグインの文字列生成機能は、選択したソース/ IBファイルに対してgenstringsおよびibtool --export-strings-fileを実行し、新しいファイルがプロジェクトとターゲットに自動的に追加され、新しい文字列がコメント付きの既存のファイルにマージされます。

基本言語の文字列のみを生成/更新しますが、プラグインの他の機能を利用して、クラウドソースプロジェクトで無料のOneSkyプラットフォームで翻訳のエクスポートとインポートを自動化できます。

1
bretdabaker