5

編集:最初の2つのバージョンでは十分に明確ではなかったように思われるため、質問を完全に書き直しました。これまでの提案に感謝します。

チュートリアルプロジェクトのソースコードを国際化したいと思います(ランタイムアプリケーションではなく、注意してください)。次に例を示します(Javaの場合)。

/** A comment */
public String doSomething() {
  System.out.println("Something was done successfully");
}

英語で、フランス語版を次のようにします。

/** Un commentaire */
public String faitQuelqueChose() {
  System.out.println("Quelque chose a été fait avec succès.");
}

等々。次に、プロパティファイルのようなものをどこかに置いて、次のような通常のツールでこれらの翻訳を編集します。

com.foo.class.comment1=A comment
com.foo.class.method1=doSomething
com.foo.class.string1=Something was done successfully

および他の言語の場合:

com.foo.class.comment1=Un commentaire
com.foo.class.method1=faitQuelqueChose
com.foo.class.string1=Quelque chose a été fait avec succès.

私は、(実際のテキストを明らかに翻訳する以外に)最小限の手作業でこれを行うための最も簡単で、最も効率的で、邪魔にならない方法を見つけようとしています。できればEclipseで作業してください。たとえば、元のコードは英語で記述され、外部化され(プロパティに、できれば元のソースはそのままにして)、翻訳され(人間的に)、再生成されます(別のソースファイル/プロジェクトとして)。

私が見つけたいくつかの道(AlexSが提案したもの以外):

これを実行するツールがまだ存在しないことに驚いています。

4

6 に答える 6

2

メソッド名(またはローカライズされたバージョンに置き換えたいもの)として一意の文字列を使用します。

public String m37hod_1() {
  System.out.println(m355a6e_1);
}

次に、次のように各言語のプロパティファイルを定義します。

m37hod_1=doSomething
m355a6e_1="Something was done successfully"

次に、ソースファイルを解析して文字列を置き換える小さなプログラムを作成します。つまり、日食のすぐ外にあるすべてのものです。

または、スタンドアロンの翻訳プログラムの代わりに、antタスクのReplaceとpropertyfilesも使用します。そんな感じ:

<replace 
    file="${src}/*.*"
    value="defaultvalue"
    propertyFile="${language}.properties">
  <replacefilter 
    token="m37hod_1" 
    property="m37hod_1"/>
  <replacefilter 
    token="m355a6e_1" 
    property="m355a6e_1"/>
</replace>

これらの方法のいずれかを使用すると、チュートリアルでローカリゼーションについて何も説明する必要はありませんが(必要な場合を除く)、実際のトピックに集中できます。

于 2012-06-19T15:28:27.327 に答える
2

必要なのは、大規模なコード変更エンジンです。

ANTLRはそのトリックを行いません。ASTは必要ですが、十分ではありません。構文解析後の生活に関する私のエッセイを参照してください。Eclipseパッケージが名前と型の解決をある程度サポートしている場合は、Eclipseの「AST」の方が優れている可能性があります。そうしないと、すべてを同じように置き換える意思がない限り、各「doSomething」(オーバーロードまたはローカルの可能性があります)を置き換える方法を理解できません(一部のシンボルはJavaを参照しているため、これを行うことはできません)。ライブラリ要素)。

当社のDMSソフトウェアリエンジニアリングツールキットを使用して、タスクを実行できます。DMSは、JavaをASTに解析し(コメントキャプチャを含む)、任意の方法でASTをトラバースし、ASTを分析/変更し、変更されたASTを有効なソースコード(コメントを含む)としてエクスポートできます。

基本的に、すべてのコメント、文字列、および識別子の宣言を列挙し、それらを外部の「データベース」にエクスポートして、同等のものに(手動で?Google翻訳によって?)マッピングします。いずれの場合も、元のテキストで同じスペルのアイテムは、変更されたテキストで異なるスペルが必要になる可能性があるため、関心のあるアイテムだけでなく、その正確な場所(ソースファイル、行、さらには列)にも注意する必要があります。

ASTがあれば、文字列の列挙は非常に簡単です。ツリーをクロールして、文字列リテラルを含むツリーノードを探すだけです。(ANTLRとEclipseも確かにこれを行うことができます)。

コメントの列挙も、使用しているパーサーがコメントをキャプチャする場合は簡単です。DMSはそうします。ANTLRのJava文法が機能するのか、それともEclipseASTエンジンが機能するのかはよくわかりません。どちらも有能だと思います。

宣言(クラス、メソッド、フィールド、ローカル)の列挙は比較的簡単です。心配するケースはかなり多くなります(たとえば、基本クラスの拡張機能を含む匿名クラス)。ASTをウォークしてツリー構造を照合する手順をコーディングできますが、ここでDMSが違いを生み出し始めます。照合したいソースコードのように見える表面構文パターンを記述できます。例えば:

   pattern local_for_loop_index(i: IDENTIFIER, t: type, e: expression, e2: expression, e3:expression): for_loop_header
         = "for (\t \i = \e,\e2,\e3)"

ローカルのforループ変数の宣言と一致し、IDENTIFIER、型、およびさまざまな式のサブツリーを返します。識別子だけをキャプチャする必要があります(およびその場所。DMSがすべてのツリーノードにスタンプするソース位置情報から取得することで簡単に実行できます)。さまざまな種類の識別子すべてのケースをカバーするには、おそらく10〜20のそのようなパターンが必要です。

キャプチャステップが完了しました。キャプチャされたすべてのエンティティをターゲット言語に翻訳する必要があります。それはあなたにお任せします。残っているのは、翻訳されたエンティティを元に戻すことです。

これの鍵は、正確なソースの場所です。行番号は実際には十分ではありません。同じ行に複数の変換されたエンティティがあり、最悪の場合、スコープが異なるものもあります(たとえば、ネストされたforループを想像してください)。コメント、文字列、および宣言の置換プロセスは簡単です。識別された場所のいずれかに一致するノードをツリーで再スキャンし、そこで見つかったエンティティをその翻訳に置き換えます。(これはDMSとANTLRで行うことができます。EclipseADTでは「パッチ」を生成する必要があると思いますが、それでうまくいくと思います。)

楽しい部分は、識別子usesを置き換えることです。このためには、2つのことを知る必要があります。

  • 識別子を使用する場合、宣言とは何ですか。これを知っている場合は、宣言の新しい名前に置き換えることができます。DMSは、フルネームとタイプの解決、および使用法リストを提供し、これを非常に簡単にします。
  • 名前が変更された識別子は、元の識別子とは異なるスコープで相互にシャドウイングしますか?これは一般的に行うのが難しいです。ただし、Java言語の場合、「シャドウイング」チェックがあるため、名前を変更した後、少なくとも問題があると判断できます。(このようなシャドウイングの競合を解決するために使用できる名前変更手順もあります

ツリーにパッチを適用した後、DMSの組み込みのprettyprinterを使用して、パッチを適用したツリーをソースファイルとして書き直すだけです。EclipseASTはツリーとパッチを書き出すことができると思います。誰かがJava文法用にコード化したかもしれませんが、ANTLRがASTからソースコードを再生成するための機能を提供するかどうかはわかりません。細部にまでこだわったため、これは思ったよりも難しいことです。YMMV。

あなたの目標を考えると、「classfoo{...}」を含むソースファイル「foo.java」の名前を.javaに変更したくないことに少し驚いています。これには、変換されたツリーを変換されたファイル名に書き込むだけでなく(非常に簡単)、おそらくディレクトリツリーを再構築する必要があります(DMSはディレクトリ構築とファイルコピーを行うための機能も提供します)。

多くの言語でこれを実行する場合は、言語ごとに1回プロセスを実行する必要があります。文字列に対してのみこれを実行したい場合(従来の国際化の場合)、各文字列(変更が必要ですが、すべてではありません)を、一意のリソースIDを持つリソースアクセスの呼び出しに置き換えます。ランタイムテーブルはさまざまな文字列を保持します。

于 2012-06-25T11:03:06.393 に答える
1

1つのアプローチは、コードを1つの言語で完成させてから、他の言語に翻訳することです。

Eclipseを使用して支援することができます。

  1. 完成したコードを言語固有のプロジェクトにコピーします。
  2. それで:
    • 識別子:アウトラインビュー([ウィンドウ]>[ビューの表示]>[アウトライン])で、各アイテムを選択し、[リファクタリング]> [名前の変更](Alt + Shift + R)を選択します。これにより、使用されている場所で識別子の名前が変更されます。
    • コメント:「検索」>「ファイル」を使用して、「/*」または「//」のすべてのインスタンスを検索します。それぞれをクリックして変更します。
    • 文字列
      1. [ソース]>[文字列の外部化]を使用して、すべてのリテラル文字列を検索します。
      2. 「Messages.getString()」を検索>ファイルします。
      3. 各結果をクリックして変更します。
      4. 各ファイルで、「編集>検索/置換」を実行し、「// \$NON-NLS-。*\$」を空の文字列に置き換えます。
于 2012-06-19T19:26:48.823 に答える
0

次のような.propertiesファイルを使用します。

Locale locale = new Locale(language, country);
ResourceBundle  captions= ResourceBundle.getBundle("Messages",locale);

このようにして、Javaは現在のローカル(オペレーティングシステムまたはJavaロケール設定から取得)に従ってMessages.propertiesファイルを選択します。

ファイルは、Messages.properties(デフォルト)またはドイツ語の場合はMessages_de.propertiesなどと呼ばれるクラスパス上にある必要があります。

完全なチュートリアルについては、これを参照してください:http: //docs.oracle.com/javase/tutorial/i18n/intro/steps.html

ソースコードに関しては、英語を使用することを強くお勧めします。getUnternehmen()のようなメソッド名は、平均的な開発者よりも普通の英語のメソッド名よりも劣っています。外国の開発者を自分のコードに慣れさせる必要がある場合は、その言語で適切な開発者向けドキュメントを作成してください。

英語と他の言語の両方でJavadocを使用したい場合は、このSOスレッドを参照してください。

于 2012-06-19T15:16:22.310 に答える
0

印刷/ログに記録された文字列の場合、Javaにはいくつかの国際化機能(別名ResourceBundle)があります。oracleサイトにこれに関するチュートリアルがあります

Eclipseには、このための機能もあります(私が覚えているように、「文字列の外部化」)。

関数名については、多くのバージョンでコードソースを維持する必要があるため、何も考えられません...

よろしく

于 2012-06-19T15:17:47.103 に答える
0

フリーマーカーテンプレート(またはvelocityなどの別のテンプレート言語)を使用してコードを記述できます。

doSomething.tml

/** ${lang['doSomething.comment']} */
public String ${lang['doSomething.methodName']}() {
    System.out.println("${lang['doSomething.message']}");
}

lang_en.prop

doSomething.comment=A comment
doSomething.methodName=doSomething
doSomething.message=Something was done successfully

次に、ビルド中にテンプレートを各言語のプロップファイルとマージします(Ant / Gradle / Mavenなどを使用)

于 2013-12-16T14:42:41.023 に答える