多言語サイトのフォームの翻訳

2012年8月28日 at 10:24

アドオンのInternationalizationを使って多言語サイトを構築する際、
フォームブロック内のエラーメッセージや送信ボタンが
デフォルトの日本語のままになってしまいます。

一つの解決法として、
エラーメッセージに日本語と他言語を一緒に表示させているサイトを
どこかで見たことがありますが、
その場合、どのファイルを修正したら良いのでしょうか?

本家サイトのフォーラムで以下の方法を見つけて試したのですが、
http://www.concrete5.org/community/forums/internationalization/form-in-multiple-languages/
日本語バージョンのC5では機能しない??ようです。
私のやりかたが悪いのかもしれませんが…。

できれば、その言語にあった言語を自動で認識して、
正しくメッセージが表示させたいのですが、
何か良い方法はないでしょうか?

宜しくお願い致します。

タグ:

Re: 多言語サイトのフォームの翻訳

2012年8月28日 at 10:29
MainioのLanguage Managerは使ったことがないですが、フォーラムを読むと、site.phpでURLに従って言語設定を変更するようにすれば動く?って書いてあってベストアンサーになってますね。

$sitelang = substr($_SERVER['REQUEST_URI'],strlen(DIR_REL)+1, 2);
switch($sitelang) {
case 'en': {
define('LOCALE', 'en_US');
break;
}
case 'nl': {
define('LOCALE', 'nl_NL');
break;
}
default: {
define('LOCALE', 'de_DE');
break;
}
}
 

試したのですが、駄目でした

2012年8月28日 at 11:01
私はプログラマーではないので、
手探り状態で以下のようにやってみたのですが、
日本語(デフォルト)と英語です。

$sitelang = substr($_SERVER['REQUEST_URI'],strlen(DIR_REL)+1, 2);
switch($sitelang) {
case 'en': {
define('LOCALE', 'en_US');
break;
}
default: {
define('LOCALE', 'jp_JP');
break;
}
}


日本語フォーム ⇒ 英語
英語フォーム ⇒ 英語
のように両方とも英語になってしまいました。
 

Re: 多言語サイトのフォームの翻訳

2012年8月28日 at 11:16
jp_JP ではなく、 ja_JP です。ロケールの国際規格で、前半は言語、後半は地域を表します。
japanese / Japan
という設定です。試してみてください。
 

Re: 多言語サイトのフォームの翻訳

2012年8月28日 at 12:07
ちょっと気になったのですが、
LOCALEの設定をするのなら
ja_JP.UTF8 じゃないでしょうか?
違っていたらごめんなさい。
 

Re: 多言語サイトのフォームの翻訳

2012年8月28日 at 13:16
返信ありがとうございます。

ja_JPで試してみましたが、日本語フォームは英語のままです。
日本語フォーム ⇒ 英語
英語フォーム ⇒ 英語



ja_JP.UTF8だと、
[送信ボタン]は言語通りでOKです。
日本語フォーム ⇒ 日本語
英語フォーム ⇒ 英語

[エラーメッセージ]は、英語フォームで日本語が表示されてしまいます。
送信ボタンも日本語になってしまいます。sad
日本語フォーム ⇒ 日本語
英語フォーム ⇒ 日本語
 

Re: 多言語サイトのフォームの翻訳

2012年8月29日 at 11:23
Internationalizationすらまともに設置できておりません私ですが、
なんとなく、エラーメッセージ時に言語がデフォルトに戻る原因と、
(場当たり的な)対応が見えましたので書き込みます。

まず、site.phpに記述する
$sitelang = substr($_SERVER['REQUEST_URI'],strlen(DIR_REL)+1, 2);

ですが、これでURLから第1階層の二文字を抜き出しています(enとかjpとか)。
そしてその後に続く
switch($sitelang) {
case 'en': {
・・・・・(省略)

の部分で言語環境を変更しています。
(もし抜き出した2文字がenならen_USに設定、デフォルトはja_JP.UTF8ね、という感じです)

で、問題のエラーメッセージですが、エラーメッセージが表示されるときのURLが
index.php?cID= で始まるようになっています。
例:
フォームページを開いた状態:your.domain/en/form/
エラーメッセージが出た状態:your.domain/index.php?cID=###########


これだと上記2文字を抜き出しても en ではなく in になってしまうので、
英語ではなく、デフォルトの日本語でページが表示されてしまう訳です。
これでエラーメッセージの謎が解けました。

さて、話を大元に戻して、エラーメッセージに日本語と他言語を一緒に表示させる方法ですが、
下記の方法はいかがでしょうか?

1./concrete/blocks/form/controller.php および同フォルダにあるview.css、view.phpを
 /blocks/form/ フォルダにいれる

2.controller.phpに日本語メッセージを追記する(下記は269行目にある「必須項目未入力」の追記例です)。

if($notCompleted) $errors['CompleteRequired'] = t("Complete required fields *") ;
$errors['CompleteRequiredjp'] = t("必須項目を入力してください *") ; //この1行を追記
}


※他のエラーメッセージも同様の方法でいけると思います。
※captchaエラーは246行目、ファイルアップロード関連は291行目と294行目です。

3..controller.phpに日本語メッセージのタイトルを追記する(310行目あたり)
if(count($errors)){
$this->set('formResponse', t('Please correct the following errors:') );
$this->set('formResponsejp', t('以下のエラーを訂正してください。') );   //この1行を追記
$this->set('errors',$errors); $this->set('Entry',$E);


4.view.phpに追記する(17行目あたり)
<div id="msg">
<?php echo $formResponse ?>
<br><?php echo $formResponsejp ?>  //この1行を追記


なお、view.cssは見た目を同じくするだけなので無修正でOKです。

以上でエラーメッセージに日本語と他言語を一緒に表示させることが可能です。
日本語メッセージは
/languages/ja_JP.UTF8/LC_MESSAGES/messages.po
を参考にしてみてください。

物は試しでお試しください。
 

Re: 多言語サイトのフォームの翻訳

2012年8月29日 at 11:29
投稿してから気がつきました。
これって、デフォルトを英語にしている場合の対策でした。
申し訳ないです。。。

でも悔しいので、もうちょいだけ追加修正。
先ほどのcontroller.phpの追記部分、次のようにしてください。
if($notCompleted) $errors['CompleteRequired'] = ("Complete required fields *") ;   //カッコの前にあるtを取る
$errors['CompleteRequiredjp'] = ("必須項目を入力してください *") ; //この1行を追記
}


同様にタイトル部分もこんな感じで。
$this->set('formResponse', ('Please correct the following errors:') );
$this->set('formResponsejp', ('以下のエラーを訂正してください。') );   //この1行を追記


カッコの前にあるtを取れば日本語化されない、という事みたいです。
今度はちゃんと日本語環境でためしましたsmiling
 

Re: 多言語サイトのフォームの翻訳

2012年8月29日 at 12:42
なるほど~、エラーメッセージがデフォルト言語に戻る理由が理解できました!
URLから言語を判断させてるんですね。

ふと思ったのですが、独自の属性を追加して言語を認識させる方法は可能でしょうか?
実際、テーマのテンプレートに英語ページ用の属性を追加して、
ナビゲーション(日本語と英語)の振り分けに使っています。
"english_nav"属性を追加して、
english_nav属性があるページには、英語用ナビゲーションブロックを表示させ、
それ以外は、日本語ナビのブロック、という感じです。
こんな感じで、言語の振り分けはできないのでしょうか?


あと、エラーメッセージを日本語と他言語を一緒に表示させる方法ですが、
if($notCompleted) $errors['CompleteRequired'] = t("Complete required fields * 必須項目を入力してください *") ;

のように、英文のあとに、日本語を続けて入力しても大丈夫のようです。
この方法だと改行されずに、英文のあとに日本語が表示されます。
 

Re: 多言語サイトのフォームの翻訳

2012年8月29日 at 18:00
t()でくくってあると、LOCALEで設定された値が(日本語ならja_JP.UTF8)
languagesフォルダ内にあれば、
そのフォルダ内のLC_MESSAGES/messages.po ファイルを見に行きます。
messages.poファイルの
msgid と書かれた行と合致する語句であれば
そのすぐ下のmsgstr に書かれた語句に変換する。
という処理になります。

ですのでLOCALEに設定した値によって変更が無い語句は
t()はつけないほうがいいです。

実際には少し違うのですがはしょっています。
ややこしいこと言ってすみません。