2012年4月9日月曜日

i18n_patterns の残念なところ

さて、さっそく blog を作り始めたのですが、i18n_pattern で ちょっと困ったことが。

それは、Django を sub URL に置いていると、常に先頭に 言語のプレフィックスがついてしまうのです。 そこで、django/middleware/locale.py を自分のプロジェクトにコピーし、 以下の部分を

if is_valid_path(language_path, urlconf):
    language_url = "%s://%s/%s%s" % (
        request.is_secure() and 'https' or 'http',
        request.get_host(), language, request.get_full_path())
    return HttpResponseRedirect(language_url)

次のように修正しました。

if is_valid_path(language_path, urlconf):
    protocol = "%s://%s" % (
            request.is_secure() and 'https' or 'http',
            request.get_host())
    url_base = "%s%s" % (language, request.get_full_path())
    url_base = settings.PROJECT_URL + url_base.replace(
            settings.PROJECT_URL, '/')
    return HttpResponseRedirect(protocol + url_base)

ここでPROJECT_URL は、settings.py の中で、

PROJECT_URL = '/~mucius/'

のように設定しています。

果たして、これがベストかどうかは疑問ですが、 とりあえず動いているようなのでよしとします。

2012年3月26日月曜日

Django 1.4 の嬉しいところ

前のブログを書いていた正にその時に Django 1.4 が出ていました(汗)。 この 1.4 で個人的に特に嬉しかったのが

  • プロジェクトやアプリケーションの生成に、自前のテンプレートが使える
  • i18n_patterns を使って、多言語のURL振り分けができる

の2点。これと django-multilingual-model を使えば、多言語ブログが あっと言う間に作れる...はず...です。

i18n_patterns の使い方ですが、多言語にしたいパターンだけを i18n_patterns に することで実現できるようです。

from django.conf.urls import patterns, include, url
from django.conf.urls.i18n import i18n_patterns

urlpatterns = patterns(
    url('^admin/', include(admin.site.urls)),
)
urlpatterns += i18n_patterns('',
    url(r'^about/$', 'about.view', name='about'),
)

としておくと

from django.core.urlresolvers import reverse
from django.utils.translation import activate

>>> activate('en')
>>> reverse('about')
'/en/about/'

>>> activate('ja')
>>> reverse('about')
'/ja/about/'

となってくれる筈。まだ試していませんが... さて、ちょっと作ってみます。

2012年3月23日金曜日

django-multilingual-model が素敵

Plone で作成していたサイトが、突然壊れてしまい、 それ以来自宅サーバ上のサイトをPloneで続けるか、 それともDjangoで作り直すか思案していたのですが、 Djangoでも多言語化が簡単にできそうなツールをみつけたので そろそろ自宅サイトを復活しようと思っています。 自宅で暇を見つけてはちまちま書いていくつもりなので、 いつになるか分かりませんが、それまではグーグルさんの お世話になります。

さて、そのツールとは、 django-multilingual-modelこちら のオリジナルを整形して、見やすくなっています。

これをインストールすると、以下のようなモデルを

class Book(models.Model):
    ISBN = models.IntegerField()
    title = models.CharField(max_length=32)
    description = models.TextField()

以下のように変更する事で、title と description が多言語化されます。

from multilingual_model.models import MultilingualModel
from multilingual_model.models import MultilingualTranslation

class BookTranslation(MultilingualTranslation):
    class Meta:
        unique_together = ('parent', 'language_code')

    parent = models.ForeignKey('Book', related_name='translations')

    title = models.CharField(max_length=32)
    description = models.TextField()

class Book(MultilingualModel):
    ISBN = models.IntegerField()

つまり、翻訳したいアイテムだけを、MultilingualTranslation から継承した クラスに移動して、元のモデルは、MultilingualModel から継承するように 変更するだけ。素晴しい!

しかも、admin 入力も用意されていて、

from django.contrib import admin
import models

from multilingual_model.admin import TranslationInline

class BookTranslationInline(TranslationInline):
   model = models.BookTranslation

class BookAdmin(admin.ModelAdmin):
   list_display = ["ISBN"]
   inlines = [BookTranslationInline]

admin.site.register(models.Book, BookAdmin)

こんな風に登録すると、ちゃんと言語別の入力フィールドを用意して くれるのです。来週には国際化も更に強化された Django 1.4 が 正式リリースされるようですし、ここは一念発起してサイトを作り直すしますか。