2012-04-22 5 views
2

私は既存の多言語サイト(Coldfusion/MySQL)で作業しています。を使用すると、データベースにテキスト文字列を格納し、マークアップに他の文字列を書き込むのはなぜですか?

なぜそれは私が座っているページの多くには、いくつかのテキスト文字列は次のように常にマークアップへハードコーディングされたであるということです。他の人のようなテキストを更新するためにデータベースを使用しながら、

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

so:

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

ここでのベストプラクティスは何ですか?翻訳のためにデータベースを使うつもりなら、そこにすべてのテキストを保存するのが簡単になるだろうと思った。データベースを使用していない場合、の場合、すべてのテキストはになります。それを混ぜることは少しメンテナンス重いですね。

また、MySQLに格納するテキスト文字列の長さに制限がありますか?パフォーマンス上の理由がありますか?

ありがとうございました!

+3

デベロッパーの怠け者を継承したばかりかもしれません。 ( "今すぐ適切な文字列を扱うことができません。最初に動作させてから残りの時間に、文字列を適切なI18nメカニックにリファクタリングしてください。") –

+0

私をl18nで始めるためのリンクがありますか? – frequent

+0

@freqent:一般的なコンテキストではあまりありません。しかし、私はそれがより厄介な(新しいIDを見つける、既存のメッセージが再利用できるかどうかをチェックする...)場合でも、 "DBのすべて"のアプローチはより適切なアプローチだと思います。 –

答えて

7

コードに文字列や翻訳を保存しないでください。メンテナンス可能なi18nのサイトが必要な場合は、悪い習慣です。

言語ごとに同じ場所、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)); 
} 

上記の一例であり、あなたはあなたがDBまたはを使用することができます

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

+0

クール。どうもありがとうございました。これを掘り下げる – frequent

1

生産の方向にあなたを指すことができます。この

希望にエラー引くとキャッシングを提供する必要がありますアスキーファイルは、好きなものに依存します。 uは次の列を持つテーブルを作成することができDBを使用する場合:

COUNTRY_CODE:国コードを言語用(米国つまりを英語ため)

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

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

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

言語に応じて、ユーザーがアプリを選択するとデータベースがフィルタリングされ、必要なすべての定義のクエリが表示されます。私は単純に使用するコードでは

<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)で使用できます。 (つまり、英語US.cfgは、スペイン語ES.cfg)それから私は、現在の言語設定ファイルを読み込む definition_name = definition_value各行の

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

と同じ結果を得る

: 私は通常、次のシステムを使用します
<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を非常に高速に作成できます。

私はこれがあなたに役立つことを願っています。

+0

ありがとうございました。素晴らしい説明。私は多かれ少なかれこのような何かを設定している。私は正しい道を見て良いです! – frequent

0

一般的なローカライゼーションに関するアドバイスと同様に、検索するフレーズを知るために使用する変数名には注意が必要です。それを英語のフレーズにするのではなく、明らかに特定の変数であるものにしてください。なぜなら、英語で同じように見えるコンテキストフレーズも処理する必要があるからです。

関連する問題