New question

Question:

Date: 13-01-2016 17:07:46 (In Spanish)

Internacionalización en PHP (Callback de traducción)[Resolved]

Me ha surgido una duda con respecto a la internacionalización...

Supongamos, el sitio está en 2 idiomas diferentes, sea el caso de inglés y español, el idioma por defecto (nativo) sería el español, pero cuando se esté en inglés pueda que no se haya traducido una parte.

Si se usa la inclusión de un archivo para cada idioma, como haría para hacer un callback por si no existe esa traducción?

Espero me haya explicado... Gracias de antemano...
Tags: Internationalization - PHP Votes: 2 - Answers: 2 - Views: 9 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 14-01-2016 02:46:11 Hola Jorge, podrías validar la existencia del archivo antes de hacer la inclusión, algo como:

    <?php
    $fileLang = 'ingles.php';
    if(!file_exists($fileLang)){
        $fileLang = 'espanol.php'; //traducción por defecto
    }
    include $fileLang;
    ?>


    O bien, podrías hacer la inclusión del archivo por defecto valiendote de la "exception" generada por el "include" cuando el archivo no existe (creo que este método es más performante, deberías hacer un benchmark de los dos métodos para confirmar esta suposición).

    <?php
    try{
        include $fileLang; //si la inclusión falla se salta al catch
    } catch (Exception $ex) {
       include 'espanol.php'; //traducción por defecto
    }
    ?>


    Saludos!
      Votes: 1 - Link answer
     
  • Date: 14-01-2016 10:00:53 Muchas gracias por la respuesta Fernando, se me ocurrió una idea en base a lo que mencionaste.

    Tengo una clase llamada Lang, el cual tiene un método llamado get, lo que hace es obtener mediante un archivo json el archivo donde están las traducciones del respectivo idioma, les comparto el código:

    LANGAPP: es una constante definida antes para especificar el idioma usado:


    // Archivo json del idioma ES
    {
    	"menuTop": {
    		"Home": "Inicio",
    		"Posts": "Posts",
    		"Galleries": "Galerías",
    		"Groups": "Grupos"
    	}
    }
    


    // Archivo json del idioma EN
    // Notar que falta la opción "Groups" en este archivo
    {
    	"menuTop": {
    		"Home": "Home",
    		"Posts": "Posts",
    		"Galleries": "Galeries",
    	}
    }
    


    # Archivo Index.php
    define("LANGAPP", "en");
    


    <?php
    
            # Archivo Lang.php para la clase
    	class Lang {
    
    		private static $default = "es";
    
    		public static function get($section, $option) {
    			$t = self::getOption(LANGAPP."/".LANGAPP, $section, $option);
    			if ($t[0]) {
    				$t = $t[1];
    			} else {
    				$t = self::getOption(self::$default."/".self::$default, $section, $option);
    				$t = $t[1];
    			}
    			// var_dump($t);
    			return $t;
    		}
    
    		private static function getOption($json, $section, $option) {
    			$dir = LANG.$json.".json";
    			if (file_exists($dir)) {
    				$t = file_get_contents($dir);
    				$t = (array) json_decode($t);
    				$s = (array) $t[$section];
    				if (array_key_exists($option, $s)) {
    					return [true, $s[$option]];
    				}
    			}
    			return [false, "{null}"];
    		}
    
    	}
    
    	echo Lang::get("menuTop", "Home");       # Retornaría "Home"
    	echo Lang::get("menuTop", "Galleries");  # Retornaría "Galleries"
    
    	echo Lang::get("menuTop", "Groups");
            # Retornaría "Grupos", ya que la opción no está en en.json, la busca
            # en el archivo de idioma por defecto
    


    Llamo la opción que quiero usar:

    Lang::get("menuTop", "Groups");

    En este caso me estaría obteniendo del archivo en.json. Sin embargo la opción de "Groups" no está especificada en dicho archivo (en.json), por lo que me tendría que hacer un "callback" (por así decirlo) y buscar esa opción en el archivo de idioma por defecto que sería es.json, de lo contrario si tampoco existiera me retornaría el valor "null".

    Espero me haya explicado bien, y espero les ayude...
      Votes: 1 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In
 
frjcbbae garagebible.com