2025/01/08 | AI
with openai
 
                  
                  La internacionalización es una parte crucial de cualquier aplicación web que desee llegar a audiencias globales, y Django facilita este proceso con su potente sistema de traducción. Sin embargo, gestionar traducciones manualmente en los archivos .po puede ser una tarea tediosa y propensa a errores. Aquí es donde entra Django-Rosetta, una herramienta que simplifica la edición de traducciones directamente desde una interfaz gráfica amigable.
En esta publicación, aprenderás cómo instalar y configurar Django-Rosetta para gestionar traducciones en tu proyecto. Te guiaremos paso a paso, mencionando los archivos específicos de Django que debes editar para integrarlo correctamente. Al final, tendrás una herramienta poderosa para trabajar con traducciones en varios idiomas sin salir del navegador.
Django-Rosetta es un paquete de terceros que actúa como una interfaz gráfica para editar archivos .po de traducción. Permite a desarrolladores y traductores trabajar directamente desde el navegador, sin necesidad de manipular los archivos manualmente en un editor de texto. Esto hace que el proceso de traducción sea más eficiente y accesible.
Para configurar Django-Rosetta correctamente, trabajaremos con los siguientes archivos clave de tu proyecto Django:
settings.py: Configuraremos los idiomas disponibles, la ruta donde se almacenarán las traducciones y activaremos Django-Rosetta en INSTALLED_APPS.urls.py: Añadiremos las rutas necesarias para acceder a la interfaz de Django-Rosetta.locale/: Es el directorio donde se almacenarán los archivos de traducción para los diferentes idiomas.Con estos tres elementos, tu proyecto estará listo para soportar múltiples idiomas y gestionar traducciones con facilidad.
En las siguientes secciones, exploraremos cada paso en detalle, desde la instalación hasta la configuración, y finalizaremos con una demostración de cómo usar Django-Rosetta para traducir cadenas en tu aplicación. ¡Comencemos!
Instalar django-rosetta:
pip install django-rosetta
Añade las urls de rosetta en urls.py (dentro de lo que tengamos no, sino seguido "tal como se ve":
from django.contrib import admin
from django.conf import settings
from django.urls import path, include
from django.conf.urls.i18n import i18n_patterns
from django.http import HttpResponseRedirect
# Redirige desde la raíz ('/') al idioma predeterminado
urlpatterns = [
    path('', lambda request: HttpResponseRedirect(f'/{settings.LANGUAGE_CODE.split("-")[0]}/')),
    path('admin/', admin.site.urls),
]
# Incluye las rutas de Rosetta si está en INSTALLED_APPS
if 'rosetta' in settings.INSTALLED_APPS:
    urlpatterns += [
        path('rosetta/', include('rosetta.urls')),
    ]
# Prefijos de idioma para todas las rutas definidas con i18n_patterns
urlpatterns += i18n_patterns(
    path('i18n/', include('django.conf.urls.i18n')),  # Para cambiar idioma
    path('', include('applications.home.urls')),  # Ruta de la aplicación principal
)
Añadir en INSTALLED_APPS rosetta:
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rosetta'
]
Añade la siguiente linea para habilitar el cambio de idioma... ¡Eso de clicar EN o ES!
MIDDLEWARE = [
    ...,
    'django.middleware.locale.LocaleMiddleware',
    ...,
]
Añadir en templates:
TEMPLATES = [
    {
        ...
        'OPTIONS': {
            'context_processors': [
                ...
                'django.template.context_processors.i18n',
                ...
            ],
        },
    },
]
Configuramos los idiomas tanto el principal para django como para el multidioma:
# Idioma predeterminado (opcional)
LANGUAGE_CODE = 'es-es'
# Zona horaria predeterminada
TIME_ZONE = 'Europe/Madrid'
# Activar internacionalización
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Idiomas disponibles
LANGUAGES = [
    ('es', 'Español'),
    ('en', 'English'),
    ('eu', 'Euskara'),
]
# Ruta donde estarán los archivos de traducción
LOCALE_PATHS = [
    BASE_DIR / 'locale/',
]
Marca las palabras o frases traducir utilizando "trans":
<a href="#">{% trans 'Home' %}</a>
<a href="#">{% trans 'About' %}</a>
Crea una carpeta llamada locale a la altura de manage.py
Ejecuta el siguiente comando para crear los archivos .po necesarios para cada idioma:
django-admin makemessages -l es
django-admin makemessages -l en
django-admin makemessages -l euCompila las traducciones para que django las pueda utilizar:
django-admin compilemessagesSe crearán los siguientes archivos:
Entran en el enlace para crear las traducciones (en mi caso en local pero puede estar en producción con el dominio):
http//localhost:8000/rosetta
Crea las traducciones de los {% trans "..." %} indicados en el template:
Añade en el menú el selector de idiomas. En este caso ES, EN y EUS:
{% load i18n %}
{% get_current_language as CURRENT_LANGUAGE %}
{% get_available_languages as AVAILABLE_LANGUAGES %}
{% get_language_info_list for AVAILABLE_LANGUAGES as languages %}
<li class="nav-item dropdown">
    <a class="nav-link dropdown-toggle" 
       style="text-transform:uppercase; background-color: #250f64; color:white; border-radius:25px;" 
       href="#" data-bs-toggle="dropdown" aria-expanded="false">
        {{ CURRENT_LANGUAGE }}
    </a>
    <ul class="dropdown-menu" style="z-index:500;">
        {% for language in languages %}
        <li>
            <a class="dropdown-item" style="text-transform:uppercase; color: #250f64;" 
               href="/{{ language.code }}/{{ request.get_full_path|slice:'4:' }}">
                {{ language.code }}
            </a>
        </li>
        {% endfor %}
    </ul>
</li>¡Ya debería funcionar el sistema de idiomas en la web!
¿Qué tal funciona? Si necesitas ayuda no dudes en contactar. ; )