Uso de subcarpetas de URL para vistas de tienda en varios idiomas en Magento 2

8

Configuré Magento 2 con dos Vistas de tienda para tener dos idiomas front-end (inglés e italiano) y me gustaría tener el siguiente comportamiento:

http://example.com/     -->  Store View "English" (code = "en") - Default
http://example.com/it/  -->  Store View "Italian" (code = "it")

Es decir, la vista de la tienda en inglés debería estar disponible en las URL estándar y la vista de la tienda en italiano debería estar disponible dentro de la subcarpeta "it" en la url. Nada extraño, una configuración común para sitios web multilingües.

Encontré aquí una pregunta bastante similar con respecto a Magento 1.x: diferentes vistas de tiendas o sitios web en subcarpetas . Pero dado que la respuesta aceptada no es trivial (implica reescrituras en el .htaccessy modificaciones en el index.php), me gustaría preguntar si con Magento 2 hay una manera más simple de hacerlo.


ACTUALIZAR

Premisa: no me importa tener varios sitios web, así que no tengo el problema de tener varios sitios web con los mismos idiomas (eso sería un problema para la solución a continuación).

Así que habilité la Add Store Code to Urlsopción, desde Configuración> Web> Url> Agregar código de tienda a las URL , y está funcionando bien. Pero ahora he duplicado las URL para el idioma predeterminado (inglés):

http://example.com/     -->  Store View "English" (code = "en")
http://example.com/en/  -->  Store View "English" (code = "en")
http://example.com/it/  -->  Store View "Italian" (code = "it")

¿Hay alguna manera de evitar esto, es decir, evitar la subcarpeta en la URL del idioma predeterminado?

Andrea
fuente

Respuestas:

7

Terminé usando la solución a continuación. Vi que es una configuración bastante común para sitios web de Magento en varios idiomas.

Esta solución proporciona un idioma predeterminado con una redirección de la URL "normal" (URL sin subcarpeta lang) a URL con la subcarpeta lang predeterminada.

Por ejemplo, si ites el idioma predeterminado, sucede esto:

example.com/         -->  example.com/it/
example.com/contact  -->  example.com/it/contact
...

1) Crear vistas de la tienda con código lang

  • Vaya a Tiendas> Todas las tiendas .
  • Cree una vista de tienda para cada idioma.
  • Establezca en el campo Código el código de idioma.
  • Ejemplo: Tengo dos vistas de la tienda, Italiano con el código "it" (vista predeterminada) e Inglés con el código en .

2) Habilite la opción Agregar código de tienda a las URL

  • Desde Tiendas> Configuraciones> Web> Opciones de URL> Agregar código de tienda a las URL> Sí .
  • Habilitando esta opción tengo lo siguiente:

    http://example.com/it/  -->  Store View "Italian" (code = "it")
    http://example.com/en/  -->  Store View "English" (code = "en")

3) Establecer un redireccionamiento de idioma predeterminado en .htaccess

Abra .htaccessy busque estas líneas:

############################################
## never rewrite for existing files, directories and links

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

Luego coloque las siguientes líneas justo antes de las anteriores:

############################################
## redirects for urls without lang dir to default lang (it)

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

    RewriteCond %{REQUEST_URI} !^/(it|en|admin\w*|soap|rest)($|/.*$)
    RewriteRule ^(.*)$ /it/$1 [L,R=301]

Estas líneas redirigirán todas las URL sin subcarpeta de idioma a la misma url con la subcarpeta predeterminada /ital principio:

example.com/contact  -->  example.com/it/contact

URLs que comienzan con en/, admin, soap/, rest/no son redirigidos.

Puede personalizarlo, cambiando la subcarpeta de idioma predeterminada y agregando otras URL ignoradas (al menos una para cada código de idioma que tenga).

4) Redirigir la raíz al subdirectorio de idioma predeterminado

En la .htaccessbúsqueda de estas líneas:

############################################
## enable rewrites

    Options +FollowSymLinks
    RewriteEngine on

Luego coloque las siguientes líneas justo después :

############################################
## redirect root to default lang (it)

    RedirectMatch 301 ^/$ /it/

Inconvenientes

Usé esta solución y está funcionando bien para mí. El único inconveniente que he experimentado es que .htaccessse reescribe cada vez que actualizo Magento, por lo que tengo que restaurarlo después de la actualización.

Otro inconveniente puede ser si tiene una configuración de sitio web múltiple y varios sitios web con los mismos idiomas que se señalan en un comentario a esta respuesta: https://magento.stackexchange.com/a/197/38275

Andrea
fuente
0

Tengo una pregunta. Digamos que tengo dos URL bajo un solo administrador (Magento 2): 1) www.abc.cz - solo ejecuta la versión checa 2) www.cde.com - actualmente ejecuta la versión EN

Quiero tener más vista de Tienda en .com, por ejemplo: .com / de, .com / es, etc. pero no quiero tener un "sistema de carpetas" para el lenguaje EN que se ejecuta directamente en .com.

Si alguien entiende correctamente, cuando empiezo a usar el sistema de carpetas para .com, la versión .cz se verá afectada y creará la carpeta .cz / cz, lo cual no es deseable para mí.

Como hacer eso. Gracias por tu ayuda.

Viktor Malcev
fuente