Skip to content

Latest commit

 

History

History
186 lines (122 loc) · 8.03 KB

README.ja.md

File metadata and controls

186 lines (122 loc) · 8.03 KB

Software License

Intlless plugin for CakePHP

Intlless プラグインは intl 拡張モジュールなしでアプリケーションをそれなりに動作させるための CakePHP 3.x 用のプラグインです。

他の言語で読む: English, 日本語

CakePHP3 のインストール

もしも intl 拡張モジュールをインストールできていない場合、 CakePHP3 自体のインストールができなくて困っているかもしれません。 zip からインストールする方法と、設定を変更して composer からインストールする方法があります。

zip ファイルでのインストール

任意の CakePHP のリリース (cakephp-3-x-y.zip) をダウンロードして解凍してください。 設置後は、tmp とそのサブディレクトリ、および logs ディレクトリの パーミションを適切な値に設定 してください。

composer でのインストール

以下のコマンドを実行して ext-intl が入っていることにしてしまいます。

composer config --global platform.ext-intl 0.0.0

このコマンドを実行した後は、 create-project を実行することができるようになります。

composer create-project --prefer-dist cakephp/app my_app_name

Intlless プラグインのインストール

CakePHP3 をインストールしたら、次に Intlless プラグインをインストールします。

zip ファイルでのインストール

任意の Intlless プラグインのリリース (Source code) をダウンロードしてください。 解凍後、 Intlless という名前での plugins ディレクトリに設置してください。

git でのインストール

git でインストールを行う場合、 plugins ディレクトリ内で以下のコマンドを実行してください。

git clone https://github.com/chinpei215/cakephp-intlless.git Intlless

composer でのインストール

まだ実行していなければ、以下のコマンドを実行してください。

composer config --global platform.ext-intl 0.0.0

実行後、以下のコマンドでインストールを行ってください。

composer require --prefer-dist chinpei215/cakephp-intlless

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\TimeIntlless\Time クラスのエイリアスになります。 Intlless\TimeChronosCake\Chronos\MutableDateTime サブクラスで、コンストラクタの定義のみが異なります。 したがって、親クラスでは定義されていない i18nFormat()timeAgoInWords()nice() 、およびその他のメソッドは呼び出すことができません。

use Cake\I18n\Time;

$time = new Time('-12 hour');

echo $time->isYesterday(); // 動作します

echo $time->timeAgoInWords(); // 致命的エラーになります

これは Time ヘルパーからの呼び出しでも同様です。また、日付時刻の書式の地域化には対応していません。

Cake\I18n\FrozenTimeIntlless\FrozenTime クラスのエイリアスになります。 Intlless\TimeCake\Chronos\Chronos のサブクラスで、コンストラクタの定義のみが異なります。 同様に、親クラスでは定義されていないメソッドは呼び出すことができません。

Cake\I18n\DateCake\I18n\FrozenDate はそれぞれ Cake\Chronos\MutableDateCake\Chronos\Date のエイリアスになります。

CakePHP 3.2 未満のバージョンでは Cake\Chronos\MutableTimeCarbon のエイリアスになります。 Cake\I18n\FrozenTime などのクラスは定義されません。

数値の制限

Cake\I18n\NumberIntlless\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 拡張モジュールを直接使うメソッドは使用することができません。