Bug(バグ) #1967
完了『言語:日本語』の状態でプロフィール登録・プロフィール変更の「"%value%" is too long」が翻訳されない
100%
説明
内容¶
『言語:日本語』の状態でプロフィール登録・プロフィール変更に表示されるエラーメッセージ「"%value%" is too long」が翻訳されず、英語のまま表示される。
- プロフィール登録では、
- (1)ニックネーム
- (2)性別
- (3)誕生日
- (4)都道府県
- (5)自己紹介
- (6)管理画面から追加した独自プロフィール
- (7)秘密の質問
- (8)秘密の質問への答え
- (9)年齢の公開範囲
- (10)パスワード
- (11)パスワード再入力
- プロフィール変更では、
- (1)ニックネーム
- (2)性別
- (3)誕生日
- (4)都道府県
- (5)自己紹介
- (6)管理画面から追加した独自プロフィール
があるが、この問題を受けるのは (1) のニックネーム(最大64文字長)のみのようである。
ニックネームに(半角全角問わず、その文字数が)64文字を超える文字列を設定しようとした場合、PC版、携帯版のどちらも
"あああああいいいいいうううううえええええおおおおおかかかかかきききききくくくくくけけけけけこここここさささささしししししすすすすす" is too long (64 characters max).
のようなエラーメッセージが表示される(上記は「あいうえおかきくけこさしす」の13文字を5個ずつ=65文字書いた例である。もちろんだが、1文字減らして64文字にするとエラーメッセージは表示されない)。
発生確認バージョン¶
OpenPNE 3.6beta8
OpenPNE 3.4.9.2
原因¶
form_member.ja.xml に該当ワードの翻訳がない。
修正内容¶
ファイル
Minoru Takai さんが13年以上前に更新
考えられる解決方法¶
pc_frontend/i18n 等にある messages.ja.xml の
<trans-unit id=""> <source>"%value%" is too long (%max_length% characters max).</source> <target>%max_length%文字以内で入力してください。</target> </trans-unit>
この部分を form_member.ja.xml にコピーする。
この問題の原因と背景¶
「"%value%" is too long」の翻訳は、 messages.ja.xml には記述されています。
messages.*.xml や form_member.*.xml はそれぞれ翻訳カタログと呼ばれるもので、i18n の機構による __() メソッドなどで翻訳がされる場合には、「指定されている1つのカタログ」によって翻訳が実行されます。
この問題が出る箇所は、カタログが form_member と指定されており、 messages カタログは読み込まれていません。
$ ack 'form_member' -C lib/form/doctrine/MemberForm.class.php 30- $this->widgetSchema->setLabel('name', '%nickname%'); 31- $this->widgetSchema->setNameFormat('member[%s]'); 32: $this->widgetSchema->getFormFormatter()->setTranslationCatalogue('form_member'); 33- } 34-
明示的にカタログを指定しない場合は、デフォルトのカタログとして messages カタログが読み込まれるようになっています。
今回は、当該の箇所で用いられる form_member カタログに「"%value%" is too long」の翻訳が記述されていなかったため、翻訳されない問題が生じています。
解決方法の妥当性について¶
form_member カタログに messages カタログと同一の翻訳を複製することで問題は解消できますが、これが好ましい方法なのかについては議論の余地があります。
同じ翻訳内容を複製する対応を行ってしまうと、その翻訳内容を変更したときに複製した他の全ての箇所で同様の修正を施す必要が生じてしまいます。保守性に問題を来たす可能性を十分考慮しなければなりません。
「"%value%" is too long」の翻訳をしたい箇所が複数あり、その箇所が互いに異なるカタログを用いていた場合(まさに今回の場合)は、それぞれのカタログに同じ翻訳内容を記述するしかないと判断しています。
これは、翻訳カタログを2つ以上読み込んだり、カタログ間で翻訳内容を継承する仕組みが(少なくとも現在の) symfony に用意されていないためです。
まとめ¶
解決方法の妥当性を検討した上で、form_member カタログへ翻訳を複製する方法で対応します。
上記の検討内容に誤りがある場合や、より適切な対応方法が考えられる場合はコメントを頂ければ幸いです。
Naoya Tozuka さんが13年以上前に更新
messages以外のカタログを参照しつつmessagesカタログに含まれる翻訳語を引き当てたい場合に、参照する(messages以外の)カタログにも同一の記述をしなければならず不合理であり保守性に欠けますが、これは高井さんの指摘の通り現状のSymfony(sfMessageFormat)の実装:
- カタログが指定されていない場合にはmessagesカタログを見に行く
- カタログが指定されていて、かつそのカタログに翻訳語が存在しない場合には何もしない(代わりにmessagesカタログを見に行くようにはなっていない)
に起因するものであり、現時点ではここに修正を加えるのではなく、現状のsfMessageFormatの仕様を前提に(翻訳語のコピーで)対処する酒井・高井案を支持します。
Naoya Tozuka さんが13年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 d904bbc4b12c59c4b21aa245e3a4880440be2624 で適用されました。
Naoya Tozuka さんが13年以上前に更新
更新履歴 commit:"e1557b055f62732feb62553175d9b110feec086e" で適用されました。
Naoya Tozuka さんが13年以上前に更新
更新履歴 commit:"5b9de01f16e70d9eb993b8cd6cf2c9db2150ad34" で適用されました。
Minoru Takai さんが13年以上前に更新
- 対象バージョン を OpenPNE 3.7.0 にセット
- 3.6 で発生するか を Yes にセット
master ブランチのソースコードにて、動作テストおよびコードチェックを行いました。
動作テスト¶
- 修正適用前(差分適用前に symfony cc して動作テスト)
- PC版:プロフィール登録(メンバー登録)
- (省略)
- PC版:プロフィール変更(マイホームからプロフィール変更画面)
- 【NG】翻訳されていない
- 携帯版:プロフィール変更(マイホームからプロフィール変更画面)
- 【NG】翻訳されていない
- 携帯版:プロフィール登録(メンバー登録)
- (省略)
- PC版:プロフィール登録(メンバー登録)
- 修正適用後(差分適用後に symfony cc して動作テスト)
- PC版:プロフィール登録(メンバー登録)
- (省略)
- PC版:プロフィール変更(マイホームからプロフィール変更画面)
- 【OK】想定する文言で翻訳されている
- 携帯版:プロフィール変更(マイホームからプロフィール変更画面)
- 【OK】想定する文言で翻訳されている
- 携帯版:プロフィール登録(メンバー登録)
- (省略)
- PC版:プロフィール登録(メンバー登録)
上記は全て Firefox4 および FireMobileSimulator による確認です(携帯端末での実機テストはしていません:実機に依存するものではないため実機テストは不要だと判断しています)。
※ 上記のテストしか行っていませんが、 3.4.x 向けのテスト結果があり、修正による影響が十分想定できるため、上記のテストのみで十分だと判断しています。
以上、修正に問題はないと判断できます。
コードチェック¶
- 修正内容自体
- 想定した解決方法に従って、修正が施されている
- コピーペーストのミスや余計な記述などは含まれていない
- コーディング規約の観点
- 翻訳の追加位置に特に問題はない(ファイルの末に追加している)
- インデントも適切である(ハードタブが不適切に含まれたりスペース数に過不足はない)
上記は 3.4.x での修正で確認した内容と同一ですが、改めて master ブランチへの取り込み内容を確認した上で、修正内容に問題はないと判断しています。
Minoru Takai さんが13年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
Minoru Takai さんが13年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更
note-11 のコードチェックと動作テストを以て、完了とします。