多言語対応:ソースコード修正に関するメモ

移動先: 案内, 検索

 いくつかの代表的なコードを挙げていきましょう.

ブラウザの種別を判別する 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);
}

このように使うようです.

 さらにMoodle1.9.1+ (2008/07/02)より,クライアントPCのOS種別を確認する以下の関数が導入された (lib/moodlelib.php, function check_browser_operating_system()).

/**
 * Checks to see if is the browser operating system matches the specified 
 * brand.
 * 
 * Known brand: 'Windows','Linux','Macintosh','SGI','SunOS','HP-UX'
 *
 * @uses $_SERVER
 * @param string $brand The operating system identifier being tested 
 * @return bool true if the given brand below to the detected operating system
 */
 function check_browser_operating_system($brand) {
    if (empty($_SERVER['HTTP_USER_AGENT'])) {
        return false;
    }
    if (preg_match("/$brand/i", $_SERVER['HTTP_USER_AGENT'])) {
        return true;
    }
    return false;  
 }

これは2008年7月3日現在のコードであり,その後,改良が加わる可能性もあるので,使用する際には必ず最新のソースコードを確認して下さい.


サーバ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') {

で良いようです.  なお,lib/moodlelib.php中のfunction fullname()で関数化されているので,フルネームの文字列を得る場合にはこの関数を利用することで"姓 名"(間を半角空白1個で区分け)の形式の文字列を受け取ることができる.

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');

と指定するべきである(とのことです).


多言語対応トップに戻る