web-dev-qa-db-fra.com

PHP setlocale n'a aucun effet

La fonction setlocale() ne définit pas la langue souhaitée (allemand).


L'objectif est de générer les noms de mois.

Ceci est mon code de test avec des essais jusqu'à présent:

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

Sortie:

Juin

au lieu de

Juni

Aucune suggestion?

  • Je n'ai pas d'accès ssh ou autre Shell.
  • Le script est exécuté sur un serveur linux.

PHP version 5.6

60
toesslab

Cette solution pourrait vous aider si vous n'avez pas accès à Shell sur le serveur.

Si vous avez accès à Shell, alors réponse de Benjamin Seiller est le meilleur!

Comme je n’ai aucune autre possibilité (Shell), j’ai trouvé une solution avec seulement PHP en utilisant la classe 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

Est-il probable que les paramètres régionaux allemands ne soient pas installés sur le serveur sur lequel vous exécutez le script - avez-vous un accès Shell au serveur? Alors essaye

locale -a

pour voir quels paramètres régionaux sont installés. Jetez également un coup d'œil ici Est-il possible de s'appuyer sur setlocale et sur les environnements locaux installés?

89
Benjamin Seiller

Votre code est correct. Vous devez probablement simplement installer le package de langue correct sur le serveur sur lequel vous exécutez le script.

Dans le terminal, si la langue que vous souhaitez utiliser ne figure pas dans la liste après avoir exécuté la commande Sudo locale -a, Vous devrez installer la langue manquante en exécutant la commande suivante:

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

(Sudo ici optionnel si votre utilisateur a les droits root)

Ensuite, si vous vérifiez avec Sudo locale -a, Vous devriez voir de_DE.utf8.

Si vous voulez installer le paquet de langue française, lancez

Sudo /usr/share/locales/install-language-pack fr_FR

Ensuite, vous serez autorisé à définir votre langue sur PHP en utilisant setlocale(...)] exactement comme vous l'avez fait.


Note: Si vous êtes dans un projet non-utf8, vous devrez générer d'autres formats à partir de packages installés. Voici comment procéder sur ubuntu (ce travail sur debian également):

edit /var/lib/locales/support.d/cs et ajoutez les lignes suivantes

  fr_FR.iso88591 ISO-8859-1
  fr_CA.iso88591 ISI-8859-1

et courir

 Sudo dpkg-reconfigure locales

Puis en relançant Sudo locale -a Vous devriez voir les deux fr_FR.iso88591 et fr_CA.iso88591 dans la liste et vous pourrez les utiliser dans php en appelant setlocale(LC_ALL, 'fr_FR.iso88591');

28
svassr

Pour ceux qui viennent ici à la recherche de date (), les noms de mois et de semaine ne sont pas localisés:

== Faites attention ==

date () peut uniquement renvoyer les noms de mois/jour en anglais et ne pourra pas vous fournir de traduction pour d'autres langues.

19
Rico Neitzel

page de manuel PHP pour 'setlocale' sais :

Remarque: La valeur de retour de setlocale () dépend du système sur lequel PHP est en cours d'exécution. Il renvoie exactement ce que la fonction system setlocale renvoie.

Si vous avez un accès root (debian), voici la solution:

modifier

/etc/locale.gen

Vous pouvez ajouter/supprimer les paramètres régionaux à utiliser. Après avoir sauvegardé le fichier, lancez:

locale-gen

et ça devrait aller. Sur mon serveur, j'ai dû redémarrer Apache pour voir les changements.

6
trojan

Essaye celui-là:

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

En fonction du système d'exploitation sous-jacent "de_DE" et d'autres peut-être la mauvaise chaîne.

Sous Windows, référez-vous à cette liste:

C'est généralement "DEU" ou "GERMAN" sous Win.

Déjà mentionné:

Sous Linux, vous pouvez voir tous les paramètres régionaux avec la commande Shell:

locale -a
4
Bernd Ott

Dans mon cas, cela ne fonctionne pas:

setlocale(LC_ALL, 'de_AT'); // false

pendant que cela fonctionne:

Locale::setDefault('de_AT'); // true

et cela fonctionne:

setlocale(LC_ALL, 'de_AT.utf-8'); // true

Sortie du programme de localisation:

$ locale -a
[...]
C.UTF-8
de_AT.utf-8
de_DE.utf-8
en_AG
[...]
2
Michael Käfer