CodeIgniter4での日本語化対応についてソースを見て調べてみた。
Codeigniter4は2017/05/01現在、正式リリースがされていません。現段階のソースでの検証となります。

CodeIgniter3では、i18n対応を行う場合、通常の言語クラスを使うより、PHPが提供しているgettextを使いましょうと言われている。
https://blog.noldor.info/do-not-use-lang-class/
まあ、少々作り込みは必要だが、そんな難しいものでもない。
githubでもいくつか登録されているのでそれを使うのもありかと思います。
https://github.com/Marko-M/codeigniter-gettext
https://github.com/bkader/ci-gettext

でも、「めんどくさーい」、「日本語専用サイトだしー」という場合には、gettextを使わなくても大丈夫かと思います。
language helperのlang関数を使えば、ソースは短く書けますしね。

さて、CodeIgniter4でのi18n対応だが、ソースを見る限り、localeが使用されていて、設定ファイルの設定次第では、HTTPヘッダーのAccept-Languageを使用してリアルタイムで言語ファイルを切り替えることが出来るようになっている
これなら、gettextを使わなくても済みそうだ。

CodeIgniter4の設定ファイルは、application/config/config.phpではなく、application/Config/App.php に変わっている。
他にもいろいろ変わってるんで、今までのようにすごい簡単にできるって感じではなくなっているような・・・

目次

i18n対応方法

設定ファイルの内容変更

application/Config/App.php の内容をi18n対応向けに変更する

変更する箇所は、次の3つの値になります。

	/*
	|--------------------------------------------------------------------------
	| Default Locale
	|--------------------------------------------------------------------------
	|
	| The Locale roughly represents the language and location that your visitor
	| is viewing the site from. It affects the language strings and other
	| strings (like currency markers, numbers, etc), that your program
	| should run under for this request.
	|
	*/
	public $defaultLocale = 'en';

	/*
	|--------------------------------------------------------------------------
	| Negotiate Locale
	|--------------------------------------------------------------------------
	|
	| If true, the current Request object will automatically determine the
	| language to use based on the value of the Accept-Language header.
	|
	| If false, no automatic detection will be performed.
	|
	*/
	public $negotiateLocale = false;

	/*
	|--------------------------------------------------------------------------
	| Supported Locales
	|--------------------------------------------------------------------------
	|
	| If $negotiateLocale is true, this array lists the locales supported
	| by the application in descending order of priority. If no match is
	| found, the first locale will be used.
	|
	*/
	public $supportedLocales = ['en'];

$defaultLocale は、デフォルトは日本語のサイトとするので値は「ja」とする

public $defaultLocale = 'ja';

$negotiateLocale は、コメントに書かれているように「Accept-Language header」の値を見て変更するかしないかのフラグとなっています。
よって、この値は、「true」に変更。

public $negotiateLocale = true;

i18n対応しない場合はデフォルトの「false」でOK。

$supportedLocales は、サポートする言語を配列で記述するようになります。デフォルトで英語の言語ファイルがあるので、とりあえず日本語と英語の2つという形にします。
ポイントは、デフォルト言語である日本語を配列の一番目にすることです。
これによって「Accept-Language」の値が「*」「*/*」の場合に配列インデックス=0の値がセットされるようになっています。

public $supportedLocales = ['ja','en'];

$negotiateLocale が「false」となっていれば使われない値なのでデフォルトのままでOK。

言語設定は以上。他にもサイト設定に必要な箇所はありますがここでは省きます。

言語ファイルの追加

application/Language ディレクトリには言語ファイルは無いので日本語用のディレクトリを作成します。

application/Language/ja
このjaディレクトリの中に日本語対応した言語ファイルを作成します。
とりあえず、system/Language/en ディレクトリの中にあるファイルをコピーしてもってきます。
わかりやすい、Validation用の言語ファイルの内容を日本語に変えます。

application/Language/ja/Validation.php

return [
	// Core Messages
	'noRuleSets'            => 'No rulesets specified in Validation configuration.',
	'ruleNotFound'          => '{field} is not a valid rule.',
	'groupNotFound'         => '%s is not a validation rules group.',
	'groupNotArray'         => '%s rule group must be an array.',

	// Rule Messages
	'alpha'                 => 'The {field} field may only contain alphabetical characters.',
	'alpha_dash'            => 'The {field} field may only contain alpha-numeric characters, underscores, and dashes.',
	'alpha_numeric'         => 'The {field} field may only contain alpha-numeric characters.',
	'alpha_numeric_spaces'  => 'The {field} field may only contain alpha-numeric characters and spaces.',
	'decimal'               => 'The {field} field must contain a decimal number.',
	'differs'               => 'The {field} field must differ from the {param} field.',
	'exact_length'          => 'The {field} field must be exactly {param} characters in length.',
	'greater_than'          => 'The {field} field must contain a number greater than {param}.',
	'greater_than_equal_to' => 'The {field} field must contain a number greater than or equal to {param}.',
	'in_list'               => 'The {field} field must be one of: {param}.',
	'integer'               => 'The {field} field must contain an integer.',
	'is_natural'            => 'The {field} field must only contain digits.',
	'is_natural_no_zero'    => 'The {field} field must only contain digits and must be greater than zero.',
	'is_unique'             => 'The {field} field must contain a unique value.',
	'less_than'             => 'The {field} field must contain a number less than {param}.',
	'less_than_equal_to'    => 'The {field} field must contain a number less than or equal to {param}.',
	'matches'               => 'The {field} field does not match the {param} field.',
	'max_length'            => 'The {field} field cannot exceed {param} characters in length.',
	'min_length'            => 'The {field} field must be at least {param} characters in length.',
	'numeric'               => 'The {field} field must contain only numbers.',
	'regex_match'           => 'The {field} field is not in the correct format.',
	'required'              => 'The {field} field is required.',
	'required_with'         => 'The {field} field is required when {param} is present.',
	'required_without'      => 'The {field} field is required when {param} in not present.',
	'timezone'              => 'The {field} field must be a valid timezone.',
	'valid_base64'          => 'The {field} field must be a valid base64 string.',
	'valid_email'           => 'The {field} field must contain a valid email address.',
	'valid_emails'          => 'The {field} field must contain all valid email addresses.',
	'valid_ip'              => 'The {field} field must contain a valid IP.',
	'valid_url'             => 'The {field} field must contain a valid URL.',

	// Credit Cards
	'valid_cc_num'          => '{field} does not appear to be a valid credit card number.',

	// Files
	'uploaded'              => '{field} is not a valid uploaded file.',
	'max_size'              => '{field} is too large of a file.',
	'is_image'              => '{field} is not a valid, uploaded image file.',
	'mime_in'               => '{field} does not have a valid mime type.',
	'ext_in'                => '{field} does not have a valid file extension.',
	'max_dims'              => '{field} is either not an image, or it is too wide or tall.',
	'',
];

CodeIgniter3以前のものとは書き方は違いますが、キーとバリューの関係は同じなので見ればわかります。
とりあえずのテストの為に「noRuleSets」のメッセージだけを変更します。

'noRuleSets'            => '検証設定で指定されたルールセットがありません。',

英語メッセージはこのようになっています。

'noRuleSets'            => 'No rulesets specified in Validation configuration.',

表示確認

デフォルトでコントローラファイルが2つありますが、Homeコントローラの中にメッセージの表示確認を記述します。

application/Controllers/Home.php

<?php namespace App\Controllers;

use CodeIgniter\Controller;

class Home extends Controller
{
	public function index()
	{
		echo lang('Validation.noRuleSets');     // 表示確認用の記述
		return view('welcome_message');
	}

	//--------------------------------------------------------------------

}

コントローラファイルの更新ができたらサイトにアクセスします。

http://127.0.0.1/

Welcome to CodeIgniter の上に「検証設定で指定されたルールセットがありません。」と表示されていれば正しく動作しています。
ただ、これだと、自動で言語設定が切り替わっているとは言えません。
現在の設定だとデフォルトが日本語設定となっているからです。

言語設定切替テスト

設定ファイルを変更し、デフォルトを英語にして、日本語メッセージが表示されるかを確認します。
まずは英語メッセージが表示されるように変更。

public $defaultLocale = 'en';
public $negotiateLocale = false;
public $supportedLocales = ['en','ja'];

この設定だと $negotiateLocale がfalseなので $supportedLocales の値は使用されず、英語メッセージが表示されるはずです。
サイトへアクセスし確認します。

No rulesets specified in Validation configuration. とメッセージが表示されています。

次に言語ファイルが切り替わるように設定を変更。

public $defaultLocale = 'en';
public $negotiateLocale = true;
public $supportedLocales = ['en','ja'];

$negotiateLocale をtrueに変更しました。

サイトへアクセスし確認します。

「検証設定で指定されたルールセットがありません。」と表示されています。
言語ファイルが、切り替わっているのを確認できます。

上記のままではデフォルトが英語設定なので、デフォルト日本語設定にしておきます。

public $defaultLocale = 'ja';
public $negotiateLocale = true;
public $supportedLocales = ['ja','en'];

CodeIgniter4では、標準機能でi18n対応ができるようになっているのがこれでわかります。
ただし、CodeIgniter4は、2017/05/01現在でも開発中なのでソースが変更される可能性がありますので
正式リリース後でもこの内容で使用できるかは保証できません。
正式リリースされたあと、また確認したいと思います。


0件のコメント

コメントを残す

アバタープレースホルダー

メールアドレスが公開されることはありません。 が付いている欄は必須項目です