la mejor manera de hacer que el sitio web de codeigniter sea multilingüe. ¿Llamar desde matrices lang depende de la sesión lang?

81

Estoy investigando horas y horas, pero no pude encontrar una forma clara y eficiente de hacerlo: /

Tengo un sitio web base de codeigniter en inglés y ahora tengo que agregar un idioma polaco. ¿Cuál es la mejor manera de hacer mi sitio en 2 idiomas dependiendo de la selección de visitantes?

¿Hay alguna forma de crear archivos de matriz para cada idioma y llamarlos en los archivos de vista dependiendo de la sesión desde la selección de idioma? No quiero usar la base de datos.

¡Apreciamos las ayudas! Me estoy quedando sin fecha límite: / ¡¡Gracias !!

diseñador-probando-codificación
fuente
1
Todas las respuestas publicadas aquí son geniales, pero al usarlas, pierde la opción de cobro de sus páginas, ya que es un controlador que se almacenará en caché y estará en el último idioma que configuró. ¿Existe una solución para este otro y luego usa un controlador diferente? para todos los idiomas.

Respuestas:

93

¿Has visto la biblioteca de idiomas de CodeIgniter ?

La clase de idioma proporciona funciones para recuperar archivos de idioma y líneas de texto con fines de internacionalización.

En la carpeta del sistema CodeIgniter, encontrará uno llamado idioma que contiene conjuntos de archivos de idioma. Puede crear sus propios archivos de idioma según sea necesario para mostrar mensajes de error y otros en otros idiomas.

Los archivos de idioma generalmente se almacenan en su directorio de sistema / idioma. Alternativamente, puede crear una carpeta llamada idioma dentro de la carpeta de su aplicación y almacenarla allí. CodeIgniter buscará primero en el directorio de su aplicación / idioma. Si el directorio no existe o el idioma especificado no se encuentra allí, CI buscará en su sistema global / carpeta de idiomas.

En tu caso...

  • necesitas crear un polish_lang.phpy english_lang.phpadentroapplication/language/polish
  • luego crea tus claves dentro de ese archivo (p. ej. $lang['hello'] = "Witaj";
  • luego cárguelo en su controlador como $this->lang->load('polish_lang', 'polish');
  • luego busque la línea como $this->lang->line('hello');Simplemente almacene el valor de retorno de esta función en una variable para que pueda usarla en su vista.

Repita los pasos para el idioma inglés y todos los demás idiomas que necesite.

Randell
fuente
gracias por una respuesta rápida, sí, he visto esto. pero en realidad no está claro: / sobre cómo hacer mi necesidad, dónde crear archivos lang, qué formato, qué tipo de estructura, cómo llamar, etc ... Soy bastante nuevo en codeigniter. por eso estaba buscando un tutorial claro o algo. : /
diseñador-probando-codificación
1
hola es genial, funciona bien: D muchas gracias por la ayuda! salvavidas eres! :) gracias
diseñador-probando-codificación
2
Esta es la solución para texto no editable, pero no cubre ningún contenido en varios idiomas almacenado y recuperado de una base de datos. Un sitio en varios idiomas con un sistema de gestión de contenido personalizado hecho con CI necesitará más que esto. Hice el mío propio, con la ayuda de un segmento de idioma en la URL y / o un segmento de alias único que identifica un único contenido en un único idioma. Todavía no he descubierto cómo gestionar mejor esto. Por eso me topé con este hilo.
Luis Martin
@Randell está funcionando, pero ¿puede explicar en detalle cómo traducir a otro idioma con un clic ... quiero decir, es para almacenar en sesiones? cómo
@Nadh, es mejor publicar su pregunta en un hilo nuevo, para que podamos mantener las discusiones concisas.
Randell
22

Además, para agregar el idioma a la sesión, definiría algunas constantes para cada idioma, luego me aseguraría de tener la biblioteca de sesión cargada automáticamente en config / autoload.php, o la cargaría cuando la necesite. Agregue el idioma deseado de los usuarios a la sesión:

$this->session->set_userdata('language', ENGLISH);

Entonces puedes agarrarlo en cualquier momento así:

$language = $this->session->userdata('language');
Matthew Rapati
fuente
sí, este era mi otro problema. ya me ayudaste: D ¡muy bien! También estaba pensando en usar cookies para recordar la selección de idioma del visitante.
diseñador-probando-codificación
1
¿Dónde debo definir estas sesiones? Creo que no es bueno definirlos en los controladores para cada página. debe ser una forma que defino en un archivo global y afecta a todo el sitio. ¡¡Gracias!!
diseñador-probando-codificación
De alguna manera, hay una mejor manera de hacer esto. Pero esa es una pregunta completamente nueva. Pero esto también se puede hacer solo para comenzar.
Randell
7

En el controlador agregue las siguientes líneas cuando haga el cunstructor

es decir, después

padre :: Controlador ();

agregue debajo de las líneas

    $this->load->helper('lang_translate');
    $this->lang->load('nl_site', 'nl'); // ('filename', 'directory')

cree el archivo auxiliar lang_translate_helper.php con la siguiente función y colóquelo en el directorio system \ application \ helpers

function label($label, $obj)
{
    $return = $obj->lang->line($label);
    if($return)
        echo $return;
    else
        echo $label;
}

para cada uno de los idiomas, cree un directorio con una abreviatura del idioma como en, nl, fr, etc., en system \ application \ languages

cree un archivo de idioma en el directorio anterior (respectivo) que contendrá la matriz $ lang con pares de etiquetas => language_value como se indica a continuación

nl_site_lang.php

$lang['welcome'] = 'Welkom';
$lang['hello word'] = 'worde Witaj';

en_site_lang.php

$lang['welcome'] = 'Welcome';
$lang['hello word'] = 'Hello Word';

puede almacenar varios archivos para el mismo idioma de manera diferente según el requisito, por ejemplo, si desea un archivo de idioma separado para administrar el backend (sección de administrador), puede usarlo en el controlador como $ this-> lang-> load ('nl_admin', ' nl ');

nl_admin_lang.php

$lang['welcome'] = 'Welkom';
$lang['hello word'] = 'worde Witaj';

y finalmente para imprimir la etiqueta en el idioma deseado, acceda a las etiquetas como se muestra a continuación

label ('bienvenido', $ esto);

O

label ('hola palabra', $ esto);

tenga en cuenta el espacio en hola y palabra, puede usarlo de esta manera también :)

cuando no hay una etiqueta definida en el archivo de idioma, simplemente imprimirá lo que pasó a la etiqueta de la función.

YoGo
fuente
1

Secundo la respuesta de Randell.

Sin embargo, siempre se puede integrar un GeoIP como http://www.maxmind.com/app/php o http://www.ipinfodb.com/ . Luego, puede guardar los resultados con la clase de sesión de codeigniter.

Si desea utilizar la api de ipinfodb.com, puede agregar el archivo ip2locationlite.class.php a la carpeta de la biblioteca de la aplicación codeigniter y luego crear una función de modelo para hacer cualquier lógica geoip que necesite para su aplicación, como:

function geolocate()
{
    $ipinfodb = new ipinfodb;
    $ipinfodb->setKey('API KEY');

    //Get errors and locations
    $locations = $ipinfodb->getGeoLocation($this->input->ip_address());
    $errors = $ipinfodb->getError();

   //Set geolocation cookie
   if(empty($errors))
   {
       foreach ($locations as $field => $val):
            if($field === 'CountryCode')
            {
                $place = $val;
            }
       endforeach;
   }
   return $place;
}
Ben Mullikin
fuente
3
Detectar el idioma basado en la IP no funciona muy bien. Piense en VPN, viajeros, emigrantes o simplemente países con varios idiomas como Canadá o China. Es mejor utilizar el idioma de los navegadores.
PiTheNumber
1

Para un uso más fácil, CI ha actualizado esto para que pueda usar

$this->load->helper('language');

y traducir texto

lang('language line');

y si desea deformarlo dentro de la etiqueta, use el parámetro opcional

lang('language line', 'element id');

Esto saldrá

// becomes <label for="form_item_id">language_key</label>

Para una buena lectura http://ellislab.com/codeigniter/user-guide/helpers/language_helper.html

Samy Massoud
fuente
1

He utilizado la clase MY_Language de Wiredesignz con gran éxito.

Lo acabo de publicar en github, ya que parece que no puedo encontrar ningún rastro de él en ninguna parte.

https://github.com/meigwilym/CI_Language

Mis únicos cambios son cambiar el nombre de la clase a CI_Lang, de acuerdo con los nuevos cambios v2.

Mei Gwilym
fuente
¿Por qué la gente siente la necesidad de usar global? Es fácil pero puede crear grandes problemas.
Starlays
0

Al administrar los archivos reales, las cosas pueden desincronizarse con bastante facilidad, a menos que esté realmente atento. Así que hemos lanzado un servicio gratuito (beta) llamado String que le permite realizar un seguimiento de sus archivos de idioma fácilmente y colaborar con traductores.

Puede importar archivos de idioma existentes (en formato PHP array, PHP Define, ini, po o .strings) o crear sus propias secciones desde cero y agregar contenido directamente a través del sistema.

String es totalmente gratis, así que compruébalo y dinos lo que piensas.

¡En realidad también está construido sobre Codeigniter! Consulte la versión beta en http://mygengo.com/string

user151516
fuente
Este es realmente un buen punto; Los archivos de idioma de CI no son fáciles de mantener a lo largo del tiempo.
sourcejedi
0

Estoy usando dicho código en config.php:

$lang = 'ru'; // this language will be used if there is no any lang information from useragent (for example, from command line, wget, etc...

if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
$tmp_value = $_COOKIE['language'];
if (!empty($tmp_value)) $lang = $tmp_value;
switch ($lang)
{
    case 'ru':
        $config['language'] = 'russian';
        setlocale(LC_ALL,'ru_RU.UTF-8'); 
        break;
        case 'uk':
        $config['language'] = 'ukrainian';
        setlocale(LC_ALL,'uk_UA.UTF-8'); 
                break;
        case 'foo':
        $config['language'] = 'foo';
        setlocale(LC_ALL,'foo_FOO.UTF-8'); 
                break;
        default:
        $config['language'] = 'english';
        setlocale(LC_ALL,'en_US.UTF-8'); 
        break;
}

.... y luego estoy usando el mecanismo interno habitual de CI

¡Oh, casi lo olvidas! en las vistas, utilizo botones, que configuran la cookie "idioma" con el idioma, preferido por el usuario.

Entonces, primero este código intenta detectar el "idioma preferido" configurado en el user`s useragent (navegador). Luego, el código intenta leer el "idioma" de las cookies. Y finalmente, el interruptor establece el idioma para la aplicación CI

Dmitry Khartsy
fuente
-1

puedes hacer una función como esta

function translateTo($language, $word) {  
   define('defaultLang','english');  
   if (isset($lang[$language][$word]) == FALSE)  
      return $lang[$language][$word];  
   else  
      return $lang[defaultLang][$word];  
}
gracias
fuente
6
Este es un ejemplo de mala programación, sin ofender. NO defina constantes en una función. Por eso se llama constante, su valor no cambia, por lo que se definirá solo una vez. En segundo lugar, el código isset($lang[$language][$word]) == FALSEsería suficiente así isset($lang[$language][$word]), porque isset solo devuelve verdadero y falso. Y tercero, cuando evalúe si algo es falso SIEMPRE use ===para verificar el tipo .
machineaddict
-1

Amigo, no se preocupe, si tiene alguna aplicación instalada en codeigniter y desea agregar algún paquete de idioma, simplemente siga estos pasos:

1. Agregue archivos de idioma en la carpeta application / language / arabic (agrego idioma árabe en sma2 construido en ci)

2. Vaya al archivo nombrado setting.phpen application / modules / settings / views / setting.php . Aquí encuentras la matriz

<?php /*

 $lang = array (
  'english' => 'English',

  'arabic' => 'Arabic',  // i add this here

  'spanish' => 'Español'

Ahora guarda y ejecuta la aplicación. Ha funcionado bien.

cabeza de serpiente
fuente
no hay ningún archivo nombrado setting.phpsi ha utilizado alguna biblioteca o ayuda, por favor compártelo primero.
Ali Qorbani