def test_removes_domain(self): # In Plone, the domain is defined through the basename of the # pofile. The "Domain:" header is not necessary, so we remove it. fshelpers.create_structure(self.tempdir, { 'pyfoo/foo/locales/foo.pot': fshelpers.asset('foo.pot'), 'pyfoo/foo/locales/de/LC_MESSAGES/foo.po': fshelpers.asset( 'foo-de.po')}) catalog = loader.load_translation_catalog(self.tempdir) writer.write_catalog(self.tempdir, catalog) pofile = fshelpers.cat(self.tempdir, 'pyfoo/foo/locales/de/LC_MESSAGES/foo.po') lines = pofile.split('\n') self.assertEquals([], filter(lambda line: line.startswith('"Domain'), lines))
def test_updating_existing_messages(self): fshelpers.create_structure(self.tempdir, { 'pyfoo/foo/locales/foo.pot': fshelpers.asset('foo.pot'), 'pyfoo/foo/locales/de/LC_MESSAGES/foo.po': fshelpers.asset( 'foo-de.po')}) catalog = loader.load_translation_catalog(self.tempdir) message = catalog.get_message('pyfoo', 'foo', 'Login') message.translate('de', 'Einloggen') writer.write_catalog(self.tempdir, catalog) pofile = fshelpers.cat(self.tempdir, 'pyfoo/foo/locales/de/LC_MESSAGES/foo.po') self.assertIn( '\n'.join(('msgid "Login"', 'msgstr "Einloggen"')), pofile)
def test_updating_existing_messages(self): fshelpers.create_structure( self.tempdir, { 'pyfoo/foo/locales/foo.pot': fshelpers.asset('foo.pot'), 'pyfoo/foo/locales/de/LC_MESSAGES/foo.po': fshelpers.asset('foo-de.po') }) catalog = loader.load_translation_catalog(self.tempdir) message = catalog.get_message('pyfoo', 'foo', 'Login') message.translate('de', 'Einloggen') writer.write_catalog(self.tempdir, catalog) pofile = fshelpers.cat(self.tempdir, 'pyfoo/foo/locales/de/LC_MESSAGES/foo.po') self.assertIn('\n'.join(('msgid "Login"', 'msgstr "Einloggen"')), pofile)
def test_removes_domain(self): # In Plone, the domain is defined through the basename of the # pofile. The "Domain:" header is not necessary, so we remove it. fshelpers.create_structure( self.tempdir, { 'pyfoo/foo/locales/foo.pot': fshelpers.asset('foo.pot'), 'pyfoo/foo/locales/de/LC_MESSAGES/foo.po': fshelpers.asset('foo-de.po') }) catalog = loader.load_translation_catalog(self.tempdir) writer.write_catalog(self.tempdir, catalog) pofile = fshelpers.cat(self.tempdir, 'pyfoo/foo/locales/de/LC_MESSAGES/foo.po') lines = pofile.split('\n') self.assertEquals([], filter(lambda line: line.startswith('"Domain'), lines))
def test_removes_language_code_and_name(self): # In Plone, the language is defined through the location of the # pofile, e.g. it is obvious that locales/de/LC_MESSAGES/foo.po is # a German translation. # We therefore do not include the language-code and language-name # headers in the po file and remove them when i18ndude adds them, # so that they are no longer wrong.. fshelpers.create_structure(self.tempdir, { 'pyfoo/foo/locales/foo.pot': fshelpers.asset('foo.pot'), 'pyfoo/foo/locales/de/LC_MESSAGES/foo.po': fshelpers.asset( 'foo-de.po')}) catalog = loader.load_translation_catalog(self.tempdir) writer.write_catalog(self.tempdir, catalog) pofile = fshelpers.cat(self.tempdir, 'pyfoo/foo/locales/de/LC_MESSAGES/foo.po') lines = pofile.split('\n') self.assertEquals(['"Language-Team: LANGUAGE <*****@*****.**>\\n"'], filter(lambda line: line.startswith('"Lang'), lines))
def test_removes_language_code_and_name(self): # In Plone, the language is defined through the location of the # pofile, e.g. it is obvious that locales/de/LC_MESSAGES/foo.po is # a German translation. # We therefore do not include the language-code and language-name # headers in the po file and remove them when i18ndude adds them, # so that they are no longer wrong.. fshelpers.create_structure( self.tempdir, { 'pyfoo/foo/locales/foo.pot': fshelpers.asset('foo.pot'), 'pyfoo/foo/locales/de/LC_MESSAGES/foo.po': fshelpers.asset('foo-de.po') }) catalog = loader.load_translation_catalog(self.tempdir) writer.write_catalog(self.tempdir, catalog) pofile = fshelpers.cat(self.tempdir, 'pyfoo/foo/locales/de/LC_MESSAGES/foo.po') lines = pofile.split('\n') self.assertEquals(['"Language-Team: LANGUAGE <*****@*****.**>\\n"'], filter(lambda line: line.startswith('"Lang'), lines))
def test_updating_translations(self): self.write('buildout.cfg', BUILDOUT_CONFIG) self.system(self.buildout) package = 'the/package' locales = (package, 'locales') locales_de = (locales, 'de/LC_MESSAGES') locales_en = (locales, 'en/LC_MESSAGES') profile = (package, 'profiles/default') fshelpers.create_structure(self.sample_buildout, { (locales, 'package.pot'): fshelpers.asset('empty.pot'), (locales, 'package-manual.pot'): pohelpers.makepo({ 'label_login': ('Login', '')}), (locales, 'plone.pot'): pohelpers.makepo({ 'save': ('Save', '')}), (locales_de, 'package.po'): ( fshelpers.asset('empty.po')), (locales_en, 'plone.po'): ( fshelpers.asset('empty.po')), (package, '__init__.py'): '_("Foo")', (profile, 'content_creation/01.json'): json.dumps([ {'title:translate(package)': 'ContentPage'}])}) output = self.system(self.i18n_build + ' de') try: # pot file building self.assertDictContainsSubset( {u'label_login': u''}, pohelpers.messages(locales, 'package.pot'), 'package-manual.pot was not merged') self.assertDictContainsSubset( {u'Foo': u''}, pohelpers.messages(locales, 'package.pot'), 'Package was not scanned, python file translation missing.') self.assertDictContainsSubset( {u'ContentPage': u''}, pohelpers.messages(locales, 'package.pot'), 'Inflater content creation was not scanned.') # po syncing self.assertEquals({u'label_login': u'', u'Foo': u'', u'ContentPage': u''}, pohelpers.messages(locales_de, 'package.po'), 'Default domain ("package") .po-file was not synced.') self.assertEquals({u'save': u''}, pohelpers.messages(locales_de, 'plone.po'), 'Alternate domain ("plone") .po-file was not synced.') self.assertEquals({u'save': u''}, pohelpers.messages(locales_en, 'plone.po'), 'Existing language was not synced.') lines = fshelpers.cat(locales_de, 'package.po').split('\n') self.assertEquals( [], filter(lambda line: line.startswith('"Domain'), lines), '.po-files should not contain Domain-headers, because' ' they are not relevant and often not set correctly.') # path comments self.assertDictContainsSubset( {u'Foo': [u'./the/package/__init__.py:1']}, pohelpers.message_references(locales, 'package.pot'), 'Path comments are wrong.') except: print '-' * 30 print output print '-' * 30 raise
def test_updating_translations(self): self.write('buildout.cfg', BUILDOUT_CONFIG) self.system(self.buildout) package = 'the/package' locales = (package, 'locales') locales_de = (locales, 'de/LC_MESSAGES') locales_en = (locales, 'en/LC_MESSAGES') profile = (package, 'profiles/default') fshelpers.create_structure( self.sample_buildout, { (locales, 'package.pot'): fshelpers.asset('empty.pot'), (locales, 'package-manual.pot'): pohelpers.makepo({'label_login': ('Login', '')}), (locales, 'plone.pot'): pohelpers.makepo({'save': ('Save', '')}), (locales_de, 'package.po'): (fshelpers.asset('empty.po')), (locales_en, 'plone.po'): (fshelpers.asset('empty.po')), (package, '__init__.py'): '_("Foo")', (profile, 'content_creation/01.json'): json.dumps([{ 'title:translate(package)': 'ContentPage' }]) }) output = self.system(self.i18n_build + ' de') try: # pot file building self.assertDictContainsSubset({u'label_login': u''}, pohelpers.messages( locales, 'package.pot'), 'package-manual.pot was not merged') self.assertDictContainsSubset( {u'Foo': u''}, pohelpers.messages(locales, 'package.pot'), 'Package was not scanned, python file translation missing.') self.assertDictContainsSubset( {u'ContentPage': u''}, pohelpers.messages(locales, 'package.pot'), 'Inflater content creation was not scanned.') # po syncing self.assertEquals( { u'label_login': u'', u'Foo': u'', u'ContentPage': u'' }, pohelpers.messages(locales_de, 'package.po'), 'Default domain ("package") .po-file was not synced.') self.assertEquals( {u'save': u''}, pohelpers.messages(locales_de, 'plone.po'), 'Alternate domain ("plone") .po-file was not synced.') self.assertEquals({u'save': u''}, pohelpers.messages(locales_en, 'plone.po'), 'Existing language was not synced.') lines = fshelpers.cat(locales_de, 'package.po').split('\n') self.assertEquals( [], filter(lambda line: line.startswith('"Domain'), lines), '.po-files should not contain Domain-headers, because' ' they are not relevant and often not set correctly.') # path comments self.assertDictContainsSubset( {u'Foo': [u'./the/package/__init__.py:1']}, pohelpers.message_references(locales, 'package.pot'), 'Path comments are wrong.') except: print '-' * 30 print output print '-' * 30 raise
def headers(*pathparts): lines = fshelpers.cat(pathparts).split('\n') headers = filter(re.compile('".*:.*"').match, lines) headers = map(lambda line: line.rstrip('"').lstrip('"'), headers) headers = map(lambda line: map(str.strip, line.split(':', 1)), headers) return dict(headers)