MultiLang Elementor
Multi Lang for Elementor
by Tu Nombre · github.com/guillef33/multilang-elementor · website
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/guillef33/multilang-elementor/archive/refs/heads/main.zipPlugin de WordPress para traducciones por directorio URL, compatible con Elementor. Sin JavaScript en el frontend — todo se procesa a nivel servidor (PHP).
Estructura de URLs generada
hola.com/ → idioma por defecto (ej: inglés)
hola.com/es/ → español
hola.com/fr/ → francés
hola.com/es/about → página About en español
hola.com/fr/blog → Blog en francés
Instalación
- Subir la carpeta
multilang-elementor/a/wp-content/plugins/ - Activar el plugin desde Plugins → Plugins instalados
- Ir a MultiLang → Configuración y elegir los idiomas
- Hacer clic en Escanear strings del sitio
- Ir a MultiLang → Traducciones y completar las traducciones
Estructura de archivos
multilang-elementor/
├── multilang-elementor.php ← Archivo principal
├── includes/
│ ├── class-mle-settings.php ← Configuración
│ ├── class-mle-router.php ← Routing de URLs por idioma
│ ├── class-mle-translator.php ← Motor de traducción (output buffer)
│ ├── class-mle-scanner.php ← Extractor de strings
│ ├── class-mle-hreflang.php ← Tags SEO hreflang
│ └── elementor-widget-switcher.php ← Widget Elementor
├── admin/
│ └── class-mle-admin.php ← Panel de administración
├── assets/
│ ├── css/admin.css
│ ├── css/frontend.css
│ └── js/admin.js
└── locales/ ← Archivos de traducción (como Shopify)
├── es.json
└── fr.json
Formato de los archivos JSON (locales/)
{
"Welcome to our site": {
"source": "Welcome to our site",
"target": "Bienvenido a nuestro sitio"
},
"Contact us": {
"source": "Contact us",
"target": "Contáctenos"
}
}
También aceptá el formato simplificado:
{
"Welcome to our site": "Bienvenido a nuestro sitio",
"Contact us": "Contáctenos"
}
Cómo funciona (sin JavaScript)
-
Detección de idioma: Al llegar una request a
/es/mi-pagina, el router detecta el prefijoesantes de que WordPress renderice nada. -
Rewrite Rules: WordPress redirige internamente
/es/mi-paginaal contenido correcto, sin redirect HTTP. -
Output Buffer: Se inicia
ob_start()con un callback PHP que reemplaza todos los strings del HTML generado antes de enviarlo al cliente. -
Filtros de Elementor: Los hooks
elementor/widget/render_contentyelementor/document/get_elements_datapermiten traducir el JSON de Elementor antes de renderizar. -
Sin JS: El cliente recibe HTML ya traducido. No hay detección de idioma en el browser, no hay reemplazos DOM en runtime.
Uso en templates PHP
// Obtener idioma actual
$lang = MLE_Router::get_current_language(); // 'en', 'es', 'fr'
// Generar switcher de idiomas
echo MLE_Router::language_switcher_html();
// Generar URL en otro idioma
$url_es = MLE_Router::switch_language_url('es');
// Traducir un string manualmente
$text = MLE_Translator::translate_string('Welcome');
Shortcode
[mle_language_switcher]
Widget Elementor
Buscar "Language Switcher" en el panel de widgets de Elementor.
SEO
El plugin agrega automáticamente las etiquetas hreflang en el <head>:
<link rel="alternate" hreflang="en" href="https://hola.com/" />
<link rel="alternate" hreflang="es" href="https://hola.com/es/" />
<link rel="alternate" hreflang="fr" href="https://hola.com/fr/" />
<link rel="alternate" hreflang="x-default" href="https://hola.com/" />
Compatibilidad
- ✅ Elementor (Free y Pro)
- ✅ Elementor Pro Forms
- ✅ Yoast SEO (traduce title y metadescription)
- ✅ RankMath SEO
- ✅ WooCommerce (con hooks adicionales)
- ✅ Menús de navegación
- ✅ Widgets de texto
- ✅ Taxonomías y categorías
Agregar un nuevo idioma
- Ir a MultiLang → Configuración
- Marcar el idioma deseado y guardar
- Hacer clic en Escanear strings para generar el archivo JSON
- Ir a Traducciones y completar las traducciones
Editar archivos JSON directamente
Los archivos están en:
wp-content/plugins/multilang-elementor/locales/
Podés editarlos con cualquier editor de texto, importarlos/exportarlos, o versionarlos con Git.
Troubleshooting
Las URLs no funcionan (404) → Ve a Ajustes → Enlaces permanentes y guarda (esto regenera las rewrite rules).
Los strings no se traducen
→ Verificar que el archivo locales/{lang}.json tenga el campo "target" completo.
→ Limpiar cualquier caché (WP Rocket, LiteSpeed, W3 Total Cache, etc.).
Elementor no muestra las traducciones en el editor → Normal: las traducciones solo se aplican en el frontend para no interferir con la edición.