2

私は既存の多言語サイト(Coldfusion / MySQL)で作業しています。

私が座っている多くのページで、一部のテキスト文字列が常に次のようにマークアップにハードコードされているのはなぜですか。

 <CFIF language = "EN"><p>Hello World</p></CFIF>

他の人はデータベースを使用して次のようにテキストを更新します。

 <p><cfoutput>#tx_greetings#</cfoutput></p>

ここでのベストプラクティスは何ですか?翻訳にデータベースを使用する場合は、すべてのテキスト(長短)をそこに保存する方が簡単だと思いました。データベースを使用していない場合は、すべてのテキストをif-elsedにする必要があります。それを混ぜるのは少しメンテナンスが大変ですよね?

また、MySQLに保存するtext-string-lengthに制限はありますか?多分パフォーマンス的に?

いくつかの入力をありがとう!

4

3 に答える 3

7

文字列/翻訳をコードに保存しないでください。保守可能なi18n'dサイトが必要な場合は、これは悪い習慣です。

すべての文字列を同じ場所、db、または言語ごとのプロパティファイルに保存する必要があります。どちらでも構いませんが、一貫性があります。個人的には、編集しやすいプロパティファイルが好きです。

welcome_message=Hi {0}, Welcome to my site

onApplicationStart()ですべての翻訳を一度にロードし、それらにアクセスし、提供された引数で文字列をフォーマットするためのラッパークラスを提供します

例えば

#i18n.getString(user.getLocale(), "welcome_message", [user.getUsername()])#

java.text.MessageFormat [1]を使用して、強力なフォーマットを提供できます

function getString(string locale, string key, array args) {
  var mf = createobject("java", "java.text.MessageFormat");
  mf.init(variables.strings[arguments.locale][arguments.key]);
  return mf.format(javacast("java.lang.Object[]", args));
}

上記は単なる例であり、これにエラーキャッチとキャッシュを提供する必要があります

それがあなたを生産的な方向に向けるのに役立つことを願っています

[1] http://docs.oracle.com/javase/7/docs/api/index.html?java/text/MessageFormat.html

于 2012-04-22T14:47:24.483 に答える
1

どちらを使用するかによって、DBまたはASCIIファイルを使用できます。DBを使用する場合は、次の列を持つテーブルを作成できます。

country_code :言語の国コード(つまり、英語の場合はUS

Definition_name:定義またはメッセージの名前(*つまり、dbアクションの一般的なエラーメッセージの場合はdb_error_msg *)

定義値 :定義の値(つまり、データの保存中にエラーが発生しました

各レコードが定義になります。

ユーザーが選択した言語に応じて、アプリはデータベースをフィルタリングし、必要なすべての定義のクエリを取得します。私は通常、そのクエリを使用して、次のようなセッション変数構造を設定します。

   <cfif IsDefined("session.language") IS FALSE>
     <cfquery name="getDefinition" datasource="dsn">
     SELECT * FROM tbl_definitions WHERE country_code = "US"
     </cfquery>
     <cfset session.language = structnew()>
     <cfoutput query="getDefinitions">
       <cfset session.language["#definition_name#"] = "#definition_value#">
     </cfoutput>
  </cfif>

コードでは、単に次を使用します。

<cfoutput>
<h2>#session.language.db_error_msg#</h2>
</cfoutput>

そして、私は現在の言語に合ったメッセージを受け取ります。マスター定義データベースを使用して、さまざまなWebサイトで使用することもできます。

同じソリューションをさまざまな構成ファイル(US.cfg、EN.cfg、ES.cfgなど)で使用して、簡単な方法で定義を設定してリストを取得できます。私は通常、次のシステムを使用します。各行のdefinition_name =definition_value

db_error_msg = Sorry, an error occured saving your data
db_success_msg = Record saved

次に、現在の言語構成ファイル(つまり、英語の場合はUS.cfg、スペイン語の場合はES.cfg)を読み取り、同じ結果を取得します。

<cfif IsDefined("session.language") IS FALSE>
   <cffile action="read" file="#path#\US.cfg" variable="definitions">

   <cfset session.language = structnew()>
   <cfloop index="i" list="#definitions#" delimiters="#chr(10)#">
     <cfset definition_name = ListGetAt(i,1,"=")>
     <cfset definition_value = ListGetAt(i,2,"=")>
     <cfoutput>
        <cfset session.language["#definition_name#"] = "#definition_value#">
     </cfoutput>
   <cfloop>
</cfif>

これは、セッションの開始時に(必要な言語がわかっている場合)実行でき、どちらの方法でも、定義したユーザーセッション期間中、アプリケーション内のあらゆる場所で定義を利用できます。ボタン、メッセージ、テーブルヘッダーなどの定義を使用して、ローカライズされたテンプレートを作成したり、インライン翻訳を使用したりすることなく、非常に高速な方法で多言語UIを作成できます。

これがお役に立てば幸いです。

于 2012-04-26T16:10:19.067 に答える
0

一般的なローカリゼーションのアドバイスと同様に、取得するフレーズを知るために使用する変数名に注意してください。英語のフレーズにするだけでなく、英語では同じように見えるが、他の言語ではコンテキストによって大きく異なるコンテキストフレーズも処理する必要があるため、明らかに特定の変数にするものにします。

于 2012-04-27T17:21:41.340 に答える