2017-10-02 4 views
0

は、PHPのgettextのためのsetlocaleと型定義エラー

は、私はPHP関連のファイルでi18nためgettextを実装するために開始する問題を回避するには、適切な構造は何ですか。 ウェブ上に多くのチュートリアルがありますが、私は明確な答えを見つけるのが難しいですどこにスクリプト内のsetlocaleを配置するのですか?。誰もがスクリプトの冒頭にそれを置くようだ。

例次のPHP関数ではかなりうまく動作しますが、私は他のPHP関数の問題(下のコメントを参照してください)持っているのgettext

$category = LC_ALL; 
$locale = "fr_FR"; 
$domain = "messages"; 
$lat = 43.848977; // float with a point separator 

setlocale($category, "$locale"); 
putenv("$category=$locale"); 
bindtextdomain($domain, "./Locale"); 
bind_textdomain_codeset($domain, 'UTF-8'); 

echo gettext("sample text"); // works OK 

// The issue starts here 
$center_lat = filter_var($lat, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); 
// The float $latitude is interpreted as string due to comma in French, 
// filter_var do interpret as a float anymore and $center_lat gives something like 43848977 instead of 43,848977 

私は

Iを考えた解決策を私がgettextを呼び出すたびに、私はこれ(ほとんど)のような何かをする必要がありますが、

$userLocale = setlocale($category, 0); // current setting is returned 
echo gettext("sample text"); 
setlocale($category, $userLocale); 

// SCRIPT RESUME 

$userLocale = setlocale($category, 0); // current setting is returned 
echo gettext("other text"); 
setlocale($category, $userLocale); 

私は成功せずType Castingを試してみました

を試してみましたofficial manual of gettext

に完全なファイルの例も明確な答えを見つけられませんでした:

$center_lat = filter_var((float) $lat, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); 

をQUESTION

が道私のソリューションです。予期せぬエラー(型キャスティングであろうと他のものであろうと)を避けるために行くのですか?

答えて

1

通常、filter_var()は、入力値が文字列で指定されているWebフォーム入力をチェックするために使用されます。どのような状況で、filter_var()によってfloatをチェックする必要がありますか?

とにかく、ロケールのフォーマット番号を確認するには、php_intl拡張を使用してフランス語の数値文字列を通常の文字列に変換してから、filter_var()を動作させる必要があります。

if (!class_exists('NumberFormatter')) { 
    exit ('You need to install php_intl extension.'); 
} 

$category = LC_ALL; 
$locale = "fr_FR"; 
$domain = "messages"; 
$lat = '43,848977'; 

setlocale($category, "$locale"); 
putenv("$category=$locale"); 
bindtextdomain($domain, "./Locale"); 
bind_textdomain_codeset($domain, 'UTF-8'); 

$localeFormatter = new \NumberFormatter($locale, \NumberFormatter::DECIMAL); 
$center_lat = filter_var(
    $localeFormatter->parse($lat), 
    FILTER_SANITIZE_NUMBER_FLOAT, 
    FILTER_FLAG_ALLOW_FRACTION 
); 
echo $center_lat . PHP_EOL; 
+0

このソリューションは面白いですが、グローバルではありません。それは浮動小数点に適用されます(私が実行する可能性がある他のタイプについてはどうでしょうか)。私が思った解決法が適切な方法であるかどうかはわかりません。 – gentleboy

+0

入力パラメータがフランス語ではなく、出力がフランス語であればロケールを切り替える必要があります。どちらもフランス語であれば、毎回ロケールを切り替える必要はありません。私はむしろ入力と出力の両方がフランス語であることを保証するコードを書いています。 – akky

関連する問題