Domanda

Voglio iniziare a usare gettext per gestire le mie traduzioni su progetti web (PHP 5). Dal momento che è uno standard ampiamente utilizzato con una buona reputazione, sembra essere la scelta migliore.

Tuttavia, sto anche sentendo cose sul server in modo incompatibile ed essendo non thread-safe. Cosa significa questo per i miei progetti che lo usano allora? Dal momento che costruisco cose che molte persone usano, è molto importante che il mio codice funzioni.

Stiamo parlando di problemi minori (come le persone che usano ancora PHP 4) o di problemi importanti come la distribuzione e l'installazione di gettext su websevers che sono bassi?

È stato utile?

Soluzione

Il problema con i thread si applica solo se si utilizza PHP incorporato (ad esempio il mod-php di Apache) e si esegue un server che utilizza thread (come il server Apache con worker-mpm).

Quindi - il problema di sicurezza del thread non si applica a te se:

  1. usi il server NGINX (non usa i thread.)
  2. Usi Apache (con MPM threaded o no) e PHP in modalità fastcgi
  3. Usi Apache con MPM senza thread (come prefork-MPM) e PHP in modalità mod-php.

Quindi - la maggior parte delle persone con un'installazione predefinita di Apache non dovrebbe preoccuparsi che gettext non sia thread-safe, poiché l'installazione di apache predefinita nella maggior parte delle distro utilizza prefork-MPM non thread!

P.S. inoltre, tieni presente che Apache su Windows è thread.

Altri suggerimenti

Penso che giocare un po 'di più con la parte dei commenti del manuale php dovrebbe rivelare più informazioni .... uno dei commenti del manuale sulla sezione gettext

  

La libreria GNU gettext funziona su a   per processo, non per thread.   Ciò significa che in un multiutente   impostazioni come il web server Apache   funzionerà solo con un MPM prefork   (ovvero un processo per utente). Lavoratore   e altri MPM threaded non funzioneranno.

     

Inoltre, molti utenti controllano GNU   gettext impostando l'ambiente di sistema   variabili come LANG. Questo non è un   buona soluzione per un web server   ambiente a causa di una razza ovvia   condizioni.

http://www.php.net/manual/en/gettext .setup.php

Ho avuto lo stesso problema con PHP 5.6.30 VC11 Theard Safe su Windows 10. Soluzione alternativa trovata e risolta questo problema qui di sirio3mil.

Apparentemente PHP con TS può accedere solo alla cartella della lingua Locale. Quindi, quando la funzione setlocale e putenv è chiamata con un'altra lingua rispetto a quella del sistema, la cartella con .mo e .po non può essere letta.

Per risolvere il problema, è necessario disporre di una sola cartella della lingua con la lingua del sistema e più coppie di file .mo / .po per ciascuna lingua tradotta. Il dominio verrà impostato nella lingua desiderata.

Esempio con francese svizzero, tedesco e italiano:

Struttura delle cartelle

  

\ Impostazioni locali \ fr_CH \ LC_MESSAGES

     
      
  • fr_CH.mo + fr_CH.po // lingua del sistema
  •   
  • de_CH.mo + de_CH.po
  •   
  • it_CH.mo + it_CH.po
  •   

Codice

$lang = 'fr_CH' or 'de_CH' or 'it_CH'

bindtextdomain($lang, '.\Locale');
textdomain($lang);
bind_textdomain_codeset($lang, 'UTF-8');
setlocale (LC_ALL, $lang);
putenv('LC_ALL=' . $lang);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top