2025/01/08 | AI
with openai

Buscar

Django-rosetta - Internacionalización

Descripción de la imagen

Introducción a Django-Rosetta: Instalación y Configuración

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.

¿Qué es Django-Rosetta?

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.

Archivos de Django que se modificarán

Para configurar Django-Rosetta correctamente, trabajaremos con los siguientes archivos clave de tu proyecto Django:

  1. settings.py: Configuraremos los idiomas disponibles, la ruta donde se almacenarán las traducciones y activaremos Django-Rosetta en INSTALLED_APPS.
  2. urls.py: Añadiremos las rutas necesarias para acceder a la interfaz de Django-Rosetta.
  3. 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 eu

Compila las traducciones para que django las pueda utilizar:

django-admin compilemessages

Se 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. ; )

Comentarios