web-dev-qa-db-ja.com

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

出力:

六月

代わりに

ジュニ

助言がありますか?

  • Sshまたは他のシェルアクセスがありません。
  • スクリプトは、Linuxサーバーで実行されています。

PHPバージョン5.6

60
toesslab

このソリューションは、サーバーへのシェルアクセスがない場合に役立ちます。

シェルアクセスがある場合は、 ベンジャミンセイラーの答え が最適です!

他の可能性はないので(シェル)、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;
10
toesslab

スクリプトを実行しているサーバーにドイツ語ロケールがインストールされていない可能性が非常に高い-サーバーへのシェルアクセスがありますか?それから試して

locale -a

インストールされているロケールを確認します。こちらもご覧ください setlocaleに依存し、インストールされているロケールに依存することは可能ですか?

89

あなたのコードは正しいです。おそらく、スクリプトを実行しているサーバーに正しい言語パッケージをインストールする必要があります。

ターミナルで、使用する言語がコマンド_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
_

次に、あなたがしたようにsetlocale(...)を使用することでPHPでこれらの言語を設定することができます。


注: 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の両方が表示され、setlocale(LC_ALL, 'fr_FR.iso88591');

28
svassr

Date()を探してここに来る人のために、月と曜日の名前をローカライズしません:

==注意を払う==

date()は英語でのみ月/日の名前を返すことができ、他の言語の翻訳を提供することはできません。

19
Rico Neitzel

「setlocale」saisのPHPマニュアルページ

注:setlocale()の戻り値は、PHPが実行されているシステムによって異なります。システムのsetlocale関数が返すものを正確に返します。

ルートアクセス(debian)を持っている場合の解決策は次のとおりです。

編集する

/etc/locale.gen

使用する必要があるロケールを追加/削除できます。ファイルを保存した後、次を実行します。

locale-gen

そして、あなたは大丈夫でなければなりません。サーバーで変更を確認するには、Apacheを再起動する必要がありました。

6
trojan

これを試してください:

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

基盤となるOSに応じて"de_DE"およびその他の文字列が間違っている可能性があります。

Windowsでは、次のリストを参照してください。

通常、Winでは「DEU」または「GERMAN」です。

すでに言及した:

Linuxでは、シェルコマンドですべてのロケールを表示できます。

locale -a
4
Bernd Ott

私の場合、これは機能しません:

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
[...]
2
Michael Käfer