2012年05月30日

GAE django1.2 で URL 毎に i18n

前回の記事で GAE django1.2 で i18n する方法について書きましたが、ユーザの環境に合わせて言語を出し分けるという話をしていませんでした。
今回はその話。

プログラム内で特に何もしなかった場合、conf/settings.py で設定した LANGUAGE_CODE が使われます。
LANGUAGE_CODE = 'ja';
とすれば日本語で表示されますし、
LANGUAGE_CODE = 'en';
とすれば英語で表示されるはずです。

ユーザの環境によって言語を変えたい場合の説明は

http://blog.yjl.im/2009/02/using-django-i18n-in-google-app-engine.html

が参考になると思います。自分のサイトの場合、
  • 通常の URL では英語
  • /ja で始まる URL は日本語
という風にしたかったので、以下のような I18NRequestHandler.py を作成しました。
# -*- coding: utf-8 -*-
#
import os;
from django.utils import translation;
from google.appengine.ext import webapp;

class I18NRequestHandler(webapp.RequestHandler):
    def initialize(self, request, response):
        webapp.RequestHandler.initialize(self, request, response);
        self.reset_language()

    def reset_language(self):
        language = "en";
        if os.environ['PATH_INFO'].find('/ja') == 0:
            language = "ja";
        translation.activate(language)
        self.request.LANGUAGE_CODE = language;
GAE では PATH_INFO は取れますが、REQUEST_URI は取れませんのでご注意を。
この I18NRequestHandler を webapp.RequestHandler の代わりに使って、
class Index(I18NRequestHandler):
な感じにしてやれば OK です。ちなみに、main.py は
from controllers.index import Index;
application = webapp.WSGIApplication(
                [('/', Index),
                ('/ja', Index),
                ('/.+', NotFound)],
                debug=True);

def main():
    run_wsgi_app(application);

if __name__ == "__main__":
    main()
な感じになっていて、controllers/index.py の Index クラスを呼び出すようになっています。
posted by おちエン at 21:06| Comment(0) | GAE | このブログの読者になる | 更新情報をチェックする

2012年05月28日

GAE django1.2 で i18n する方法

GAE で django1.2 を使う方法は、GAE SDK 1.6.5 では appengine_config.py に
webapp_django_version = '1.2'
と書くだけです。
が、このままでは django の国際化はできません。

http://blog.yjl.im/2009/02/using-django-i18n-in-google-app-engine.html などに記事がありますが、これは2009年の記事で、しかも django0.96.1の話で、このままやっても GAE1.6.5+djnago1.2ではうまくいきませんでした。
試行錯誤の結果、 GAE1.6.5+djnago1.2で国際化できましたので、まとめておきます。

続きを読む
タグ:Django GAE
posted by おちエン at 16:50| Comment(0) | GAE | このブログの読者になる | 更新情報をチェックする

2012年05月27日

Mac OS X に gettext を install

django で i18n をしようとしたところ(これは別記事で)、gettext を入れないといけないことが判明。
普通の UNIX であれば、ダウンロードして、configure → gmake で終わりなところですが、Mac 初心者の自分としてはどうやればよいのかわからず、かなり調べる必要がありました。

結論としては、 という手順を踏む必要がありました。
XCode の install についてはこちらを見てください。

homebrew というのは、FreeBSD の ports な感じでしょうか。もしくは、Perl の CPAN, PHP の Pear。
https://github.com/mxcl/homebrew/wiki/installation にインストールの方法が書いてありますが、terminal を立ち上げて、
$ /usr/bin/ruby -e "$(/usr/bin/curl -fsSL
  https://raw.github.com/mxcl/homebrew/master/Library/Contributions/install_homebrew.rb)"
と入れればインストールされます。
homebrew さえいれてしまえば、gettext のインストールは簡単で、
$ brew install gettext
$ brew link gettext
とやれば、patch 当て、congigure, gmake, ln を brew がやってくれますので、非常に楽でした。
タグ:Mac GAE
posted by おちエン at 00:02| Comment(0) | Mac | このブログの読者になる | 更新情報をチェックする

2012年05月26日

MacOS X 10.6 Snow LeopardでXCodeのinstall失敗

GAE の開発で XCode をインストールする必要が生じ、入れようとしたのですがこれがなかなかはまったので書いておきます。

そもそも、MacOS X の最新バージョンは 10.7.3 Lion ですが、自分が使っているのは 10.6.8 Snow Leopard。
XCode の最新バージョンは XCode4 ですが、これは Lion 用なので 10.6 系の場合は Snow Leopard 用の Xcode をインストールする必要があります。

developer.apple.com のユーザ登録をしていない場合は、

https://developer.apple.com/devcenter/mac/index.action

の "Register" でユーザ登録し、メール認証して登録を完了させます。
その後、

https://developer.apple.com/downloads/index.action

の左側にある検索ボックスに "XCode 3.2.6" と入れて検索。
XCode 3.2.6 and iOS SDK 4.3.dmg をクリックするとダウンロードが開始されます。
ただし、このファイルサイズが 4.14GB もあるため、結構な時間がかかります。。。

ダウンロード後、install しようとすると自分の MacBook Air ではディスクサイズが足りないという。。。
フルで入れようとすると 10GB 程度のハードディスクの空きが必要です。
4GB のファイルダウンロードして、10GB のディスクを開けるとか無理。。。
ある程度ハードディスクの掃除をしてから、インストールファイルの選択で "iOS SDK" を入れない設定をすると、2GB 強なのでそれでなんとか進めました。
ちなみに iOS SDK を入れるか入れないかは "Essentials"の項目の中にあります。

インストールは10分くらいで終わりますが、最後の最後で、「予想外のエラーが起きて、インストールに失敗しました」とかいうエラーが。
再度 install を試みると今度はディスク容量不足。。。
ディスクをチェックしてみると、/Developer の下に XCode が不完全ながらインストールされているもよう。
しょうがないので、terminal を立ち上げて、
$ sudo /Developer/Library/uninstall-devtools --mode=all
で uninstall。
再度 install してみましたが、結局同じエラーで install できず。
しょうがないので、google で検索したところ、

http://support.apple.com/kb/DL1512?viewlocale=ja_JP&locale=ja_JP

を install すると治るという話が。
これを入れた後、再度 XCode を uninstall し、install してやっと入れることができました。
タグ:Mac GAE
posted by おちエン at 19:51| Comment(1) | Mac | このブログの読者になる | 更新情報をチェックする

2012年05月25日

gae-sessionsのno_datastore

GAEでセッションを使いたい場合、gae-sessionsを使うのが便利だと思います。
gae-sessionsの詳細は、https://github.com/dound/gae-sessions で確認してください。
簡単に説明すると、
$ git clone git://github.com/dound/gae-sessions.git
でダウンロードして、GAE のアプリケーションディレクトリに移動し、appengine_config.py に
from gaesessions import SessionMiddleware;

def webapp_add_wsgi_middleware(app):
    app = SessionMiddleware(app, 
       cookie_key="32文字以上のパスワード",
       lifetime=datetime.timedelta(days=有効期限));
    return app;
と設定するだけです。
ただし、この設定ではセッション情報はデータストアにも保存されます。
gaesessions の動きとしては、
  1. まず、sessionID で memcache を探す
  2. memcache にデータがなければ、データストアからデータを取得する
という感じになっています。
ソースを見る限り、memcache でヒットしなくても read の際は、memcache にセットしなおさないため、次に write が行われるまで、常にデータストアを見続けるようです。

GAE の課金体系ではデータストアの read/write が一定量を超えると有料になるので、データストアの read/write はできるだけ避けたいところです。
そこで no_datastore を使えば、gaesessions では全くデータストアが使われなくなります。
no_datastore の設定は非常に簡単で、appengine_config.py で
def webapp_add_wsgi_middleware(app):
    app = SessionMiddleware(app, 
       cookie_key="32文字以上のパスワード",
       lifetime=datetime.timedelta(days=有効期限),
       no_datastore=True);
    return app;
とするだけです。
ただし、この設定をすると memcache にデータがなくなるとデータ自体が失われてしまうため、重要な情報をセッションに入れられなくなります。
タグ:GAE
posted by おちエン at 22:27| Comment(0) | GAE | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。