2011-08-08 6 views
1

djangoプロジェクトで言語定数を保存する最も良い方法は何ですか?Djangoアプリケーションのレイアウト:国際化

たとえば、私たちは翻訳のために私たちがしなければならないことを、知っている:

from django.utils.translation import gettext_lazy as _ 

class MyThing(models.Model): 
    name = models.CharField(help_text=_('This is the help text')) 

我々は亜種の多くを持っている場合は、私たちはこのように辞書を使用することができます。

from django.utils.translation import gettext_lazy as _ 
MYTRANSLATION = { 
    'term1':_('term1'), 
    'term2':_('term2'), 
    ... 
} 

だから、私の質問は、どこに言語定数で辞書を格納するか...直接、ビュー、モデル、アプリケーションフォルダの別ファイル、プロジェクトのルートフォルダなど...どのような最善の方法ですか?そしてあなたの言語constをどこに保存しますか?

答えて

1

私はそれが本当に依存していると思います。あなたがN言語に翻訳したい大衆向けのサイトを持っている場合、それらは一定ではなく、コンテンツが変わるたびに専用の翻訳者からの更新が必要になります。このようなプロジェクトでは、gettextは技術者以外の人が使用するのが難しいため、完全に不適切です。また、コンテンツを頻繁に変更する場合は、大規模な翻訳者を翻訳するために、再コンパイルと再デプロイが必要になります。 gettextはデスクトップアプリケーションで動作します(これは翻訳者にとってはまだまだ大きなピタですが)、ウェブサイトではありません。

代わりにhttps://github.com/ojii/django-naniを使用してください。 、あなたが必要とするテキストの各部分については

class I18NString(TranslatableModel): 
    key = models.SlugField(unique = True) 
    translations = TranslatedFields(
     text = models.TextField(), 
    ) 

I18NStringの行として追加:あなたのテンプレートですべての翻訳可能な文字列を保持するテーブルを作成します。たとえば、キー「short-introduction-text」を含む行を追加し、そこで紹介テキストの英語版とドイツ語版を追加することができます。各ページの負荷のためのその後

、現在の言語のすべての翻訳をロード:

# For performance, memcached should be used. 
strings = I18NString.objects.language(request.COUNTRY_CODE).all() 
trans = dict((s.key, s.text) for s in strings) 

は、テンプレートにトランス辞書をパスし、翻訳された文字列を描画:

{{ trans.short-introduction-text }} 
+0

うわー!それでおしまい。ありがとうございました。 –

0

実際に文字列が使用される場所。翻訳を含む別の辞書を作成しないでください。醜いですし、文脈を破壊します(xgettextは文字列が使用されるファイルを指すことができません)。そして基本的にi18n機械の機能を重複しません。

# yes: 
def view(request): 
    return HttpResponse(_(u'something something')) 

# no: 
translations = { 'something something': _(u'something something') } 
def view(request): 
    return HttpResponse(translations['something something']) 
+0

さて...どのように我々がすべき動的であれば文字列を翻訳しますか?データベースから取得したものの、文字列の集合はわかっていますか? –