PHP setlocale не влияет
Функция setlocale()
не устанавливает желаемый язык (немецкий).
Цель состоит в том, чтобы вывести названия месяцев.
Это мой тестовый код с испытаниями:
<?php
date_default_timezone_set('Europe/Berlin');
setlocale(LC_ALL, 'de_DE.utf8');
// Or
setlocale(LC_ALL, '[email protected]');
// Or
setlocale(LC_ALL, 'de_DE');
// Or
setlocale(LC_ALL, 'de');
// Or
setlocale(LC_ALL, 'ge');
echo strftime('%B');
Выход:
июнь
вместо
Juni
Какие-либо предложения?
- У меня нет доступа по ssh или другой оболочке.
- Скрипт работает на сервере Linux.
PHP версия 5.6
Ответы
Ответ 1
Это решение может помочь, если у вас нет доступа к серверу в оболочке.
Если у вас есть доступ к оболочке, то ответ Бенджамина Силлера - лучший!
Поскольку у меня нет никаких других возможностей (оболочка), я нашел решение с использованием только PHP с помощью класса IntlDateFormatter.
<?php
// Example vars
$month = '6';
$year = '2014';
$fmt = new IntlDateFormatter('de_DE',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'Europe/Berlin',
IntlDateFormatter::GREGORIAN);
$lastMonth = mktime(0, 0, 0, $month -1, 1, $year);
$showLastMonth = $fmt->format($lastMonth);
echo $showLastMonth;
Ответ 2
Вполне вероятно, что немецкий язык не установлен на сервере, на котором запущен script on - есть ли у вас доступ к серверу на shell?
Затем попробуйте
locale -a
чтобы узнать, какие локали установлены. Также смотрите здесь Можно ли полагаться на setlocale и полагаться на установленные локали?
Ответ 3
Ваш код правильный. Возможно, вам просто нужно установить правильный языковой пакет на сервере, на котором вы запускаете скрипт.
В терминале, если язык, который вы хотите использовать, не отображается после выполнения команды sudo locale -a
, вам придется установить отсутствующий язык, выполнив следующую команду:
sudo /usr/share/locales/install-language-pack de_DE
(sudo
здесь необязательно, если у вашего пользователя есть права root)
Затем, если вы дважды проверите с помощью sudo locale -a
вы должны увидеть de_DE.utf8
.
Если вы хотите установить пакет на французском языке, запустите
sudo /usr/share/locales/install-language-pack fr_FR
Тогда вам будет позволено установить свой язык на них в PHP, используя setlocale(...)
точно так же, как вы это сделали.
Примечание. Если вы работаете не в UTF8-проекте, вам необходимо сгенерировать другие форматы из установленных пакетов. Вот как действовать в Ubuntu (эта работа также и в Debian):
отредактируйте /var/lib/locales/supported.d/cs и добавьте следующие строки
fr_FR.iso88591 ISO-8859-1
fr_CA.iso88591 ISI-8859-1
и беги
sudo dpkg-reconfigure locales
Затем, запустив снова sudo locale -a
вы должны увидеть оба fr_FR.iso88591 и fr_CA.iso88591 в списке, и вы можете использовать его в php, вызвав setlocale(LC_ALL, 'fr_FR.iso88591');
Ответ 4
Для тех, кто приезжает сюда в поисках даты(), не локализует имена месяца и дня недели:
== Обратите внимание ==
date() может только возвращать имена месяца/дня на английском языке и не сможет передавать вам переводы для других языков.
Ответ 5
Попробуйте следующее:
date_default_timezone_set('Europe/Berlin');
$loc=setlocale(LC_ALL, '[email protected]', 'de_DE', 'deu_deu');
echo strftime('%B');
Ответ 6
Страница руководства PHP для 'setlocale' говорит:
Примечание. Возвращаемое значение setlocale() зависит от системы, в которой работает PHP. Он возвращает именно то, что возвращает системная функция setlocale.
Если у вас есть root-доступ (debian), вот решение:
редактировать
/etc/locale.gen
Вы можете добавить/удалить, какие локали вам нужно использовать. После сохранения файла запустите:
locale-gen
и ты должен быть в порядке. На моем сервере мне пришлось перезапустить Apache, чтобы увидеть изменения.
Ответ 7
В зависимости от базовой ОС "de_DE"
и других может быть неправильная строка.
В Windows ссылаются на эти списки:
Обычно это "DEU" или "GERMAN" под Win.
Уже упоминалось:
В Linux вы можете увидеть все локали с помощью команды оболочки:
locale -a
Ответ 8
В моем случае это не работает:
setlocale(LC_ALL, 'de_AT'); // false
пока это работает:
Locale::setDefault('de_AT'); // true
и это работает:
setlocale(LC_ALL, 'de_AT.utf-8'); // true
Вывод языковой программы:
$ locale -a
[...]
C.UTF-8
de_AT.utf-8
de_DE.utf-8
en_AG
[...]
Ответ 9
Спасибо Рико Нейтцелю за подсказку.
Вместо того, чтобы пытаться отформатировать дату php, используйте strftime.
Чтобы увидеть первые 3 буквы месяца на вашем языке (например, Dez вместо Dec от Dezembro, а не декабрь), следуйте инструкциям по установке языкового стандарта выше, а затем:
date command: date ('d M Y')//невозможно изменить с английского
setlocale( LC_ALL, "pt_BR"); // Portuguese, replace with your locale
echo strftime('%e %b %G');
result: "4 Dez 2016"
/**
* datelo funcion (date with locale)
* Credits: Sergio Abreu
* http://sites.sitesbr.net
* NOTE: Depend on availability of the locale in server.
*
*/
function datelo( $str, $locale='en_US', $time=null){
if( $time === null){ $time = time(); }
if ( preg_match("/[DlFM]/", $str)){
setlocale(LC_ALL, $locale);
$dict = array( 'd'=>'%d', 'D'=>'%a', 'j'=>'%e', 'l'=>'%A', 'N'=>'%u', 'w'=>'%w', 'F'=>'%B',
'm'=>'%m', 'M'=>'%b', 'Y'=>'%G', 'g'=>'%l', 'G'=>'%k', 'h'=>'%I', 'H'=>'%H', 'i'=>'%M',
's'=>'%S', 'S'=>'', 'z'=>'%j', 'n'=>'%m', ' '=>' ', '-'=>'-', '/'=>'/', ':'=>':', ','=>',');
$chars = preg_split("//", $str);
$nstr = '';
foreach ($chars as $c){
if ($c){ //skip empties
$nc = $dict[$c];
if( $c === 'n'){ // Fixes the extra zero
$nc = preg_replace("/^0+/", '', strftime( $nc));
}
elseif( $c === 'z'){ // Fixes the extra zero and decrease 1
$nc = preg_replace("/^0+/", '', strftime( $nc)); // 023 turns 23
$nc = intval($nc) - 1;
}
$nstr .= $nc;
}
}
return strftime( $nstr);
}else{ // not localized
return date( $str, $time);
}
}
Ответ 10
Если вы используете Red Hat, вы можете запустить:
localedef -v -c -i de_DE -f UTF-8 de_DE.UTF-8
Затем перезагрузите сервер Apache
Ответ 11
apt-get install -y locales locales-all