#php #localization #internationalization #locale #currency
#php #локализация #интернационализация #Валюта
Вопрос:
есть ли какой-либо способ отредактировать / изменить настройку локали по умолчанию в localeconv()
?
Я хотел бы использовать money_format
функцию, и она работает нормально, но локали для моего языка / региона неверны.
Чтобы быть более точным, для Хорватии мы используем символ валюты после числа, а не перед, как установлено в локальных значениях?
Есть ли какие-либо способы, которыми я могу это отредактировать? Или, по крайней мере, вручную проверяет, изменяет значения и отправляет новые значения в setlocale()
?
Кстати, работаю на общем хостинге.
Комментарии:
1. И что не так с php.net/manual/en/function.setlocale.php ?
2. В setlocale нет ничего плохого. Только то, что он принимает только языковые строки в качестве параметра. И поэтому загружает неправильные значения по умолчанию для моего языка
3. Вы изучали расширение PHP i18n?
4. @Ethan: нет, но я проверю это. На самом деле i18n — это не то, что я ищу, я уже обработал это с помощью kohana. Но в любом случае я посмотрю
5. I18n от Kohana технически является просто фреймворком для локализации, куда вы предоставляете переводы (выглядит как). Расширение PHP предоставляет методы для локализации времени / даты / валюты и т.д.
Ответ №1:
number_format()
не имеет ничего общего с символами валюты, вы, вероятно, имели в виду money_format()
, но … хорошо — просто используйте number_format()
и добавляйте любой символ валюты, который вы хотите, к возвращаемому значению.
Комментарии:
1. я думаю, что я просто создам свою собственную функцию money_format, которая принимает дополнительные параметры, такие как $ foreceSymbolRight и т.д.
Ответ №2:
Если кому-то интересно, я заставил это работать с моей собственной заменой money_format()
функции. По сути, это копипаст из here с добавленными параметрами для forceRight и noSpace
class Helper_Locales
{
public static function formatNumber($number, $isMoney=false, $forceRight=false, $noSpace=false) {
$lg = isset($lg) ? $lg : setlocale(LC_MONETARY, '0');
$ret = setLocale(LC_ALL, $lg);
setLocale(LC_TIME, 'Europe/Paris');
if ($ret===FALSE) {
echo "Language '$lg' is not supported by this system.n";
return;
}
$LocaleConfig = localeConv();
forEach($LocaleConfig as $key => $val) $$key = $val;
// Sign specifications:
if ($number>=0) {
$sign = $positive_sign;
$sign_posn = $p_sign_posn;
$sep_by_space = $p_sep_by_space;
$cs_precedes = $p_cs_precedes;
} else {
$sign = $negative_sign;
$sign_posn = $n_sign_posn;
$sep_by_space = $n_sep_by_space;
$cs_precedes = $n_cs_precedes;
}
// Number format:
$n = number_format(abs($number), $frac_digits,
$decimal_point, $thousands_sep);
$n = str_replace(' ', 'amp;nbsp;', $n);
switch($sign_posn) {
case 0: $n = "($n)"; break;
case 1: $n = "$sign$n"; break;
case 2: $n = "$n$sign"; break;
case 3: $n = "$sign$n"; break;
case 4: $n = "$n$sign"; break;
default: $n = "$n [error sign_posn=$sign_posnamp;nbsp;!]";
}
// Currency format:
$currency_symbol = strtolower($currency_symbol);
$m = number_format(abs($number), $frac_digits,
$mon_decimal_point, $mon_thousands_sep);
if ($sep_by_space amp;amp; !$noSpace) $space = ' '; else $space = '';
if ($cs_precedes amp;amp; !$forceRight) $m = "$currency_symbol$space$m";
else $m = "$m$space$currency_symbol";
$m = str_replace(' ', 'amp;nbsp;', $m);
switch($sign_posn) {
case 0: $m = "($m)"; break;
case 1: $m = "$sign$m"; break;
case 2: $m = "$m$sign"; break;
case 3: $m = "$sign$m"; break;
case 4: $m = "$m$sign"; break;
default: $m = "$m [error sign_posn=$sign_posnamp;nbsp;!]";
}
if ($isMoney) return $m; else return $n;
}
}