itsource

PHP setlocale이 작동하지 않음

mycopycode 2022. 9. 16. 23:11
반응형

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');

출력:

6월.

대신

주니

좋은 의견이라도 있나?

  • SSH나 다른 셸 액세스 권한이 없습니다.
  • 스크립트가 Linux 서버에서 실행되고 있습니다.

PHP 버전 5.6

스크립트를 실행하고 있는 서버에 독일어 로케일이 설치되어 있지 않을 가능성이 높습니까?서버에 셸 액세스 할 수 있습니까?그럼 해봐

locale -a

어떤 로케일이 인스톨 되어 있는지를 확인합니다., 여기도 봐 주세요.셋로케일에 의존하고, 인스톨 되고 있는 로케일에 의존하는 것이 실현 가능합니까?

date() 이름은 .

== 주목 ==

date()는 영어로만 월/일 이름을 반환할 수 있으며 다른 언어의 번역은 할 수 없습니다.

strftime()대!!

당신의 코드는 정확합니다.스크립트를 실행하고 있는 서버에 올바른 언어 패키지를 인스톨 하면 되는 경우가 있습니다.

한 후 하는 언어가 되지 않는 sudo locale -a 다음하여 누락된

sudo /usr/share/locales/install-language-pack de_DE 

)sudo사용자가 루트 권한을 가지고 있는 경우는, 여기서 옵션입니다).

다시 한 번.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.iso88591fr_CA.iso88591이 모두 표시되며 php에서 사용할 수 있습니다.setlocale(LC_ALL, 'fr_FR.iso88591');

이 솔루션은 서버에 대한 셸 액세스 권한이 없는 경우에 도움이 될 수 있습니다.

셸 액세스 권한이 있다면 벤자민 실러의 답변이 최고입니다!

다른 가능성(셸)이 없기 때문에 IntlDateFormatter 클래스를 사용하여 PHP만의 솔루션을 찾았습니다.

<?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;

이것을 사용해 보세요.

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

'setlocale' sais에 대한 PHP 설명서 페이지:

주의: setlocale()의 반환값은 PHP가 실행하고 있는 시스템에 따라 달라집니다.시스템 setlocale 함수가 반환하는 것을 정확하게 반환합니다.

루트 액세스(debian)가 있는 경우는, 다음과 같이 해결합니다.

편집하다

/etc/locale.gen

사용할 로케일을 추가하거나 삭제할 수 있습니다.파일 실행 저장 후:

locale-gen

넌 괜찮을 거야서버에서 Apache를 재시작하여 변경 사항을 확인해야 했습니다.

내 경우 다음과 같이 동작하지 않습니다.

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
[...]
apt-get install -y locales locales-all

정말 고통스러웠어요.

날짜를 스페인어로 번역하고 싶었지만, 로컬 호스트에서는 동작하고 있었지만 서버에서는 동작하고 있지 않았습니다(Ubuntu 18).알고 보니 올바른 로케일 패키지가 없었습니다.

먼저 설치된 패키지가 없는지 확인했습니다.

locale -a

그리고 스크립트를 사용하여 스페인어 UTF를 설치했습니다.

sudo pkg-reconfigure locales

그리고 몇 시간 동안 테이블에 머리를 부딪혔어요. 당신이 아파치를 다시 시작해야 한다는깨닫기까지요!

sudo service apache2 restart

제 이야기는 여기까지입니다.도움이 됐으면 좋겠다.

기본 OS에 따라 다름"de_DE"다른 사람들은 잘못된 줄도 알고

Windows 에서는, 다음의 리스트를 참조해 주세요.

보통 Win 아래에는 "DEU" 또는 "Germany"로 표시됩니다.

이미 언급한 사항:

Linux 에서는 shell 명령어로 모든 로케일을 표시할 수 있습니다.

locale -a

PHP는 이상한 지원을 가지고 있습니다.setlocale()다른 버전으로.

아래 테스트는 Windows(동일한 머신), Apache 2.4 x 64(동일한 Web 서버), PHP x 64 TS(다른 버전)에서 실시합니다.

setlocale() 반품:

새 현재 로케일을 반환합니다.false플랫폼에 로케일 기능이 실장되어 있지 않은 경우 지정된 로케일이 존재하지 않거나 카테고리 이름이 비활성화됩니다.

그래서 저는 다른 버전의 PHP에서 아래의 테스트를 사용할 것입니다.PHP 7.0 - 8.1에서 테스트 완료.

var_dump(setlocale(LC_ALL, 'en_US'));

PHP 7.0, 7.1 반환'en_US'.
PHP 7.2+(또는 그 이후) 반환false.

var_dump(setlocale(LC_ALL, 'en-US'));

PHP 7.0+ 반환'en-US'.

또, 복수의 값을 사용해 테스트하는 경우, 어느 값이 받아들여질 수 있습니다.setlocale()기능.
저는 이 어레이를 사용합니다.

$locale = ['en_US.UTF-8', 'en-US.UTF-8', 'en.UTF-8', 'en-US', 'en_US', 'en'];
var_dump(setlocale(LC_ALL, $locale));

PHP 7.0, 7.1 반환'en_US.UTF-8'.
PHP 7.2+ 반환'en-US.UTF-8'.

보시다시피 PHP가 지원하는 경우'en_US'이전 버전의 경우 새 버전에서 지원되는 것은 아닙니다.

OP의 경우 이 어레이를 사용하여 어떤 로케일이 허용되는지 확인해 보십시오.

$locale = ['de_DE.UTF-8', 'de-DE.UTF-8', 'de.UTF-8', 'de_DE', 'de-DE', 'de', 'ge'];
var_dump(setlocale(LC_ALL, $locale));

Linux 또는 다른 OS에서는 결과가 다를 수 있습니다.

힌트를 준 리코 나이첼에게 감사한다.php 날짜를 포맷하는 대신 strftime을 사용합니다.사용하시는 언어의 첫 번째 3글자(예:12월이 아니라 Dezembro에서 Dec를 사용하는 대신 위의 로케일 설치 절차에 따라 다음 절차를 수행합니다.

date 명령어: date('d 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 de_DE -f UTF-8 de_DE.UTF-8

그런 다음 Apache 서버를 재시작합니다.

이것이 por php 7.4에 도움이 되기를 바랍니다.

스페인어로 날짜를 인쇄하려고 했더니 영문판이 나왔어요.

그래서 모든 언어 패키지를 터미널에서 인쇄합니다.

# locale -a

스페인어를 할 수 있는 사람은 아무도 없으니, 한 번 해 봐.

# sudo /usr/share/locales/install-language-pack es_ES

setlocale 코드를 다음과 같이 변경합니다.

<?php 
setlocale (LC_TIME, "es_ES", "es_ES.iso88591", "spanish");
?>

그런 다음 php 서비스를 재시작합니다.

/etc/init.d/php7.4-fpm restart

그리고 이것이 마지막입니다.

언급URL : https://stackoverflow.com/questions/10909911/php-setlocale-has-no-effect

반응형