From b8942af6b5e26cbed92fdac338e28fe4095ad252 Mon Sep 17 00:00:00 2001 From: David Rousselie Date: Wed, 16 May 2007 17:47:06 +0200 Subject: [PATCH] i18n and i18n testing darcs-hash:20070516154706-86b55-26ff27dcec5af50f9024791cebfccf4d07166618.gz --- src/jcl/jabber/component.py | 27 +++-- src/jcl/jabber/feeder.py | 1 - src/jcl/jabber/tests/component.py | 8 +- src/jcl/lang.py | 165 +++++++++++++++++------------- src/jcl/tests/lang.py | 78 +++++++++++++- 5 files changed, 197 insertions(+), 82 deletions(-) diff --git a/src/jcl/jabber/component.py b/src/jcl/jabber/component.py index 30b9ade..50e45cb 100644 --- a/src/jcl/jabber/component.py +++ b/src/jcl/jabber/component.py @@ -87,7 +87,7 @@ class JCLComponent(Component, object): disco_category, \ disco_type) # default values - self.name = "Jabber Component Library generic component" + self.name = lang.get_default_lang_class().component_name self.spool_dir = "." self.db_connection_str = db_connection_str self.version = VERSION @@ -229,6 +229,13 @@ class JCLComponent(Component, object): name = to_jid.node account_type = to_jid.resource lang_class = self.lang.get_lang_class_from_node(info_query.get_node()) + # * root + # |-* account_type1 + # | |-* account1 + # | |-* account2 + # |-* account_type2 + # |-* account3 + # |-* account4 if name is not None: # account self.__logger.debug("Applying behavior on account " + name) result = account_handler(name, from_jid, account_type or "", lang_class) @@ -264,7 +271,7 @@ class JCLComponent(Component, object): lambda name, from_jid, account_type, lang_class: \ self.account_manager.account_type_disco_get_items(from_jid, account_type), \ lambda name, from_jid, account_type, lang_class: \ - self.account_manager.root_disco_get_items(from_jid)) + self.account_manager.root_disco_get_items(from_jid, lang_class)) def handle_get_version(self, info_query): """Get Version handler @@ -543,16 +550,23 @@ class AccountManager(object): + " class not in account_classes") return disco_items - def root_disco_get_items(self, from_jid): + def root_disco_get_items(self, from_jid, lang_class): """Discovery get_items on root node""" disco_items = DiscoItems() regexp_type = re.compile("(.*)Account$") if self.has_multiple_account_type: # list accounts with only one type declared - list_func = lambda disco_items, account_class, bare_from_jid, account_type: \ - DiscoItem(disco_items, \ + def _list_account_types(disco_items, account_class, bare_from_jid, account_type): + type_label_attr = "type_" + account_type.lower() + "_name" + if hasattr(lang_class, type_label_attr): + type_label = getattr(lang_class, type_label_attr) + else: + type_label = account_type + return DiscoItem(disco_items, \ JID(unicode(self.component.jid) + "/" + account_type), \ account_type, \ - account_type) + type_label) + list_func = _list_account_types + else: list_func = self._list_accounts @@ -578,7 +592,6 @@ class AccountManager(object): info_query = info_query.make_result_response() account_class = self._get_account_class(account_type + "Account") self.db_connect() - # TODO : do it only one time accounts = account_class.select(\ AND(account_class.q.name == name, \ account_class.q.user_jid == unicode(from_jid.bare()))) diff --git a/src/jcl/jabber/feeder.py b/src/jcl/jabber/feeder.py index 634ddf2..e02c64d 100644 --- a/src/jcl/jabber/feeder.py +++ b/src/jcl/jabber/feeder.py @@ -53,7 +53,6 @@ class FeederComponent(JCLComponent): port, \ db_connection_str, \ lang = lang) - self.name = "Generic Feeder Component" # Define default feeder and sender, can be override self.feeder = Feeder(self) self.sender = Sender(self) diff --git a/src/jcl/jabber/tests/component.py b/src/jcl/jabber/tests/component.py index e017c76..19352fb 100644 --- a/src/jcl/jabber/tests/component.py +++ b/src/jcl/jabber/tests/component.py @@ -121,6 +121,10 @@ class MockStreamRaiseException(MockStream): def loop_iter(self, timeout): raise Exception("in loop error") +class LangExample(Lang): + class en(Lang.en): + type_example_name = "Type Example" + class JCLComponent_TestCase(unittest.TestCase): ########################################################################### # Utility methods @@ -441,6 +445,7 @@ class JCLComponent_TestCase(unittest.TestCase): def test_disco_get_items_2types_no_node(self): """get_items on main entity. Must account types""" + self.comp.lang = LangExample() self.comp.account_manager.account_classes = (ExampleAccount, Example2Account) account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL) account11 = ExampleAccount(user_jid = "user1@test.com", \ @@ -458,10 +463,11 @@ class JCLComponent_TestCase(unittest.TestCase): disco_item = disco_items.get_items()[0] self.assertEquals(unicode(disco_item.get_jid()), unicode(self.comp.jid) + "/Example") self.assertEquals(disco_item.get_node(), "Example") - self.assertEquals(disco_item.get_name(), "Example") + self.assertEquals(disco_item.get_name(), LangExample.en.type_example_name) disco_item = disco_items.get_items()[1] self.assertEquals(unicode(disco_item.get_jid()), unicode(self.comp.jid) + "/Example2") self.assertEquals(disco_item.get_node(), "Example2") + # no name in language class for type Example2, so fallback on type name self.assertEquals(disco_item.get_name(), "Example2") # Be careful, account_classes cannot contains parent classes diff --git a/src/jcl/lang.py b/src/jcl/lang.py index ec153f7..be3ef6f 100644 --- a/src/jcl/lang.py +++ b/src/jcl/lang.py @@ -66,11 +66,17 @@ class Lang: """ return self.get_lang_class(self.get_lang_from_node(node)) + def get_default_lang_class(self): + """Return default lang class according to self.default_lang""" + return self.get_lang_class(self.default_lang) + class en: - register_title = u"Jabber Mail connection registration" + component_name = u"Jabber Component Library generic component" + register_title = u"Connection registration" register_instructions = u"Enter connection parameters" message_status = u" accounts registered." account_name = u"Connection name" + password_saved_for_session = u"Password will be kept during your " \ u"Jabber session" ask_password_subject = u"Password request" @@ -78,8 +84,18 @@ class Lang: "for account %s\n" new_account_message_subject = u"New account '%s' created" new_account_message_body = u"New account created" + update_account_message_subject = u"Updated account '%s'" + update_account_message_body = u"Updated account" + mandatory_field = u"%s is required" + field_chat_action = u"Action when state is 'Free For Chat'" + field_online_action = u"Action when state is 'Online'" + field_away_action = u"Action when state is 'Away'" + field_xa_action = u"Action when state is 'Not Available'" + field_dnd_action = u"Action when state is 'Do not Disturb'" + field_offline_action = u"Action when state is 'Offline'" + field_action_0 = u"Do nothing" field_chat_action_0 = field_action_0 field_online_action_0 = field_action_0 @@ -88,84 +104,49 @@ class Lang: field_dnd_action_0 = field_action_0 field_offline_action_0 = field_action_0 - update_account_message_subject = u"Updated account '%s'" - update_account_message_body = u"Updated account" - check_error_subject = u"Error while checking emails." - check_error_body = u"An error appears while checking emails:\n\t%s" - -# account_login = u"Login" -# account_password = u"Password" -# account_password_store = u"Store password on Jabber server?" -# account_host = u"Host" -# account_port = u"Port" -# account_type = u"Mail server type" -# account_mailbox = u"Mailbox path (IMAP)" -# account_ffc_action = u"Action when state is 'Free For Chat'" -# account_online_action = u"Action when state is 'Online'" -# account_away_action = u"Action when state is 'Away'" -# account_xa_action = u"Action when state is 'Not Available'" -# account_dnd_action = u"Action when state is 'Do not Disturb'" -# account_offline_action = u"Action when state is 'Offline'" -# account_check_interval = u"Mail check interval (in minutes)" -# account_live_email_only = u"Reports only emails received while " \ -# u"connected to Jabber" -# action_nothing = u"Do nothing" -# action_retrieve = u"Retrieve mail" -# action_digest = u"Send mail digest" -# update_title = u"Jabber mail connection update" -# update_instructions = u"Modifying connection '%s'" -# connection_label = u"%s connection '%s'" -# new_mail_subject = u"New email from %s" -# new_digest_subject = u"%i new email(s)" + check_error_subject = u"Error" + check_error_body = u"An error has occured:\n\t%s" class fr: - register_title = u"Enregistrement d'une nouvelle connexion à un " \ - u"serveur email." + component_name = u"composant générique Jabber Component Library" + register_title = u"Enregistrement d'une nouvelle connexion" register_instructions = u"Entrer les paramètres de connexion" + message_status = u" comptes enregistrés." account_name = u"Nom de la connexion" - account_login = u"Nom d'utilisateur" - account_password = u"Mot de passe" - account_password_store = u"Sauvegarder le mot de passe sur le " \ - u"serveur Jabber ?" - account_host = u"Adresse du serveur email" - account_port = u"Port du serveur email" - account_type = u"Type du serveur email" - account_mailbox = u"Chemin de la boîte email (IMAP)" - account_ffc_action = u"Action lorsque l'état est 'Free For Chat'" - account_online_action = u"Action lorsque l'état est 'Online'" - account_away_action = u"Action lorsque l'état est 'Away'" - account_xa_action = u"Action lorsque l'état est 'Not Available'" - account_dnd_action = u"Action lorsque l'état est 'Do not Disturb'" - account_offline_action = u"Action lorsque l'état est 'Offline'" - account_check_interval = u"Interval de vérification de nouveaux " \ - u"emails (en minutes)" - account_live_email_only = u"Vérifier les nouveaux emails seulement " \ - "lorsqu'une session Jabber est ouverte" - action_nothing = u"Ne rien faire" - action_retrieve = u"Récupérer l'email" - action_digest = u"Envoyer un résumé" - update_title = u"Mise à jour du compte JMC" - update_instructions = u"Modification de la connexion '%s'" - connection_label = u"Connexion %s '%s'" + + password_saved_for_session = u"Le mot de passe sera garder tout au " \ + u"long de la session Jabber." + ask_password_subject = u"Demande de mot de passe" + ask_password_body = u"Répondre à ce message avec le mot de passe " \ + u"du compte %s\n" + new_account_message_subject = u"Le compte '%s' a été créé" + new_account_message_body = u"Compte créé" update_account_message_subject = u"Le compte '%s' a été mis " \ u"à jour" update_account_message_body = u"Compte mis à jour" - new_account_message_subject = u"Le compte '%s' a été créé" - new_account_message_body = u"Compte créé" - ask_password_subject = u"Demande de mot de passe" - ask_password_body = u"Répondre à ce message avec le mot de passe " \ - u"du compte suivant : \n" \ - u"\thost = %s\n" \ - u"\tlogin = %s\n" - password_saved_for_session = u"Le mot de passe sera garder tout au " \ - u"long de la session Jabber." - check_error_subject = u"Erreur lors de la vérification des emails." - check_error_body = u"Une erreur est survenue lors de la " \ - u"vérification des emails :\n\t%s" - new_mail_subject = u"Nouvel email de %s" - new_digest_subject = u"%i nouveau(x) email(s)" + + mandatory_field = u"%s est requis" + + field_chat_action = u"Action lorsque l'état est 'Free For Chat'" + field_online_action = u"Action lorsque l'état est 'Online'" + field_away_action = u"Action lorsque l'état est 'Away'" + field_xa_action = u"Action lorsque l'état est 'Not Available'" + field_dnd_action = u"Action lorsque l'état est 'Do not Disturb'" + field_offline_action = u"Action lorsque l'état est 'Offline'" + + field_action_0 = u"Ne rien Faire" + field_chat_action_0 = field_action_0 + field_online_action_0 = field_action_0 + field_away_action_0 = field_action_0 + field_xa_action_0 = field_action_0 + field_dnd_action_0 = field_action_0 + field_offline_action_0 = field_action_0 + + check_error_subject = u"Erreur" + check_error_body = u"Une erreur est survenue :\n\t%s" class nl: + # TODO: when finish, delete this line and uncomment in tests/lang.py the makeSuite(Language_nl_TestCase, 'test') line register_title = u"Registratie van verbindingen voor Jabber Mail" register_instructions = u"Instellingen voor verbinding" account_name = u"Accountnaam" @@ -211,6 +192,7 @@ class Lang: new_digest_subject = u"%i nieuwe e-mail(s)" class es: + # TODO: when finish, delete this line and uncomment in tests/lang.py the makeSuite(Language_es_TestCase, 'test') line register_title = u"Registro de nueva cuenta de email" register_instructions = u"Inserta los datos para la nueva cuenta" account_name = u"Nombre para la cuenta" @@ -260,6 +242,7 @@ class Lang: new_digest_subject = u"%i email(s) nuevo(s)" class pl: + # TODO: when finish, delete this line and uncomment in tests/lang.py the makeSuite(Language_pl_TestCase, 'test') line register_title = u"Rejestracja w komponencie E-Mail" register_instructions = u"Wprowadź parametry połączenia" account_name = u"Nazwa połączenia" @@ -303,3 +286,45 @@ class Lang: u"emaili:\n\t%s" new_mail_subject = u"Nowy email od %s" new_digest_subject = u"%i nowy(ch) email(i)" + + class cs: + register_title = u"Jabber MailNotify registrace" + register_instructions = u"Vložte nastavení spojení" + account_name = u"Název spojení" + account_login = u"Přihlašovací jméno" + account_password = u"Heslo" + account_password_store = u"Uložit heslo na Jabber serveru?" + account_host = u"Poštovní server" + account_port = u"Port" + account_type = u"Typ poštovního serveru" + account_mailbox = u"Cesta IMAP schránky" + account_ffc_action = u"Akce při statusu 'Ukecaný'" + account_online_action = u"Akce při statusu 'Přítomen'" + account_away_action = u"Akce při statusu 'Pryč'" + account_xa_action = u"Akce při statusu 'Nepřítomen'" + account_dnd_action = u"Akce při statusu 'Nerušit'" + account_offline_action = u"Akce při statusu 'Odpojen'" + account_check_interval = u"Interval kontroly pošty (v minutách)" + account_live_email_only = u"Informuj pouze o emailech, které přišly během připojení k Jabberu" + action_nothing = u"Nedělej nic" + action_retrieve = u"Přijmi poštu" + action_digest = u"Pošli upozornění na novou poštu" + update_title = u"Jabber - aktualizace spojení k emailu" + update_instructions = u"Aktualizace spojení '%s'" + connection_label = u"%s spojení '%s'" + update_account_message_subject = u"Aktualizováno %s spojení '%s'" + update_account_message_body = u"Registrováno s přihlašovacím jménem '%s' a " \ + u"heslem '%s' v '%s'" + new_account_message_subject = u"Nové spojení %s '%s' aktualizováno" + new_account_message_body = u"Registrováno " \ + u"s přihlašovacím jménem '%s' a heslem '%s' v '%s'" + ask_password_subject = u"Žádost o heslo" + ask_password_body = u"Odpovězte na tuto zprávu posláním hesla " \ + u"pro následující spojení: \n" \ + u"\thost = %s\n" \ + u"\tlogin = %s\n" + password_saved_for_session = u"Heslo bude uchováno během vašeho připojení k Jabberu" + check_error_subject = u"Chyba při kontrole emailů." + check_error_body = u"Nějaká chyba nastala při kontrole emailů:\n\t%s" + new_mail_subject = u"Nový email od %s" + new_digest_subject = u"%i má nový(é) email(y)" diff --git a/src/jcl/tests/lang.py b/src/jcl/tests/lang.py index 0305b2a..b0c17f6 100644 --- a/src/jcl/tests/lang.py +++ b/src/jcl/tests/lang.py @@ -1,4 +1,3 @@ -# -*- coding: UTF-8 -*- ## ## test_lang.py ## Login : David Rousselie @@ -62,9 +61,82 @@ class Lang_TestCase(unittest.TestCase): iq_node.setLang("fr") lang = self.lang.get_lang_class_from_node(iq_node) self.assertEquals(lang, Lang.fr) - + + def test_get_default_lang_class(self): + self.assertEquals(self.lang.get_default_lang_class(), Lang.en) + + def test_get_default_lang_class_other(self): + self.lang = Lang("fr") + self.assertEquals(self.lang.get_default_lang_class(), Lang.fr) + +class Language_TestCase(unittest.TestCase): + """Test language classes""" + + def setUp(self): + """must define self.lang_class. Lang.en is default""" + self.lang_class = Lang.en + + def test_strings(self): + self.assertNotEquals(self.lang_class.component_name, None) + self.assertNotEquals(self.lang_class.register_title, None) + self.assertNotEquals(self.lang_class.register_instructions, None) + self.assertNotEquals(self.lang_class.message_status, None) + self.assertNotEquals(self.lang_class.account_name, None) + + self.assertNotEquals(self.lang_class.password_saved_for_session, None) + self.assertNotEquals(self.lang_class.ask_password_subject, None) + self.assertNotEquals(self.lang_class.ask_password_body % (""), None) + self.assertNotEquals(self.lang_class.new_account_message_subject % (""), None) + self.assertNotEquals(self.lang_class.new_account_message_body, None) + self.assertNotEquals(self.lang_class.update_account_message_subject % (""), None) + self.assertNotEquals(self.lang_class.update_account_message_body, None) + + self.assertNotEquals(self.lang_class.mandatory_field % (""), None) + + self.assertNotEquals(self.lang_class.field_chat_action, None) + self.assertNotEquals(self.lang_class.field_online_action, None) + self.assertNotEquals(self.lang_class.field_away_action, None) + self.assertNotEquals(self.lang_class.field_xa_action, None) + self.assertNotEquals(self.lang_class.field_dnd_action, None) + self.assertNotEquals(self.lang_class.field_offline_action, None) + + self.assertNotEquals(self.lang_class.field_action_0, None) + self.assertNotEquals(self.lang_class.field_chat_action_0, None) + self.assertNotEquals(self.lang_class.field_online_action_0, None) + self.assertNotEquals(self.lang_class.field_away_action_0, None) + self.assertNotEquals(self.lang_class.field_xa_action_0, None) + self.assertNotEquals(self.lang_class.field_dnd_action_0, None) + self.assertNotEquals(self.lang_class.field_offline_action_0, None) + + self.assertNotEquals(self.lang_class.check_error_subject, None) + self.assertNotEquals(self.lang_class.check_error_body % (""), None) + + +class Language_fr_TestCase(Language_TestCase): + def setUp(self): + self.lang_class = Lang.fr + +class Language_nl_TestCase(Language_TestCase): + def setUp(self): + self.lang_class = Lang.nl + +class Language_es_TestCase(Language_TestCase): + def setUp(self): + self.lang_class = Lang.es + +class Language_pl_TestCase(Language_TestCase): + def setUp(self): + self.lang_class = Lang.pl + def suite(): - return unittest.makeSuite(Lang_TestCase, 'test') + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite(Lang_TestCase, 'test')) + suite.addTest(unittest.makeSuite(Language_TestCase, 'test')) + suite.addTest(unittest.makeSuite(Language_fr_TestCase, 'test')) +# suite.addTest(unittest.makeSuite(Language_nl_TestCase, 'test')) +# suite.addTest(unittest.makeSuite(Language_es_TestCase, 'test')) +# suite.addTest(unittest.makeSuite(Language_pl_TestCase, 'test')) + return suite if __name__ == '__main__': unittest.main(defaultTest='suite')