multilang.inc.php

Last-modified: Mon, 06 Nov 2017 18:12:04 JST (2353d)
Top > multilang.inc.php

multilang.inc.php

サマリメッセージの国際化プラグイン
リビジョン0.8
対応バージョン1.4.5plus-i18n
投稿者upk
投稿日2005-06-19 (Sun) 23:24:08

概要

このプラグインは自動的にブラウザから言語情報を得て、適切な言語のコンテンツのみを表示しようとします。

このページは英語と日本語をサポートしています。

関連

  • phpLang.inc.php 日本語ページと英語ページを完全に分けたい場合
  • _.inc.php 国際化の有名な実装方法 gettext
  • _set.inc.php gettext のための settext

設定

現状、multilang で指定できる言語は、lib/lang.php の $prepared_language で設定されている言語のみです。

$language_prepared = array('ja_JP', 'zh_TW', 'zh_CN',  'en_US', 'ko_KR');

例えば、あなたの wiki サイトでは日本語と英語しか使わないと決めている場合、以下のようにするかもしれません。

$language_prepared = array('ja_JP', 'en_US');

これにより、例えば韓国語設定のブラウザがアクセスした場合、今までは韓国語コンテンツがないために何も表示されなかったのが、pukiwiki.ini.php における DEFAULT_LANG(en_USとします)のコンテンツが表示されるようになります。

しかし、これにより韓国語設定のブラウザがアクセスした場合、今までは表示されていた韓国語メニューが表示されず、英語メニューが表示されることになります。

現状、言語の追加は難しいです。 システム言語として用意されているものだけ追加可能です。

使い方

機能1:フィルタ

次のように書きます

#multilang(en_US){{
This is English
}}
#multilang(ja_JP){{
これは日本語です
}}
&multilang(en_US){English!};&multilang(ja_JP){日本語!};

このプラグインは自動的にブラウザから言語情報を得て、その言語のコンテンツのみを表示しようとします。

ja と ja_JP, en と en_US, ko と ko_KR は等価と考えて使用することができます。

多言語利用例

#multilang(ja){{
*PukiWiki Plus! 日本語対応ページにようこそ! [#y302b3eb]
このソフトは、コンテンツネゴシエーションに対応しています。
ブラウザから得られる言語情報から自動でコンテンツを表示しています。
}}
#multilang(ko){{
*PukiWiki Plus! 한국 대응 페이지에 어서 오십시오! [#u209d6fc]
이 소프트는, 컨텐츠 네고시에이션에 대응하고 있습니다.
브라우저로부터 얻을 수 있는 언어 정보로부터 자동으로 컨텐츠를 표시하고
있습니다.
}}
#multilang(en){{
*PukiWiki Plus! Welcome to the page for English. [#x4ddf184]
This software corresponds to the contents negotiation.
Contents are displayed from language information obtained
from a browser by the automatic operation. 
}}
#multilang(zh_TW){{
*PukiWiki Plus! 中文對應頁歡迎! [#z1cc77ea]
這個軟件,與內容negotiation對應著。從從瀏覽器能得的語言信息用自動表示著內容。
}}
#multilang(zh_CN){{
*PukiWiki Plus! 中文对应页欢迎! [#yc464217]
这个软件,与内容negotiation对应着。从从浏览器能得的语言信息用自动表示着内容。
}}

Tips

もし Navigation ページでこのプラグインを使用したい場合は、たとえ自分の Pukiwiki サイト内のページへのリンクだとしても、

[http://外部リンク &multilang(en){English};&multilang(ja){日本語};]

のように記述してください。Pukiwiki では現在

[[&multilang(en){English};&multilang(ja){日本語};>PukiWikiName]]

のようなリンクスタイルでインラインプラグインを使用できません。

機能2:切り替え

&multilang(link,en=English,ja=日本語);

言語設定を切り替えるためのリンクを表示します。 一度クリックするとその設定はそのセッション中(通常ブラウザを終了するまで)保持されます。

= の左側が言語設定で、右側がラベルになります。

デフォルトで、IMAGE_DIR/icon/flags/ 中の国旗画像が表示されます(IMAGE_DIR は pukiwiki.ini.php で定義されています)。この際、ラベルは img タグの title, alt アトリビュートに使用されます。

使用される画像ファイルは言語設定から推測されます (ja_JP -> jp.png, ja -> ja_JP -> jp.png)。

&multilang(link,en,ja);

ラベルは省略できますが、HTML 的に、記入しておくことをお勧めします。


&multilang(link,en=English+text,ja=日本語+text); // text

もし国旗画像を使用したくない場合は、上のように text オプションを指定します。


&multilang(link=delim,en=English+text,ja=日本語+text); // delim

[ English | 日本語 ]

オプション delim は [、|、] などの区切り文字 (delimiter) を表示します。 区切り文字はこのプラグインファイル中で設定することができます。むしろ、

[ &multilang(link,en=English+text); | &multilang(link,ja=日本語+text); ]

[ English | 日本語 ]

のように書いてしまえば区切り文字を簡単に変えられます。 delim オプションはいらなかったかもしれない・・・。


 &multilang(link,en=English+flag,ja=日本語+text); // clear to use flag

flag オプションで国旗画像を使用することを明示できます。デフォルトの動作です。


&multilang(link,en=English+flag=jp,ja=日本語+flag=us); // specify flag file

国旗画像を指定できます。URL は 'IMAGE_URL/icon/flags/us.png' のようになります。


これを MenuBar もしくは SideBar (Pukiwiki Plus の拡張です) に書くとよいでしょう。

コメント

素朴な疑問
もしも、ブラウザにここで定義されていない言語が指定されていた場合はどうなるのか?下手すれば空白になりかねないような・・・。 -- Logue 2005-08-06 (土) 21:55:24
  • 準備されている言語以外の場合は、DEFAULT_LANG が有効になります。メッセージに、DEFAULT_LANG となるメッセージの記述が無い場合には、そりゃ空白です。-- upk 2005-08-06 (土) 22:09:25
  • action スタイルで言語を選べるように改良してみました。一度選ぶとクッキーに保存してそのセッション中はその言語設定を保持します。またその action へのリンクを作る機能と、インラインでも multilang できるように改良しました。ご確認ください。ところで、multilang は lang ぐらいにならないですかね。かなりの回数書くことになるので multi 五文字も馬鹿にならない。ja_JP もしかり。multilang ここで試せます。説明もこちらに。後でここのページを大胆に編集して説明もってこようと思っていますがいいですか? -- sonots 2006-02-01 (Wed) 22:15:32
  • プラグインの名前については、開発談義での議論をご覧下さい。当初案には、lang もありましたが、現在の名前になっています。 -- upk 2006-02-02 (木) 22:59:57
  • プラグイン的には、ja の設定だけでも問題ないはずです。内部構造的には、ja_JP となっていますが、これも、色々な環境でテストした結果、ja だけではエラーになってしまう環境もあり、ja_JP であれば、プラットフォームの違いが吸収でき、どの環境でも問題なく動く設定を採用しています。-- upk 2006-02-02 (木) 23:01:26
  • テストしてみましたが、一部不完全ですね。でも、とりあえず、svn へはコミットしておきました。ついでに国旗も出るようにしてみました。コミットしたものを利用して、再度、チューニングしていただけたらと思います。-- upk 2006-02-03 (金) 01:39:21
    • 不完全と言っている部分は、カレントページは表示できるのですが、例えば、ナビゲーションなどの関連ページへの適用ができないという点です。現状の構造では無理ではと思っています。何か良いアイディアがあれば、ぜひ、と思いまして。-- upk 2006-02-03 (金) 01:41:05
  • このプラグインでは、同一ページ内に複数言語というポリシーですが、開発談義でも書きましたように、phpLang(本家自作プラグイン)のような、別ページで管理するようなプラグインもあってよいという認識でいます。こちらも、何か良い策がありましたら、って期待したり。 -- upk 2006-02-03 (金) 02:00:15
  • 自分も phpLang は phpLang でいいと思ってます。別々でいいんじゃないでしょうか?自分は別ページにわけたくなかったので、こっちを改造することにしました。ナビゲーションなど関連ページの問題というのはちょっとわからないです。リンクの表記文字とかですか?
    [[&multilang(en_US){English);&multilang(ja_JP){日本語};>Page]]
    こういうのができない。SideBar に
    &multilang(en_US){English);&multilang(ja_JP){日本語};
    のように普通に書く分には問題なかったです。-- sonots 2006-02-02 (Thu) 09:44:59
    • SideBarとNavigationで利用した場合とかです。convert_html を先に処理してしまうと、有効にできないわけです。-- upk 2006-02-03 (金) 08:50:23
    • 当方の環境では上に書いたとおり SideBarで動いています。MenuBar を同時に表示させても動きます。そういうことではなくですか?ただ Navigation はそもそもリンクしかサポートしていないように見えるので、上に書いたリンク表記の問題のせいで利用できません。そのリンクの表記スタイルもありだと思うんですけどね。 -- sonots 2006-02-02 (Thu) 17:56:39
    • 書き方が悪かったですね。_setプラグインと_プラグインを利用した Navigation ページなど、カレントページではないページがある場合には、不具合が出るということです。-- upk 2006-02-03 (金) 14:10:57
    • multilang こういう状況ではなくですか?しかし、Navigation でも SideBar でも理に叶った表示に見えます。どういう状況のことなのかよくわからないのですが、例示はしてもらえませんか?どういう状況かわからないと注意書きができません。-- sonots 2006-02-02 (Thu) 22:00:39
    • おぉ、不具合ではなく、不整合が出るが正しい表現でした。その状況の通りです。なので、指摘の通り _プラグインで cookie があれば利用するように改修すれば、終わりですかね。-- upk 2006-02-04 (土) 20:18:58
    • あぁそういう意味でしたか。了解しました。 -- sonots 2006-02-04 (Sat) 13:45:39
  • あ、そうだ convert のほうで、return preg_replace(array("'<p>'si","'</p>'si"), array("",""), convert_html($lines) ); という行があったのですが、なぜ <p> を消しているのですか?自分の環境では
    <p>This plugin automatically try to retrieve browser's language settings, and show only suitable contents.</p>
    <p>If the setting does not match with any, this will use the value of DEFAULT_LANG (which is located in pukiwiki.ini.php).</p>
    <p>If you like to use ja insted of ja_JP or en insted of en_US, you should modify $language_prepared in lib/lang.php.
    Otherwise, auto language detector does not make effects.</p>
    
    のように元々なっていたところが
    This plugin automatically try to retrieve browser's language settings, and show only suitable contents.
    If the setting does not match with any, this will use the value of DEFAULT_LANG (which is located in pukiwiki.ini.php).
    If you like to use ja insted of ja_JP or en insted of en_US, you should modify $language_prepared in lib/lang.php.
    Otherwise, auto language detector does not make effects.
    
    のように <p> タグがなくなってしまっていたのですが。改行周りの処理 $lines = preg_replace(array("[\\r|\\n]","[\\r]"), array("\n","\n"), $lines); はそれがないと <br /> ができてしまっていたのでわかります。当方 1.4.5-u1-i18n です。-- sonots 2006-02-02 (Thu) 09:54:03
    • 1行の処理を考慮していたので、複数行だと確かにまずいですね。逆に1行だけを convert_html し、inline にしたい場合には、駄目なんですよ。-- upk 2006-02-03 (金) 08:50:23
    • インライン形式は plugin_multilang_inline のほうで別にサポートしています。インライン形式の場合 {} 内は元々 PukiWiki ルール展開されて渡ってきますので、convert_html もいらないはずです。それともブロック型の#multilang(en_US){English} とかですか?ブロック型でこのように引数わたせましたっけ?確認したところわたってませんでした。 -- sonots 2006-02-02 (Thu) 17:56:39
      • _setプラグインや_プラグインなどの内容の確定を簡単に行う方法として、convert_html を行ってしまうという逃げです。動的に値が決定されるようなページを実現していますので、確定させる行為が convert_html 時なので、そうなっています。なので、現在の仕組みでは、回避不能だという認識です。この逃げは、あくまでも、今後、この手のプラグインなどが登場した際の対応です。スマートなやり方ではないんですよねぇ。-- upk> 2006-02-03 (金) 14:20:06
    • こちらでもやはり、そのだめな場合を例示してはもらえませんか?マニュアルに注意書きしておきたいですので。 -- sonots 2006-02-02 (Thu) 10:20:39
      • ブロック型の場合、convert_htmlを実行しないとまずいことが言いたかったんです。inline でまずい、という意味ではありません*1。-- upk 2006-02-04 (土) 20:36:42
      • 確か、過去の版だと、inlineでも複数行の指定ができたと記憶していたんですけどね。なので、そんな策になっていたのだと記憶しているんですけどね。今の版だと、inline の場合、指定できないので問題ありませんね。-- upk 2006-02-04 (土) 20:40:25
  • 国旗画像は、自分的には phpLang でも使っている http://cvs.sourceforge.net/viewcvs.py/fink/web/flags/ のほうが黒縁があってすきなのですがどうでしょうか。アイコンサイズである必要もないですし。ただ http://svn.cafelounge.net/repos/pukiwiki-plus/branches/1.4.5-u1-utf8/image/icon/flags のほうが量は多いですね。黒縁がほしい。 -- sonots 2006-02-02 (Thu) 11:22:54
  • 国旗画像の表示ということにあわせてもう少しいろいろ選べるように link オプションを修正しました multilang.inc.php.6beta.tgz。説明はまた multilang こちらに。上の return preg_replace(array("'<p>'si","'</p>'si"), array("",""), convert_html($lines) ); の部分はやっぱりコメントアウトしてあります。動作が違うのですかね。 -- sonots 2006-02-02 (Thu) 12:36:38
  • ところで、multilang に言語選択機能ができたので、_.inc.php でもそこで設定された COOKIE の値を利用したほうが、管理者が確認できていいような気がします。その場合言語選択機能をこのまま multilang がもっていていいのかは微妙です。 -- sonots 2006-02-02 (Thu) 20:40:17
    • もしかして、ブラウザの言語設定機能で実現するのは良いけど、設定が正しいか確認するのが面倒なので、cookie で実現した機能もあると便利。みたいな感じなのでしょうか? 私も、テスト時は面倒だったのは確かですけどね。-- upk 2006-02-04 (土) 16:08:30
    • そうですね。あと、日本人なら両方読める可能性があるので、ユーザが好きなほうを簡単に選べる自由度を与えたほうがいいかなと。設定ミスでデフォが英語になっている方もいるかもしれませんし、ブラウザの設定をそのページのために変えたくないですよね。 -- sonots 2006-02-04 (Sat) 13:45:39
    • おっとそれよりも、英語と日本語のコンテンツが用意してあるところに例えば韓国人がアクセスすると真っ白になるので、切り替えられるようになっていないとうれしくないですよね。その韓国人は英語を好むか日本語を好むかわからないし、やっぱり楽な自由度がないと。こっちのほうが大きいですね。 -- sonots 2006-02-04 (Sat) 14:11:39
    • 初回来訪(cookie無し)時は、DEFAULT_LANGが有効になるはずなので、画面が真っ白は無いですよね。言語の優先順位も判定していますから、ko=0.7,en=0.3などの指定があれば、第2言語である英語がひっかかるはずです。-- upk 2006-02-05 (日) 15:55:38
    • 今更な返信ですが、初回来訪時は、ブラウザの言語設定を利用するという機能で、DEFAULT_LANG にはならないはずです。その機能がウリなんですよね。自分の環境は DEFAULT_LANG = en_US ですが、日本語環境からアクセスすれば初回日本語になり、#multilang(en) のコンテンツしかなければ無論真っ白になります。そのページに en があるのか ja があるのかなんて調べてませんしね。-- sonots 2006-05-25 (木) 06:56:24
      • 私が書いている真っ白な文書は、システム的な意味での選択言語が無いという意図であって、ユーザが意図して書いた文書ではありません。そういう文書が存在するなら、当たり前の挙動なので、システム的には気にしていません。誤解のないように。-- upk 2006-05-25 (木) 10:31:03
  • 微調整して、β6をコミットしておきました。CRLFだとdiffがとれないので厳しいです。 -- upk 2006-02-04 (土) 18:25:38
    • あ、そうか。CRLF になっちゃってましたね。自分でちゃんと diff とって確認しておけばよかった。 -- sonots 2006-02-04 (Sat) 13:45:39
  • このページを、更新しちゃって構わないので、よろしくお願いします。> sonots さん -- upk 2006-02-05 (日) 01:49:44
    • 編集しました。 -- sonots 2006-02-04 (Sat) 14:22:16
  • 言語自動判別のところをきちんと読んでいないので、ja ではなく ja_JP、en ではなく en_US と書かなければおかしなことになる場合もありそうと思って注意書きまで書いていたのですが、SideBar にでているリンクは ja, en ですね。本文中(自分がフィルタと名づけた機能)でも ja, en で大丈夫なのでしょうか?注意書きなしで大丈夫ですか? -- sonots 2006-02-04 (Sat) 14:23:16
    • あぁ SideBar のは追加された $language = get_language(1); ですか。本文中でもユーザは ja = ja_JP 等価と考えていいのかなぁ。ちょっとテストした限りではまともに動いているように見えますけどね。 -- sonots 2006-02-05 (日) 09:33:05
      • 等価にするための処理*2が入っています。en も en_US で看做していますが、これは、ちょっとひどい看做しだと認識しています。が、まぁ、看做しですから。-- upk 2006-02-05 (日) 16:08:57
      • 了解しました。ja, en だけでもよいと例の注意書き変更します。 -- sonots 2006-02-04 (Sat) 22:25:22
    • 表示言語の設定にひっぱられてコメントの時間が変わる 理に叶っているといえば叶っているのかな? -- sonots 2006-02-05 (日) 09:34:34
      • 更新して曜日なんかは、その言語になってしまうんですよね。現在の now での置換そのものに問題があるという認識です。now で置換した結果が、文字列だからおかしくなるのであって、UTIME にして、再描画すれば問題ないんですよねぇ。でも、書き手が勝手に日時の変更なんぞできなくなって改竄できなくなるわけですがね。-- upk 2006-02-05 (日) 16:08:57
    • 言語 'none' で全て表示は却下されちゃったんですね。まぁなければないでいい機能ですし、それ1つあるだけで実装がめんどくさくなりますしね。しょうがないか。説明消さないと。-- sonots 2006-02-05 (日) 09:34:34
    • おかしなことになると気にされている部分は、localeの変更でエラーが出るだけ。つまり、変更されない状況になる。ということです。それも、一部 OS*3 に限って出る症状です。なので、ja が指定された場合*4は、見做しの国名を補完し、ja_JP を完成させ、locale変更を行うようになっています。例えば、localeの世界だと、英国で日本語を喋るという指定可能なわけなので、ja_JP なんですよね。これを長い言ってしまうと、日本語は日本でしか喋れないわけでして*5。-- upk 2006-02-05 (日) 16:01:11
  • 設定変更時、タイミングによって変更されないのは、Location ヘッダーを飛ばせば、reload しますので、それで逃げようと考えています。-- upk 2006-02-05 (日) 15:55:38
  • ここの Trackerは、I18N対応されたテンプレートではないため、このような修正を行うと、#tracker_list(Plugin) で表示できなくなります。これを回避するためには、雛形を I18N化する必要があります。私のサイトでは、前々から対応しています。Pluginのページがおかしくなっているでしょ。>sonotsさん -- upk 2006-02-05 (日) 16:12:18
    • Tracker 考えてませんでした。申し訳ない。どうやって修正するんでしたっけこれ。こういうことがあったりで Tracker すきじゃなくてあまり使ってないんですよね・・・。 -- sonots 2006-02-04 (Sat) 22:25:22
    • :config/plugin/tracker/Plugin/pageのページをI18N対応させて、そのページから生成されたように、Plugin/ 配下の全てのページを遡及する必要があります。一覧表示できるように戻しておきました。いずれにしても、雛形から生成された全てのページに対しての遡及が必要なので、簡単にはいきません。-- upk 2006-02-06 (月) 01:43:31
      • 概要までが雛形*6となり、そこまでが一致していないと一覧にうまく表示されません。まぁ、テストをしていると色々と分かります。今回のような multilang のような形態では、I18N化できません。そこで、_プラグインを活用することになってきます。残念ですが、現状の tracker は、常に一意なページにできないと雛形として利用できません。-- upk 2006-02-06 (月) 01:51:54
  • lib/lang.php の $language_prepared を pukiwiki.ini.php に移動しませんか?例えば、日本語と英語コンテンツのみを用意していて、韓国語ブラウザからのアクセスがあった場合、DEFAULT_LANG を表示するためには、$language_prepared = array('ja_JP', 'en_US'); のように 'ko_KR' を削除する必要がありますし($language_prepared にマッチしない場合 DEFAULT_LANG)、別言語を用意するときにも編集の必要があるので、pukiwiki.ini.php にあったほうがうれしい気がします。DEFAULT_LANG は pukiwiki.ini.php にありますし。ところで個人的にはデフォルト値は $language_prepared = array('ja_JP', 'en_US'); がいいと思うのですが、デフォルト値 = このサイトの設定なので無理なのでしょうね。皆さんに初期設定を強いることになりそうです(使用するにしても英語、日本語が多数派と思われるため)-- sonots 2006-07-01 (Sat) 13:57:03
    • この辺の記述追加しました。 -- sonots 2006-07-01 (土) 15:08:14
    • ところで、なぜ、このサイトは、デフォルト値のままにして稼動しているのか?の理由はお分かりですか?-- upk 2006-07-03 (月) 00:55:56
    • 皆さんに初期設定を強いることになりそう と言われている皆さんとは、このサイトのデフォルトと、Plus!を利用している方のデフォルトとは異なるであろうから、皆さんに初期設定を強いると指摘されているのでしょうか?もし、そういう指摘であるなら、$language_prepared の設定とは思えないので、具体的には、どの部分を言われていますか?-- upk 2006-07-02 (日) 15:19:58
    • $language_prepared = array('ja_JP', 'en_US'); のように 'ko_KR' を削除 とは、設置者側のニーズであって、たとえ、メニューやボタンだけとは言え、閲覧者が希望している言語で表示しているわけですが、この挙動を指摘の通り変更した場合の、閲覧者への対応と考えた場合には、より望ましい対応は、どのような方法になりますか? -- upk 2006-07-02 (日) 15:19:58
    • 別言語を用意するときにも編集 とは、$language_prepared だけ編集すれば、言語を追加することができるとお思いですか? もし、そう認識されているのなら、このような指摘になるのでしょうかね。gettext で利用できるように環境設定するためには、ディレクトリの準備など付随作業も必要となり、それを誰でも容易に行えるとは考えていません。誰でもできるようにするということは、削除だけを考えればよいわけではありませんので、システム的な視点から見えていれば、お分かりいただけると思いますが。-- upk 2006-07-02 (日) 15:19:58
  • たしかに multilang のことしか考えていませんでした。となると、multilang 用 $language_prepared が欲しい所ですね。そうすればコンテンツを英語、日本語しか用意しない時に、韓国アクセスがあった場合に、メニューはハングル、内容は英語、と表示できるようになると思います。現状だと真っ白ですよね*7。-- sonots 2006-07-02 (Sun) 14:49:50
    • そうですね。本体に依存しない、コンテンツ用があると便利かもしれませんね。この場合、コンテンツ内で定義される言語を事前に判定などして、特定する方法がより動的な処理にできるとは思いますが、重たくなってしまいそうなので、どのような仕様が適当なのか?も考えないといけないような気がしています。-- upk 2006-07-03 (月) 08:45:46
    • 1つのアイデアですが、ページの先頭に、TITLE: のように LANG:ja,en のようなものを書くというのはどうでしょうか(この場合デフォルトが ja)?ただ TITLE をどのように実装しているのか私は知らないので・・・ -- sonots 2006-07-02 (Sun) 17:23:40