Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Chris Harris
2015-09-10 03:49:50 -07:00
11 changed files with 250 additions and 178 deletions

View File

@@ -91,7 +91,7 @@ $container->set('Foo', function () {
$foo = $container->get('Foo'); $foo = $container->get('Foo');
``` ```
新しいオブジェクトを構築するための複雑なロジックを隠蔽するために、PHP コーラブルを返すスタティックなクラスメソッドを使うことが出来ます。 新しいオブジェクトを構築するための複雑なロジックを隠蔽するために、スタティックなクラスメソッドをコーラブルとして使うことが出来ます。
例えば、 例えば、
```php ```php
@@ -99,20 +99,17 @@ class FooBuilder
{ {
public static function build() public static function build()
{ {
return function () { $foo = new Foo(new Bar);
$foo = new Foo(new Bar); // ... その他の初期化 ...
// ... その他の初期化 ... return $foo;
return $foo;
};
} }
} }
$container->set('Foo', FooBuilder::build()); $container->set('Foo', ['app\helper\FooBuilder', 'build']);
$foo = $container->get('Foo'); $foo = $container->get('Foo');
``` ```
ご覧のように、PHP コーラブルが `FooBuilder::build()` メソッドによって返されています。
このようにすれば、`Foo` クラスを構成しようとする人は、`Foo` がどのように構築されるかを気にする必要はもうなくなります。 このようにすれば、`Foo` クラスを構成しようとする人は、`Foo` がどのように構築されるかを気にする必要はもうなくなります。

View File

@@ -34,7 +34,9 @@ class UserController extends Controller
$profile->scenario = 'update'; $profile->scenario = 'update';
if ($user->load(Yii::$app->request->post()) && $profile->load(Yii::$app->request->post())) { if ($user->load(Yii::$app->request->post()) && $profile->load(Yii::$app->request->post())) {
if ($user->validate() && $profile->validate()) { $isValid = $user->validate();
$isValid = $profile->validate() && $isValid;
if ($isValid) {
$user->save(false); $user->save(false);
$profile->save(false); $profile->save(false);
return $this->redirect(['user/view', 'id' => $id]); return $this->redirect(['user/view', 'id' => $id]);

View File

@@ -89,10 +89,18 @@ Composer がインストールされたら、ウェブからアクセスでき
インストールを検証する <span id="verifying-installation"></span> インストールを検証する <span id="verifying-installation"></span>
---------------------- ----------------------
インストール完了後、下記の URL によって、インストールされた Yii アプリケーションにブラウザを使ってアクセスすることが出来ます インストール完了後、あなたのウェブサーバを構成してください (次の説を参照してください)
あるいは、プロジェクトの `web` ディレクトリで次のコマンドを実行して、
[PHP の内蔵ウェブサーバ](https://secure.php.net/manual/ja/features.commandline.webserver.php) を使ってください。
``` ```
http://localhost/basic/web/index.php php -S localhost:80
```
下記の URL によって、インストールされた Yii アプリケーションにブラウザを使ってアクセスすることが出来ます。
```
http://localhost/
``` ```
この URL は、あなたが Yii を ウェブサーバのドキュメントルートディレクトリ直下の `basic` という名前のディレクトリにインストールしたこと、 この URL は、あなたが Yii を ウェブサーバのドキュメントルートディレクトリ直下の `basic` という名前のディレクトリにインストールしたこと、
@@ -105,7 +113,7 @@ http://localhost/basic/web/index.php
もし表示されなかったら、PHP のインストールが Yii の必要条件を満たしているかどうか、チェックしてください。 もし表示されなかったら、PHP のインストールが Yii の必要条件を満たしているかどうか、チェックしてください。
最低限の必要条件を満たしているかどうかは、次の方法のどちらかによってチェックすることが出来ます。 最低限の必要条件を満たしているかどうかは、次の方法のどちらかによってチェックすることが出来ます。
* ブラウザを使って URL `http://localhost/basic/requirements.php` にアクセスする。 * `requirements.php` を `/web/requirements.php` としてコピーし、ブラウザを使って URL `http://localhost/requirements.php` にアクセスする。
* 次のコマンドを実行する。 * 次のコマンドを実行する。
``` ```

View File

@@ -1,70 +1,77 @@
国際化 国際化
====== ======
> Note|注意: この節はまだ執筆中です。
国際化 (I18N) とは、工学的な変更を伴わずにさまざまな言語と地域に順応できるように、ソフトウェアアプリケーションを設計するプロセスを指します。 国際化 (I18N) とは、工学的な変更を伴わずにさまざまな言語と地域に順応できるように、ソフトウェアアプリケーションを設計するプロセスを指します。
潜在的なユーザが世界中にいるウェブアプリケーションにとっては、このことは特に重要な意味を持ちます。 潜在的なユーザが世界中にいるウェブアプリケーションにとっては、このことは特に重要な意味を持ちます。
Yii は、全ての領域にわたる国際化機能を提供し、メッセージの翻訳、ビューの翻訳、日付と数字の書式設定をサポートします。
Yii は、メッセージの翻訳、数字や日付の書式設定など、ウェブサイトの国際化を手助けするいくつかのツールを提供しています。
ロケールと言語 ## ロケールと言語 <span id="locale-language"></span>
--------------
Yii のアプリケーションでは二つの言語が定義されます。 ロケールとは、ユーザの言語、国、そして、ユーザが彼らのユーザインタフェイスにおいて目にすることを期待するすべての変異形式を定義する一連のパラメータです。
ロケールは、通常、言語 ID と地域 ID から成るロケール ID によって定義されます。
例えば、`en-US` は、英語とアメリカ合衆国のロケールを意味します。
Yii アプリケーションで使用される全てのロケール ID は、一貫性のために、`ll-CC` の形式に正規化されなければなりません。
ここで `ll` は [ISO-639](http://www.loc.gov/standards/iso639-2/) に従った小文字二つまたは三つの言語コードであり、`CC` は [ISO-3166](http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html) に従った二文字の国コードです。
ロケールに関する更なる詳細は [ICU プロジェクトのドキュメント project](http://userguide.icu-project.org/locale#TOC-The-Locale-Concept) に述べられています。
Yii では、"言語" という用語でロケールに言及することがしばしばあります。
Yii のアプリケーションでは二つの言語を使用します。
すなわち、[[yii\base\Application::$sourceLanguage|ソース言語]] と [[yii\base\Application::$language|ターゲット言語]] です。 すなわち、[[yii\base\Application::$sourceLanguage|ソース言語]] と [[yii\base\Application::$language|ターゲット言語]] です。
前者はソースコード中のテキストメッセージが書かれている言語を意味し、後者はコンテントをエンドユーザに表示するのに使用されるべき言語を指します。
いわゆるメッセージ翻訳サービスは、主として、テキストメッセージをソース言語からターゲット言語に翻訳するものです。
ソース言語は、次のように、コードに直接書かれているオリジナルのアプリケーションメッセージの言語です。 アプリケーションの言語は、アプリケーションの構成情報で次のように構成することが出来ます。
```php
echo \Yii::t('app', 'I am a message!');
```
ターゲット言語は、現在のページを表示するのに使用されるべき言語、すなわち、オリジナルのメッセージの翻訳先となるべき言語です。
これはアプリケーションの構成情報において、次のように定義されているものです。
```php ```php
return [ return [
'id' => 'applicationID', // ターゲット言語を日本語に設定
'basePath' => dirname(__DIR__), 'language' => 'ja-JP',
// ...
'language' => 'ru-RU', // <- ここ ! // ソース言語を英語に設定
// ... 'sourceLanguage' => 'en-US',
]
......
];
``` ```
> **Tip**|ヒント: [[yii\base\Application::$sourceLanguage|ソース言語]] のデフォルト値は英語であり、この値は変えないことが推奨されます。 [[yii\base\Application::$sourceLanguage|ソース言語]] のデフォルト値は `en-US` であり、合衆国の英語を意味します。
> 理由は、英語から他の言語への翻訳者を見つける方が、非英語から非英語への翻訳者を見つけるより簡単だからです。 このデフォルト値は変えないことが推奨されます。
なぜなら、通常は、英語から他の言語への翻訳者を見つける方が、非英語から非英語への翻訳者を見つけるより、はるかに簡単だからです。
アプリケーションの言語を実行時に設定して、ユーザが選択した言語をターゲットにすることが可能です。 [[yii\base\Application::$language|ターゲット言語]] は、エンドユーザの言語選択など、さまざまな要因に基づいて、動的に設定しなければならないことがよくあります。
この操作は、全ての出力に対して正しく効果を発揮するように、まだ出力が何も生成されていない時点で行われなければなりません アプリケーションの構成情報で構成するかわりに、次の文を使ってターゲット言語を変更することが出来ます
そのためには、アプリケーションのターゲット言語プロパティを望ましい値に変更するだけです。
```php ```php
// ターゲット言語を中国語に変更
\Yii::$app->language = 'zh-CN'; \Yii::$app->language = 'zh-CN';
``` ```
言語/ロケールの書式は `ll-CC` です。ここで `ll` は [ISO-639](http://www.loc.gov/standards/iso639-2/) に従った二文字または三文字の小文字の言語コードであり、`CC` は [ISO-3166](http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html) に従った国コードです。
> **Note**|注意: ロケールの概念と構文に関する詳細な情報については、[ICU プロジェクトのドキュメント](http://userguide.icu-project.org/locale#TOC-The-Locale-Concept) を参照してください。 ## メッセージ翻訳 <span id="message-translation"></span>
メッセージ翻訳サービスは、テキストメッセージをある言語 (通常は [[yii\base\Application::$sourceLanguage|ソース言語]]) から別の言語 (通常は [[yii\base\Application::$language|ターゲット言語]]) に翻訳するものです。
翻訳は、元のメッセージと翻訳されたメッセージを格納するメッセージソースの中から、翻訳対象となったメッセージを探すことにより行われます。
メッセージが見つかれば、対応する翻訳されたメッセージが返されます。
メッセージが見つからなければ、元のメッセージが翻訳されずに返されます。
メッセージ翻訳 メッセージ翻訳サービスを使用するためには、主として次の作業をする必要があります。
--------------
メッセージ翻訳は、アプリケーションによって出力されたメッセージを別の言語に翻訳して、さまざまな国のユーザが自国語でアプリケーションを使えるようにするために使用されるものです * 翻訳する必要のある全てのテキストメッセージを [[Yii::t()]] メソッドの呼び出しの中に包む
* メッセージ翻訳サービスが翻訳されたメッセージを探すことが出来る一つまたは複数のメッセージソースを構成する。
* 翻訳者にメッセージを翻訳させて、それをメッセージソースに格納する。
Yii におけるメッセージ翻訳機能は、ソース言語からターゲット言語へとメッセージの翻訳を探すという単純な動作をします。 [[Yii::t()]] メソッドは次のように使います。
メッセージ翻訳機能を使うためには、オリジナルのメッセージ文字列を [[Yii::t()]] メソッドで包みます。
このメソッドの最初のパラメータは、メッセージの生成元であるアプリケーションのさまざまな部分を区別するためのカテゴリであり、二番目のパラメータはメッセージそのものです。
```php ```php
echo \Yii::t('app', 'This is a string to translate!'); echo \Yii::t('app', 'This is a string to translate!');
``` ```
Yii は `i18n` [アプリケーションコンポーネント](structure-application-components.md) に定義されているメッセージソースの中から、現在の [[yii\base\Application::$language|アプリケーション言語]] に従って、適切な翻訳を読み込もうと試みます。 ここで、二番目のパラメータが翻訳されるべきテキストメッセージを示し、最初のパラメータはメッセージを分類するのに使用されるカテゴリ名を示します。
メッセージソースは、翻訳メッセージを提供する一群のファイルまたはデータベースです。
次の構成情報の例は、メッセージを PHP ファイルから取得するメッセージソースを定義するものです。 [[Yii::t()]] メソッドは `i18n` [アプリケーションコンポーネント](structure-application-components.md) を呼んで実際の翻訳作業を実行します。
このコンポーネントはアプリケーションの構成情報の中で次のようにして構成することが出来ます。
```php ```php
'components' => [ 'components' => [
@@ -85,61 +92,105 @@ Yii は `i18n` [アプリケーションコンポーネント](structure-applica
], ],
``` ```
上記において `app*` は、このメッセージソースによって扱われるカテゴリを指定するパターンです。 上記のコードにおいては、[[yii\i18n\PhpMessageSource]] によってサポートされるメッセージソースが構成されています。
この例では、`app` から始まる全てのカテゴリこのメッセージソースで処理します。 `app*` は、`app` 始まる全てのメッセージカテゴリこのメッセージソースを使って翻訳されるべきであることを示しています。
メッセージファイルは `@app/messages`、すなわち、アプリケーションディレクトリの下の `messages` ディレクトリに配置されています。 [[yii\i18n\PhpMessageSource]] クラスは、メッセージ翻訳を格納するのに PHP ファイルを使用します。
[[yii\i18n\PhpMessageSource::fileMap|fileMap]] 配列が、どのカテゴリに対してどのファイルが使われるべきかを定義しています デフォルトでは、ファイル名はカテゴリ名と同じでなければなりません
`fileMap` を構成する代りに、カテゴリ名をファイル名として使用する規約に依拠することも出来ます ただし、[[yii\i18n\PhpMessageSource::fileMap|fileMap]] を構成して、別の命名方法によってカテゴリを PHP ファイルに割り付けることも可能です。
(例えば、`app/error` というカテゴリは、[[yii\i18n\PhpMessageSource::basePath|basePath]] の下の `app/error.php` というファイル名に帰結します) 上記の例では、(`ja-JP` がターゲット言語であると仮定すると) `app/error` カテゴリは `@app/messages/ja-JP/error.php` という PHP ファイルに割り付けられます
`fileMap` を構成しなければ、このカテゴリは `@app/messages/ja-JP/app/error.php` に割り付けられることになります。
`\Yii::t('app', 'This is a string to translate!')` というメッセージを翻訳するとき、アプリケーション言語が `ja-JP` である場合は、Yii は利用できるメッセージのリストを取得するために、まず `@app/messages/ja-JP/app.php` というファイルを探します。 翻訳メッセージを格納するのには、PHP ファイル以外に、次のメッセージソースを使うことも可能です。
`ja-JP` ディレクトリにファイルが無い場合は、失敗であるとする前に、`ja` ディレクトリも探します。
メッセージを PHP ファイルに保存する [[yii\i18n\PhpMessageSource|PhpMessageSource]] に加えて、Yii は二つのクラスを提供しています。 - [[yii\i18n\GettextMessageSource]] - 翻訳メッセージを保持するのに GNU Gettext の MO ファイルまたは PO ファイルを使用する
- [[yii\i18n\DbMessageSource]] - 翻訳メッセージを保存するのにデータベーステーブルを使用する
- [[yii\i18n\GettextMessageSource]] - GNU Gettext の MO ファイルまたは PO ファイルを使用
- [[yii\i18n\DbMessageSource]] - データベースを使用
> Note|訳注: 以下においては、メッセージ書式の理解を助けるために、原文にはない日本語への翻訳例 (とその出力結果) をコードサンプルに追加しています。 ## メッセージのフォーマット <span id="message-formatting"></span>
### 名前付きプレースホルダ メッセージを翻訳するときには、プレースホルダを埋め込んで、動的なパラメータ値で実行時に置き換えさせることが出来ます。
更には、パラメータ値をターゲット言語に応じてフォーマットさせるための特別なプレースホルダの構文を使うことも出来ます。
この項では、メッセージをフォーマットする様々な方法を説明します。
翻訳メッセージには、翻訳後に対応する値に置き換えられるパラメータを追加することが出来ます。 > Note|訳注: 以下においては、メッセージフォーマットの理解を助けるために、原文にはない日本語への翻訳例 (とその出力結果) をコードサンプルに追加しています。
このパラメータの形式は、次の例で示すように、パラメータ名を波括弧で囲むものです。
### メッセージパラメータ <span id="message-parameters"></span>
翻訳対象となるメッセージには、一つまたは複数のプレースホルダを埋め込んで、与えられたパラメータ値で置き換えられるようにすることが出来ます。
様々なパラメータ値のセットを与えることによって、翻訳されるメッセージを動的に変化させることが出来ます。
次の例では、`'Hello, {username}!'` というメッセージの中のプレースホルダ `{username}``'Alexander'``'Qiang'` にそれぞれ置き換えられます。
```php ```php
$username = 'Alexander'; $username = 'Alexander';
// username が "Alexander" になった翻訳メッセージを表示
echo \Yii::t('app', 'Hello, {username}!', [ echo \Yii::t('app', 'Hello, {username}!', [
'username' => $username, 'username' => $username,
]); ]);
// 翻訳: '{username} さん、こんにちは!' $username = 'Qiang';
// username が "Qiang" になった翻訳メッセージを表示
echo \Yii::t('app', 'Hello, {username}!', [
'username' => $username,
]);
``` ```
パラメータに値を代入するときには波括弧を使わないことに注意してください プレースホルダを持つメッセージを翻訳する時には、プレースホルダはそのままにしておかなければなりません
これは、プレースホルダは `Yii::t()` を呼んでメッセージを翻訳する時に、実際のパラメータ値に置き換えられるものだからです。
### 序数プレースホルダ
```php ```php
$sum = 42; // 日本語翻訳例: '{username} さん、こんにちは!'
echo \Yii::t('app', 'Balance: {0}', $sum);
// 翻訳: '差引残高: {0}'
``` ```
> **Tip**|ヒント: メッセージ文字列の意味が分らなくならないように、あまりに多くの序数プレースホルダを使うことは避けてください プレースホルダには、*名前付きプレースホルダ* と *序数プレースホルダ* のどちらかを使用する事が出来ます
> 翻訳者にはソース文字列しか無く、従って、各プレースホルダに何が入るのかが一見して明らかでなければならない、ということを忘れないでください ただし、一つのメッセージに両方を使うことは出来ません
### 高度なプレースホルダの書式設定 上記の例は名前付きプレースホルダの使い方を示すものです。
すなわち、各プレースホルダは `{パラメータ名}` という形式で書かれており、パラメータは連想配列で渡されます。
このとき、配列のキーが(波括弧なしの)パラメータ名であり、配列の値が対応するパラメータ値です。
この高度な機能を使うためには、[intl PHP 拡張](http://www.php.net/manual/ja/intro.intl.php) をインストールして有効にする必要があります。 序数プレースホルダは、0 ベースの整数の序数をプレースホルダとして使います。
それをインストールして有効にして初めて、プレースホルダのための拡張構文を使うことが出来るようになります。 このプレースホルダは、`Yii::t()` の呼び出しに出現する順序に従って、パラメータ値によって置き換えられます。
すなわち、デフォルトの書式を使用する短い構文 `{プレースホルダ名, タイプ}`、あるいは、書式のスタイルを指定できる完全な構文 `{プレースホルダ名, タイプ, スタイル}` を使うことが出来るようになります。 次の例では、序数プレースホルダ `{0}``{1}` および `{2}` は、それぞれ、`$price``$count` および `$subtotal` の値によって置き換えられます。
完全なリファレンスは [ICU ウェブサイト](http://icu-project.org/apiref/icu4c/classMessageFormat.html) で入手可能ですが、以下においてはいくつかの例を示します。 ```php
$price = 100;
$count = 2;
$subtotal = 200;
echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', $price, $count, $subtotal);
```
#### 数値 ```php
// 日本語翻訳例: '価格: {0}, 数量: {1}, 小計: {2}'
```
> Tip|ヒント: たいていの場合は名前付きプレースホルダを使うべきです。
> と言うのは、翻訳者にとっては、パラメータ名がある方が、翻訳すべきメッセージ全体をより良く理解できるからです。
### パラメータのフォーマット <span id="parameter-formatting"></span>
メッセージのプレースホルダにフォーマットの規則を追加して指定し、パラメータ値がプレースホルダを置き換える前に適切にフォーマットされるようにすることが出来ます。
次の例では、`price` のパラメータ値の型は数値として扱われ、通貨の形式でフォーマットされます。
```php
$price = 100;
echo \Yii::t('app', 'Price: {0, number, currency}', $price);
```
> Note|注意: パラメータのフォーマットには、[intl PHP 拡張](http://www.php.net/manual/ja/intro.intl.php) のインストールが必要です。
プレースホルダにフォーマット規則を指定するためには、短い構文または完全な構文のどちらかを使うことが出来ます。
```
短い形式: {プレースホルダ名, パラメータの型}
完全な形式: {プレースホルダ名, パラメータの型, パラメータの形式}
```
このようなプレースホルダを指定する方法についての完全な説明は、[ICU ドキュメント](http://icu-project.org/apiref/icu4c/classMessageFormat.html) を参照してください。
以下では、よくある使用方法をいくつか示します。
#### 数値 <span id="number"></span>
```php ```php
$sum = 42; $sum = 42;
@@ -149,7 +200,7 @@ echo \Yii::t('app', 'Balance: {0, number}', $sum);
// 出力: '差引残高: 12,345' // 出力: '差引残高: 12,345'
``` ```
内蔵のスタイル (`integer``currency``percent`) の一つを指定することが出来ます。 オプションで、パラメータの形式として、`integer``currency``percent` を指定することが出来ます。
```php ```php
$sum = 42; $sum = 42;
@@ -159,7 +210,7 @@ echo \Yii::t('app', 'Balance: {0, number, currency}', $sum);
// 出力: '差引残高: &yen; 12,345' // 出力: '差引残高: &yen; 12,345'
``` ```
または、カスタムパターンを指定することも出来ます。 または、数値をフォーマットするカスタムパターンを指定することも出来ます。
```php ```php
$sum = 42; $sum = 42;
@@ -171,7 +222,9 @@ echo \Yii::t('app', 'Balance: {0, number, ,000,000000}', $sum);
[書式のリファレンス](http://icu-project.org/apiref/icu4c/classicu_1_1DecimalFormat.html). [書式のリファレンス](http://icu-project.org/apiref/icu4c/classicu_1_1DecimalFormat.html).
#### 日付 #### 日付 <span id="date"></span>
パラメータ値は日付としてフォーマットされます。例えば、
```php ```php
echo \Yii::t('app', 'Today is {0, date}', time()); echo \Yii::t('app', 'Today is {0, date}', time());
@@ -180,7 +233,7 @@ echo \Yii::t('app', 'Today is {0, date}', time());
// 出力: '今日は 2015/01/07 です。' // 出力: '今日は 2015/01/07 です。'
``` ```
内蔵の書式は`short``medium``long`、そして `full` す。 オプションで、パラメータの形式として`short``medium``long`、そして `full` を指定することが出来ます。
```php ```php
echo \Yii::t('app', 'Today is {0, date, short}', time()); echo \Yii::t('app', 'Today is {0, date, short}', time());
@@ -189,7 +242,7 @@ echo \Yii::t('app', 'Today is {0, date, short}', time());
// 出力: '今日は 2015/01/07 です。' // 出力: '今日は 2015/01/07 です。'
``` ```
カスタムパターンを指定することも出来ます。 日付の値をフォーマットするカスタムパターンを指定することも出来ます。
```php ```php
echo \Yii::t('app', 'Today is {0, date, yyyy-MM-dd}', time()); echo \Yii::t('app', 'Today is {0, date, yyyy-MM-dd}', time());
@@ -200,7 +253,9 @@ echo \Yii::t('app', 'Today is {0, date, yyyy-MM-dd}', time());
[書式のリファレンス](http://icu-project.org/apiref/icu4c/classicu_1_1SimpleDateFormat.html). [書式のリファレンス](http://icu-project.org/apiref/icu4c/classicu_1_1SimpleDateFormat.html).
#### 時刻 #### 時刻 <span id="time"></span>
パラメータ値は時刻としてフォーマットされます。例えば、
```php ```php
echo \Yii::t('app', 'It is {0, time}', time()); echo \Yii::t('app', 'It is {0, time}', time());
@@ -209,7 +264,7 @@ echo \Yii::t('app', 'It is {0, time}', time());
// 出力: '現在 22:37:47 です。' // 出力: '現在 22:37:47 です。'
``` ```
内蔵の書式は`short``medium``long`、そして `full` す。 オプションで、パラメータの形式として`short``medium``long`、そして `full` を指定することが出来ます。
```php ```php
echo \Yii::t('app', 'It is {0, time, short}', time()); echo \Yii::t('app', 'It is {0, time, short}', time());
@@ -218,7 +273,7 @@ echo \Yii::t('app', 'It is {0, time, short}', time());
// 出力: '現在 22:37 です。' // 出力: '現在 22:37 です。'
``` ```
カスタムパターンを指定することも出来ます。 時刻の値をフォーマットするカスタムパターンを指定することも出来ます。
```php ```php
echo \Yii::t('app', 'It is {0, date, HH:mm}', time()); echo \Yii::t('app', 'It is {0, date, HH:mm}', time());
@@ -230,43 +285,48 @@ echo \Yii::t('app', 'It is {0, date, HH:mm}', time());
[書式のリファレンス](http://icu-project.org/apiref/icu4c/classicu_1_1SimpleDateFormat.html). [書式のリファレンス](http://icu-project.org/apiref/icu4c/classicu_1_1SimpleDateFormat.html).
#### 綴り #### 綴り <span id="spellout"></span>
パラメータ値は数値として取り扱われ、綴りとしてフォーマットされます。例えば、
```php ```php
echo \Yii::t('app', '{n, number} is spelled as {n, spellout}', ['n' => 12345]); // 出力例 : "42 is spelled as forty two"
echo \Yii::t('app', '{n, number} is spelled as {n, spellout}', ['n' => 42]);
// 翻訳: '{n, number} は、文字で綴ると {n, spellout} です。' // 翻訳: '{n, number} は、文字で綴ると {n, spellout} です。'
// 出力: '12,345 は、文字で綴ると 一万二千三百四十 です。' // 出力: '12,345 は、文字で綴ると 四十 です。'
``` ```
#### 序数 #### 序数 <span id="ordinal"></span>
パラメータ値は数値として取り扱われ、順序を表す文字列としてフォーマットされます。例えば、
```php ```php
// 出力例 : "You are the 42nd visitor here!"
echo \Yii::t('app', 'You are the {n, ordinal} visitor here!', ['n' => 42]); echo \Yii::t('app', 'You are the {n, ordinal} visitor here!', ['n' => 42]);
``` ```
これは、"You are the 42nd visitor here!" というメッセージになります。
> Note|訳注: 上記のソースメッセージを、プレースホルダの書式指定を守って日本語に翻訳すると、'あなたはこのサイトの {n, ordinal} の訪問者です' となります。 > Note|訳注: 上記のソースメッセージを、プレースホルダの書式指定を守って日本語に翻訳すると、'あなたはこのサイトの {n, ordinal} の訪問者です' となります。
> しかし、その出力結果は、'あなたはこのサイトの 第42 の訪問者です' となり、意味は通じますが、日本語としては若干不自然なものになります。 > しかし、その出力結果は、'あなたはこのサイトの 第42 の訪問者です' となり、意味は通じますが、日本語としては若干不自然なものになります。
> >
> プレースホルダの書式指定自体も、翻訳の対象として、より適切なものに変更することが可能で > プレースホルダの書式指定自体も、翻訳の対象として、より適切なものに変更することが可能であることに注意してください
> >
> この場合も、'あなたはこのサイトの{n, plural, =1{最初} other{#番目}}の訪問者です' のように翻訳することが出来ます > この場合も、'あなたはこのサイトの{n, plural, =1{最初} other{#番目}}の訪問者です' のように翻訳するほうが適切でしょう
#### 継続時間 #### 継続時間 <span id="duration"></span>
パラメータ値は秒数として取り扱われ、継続時間を表す文字列としてフォーマットされます。例えば、
```php ```php
// 出力例 : "You are here for 47 sec. already!"
echo \Yii::t('app', 'You are here for {n, duration} already!', ['n' => 47]); echo \Yii::t('app', 'You are here for {n, duration} already!', ['n' => 47]);
``` ```
これは、"You are here for 47 sec. already!" というメッセージになります。
> Note|訳注: このソースメッセージを 'あなたはこのサイトに既に {n, duration} の間滞在しています' と翻訳した場合の出力結果は、'あなたはこのサイトに既に 47 の間滞在しています' となります。 > Note|訳注: このソースメッセージを 'あなたはこのサイトに既に {n, duration} の間滞在しています' と翻訳した場合の出力結果は、'あなたはこのサイトに既に 47 の間滞在しています' となります。
> ICU ライブラリのバグでしょうか。これも、プレースホルダの書式設定も含めて全体を翻訳し直す方が良いようです。 > ICU ライブラリのバグでしょうか。これも、プレースホルダの書式設定も含めて全体を翻訳し直す方が良いようです。
#### 複数形 #### 複数形 <span id="plural"></span>
言語によって、複数形の語形変化はさまざまに異なります。 言語によって、複数形の語形変化はさまざまに異なります。
Yii は、さまざまな形式の複数形語形変化に対応したメッセージ翻訳のための便利な方法を提供しています。 Yii は、さまざまな形式の複数形語形変化に対応したメッセージ翻訳のための便利な方法を提供しています。
@@ -274,32 +334,28 @@ Yii は、さまざまな形式の複数形語形変化に対応したメッセ
語形変化の規則を直接に処理する代りに、特定の状況における語形変化した言葉の翻訳を提供するだけで十分です。 語形変化の規則を直接に処理する代りに、特定の状況における語形変化した言葉の翻訳を提供するだけで十分です。
```php ```php
// $n = 0 の場合の出力例 : "There are no cats!"
// $n = 1 の場合の出力例 : "There is one cat!"
// $n = 42 の場合の出力例 : "There are 42 cats!"
echo \Yii::t('app', 'There {n, plural, =0{are no cats} =1{is one cat} other{are # cats}}!', ['n' => $n]); echo \Yii::t('app', 'There {n, plural, =0{are no cats} =1{is one cat} other{are # cats}}!', ['n' => $n]);
``` ```
結果は以下のようになります。
- `$n = 0` の場合は "There are no cats!"
- `$n = 1` の場合は "There is one cat!"
- そして `$n = 42` の場合は "There are 42 cats!"
上記の複数形規則の引数において、`=0` はぴったりゼロ、`=1` はぴったり 1、そして `other` はそれ以外の数を表します。 上記の複数形規則の引数において、`=0` はぴったりゼロ、`=1` はぴったり 1、そして `other` はそれ以外の数を表します。
`#``n` の値によって置き換えられます。 `#``n` の値によって置き換えられます。
英語以外の言語では、これほど単純ではありません。
例えば、次はロシア語の例です。 複数形の規則が非常に複雑な言語もあります。
例えば、次はロシア語の例では、`=1``n = 1` にぴったりと一致するのに対して、`one``21``101` などに一致します。
``` ```
Здесь {n, plural, =0{котов нет} =1{есть один кот} one{# кот} few{# кота} many{# котов} other{# кота}}! Здесь {n, plural, =0{котов нет} =1{есть один кот} one{# кот} few{# кота} many{# котов} other{# кота}}!
``` ```
上の例について言及する価値があると思われるのは、`=1``n = 1` にぴったりと一致するのに対して、`one``21``101` などに一致する、ということです。 注意して欲しいのは、上記のメッセージは主として翻訳メッセージとして使用される、というです。
アプリケーションの [[yii\base\Application::$sourceLanguage|ソース言語]] を `ru-RU` に設定しない限り、オリジナルのメッセージには使用されません。
注意して欲しいのは、あなたの [[yii\base\Application::$sourceLanguage|ソース言語]] `ru_RU` に設定しなければ、このロシア語のメッセージを `Yii::t()` の中に直接に書くことは出来ない、ということです。 オリジナルのメッセージに対する翻訳が見つからない場合は、[[yii\base\Application::$sourceLanguage|ソース言語]] の複数形規則がオリジナルのメッセージに対して適用されます。
ただし、ソース言語を `ru_RU` に設定することは推奨されません。
むしろ、このような文字列はメッセージファイルまたは (DB ソースが使われている場合は) メッセージデータベースに入れるべきです。
Yii は翻訳された言語の文字列にある複数形規則を使います。翻訳が入手できない場合にはソース言語の複数形規則にフォールバックします。
あなたの言語について、どのような語形変化を指定すべきかを学習するためには、[unicode.org にある規則のリファレンス](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html) を参照してください。 特定の言語について、どのような語形変化を指定すべきかを学習するためには、[unicode.org にある規則のリファレンス](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html) を参照してください。
> Note|訳注: 上記のソースメッセージの日本語翻訳は以下のようなものになります。 > Note|訳注: 上記のソースメッセージの日本語翻訳は以下のようなものになります。
> >
@@ -308,28 +364,26 @@ Yii は翻訳された言語の文字列にある複数形規則を使います
> 日本語では単数形と複数形を区別しませんので、たいていの場合、`=0` と `other` を指定するだけで事足ります。 > 日本語では単数形と複数形を区別しませんので、たいていの場合、`=0` と `other` を指定するだけで事足ります。
> 横着をして、`{n, plural, ...}` を `{n, number}` に置き換えても、多分、大きな問題は生じないでしょう。 > 横着をして、`{n, plural, ...}` を `{n, number}` に置き換えても、多分、大きな問題は生じないでしょう。
#### 選択肢 #### 選択肢 <span id="selection"></span>
キーワードに基づいて表現を選択することが出来ます。 パラメータの型として `select` を使うと、パラメータ値に基づいて表現を選択することが出来ます。例えば、
この場合のパターンは、キーワードに対する表現の割り当てを指定し、デフォルトの表現を提供するものです。
```php ```php
// 出力例 : "Snoopy is a dog and it loves Yii!"
echo \Yii::t('app', '{name} is a {gender} and {gender, select, female{she} male{he} other{it}} loves Yii!', [ echo \Yii::t('app', '{name} is a {gender} and {gender, select, female{she} male{he} other{it}} loves Yii!', [
'name' => 'Snoopy', 'name' => 'Snoopy',
'gender' => 'dog', 'gender' => 'dog',
]); ]);
``` ```
これは "Snoopy is a dog and it loves Yii!" となります。 上記の式の中で、`female``male``gender` が取り得る値であり、`other` がそれらに一致しない値を処理します。
それぞれの取り得る値の後には、波括弧で囲んで対応する表現を指定します。
式の中で、`female``male``gender` が取り得る値であり、`other` がそれらに一致しない値を処理します。 > Note|訳注: 日本語翻訳例: '{name} は {gender} であり、{gender, select, female{彼女} male{彼} other{それ}}は Yii を愛しています。'
波括弧の中の文字列は下位の式であり、単なる文字列でも、さらにプレースホルダを持つ文字列でも構いません。
> Note|訳注: 翻訳: '{name} は {gender} であり、{gender, select, female{彼女} male{彼} other{それ}}は Yii を愛しています。'
> >
> 出力: 'Snoopy は dog であり、それは Yii を愛しています。' > 日本語出力: 'Snoopy は dog であり、それは Yii を愛しています。'
### デフォルトの翻訳を指定する ### デフォルトの翻訳を指定する <span id="default-translation"></span>
他の翻訳にマッチしないカテゴリのフォールバックとして使用されるデフォルトの翻訳を指定することが出来ます。 他の翻訳にマッチしないカテゴリのフォールバックとして使用されるデフォルトの翻訳を指定することが出来ます。
この翻訳は `*` によってマークされなければなりません。 この翻訳は `*` によってマークされなければなりません。
@@ -356,7 +410,7 @@ echo Yii::t('not_specified_category', 'message from unspecified category');
この場合、メッセージは `@app/messages/<LanguageCode>/not_specified_category.php` から読み込まれます。 この場合、メッセージは `@app/messages/<LanguageCode>/not_specified_category.php` から読み込まれます。
### モジュールのメッセージを翻訳する ### モジュールのメッセージを翻訳する <span id="module-translation"></span>
モジュール用のメッセージを翻訳したいけれども、全てのメッセージに対して一つの翻訳ファイルを使うことは避けたい、という場合には、次のようにすることが出来ます。 モジュール用のメッセージを翻訳したいけれども、全てのメッセージに対して一つの翻訳ファイルを使うことは避けたい、という場合には、次のようにすることが出来ます。
@@ -403,7 +457,7 @@ class Module extends \yii\base\Module
`fileMap` を使わずに、カテゴリを同じ名前のファイルにマップする規約を使って済ませることも出来ます。 `fileMap` を使わずに、カテゴリを同じ名前のファイルにマップする規約を使って済ませることも出来ます。
以上のようにすれば、直接に `Module::t('validation', 'your custom validation message')``Module::t('form', 'some form label')` などを使用することが出来ます。 以上のようにすれば、直接に `Module::t('validation', 'your custom validation message')``Module::t('form', 'some form label')` などを使用することが出来ます。
### ウィジェットのメッセージを翻訳する ### ウィジェットのメッセージを翻訳する <span id="widget-translation"></span>
モジュールに適用できる同じ規則をウィジェットにも適用することが出来ます。例えば、 モジュールに適用できる同じ規則をウィジェットにも適用することが出来ます。例えば、
@@ -456,7 +510,7 @@ class Menu extends Widget
> **Note**|注意: ウィジェットのためには i18n ビューも使うことが出来ます。コントローラのための同じ規則がウィジェットにも適用されます。 > **Note**|注意: ウィジェットのためには i18n ビューも使うことが出来ます。コントローラのための同じ規則がウィジェットにも適用されます。
### フレームワークメッセージを翻訳する ### フレームワークメッセージを翻訳する <span id="framework-translation"></span>
Yii には、検証エラーとその他いくつかの文字列に対するデフォルトの翻訳メッセージが付属しています。 Yii には、検証エラーとその他いくつかの文字列に対するデフォルトの翻訳メッセージが付属しています。
これらのメッセージは、全て 'yii' というカテゴリの中にあります。 これらのメッセージは、全て 'yii' というカテゴリの中にあります。
@@ -477,7 +531,7 @@ Yii には、検証エラーとその他いくつかの文字列に対するデ
これで、あなたの修正した翻訳を `@app/messages/<language>/yii.php` に置くことが出来ます。 これで、あなたの修正した翻訳を `@app/messages/<language>/yii.php` に置くことが出来ます。
### 欠落している翻訳の処理 ### 欠落している翻訳の処理 <span id="missing-translations"></span>
ソースに翻訳が欠落している場合でも、Yii はリクエストされたメッセージの内容を表示します。 ソースに翻訳が欠落している場合でも、Yii はリクエストされたメッセージの内容を表示します。
この振舞いは、原文のメッセージが正当かつ詳細なテキストである場合には、非常に好都合です。 この振舞いは、原文のメッセージが正当かつ詳細なテキストである場合には、非常に好都合です。
@@ -560,34 +614,31 @@ class TranslationEventHandler
これで、(あなたがファイルベースの翻訳を選択していた場合は) `messagePath` ディレクトリにファイルが出現します。 これで、(あなたがファイルベースの翻訳を選択していた場合は) `messagePath` ディレクトリにファイルが出現します。
ビュー ## ビューの翻訳 <span id="view-translation"></span>
------
前の項で説明したようなメッセージ翻訳代りに、ビュー`i18n` を使ってさまざまな言語に対するサポートを提供することも出来ます 個々のテキストメッセージ翻訳する代りに、ビュースクリプト全体を翻訳したい場合があるでしょう
例えば、`views/site/index.php` というビューがあり、それのロシア語のための特別版を作りたい場合は、現在のコントローラ/ウィジェットのビューパスの下に `ru-RU` フォルダを作って、ロシア語のためのファイルを `views/site/ru-RU/index.php` として置きます。 この目的を達するためには、ビューを翻訳して、ターゲット言語と同じ名前のサブディレクトリに保存するだけで大丈夫です。
そうすると、Yii は、現在の言語のためのファイルが存在する場合はそれをロードし、何も見つからなかった場合はオリジナルのビューファイルにフォールバックします。 例えば、`views/site/index.php` というビューをターゲット言語 `ru-RU` に翻訳したい場合は、翻訳したビューを `views/site/ru-RU/index.php` というファイルとして保存します。
このようにすると、[[yii\base\View::renderFile()]] メソッド、または、このメソッドを呼び出す他のメソッド (例えば [[yii\base\Controller::render()]]) を呼んで `views/site/index.php` をレンダリングするたびに、翻訳された `views/site/ru-RU/index.php` が代りにレンダリングされるようになります。
> **Note**|注意: 言語が `en-US` と指定されている場合、対応するビューが無いと、Yii は `en` の下でビューを探して、そこにも無ければ、オリジナルのビューを使います。 > **Note**|注意: [[yii\base\Application::$language|ターゲット言語]] が [[yii\base\Application::$sourceLanguage|ソース言語]] と同じ場合は、翻訳されたビューの有無にかかわらず、オリジナルのビューがレンダリングされます。
数値と日付の値を書式設定する ## 数値と日付の値を書式設定する <span id="date-number"></span>
----------------------------
詳細は [データフォーマッタ](output-formatting.md) の節を参照してください。 詳細は [データフォーマッタ](output-formatting.md) の節を参照してください。
PHP 環境をセットアップする <span id="setup-environment"></span> ## PHP 環境をセットアップする <span id="setup-environment"></span>
--------------------------
Yii は、[[yii\i18n\Formatter]] クラスの数値や日付の書式設定や、[[yii\i18n\MessageFormatter]] を使うメッセージのフォーマッティングなど、ほとんどの国際化機能を提供するために [PHP intl 拡張](http://php.net/manual/ja/book.intl.php) を使います。 Yii は、[[yii\i18n\Formatter]] クラスの数値や日付の書式設定や、[[yii\i18n\MessageFormatter]] を使うメッセージのフォーマッティングなど、ほとんどの国際化機能を提供するために [PHP intl 拡張](http://php.net/manual/ja/book.intl.php) を使います。
この二つのクラスは、`intl` がインストールされていない場合に備えて基本的な機能を提供するフォールバックを実装しています。 この二つのクラスは、`intl` がインストールされていない場合に備えて基本的な機能を提供するフォールバックを実装しています。
だだし、このフォールバックの実装は、英語のサイトでのみ十分に機能するものであり、たとえ英語のサイトであっても、PHP intl 拡張によって利用可能になる一連の豊かな機能を提供できるものではありません だだし、このフォールバックの実装は、英語がターゲット言語である場合にのみ十分に機能するものす
従って、PHP intl 拡張のインストールが強く推奨されます。 従って、国際化機能が必要とされる場合は、`intl`インストールすることが強く推奨されます。
[PHP intl 拡張](http://php.net/manual/ja/book.intl.php) は、さまざまに異なる全てのロケールについて知識と書式の規則を提供する [ICU ライブラリ](http://site.icu-project.org/) に基礎を置いています。 [PHP intl 拡張](http://php.net/manual/ja/book.intl.php) は、さまざまに異なる全てのロケールについて知識と書式の規則を提供する [ICU ライブラリ](http://site.icu-project.org/) に基礎を置いています。
この事実により、日付や数値の書式設定、また、メッセージのフォーマッティングで利用できる構文は、PHP バイナリとともにコンパイルされる ICU ライブラリのバージョンの違いによって異なってきます。 ICU のバージョンが異なると、日付や数値のフォーマットの結果も異なる場合があります。
あなたのウェブサイトが全ての環境で同じ出力をすることを保証するためには、全ての環境において同じバージョンの PHP intl 拡張 (従って同じバージョンの ICU) をインストールすることが推奨されます。
あなたのウェブサイトが全ての環境で同じ出力をすることを保証するためには、全ての環境において PHP intl 拡張をインストールし、PHP とともにコンパイルされた ICU ライブラリのバージョンが同一であることを確認することが推奨されます。
どのバージョンの ICU が PHP によって使われているかを知るために、次のスクリプトを走らせることが出来ます。 どのバージョンの ICU が PHP によって使われているかを知るために、次のスクリプトを走らせることが出来ます。
このスクリプトは、使用されている PHP と ICU のバージョンを出力します。 このスクリプトは、使用されている PHP と ICU のバージョンを出力します。
@@ -598,11 +649,12 @@ echo "PHP: " . PHP_VERSION . "\n";
echo "ICU: " . INTL_ICU_VERSION . "\n"; echo "ICU: " . INTL_ICU_VERSION . "\n";
``` ```
このドキュメントで説明されている全ての機能を使うことが出来るように、ICU のバージョン 49 以上であることを推奨します。 さらに、バージョン 49 以上の ICU を使用する事も推奨されます。
49 未満のバージョンに欠落している主要な機能の一つが、複数形規則における `#` プレースホルダです。 そうすることによって、このドキュメントで説明されている全ての機能を使うことが出来るようになります。
例えば、49 未満の ICU は、複数形規則における `#` プレースホルダをサポートしていません。
入手できる ICU バージョン については、<http://site.icu-project.org/download> を参照してください。 入手できる ICU バージョン については、<http://site.icu-project.org/download> を参照してください。
バージョン番号の採番方式が 4.8 リリースの後に変更されて、最初の二つの数字が結合されたことに注意してください バージョン番号の採番方式が 4.8 リリースの後に変更されたことに注意してください
すなわち、ICU 4.8、ICU 49、ICU 50 という順序です (すなわち、ICU 4.8、ICU 49、ICU 50、等々となっています)
これに加えて、ICU ライブラリとともに出荷されるタイムゾーンデータベースの情報も古くなっている可能性があります。 これに加えて、ICU ライブラリとともに出荷されるタイムゾーンデータベースの情報も古くなっている可能性があります。
タイムゾーンデータベースの更新に関する詳細は [ICU マニュアル](http://userguide.icu-project.org/datetime/timezone#TOC-Updating-the-Time-Zone-Data) を参照してください。 タイムゾーンデータベースの更新に関する詳細は [ICU マニュアル](http://userguide.icu-project.org/datetime/timezone#TOC-Updating-the-Time-Zone-Data) を参照してください。

View File

@@ -126,9 +126,9 @@ class User extends ActiveRecord implements IdentityInterface
{ {
...... ......
public function beforeSend($insert) public function beforeSave($insert)
{ {
if (parent::beforeSend($insert)) { if (parent::beforeSave($insert)) {
if ($this->isNewRecord) { if ($this->isNewRecord) {
$this->auth_key = \Yii::$app->security->generateRandomString(); $this->auth_key = \Yii::$app->security->generateRandomString();
} }

View File

@@ -37,7 +37,9 @@ class UserController extends Controller
$profile->scenario = 'update'; $profile->scenario = 'update';
if ($user->load(Yii::$app->request->post()) && $profile->load(Yii::$app->request->post())) { if ($user->load(Yii::$app->request->post()) && $profile->load(Yii::$app->request->post())) {
if ($user->validate() && $profile->validate()) { $isValid = $user->validate();
$isValid = $profile->validate() && $isValid;
if ($isValid) {
$user->save(false); $user->save(false);
$profile->save(false); $profile->save(false);
return $this->redirect(['user/view', 'id' => $id]); return $this->redirect(['user/view', 'id' => $id]);

View File

@@ -90,21 +90,26 @@ But there are other installation options available:
Verifying the Installation <span id="verifying-installation"></span> Verifying the Installation <span id="verifying-installation"></span>
-------------------------- --------------------------
After installation, you can use your browser to access the installed Yii application with the following URL: After installation is done, either configure your web server (see next section) or use
[built-in PHP web server](https://secure.php.net/manual/en/features.commandline.webserver.php) by running the following
console command while in the project `web` directory:
``` ```
http://localhost/basic/web/index.php php -S localhost:80
``` ```
This URL assumes you have installed Yii in a directory named `basic`, directly under the Web server's document root directory, You can use your browser to access the installed Yii application with the following URL:
and that the Web server is running on your local machine (`localhost`). You may need to adjust it to your installation environment.
```
http://localhost/
```
![Successful Installation of Yii](images/start-app-installed.png) ![Successful Installation of Yii](images/start-app-installed.png)
You should see the above "Congratulations!" page in your browser. If not, please check if your PHP installation satisfies You should see the above "Congratulations!" page in your browser. If not, please check if your PHP installation satisfies
Yii's requirements. You can check if the minimum requirements are met using one of the following approaches: Yii's requirements. You can check if the minimum requirements are met using one of the following approaches:
* Use a browser to access the URL `http://localhost/basic/requirements.php` * Copy `/requirements.php` to `/web/requirements.php` and then use a browser to access it via `http://localhost/requirements.php`
* Run the following commands: * Run the following commands:
``` ```
@@ -112,9 +117,9 @@ Yii's requirements. You can check if the minimum requirements are met using one
php requirements.php php requirements.php
``` ```
You should configure your PHP installation so that it meets the minimum requirements of Yii. Most importantly, you should have PHP 5.4 or above. You should also install You should configure your PHP installation so that it meets the minimum requirements of Yii. Most importantly, you
the [PDO PHP Extension](http://www.php.net/manual/en/pdo.installation.php) and a corresponding database driver should have PHP 5.4 or above. You should also install the [PDO PHP Extension](http://www.php.net/manual/en/pdo.installation.php)
(such as `pdo_mysql` for MySQL databases), if your application needs a database. and a corresponding database driver (such as `pdo_mysql` for MySQL databases), if your application needs a database.
Configuring Web Servers <span id="configuring-web-servers"></span> Configuring Web Servers <span id="configuring-web-servers"></span>

View File

@@ -16,7 +16,7 @@ For consistency, all locale IDs used in Yii applications should be canonicalized
`ll-CC`, where `ll` is a two- or three-letter lowercase language code according to `ll-CC`, where `ll` is a two- or three-letter lowercase language code according to
[ISO-639](http://www.loc.gov/standards/iso639-2/) and `CC` is a two-letter country code according to [ISO-639](http://www.loc.gov/standards/iso639-2/) and `CC` is a two-letter country code according to
[ISO-3166](http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html). [ISO-3166](http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html).
More details about locale can be found in check the More details about locale can be found in the
[documentation of the ICU project](http://userguide.icu-project.org/locale#TOC-The-Locale-Concept). [documentation of the ICU project](http://userguide.icu-project.org/locale#TOC-The-Locale-Concept).
In Yii, we often use the term "language" to refer to a locale. In Yii, we often use the term "language" to refer to a locale.
@@ -65,7 +65,7 @@ To use the message translation service, you mainly need to do the following work
* Wrap every text message that needs to be translated in a call to the [[Yii::t()]] method; * Wrap every text message that needs to be translated in a call to the [[Yii::t()]] method;
* Configure one or multiple message sources in which the message translation service can look for translated messages; * Configure one or multiple message sources in which the message translation service can look for translated messages;
* Let the translators to translate messages and store them in the message source(s). * Let the translators translate messages and store them in the message source(s).
The method [[Yii::t()]] can be used like the following, The method [[Yii::t()]] can be used like the following,
@@ -342,7 +342,7 @@ do not match either one of them. Following each possible parameter value, you sh
it in a pair of curly brackets. it in a pair of curly brackets.
### Specifying default translation ### Specifying default translation <span id="default-translation"></span>
You can specify default translations that will be used as a fallback for categories that don't match any other translation. You can specify default translations that will be used as a fallback for categories that don't match any other translation.
This translation should be marked with `*`. In order to do it add the following to the application config: This translation should be marked with `*`. In order to do it add the following to the application config:
@@ -368,7 +368,7 @@ echo Yii::t('not_specified_category', 'message from unspecified category');
The message will be loaded from `@app/messages/<LanguageCode>/not_specified_category.php`. The message will be loaded from `@app/messages/<LanguageCode>/not_specified_category.php`.
### Translating module messages ### Translating module messages <span id="module-translation"></span>
If you want to translate the messages for a module and avoid using a single translation file for all the messages, you can do it like the following: If you want to translate the messages for a module and avoid using a single translation file for all the messages, you can do it like the following:
@@ -415,7 +415,7 @@ In the example above we are using wildcard for matching and then filtering each
use the convention of the category mapping to the same named file. use the convention of the category mapping to the same named file.
Now you can use `Module::t('validation', 'your custom validation message')` or `Module::t('form', 'some form label')` directly. Now you can use `Module::t('validation', 'your custom validation message')` or `Module::t('form', 'some form label')` directly.
### Translating widgets messages ### Translating widgets messages <span id="widget-translation"></span>
The same rule as applied for Modules above can be applied for widgets too, for example: The same rule as applied for Modules above can be applied for widgets too, for example:
@@ -468,7 +468,7 @@ Now you can use `Menu::t('messages', 'new messages {messages}', ['{messages}' =>
> **Note**: For widgets you also can use i18n views, with the same rules as for controllers being applied to them too. > **Note**: For widgets you also can use i18n views, with the same rules as for controllers being applied to them too.
### Translating framework messages ### Translating framework messages <span id="framework-translation"></span>
Yii comes with the default translation messages for validation errors and some other strings. These messages are all Yii comes with the default translation messages for validation errors and some other strings. These messages are all
in the category `yii`. Sometimes you want to correct the default framework message translation for your application. in the category `yii`. Sometimes you want to correct the default framework message translation for your application.
@@ -488,7 +488,7 @@ In order to do so, configure the `i18n` [application component](structure-applic
Now you can place your adjusted translations to `@app/messages/<language>/yii.php`. Now you can place your adjusted translations to `@app/messages/<language>/yii.php`.
### Handling missing translations ### Handling missing translations <span id="missing-translations"></span>
Even if the translation is missing from the source, Yii will display the requested message content. Such behavior is very convenient Even if the translation is missing from the source, Yii will display the requested message content. Such behavior is very convenient
in case your raw message is a valid verbose text. However, sometimes it is not enough. in case your raw message is a valid verbose text. However, sometimes it is not enough.

View File

@@ -447,7 +447,7 @@ class BaseFileHelper
* @param integer $mode the permission to be set for the created directory. * @param integer $mode the permission to be set for the created directory.
* @param boolean $recursive whether to create parent directories if they do not exist. * @param boolean $recursive whether to create parent directories if they do not exist.
* @return boolean whether the directory is created successfully * @return boolean whether the directory is created successfully
* @throws \yii\base\Exception if the directory could not be created. * @throws \yii\base\Exception if the directory could not be created (i.e. php error due to parallel changes)
*/ */
public static function createDirectory($path, $mode = 0775, $recursive = true) public static function createDirectory($path, $mode = 0775, $recursive = true)
{ {
@@ -459,16 +459,19 @@ class BaseFileHelper
static::createDirectory($parentDir, $mode, true); static::createDirectory($parentDir, $mode, true);
} }
try { try {
$result = mkdir($path, $mode); if (!mkdir($path, $mode)) {
chmod($path, $mode); return false;
} catch (\Exception $e) { }
if (is_dir($path)) { // https://github.com/yiisoft/yii2/issues/9288 } catch (\Exception $e) {
return true; if (!is_dir($path)) {// https://github.com/yiisoft/yii2/issues/9288
throw new \yii\base\Exception("Failed to create directory \"$path\": " . $e->getMessage(), $e->getCode(), $e);
} }
throw new \yii\base\Exception("Failed to create directory '$path': " . $e->getMessage(), $e->getCode(), $e);
} }
try {
return $result; return chmod($path, $mode);
} catch (\Exception $e) {
throw new \yii\base\Exception("Failed to change permissions for directory \"$path\": " . $e->getMessage(), $e->getCode(), $e);
}
} }
/** /**

View File

@@ -19,7 +19,7 @@
return [ return [
'(not set)' => '(niet ingesteld)', '(not set)' => '(niet ingesteld)',
'An internal server error occurred.' => 'Er is een interne serverfout opgetreden.', 'An internal server error occurred.' => 'Er is een interne serverfout opgetreden.',
'Are you sure you want to delete this item?' => 'Ben je zeker dat je dit item wilt verwijderen?', 'Are you sure you want to delete this item?' => 'Weet je zeker dat je dit item wilt verwijderen?',
'Delete' => 'Verwijderen', 'Delete' => 'Verwijderen',
'Error' => 'Fout', 'Error' => 'Fout',
'File upload failed.' => 'Bestand uploaden mislukt.', 'File upload failed.' => 'Bestand uploaden mislukt.',
@@ -30,7 +30,7 @@ return [
'Missing required parameters: {params}' => 'Ontbrekende vereiste parameters: {params}', 'Missing required parameters: {params}' => 'Ontbrekende vereiste parameters: {params}',
'No' => 'Nee', 'No' => 'Nee',
'No results found.' => 'Geen resultaten gevonden', 'No results found.' => 'Geen resultaten gevonden',
'Only files with these MIME types are allowed: {mimeTypes}.' => 'Alleen bestanden met de volgende MIME types zijn toegelaten: {mimeTypes}', 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Alleen bestanden met de volgende MIME types zijn toegestaan: {mimeTypes}',
'Only files with these extensions are allowed: {extensions}.' => 'Alleen bestanden met de volgende extensies zijn toegestaan: {extensions}.', 'Only files with these extensions are allowed: {extensions}.' => 'Alleen bestanden met de volgende extensies zijn toegestaan: {extensions}.',
'Page not found.' => 'Pagina niet gevonden.', 'Page not found.' => 'Pagina niet gevonden.',
'Please fix the following errors:' => 'Corrigeer de volgende fouten:', 'Please fix the following errors:' => 'Corrigeer de volgende fouten:',
@@ -59,7 +59,7 @@ return [
'in {delta, plural, =1{a month} other{# months}}' => 'binnen {delta, plural, =1{een maand} other{# maanden}}', 'in {delta, plural, =1{a month} other{# months}}' => 'binnen {delta, plural, =1{een maand} other{# maanden}}',
'in {delta, plural, =1{a second} other{# seconds}}' => 'binnen {delta, plural, =1{een seconde} other{# seconden}}', 'in {delta, plural, =1{a second} other{# seconds}}' => 'binnen {delta, plural, =1{een seconde} other{# seconden}}',
'in {delta, plural, =1{a year} other{# years}}' => 'binnen {delta, plural, =1{een jaar} other{# jaren}}', 'in {delta, plural, =1{a year} other{# years}}' => 'binnen {delta, plural, =1{een jaar} other{# jaren}}',
'in {delta, plural, =1{an hour} other{# hours}}' => 'binnen {delta, plural, =1{een uur} other{# uren}}', 'in {delta, plural, =1{an hour} other{# hours}}' => 'binnen {delta, plural, =1{een uur} other{# uur}}',
'just now' => 'zojuist', 'just now' => 'zojuist',
'the input value' => 'de invoerwaarde', 'the input value' => 'de invoerwaarde',
'{attribute} "{value}" has already been taken.' => '{attribute} "{value}" is reeds in gebruik.', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" is reeds in gebruik.',

View File

@@ -81,6 +81,9 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase
*/ */
protected function destroyApplication() protected function destroyApplication()
{ {
if (\Yii::$app && \Yii::$app->has('session', true)) {
\Yii::$app->session->close();
}
\Yii::$app = null; \Yii::$app = null;
} }