5

Java ResourceBundleを使用して、複数の言語でUIを提供するためのチュートリアルがたくさんあります。しかし、私が答えを見つけることができないように思われる翻訳会社との典型的な相互作用に関して、プロセスの質問があります。

たとえば、私がフランス語を知らず、アプリの翻訳を取得するために翻訳会社を雇う必要があると仮定して、それらを送信しますか?

  1. キーと英語の値を含むデフォルトのリソースプロパティファイル「whatever_en_US.properties」、および「whatever_fr_FR.properties」を取得しますか?
  2. 空の値を持つ「whatever_fr_FR.properties」と参照用の「whatever_en_US.properties」?
  3. 他の組み合わせ?
4

2 に答える 2

4

あなたの質問は技術ではなくプロセスに関するものなので、徹底的に説明しようと思います。以前に翻訳されていないアプリケーションがあるとすると、理想的なプロセスは次のようになります。

  1. 翻訳のために英語のファイルを送信します。翻訳業者との合意に応じて、以下を使用できます。

    • デフォルトのプロパティファイル(名前を正しく変更する必要があります)
    • キー、英語のフレーズ、翻訳用の空の列を含むExcelスプレッドシート
    • gettextを使用する場合は、Gettext*.poファイル
    • 翻訳メモリファイル(つまり、Trados * .tmxファイル)
  2. ファイルを受け取ったら、これらの翻訳を製品に入れ、ローカライズされたビルドを作成してテストします。確かに、いくつかのUIの問題があります。自分で修正できるものもあれば、追加の翻訳(ハードコードされた文字列など)が必要なものもあれば、翻訳を短縮する必要があるものもあります。繰り返しになりますが、翻訳請負業者と契約し、(再)翻訳する必要のある文字列を提供します。ここでスプレッドシートを使用できます(翻訳する必要のある文字列がそれほど多くない場合)。

  3. 同時に(すべての言語を一度に)出荷したい場合は、早期に翻訳者を雇う必要があります。UI文字列が変更されるため(ハードUIフリーズ期間または翻訳フリーズ期間がない場合)、翻訳を更新する必要があります。この場合、翻訳が必要な文字列(英語)を含む翻訳済みファイルを提供する必要があります。変更が非常に小さい場合は、英語の文字列のみを送信して翻訳を手動でマージできます。それ以外の場合は、何らかの翻訳メモリ交換形式を使用するのが最適です(gettext*.poまたはtrados*.tmxはここで最適です)。

  4. 通常、ファイルの翻訳だけでは不十分です。通常、文脈は与えられておらず、異なる単語はターゲット言語で異なることを意味する可能性があるため、翻訳エラーが発生します。あなたが言語を知らない限り、彼らが入っていることを知る方法はありません。そのため、UIスクリーンショットを撮り、レビューのために送信する必要があります(翻訳業者、または品質要件に応じて他の誰かがレビューする可能性があります)。

  5. 確認したら、翻訳の変更を適用し、UIの問題をテストする必要があります...

UI文字列の翻訳プロセスについて話している場合は、これで終わりです。ただし、アプリケーションを正しくローカライズする方法は他にもたくさんあります(ドキュメント、ヘルプファイル、アイコン、色、サウンドなど)。

于 2010-09-16T07:07:46.630 に答える
2

あなたの質問に答えるために私は(2)を選びました。

実際には、Javaリソースバンドルよりも他のものを使用する方がはるかに簡単であることがわかりました。

私は個人的にこれを処理する別の方法を使用します。私はgettextの方法を使用しています(gettext拡張機能を利用するには、アプリケーションで使用する必要のあるGetTextResource.javaというファイルがあります。ここを参照してください)。

gettextに精通している場合は、このアプローチがはるかに簡単で実用的であることは間違いありません。翻訳者にpoファイル(poeditで編集可能)を渡すだけです。poファイルから、アプリケーション内で使用するjavaクラスを作成します(これは、msgfmtを使用して行われます-poファイルのjavaコンパイル用のパラメーターを指定します)。Poファイルは、(コマンドラインから)xgettextコマンドを使用してかなり簡単に更新できます。

もちろん、すべてがgettextマニュアルの中にあります。

利点:

  • gettextは、複数形を選択する方法を提供します[「Nファイルが削除されました」(Nは数字)のようなメッセージはもうありません-ngettextを参照してください。

  • Javaファイルが新しいトークンで更新されたら文字列を翻訳するためのスクリプト可能なメソッド

  • 一部のマクロ(Translate(DELETE_BUTTON_MACRO)など)を使用して各文字列にアクセスする必要はありません。次のようにコードを記述します。

    package translateutil;        
    import gnu.gettext.GettextResource;
    
    import java.util.ResourceBundle;
    
    import java.util.Locale;
    
    public class TranslateUtil
    {
    private static ResourceBundle myResources =null;
    
    public static boolean init(Locale loc, String resourceName)
    {
        boolean bRet = true;
        Locale.setDefault(loc);
    
        try
        {
            myResources = ResourceBundle.getBundle(resourceName);
    
            System.out.printf(  _("Current language: %s\n"),
                                Locale.getDefault().getDisplayName() );
    
            System.out.printf(  _("%s resource found\n"),
                                myResources.getClass().getName() );
        }
        catch(Exception e)
        {
            // let the application go on in English in case the ResourceBundle
            // was not found. Notify about the error
            bRet = false;
            System.out.println( e.toString() );
            myResources = null;
        }
    
        return bRet;
    }
    
    
    public static String _(String str)
    {
        if (myResources == null)
        {
            return str;
        }
        {
            return GettextResource.gettext(myResources, str);
        }
    }
    
    public static String _Plural(String singular, String plural, long param)
    {
        if (myResources == null)
        {
            if (param == 1)
            {
                return singular;
            }
            else
            {
                return plural;
            }
        }
        else
        {
            return GettextResource.ngettext(myResources, singular, plural, param);
        }
    }
    }
    

これがサンプルです

    // example
    // similar for plural

    import static translateutil.TranslateUtil._;

    System.out.println(_("The english text"));

あなたが何を選んだとしても:頑張ってください!

于 2010-09-15T22:13:36.523 に答える