[Trac] Fehlende Übersetzung - Plugin + i18n + genshi + HTML

Django, Flask, Bottle, WSGI, CGI…
Antworten
selur
User
Beiträge: 2
Registriert: Donnerstag 19. August 2010, 09:57

Versuche mich momentan daran ein Trac Plugin zu schreiben, was auch soweit gut geht, Problem ist nur ich kriege meine Übersetzungen nicht zum Laufen. :(
Verwende: Ubuntu Server, Trac 0.12, Babel 0.9.5, Genshi 0.6, mod_python 3.3.1, pysqlite 2.4.1, Python 2.6.5 (r265:79063, Apr 16 2010, 13:28:26) [GCC 4.4.3], setuptools 0.6, SQLite 3.6.22, jQuery: 1.4.2

Hab mir ganz 'brav' http://trac.edgewall.org/wiki/CookBook/PluginL10N zu Gemüt geführt und dann in meinem Projekt folgende Änderungen gemacht:

1. setup.cfg angelegt (komplette Datei):

Code: Alles auswählen

[extract_messages]
add_comments = TRANSLATOR:
msgid_bugs_address = 
output_file = testProject/locale/messages.pot
keywords = _ N_ tag_
width = 72

[init_catalog]
input_file = testProject/locale/messages.pot
output_dir = testProject/locale
domain = testProject

[compile_catalog]
directory = testProject/locale
domain = testProject

[update_catalog]
input_file = testProject/locale/messages.pot
output_dir = testProject/locale
domain = testProject
2. die setup.py angepasst (komplette Datei):

Code: Alles auswählen

from setuptools import find_packages, setup

extra = {}
extractors = [
    ('**.py',                'python', None),
    ('**/templates/**.html', 'genshi', None),
]
extra['message_extractors'] = {
    'testProject': extractors,
}

setup(
    install_requires = ['Trac >= 0.12'],
    name='TracTestProject',
    version='0.1',
    packages=find_packages(exclude=['*.tests*']),
    entry_points="""
        [trac.plugins]
        testProject= testProject
    """,
    package_data = {
        'testProject': [
            'templates/*.html',
            'htdocs/js/*.js',
            'htdocs/css/*.css',
            'locale/*/LC_MESSAGES/*.mo',
        ]
    },
    **extra
)
3. einen locale Unterordner angelegt
4. in meiner api.py habe ich dann noch folgendes hinzugefügt (nur die Zusätze):
(ganz oben:)

Code: Alles auswählen

import pkg_resources

from trac.util.translation import domain_functions
_, tag_, N_, add_domain = domain_functions('testProject', ('_', 'tag_', 'N_', 'add_domain'))
(an den Anfang meiner Klasse)

Code: Alles auswählen

def __init__(self):
        locale_dir = pkg_resources.resource_filename('testProject', 'locale')
        add_domain(self.env.path, locale_dir)
5. in alle .html templates den html-tag angepasst:
(vermute hier mache ich etwas falsch ...)

Code: Alles auswählen

<html 
      xmlns="http://www.w3.org/1999/xhtml"
      xmlns:py="http://genshi.edgewall.org/"
      xmlns:i18n="http://genshi.edgewall.org/i18n/"
      xmlns:xi="http://www.w3.org/2001/XInclude"
      i18n:domain="testProject">
  <xi:include href="layout.html" />
Soweit so gut,...
Ein Aufruf von

Code: Alles auswählen

python ./setup.py extract_messages
liefert:

Code: Alles auswählen

running extract_messages
extracting messages from testProject/__init__.py
extracting messages from testProject/api.py
extracting messages from testProject/db.py
extracting messages from testProject/model.py
extracting messages from testProject/web.py
extracting messages from testProject/templates/testProject.html
extracting messages from testProject/templates/docket_edit.html
extracting messages from testProject/templates/docket_list.html
extracting messages from testProject/templates/docket_view.html
writing PO template file to testProject/locale/messages.pot
und soweit ich das sehe sieht das .pot file auch okay aus.
(einige Elemente wurden erst nicht als zu extrahieren erkannt, nachdem ich dann aber anstatt z.B. 'Add' ein _('Add') verwendet habe sind auch diese im .pot file aufgetaucht)

ein

Code: Alles auswählen

python ./setup.py init_catalog -l de_DE
liefert

Code: Alles auswählen

running init_catalog
creating catalog 'testProject/locale/de_DE/LC_MESSAGES/testProject.po' based on 'testProject/locale/messages.pot'
das testProject.po editiere ich dann entsprechend und rufe dann

Code: Alles auswählen

python ./setup.py compile_catalog -f -l de_DE
auf, was wie erwartet

Code: Alles auswählen

running compile_catalog
compiling catalog 'testProject/locale/de_DE/LC_MESSAGES/testProject.po' to 'testProject/locale/de_DE/LC_MESSAGES/testProject.mo'
liefert.

Zum Deployen rufe ich dann ein kleines delpoy.sh Skript auf:

Code: Alles auswählen

#!/bin/bash

TARGET="/var/trac/testProject/plugins/"

clean() {
        rm -rf \
                src/dist \
                src/build \
                src/TracTestProject.egg-info/dependency_links.txt \
                src/TracTestProject.egg-info/entry_points.txt \
                src/TracTestProject.egg-info/PKG-INFO \
                src/TracTestProject.egg-info/requires.txt \
                src/TracTestProject.egg-info/SOURCES.txt \
                src/TracTestProject.egg-info/top_level.txt
}

clean

cd src

python ./setup.py extract_messages
python ./setup.py update_catalog
python ./setup.py compile_catalog -f

python ./setup.py bdist_egg

cd ..

rm -f ${TARGET}/*
cp src/dist/TracTestProject*.egg ${TARGET}

clean
was auch brav seinen Dienst tut und ein .egg erstellt und dieses deployed. :)
Nach einem

Code: Alles auswählen

sudo service apache2 restart
und einem Blick auf die Trac Seite sehe ich:
1. mein Plugin läuft
2. alle Elemente die im .po File auf Python Code verweisen werden auch wie erwartet übersetzt
3. die Elemente in den Templates werden anscheinend soweit sie von Standardübersetzungen abgedeckt sind ('Add' -> 'Hinzufügen') werden übersetzt, meine eigenen im .po definierten Übersetzungen tauchen aber leider nirgends auf.

Problem:
Ich hab leider k.A. was da genau schief läuft (& wie ich es beheben könnte) und stehe sehr ratlos dar (nach einigen Stunden googeln und dem überfliegen von Code von anderen Projekten) :(
Ich vermute es liegt an meinen Templates bzw. dem Versuch Genshi klar zu machen, dass meine Übersetzungen genutzt werden sollen.

Würde mich freuen falls jemand den Fehler sieht und mir etwas helfen könnte.

Danke

Gruß Selur

Ps.: 1. Hab vorher noch nie groß etwas mit Python, HTML oder trac gemacht und entschuldige mich deshalb schon mal falls ich was total falsch gemacht hab oder irgendeinen Begriff falsch verwenden. :) 2. Hoffe ich hab hier im richtigen Bereich gepostet. :)
Zuletzt geändert von selur am Freitag 20. August 2010, 13:10, insgesamt 1-mal geändert.
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

In deiner Setup.py steht

Code: Alles auswählen

'locale/*/LC_MESSAGES/*.mo',
sollte das nicht

Code: Alles auswählen

'locale/*/LC_MESSAGES/*.po',
sein?

Habe selber noch nichts mit i8n gemacht, vergleiche nur mit meinem beispielprojekt.

Ansonsten, in deinem html template hast du die zu ersetzende Felder auch markiert, dass
sie umgewandelt werden?

z.B.

Code: Alles auswählen

<p><label>User</label>: ${filter.username}</p>

Grüße

Stefan
selur
User
Beiträge: 2
Registriert: Donnerstag 19. August 2010, 09:57

Danke für den post, leider hat er nicht geholfen. :(
sollte das nicht

Code: Alles auswählen

'locale/*/LC_MESSAGES/*.po',
...
Ne, das müssen schon die .mo Files sein, dass sind ja die kompilierten. (hab aber um sicher zu gehen auch mal die .po files angegeben, hat aber nicht geholfen)
Ansonsten, in deinem html template hast du die zu ersetzende Felder auch markiert, dass
sie umgewandelt werden?
Das sollte ja eigentlich nicht nötig sein, werden ja alle extrahiert.

Hier mal eine meiner Dateien:

Code: Alles auswählen

<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:py="http://genshi.edgewall.org/"
      xmlns:i18n="http://genshi.edgewall.org/i18n/"
      xmlns:xi="http://www.w3.org/2001/XInclude"
      i18n:domain="testProject">
  <xi:include href="layout.html" />
  <head>
    <title>Test Project - Dockets</title>
  </head>

  <body>
    <div id="content" class="testProject">
      <h1>Test Project - Dockets</h1>
      <ul>
        <li py:for="docket in dockets">${docket.getWikiPage().comment}
          <py:if test="'DOCKET_EDIT' in perm(docket.resource)">
            <a href="${href.testProject('docket/edit', {'article': docket.page})}">Edit</a>
          </py:if>
          <py:if test="'DOCKET_VIEW' in perm(docket.resource)">
            <a href="${href.testProject('docket/view', {'article': docket.page})}">View</a>
          </py:if>
        </li>
      </ul>
    </div>
  </body>
</html>
Der Titel und die Überschrift sollten in diesem Fall übersetzt werden. (Edit&View werden übersetzt, aber die sind in Standardübersetzungen enthalten,...)

Cu Selur
Antworten