[Zope3-Users] I18N question

Stephan Richter srichter at cosmos.phy.tufts.edu
Tue Sep 5 18:12:29 EDT 2006


On Tuesday 27 June 2006 08:08, Frank Burkhardt wrote:
>  data={
>     'foo':{
>        'en':u"nice Foo",
>        'de':u"schoener Foo"
>     },
>     'bar':{
>        'en':u"even better Bar",
>     }
>
> How could I do this?

Just do the usual thing: _(u'text'). If you do not type the text in Python, 
then you have to write your own I18n support. For example, I wrote a simple 
CSV vocabulary that generates messages. I then wrote a special CSV title 
message extraction tool and integrated it in the i18nextract tool.

Here is the code:

def CSVVocabulary(filename, messageFactory=_):
    # Create a prefix
    prefix = os.path.split(filename)[-1][:-4]
    # Open a file and read the data
    f = file(filename)
    reader = csv.reader(f, delimiter=";")
    # Create the terms and the vocabulary
    terms = []
    for id, title in reader:
        title = unicode(title, 'latin1')
        term = vocabulary.SimpleTerm(id, title=_(prefix+'-'+id, default=title)
)
        terms.append(term)
    return vocabulary.SimpleVocabulary(terms)


def _extract_csv_strings(arg, dirname, fnames):
    catalog, basepath, exclude_dirs = arg
    # Make sure we have a data directory
    if os.path.split(dirname)[-1] != 'data':
        return
    # Make sure we are not stepping into an excluded dir
    for exclude_dir in exclude_dirs:
        if dirname.startswith(exclude_dir):
            return
    # Now we extract all strings from the csv files
    for filename in fnames:
        if filename.endswith('.csv'):
            fullpath = os.path.join(dirname, filename)
            vocab = CSVVocabulary(fullpath)
            for index, term in enumerate(vocab):
                if term.title not in catalog:
                    catalog[term.title] = []
                reportpath = fullpath.replace(basepath, '')
                catalog[term.title].append((reportpath, index+1))


def csv_strings(path, base_dir, exclude_dirs=()):
    """Extract message strings from CSV data files"""
    catalog = {}
    exclude_dirs = [os.path.join(path, dir) for dir in exclude_dirs]
    os.path.walk(path, _extract_csv_strings, (catalog, base_dir, exclude_dirs)
)
    return catalog


Regards,
Stephan
-- 
Stephan Richter
CBU Physics & Chemistry (B.S.) / Tufts Physics (Ph.D. student)
Web2k - Web Software Design, Development and Training


More information about the Zope3-users mailing list