12

i18n と l10n を実行する方法を探しています。

私はgettext以前に使用したことがあり、それは良かったです.異なる言語で .mo ファイルを作成するだけで、翻訳する必要があるものはすべてこの表記法になります:

echo __('string to be translated');

現在、PHP に組み込まれている Intl ライブラリがあることは知っていますgettext()

php.net でIntlに関する情報をすべて読んだ後、ロケールの処理、文字列の比較、数値の書式設定などの優れた機能がいくつかあることがわかりました。

私が理解できないのは、Intl ライブラリを使用して通常の文字列から文字列への変換を処理する方法です。何か案は?

4

3 に答える 3

6

そのアドバイスはあまり真実ではありませんでした。intl 関数は、置換としてではなく、gettext と組み合わせて使用​​できます。

MessageFormatterこれは、INTL をテキスト翻訳と関連付けるときに心に留めていることです。例はそう示唆しています。しかし実際には、それはただのsprintfステロイドです。数値を既存の文字列に挿入します。(ロケールサポートは内部スイッチとして機能するだけなので、ロケールサポートがそこでどのように役立つかさえわかりません。)

于 2011-04-13T04:44:03.523 に答える
5

翻訳に intl を使用した方法を次に示します (php v. 5.3.10 および 5.4.7 でテスト済み)。

intl.php

namespace Example;
class Intl {

  private $resource;

  public function __construct() {
    $bundle_location = "./locales";
    $user_locale = \Locale::acceptFromHttp( $_SERVER['HTTP_ACCEPT_LANGUAGE'] );
    $this->resource = new \ResourceBundle( $user_locale, $bundle_location );
  }

 ...

display.php

 use Example\Intl;

 $intl = new Intl();
 $r = $intl->resource;

 echo $r['string_to_be_translated'];

 ...

リソースバンドル

localesディレクトリには、リソース ファイルがあります。

root.res - ルート言語 (英語)

root { 
  string_to_be_translated {String to be translated } 
}

ja.res - 日本語

ja { 
  string_to_be_translated {\u5909\u63DB\u3055\u308C\u308B\u6587\u5B57\u5217 }
}

sp.res - スペイン語

sp { 
  string_to_be_translated {Cadena a ser traducido }
}

(等)

于 2012-11-07T22:52:55.907 に答える
1

gettext を使用します。Intl (その下の ICU など) は l10n 用で、翻訳をロードしません。

于 2011-04-13T04:40:55.277 に答える