2012-06-06 7 views
43

La funzione setlocale() non imposta la lingua desiderata (tedesco).PHP setlocale non ha effetto


L'obiettivo è di generare i nomi dei mesi.

Questo è il mio codice di prova con le prove finora:

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

uscita:

giugno

invece di

Juni

Qualche suggerimento?

  • Non ho accesso shell o altro.
  • Lo script è in esecuzione su un server linux.
+0

Quindi avete provato altre versioni delle impostazioni locali tedesche, ad esempio 'setlocale (LC_ALL, 'de_DE @ euro', 'de_DE', 'de', 'ge');'? –

+0

Dovresti controllare se la modifica della lingua è riuscita esaminando il valore di ritorno di 'setLocale' – velop

risposta

8

Questa soluzione potrebbe aiutare se non si ha accesso alla shell al server.

Se si dispone di accesso shell, quindi Benjamin Seiller's answer è il migliore!

Poiché non ho altre possibilità (shell), ho trovato una soluzione con solo PHP utilizzando IntlDateFormatter class.

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

È molto probabile che il locale tedesco non sia installato sul server su cui è in esecuzione lo script - avete accesso alla shell al server? quindi provare

locale -a 

per vedere quali locali sono installati. Anche dare un'occhiata qui Is it feasible to rely on setlocale, and rely on locales being installed?

+1

Thx per la risposta rapida, improbabile che non abbia accesso alla shell. il tuo link mi ha aiutato: –

+1

Siamo spiacenti e lieto di sentirlo. Ti dispiacerebbe segnalare la mia risposta come "risposta" allora? :) –

+2

Se non si ha accesso alla shell, è possibile provare anche in PHP: 'server ('locale -a');' per trovare i nomi delle localizzazioni installate sul proprio server. –

3

provare questo:

date_default_timezone_set('Europe/Berlin'); 
$loc=setlocale(LC_ALL, '[email protected]', 'de_DE', 'deu_deu'); 
echo strftime('%B'); 
22

Il codice è corretto. Probabilmente devi solo installare il pacchetto di lingua corretto sul server su cui stai eseguendo lo script.

Nel terminale se la lingua che si desidera utilizzare non è elencato quando si esegue il comando sudo locale -a, allora dovrete installarlo eseguendo il comando seguente:

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

(sudo qui è facoltativo se la vostra l'utente ha i permessi di root)

Quindi se si ricontrolla con sudo locale -a si dovrebbe vedere .

Se si desidera installare il pacchetto francese di lingua corsa

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

Poi ti sarà permesso di impostare la lingua di questi in PHP utilizzando setlocale(...) esattamente come avete fatto.


Nota: Se siete in un progetto non utf8 è necessario generare altri formati di pacchetti installati. Ecco come procedere su Ubuntu (questo lavoro su Debian pure):

modificare /var/lib/locales/supported.d/cs e aggiungere le seguenti righe

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

ed eseguire

sudo dpkg-reconfigure locales 

Poi eseguendo nuovamente sudo locale -a si dovrebbe vedere sia fr_FR.iso88591 e fr_CA.iso88591 nella lista e si può utilizzare in php chiamando setlocale(LC_ALL, 'fr_FR.iso88591');

+1

Dopo 'install-language-pack fr_FR' Avevo bisogno di usare la soluzione @ sephoy08:' setlocale (LC_ALL, 'fr_FR @ euro', 'fr_FR', 'fra_fra'); 'e funziona bene. grazie – Meloman

5

PHP manual page for 'setlocale' sais:

Nota: Il valore restituito da setlocale() dipende dal sistema che PHP è in esecuzione. Restituisce esattamente ciò che restituisce la funzione setlocale di sistema.

Se si ha accesso root (debian) ecco la soluzione:

modificare

/etc/locale.gen 

È possibile aggiungere/rimuovere cui locali è necessario utilizzare. Dopo aver salvato il file eseguito:

locale-gen 

e si dovrebbe andare bene. Sul mio server ho dovuto riavviare Apache per vedere le modifiche.

7

Per chi viene qui in cerca di data() non localizzare i nomi dei mesi e nei giorni feriali:

== Attenzione: =

date() è in grado di restituire solo i nomi di mese/giorno in inglese e non sarà in grado di fornire traduzioni per altri linguaggi età.

+0

finalmente trovato quello che sono venuto qui per trovare. Grazie ... ho provato tutte le supposizioni e nessun effetto :(È un po 'fastidioso che la data sia così –

-1

Grazie a Rico Neitzel per il suggerimento. Invece di provare a formattare la data php, usa strftime. a vedere le prime 3 lettere del nome del mese nella tua lingua (Es Dez invece di dicembre da Dezembro e non di dicembre.), Seguire le istruzioni locale instalation di cui sopra, e poi: il comando

: Data ('d M Y ') // impossibile cambiare dall'inglese

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); 
} 
} 
-1

Se il vostro sono su una macchina Red Hat è possibile eseguire:

localedef -v -c -i de_DE -f UTF-8 de_DE.UTF-8 

quindi riavviare y il nostro server Apache