多言語対応:ソースコード修正に関するメモ
いくつかの代表的なコードを挙げていきましょう.
ブラウザの種別を判別する check_browser_version()
いまアクセスして来ているクライアントPCのブラウザの種別を判別します.ib/moodlelib.php中で宣言されています.
/** * Checks to see if is a browser matches the specified * brand and is equal or better version. * * @uses $_SERVER * @param string $brand The browser identifier being tested * @param int $version The version of the browser * @return bool true if the given version is below that of the detected browser */ function check_browser_version($brand='MSIE', $version=5.5)
$brandは以下の文字列が許されているようです.
case 'Camino': /// Mozilla Firefox browsers case 'Firefox': /// Mozilla Firefox browsers case 'Gecko': /// Gecko based browsers case 'MSIE': /// Internet Explorer case 'Opera': /// Opera case 'Safari': /// Safari
具体的には,
if (check_browser_version('MSIE')) { $filename = urlencode($filename); }
このように使うようです.
サーバOSの判別
$CFG->ostype および $CFG->osによりOSの種類を取得できる.
これらの変数はlib/moodlelib.php内で,以下のコードにより設定される.
/// Calculate and set $CFG->ostype to be used everywhere. Possible values are: /// - WINDOWS: for any Windows flavour. /// - UNIX: for the rest /// Also, $CFG->os can continue being used if more specialization is required if (stristr(PHP_OS, 'win') && !stristr(PHP_OS, 'darwin')) { $CFG->ostype = 'WINDOWS'; } else { $CFG->ostype = 'UNIX'; } $CFG->os = PHP_OS;
$CFG->ostypeはOSがWindowsの場合に'WINDOWS','WINDOWS'以外の場合には'UNIX'を返す.Mac OSの場合(Darwin含む)は'UNIX'となるのでしょう.
この判断の元となっているのがPHPの定数PHP_OS.これは以下の値を返すらしいが,実装によってはこれ以外の値を返す可能性も予想される.
* AIX * Darwin * MacOS * Linux * SunOS * WIN32 * WINNT
OSがWindows系の場合はパス名にドライブレター(C:など)が含まれる,パス記号が'\'であるといった特殊事情があるので,WINDOWSとそれ以外,という判断を行っていると予想される.(OS/2は?)
具体的には,以下のように用いる.
if ($CFG->ostype=='WINDOWS') { }
このコードは,blocks/search/config_global.php中で3箇所,lib/moodlelib.php中で4箇所(+1箇所)で使用されている.しかし,$CFG->ostypeや$CFG->osを用いてOSの種別を判別する際には注意が必要である.$CFG変数をfunction内で用いる際には,必ず global $CFG; を追加しなくてはいけない.変数のスコープの考え方がPHPとC言語とでは異なる.また,'WINDOWS'を'WINDOSW'のようにミスタイプしたり,'Windows'のように大文字小文字を間違えたりすると,PHPはエラーを発するのではなく単に条件式が偽となるだけである.このようなケアレスミスを防ぐには,たとえば以下のような関数をlib/moodlelib.php辺りに追加して貰う案が考えられる(ダメで元々,ということで,MoodleTrackerに提案してみました).関数であるならば名前をミスタイプすればエラーが発生するし,global $CFG;のスコープのことを意識する必要も無い.
function ostype_is_windows() { global $CFG; if ($CFG->ostype != 'WINDOWS') return false; return true; }
姓と名の並び順の判別
Moodle1.8から”姓”と”名”の並びを設定できるようになりました. さらに(いつの間にか)言語パックの設定に従う設定も加わったようです. 姓と名の並びの判別はプロフィール編集画面や評定のファイルへの出力など色々な場面で必要になります. あまり自信ないが,判定するには,
if ($CFG->fullnamedisplay == 'firstname lastname') {
で良いようです.詳しい方,ヘルプ! もしかして関数が用意されていたりしませんか?
mbstring系の関数に関する注意事項
シフトJISコードを表すのにSJIS-WINを用いる
mb_convert_encoding()関数などで文字コード種別としてシフトJISを指定する際には'CP932'ではなく,'SJIS-WIN'を用いる方が良いらしい.PHP: Multibyte String Functions - Manual[1]に,
Additional note: For the CP932 codemap, use SJIS-WIN instead
と記述されているそうです.
文字コードの種別の指定に'auto'を用いるべきではない
例えば,文字列 $str1 をシフトJISコードに変換するとします.この場合,
$str1 = mb_convert_encoding($str1, 'SJIS-WIN');
あるいは,
$str1 = mb_convert_encoding($str1, 'SJIS-WIN', 'auto');
と記述することで,$str1の元の文字コードが何であるかを意識しないでシフトJISに変換できる.しかし,落とし穴がある.$str1に格納されている文字列データの長さが短い(例えば1文字)の場合に文字コード種別の判別に誤る場合があるらしい.もし,$str1がUTF-8であることが分かっているならば正確に,
$str1 = mb_convert_encoding($str1, 'SJIS-WIN', 'UTF-8');
と記述するべきである(だそうです).
この注意は文字コードの変換だけではなく,例えば文字列の長さを調べるmb_strlen()関数においても,
$length = mb_strlen($str1);
とするのではなく,もし$str1がUTF-8であることが明白であるならば,
$length = mb_strlen($str1, 'UTF-8');
と指定するべきである(とのことです).