[Checkins] SVN: CMF/trunk/i18nextract.py - extracting i18n messages can now be done in CMF.buildout

Yvo Schubbe y.2009 at wcm-solutions.de
Fri Dec 4 10:15:40 EST 2009


Log message for revision 106209:
  - extracting i18n messages can now be done in CMF.buildout

Changed:
  D   CMF/trunk/i18nextract.py

-=-
Deleted: CMF/trunk/i18nextract.py
===================================================================
--- CMF/trunk/i18nextract.py	2009-12-04 15:10:44 UTC (rev 106208)
+++ CMF/trunk/i18nextract.py	2009-12-04 15:15:40 UTC (rev 106209)
@@ -1,266 +0,0 @@
-#!/usr/bin/env python2.4
-##############################################################################
-#
-# Copyright (c) 2003 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Extract message strings from python modules, page template files
-and ZCML files.
-
-$Id$
-"""
-# XXX: This is a modified copy of zope.app.locales.extract (r79598).
-#      Extracting from ZCML is disabled for now.
-#
-#      This is just used to create .pot files for CMF. Don't make your code
-#      depend on it, it might be changed or removed without further notice!
-__docformat__ = 'restructuredtext'
-
-import os, sys, fnmatch
-import getopt
-import time
-import traceback
-
-from zope.app.locales.extract import DEFAULT_CHARSET
-from zope.app.locales.extract import DEFAULT_ENCODING
-from zope.app.locales.extract import find_files
-from zope.app.locales.extract import normalize_path
-from zope.app.locales.extract import POTMaker
-from zope.app.locales.extract import py_strings
-from zope.app.locales.extract import zcml_strings
-from zope.app.locales.extract import usage
-
-pot_header = '''\
-##############################################################################
-#
-# Copyright (c) 2008 Zope Corporation and Contributors. All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-msgid ""
-msgstr ""
-"Project-Id-Version: CMF 2.2\\n"
-"POT-Creation-Date: $Date$\\n"
-"Language-Team: CMF Developers <zope-cmf at zope.org>\\n"
-"MIME-Version: 1.0\\n"
-"Content-Type: text/plain; charset=%(charset)s\\n"
-"Content-Transfer-Encoding: %(encoding)s\\n"
-
-'''
-
-class POTMaker(POTMaker):
-    """This class inserts sets of strings into a POT file.
-    """
-
-    def write(self):
-        file = open(self._output_filename, 'w')
-        file.write(pot_header % {'time':     time.ctime(),
-                                 'charset':  DEFAULT_CHARSET,
-                                 'encoding': DEFAULT_ENCODING})
-
-        # Sort the catalog entries by filename
-        catalog = self.catalog.values()
-        catalog.sort()
-
-        # Write each entry to the file
-        for entry in catalog:
-            entry.write(file)
-
-        file.close()
-
-
-def tal_strings(dir, domain="zope", include_default_domain=False, exclude=()):
-    """Retrieve all TAL messages from `dir` that are in the `domain`.
-
-      >>> from zope.app.locales import extract
-      >>> import tempfile
-      >>> dir = tempfile.mkdtemp()
-      
-    Let's create a page template in the i18n domain ``test``:
-      >>> testpt = open(os.path.join(dir, 'test.pt'), 'w')
-      >>> testpt.write('<tal:block i18n:domain="test" i18n:translate="">test</tal:block>')
-      >>> testpt.close()
-      
-    And now one in no domain:
-      >>> nopt = open(os.path.join(dir, 'no.pt'), 'w')
-      >>> nopt.write('<tal:block i18n:translate="">no domain</tal:block>')
-      >>> nopt.close()
-
-    Now let's find the strings for the domain ``test``:
-
-      >>> extract.tal_strings(dir, domain='test', include_default_domain=True)
-      {'test': [('...test.pt', 1)], 'no domain': [('...no.pt', 1)]}
-
-    And now an xml file
-      >>> xml = open(os.path.join(dir, 'xml.pt'), 'w')
-      >>> xml.write('''<?xml version="1.0" encoding="utf-8"?>
-      ... <rss version="2.0"
-      ...     i18n:domain="xml"
-      ...     xmlns:i18n="http://xml.zope.org/namespaces/i18n"
-      ...     xmlns:tal="http://xml.zope.org/namespaces/tal"
-      ...     xmlns="http://purl.org/rss/1.0/modules/content/">
-      ...  <channel>
-      ...    <link i18n:translate="">Link Content</link>
-      ...  </channel>
-      ... </rss>
-      ... ''')
-      >>> xml.close()
-      >>> extract.tal_strings(dir, domain='xml')
-      {u'Link Content': [('...xml.pt', 8)]}
-
-    Cleanup
-
-      >>> import shutil
-      >>> shutil.rmtree(dir) 
-    """
-
-    # We import zope.tal.talgettext here because we can't rely on the
-    # right sys path until app_dir has run
-    from zope.tal.talgettext import POEngine, POTALInterpreter
-    from zope.tal.htmltalparser import HTMLTALParser
-    from zope.tal.talparser import TALParser
-    engine = POEngine()
-
-    class Devnull(object):
-        def write(self, s):
-            pass
-
-    filenames = find_files(dir, '*.pt', exclude=tuple(exclude)) \
-              + find_files(dir, '*.html', exclude=tuple(exclude)) \
-              + find_files(dir, '*.xml', exclude=tuple(exclude))
-
-    for filename in sorted(filenames):
-        f = file(filename,'rb')
-        start = f.read(6)
-        f.close()
-        if start.startswith('<?xml'):
-            parserFactory = TALParser
-        else:
-            parserFactory = HTMLTALParser
-        try:
-            engine.file = filename
-            p = parserFactory()
-            p.parseFile(filename)
-            program, macros = p.getCode()
-            POTALInterpreter(program, macros, engine, stream=Devnull(),
-                             metal=False)()
-        except: # Hee hee, I love bare excepts!
-            print 'There was an error processing', filename
-            traceback.print_exc()
-
-    # See whether anything in the domain was found
-    if not engine.catalog.has_key(domain):
-        return {}
-    # We do not want column numbers.
-    catalog = engine.catalog[domain].copy()
-    # When the Domain is 'default', then this means that none was found;
-    # Include these strings; yes or no?
-    if include_default_domain:
-        defaultCatalog = engine.catalog.get('default')
-        if defaultCatalog == None:
-            engine.catalog['default'] = {}
-        catalog.update(engine.catalog['default'])
-    for msgid, locations in catalog.items():
-        catalog[msgid] = map(lambda l: (l[0], l[1][0]), locations)
-    return catalog
-
-def main(argv=None):
-    if argv is None:
-        argv = sys.argv[1:]
-
-    try:
-        opts, args = getopt.getopt(
-            argv,
-            'hd:s:i:p:o:x:',
-            ['help', 'domain=', 'site_zcml=', 'path=', 'python-only'])
-    except getopt.error, msg:
-        usage(1, msg)
-
-    domain = 'zope'
-    path = None
-    include_default_domain = True
-    output_dir = None
-    exclude_dirs = []
-    python_only = False
-    site_zcml = None
-    for opt, arg in opts:
-        if opt in ('-h', '--help'):
-            usage(0)
-        elif opt in ('-d', '--domain'):
-            domain = arg
-        elif opt in ('-s', '--site_zcml'):
-            if not os.path.exists(arg):
-                usage(1, 'The specified location for site.zcml does not exist')
-            site_zcml = normalize_path(arg)
-        elif opt in ('-e', '--exclude-default-domain'):
-            include_default_domain = False
-        elif opt in ('-o', ):
-            output_dir = arg
-        elif opt in ('-x', ):
-            exclude_dirs.append(arg)
-        elif opt in ('--python-only',):
-            python_only = True
-        elif opt in ('-p', '--path'):
-            if not os.path.exists(arg):
-                usage(1, 'The specified path does not exist.')
-            path = normalize_path(arg)
-
-    if path is None:
-        usage(1, 'You need to provide the module search path with -p PATH.')
-    sys.path.insert(0, path)
-
-    # When generating the comments, we will not need the base directory info,
-    # since it is specific to everyone's installation
-    base_dir = path+os.sep
-
-    output_file = domain+'.pot'
-    if output_dir:
-        output_dir = os.path.join(path, output_dir)
-        if not os.path.exists(output_dir):
-            os.mkdir(output_dir)
-        output_file = os.path.join(output_dir, output_file)
-
-    print "base path: %r\n" \
-          "search path: %s\n" \
-          "'site.zcml' location: %s\n" \
-          "exclude dirs: %r\n" \
-          "domain: %r\n" \
-          "include default domain: %r\n" \
-          "output file: %r\n" \
-          "Python only: %r" \
-          % (base_dir, path, site_zcml, exclude_dirs, domain,
-             include_default_domain, output_file, python_only)
-
-    maker = POTMaker(output_file, path)
-    maker.add(py_strings(path, domain, exclude=exclude_dirs), base_dir)
-    if not python_only:
-        if site_zcml is not None:
-            maker.add(zcml_strings(path, domain, site_zcml), base_dir)
-        maker.add(tal_strings(path, domain, include_default_domain,
-                              exclude=exclude_dirs), base_dir)
-    maker.write()
-
-    manual_file = os.path.join(output_dir, domain+'-manual.pot')
-    if os.path.exists(manual_file):
-        manual = file(manual_file, 'r')
-        auto = file(output_file, 'a')
-        auto.write(manual.read())
-        auto.close()
-        manual.close()
-
-if __name__ == '__main__':
-    main()



More information about the checkins mailing list