PHP setlocale не влияет

Функция setlocale() не задает нужный язык (немецкий).


Цель состоит в том, чтобы вывести имена месяцев.

Это мой тестовый код с испытаниями до сих пор:

 <?php date_default_timezone_set('Europe/Berlin'); setlocale(LC_ALL, 'de_DE.utf8'); // Or setlocale(LC_ALL, 'de_DE@euro'); // Or setlocale(LC_ALL, 'de_DE'); // Or setlocale(LC_ALL, 'de'); // Or setlocale(LC_ALL, 'ge'); echo strftime('%B'); 

Вывод:

июнь

вместо

Juni

Какие-либо предложения?

  • У меня нет ssh или другого доступа к оболочке.
  • Скрипт выполняется на сервере Linux.

Вполне вероятно, что немецкий язык не установлен на сервере, на котором запущен скрипт, – есть ли у вас доступ к серверу? Затем попробуйте

 locale -a 

чтобы узнать, какие локали установлены. Также посмотрите здесь. Можно ли полагаться на setlocale и полагаться на локали, которые устанавливаются?

Ваш код верен. Вероятно, вам просто нужно установить правильный языковой пакет на сервере, на котором запущен скрипт.

В терминале, если язык, который вы хотите использовать, не указан при запуске команды 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(...) точности так же, как вы это сделали.

Примечание. Если вы работаете в проекте non 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');

Это решение может помочь, если у вас нет доступа к серверу.

Если у вас есть доступ к оболочке, то ответ Беньямина Сейлера лучший!

Поскольку у меня нет других возможностей (оболочки), я нашел решение только с PHP, используя класс IntlDateFormatter .

 <?php // Example vars $month = '6'; // 1-12 $year = '2014'; // four digit year $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; 

Для тех, кто приезжает сюда в поисках даты (), не локализует имена месяца и дня недели:

== Pay Attention ==

date () может только возвращать имена месяца / дня на английском языке и не сможет передавать вам переводы для других языков.

Справочная страница PHP для «setlocale» :

Примечание. Возвращаемое значение setlocale () зависит от системы, в которой работает PHP. Он возвращает именно то, что возвращает функция setlocale системы.

Если у вас есть root-доступ (debian), вот решение:

редактировать

 /etc/locale.gen 

Вы можете добавить / удалить те локали, которые вам нужны. После сохранения файла выполните:

 locale-gen 

и все должно быть в порядке. На моем сервере мне пришлось перезапустить Apache, чтобы увидеть изменения.

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

 date_default_timezone_set('Europe/Berlin'); $loc=setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu'); echo strftime('%B'); 

В зависимости от базовой ОС "de_DE" и других может быть неправильная строка.

В Windows ссылаются на эти списки:

Обычно это «DEU» или «GERMAN» под Win.

Уже упоминалось:

В Linux вы можете увидеть все локали с помощью команды оболочки:

 locale -a 

Спасибо Рико Нейтцелю за подсказку. Вместо того, чтобы пытаться отформатировать дату php, используйте strftime. Чтобы увидеть первые 3 буквы месяца на вашем языке (например, Dez вместо Dec от Dezembro, а не декабрь), следуйте инструкциям по установке языкового стандарта выше, а затем:

date date: 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); } } 

Если вы находитесь на машине Red Hat, вы можете запустить:

 localedef -v -c -i fr_FR -f UTF-8 fr_FR.UTF-8 

Затем перезапустите сервер Apache