2010-11-28 14 views
2

Locale::acceptFromHttpでHTTP Accept-Languageヘッダーを解析すると、このロケール識別子に基づいてユーザーの優先通貨を取得する簡単で信頼性の高い方法がありますか? 「en-US」の場合は「USD」と同じです。ロケールに基づいて通貨ISO 4217コードを取得

PHP intl extensionでこれを行う方法がありましたが、これまでマニュアルで私の答えを見つけることができませんでした。私はZend FrameworkがZend_Currencyでこれを行うことができるのを見ましたが、それは私の特定のソフトウェアのためにあまりにも肥大しています。

他のライブラリやこれを実現する方法はありますか?ロケール識別子がたくさんあるはずなので、簡単なswitchはちょっとした過ちです。

答えて

1

あなたはsetlocale()localeconv()を使用してPHP 4とPHP 5の両方で行うことができます。

$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']); 
setlocale(LC_MONETARY, $locale); 

print_r(localeconv()); 

出力例:

Array 
(
    [decimal_point] => . 
    [thousands_sep] => 
    [int_curr_symbol] => EUR 
    [currency_symbol] => € 
    [mon_decimal_point] => , 
    [mon_thousands_sep] => 
    [positive_sign] => 
    [negative_sign] => - 
    [int_frac_digits] => 2 
    [frac_digits] => 2 
    [p_cs_precedes] => 1 
    [p_sep_by_space] => 1 
    [n_cs_precedes] => 1 
    [n_sep_by_space] => 1 
    [p_sign_posn] => 1 
    [n_sign_posn] => 2 
    [grouping] => Array 
     (
     ) 

    [mon_grouping] => Array 
     (
      [0] => 3 
      [1] => 3 
     ) 

) 

ISO 4217コードは、結果の配列のint_curr_symbolキー内に収容されています。

少し遅れ
1

いますが、\NumberFormatterでそれを得ることができます:

<?php 

$currencyPerLocale = array_reduce(
    \ResourceBundle::getLocales(''), 
    function (array $currencies, string $locale) { 
     $currencies[$locale] = \NumberFormatter::create(
      $locale, 
      \NumberFormatter::CURRENCY 
     )->getTextAttribute(\NumberFormatter::CURRENCY_CODE); 

     return $currencies; 
    }, 
    [] 
);