あちこちに、日本語対策のスレッドが点在してしまいましたので、専用のスレッドを立てました。
http://www.supertak.com/down/sample.htm
に現在まで対応している日本語対策をまとめてあります。
- GD2の日本語表示への対応。
- メールの文字コードをiso-2202-jpに統一。
- 日付表示の日本語表示への対応。
- EXCELワークシートの日本語表示への対応。
- LESSON/QUIZのファイル取り込み時日本語変換の対応。
が、現在の主な対応内容となっています。
あちこちに、日本語対策のスレッドが点在してしまいましたので、専用のスレッドを立てました。
http://www.supertak.com/down/sample.htm
に現在まで対応している日本語対策をまとめてあります。
が、現在の主な対応内容となっています。
過去の記事を見ていたら、
小テストで全角半角を無視したいという話を見つけました。
http://moodle.org/mod/forum/discuss.php?d=7791
ということで、添付のようなパッチを作ってみました。
1.5devが対象です。
記述式の質問で、
「解答の精度」(この訳、おかしくない?)
を「重要ではありません」(この訳もおかしいな)
にすると、大文字小文字を無視するだけでなく、
全角半角も無視するようになります。
数字方式の質問では、
無条件に全角半角変換をしています。
report.phpの部分はきちんとテストしていません。
langlib ver 1.2.0 公開です。
http://www.supertak.com/down/sample.htm
に現在まで対応している日本語対策をまとめてあります。
が、現在の主な対応内容となっています。半角・全角無視のON/OFFの設定は、langlib内のスイッチで設定できます。
現在、多忙なため詳しい動作確認をしていません。mbモジュールを使用しない半角・全角変換には改善の余地がありそうです。バグ報告大歓迎です。
http://www.supertak.com/down/sample.htm
を見てみたのですが、current_language関数の内容をいろいろな個所で次のようにインライン展開しているのはなぜですか?
global $CFG, $USER, $SESSION;
if (!empty($CFG->courselang)) {
$currlang = $CFG->courselang;
} else if (!empty($SESSION->lang)) {
$currlang = $SESSION->lang;
} else if (!empty($USER->lang)) {
$currlang = $USER->lang;
} else {
$currlang = $CFG->lang;
}
> current_language関数の内容を
> いろいろな個所で次のようにインライン展開しているのはなぜですか?
ご指摘感謝です。これに対する回答は非常に単純明快です。理由はまだ私がPHPのfunctionを理解していないからです^^;ようするに、私の技術不足なのです。
この位置からは、current_language()だけで呼び出せるのか?とか、それとも、includeしないといけないのかとか?、とか、そんなことで悩むレベルです。なにしろ、PHPの勉強はまだ三日目です。
今現在の私のスキルでは、理解していないものを入れておくと、エラーが起きたときに何がエラーを起しているのか分からなくなってしまうのです^^;ひとつひとつトライアンドエラーで勉強しつつ、記載してるので、current_language()を呼び出さずに、毎回展開してます。おそらく、私の勉強が進むにしたがって、面倒な記述はなくなっていくはずです><)
そんなものを、公開するなとか言わず、長い目で見てやってください。
幸いな事に、perlやCに似ているので元のソースがあれば、それが一体何を行っているのか?とか、目的の処理の場所探しなどはできます。こんな機会がないと勉強もしなかったと思うので、自分にとってはよい動機付けになってます。他の方々にとっては、じれったいだけかもしれませんが^^;;;
私もMoodleのソースを見始めて数日なのであまり自信はないのですが、Moodleでは、必ず
config.php
を読み込む流儀にしているようです。
config.phpでは最後に(178行目)、
lib/setup.php
を読み込みます。lib/setup.phpでは、データベースへの接続を行った後で、71行目から標準ライブラリとして、
lib/weblib.php // HTML生成用関数
lib/datalib.php // データベースアクセス用関数
lib/moodlelib.php // その他の汎用関数
の3つをロードします。
ということで、この3つのファイル中の関数は標準ライブラリとしてどこでも使用可能になっていると思われます。
current_languageはlib/moodlelib.phpの中にあるので、流儀に従ってconfig.phpを読み込んでいれば、どこでも使用可能だと思います。
間違っていたらごめんなさい。
1.2.1を実際に動かしてみたわけではないので、間違っているかもしれませんが、webを見たところ、ちょっと気になる点があります。
いろいろな場所で
if (use_lang_lib()) {
で判断していますが、use_lang_lib関数はja/lib/langlib.phpの中で定義されているので、ja/lib/langlib.phpがロードされない場合には未定義ですよね。ja/lib/langlib.phpは言語がjaの時だけロードされるので、言語ja以外の時には上記のif文は関数未定義のエラーになりませんか?言語がja以外のテストはやりましたか?
次のいずれかが必要ではないでしょうか?
(方法1) 何らかの方法でuse_lang_libを言語に関わらずロードされるようにする。
(方法2) if (function_exists('use_lang_lib') && use_lang_lib()) {のようにする。
青柳さんこんにちわ。さらなるご指摘感謝です。
実は、私もはじめは、function_exists('use_lang_lib')を入れてました。しかし、テストをしてみると、どういうわけか、以下のような結果になったので外しました。
1.langlib.phpがja以下に設置されており、詳細設定のlang設定がjaになっていれば、閲覧者が別の言語に切り替えても、エラーもワーニングもに出ず正常に動く。
2.if (use_lang_lib()) { を書き加えている人は、同時に、必ずlanglib.phpを置いているはずである。※これを前提に作ってますので。
ということから、if (use_lang_lib()) のみにしました。が次のことをするとエラーになります。
if (use_lang_lib()) { を書き加えているのに、lang設定配下にlanglibを設置していない場合です。しかし、このパターンは想定しても仕方がないので、無視しています。
ただ、これは自分でも想定外であり、同時に「新たな不具合」を意味していました。つまり、デフォルトの言語をjaにしていると、閲覧者が他の言語にしても、パッチが動いてしまっているという事です。事実、enにしても、excelはしっかり、sjisで吐き出されます。
原因を想像するに、setup.phpでのlanglib.phpの取り込みを、デフォルトの設定を見に行った直後においているので、常にデフォルトになってしまうのだろうと考えました。
何も考えずに、最後に置けば良いのですが、それでは、自分のスキルアップがないので、ずっとプログラムの処理を追って、ひとつひとつ何をしている処理なのか考えながら、どの位置にlanglib.phpの取り込みを持ってくるのが、正解か?と考えているうちに、眠気に負けて挫折です。
EXCELワークシート出力の日本語対応に加えて、TEXT出力の日本語対応を行いました。また、日本語ファイル名にも対応しました。
TEXTの出力は、出力先の環境に合わせ変化するようにしました。Windowsへ出力する際には、文字コード:sjis、改行コード\r\n。Macintoshへ出力する際には、文字コード:sjis、改行コード\r。その他は、文字コード変換せず(EUCのまま)に、改行は\nです。
※当方にMAC環境がないため確認していません^^;
langlib.phpも大幅に改定し大半の機能をこのファイルに取り込みました。オリジンに入れる変更はできる限り少なくしてあります。
http://www.supertak.com/down/sample.htm
ver. 1.3.1