自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

April 05, 2009 [長年日記]

[Misc] github.com、おかしい?

微妙にFORK QUEUEとかが古くなったりしている気がする。障害発生後に復旧した、みたいな感じ。リポジトリ自体は大丈夫なのかな・・・。ちょっと心配。


April 18, 2009 [長年日記]

[Ruby] RakeでFTPアップロードを自動化

あまり情報がないみたいなんだけど・・・・。もっと便利なやり方があるのかな。

require 'rubygems'
require 'rake'
require 'rake/contrib/ftptools'
 
task :upload do
  ftp = Rake::FtpUploader.new("/public_html",  # 公開先ディレクトリ
         "www.yotabanana.com",                 # ホスト名
         "(account)", "(password)")            # アカウント・パスワード
  ftp.verbose = true                           # アップロード状況が見えないと不安なので
  ftp.upload_files("api/**/*")                 # ローカルのapiディレクトリ配下をそのままコピー。
end

上記は、転送先の/public_html/api/配下に一括コピーする例。
もちろん、(account), (password)は自分のものを入れる。上記ファイル自体を公開リポジトリに置くのなら、ENV["USER"], ENV["PASSWD"]みたいに環境変数に設定しておいて外部で設定しておくといいよね。

ということで、Ruby-GetTextファミリのAPIリファレンスのアップロードを自動化したのでした(<今さらかよ)。最新版はこちら

[Ruby] Ruby-GetText-Package-2.0.1, Ruby-Locale-2.0.1

リリースしました。

全体的に(特にgettextは1.85倍くらい)高速化できたし、Localized template viewもActionMailerも元通り(Rails-2.1.0以前と同様に)使えるようになったということで、このリリースで、Stableと言えるようになったのではないかなぁ、と淡い期待。

ぜひ、使ってみてくださいまし。

[Misc] git tagの付け方メモ

git tag 2.0.1

git push --tags

git pushしても反映されない、なぜだーっって、--tagsをつけるの忘れたのが原因。


April 23, 2009 [長年日記]

[Ruby] Locale.app_supported_locales: メモ

来週の自分へのメモです。

Ruby-Locale/GetTextの目標は、他のいろいろな国際化ライブラリ等のベース、あるいはのりしろとなることです。つまり、複数の国際化ライブラリを同時に使うということを想定した作りを目指しています。

ここでは、gettextを使った複数のライブラリと、gettextを使ってはいないけどlocaleを使ったライブラリがあり、使用者はこれらを使ったアプリケーションを開発する、ということを考えます。

1. 多言語カレンダのライブラリ ・・・ en, fr, ja, ko, zhをサポート

2. お金を扱うライブラリ ・・・ en, fr, de, it, ja, ko, zh

3. 天気表示のライブラリ ・・・ en, jaのみをサポート

4. 上記のライブラリを使ったアプリ ・・・ en, ja, zhを提供可能

あなたは、4.のアプリ開発者です。

さて、あなたのアプリはどの言語をサポートしていると考えるべきでしょうか。

(案1): 全てのLib/Appでen, jaを共通してサポートできているのでen, ja

(案2): 自分たちはzhも提供できるので、en, ja, zh。天気表示ライブラリはzhの時はenへフィードバックすることで問題無しとしよう。

(案3): 自分のアプリはお金さえしっかり扱えればOK。なので、2.が7か国語サポートできてるので7か国語サポートということで。部分的に英語が表記される言語も多いけどそれはそれ。

答えは、「場合によりどれも正解になりうる」になると思います。

もう一つ、より具体的な例としてgettext_activerecord, gettext_railsとrails-2.3.2の組み合わせで考えてみます。

自分のアプリはenとjaの2ヶ国語をサポートしています。po配下にもenとjaの2ヶ国語しかないです。

しかし、gettext_activerecordがfrやzhもサポートしているので、HTTP_ACCEPT_LANGUAGEがfrやzhの時は、エラーメッセージのみfrやzhで表示されます。

このケースでも、frやzhが部分的にでも表示されればいい場合もあるでしょうし、いやいや、enとjaの2つでしか表示できないようにしないとダメだよ、という場合もあるでしょう。

上記の例で、そのアプリがサポートしている言語というのは、それぞれのライブラリではなく、アプリとして1箇所で決めることができるべきです。

逆にライブラリ(RailsではEngineやPlugin等も含む)は、自らがサポートしている言語というものは限定できるものの、アプリと組み合わせた時、自らがサポートしていない言語が来てしまった場合に、上手にサポートしている言語にフォールバックできるようにしておく必要があります。

現在のRuby-Locale/GetTextでは、supported_language_tagsという配列を渡すことのできるメソッド・関数がいくつかあり、それらはメソッド呼び出し時に言語を限定できるような作りになっています。

しかし、今回の考察のようにアプリで1回指定するだけで全てのライブラリで共通的に反映できるようなグローバルな設定は考慮できていませんでした。

そこで、Locale.app_supported_locales = ["ja", "en"]のようなメソッドを用意しLocale.candidates等は上記のロケール以外のロケールは返さないような作りに変更してはどうだろう、と思っています。


April 27, 2009 [長年日記]

[Ruby] locale_rails Tips: VARIANTを使ってデバイスによってテンプレートや表示メッセージを変える

Ruby-Localeでは言語タグにLocale::Tag::Commonというものを採用しています。これは [lang]_[Script]_[REGION]_[VARIANT] という形式です。この形式で、Scriptを除いた、[lang]_[REGION]_[VARIANT] という組み合わせはPOSIX/CLDR/RFCの全ての形式の言語タグ間で相互変換可能な最大限の情報量を持った形式になります。

ここでは、2つの例を紹介します。

まず、ローカライズド・テンプレートの例です。

app/views/foos/index.html.erbをiphoneだけ別のテンプレートにしたい場合を考えます。

この場合、app/views/foos/index_ja_IPHONE.html.erbというファイルを用意します(_part_ja_IPHONE.html.erbなどpartialなテンプレートでも使用可能です)。

あとは、http://localhost:3000/foos/?lang=ja_IPHONEとアクセスすればiPhoneのテンプレートを表示します。

実際、HTTP_ACCEPT_LANGUAGEではja_IPHONEなんて文字列は返してくれないので、そこはapplication_controller.rbで自分で設定する必要があります。

class ApplicationController < ActionController::Base
  def init_i18n
    if iphone?  #ここはUSER_AGENT等を使ってクライアントを判別します。
      locale = Locale.current.to_common
      locale.variants = "IPHONE"
      Locale.current = locale
    end
  end
  after_init_locale :init_i18n

なお、この例はあくまでもローカライズド・テンプレートの発展的な使用例なので、言語が先にありきです。各国語ごとのiPhoneテンプレートをそれぞれ作る場合に使ってください。各国語共通で使うiPhone用テンプレート、という例では使えません。

2つ目は、Ruby-GetTextのメッセージをVARIANTを使って細分化する例です。

子供向けはひらがなだけ、大人向けは漢字入りのメッセージを作る、という例を紹介します。

Ruby-GetTextのメッセージカタログ(moファイル)はPOSIXにしたがうので、[lang]_[REGION]_[VARIANT].[charset]@[Modifier]という形になります。このModifierはVARIANTと相互変換できますので今回のような例ではModifierを使用します。

まず、po/ja/foo@CHILD.poというpoファイルを用意して、ひらがなだけでメッセージを用意します。んで、rake makemoしておきます。

あとは、http://localhost:3000/foos/?lang=ja_CHILDとアクセスするとひらがなのサイトが表示されるでしょう。

あとはローカライズド・テンプレートの例と同様に、application_controller.rbでCHILDをVARIANTに指定するロジックを記述します。これはきっとユーザプロファイルによって変更されることになるんじゃないかと思います。

class ApplicationController < ActionController::Base
  def init_i18n
    if childe?  #ここはユーザ情報テーブルから判別します。
      locale = Locale.current.to_common
      locale.variants = "CHILD"
      Locale.current = locale
    end
  end
  after_init_locale :init_i18n

[Ruby] POSIX Localeタグ余談

上記の例で思ったのですが、POSIXタグの[lang]_[REGION]_[VARIANT].[charset]@[Modifier]という形式は今時、貧弱な感じがありますね。

少なくともScriptはサポートして、[lang]_[Script]_[REGION].[charset]@[Modifier]にしたいかなぁ。というのはひらがな、カタカナはScriptで表現できるんですよね。上記のサンプルではja_Hira_JPのように。

でも、Linuxの/usr/share/localeとかみると、ScriptもModifierとして表現されちゃってます(例:uz@Latn, uz@cyrillic)。

これに準拠しようとしたら、やっぱり、ja@Hiraなんですよね。大阪弁ならja@Osakaかな。

あ、話はずれるけど、地域別にメッセージが方言になってもおもしろいかもしれませんね。

[Ruby] Locale.set_app_language_tags

先日のグローバルなロケールの設定ですが、Locale.set_app_language_tagsという名前で実装してみました。

locale_railsではI18n.supported_localesです(以前から実装してあったんですよね・・・まともに動いてなかったけど(苦笑))。


April 28, 2009 [長年日記]

[Rails] RFC: Enterprise-ready internationalization (i18n) for Rails

なんつーかなぁ。これにつられて、Rails-i18nの中の人がこんなものを実装してみたらしい。APIが重要と思ってるのか?そこから委譲しているI18nがいけてないというのに。ホントにセンスないな。自分で実装する前に、まずはruby-gettextを使ってアプリを組んでみるとか、そっち方向にはいかないところがある意味すごい。ってか、指摘事項の大半はgettextがなくても実装できる内容なんだけどな。

一応、本人には文句を言っておいたけど、これがオフィシャルになったらRailsからは手を引くかも。