2010-10-28 8 views
5

Estoy desarrollando un sitio de redes sociales de nicho que se está volviendo multilingüe. Eso significa que nuestra estructura de URL actual pronto será necesario para empezar a utilizar palabras traducidas por las babosas como las siguientes:¿La mejor manera de lograr URL multilingües?

www.example.com/home convierte www.example.com/inicio

www.example.com/profile convierte www.example.com/perfil

www.example.com/help convierte www.example.com/ayuda

Y así sucesivamente. Mi pregunta es: ¿cuál es la mejor manera de apoyar esto en una aplicación PHP? Para las solicitudes de entrada, pensé un diccionario como el siguiente en mi archivo router.php sería suficiente:

<?php 
$request = explode("/", trim($_SERVER['REQUEST_URI'], "/")); 

// Dictionaries of page slugs. 
$slugs = array(
    'es' => array(
     'inicio' => 'home', 
     'perfil' => 'profile', 
     'ayuda' => 'help', 
    ) 
    // additional languages can be added here 
); 

// Rewrite any incoming (foreign) requests 
if ($host=="www.example.es") { // to be made programmatic 
    $lang = "es"; // pick up from locale constant rather being hard-coded 
    if (array_key_exists($request[0], $slugs[$lang])) { 
     $request[0] = $slugs[$lang][$request[0]]; 
    } 
} 

... 

Lo que básicamente tiene segmentos de URL y los compara con una contra-parte Inglés si es que existe. De lo contrario, continuará normalmente y probablemente genere un 404 ya que no existe un controlador para el segmento URL.

Aunque estas palabras, también necesito que sean compatibles con versiones anteriores. Por ejemplo, al construir URL en mi aplicación.

Naturalmente, como la aplicación solo es en inglés en este momento, solo están codificados. Así decir, al recuperar un objeto User hago lo siguiente:

<?php 
class User { 

    function __construct($id) { 
     // fetch user details 
     $this->profile_url = ROOT . "/profile/" . $this->username; 
    } 
} 

¿Cuál es el mejor método para reemplazar a continuación ejemplos de "/profile/" ser codificados de forma rígida a conseguir la versión traducida, es decir "/perfil/" en el sitio en español?

+0

¿Está utilizando algún tipo de marco de PHP, o se trata de un sistema codificado auto? – mth

+0

En el momento de la traducción, por lo general opto por almacenar páginas en una base de datos, haciendo referencia a ellas por identificación o nombre interno, y convertirlas en objetos completos con métodos como 'getUrl()' que pueden tener en cuenta la configuración regional. – Wrikken

+0

Los fragmentos de ruta traducidos son muy poco comunes. Mi instinto es evitar que esto sea demasiado flexible. – mario

Respuesta

1

Tengo algo similar en una aplicación que estoy desarrollando.

Cada página tiene una identificación única que se combina con un slug, título de página, metadescripción y tal para cada idioma en una tabla.

En cuanto a las personas que dicen que no es una práctica estándar y no molestarse con ella, no estoy de acuerdo ya que tener URL traducidas correctamente puede ayudar a tu SEO en diferentes idiomas.

+0

Exactamente mi razonamiento. Gracias por tu contribución. –

1

Bueno, un patrón común que he visto para php es crear un archivo php para cada idioma e inicializar un diccionario grande en el que las claves son las mismas para todos los idiomas.

Tiene una variable de sesión llamada lenguaje que inicialmente puede ser 'en' para inglés (o lo que prefiera), y luego incluir el comando "include (language. '/main.php');" en el que tiene una carpeta llamada 'en' que contiene todos los archivos php para incluir en las traducciones. Si main se vuelve demasiado grande, puede subdividir e incluir cualquier traducción que satisfaga sus necesidades (por ejemplo, un /en/forum.php para las traducciones de foros y un /en/blob.php para las traducciones de la página principal).

Tiene la gran ventaja de ser flexible y le permite controlar el idioma simplemente modificando una variable de sesión. Incluso puede hacer trucos como detectar la configuración del idioma del navegador y asignar el idioma de acuerdo con eso si aún no se ha definido en lugar de simplemente hacerlo en inglés.

+0

Sí. Espero utilizar una variable de configuración regional o constante junto con 'gettext' para determinar qué contenido de lenguaje y URL invocar. –

+0

Creo que la clave aquí es que no tiene que preocuparse por las URL. El cambio de idioma/cargar cosas se maneja en el servidor. –

1

siempre podía estar equivocado, pero aquí va ...

La manera estándar para lograr sitios web multilingües es el uso de técnicas de diccionario i18n/plantilla en las que tiene un diccionario para cada idioma, y ​​en algunos casos diferentes plantillas

Sin embargo, en tales casos, nunca he visto a nadie cambiar el idioma de sus URL. El URL asigna una solicitud a los archivos en el disco del servidor (en general), y no debe cambiar según el idioma si puede evitarlo.

Es común para prefijar la sección 'camino' de su URL con el lenguaje que está solicitando - es decir: http://foo.bar/en-us/foobar.html

En resumen: yo no me preocuparía por la traducción de sus direcciones URL, ya que ISN No es una práctica estándar (al menos, no es que yo haya visto). Simplemente prefija la URL 'ruta' con una denotación de idioma como en la URL anterior.

+0

¿No sería un * anunciador de idioma *? : P –

+0

De hecho lo sería, aunque creo que 'denotación' es un mejor sinónimo. Lo corregí arriba. – Craige

0

Estaba pensando en esto, ya que voy por este camino ahora. Iba a usar un método similar, pero no el mismo ...

Iba a tener archivos de "incluir" el lenguaje con todas las cadenas del sitio. Así que ...

/languages/en.php

tendría todas las cuerdas correctas para el idioma Inglés, y los otros archivos de idioma se puede caer en que se hacen las nuevas traducciones.

En el archivo en.php, que iba a poner en campos como éste

define('PageTitleWelcomeMessage', 'Welcome to Foo'); 

y luego llamar a esa variable estática en cualquier parte del sitio. Los cuartos de lenguaje se define en su perfil

Entonces podría llamar a esa variable, así:

echo PageTitleWelcomeMessage; 
Cuestiones relacionadas