8 votes

i18n ne fonctionne pas dans l'environnement de production sur heroku

J'ai vu plus d'une centaine de posts sur les questions d'i18n et aucune solution ne semble résoudre mon problème.

J'ai une application fonctionnant avec Django 1.3.1 et elle fonctionne bien sur ma machine de développement. Mais quand je passe à heroku rien ne se passe. Les fichiers ne sont pas traduits du tout. Il semble que le dossier de la locale dans mon projet ne soit pas trouvé.

Le dossier Locale se trouve au niveau de mon projet et voici mes paramètres :

BASE_PATH = os.path.dirname(os.path.abspath(__file__))

LANGUAGE_CODE = 'pt-br'

USE_I18N = True

USE_L10N = True

ugettext = lambda s: s
LANGUAGES = (
    ('en-us', ugettext('English')),
    ('pt-br', ugettext('Portuguese')),
)

LOCALE_PATHS = (
       os.path.join(BASE_PATH, "locale"),
)

Le dossier Locale suit cette structure :

locale
    pt_BR
        LC_MESAGES
            django.mo
            django.po

6voto

mkoistinen Points 3883

J'ai constaté que les différentes plateformes préfèrent des noms de dossiers dans des langues différentes. Je m'arrachais les cheveux sur mon système de développement (Mac OS X) parce que '/pt-br/LC_MESSAGES/' ne fonctionnait pas, même si makemessages créait les dossiers de cette façon et que les messages de compilation fonctionnaient bien aussi. Le problème s'est finalement résolu lorsque j'ai renommé les langues en '/pt_br/LC_MESSAGES/' (remarquez le trait de soulignement).

En migrant le même projet vers la production (Ubuntu), il a cessé de fonctionner à nouveau, j'ai tout essayé sous le soleil en pensant que les noms de dossiers devaient déjà être corrects puisqu'ils fonctionnent sur ma machine de développement. Finalement, en désespoir de cause, j'ai essayé de mettre en majuscule le composant pays comme '/pt_BR/LC_MESSAGES/', et, boum, ça a recommencé à fonctionner.

Même si mon Python et mon Django et toutes mes diverses bibliothèques et applications Python/Django étaient (par conception) des versions identiques, je soupçonne que chaque système a des versions/builds différents de gettext sous eux, ce qui est probablement responsable des différences.

4voto

Onur Ferhat Points 59

Par défaut, les fichiers de traduction compilés ( *.mo ) sont ignorés par git. Vérifiez que vous avez supprimé cette exception de votre fichier .gitignore fichier.

Si c'est le cas, supprimez cette exception, ajoutez ces fichiers à git, commitez et poussez vers Heroku pour qu'ils soient disponibles pour l'application dans Heroku.

3voto

tutuDajuju Points 1522

Dans l'exemple ci-dessus, vous avez écrit LC_MESAGES au lieu de LC_MESSAGES (remarquez le double S), je pense que cela pourrait très bien être votre problème.

Si ce n'est pas le cas, lisez la suite !

J'ai eu ce problème (encore !) récemment, et la réponse a été trouvée dans cette partie de la documentation de django

Je pense que vous avez le même problème puisque votre application "admin" a été traduite mais pas votre propre application (projet).

Il semble que Django recherche vos traductions de la manière suivante :

  1. Les répertoires listés dans LOCALE_PATHS ont la plus haute priorité, ceux qui apparaissent en premier ont une plus grande priorité que ceux qui apparaissant plus tard.
  2. Ensuite, il recherche et utilise si elle existe une locale dans chacune des applications installées listées dans INSTALLED_APPS. Les celles qui apparaissent en premier ont une plus grande priorité que celles qui apparaissent plus tard.
  3. Enfin, la traduction de base fournie par Django dans le fichier django/conf/locale est utilisée comme solution de repli.

Avec les paramètres décrits ci-dessus, vous devez vous assurer que votre arborescence ressemble à quelque chose comme ceci (le plus important étant que settings.py se trouve dans le répertoire au-dessus du répertoire 'locale') :

+-project_top/
  |
  +-project_app/
  | |
  | +-locale/
  | | |
  | | +-pt_BR/
  | |   |
  | |   +-LC_MESSAGES/
  | |     |
  | |     +-django.po
  | |  
  | +-settings.py
  |
  +-manage.py

0voto

Relaed Points 46

Tout d'abord, vos paramètres de langue sont incorrects.

Ça devrait être comme :

LANGUAGES = (
    ('zh', 'China'),
    ('en', 'English'),
    ('ja', 'Japanese'),
)

Ensuite, vérifiez si le domaine dans vos paramètres de cookies est correct.

J'ai eu le même problème et j'ai pensé que l'environnement virtuel de Heroku ne prendrait jamais en charge i18n, mais j'ai finalement découvert que la valeur 'django-language' dans le cookie de session appartient à mon serveur de test local '0.0.0.0:5000'.

Après avoir modifié les paramètres, mes traductions effectuées sur le serveur local ont fonctionné sans problème.

0voto

Dos Points 533

Dans certains cas, les répertoires dont le nom contient un "-" ou un "_" ne sont pas correctement adressés. J'ai résolu ce problème en personnalisant l'url pour qu'elle soit un code à 2 caractères. Cela peut être fait en créant un alias :

from django.conf import global_settings, locale
EXTRA_LANG_INFO = {
    'pt': {
        'fallback': ['pt-br'],
    },
}
LANG_INFO = dict(locale.LANG_INFO, **EXTRA_LANG_INFO)
locale.LANG_INFO = LANG_INFO

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X