Подтвердить что ты не робот

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

4b9b3361

Ответ 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