4

一部のDjangoアプリケーションでは、次のようなgettextを含むURLパターンに遭遇しました。

from django.utils.translation import ugettext as _

urlpatterns = patterns('',
    ...
    url(r'^%s$' % _('about/'), about, name='about'),
    ...
)

最初は、プロジェクトの他の部分と統一された方法でURLを国際化することは良い考えのように思われましたが、私には疑問があります。

AFAIK、URLパターンはアプリケーションの起動時に読み込まれます。したがって、アプリケーションに最初のリクエストを行うユーザーの言語設定に従ってビルドされると思います。スレッドが使用されている場合も、これはさらに予測不能になる可能性があります。

このアプローチは、インストールが単一言語で行われる場合に合理的である可能性がありますが、フォーラムアプリケーションなど、他の言語で他のインストールが行われる可能性があります。

これは問題だと思いますか、それとも私の想像ですか?このアプローチは多言語サイトに使用できますか?ugettext_lazyこの問題を回避できますか?

4

4 に答える 4

3

djangoのドキュメントを読んでください:https ://docs.djangoproject.com/en/dev/topics/i18n/translation/#url-internationalization

基本的に、ugettext_lazyを使用してパターンを翻訳することができ、すべてのリクエストに言語が設定されていれば機能します。これを確実にするには、LocaleMiddlewareを使用する必要があります。https://docs.djangoproject.com/en/dev/ref/middleware/#django.middleware.locale.LocaleMiddleware

于 2014-03-01T01:55:54.110 に答える
1

このアプローチは機能しません。翻訳は、アプリケーションのロード時に行われます。これは、URLパターンがアプリのデフォルト言語である単一言語になることを意味します。

翻訳は、呼び出されたコンテキストがユーザーの言語設定にアクセスできる場合にのみ機能します。

URLを多言語にするには、実行時のURL定義をいくつか使用する必要があります。これらは、ユーザーの現在の言語に基づいて読み込まれます。

于 2011-03-06T23:26:02.043 に答える
0

ugettext_lazyは、文字列を連結するときにすぐに評価されます。

そのように機能します:url(_(r'^ contact /')、include('contact.urls'))、

しかし、エラーになる可能性のあるパターンを翻訳する必要があります。

于 2012-10-26T14:29:23.290 に答える
0

あなたはこのようにそれを行うことができます:

import six
from django.utils.functional import lazy


def lazy_url_pattern(pattern):
    return lazy(pattern, six.text_type)()

そして、コーディネーターで:

urlpatterns = [
    url(lazy_url_pattern(lambda: r'^{n}/$'.format(n=ugettext_lazy(u'foo'))), MyView.as_view(), name='...'),

しかし、それでもエラーが発生しやすいです。

ポール

于 2017-07-24T14:39:19.663 に答える