From 301172f850ef1039089a5538c6fc327c30dfb92a Mon Sep 17 00:00:00 2001 From: Bastian Eicher Date: Wed, 3 Nov 2010 00:43:48 +0100 Subject: [PATCH] Split languages codes by a hyphen (-) instead of an underscore (_) This fits W3C's definition of the "xml:lang" attribute: http://www.w3.org/TR/REC-xml/#sec-lang-tag Also, the selection logic has changed: - If the user didn't set a preferred language, assume they want "en_US" - If a doesn't specify a language, assume it's "en" - If there's no exact match, and no language match, default to the "en" entry --- tests/Local.xml | 6 +++--- tests/testmodel.py | 9 +++++++-- zeroinstall/injector/model.py | 17 ++++++++++++----- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/tests/Local.xml b/tests/Local.xml index b062215..46607de 100644 --- a/tests/Local.xml +++ b/tests/Local.xml @@ -1,9 +1,9 @@ Echo - Local feed - Local feed (English) - Local feed (English GB) + Local feed (English) + Local feed (Greek) + Local feed (English GB) Fuente local English diff --git a/tests/testmodel.py b/tests/testmodel.py index b4f9ea8..f623eeb 100755 --- a/tests/testmodel.py +++ b/tests/testmodel.py @@ -97,7 +97,8 @@ class TestModel(BaseTest): local_path = os.path.join(mydir, 'Local.xml') dom = qdom.parse(open(local_path)) feed = model.ZeroInstallFeed(dom, local_path = local_path) - self.assertEquals("Local feed", feed.summary) + # (defaults to en-US if no language is set in the locale) + self.assertEquals("Local feed (English)", feed.summary) self.assertEquals("English", feed.description) self.assertEquals(4, len(feed.summaries)) @@ -109,9 +110,13 @@ class TestModel(BaseTest): self.assertEquals("Fuente local", feed.summary) self.assertEquals(u"EspaƱol", feed.description) + basetest.test_locale = ('en_GB', 'UTF8') + + self.assertEquals("Local feed (English GB)", feed.summary) + basetest.test_locale = ('fr_FR', 'UTF8') - self.assertEquals("Local feed", feed.summary) + self.assertEquals("Local feed (English)", feed.summary) self.assertEquals("English", feed.description) finally: basetest.test_locale = (None, None) diff --git a/zeroinstall/injector/model.py b/zeroinstall/injector/model.py index d747f8e..42ee8f0 100644 --- a/zeroinstall/injector/model.py +++ b/zeroinstall/injector/model.py @@ -78,9 +78,16 @@ def _join_arch(osys, machine): def _best_language_match(options): (language, encoding) = locale.getlocale(locale.LC_ALL) - return (options.get(language, None) or - (language and options.get(language.split('_', 1)[0], None)) or - options.get(None, None)) + + if language: + # xml:lang uses '-', while LANG uses '_' + language = language.replace('_', '-') + else: + language = 'en-US' + + return (options.get(language, None) or # Exact match (language+region) + options.get(language.split('-', 1)[0], None) or # Matching language + options.get('en', None)) # English class Stability(object): """A stability rating. Each implementation has an upstream stability rating and, @@ -801,9 +808,9 @@ class ZeroInstallFeed(object): if x.name == 'name': self.name = x.content elif x.name == 'description': - self.descriptions[x.attrs.get("http://www.w3.org/XML/1998/namespace lang", None)] = x.content + self.descriptions[x.attrs.get("http://www.w3.org/XML/1998/namespace lang", 'en')] = x.content elif x.name == 'summary': - self.summaries[x.attrs.get("http://www.w3.org/XML/1998/namespace lang", None)] = x.content + self.summaries[x.attrs.get("http://www.w3.org/XML/1998/namespace lang", 'en')] = x.content elif x.name == 'feed-for': feed_iface = x.getAttribute('interface') if not feed_iface: -- 2.11.4.GIT