スズキと申します。kay-frameworkを便利に使わせてもらっています。さて、kayをベースにCMSを作りたいと思っていますが、その際の国際化対応に関連してアドバイスをいただけないでしょうか。
ウェブページ上に表示する各種メニューについてはビルトインされているi18n機能を使って多言語対応可能だと思います。一方で、CMSで管理するコンテンツ自体については、どのようにdatastoreで管理すれば多言語対応できるのか悩んでいます。ベースとなるモデルを以下のように定義した場合、class Article(db.Model):title = db.StringProperty(verbose_name=_('Title'),required=True,indexed=False)content = db.TextProperty(verbose_name=_('Content'),required=True)update = db.DateTimeProperty(verbose_name=_('Update'),auto_now=True)created = db.DateTimeProperty(verbose_name=_('Created'),auto_now_add=True)別の翻訳コンテンツを入れるためのモデルを作ってkey_nameの工夫などで連携させるのが、一手だと思います。class ArticleTrans(db.Model):lang = db.StringProperty(verbose_name=_('Language'),required=True)title = db.StringProperty(verbose_name=_('Title'),required=True,indexed=False)content = db.TextProperty(verbose_name=_('Content'),required=True)update = db.DateTimeProperty(verbose_name=_('Update'),auto_now=True)created = db.DateTimeProperty(verbose_name=_('Created'),auto_now_add=True)
もう一つ考えてみたのは、Expandoモデルを定義した上でclass Article(db.Expando):title = db.StringProperty(verbose_name=_('Title'),required=True,indexed=False)content = db.TextProperty(verbose_name=_('Content'),required=True)update = db.DateTimeProperty(verbose_name=_('Update'),auto_now=True)created = db.DateTimeProperty(verbose_name=_('Created'),auto_now_add=True)title_enやcontent_enのように対応する言語の分だけ、プロパティを動的に追加するのもあるのかなと思いました。この場合は、対応する言語が増えた場合は破綻しそうですが。
よろしくお願いします。--
--------------------------
Yosuke Suzuki
--
このメールは Google グループのグループ「kay-users-ja」の登録者に送られています。
このグループに投稿するには、kay-us...@googlegroups.com にメールを送信してください。
このグループから退会するには、kay-users-ja...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/kay-users-ja?hl=ja からこのグループにアクセスしてください。
ベースとなるモデルを以下のように定義した場合、class Article(db.Model):title = db.StringProperty(verbose_name=_('Title'),required=True,indexed=False)content = db.TextProperty(verbose_name=_('Content'),required=True)update = db.DateTimeProperty(verbose_name=_('Update'),auto_now=True)created = db.DateTimeProperty(verbose_name=_('Created'),auto_now_add=True)別の翻訳コンテンツを入れるためのモデルを作ってkey_nameの工夫などで連携させるのが、一手だと思います。class ArticleTrans(db.Model):lang = db.StringProperty(verbose_name=_('Language'),required=True)title = db.StringProperty(verbose_name=_('Title'),required=True,indexed=False)content = db.TextProperty(verbose_name=_('Content'),required=True)update = db.DateTimeProperty(verbose_name=_('Update'),auto_now=True)created = db.DateTimeProperty(verbose_name=_('Created'),auto_now_add=True)
僕は基本的にこちらの方が良いとおもいます。ただ、まだ色々考えることがありそうです。* ArticleTrans と Article を別クラスにする必要ありますか?同じでも動きそう。
* 両方の class とも draft フラグのようなものがあったほうが良さそう
* 元のコンテンツにも lang があったほうが良さそう* 元のコンテンツが変更した場合にはそれを検知して* 検知はどのように行うか* Article の更新時に、翻訳全てに stale フラグを付ける - これが簡単で良さそう* update を比較する - あまりおすすめしません* entity group の version を使う - ちょっと難しそう* 検知した場合どうするか* 翻訳と一緒に「古い」旨と元のコンテンツへのリンクも表示する* or 元のコンテンツを表示する
下記はコストもかかるのであくまで nice-to-have ですが* 元のコンテンツを翻訳した時のバージョンと、最新版の差分がわかると嬉しいkey_name の工夫というと、翻訳コンテンツの parent に元コンテンツを指定するということでしょうかね。これはとても良いとおもいます。
一点だけ懸念があるとすれば、翻訳 UI の仕様や、元コンテンツの人気度などによっては Entity Group への書き込みが多すぎて破綻する可能性もありそうです。
例えば、もし翻訳 UI の方で Auto Save 機能があり、複数の翻訳者が同時に作業していると書き込みが増えます。といっても、Auto Save 機能を Datastore に直接書き込むのもどうかと思うので、気にしなくても良さそうです。