python - django-admin.py makemessages no funciona
homebrew gettext (8)
Estoy tratando de traducir una cadena.
{% load i18n %}
{% trans "Well, Hello there, how are you?" %}
a...
Hola amigo, ¿que tal?
Mi archivo settings.py tiene esto:
LOCALE_PATHS = (
os.path.join(BASE_DIR, ''translations''),
)
Y estoy obteniendo esto:
(env)glitch:translations nathann$ django-admin.py compilemessages
CommandError: Can''t find msgfmt. Make sure you have GNU gettext tools 0.15 or newer installed.
Tampoco entiendo este mensaje de error.
(env)glitch:ipals nathann$ django-admin.py makemessages -l es
CommandError:
This script should be run from the Django Git tree or your project or
app tree. If you did indeed run it from the Git checkout or your project
or application, maybe you are just missing the conf / locale(in the
django tree) or locale(for project and application) directory? It is not
created automatically, you have to create it by hand if you want to
enable i18n for your project or application.
Los documentos: https://docs.djangoproject.com/en/1.6/ref/django-admin/#django-admin-makemessages
Y para votos ascendentes de bonificación, una pregunta relacionada: gettext no estaba vinculado cuando lo instalé ... ¿Alguna ayuda con este? ¿Debería forzarlo?
glitch:translations nathann$ brew link gettext
Warning: gettext is keg-only and must be linked with --force
Note that doing so can interfere with building software.
¡Gracias!
ACTUALIZACIONES:
Desde entonces, he cambiado el nombre de las traducciones a la configuración regional y actualicé mi settings.py en consecuencia. luego volví a ejecutar esto y todavía me quejo de gettext:
(env)glitch:ipals nathann$ mv translations/ locale
(env)glitch:ipals nathann$ django-admin.py makemessages -l es
CommandError: Can''t find xgettext. Make sure you have GNU gettext tools 0.15 or newer installed.
También encontré esto:
Comprender las dependencias homebrew y keg-only
después de leer esto:
(env)glitch:ipals nathann$ brew install gettext
Warning: gettext-0.18.3.2 already installed
(env)glitch:ipals nathann$ brew link gettext
Warning: gettext is keg-only and must be linked with --force
Note that doing so can interfere with building software.
¿Ha agregado {% load i18n %}
a la parte superior de su plantilla?
Bonificación: no necesita vincular gettext, ¿cuál es el resultado del brew doctor
?
Aquí está la solución para aquellos que tienen problemas con las traducciones o están creando un sitio en varios idiomas por primera vez en Django. Esta es la forma en que lo hago, y lo he estado haciendo desde que Django 1.4, a continuación, se prueba en 1.7.1:
En settings.py ...
Agregar a MIDDLEWEAR_CLASSES, configuración regional, habilita la selección de idioma según la solicitud:
''django.middleware.locale.LocaleMiddleware'',
Agregue LOCALE_PATHS, aquí es donde se almacenarán sus archivos de traducción, también habilite i18N:
USE_I18N = True
LOCALE_PATHS = (
os.path.join(PROJECT_PATH, ''locale/''),
)
Establezca IDIOMAS a los que va a traducir el sitio:
ugettext = lambda s: s
LANGUAGES = (
(''en'', ugettext(''English'')),
(''fr'', ugettext(''French'')),
(''pl'', ugettext(''Polish'')),
)
Agregue el procesador de contexto de la plantilla i18n, las solicitudes ahora incluirán IDIOMAS y CÓDIGO_DE_LIGA:
TEMPLATE_CONTEXT_PROCESSORS = (
''django.contrib.auth.context_processors.auth'',
''django.core.context_processors.debug'',
''django.core.context_processors.i18n'', # this one
''django.core.context_processors.request'',
''django.core.context_processors.static'',
''django.contrib.messages.context_processors.messages'',
)
Nest, en urls.py:
En url_patterns, agregue lo siguiente, habilitará la vista de redirección de idioma establecida:
url(r''^i18n/'', include(''django.conf.urls.i18n'')),
Vea Misceláneo en Translations para más información sobre esto.
Agregue las siguientes importaciones y encapsule las URL que quiere traducir con i18n_patterns. Así es como se ve el mío:
from django.conf.urls.i18n import i18n_patterns
from django.utils.translation import ugettext_lazy as _
urlpatterns = patterns('''',
url(r''^admin/'', include(admin.site.urls)),
url(r''^i18n/'', include(''django.conf.urls.i18n'')),
)
urlpatterns += i18n_patterns('''',
(_(r''^dual-lang/''), include(''duallang.urls'')),
(r''^'', include(''home.urls'')),
)
Nota: También puede colocar sus URL de administrador en i18n_patterns.
Ahora en cualquier lugar donde use texto y quiera convertirlo, importe texto difuso y envuelva cada cadena como _ (''texto''), incluso puede ir a sus otros archivos urls.py y hacer la traducción url de esta manera:
url(_(r''^dual_language/$''), landing, name=''duallang_landing''),
Puede ajustar el texto que desee traducir en sus otros archivos, como models.py, views.py, etc. Aquí hay un ejemplo de campo de modelo con traducciones para label y help_text:
name = models.CharField(_(''name''), max_length=255, unique=True, help_text=_("Name of the FAQ Topic"))
¡Los documentos de traducción de Django son geniales para esto!
En tus plantillas html ...
Ahora puede ir a sus plantillas y cargar la etiqueta de plantilla i18n y usar trans y transblock en las cosas estáticas que desea traducir. Aquí hay un ejemplo:
{% load i18n %}
{% trans "This is a translation" %}<br><br>
{% blocktrans with book_t=''book title''|title author_t=''an author''|title %}
This is {{ book_t }} by {{ author_t }}. Block trans is powerful!
{% endblocktrans %}
Ahora ejecute makemessages para cada una de sus configuraciones regionales:
./manage.py makemessages -l pl
Y ahora todo lo que queda es ir a su carpeta / locales y editar cada uno de los archivos .po. Complete los datos para cada msgstr. Aquí hay un ejemplo de eso:
msgid "English"
msgstr "Angielski"
Y finalmente compila los mensajes:
./manage.py compilemessages
Hay mucho más que aprender con las traducciones y la internationalization está estrechamente relacionada con este tema, así que echa un vistazo a los documentos para ello. También recomiendo consultar algunos de los paquetes de internacionalización disponibles para Django como django-rosetta y django-linguo . Ayudan a traducir el contenido del modelo, django-rosetta no crea nuevas entradas para esto en su base de datos, mientras que django-linguo sí lo hace.
Si sigues esto, deberías tener un buen comienzo. Creo que esta es la forma más estandarizada para hacer que su sitio se ejecute en varios idiomas. ¡Aclamaciones!
Después de asegurarme de tener esto en la configuración:
LOCALE_PATHS = (
os.path.join(BASE_DIR, ''locale''),
)
print(LOCALE_PATHS)
Comprobé dos veces que tenía el directorio de locale
en el lugar correcto con su nombre escrito correctamente.
Terminé vinculando gettext (después de preguntar sobre eso en superuser ):
brew link gettext --force
manage.py compilemessages
django-admin.py makemessages -l es
Y BAM. Tengo mi archivo po.
Pero el doctor dice:
Warning: Some keg-only formula are linked into the Cellar.
Linking a keg-only formula, such as gettext, into the cellar with
`brew link <formula>` will cause other formulae to detect them during
the `./configure` step. This may cause problems when compiling those
other formulae.
Binaries provided by keg-only formulae may override system binaries
with other strange results.
You may wish to `brew unlink` these brews:
gettext
Instale gettext en su sistema operativo Ubuntu usando el comando sudo apt-get
O en Mac
usando el comando brew
Para macOS
:
brew install gettext export PATH="/usr/local/opt/gettext/bin:$PATH"
Para los usuarios de Mac brew link gettext --force
puede ser un riesgo, como aconseja Brew. Un mejor trabajo es establecer una nueva PATH variable
para su entorno virtual. Por lo tanto, en el archivo postactivate
, que se encuentra en la carpeta bin de su carpeta de entorno virtual, escriba:
export TEMP_PATH=$PATH
export PATH=$PATH:/usr/local/Cellar/gettext/0.19.7/bin
Tenga en cuenta que debe reemplazar 0.19.7
por la versión que está instalada en su máquina.
Y en su archivo de predeactivate
, que se encuentra en la misma carpeta del archivo postactivate
, escriba:
export PATH=$TEMP_PATH
unset TEMP_PATH
Ahora puede usar python manage.py makemessages -l <desired_language>
sin preocupaciones. :)
Aclamaciones.
Por favor, intente esto en Ubuntu
sudo apt-get install gettext
Y use brew install gettext en OSX
También asegúrese de establecer la ruta local en el archivo settings.py.
Si no desea vincular gettext
(que no debería porque molestarse con los elementos internos de OS X es malo), entonces puede establecer la PATH
para el comando makemessages
. Lo siguiente debería funcionar (pero debe ajustar su número de versión gettext):
PATH=/usr/local/Cellar/gettext/<installed version>/bin/:$PATH && /
django-admin makemessages -l <language>
Si lo haces de esa forma, tu gettext
instalado gettext
siendo barril solo y django-admin estará feliz y encontrará todos los programas que necesita.