Функция 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
Какие-либо предложения?
Вполне вероятно, что немецкий язык не установлен на сервере, на котором запущен скрипт, – есть ли у вас доступ к серверу? Затем попробуйте
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