Domanda

Domande aggiornate anziché fare una nuova domanda ...

Voglio davvero fornire alcune lingue alternative oltre all'inglese sul mio sito di social network che sto costruendo, questa sarà la mia prima volta a fare qualsiasi tipo di traduzione linguistica, quindi per favore abbiate pazienza con me.
Sto facendo delle ricerche, quindi sono pronto e aperto alle idee e ho già molte domande da fare.

1)
Cosa significa i18n, lo vedo spesso quando cerco una traduzione linguistica su SO?

2)
La maggior parte delle persone afferma di utilizzare gettext PHP ha un'estensione o un supporto per esso,
bene, ho fatto delle ricerche e ne ho una conoscenza di base, per quanto ne so, è molto lavoro da percorrere su questa strada,
Intendo codificare il mio sito per usare le sue funzioni cioè; _ ('ciao mondo sono in inglese per ora') oppure gettext ('ciao mondo sono in inglese per ora') non è un problema come qualsiasi percorso Vado lo richiederà.
Ma poi devi installare gettext sul tuo server e farlo funzionare,
quindi utilizzare alcuni editor speciali per creare file speciali e compilarli, penso?

Sembra un dolore, capisco che questo dovrebbe essere il percorso migliore da percorrere, beh, tutti sembrano dire che lo sia.
Qualcuno può dirmi perché questa è la strada da percorrere?

3)
Mi piace molto la semplicità di questo approccio, semplicemente costruendo un array di lingue e chiamando la frase che ti serve in una funzione come nell'esempio seguente  , dovresti quindi includere un file con l'array di lingue appropriato.

Quello che voglio davvero sapere è, sarebbe questo il metodo di prestazione meno migliore su un traffico elevato e un sito abbastanza grande rispetto all'utilizzo di gettext e se sì, puoi spiegare perché, per favore?

<?PHP
//Have seperate language files for each language I add, this would be english file
function lang($phrase){
    static $lang = array(
        'NO_PHOTO' => 'No photo\'s available',
        'NEW_MEMBER' => 'This user is new'
    );
    return $lang[$phrase];
}
//Then in application where there is text from the site and not from users I would do something like this
echo lang('NO_PHOTO');  // No photo's available would show here
?>

* un codice usato dalla risposta di brianreavis in basso

È stato utile?

Soluzione

Non reinventare la ruota. Utilizzare ad esempio gettext o Zend_Translate .

Altri suggerimenti

Probabilmente sarebbe meglio definire una funzione che gestisca la tua mappatura della lingua. In questo modo, se fai vuoi cambiare il modo in cui funziona in seguito, non sei costretto a cercare centinaia di script per i casi in cui hai usato $ lang [...] e sostituirli con qualcos'altro.

Qualcosa del genere funzionerebbe e sarebbe bello & amp; veloce:

function lang($phrase){
    static $lang = array(
        'NO_PHOTO' => 'No photo\'s available',
        'NEW_MEMBER' => 'This user is new'
    );
    return $lang[$phrase];
}

Rendi sicuro l'array viene dichiarato statico all'interno della funzione in modo che non venga riallocato ogni volta che viene chiamata la funzione. Ciò è particolarmente importante quando $ lang è veramente grande.

Per usarlo:

echo lang('NO_PHOTO');

Per gestire più lingue, basta definire questa funzione in più file (come en.php , fr.php , ecc.) e richiedono () quello appropriato per l'utente.

Potrebbe funzionare meglio:

function _L($phrase){
static 

Potrebbe funzionare meglio:

<?php
function setSessionLanguageToDefault() {
    $ip=

Potrebbe funzionare meglio:

function _L($phrase){
static 

Potrebbe funzionare meglio:

<*>

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

L = array( 'NO_PHOTO' => 'No photo\'s available', 'NEW_MEMBER' => 'This user is new' ); return (!array_key_exists($phrase,

Potrebbe funzionare meglio:

<*>

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

L)) ? $phrase :

Potrebbe funzionare meglio:

<*>

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

L[$phrase]; }

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

SERVER['REMOTE_ADDR']; $url='http://api.hostip.info/get_html.php?ip='.$ip; $data=file_get_contents($url); $s=explode (':',$data); $s2=explode('(',$s[1]); $country=str_replace(')','',substr($s2[1], 0, 3)); if ($country=='us') { $country='en'; } $country=strtolower(ereg_replace("[^A-Za-z0-9]", "", $country ));

Potrebbe funzionare meglio:

function _L($phrase){
static 

Potrebbe funzionare meglio:

<*>

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

L = array( 'NO_PHOTO' => 'No photo\'s available', 'NEW_MEMBER' => 'This user is new' ); return (!array_key_exists($phrase,

Potrebbe funzionare meglio:

<*>

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

L)) ? $phrase :

Potrebbe funzionare meglio:

<*>

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

L[$phrase]; }

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

SESSION["_LANGUAGE"]=$country; } if (!isset(

Potrebbe funzionare meglio:

function _L($phrase){
static 

Potrebbe funzionare meglio:

<*>

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

L = array( 'NO_PHOTO' => 'No photo\'s available', 'NEW_MEMBER' => 'This user is new' ); return (!array_key_exists($phrase,

Potrebbe funzionare meglio:

<*>

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

L)) ? $phrase :

Potrebbe funzionare meglio:

<*>

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

L[$phrase]; }

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

SESSION["_LANGUAGE"])) { setSessionLanguageToDefault(); } if (file_exists(APP_DIR.'/language/'.

Potrebbe funzionare meglio:

function _L($phrase){
static 

Potrebbe funzionare meglio:

<*>

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

L = array( 'NO_PHOTO' => 'No photo\'s available', 'NEW_MEMBER' => 'This user is new' ); return (!array_key_exists($phrase,

Potrebbe funzionare meglio:

<*>

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

L)) ? $phrase :

Potrebbe funzionare meglio:

<*>

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

L[$phrase]; }

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

SESSION["_LANGUAGE"].'.php')) { include(APP_DIR.'/language/'.

Potrebbe funzionare meglio:

function _L($phrase){
static 

Potrebbe funzionare meglio:

<*>

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

L = array( 'NO_PHOTO' => 'No photo\'s available', 'NEW_MEMBER' => 'This user is new' ); return (!array_key_exists($phrase,

Potrebbe funzionare meglio:

<*>

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

L)) ? $phrase :

Potrebbe funzionare meglio:

<*>

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

L[$phrase]; }

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

SESSION["_LANGUAGE"].'.php'); } else { include(APP_DIR.'/language/'.DEFAULT_LANG.'.php'); } ?>

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

L = array( 'NO_PHOTO' => 'No photo\'s available', 'NEW_MEMBER' => 'This user is new' ); return (!array_key_exists($phrase,

Potrebbe funzionare meglio:

<*>

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

L)) ? $phrase :

Potrebbe funzionare meglio:

<*>

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

L[$phrase]; }

Questo è quello che uso per ora. Se la lingua non viene trovata, restituirà la frase, anziché un errore.

Si noti che un array non può contenere più di ~ 65500 elementi. Dovrebbe essere abbastanza ma bene, solo dicendo.

Ecco un po 'di codice che utilizzo per verificare la lingua dell'utente:

<*>

Non è ancora stato fatto, ma penso che questo potrebbe essere di grande aiuto.

Non scrivere il tuo framework linguistico. Usa gettext . PHP ha standard che puoi installare.

Dato che le altre risposte non rispondono realmente a tutte le domande, ci proverò nella mia risposta e offrirò un'alternativa ragionevole.

1) I18n è l'abbreviazione di Internazionalizzazione e presenta alcune somiglianze con I-diciotto-n.

2) Secondo la mia onesta opinione, gettext è una perdita di tempo.

3) Il tuo approccio sembra buono. Quello che dovresti cercare sono le variabili di lingua. Il WoltLab Community Framework 2.0 implementa un sistema linguistico bidirezionale. Per una volta ci sono variabili di lingua che vengono salvate nel database e all'interno di un modello si usa solo il nome della variabile che verrà quindi sostituito con il contenuto della variabile nella lingua corrente (se disponibile). La seconda parte del sistema fornisce un modo per salvare il contenuto generato dall'utente in più lingue (richiesto in più lingue).

Fondamentalmente hai il testo dell'interfaccia definito dallo sviluppatore e il contenuto definito dall'utente. Il testo multilingue del contenuto viene salvato in variabili di lingua e il nome della variabile di lingua viene quindi utilizzato come valore per il campo di testo nella tabella dei contenuti specifica (poiché sono possibili anche contenuti in una sola lingua).

La struttura del WCF è purtroppo in un modo che riutilizzare il codice al di fuori del framework è molto difficile, ma puoi usarlo come ispirazione. L'ambito del sistema dipende esclusivamente da ciò che si desidera ottenere con il proprio sito. Se sarà grande, dovresti assolutamente dare un'occhiata al sistema WCF. Se è piccolo, alcuni file di lingua dedicati (de.php, en.php, ecc.), Da cui è incluso quello corretto per la lingua corrente,

Sfortunatamente gettext non funziona bene e ha problemi in varie situazioni come su diversi sistemi operativi (Windows o Linux) e farlo funzionare è molto difficile.

Inoltre richiede di impostare molti domini e variabili di ambiente e questo non ha alcun senso.

Se uno sviluppatore desidera semplicemente ottenere la traduzione di un testo, deve solo impostare il percorso del file .mo e ottenere la traduzione con una funzione come translate (" hello ", " en_EN "); Con gettext questo non è possibile.

perché non lo fai semplicemente come un array multidimensionale ... come questo

<?php

$lang = array(
    'EN'=> array(
        'NO_PHOTO'=>'No photo\'s avaiable',
        'NEW_MEMBER'=>'This user is new',
    ),
    'MY'=> array(
        'NO_PHOTO'=>'Tiada gambar',
        'NEW_MEMBER'=>'Ini adalah pengguna baru',
    )
);

?>

Puoi farlo:

class T {
const language = "English";
const home = "Home";
const blog = "Blog";
const forum = "Forum";
const contact = "Support";
}

Avresti un file come questo per ogni lingua. Per usare il testo:

There is no place like <?=T::home?>.

Il rovescio della medaglia è che se aggiungi una nuova costante, devi farlo per ogni file di lingua . Se ne dimentichi uno, la tua pagina si interrompe per quella lingua. È un po 'sgradevole, ma è efficiente poiché non ha bisogno di creare un array associativo di grandi dimensioni e probabilmente anche i valori vengono incorporati.

Forse l'accesso potrebbe essere migliorato, ad esempio:

class T {
    const home = "home";

    public static function _ ($name) {
        $value = @constant("self::$name");
        return $value ? $value : $name;
    }

    // Or maybe through an instance:
    public function __get ($name) {
        $value = @constant("self::$name");
        return $value ? $value : $name;
    }
}
echo "There is no " . T::_("place") . " like " . T::_("home");
$T = new T();
echo "There is no " . $T->place . " like " . $T->home;

Evitiamo ancora l'array e ci affidiamo a costante per fare la ricerca , che presumo sia più costoso rispetto all'utilizzo diretto delle costanti. Il lato positivo è che la ricerca può utilizzare un fallback quando la chiave non viene trovata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top