Moodle2.0とそれ以前とでは言語パックが異なる

Moodle2.0とそれ以前とでは言語パックが異なる

- Tatsuya Shirai の投稿
返信数: 22

 お恥ずかしい話ですが,Moodle2.0とそれ以前とでは言語パックが異なることを知りました…

 手動インストールするためにダウンロードするアドレスも,Moodle1.xはこちらで,Moodle2.0用はこちらです(さすが! 日本語言語パックの翻訳は100%完了していますね > 吉田さん).
 具体的に言語パックの仕組みがどのような理由(メリット)からどのように変わったのか,については,きっと詳しい方が報告して頂けるでしょう.いえ,それでは無責任ですので少しだけ調べました.間違っている箇所や足りない情報を補って下さい.まず,フォルダ名が変わりましたね.以前はUTF-8版とそれ以外を区別するために,moodledata/lang/ja_utf8のようなフォルダ名だったのがシンプルに,moodledata/lang/jaに変わりました.中身は…形式は変わっていないですね.あとはMoodle2.0とそれ以前とでは見出し語が大きく変わったので整理した,ということでしょうか?

 それはさておき,Moodle1.9からMoodle2.0へのサイトのアップグレードを成功させた方々に伺いたいことがあります.
 アップグレードが終わった際に,Moodle1.9で導入していた言語パックは moodledata/lang から moodledata/oldlangフォルダにリネームされます.そして新しい言語パックは(以前と同じ名前の)moodledata/langフォルダに保存されるようです.私の環境ですと,アップグレード完了直後はこのmoodledata/langフォルダが存在しません.当初はネットワークの設定のせいでダウンロードが自動的に行われなかったのかと思っていました.いまアップグレード完了後にサイト管理ブロックの言語パックで”日本語”を選択してインストールを実行したら,きちんとmoodledata/lang/jaというフォルダが作成され,画面上の文字が全て日本語に正常に変わりました.
 つまり疑問は,Moodle1.9当時にインストールされていた言語パックのMoodle2.0版を自動的にインストールする機能は無いのか?ということです.デフォルトの英語+日本語くらいならば良いのですが,他にもいくつもの言語をインストールしていたサイトですと,事前に自分のサイトにインストールされていた言語パックの種類をメモしておいて,アップグレード完了後に改めて同じ言語パックをインストールし直す必要があるのか,です.

 ちなみに,Moodle1.9当時の言語パックのコピーを作成する(単にフォルダ名をリネーム)コードは,moodle/lib/upgrade.phpの125行目あたり,

     if ($oldversion < 2008030602) {
        @unlink($CFG->dataroot.'/cache/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);
    }

ここで行っています.この後にインストールされていた言語パックの種類を調べてMoodle2.0用をダウンロードするコードは私が探した範囲では見当たりませんでした.

 多分,なんとか手を打ってあるとは思うのですが,同時に気になるのは,ja_utf8_local フォルダに保存されていた,各サイトで独自に翻訳語を変更したデータの取り扱いです.moodledata/langフォルダにMoodle2.0用の言語パックがある場合に,moodledata/oldlang/**_utf8_local以下のファイルを参照してくれるコードが,もしかしたらあるのかも知れません.また,それをMoodle2.0用にコピーする機能が,たとえば手動操作で,あるのかも知れません.どちらも未確認です.どうなのでしょう,この辺りの仕組みと気配りは? 



---

 話が右左に蛇行して申し訳ありません.上記のmoodledata/langをmoodledata/oldlangに変更してしまう処理は比較的早い段階で行われます.つまりその後のMigrationの処理では言語パックが存在しない状態である恐れがあります.だとしますと,こちらに報告しましたような,LC_ALLの設定異常による文字列置換の異常動作がWindowsをサーバOSとしているサイトでは確実に発生するということを意味します.私は自分のサイトの通信設定(Proxy)のせいで言語パックが更新されなかったのだと思っていましたが,そうではないならばマルチバイト言語圏のWindowsサーバの管理者をかなり悩ませる問題に発展する恐れがあります.

Tatsuya Shirai への返信

Moodle2.0をインストールしましたが

- Mari Yamauchi の投稿

日本語の言語パックを入れようと思って、まず下記画面に行ったのですが、ここで日本語が選択できません。

(前の記憶では、ここで日本語を入れても、さらに何かをいじる必要があったんですが、この段階で止まるとは...)

インストールボタンをクリックすると、"A required parameter (id) was missing" というエラーメッセージが出ます。

原因が分からないのですが、何をチェックすればよいでしょうか。

Mari Yamauchi への返信

Re: Moodle2.0をインストールしましたが

- Mari Yamauchi の投稿

lang フォルダに英語しか入っていなかったことが判明しまして、Ja.zip を入れて開けました。(記憶が当てにならない事も判明しました)

でも、やはり上のリストで日本語が選択できません。で、こちらを見直すと、moodledata ディレクトリの中の lang フォルダに入れろ、と書いてあります。ここで「あれ?moodledata がない」とに気づきました。

で、こちらを見直すと、最初に moodledata ディレクトリを作れと書いてあります。何からの理由でインストール時に作成できなかった場合は、手動で作れと。なるほど。

ところが、念のため、config.php の中身をのぞいてみると、dataroot が uploaddata になっています。

$CFG -> dataroot  = '/*******/uploaddata' ; 

ということは... moodledata ディレクトリを作成して、さらに、ここの uploaddataをmoodledataに書き換える必要がある、ということでしょうか?

(謎だらけです...)

Mari Yamauchi への返信

Re: Moodle2.0をインストールしましたが

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

> lang フォルダに英語しか入っていなかったことが判明しまして、Ja.zip を入れて開けました。(記憶が当てにならない事も判明しました)

恐らく「lib」「mod」等のプログラムが入っているMoodleホームディレクトリ (フォルダ) 内にある「lang」ディレクトリをご覧になったのだと思います。
その場合、「en」フォルダとREADME.txtのみが入っているままで正常な状態です。

大変お手数ですが、Ja.zipを解凍されたディレクトリ「ja」を削除してください。

> ということは... moodledata ディレクトリを作成して、さらに、ここの uploaddataをmoodledataに書き換える必要がある、ということでしょうか?

いいえ、「uploaddata」ディレクトリの名称を書き換える必要はありません。

「uploaddata」ディレクトリ内に「lang」ディレクトリがあるかと思います。
「lang」ディレクトリがない場合は手動で作成してください。

次に、Ja.zipファイルを解凍したディレクトリ「ja」を「lang」ディレクトリの中に入れてください。
これで正常に「Installed language packs」内に日本語言語パックが表示されるようになるかと思います。

Mitsuhiro Yoshida への返信

Re: Moodle2.0をインストールしましたが

- Mari Yamauchi の投稿

ありがとうございます。

これを読む前に、いろんなことをしてしまいました。そして、なぜか installed langauge packs の中に English(ja) (???)というパックが表示されています。 

とりあえず、config.phpも全部元に戻します。

> 恐らく「lib」「mod」等のプログラムが入っているMoodleホームディレクトリ (フォルダ) 内にある「lang」ディレクトリをご覧になったのだと思います。

その通りです。

> その場合、「en」フォルダとREADME.txtのみが入っているままで正常な状態です。
> 大変お手数ですが、Ja.zipを解凍されたディレクトリ「ja」を削除してください。

はい、了解しました。

>「lang」ディレクトリがない場合は手動で作成してください。

これもやってみたのですが... 。今見たら、解凍したフォルダが知らないうちにrenameされてました。ja_old のように。(何が起こっているのか...) もう一度解凍し直します。

Mari Yamauchi への返信

ja が ja-old に!

- Mari Yamauchi の投稿

とりあえず、config.php は最初のものに戻しました。

Moodle ホームディレクトリ内の lang ディレクトリの中も「en」フォルダとREADME.txtのみが入っている状態にしました。

uploaddataディレクトリ内の lang ディレクトリでja.zipを解凍しました。

が、なぜか 解凍したフォルダが ja-oldに renameされます。そして、installed files の中には、English (ja-old) が表示されます。

何が起こっているのでしょう?

p.s. uploaddata、lang ともにパーミッションは777にしているのですが、それでOKですか?

Mari Yamauchi への返信

Re: ja が ja-old に!

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

> 何が起こっているのでしょう?

まず、「uploaddata」ディレクトリ内の「lang」ディレクトリ内にあるディレクトリおよびファイルを削除してください。
次に http://download.moodle.org/langpack/2.0/ から日本語言語パック (ja.zip) をダウンロードしてください。
最後に「uploaddata」ディレクトリ内の「lang」ディレクトリ内に日本語言語パック (ja.zip) を解凍してください。

> p.s. uploaddata、lang ともにパーミッションは777にしているのですが、それでOKですか?

外部からウェブブラウザでアクセスできない場所に「uploaddata」ディレクトリを配置されています場合はパーミッション777で問題ありません。

Mitsuhiro Yoshida への返信

Re: ja が ja-old に!

- Mari Yamauchi の投稿

ありがとうございます。いったん全て削除してやり直してみます。

> 外部からウェブブラウザでアクセスできない場所に「uploaddata」ディレクトリを配置されています場合はパーミッション777で問題ありません。

アクセスできる場所にあるのですが、755で大丈夫でしょうか。

(あるいは、uploaddataディレクトリを移動すべきでしょうか。その場合は、config.phpを変えないとダメですよね...)

Mari Yamauchi への返信

Re: ja が ja-old に!

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

> (あるいは、uploaddataディレクトリを移動すべきでしょうか。

ウェブブラウザからアクセスできない場所への移動をお勧めします。

> その場合は、config.phpを変えないとダメですよね...)

はい、そうです。
config.phpファイル内の「$CFG->dataroot」の設定値を変更してください。

Mitsuhiro Yoshida への返信

Re: ja が ja-old に!

- Mari Yamauchi の投稿

お世話になっております。config.phpの書き換えの件、ありがとうございました。

先ほど別件を片付けて、下記に再トライしました。

> まず、「uploaddata」ディレクトリ内の「lang」ディレクトリ内にあるディレクトリおよびファイルを削除してください。
> 次に http://download.moodle.org/langpack/2.0/ から日本語言語パック (ja.zip) をダウンロードしてください。
> 最後に「uploaddata」ディレクトリ内の「lang」ディレクトリ内に日本語言語パック (ja.zip) を解凍してください。

今のuploaddata>langディレクトリの中身です。

 

ところが、Moodleのlanguage packs の設定ページを見ると、まだどこか、おかしいようです。installed files が English (ja) と表示されています。

ちなみに、ためしにこの状態で右側の「日本語(ja)」を選択しインストールボタンを押してみたところ、以下のエラーメッセージが出ました。

(いちおうこの状態で、フォーラムで日本語の書き込みを試してみましたが、Error writing to database と言われました。やはり。)

最後にもう一度「日本語(ja)」のインストールボタンをクリックしてみようとしたら、左欄のファイルが今度は English (ja_old) になっていました。

 

uploaddata>langディレクトリ内のjaファイルもja-oldにrenameされていました。

むむむ... です。

Mari Yamauchi への返信

とりあえず

- Mari Yamauchi の投稿

いったん全部アンインストールしてみます。

Mari Yamauchi への返信

Re: とりあえず

- Mari Yamauchi の投稿

同じでした。

ja.zip を uploaddata > lang の中に解凍してから、Moodle 上で日本語(ja)を選んだのですが、error メッセージは出なかったものの、結果は同じで、installed の方に表示されたのは、English (ja_old) でした。

Mari Yamauchi への返信

ありがとうございました

- Mari Yamauchi の投稿

しばらく、このレンタルサーバで fantastico (インストーラ)を利用した Moodle はこのままにしておいて、何が問題なのかゆっくり見ていくことにします。

Key to School に頼ることにしました。どのくらい使えるか、ついでにチェックします。

ありがとうございました!

 
Mari Yamauchi への返信

Re: ありがとうございました

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

テーマ (theme) 等が入っているMoodleのホームディレクトリにデータディレクトリ ($CFG->dataroot) が置かれているため、恐らく、lib/componentlib.class.phpの318行目あたりの下記プログラムによって、正常な日本語言語パックのディレクトリ (ja) が新しいMoodleのプログラムには含まれていないはずと判断されて、「ja_old」に書き換えられているのだと思います。

    /// Move current revision to a safe place
        $destinationdir = $CFG->dataroot.'/'.$this->destpath;
        $destinationcomponent = $destinationdir.'/'.$this->componentname;
        @remove_dir($destinationcomponent.'_old');     //Deleting possible old components before
        @rename ($destinationcomponent, $destinationcomponent.'_old');  //Moving to a safe place
    /// Unzip new version
        if (!unzip_file($zipfile, $destinationdir, false)) {
        /// Error so, go back to the older
            @remove_dir($destinationcomponent);
            @rename ($destinationcomponent.'_old', $destinationcomponent);
            $this->errorstring='cannotunzipfile';
            return COMPONENT_ERROR;
        }
    /// Delete old component version
        @remove_dir($destinationcomponent.'_old');

CpanelのFantasticoが自動インストールするMoodleには何らかの問題があると思われます。可能でしたら、Moodleデータベースの作成、データディレクトリ ($CFG->dataroot) の作成も含めて、すべてを手動で実施して頂ければと思います。笑顔



Mitsuhiro Yoshida への返信

Re: ありがとうございました

- Mari Yamauchi の投稿

> テーマ (theme) 等が入っているMoodleのホームディレクトリにデータディレクトリ ($CFG->dataroot) が置かれているため、恐らく、lib/componentlib.class.phpの318行目あたりの下記プログラムによって、正常な日本語言語パックのディレクトリ (ja) が新しいMoodleのプログラムには含まれていないはずと判断されて、「ja_old」に書き換えられているのだと思います。

ありました!(念のため、コピーしておきます。なるほど、こういうプログラムも含まれているのですね)

   /// Move current revision to a safe place
        $destinationdir = $CFG->dataroot.'/'.$this->destpath;
        $destinationcomponent = $destinationdir.'/'.$this->componentname;
        @remove_dir($destinationcomponent.'_old');     //Deleting possible old components before
        @rename ($destinationcomponent, $destinationcomponent.'_old');  //Moving to a safe place
    /// Unzip new version
        if (!unzip_file($zipfile, $destinationdir, false)) {
        /// Error so, go back to the older
            @remove_dir($destinationcomponent);
            @rename ($destinationcomponent.'_old', $destinationcomponent);
            $this->errorstring='cannotunzipfile';
            return COMPONENT_ERROR;
        }
    /// Delete old component version
        @remove_dir($destinationcomponent.'_old');

>CpanelのFantasticoが自動インストールするMoodleには何らかの問題があると思われます。

そのようですね。

すべて手動で実施するのはかなりハードルが高いですが、とりあえず授業用に動かすサイトは確保できたので、すこしがんばってみます!

Mari Yamauchi への返信

PHPの設定など

- Mari Yamauchi の投稿

別の問題ですみません。Notifications で以下の警告が出ています。

PHPの設定は、どこで変えるのでしょうか?

データベースの警告は、固有名詞が初耳ですが、推奨ですけど、とりあえず放置しておいても大丈夫でしょうか。

ちなみに今は、これに、以下の警告が加わっていますが、これは、ここに書いてある通りの現象なので、OKです。

Your site configuration might not be secure. Please make sure that your dataroot directory (/.../uploaddata) is not directly accessible via web.

Mari Yamauchi への返信

Re: PHPの設定など

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

> PHPの設定は、どこで変えるのでしょうか?


「サイト管理 > サーバ > PHP情報」で表示されるページ内に「Loaded Configuration File 」という項目があるかと思います。
可能であれば、ここで表示されるphp.iniファイル内の設定値を下記のように変更してください。

[ 変更前 ]
display_errors on

[ 変更後 ]
display_errors off

php.iniを編集できない場合、Moodleのプログラム等が入っているホームディレクトリにある .htaccessファイルに下記の設定値を追加してください。

php_flag display_errors off

> データベースの警告は、固有名詞が初耳ですが、推奨ですけど、とりあえず放置しておいても大丈夫でしょうか。

Moodle 2.0.2の動作を確認されるためだけでしたら、放置されても大丈夫です。

Moodle 2.xシリーズはMySQLストレージエンジンのInnoDBで快適に動作するよう開発されていますため、理想的には現在のMyISAMを使わずにInnoDBをお使いください。

評点平均: お役立ち度: ★★★★★★★ (1)
Tatsuya Shirai への返信

Moodle1.9 -> Moodle2 : 言語パックのアップグレード

- Tatsuya Shirai の投稿

 以前に言語パックのアップグレードのコードが無いと書きましたが,先日調べたらコードがありました.追加されたのかな? ちなみにMoodle2.1ではなくMoodle2.0です.

 lib/upgradelib.phpの function upgrade_language_pack()です.引数に言語の短縮名を与えればその言語を,引数を与えなければ(あるいはfalseを与えれば)current_language()をアップグレードしてくれます.upgradelib.phpの中では,function upgrade_core()にて,

        // Upgrade current language pack if we can
        if (empty($CFG->skiplangupgrade)) {
            if (get_string_manager()->translation_exists(current_language())) {
                upgrade_language_pack(false);
            }
        }

と,とりあえずいま選択されているサイトのデフォルト言語(で良いのかな?)をアップグレードしてくれる…はずです.が,うちの環境ではアップグレードしてくれませんでした.

 さて,では他のインストール済みの言語パックはどこでアップグレードしてくれるのか? それはいまのところまだ発見できていません.



Tatsuya Shirai への返信

Re: Moodle1.9 -> Moodle2 : 言語パックのアップグレード

- Tatsuya Shirai の投稿

 current_language()は'ja'でした.
 問題はget_string_manager()->translation_exists(current_language()) が false のため,upgrade_language_pack()が実行されません.

 translation_exists()を見る限りでは,moodledata/lang/ja/langconfig.phpの有無を確認してtrue/falseを返します.ということは,このupgrade_language_pack()は既にja_utf8(Moodle1系統)からja(Moodle2系統)にアップグレード済みの時のみ効果を発揮するのだろうか?

 current_language()しか言語パックをアップグレードしない訳ですので,これはアップグレード時のサービスだとして,Moodle2系統内でのアップグレードにしか意味が無いのかも知れません.

Tatsuya Shirai への返信

Re: Moodle1.9 -> Moodle2 : 言語パックのアップグレード

- Tatsuya Shirai の投稿

元々の投稿に転記したコードですが,正しくは lib/db/upgrade.phpにあります.

乱暴ですが,いま,

    if ($oldversion < 2008030602) {
        @unlink($CFG->dataroot.'/cache/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";
                upgrade_language_pack(false);
            } 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);
    }

このように赤文字で示した一行を強引に追加して見ました.つまりmoodledata/langにある古いMoodle1系統用の言語パックをmoodledata/oldlangに移動してしまった後,言語パックはフォルダごとありません.これですと current_lang()が'ja'であってもmoodle/lang/enが参照されます.そこでmoodledata/langが移動されて無くなった直後に,新しいMoodle2用の言語パック(私の環境ではja)をダウンロードしてインストールしてしまう.

 これで以後のマイグレーションの処理におけるメッセージがカレント言語(日本語化)されます.インストール成功直後の膨大な"New settings"も日本語で説明が出るようになるのではないだろうか.いい加減な改良ですが,もし成功したらTrackerに報告することで問題提起をします.

 ちなみに上記コード内の$oldlangという変数は,その後,全く使用されていません.TODOにあるようにコードが追加されるのでしょう.特に,

// TODO: fetch previously installed languages ("*_utf8") found in $oldlang from moodle.org

こちらは急いで欲しいですね.というか,これが未実装なのがそもそもの原因では…


Tatsuya Shirai への返信

Re: Moodle1.9 -> Moodle2 : 言語パックのアップグレード

- Tatsuya Shirai の投稿

一晩明けて確認したところマイグレーションが終了しており,ログインしたところきちんと日本語パッケージがインストール済みでした.

"Nes settings"も"新しい設定"としてすべて日本語で表示されます.

upgrade_language_pack(false);

の挿入個所はあの位置で良いのか,微妙なところではありますが,とりあえず問題の一つは解決されます.今回はMoodle2.0系統でしたが,Moodle2.1系統ではTODO部のコードが追加されている,ということはあるのでしょうか?

欧米圏の方は気にならないのかも知れませんが,この問題は先送りしないで欲しいですねぇ.特にWindows上でMoodleサーバを動かしている環境ではマイグレーションの処理中に致命的問題が発生する恐れがあるだけに.