Zend: получить локаль из кода страны

У меня есть список стран (например, 'de' => 'Deutschland', 'at' => 'Austria').
Теперь мне нужно получить строку локали ('de_DE' или 'de_AT') из кода страны.

Мне это нужно для проверки почтового индекса выбранной страной. Для этого валидатору почтового индекса нужна строка локали с регионом ('de_AT' или 'en_US'). 'de' или 'en' не работает.

Есть ли простой способ сделать это?


person andrepolo    schedule 01.05.2014    source источник


Ответы (3)


Другое решение:

$contry = 'at';
$locale = Zend_Locale::getLocaleToTerritory($contry);
$validator = new Zend_Validate_PostCode($locale);

Zend_Locale::getLocaleToTerritory() получить правильную локаль по умолчанию. (например, «США» дает «en_US»)

person doydoy44    schedule 20.05.2014

Попробуй это:

$locale = new Zend_Locale('de');
var_dump($locale->toString());

Вот документация: http://framework.zend.com/manual/1.0/en/zend.locale.functions.html

person Latheesan    schedule 01.05.2014

Предположим, что $contry — это «de» или «at».
Я предполагаю, что язык немецкий ('de')
Таким образом, вы можете получить локаль следующим образом:

$locale = new Zend_Locale('de_' . strtoupper($contry));

Вы можете использовать валидатор следующим образом:

$validator = new Zend_Validate_PostCode('de_' . strtoupper($contry));

or

$validator = new Zend_Validate_PostCode($locale);

Edit1
со своим комментарием:

Если у вас есть только регион, вы не можете получить локаль.
Например, если регион – 'et', вы не можете знать, какая локаль – 'aa_ET' или 'am_ET'.
Поэтому я думаю, что лучшим решением будет изменить ваш список, чтобы получить хорошее значение в POST.
Например, поставьте 'en_ZW' вместо 'zw'


Edit2

После проверки, если вам просто нужен валидатор Zend_Validate_PostCode, есть способ.

Действительно, каждый локальный xx_XX означает язык и регион, и для всех языков в том же регионе почтовый индекс одного формата.
Вот код, который вы восстановите валидатором:

$contry = 'at';
$list_locale =  Zend_Locale::getLocaleList();
$contry_caps = strtoupper($contry);

foreach($list_locale as $locale_str => $bool){
    $locale_obj = new Zend_Locale($locale_str);
    if ($contry_caps == $locale_obj->getRegion()){
        $locale = $locale_str;
        break;
    }            
}

$validator = new Zend_Validate_PostCode($locale);

Однако имейте в виду, что в некоторых регионах почтовый индекс не определен в Zend (я использовал версию 1.12.6).
Вот регион, в котором нет валидатора для почтового индекса:

001
AE
EH
LY
PS
QA
YE
BT
150
AG
BS
BZ
DM
FJ
GD
GI
GM
GY
JM
KI
KN
KY
LC
MW
SB
SL
SS
TT
UM
VC
VG
WS
419
BO
CO
CU
EA
IC
PA
PE
SV
IR
BF
BJ
BL
CI
GA
MF
KP
MM
AW
CW
SR
SX
ST
TL
AL
VN
person doydoy44    schedule 01.05.2014
comment
Это происходит из сообщения, значение «de» или «at» или что-то еще в списке. Список начинается с Афганистана (af) и заканчивается Зимбабве (zw). - person andrepolo; 01.05.2014
comment
Извините, но нет, это не решение моей проблемы. Но ваш список может помочь мне создать список сопоставлений. Так что спасибо за старания :-) - person andrepolo; 15.05.2014