Moodle1.9からMoodle2へのアップグレード時の言語パック(特にローカル)のインポート

Moodle1.9からMoodle2へのアップグレード時の言語パック(特にローカル)のインポート

- Tatsuya Shirai の投稿
返信数: 2

http://moodle.org/mod/forum/discuss.php?d=166973

上記ディスカッションでも触れましたが,Moodle1.9からMoodle2へアップグレードする際に,私の環境では言語パックが一切読み込まれません.マイグレーションが行われ,それから新しい環境に切り替わる際に,新しく追加された膨大な数の設定の確認を求められるのですが,これが英語で表示されます.これが問題の一つ目.

あと,コースによってはいくつかの言語パックをインストールした状態にあったと思われます.それを正しくインポートし直さないとユーザは困るでしょう.

それと気に掛かるのはMoodle1.9で作成したローカルな言語パックの修正です.これはmoodledata/lang/ja_utf8_localなどの名前でフォルダが作成されてこの下に格納されているはずです.

2012/04/09現在のMoodle2.2.2+のlib/db/upgrade.phpでは,以下のようにTODOとしてコメントが残っているままです.

    if ($oldversion < 2008030602) {
        @unlink($CFG->cachedir.'/languages');

        if (file_exists("$CFG->dataroot/lang")) {
            // rename old lang directory so that the new and old langs do not mix
            if (rename("$CFG->dataroot/lang", "$CFG->dataroot/oldlang")) {
                $oldlang = "$CFG->dataroot/oldlang";
            } else {
                $oldlang = "$CFG->dataroot/lang";
            }
        } else {
            $oldlang = '';
        }
        // TODO: fetch previously installed languages ("*_utf8") found in $oldlang from moodle.org
        upgrade_set_timeout(60*20); // this may take a while


        // TODO: add some info file to $oldlang describing what to do with "$oldlang/*_utf8_local" dirs


        // Main savepoint reached
        upgrade_main_savepoint(true, 2008030602);
    }

とりあえずMoodle1.9からMoodle2へアップグレードを行うと,moodledata/langフォルダはmoodledata/oldlangフォルダにりネームされます.

Moodle1.9からMoodle2へコースをアップグレードした方に質問です.少なくともcurrent_language()(=ja)の言語パックだけでもインストールの処理中にインポート成功したでしょうか? また,実はきちんとlang/ja_utf8_localもきちんとMoodle2へアップグレードする処理がどこそこにある,という情報でも結構です.

 

Tatsuya Shirai への返信

Re: Moodle1.9からMoodle2へのアップグレード時の言語パック(特にローカル)のインポート

- Tatsuya Shirai の投稿

以下は技術的な情報のメモです.

moodle/admin/index.phpにて,$version > $CFG->version,つまりシステムの(マイナーなものも含む)アップグレードが必要だと判断された場合は,アップグレードの確認,プラグインのチェックなどの後に,upgrace_core($version, true)が実行されます.

function upgrade_core()はlib/upgradelib.php内にあります.これはMoodle1.9からのアップグレードだけではなく,一般的なマイナーなアップグレードも含みますので今回の問題とは直接の関係はありません.このMoodleのコア部分のアップグレードを担う関数の冒頭で,upgrade_language_pack()が呼ばれます.つまりこの関数はMoodle2用の言語パックのアップグレード用の関数です.

function upgrade_language_pack($lang = null)はupgrade_core()と同様にlib/upgradelib.php内にあります.この関数はまず,admin/tool/langimport/lib.phpの存在を確認します(読み込む訳ではない).このlib.phpは非常にシンプルな一つの関数のみが記述されています.function tool_langimport_preupgrade_update().preupgrade! 一瞬,関わりがあるのかと思ったのですが,"Called during upgrade, we need up-to-date lang pack, because it may be used during upgrade...”とアッサリした説明.

function tool_langimport_preupgrade_update()関数の中は,まずlib/componentlib.class.phpを読み込みます.この中に,class lang_installerがあるからです.
まず,mkdir($CFG->tmpdir.'/'), mkdir($CFG->dataroot.'/lang/')を作成します.これは作業用と新規インストール時用の作業のようです.それからclass lang_installerのnewしておもむろにrun()します.まだこのclass の中の詳細な解析は行っていませんが,実際の言語パックの読み込みは,class component_installerのfunction install()を使っているようです.

class component_installerは言語パックに限定されたクラスではなく,割となんでもかんでもzip書庫でmoodle.orgからダウンロードして,destinationdirとして指定されたフォルダをまずバックアップ(_bakを追加してフォルダをりネーム)して,代わりにunzipし,うまくいったらバックアップしたフォルダとzipファイルを削除するというもの.ここで行き止まりです.

さて,function upgrade_language_pack()に戻ります.

    if (!get_string_manager()->translation_exists($lang)) {
        return;
    }

この条件を満たすならば,$langで指定された言語パックをmoodle.orgからダウンロード&解凍してインストールしてくれます.実際の処理は先に述べたadmin/tool/langimport/lib.php中のfunction tool_langimport_preupgrade_update()が行います.そしてprint_upgrade_separator().ん?画面に線を表示? つまりこのfunction upgrade_language_pack()は通常の言語パックのインストール/削除の手順とは別に,Moodleのアップグレードの際の前処理として言語パックを更新する処理のためのものですね.上のif文の条件式, !get_string_manager()->translation_exists($lang)はmoodledata/lang/ja/langconfig.phpの有無を確認しています.つまり新しく言語パックを追加することには使わない関数です.

以前に,このupgrade_language_pack()を適当なところに追加すると,辛うじて言語パックは読み込まれたと報告しましたが,このコードを見る限りはいまはその手も使えないようです(これから実験してみます).

以上,すみません,オチはありません.

Tatsuya Shirai への返信

Re: Moodle1.9からMoodle2へのアップグレード時の言語パック(特にローカル)のインポート

- Tatsuya Shirai の投稿

とりあえず,カレント言語パッケージだけはMoodle1.9からMoodle2へアップグレード時に読みこむようにする改良は,こちらのDebug041にまとめました.Moodle2.0, 2.1, 2.2で共通です.まぁ,一生に一回だけの手続きなので気にしないという選択肢もあります.近日中に公開予定のfs_moodle5.00.00版のMoodle2.0/2.1/2.1には最初から適用しておきます.

http://www.suzuka-ct.ac.jp/mech/moodle/mod/wiki/view.php?id=320&page=view/lib%2Fdb%2Fupgrade.php&thankyou=1