Intlless プラグインは intl 拡張モジュールなしでアプリケーションをそれなりに動作させるための CakePHP 3.x 用のプラグインです。
他の言語で読む: English, 日本語
もしも intl 拡張モジュールをインストールできていない場合、 CakePHP3 自体のインストールができなくて困っているかもしれません。 zip からインストールする方法と、設定を変更して composer からインストールする方法があります。
任意の CakePHP のリリース (cakephp-3-x-y.zip) をダウンロードして解凍してください。 設置後は、tmp とそのサブディレクトリ、および logs ディレクトリの パーミションを適切な値に設定 してください。
以下のコマンドを実行して ext-intl が入っていることにしてしまいます。
composer config --global platform.ext-intl 0.0.0
このコマンドを実行した後は、 create-project を実行することができるようになります。
composer create-project --prefer-dist cakephp/app my_app_name
CakePHP3 をインストールしたら、次に Intlless プラグインをインストールします。
任意の Intlless プラグインのリリース (Source code) をダウンロードしてください。 解凍後、 Intlless という名前での plugins ディレクトリに設置してください。
git でインストールを行う場合、 plugins ディレクトリ内で以下のコマンドを実行してください。
git clone https://github.com/chinpei215/cakephp-intlless.git Intlless
まだ実行していなければ、以下のコマンドを実行してください。
composer config --global platform.ext-intl 0.0.0
実行後、以下のコマンドでインストールを行ってください。
composer require --prefer-dist chinpei215/cakephp-intlless
プラグインの設置が終わったら、 config/bootstrap.php で読み込みますが、なるべくファイルの前の方で読み込むことが望ましいです。
なぜなら、まだ Cake\I18n
名前空間のクラスが最初に呼び出されるよりも前に、これらを置き換えなければならないからです。通常は config/app.php を読み込んだ直後が最適です。
try {
Configure::config('default', new PhpConfig());
Configure::load('app', 'default', false);
} catch (\Exception $e) {
exit($e->getMessage() . "\n");
}
//Configure::load('app_local', 'default');
// この辺りで呼び出すのが最適です
Plugin::load('Intlless', ['bootstrap' => true, 'autoload' => true]);
上記の例で bootstrap
オプションと autoload
オプションにそれぞれ真を渡していることに注意してください。
Intlless プラグインでは Cake\I18n
名前空間のクラスを置き換えるための初期処理を実行する必要があり、
また、プラグインを zip からインストールした場合、CakePHP 自体のプラグイン自動読込機能に頼る必要があります。
もしも、プラグインを composer からインストールした場合であっても bootstrap
オプションには必ず真を渡してください。
さらに、いくつかの個所を手動で書き換える必要があります。 まず、 config/bootstrap.php の中で intl 拡張モジュールの有無をチェックしてエラーを投げている場所を探してコメントアウトしてください。
if (!extension_loaded('intl')) {
// この命令をコメントアウトしてください
// trigger_error('You must enable the intl extension to use CakePHP.', E_USER_ERROR);
}
もしも、 config/bootstrap.php の中に useLocaleParser()
の呼び出しが含まれていたら、それもコメントアウトしてください。
Intlless プラグインはこの機能をサポートしません。
// これらの命令もコメントアウトしてください
// Type::build('date')->useLocaleParser();
// Type::build('datetime')->useLocaleParser();
// このように書かれている場合は、useLocaleParser() の呼び出しだけをコメントアウトしてください。
Type::build('time')
->useImmutable()
/*->useLocaleParser()*/;
これで インストールは完了です。 intl 拡張モジュールなしでもアプリケーションがそれなりに動作するはずです。
__()
をはじめとするメッセージ関数は、複雑な書式を解釈することができません。
echo __('{0}%', 100); // 100% を表示します
echo __('{0,number,#,###}', 100); // {0,number,#,###} を表示します
また、メッセージの地域化には対応していません。
Cake\I18n\Time
は Intlless\Time
クラスのエイリアスになります。
Intlless\Time
は Chronos の Cake\Chronos\MutableDateTime
サブクラスで、コンストラクタの定義のみが異なります。
したがって、親クラスでは定義されていない i18nFormat()
、 timeAgoInWords()
、 nice()
、およびその他のメソッドは呼び出すことができません。
use Cake\I18n\Time;
$time = new Time('-12 hour');
echo $time->isYesterday(); // 動作します
echo $time->timeAgoInWords(); // 致命的エラーになります
これは Time
ヘルパーからの呼び出しでも同様です。また、日付時刻の書式の地域化には対応していません。
Cake\I18n\FrozenTime
は Intlless\FrozenTime
クラスのエイリアスになります。
Intlless\Time
は Cake\Chronos\Chronos
のサブクラスで、コンストラクタの定義のみが異なります。
同様に、親クラスでは定義されていないメソッドは呼び出すことができません。
Cake\I18n\Date
と Cake\I18n\FrozenDate
はそれぞれ Cake\Chronos\MutableDate
と Cake\Chronos\Date
のエイリアスになります。
CakePHP 3.2 未満のバージョンでは Cake\Chronos\MutableTime
は Carbon のエイリアスになります。
Cake\I18n\FrozenTime
などのクラスは定義されません。
Cake\I18n\Number
は Intlless\Number
クラスのエイリアスになります。
Intlless\Number
は以下のメソッドのみを提供する小さなクラスです。
precision()
toReadableSize()
toPercentage()
format()
formatDelta()
(0.2.0 で追加)
上記以外のメソッドを利用することはできません。
use Cake\I18n\Number;
echo Number::precision(1.2345, 3); // 1.234 を出力します
echo Number::currency(1000); // 致命的エラーになります
これは Number
ヘルパーからの呼び出しでも同様です。また、数値の書式の地域化には対応していません。
- その他の
Cake\I18n
名前空間のクラスは使用することができません。 Cake\ORM\Behavior\TranslateBehavior
クラスは使用することができません。Cake\Utility\Text::transliterate()
など、 intl 拡張モジュールを直接使うメソッドは使用することができません。