Pregunta

Preguntas actualizadas en lugar de hacer una nueva pregunta ...

Realmente quiero proporcionar algunos idiomas alternativos además del inglés en el sitio de mi red social que estoy construyendo, esta será la primera vez que hago algún tipo de traducción de idiomas, así que tengan paciencia conmigo.
Estoy investigando, así que ya estoy abierto y abierto a ideas y ya tengo muchas preguntas.

1)
¿Qué significa i18n, lo veo a menudo al investigar la traducción de idiomas en SO?

2)
La mayoría de la gente dice que use gettext PHP tiene una extensión o soporte para ello,
bueno, lo he estado investigando y tengo un conocimiento básico del mismo, por lo que puedo decir, es mucho trabajo adicional para seguir esta ruta,
Me refiero a la codificación de mi sitio para usar sus funciones, es decir; _ ('hola mundo, estoy en inglés por ahora') o bien gettext ('hola mundo, estoy en inglés por ahora') no es un problema ya que cualquier ruta Voy a requerir eso.
Pero luego debe instalar gettext en su servidor y hacerlo funcionar,
luego usar algunos editores especiales para crear archivos especiales y compilarlos, creo?

Suena como un dolor, entiendo que se supone que esta es la mejor ruta a seguir, bueno, todo el mundo parece decir que es.
Entonces, ¿alguien puede decirme por qué esta es la ruta a seguir?

3)
Realmente me gusta la simplicidad de este enfoque, solo construyendo una matriz de idiomas y llamando la frase que necesita en una función como el ejemplo a continuación  , simplemente incluiría un archivo con la matriz de idioma adecuada.

Lo que realmente quiero saber es si este sería el mejor método de rendimiento en un sitio de alto tráfico y bastante grande en comparación con el uso de gettext y, de ser así, ¿puede explicar por qué?

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

* algún código utilizado de la respuesta de brianreavis a continuación

¿Fue útil?

Solución

No reinventes la rueda. Utilice, por ejemplo, gettext o Zend_Translate .

Otros consejos

Probablemente sería mejor definir una función que maneje su asignación de idioma. De esa manera, si lo hace desea cambiar la forma en que funciona más tarde, no está obligado a buscar cientos de scripts en los casos en que utilizó $ lang [...] y reemplazarlos con algo más.

Algo como esto funcionaría y sería agradable & amp; rápido:

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

Asegúrese de asegurarse de que la matriz se declara estática dentro de la función para que no se reasigne cada vez que se llama a la función. Esto es especialmente importante cuando $ lang es realmente grande.

Para usarlo:

echo lang('NO_PHOTO');

Para manejar múltiples idiomas, solo tiene esta función definida en múltiples archivos (como en.php , fr.php , etc.) y require () el apropiado para el usuario.

Esto podría funcionar mejor:

function _L($phrase){
static 

Esto podría funcionar mejor:

<?php
function setSessionLanguageToDefault() {
    $ip=

Esto podría funcionar mejor:

function _L($phrase){
static 

Esto podría funcionar mejor:

<*>

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

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

Esto podría funcionar mejor:

<*>

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

L)) ? $phrase :

Esto podría funcionar mejor:

<*>

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

L[$phrase]; }

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

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

Esto podría funcionar mejor:

function _L($phrase){
static 

Esto podría funcionar mejor:

<*>

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

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

Esto podría funcionar mejor:

<*>

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

L)) ? $phrase :

Esto podría funcionar mejor:

<*>

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

L[$phrase]; }

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

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

Esto podría funcionar mejor:

function _L($phrase){
static 

Esto podría funcionar mejor:

<*>

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

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

Esto podría funcionar mejor:

<*>

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

L)) ? $phrase :

Esto podría funcionar mejor:

<*>

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

L[$phrase]; }

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

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

Esto podría funcionar mejor:

function _L($phrase){
static 

Esto podría funcionar mejor:

<*>

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

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

Esto podría funcionar mejor:

<*>

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

L)) ? $phrase :

Esto podría funcionar mejor:

<*>

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

L[$phrase]; }

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

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

Esto podría funcionar mejor:

function _L($phrase){
static 

Esto podría funcionar mejor:

<*>

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

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

Esto podría funcionar mejor:

<*>

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

L)) ? $phrase :

Esto podría funcionar mejor:

<*>

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

L[$phrase]; }

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

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

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

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

Esto podría funcionar mejor:

<*>

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

L)) ? $phrase :

Esto podría funcionar mejor:

<*>

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

L[$phrase]; }

Eso es lo que uso por ahora. Si no se encuentra el idioma, devolverá la frase, en lugar de un error.

Debe tener en cuenta que una matriz no puede contener más de ~ 65500 elementos. Debería ser suficiente pero bueno, solo digo.

Aquí hay un código que utilizo para verificar el idioma del usuario:

<*>

Todavía no está hecho, pero bueno, creo que esto podría ayudar mucho.

No escriba su propio marco de lenguaje. Utilice gettext . PHP tiene enlaces estándar que puede instalar.

Como las otras respuestas realmente no responden todas las preguntas, iré por eso en mi respuesta además de ofrecer una alternativa sensata.

1) I18n es la abreviatura de Internacionalización y tiene algunas similitudes con I-eighteen-n.

2) En mi sincera opinión, gettext es una pérdida de tiempo.

3) Tu enfoque se ve bien. Lo que debes buscar son las variables de lenguaje. El WoltLab Community Framework 2.0 implementa un sistema de lenguaje bidireccional. Por una vez, hay variables de idioma que se guardan en la base de datos y dentro de una plantilla solo se usa el nombre de la variable que luego se reemplazará con el contenido de la variable en el idioma actual (si está disponible). La segunda parte del sistema proporciona una manera de guardar el contenido generado por el usuario en varios idiomas (se requiere entrada en varios idiomas).

Básicamente tiene el texto de interfaz que define el desarrollador y el contenido que define el usuario. El texto multilingüe del contenido se guarda en variables de idioma y el nombre de la variable de idioma se usa como valor para el campo de texto en la tabla de contenido específica (ya que también son posibles contenidos en un solo idioma).

La estructura de WCF es lamentablemente de una manera que reutilizar código fuera del marco es muy difícil, pero puede usarlo como inspiración. El alcance del sistema depende únicamente de lo que desea lograr con su sitio. Si va a ser grande, definitivamente debería echar un vistazo al sistema WCF. Si es pequeño, algunos archivos de idioma dedicados (de.php, en.php, etc.), desde los cuales se incluirá el correcto para el idioma actual,

Desafortunadamente gettext no funciona bien y tiene problemas en varias situaciones como en diferentes sistemas operativos (Windows o Linux) y hacer que funcione es muy difícil.

Además, requiere que establezca muchas variables de entorno y dominios y esto no tiene ningún sentido.

Si un desarrollador quiere simplemente obtener la traducción de un texto, solo debe establecer la ruta del archivo .mo y obtener la traducción con una función como translate (" hello ", " en_EN "); Con gettext esto no es posible.

¿por qué no lo haces como una matriz multidimensional ... como esta?

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

?>

Puedes hacer esto:

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

Tendrías un archivo como este para cada idioma. Para usar el texto:

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

La desventaja es que si agrega una nueva constante, debe hacerlo para cada archivo de idioma . Si olvida uno, su página salta para ese idioma. Eso es un poco desagradable, pero es eficiente ya que no necesita crear una gran matriz asociativa y posiblemente los valores incluso se alineen.

Quizás el acceso podría mejorarse, por ejemplo:

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;

Todavía evitamos la matriz y confiamos en constante para hacer la búsqueda , que supongo es más costoso que usar las constantes directamente. El lado positivo es que la búsqueda puede usar una reserva cuando no se encuentra la clave.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top