Elemental CMS proporciona un sistema flexible para gestionar snippets en múltiples idiomas. Esta guía explica cómo funcionan los snippets con las características de localización y traducción.
A diferencia de las páginas, los snippets en Elemental CMS son agnósticos al idioma por diseño. Esto significa:
Elemental CMS usa Flask-Babel para internacionalización. Los snippets pueden incluir contenido traducible usando los siguientes métodos:
En el contenido HTML de tu snippet, puedes usar funciones de traducción de Flask-Babel:
<div class="welcome-message">
{{ _("Bienvenido a nuestro sitio web") }}
</div>
<div class="navigation">
<a href="/">{{ _("Inicio") }}</a>
<a href="/about">{{ _("Acerca de") }}</a>
<a href="/contact">{{ _("Contacto") }}</a>
</div>
También puedes usar claves de traducción para escenarios más complejos:
<div class="product-card">
<h3>{{ _("product.title") }}</h3>
<p>{{ _("product.description") }}</p>
<button>{{ _("product.add_to_cart") }}</button>
</div>
Cuando los snippets se renderizan, tienen acceso al contexto del idioma actual a través de la especificación de la página:
Los snippets pueden acceder a información del idioma a través del contexto page
:
<div class="language-specific-content">
<p>Idioma actual: {{ page.language }}</p>
<p>Código de idioma: {{ lang_code }}</p>
</div>
Puedes renderizar contenido diferente basado en el idioma actual:
{% if page.language == 'es' %}
<div class="spanish-content">
<h2>{{ _("Bienvenido") }}</h2>
<p>{{ _("Contenido en español") }}</p>
</div>
{% elif page.language == 'en' %}
<div class="english-content">
<h2>{{ _("Welcome") }}</h2>
<p>{{ _("Content in English") }}</p>
</div>
{% endif %}
Los archivos de traducción se gestionan en el directorio elementalcms/translations/
:
.po
que contienen cadenas de traducción.mo
para uso en tiempo de ejecuciónes/
, en/
)Para agregar soporte para un nuevo idioma:
elementalcms/translations/
LC_MESSAGES/
messages.po
con traduccionesmessages.mo
usando Flask-BabelEn lugar de codificar texto directamente, usa claves de traducción para mejor mantenibilidad:
<!-- Bueno -->
<h1>{{ _("page.title") }}</h1>
<!-- Evitar -->
<h1>Bienvenido a nuestro sitio</h1>
Diseña snippets que funcionen en todos los idiomas usando funciones de traducción:
<div class="navigation-menu">
<nav>
<a href="/">{{ _("nav.home") }}</a>
<a href="/about">{{ _("nav.about") }}</a>
<a href="/services">{{ _("nav.services") }}</a>
<a href="/contact">{{ _("nav.contact") }}</a>
</nav>
</div>
Proporciona contexto para que los traductores entiendan el uso:
<!-- En tu snippet -->
<button>{{ _("button.submit") }}</button>
<!-- En messages.po -->
msgid "button.submit"
msgstr "Enviar"
# Contexto: Botón de envío en formularios
msgctxt "form"
msgid "button.submit"
msgstr "Enviar"
Configuración relacionada con idiomas en tu configuración:
{
"cmsCoreContext": {
"LANGUAGE_MODE": "multi",
"DEFAULT_LANGUAGE": "es",
"AVAILABLE_LANGUAGES": ["es", "en", "fr"]
}
}
Al crear snippets que se usarán en múltiples idiomas:
elemental-cms snippets create
.po
Aquí hay un ejemplo de un snippet de navegación que funciona en múltiples idiomas:
<!-- nav-bar.html -->
<nav class="main-navigation">
<ul>
<li><a href="/">{{ _("nav.home") }}</a></li>
<li><a href="/about">{{ _("nav.about") }}</a></li>
<li><a href="/services">{{ _("nav.services") }}</a></li>
<li><a href="/contact">{{ _("nav.contact") }}</a></li>
</ul>
</nav>
Entradas del archivo de traducción:
# Inglés (messages.po)
msgid "nav.home"
msgstr "Home"
msgid "nav.about"
msgstr "About"
msgid "nav.services"
msgstr "Services"
msgid "nav.contact"
msgstr "Contact"
# Español (messages.po)
msgid "nav.home"
msgstr "Inicio"
msgid "nav.about"
msgstr "Acerca de"
msgid "nav.services"
msgstr "Servicios"
msgid "nav.contact"
msgstr "Contacto"
Para probar tus snippets traducidos:
Si falta una traducción, Flask-Babel mostrará la cadena original. Para arreglar:
.po
Si las traducciones no se están actualizando:
.po
a .mo
Para contenido que cambia basado en cantidad:
<div class="item-count">
{{ ngettext('%(num)d elemento', '%(num)d elementos', count) }}
</div>
Usa formato específico por localización:
<div class="date-display">
{{ moment(date).format('LL') }}
</div>
Este sistema integral de localización te permite crear snippets verdaderamente internacionales que funcionan perfectamente en todos los idiomas soportados en tu instalación de Elemental CMS.