def test_lang_code(self): project = Project(language_aliases="xx:cs") component = Component(project=project) component.filemask = "Solution/Project/Resources.*.resx" # Pure extraction self.assertEqual( component.get_lang_code("Solution/Project/Resources.es-mx.resx"), "es-mx") # No match self.assertEqual( component.get_lang_code("Solution/Project/Resources.resx"), "") # Language aliases self.assertEqual( component.get_lang_code("Solution/Project/Resources.xx.resx"), "xx") self.assertEqual(project.get_language_alias("xx"), "cs") self.assertRaisesMessage( ValidationError, "The language code for " "Solution/Project/Resources.resx" " was empty, please check the filemask.", component.clean_lang_codes, [ "Solution/Project/Resources.resx", "Solution/Project/Resources.de.resx", "Solution/Project/Resources.es.resx", "Solution/Project/Resources.es-mx.resx", "Solution/Project/Resources.fr.resx", "Solution/Project/Resources.fr-fr.resx", ], )
def check_unit(self, nplurals=3, template=None, source_info=None, **kwargs): if nplurals == 3: equation = "n==0 ? 0 : n==1 ? 1 : 2" else: equation = "0" lang = Language.objects.create(code="zz") plural = Plural.objects.create( language=lang, number=nplurals, equation=equation ) project = Project(slug="test", source_language=Language.objects.get(code="en")) component = Component( slug="comp", project=project, file_format="xliff", template=template ) translation = Translation(language=lang, component=component, plural=plural) # Fake file format to avoid need for actual files translation.store = EmptyFormat(BytesIOMode("", b"")) unit = Unit(translation=translation, id_hash=-1, **kwargs) if source_info: for key, value in source_info.items(): setattr(unit, key, value) unit.get_comments = fake_get_comments unit.__dict__["suggestions"] = [ Suggestion(target="Weblate translator suggestion") ] else: unit.get_comments = empty_get_comments exporter = self.get_exporter(lang, translation=translation) exporter.add_unit(unit) return self.check_export(exporter)
def check_unit(self, nplurals=3, template=None, **kwargs): if nplurals == 3: equation = 'n==0 ? 0 : n==1 ? 1 : 2' else: equation = '0' lang = Language.objects.create( code='zz', ) plural = Plural.objects.create( language=lang, number=nplurals, equation=equation ) project = Project( slug='test', source_language=Language.objects.get(code='en'), ) component = Component( slug='comp', project=project, file_format='xliff', template=template ) translation = Translation( language=lang, component=component, plural=plural, ) # Fake file format to avoid need for actual files translation.store = EmptyFormat(BytesIOMode('', b'')) unit = Unit(translation=translation, id_hash=-1, **kwargs) exporter = self.get_exporter(lang, translation=translation) exporter.add_unit(unit) return self.check_export(exporter)
def check_unit(self, nplurals=3, template=None, source_info=None, **kwargs): if nplurals == 3: formula = "n==0 ? 0 : n==1 ? 1 : 2" else: formula = "0" lang = Language.objects.create(code="zz") plural = Plural.objects.create(language=lang, number=nplurals, formula=formula) project = Project(slug="test") component = Component( slug="comp", project=project, file_format="xliff", template=template, source_language=Language.objects.get(code="en"), ) translation = Translation(language=lang, component=component, plural=plural) # Fake file format to avoid need for actual files translation.store = EmptyFormat(BytesIOMode("", b"")) unit = Unit(translation=translation, id_hash=-1, **kwargs) if source_info: for key, value in source_info.items(): setattr(unit, key, value) # The dashes need special handling in XML based formats unit.__dict__["unresolved_comments"] = [ Comment(comment="Weblate translator comment ---- ") ] unit.__dict__["suggestions"] = [ Suggestion(target="Weblate translator suggestion") ] else: unit.__dict__["unresolved_comments"] = [] unit.source_unit = unit exporter = self.get_exporter(lang, translation=translation) exporter.add_unit(unit) return self.check_export(exporter)
def get_exporter(self, lang=None): if lang is None: lang = Language(code='xx') return self._class( language=lang, project=Project(slug='test', name='TEST'), )
def check_unit(self, nplurals=3, **kwargs): if nplurals == 3: equation = 'n==0 ? 0 : n==1 ? 1 : 2' else: equation = '0' lang = Language( code='zz', nplurals=nplurals, pluralequation=equation ) project = Project( slug='test', source_language=Language.objects.get(code='en'), ) subproject = SubProject(slug='comp', project=project) unit = Unit( translation=Translation( language=lang, subproject=subproject ), **kwargs ) exporter = self.get_exporter(lang) exporter.add_unit(unit) return self.check_export(exporter)
def check_unit(self, nplurals=3, **kwargs): if nplurals == 3: equation = 'n==0 ? 0 : n==1 ? 1 : 2' else: equation = '0' lang = Language.objects.create( code='zz', ) plural = Plural.objects.create( language=lang, number=nplurals, equation=equation ) project = Project( slug='test', source_language=Language.objects.get(code='en'), ) component = Component(slug='comp', project=project) unit = Unit( translation=Translation( language=lang, component=component, plural=plural, ), id_hash=-1, **kwargs ) exporter = self.get_exporter(lang) exporter.add_unit(unit) return self.check_export(exporter)
def validate_render_component(value, translation=None, **kwargs): from weblate.trans.models import Project, Component, Translation from weblate.lang.models import Language component = Component( project=Project( name='project', slug='project', id=-1, ), name='component', slug='component', branch='master', vcs='git', id=-1, ) if translation: kwargs['translation'] = Translation( id=-1, component=component, language_code='xx', language=Language(name='xxx', code='xx'), ) else: kwargs['component'] = component validate_render(value, **kwargs)
def test_lang_code_template(self): component = Component(project=Project()) component.filemask = "Solution/Project/Resources.*.resx" component.template = "Solution/Project/Resources.resx" self.assertEqual( component.get_lang_code("Solution/Project/Resources.resx"), "en" )
def test_lang_code_plus(self): component = Component(project=Project()) component.filemask = "po/*/master/pages/C_and_C++.po" self.assertEqual( component.get_lang_code("po/cs/master/pages/C_and_C++.po"), "cs", )
def test_lang_code_template(self): component = Component(project=Project()) component.filemask = 'Solution/Project/Resources.*.resx' component.template = 'Solution/Project/Resources.resx' self.assertEqual( component.get_lang_code('Solution/Project/Resources.resx'), 'en' )
def get_exporter(self, lang=None, **kwargs): if lang is None: lang, created = Language.objects.get_or_create(code="xx") if created: Plural.objects.create(language=lang) return self._class( language=lang, project=Project(slug="test", name="TEST"), **kwargs )
def test_lang_code_template(self): subproject = SubProject(project=Project()) subproject.filemask = 'Solution/Project/Resources.*.resx' subproject.template = 'Solution/Project/Resources.resx' self.assertEqual( subproject.get_lang_code('Solution/Project/Resources.resx'), 'en' )
def clone_repo(self, path): return self._class.clone( self.format_local_path(getattr(self, "{0}_repo_path".format(self._vcs))), path, component=Component( slug="test", name="Test", project=Project(name="Test", slug="test") ), )
def get_exporter(self, lang=None): if lang is None: lang, created = Language.objects.get_or_create(code='xx') if created: Plural.objects.create(language=lang) return self._class( language=lang, project=Project(slug='test', name='TEST'), )
def clone_repo(self, path): return self._class.clone( self.get_remote_repo_url(), path, self._remote_branch, component=Component(slug="test", name="Test", project=Project(name="Test", slug="test")), )
def clone_repo(self, path): return self._class.clone( self.format_local_path(getattr(self, '{0}_repo_path'.format(self._vcs))), path, component=Component( slug='test', name='Test', project=Project(name='Test', slug='test') ), )
def setUp(self): self.unit = Unit(translation=Translation( component=Component( project=Project(source_language=Language(), slug="p", name="p"), slug="c", name="c", ), language=Language(), )) self.profile = Profile()
def handle(self, *args, **options): """List installed add-ons.""" fake_addon = Addon(component=Component(project=Project(pk=-1), pk=-1)) for _unused, obj in sorted(ADDONS.items()): self.stdout.write(f".. _addon-{obj.name}:") self.stdout.write("\n") self.stdout.write(obj.verbose) self.stdout.write("-" * len(obj.verbose)) self.stdout.write("\n") self.stdout.write(f":Add-on ID: ``{obj.name}``") if obj.settings_form: form = obj(fake_addon).get_settings_form(None) table = [(f"``{name}``", str(field.label), self.get_help_text(field, name)) for name, field in form.fields.items()] prefix = ":Configuration: " name_width = max( len(name) for name, _label, _help_text in table) label_width = max( len(label) for _name, label, _help_text in table) help_text_width = max( max(len(line) for line in help_text) if help_text else 0 for _name, _label, help_text in table) name_row = "-" * (name_width + 2) label_row = "-" * (label_width + 2) help_text_row = "-" * (help_text_width + 2) for name, label, help_text in table: if not prefix.isspace(): self.stdout.write( f"{prefix}+{name_row}+{label_row}+{help_text_row}+" ) prefix = " " if not help_text: line = "" self.stdout.write( f"{prefix}| {name:<{name_width}s} | {label:<{label_width}s} | {line:<{help_text_width}s} |" ) for pos, line in enumerate(help_text): if pos > 0: name = label = "" self.stdout.write( f"{prefix}| {name:<{name_width}s} | {label:<{label_width}s} | {line:<{help_text_width}s} |" ) self.stdout.write( f"{prefix}+{name_row}+{label_row}+{help_text_row}+") else: self.stdout.write( ":Configuration: `This add-on has no configuration.`") events = ", ".join(EVENT_NAMES[event] for event in obj.events) self.stdout.write(f":Triggers: {events}") self.stdout.write("\n") self.stdout.write("\n".join(wrap(obj.description, 79))) self.stdout.write("\n")
def test_lang_code_double(self): component = Component(project=Project()) component.filemask = "path/*/resources/MessagesBundle_*.properties" self.assertEqual( component.get_lang_code( "path/pt/resources/MessagesBundle_pt_BR.properties"), "pt_BR", ) self.assertEqual( component.get_lang_code( "path/el/resources/MessagesBundle_el.properties"), "el", )
def check_unit(self, nplurals=3, **kwargs): lang = Language(code='zz', nplurals=nplurals) project = Project( slug='test', source_language=Language.objects.get(code='en'), ) subproject = SubProject(slug='comp', project=project) unit = Unit(translation=Translation(language=lang, subproject=subproject), **kwargs) exporter = self.get_exporter() exporter.add_unit(unit) return self.check_export(exporter)
def handle(self, *args, **options): """List installed add-ons.""" fake_addon = Addon(component=Component(project=Project())) for _unused, obj in sorted(ADDONS.items()): self.stdout.write(f".. _addon-{obj.name}:") self.stdout.write("\n") self.stdout.write(obj.verbose) self.stdout.write("-" * len(obj.verbose)) self.stdout.write("\n") if obj.settings_form: form = obj(fake_addon).get_settings_form(None) params = ", ".join(f"``{key}``" for key in form.fields.keys()) else: params = "`This add-on has no configuration.`" self.stdout.write(PARAMS_TABLE.format(obj.name, params)) self.stdout.write("\n") self.stdout.write("\n".join(wrap(obj.description, 79))) self.stdout.write("\n")
def check_unit(self, nplurals=3, template=None, source_info=None, **kwargs): if nplurals == 3: equation = 'n==0 ? 0 : n==1 ? 1 : 2' else: equation = '0' lang = Language.objects.create(code='zz', ) plural = Plural.objects.create(language=lang, number=nplurals, equation=equation) project = Project( slug='test', source_language=Language.objects.get(code='en'), ) component = Component(slug='comp', project=project, file_format='xliff', template=template) translation = Translation( language=lang, component=component, plural=plural, ) # Fake file format to avoid need for actual files translation.store = EmptyFormat(BytesIOMode('', b'')) unit = Unit(translation=translation, id_hash=-1, **kwargs) if source_info: for key, value in source_info.items(): setattr(unit, key, value) unit.get_comments = fake_get_comments unit.__dict__['suggestions'] = [ Suggestion(target='Weblate translator suggestion') ] else: unit.get_comments = empty_get_comments exporter = self.get_exporter(lang, translation=translation) exporter.add_unit(unit) return self.check_export(exporter)
def handle(self, *args, **options): """List installed add-ons.""" fake_addon = Addon(component=Component(project=Project())) for _unused, obj in sorted(ADDONS.items()): self.stdout.write(f".. _addon-{obj.name}:") self.stdout.write("\n") self.stdout.write(obj.verbose) self.stdout.write("-" * len(obj.verbose)) self.stdout.write("\n") self.stdout.write(f":Add-on ID: ``{obj.name}``") if obj.settings_form: form = obj(fake_addon).get_settings_form(None) table = [ (f"``{name}``", str(field.label), str(field.help_text)) for name, field in form.fields.items() ] prefix = ":Configuration: " name_width = max(len(row[0]) for row in table) label_width = max(len(row[1]) for row in table) help_text_width = max(len(row[2]) for row in table) name_row = "-" * (name_width + 2) label_row = "-" * (label_width + 2) help_text_row = "-" * (help_text_width + 2) for name, label, help_text in table: if not prefix.isspace(): self.stdout.write( f"{prefix}+{name_row}+{label_row}+{help_text_row}+" ) prefix = " " self.stdout.write( f"{prefix}| {name:<{name_width}s} | {label:<{label_width}s} | {help_text:<{help_text_width}s} |" ) self.stdout.write( f"{prefix}+{name_row}+{label_row}+{help_text_row}+" ) else: self.stdout.write(":Configuration: `This add-on has no configuration.`") self.stdout.write("\n") self.stdout.write("\n".join(wrap(obj.description, 79))) self.stdout.write("\n")
def validate_render_component(value, translation=None, **kwargs): from weblate.lang.models import Language from weblate.trans.models import Component, Project, Translation component = Component( project=Project(name="project", slug="project", id=-1), name="component", slug="component", branch="main", vcs="git", id=-1, ) if translation: kwargs["translation"] = Translation( id=-1, component=component, language_code="xx", language=Language(name="xxx", code="xx"), ) else: kwargs["component"] = component validate_render(value, **kwargs)
def get_new_project(project_name, repository, tmpl_component_slug): tmpl_component = Component.objects.get(slug=tmpl_component_slug) new_project = Project() new_project.name = project_name new_project.slug = get_project_slug(project_name) new_project.web = giturlparse.parse(repository).url2https new_project.mail = tmpl_component.project.mail new_project.instructions = tmpl_component.project.instructions new_project.set_language_team = tmpl_component.project.set_language_team new_project.use_shared_tm = tmpl_component.project.use_shared_tm new_project.use_shared_tm = tmpl_component.project.use_shared_tm new_project.contribute_shared_tm = tmpl_component.project.contribute_shared_tm new_project.access_control = tmpl_component.project.access_control new_project.translation_review = tmpl_component.project.translation_review new_project.source_review = tmpl_component.project.source_review new_project.enable_hooks = tmpl_component.project.enable_hooks new_project.language_aliases = tmpl_component.project.language_aliases new_project.save() return new_project
def get_new_project(project_name, repository, tmpl_component_slug): tmpl_component = Component.objects.get(slug=tmpl_component_slug) new_project = Project() new_project.name = project_name new_project.slug = get_project_slug(project_name) new_project.web = giturlparse.parse(repository).url2https new_project.access_control = \ tmpl_component.project.access_control new_project.enable_review = \ tmpl_component.project.enable_review new_project.enable_hooks = \ tmpl_component.project.enable_hooks new_project.set_language_team = \ tmpl_component.project.set_language_team new_project.source_language = \ tmpl_component.project.source_language new_project.instructions = \ tmpl_component.project.instructions new_project.mail = \ tmpl_component.project.mail new_project.save() return new_project
def get_exporter(self): return self._class( language=Language(code='xx'), project=Project(slug='test', name='TEST'), )