sunday-labの日本語訳版です。英語版のXOOPS Cube関連記事を翻訳作業中...

2007年2月12日月曜日

XCube_Utils::formatMessage()

この静的メソッドは sprintf に似た文字列生成機能を提供します。しかし、それは .NET string.Format() をベースにしています。
  • {0} is required.
  • Input {0} with {1} characters or less.
この記事はなぜ XCube がこのフォーマットを採用したかを説明します。

言語はそれぞれ異なる文法を持っています。それにより、メッセージカタログはしばしば大量の翻訳を必要とします。 XCube はメッセージから単語を分離することを推奨しています。たとえば;
  • Name is required.
  • Message is required.
  • Input password with 32 characters or less.
  • Input email with 255 characters or less.
  • Note is required.
もし私がこれらすべてを翻訳しなければならないのだとしたら……私は XOOPS のことを忘れてビールでも引っかけに出かけるでしょう。 sprintf() は次のような書き方を可能にします。
  • %s is required.
  • 最低 %s 文字以上で %s を入力してください。
非常にいいですね。しかし、あなたはこの方法が順序とキャピタライズを制御することが難しいことに注目しなければいけません。日本語はほとんどの文章において英語と異なる順序を持っています。
  • [EN] Input %s with %s or less characters.
  • [JA] 最低 %s 文字以上で %s を入力してください。
この翻訳を sprintf() によってコンバートするとき、あなたは奇妙なメッセージ「最低パスワード文字以上で32を入力してください」を見るでしょう。はい、原因は英語と日本語の間にある文法の違いにあります。XCubeが .NET 方式を採用した理由のひとつを理解できたと思います。
  • [EN] Input {0} with {1} character(s) or less.
  • [JA] 最低 {1} 文字以上で {0} を入力してください。
sprintf() もそれと同様のやり方が可能ですが、よく知られていませんし、以下に示すもうひとつの問題を解決することが出来ません。
  • {0} is required.
  • Input {0} with ...
もし {0} がパスワードだとして、あなたはそれに何をセットしますか? "Password" にしますか? "password" ですか?

XCube はこの問題の解決のためにモディファイアを提供する予定です。
  • {0:ucfirst} is required.
  • Input {0} with ...
sprintf() では、モディファイアを文字列リテラル側で指定することは出来ません。

たとえ、あるモジュール開発者が複数の言語を理解していなかったとしても、彼は翻訳に挑戦するコントリビュータのためにこの方法を使うべきです。

0 件のコメント: