i18n and i18n testing

darcs-hash:20070516154706-86b55-26ff27dcec5af50f9024791cebfccf4d07166618.gz
This commit is contained in:
David Rousselie
2007-05-16 17:47:06 +02:00
parent 770b8a4de6
commit b8942af6b5
5 changed files with 197 additions and 82 deletions

View File

@@ -87,7 +87,7 @@ class JCLComponent(Component, object):
disco_category, \ disco_category, \
disco_type) disco_type)
# default values # default values
self.name = "Jabber Component Library generic component" self.name = lang.get_default_lang_class().component_name
self.spool_dir = "." self.spool_dir = "."
self.db_connection_str = db_connection_str self.db_connection_str = db_connection_str
self.version = VERSION self.version = VERSION
@@ -229,6 +229,13 @@ class JCLComponent(Component, object):
name = to_jid.node name = to_jid.node
account_type = to_jid.resource account_type = to_jid.resource
lang_class = self.lang.get_lang_class_from_node(info_query.get_node()) 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 if name is not None: # account
self.__logger.debug("Applying behavior on account " + name) self.__logger.debug("Applying behavior on account " + name)
result = account_handler(name, from_jid, account_type or "", lang_class) 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: \ lambda name, from_jid, account_type, lang_class: \
self.account_manager.account_type_disco_get_items(from_jid, account_type), \ self.account_manager.account_type_disco_get_items(from_jid, account_type), \
lambda name, from_jid, account_type, lang_class: \ 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): def handle_get_version(self, info_query):
"""Get Version handler """Get Version handler
@@ -543,16 +550,23 @@ class AccountManager(object):
+ " class not in account_classes") + " class not in account_classes")
return disco_items 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""" """Discovery get_items on root node"""
disco_items = DiscoItems() disco_items = DiscoItems()
regexp_type = re.compile("(.*)Account$") regexp_type = re.compile("(.*)Account$")
if self.has_multiple_account_type: # list accounts with only one type declared 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: \ def _list_account_types(disco_items, account_class, bare_from_jid, account_type):
DiscoItem(disco_items, \ 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), \ JID(unicode(self.component.jid) + "/" + account_type), \
account_type, \ account_type, \
account_type) type_label)
list_func = _list_account_types
else: else:
list_func = self._list_accounts list_func = self._list_accounts
@@ -578,7 +592,6 @@ class AccountManager(object):
info_query = info_query.make_result_response() info_query = info_query.make_result_response()
account_class = self._get_account_class(account_type + "Account") account_class = self._get_account_class(account_type + "Account")
self.db_connect() self.db_connect()
# TODO : do it only one time
accounts = account_class.select(\ accounts = account_class.select(\
AND(account_class.q.name == name, \ AND(account_class.q.name == name, \
account_class.q.user_jid == unicode(from_jid.bare()))) account_class.q.user_jid == unicode(from_jid.bare())))

View File

@@ -53,7 +53,6 @@ class FeederComponent(JCLComponent):
port, \ port, \
db_connection_str, \ db_connection_str, \
lang = lang) lang = lang)
self.name = "Generic Feeder Component"
# Define default feeder and sender, can be override # Define default feeder and sender, can be override
self.feeder = Feeder(self) self.feeder = Feeder(self)
self.sender = Sender(self) self.sender = Sender(self)

View File

@@ -121,6 +121,10 @@ class MockStreamRaiseException(MockStream):
def loop_iter(self, timeout): def loop_iter(self, timeout):
raise Exception("in loop error") raise Exception("in loop error")
class LangExample(Lang):
class en(Lang.en):
type_example_name = "Type Example"
class JCLComponent_TestCase(unittest.TestCase): class JCLComponent_TestCase(unittest.TestCase):
########################################################################### ###########################################################################
# Utility methods # Utility methods
@@ -441,6 +445,7 @@ class JCLComponent_TestCase(unittest.TestCase):
def test_disco_get_items_2types_no_node(self): def test_disco_get_items_2types_no_node(self):
"""get_items on main entity. Must account types""" """get_items on main entity. Must account types"""
self.comp.lang = LangExample()
self.comp.account_manager.account_classes = (ExampleAccount, Example2Account) self.comp.account_manager.account_classes = (ExampleAccount, Example2Account)
account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL) account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL)
account11 = ExampleAccount(user_jid = "user1@test.com", \ account11 = ExampleAccount(user_jid = "user1@test.com", \
@@ -458,10 +463,11 @@ class JCLComponent_TestCase(unittest.TestCase):
disco_item = disco_items.get_items()[0] disco_item = disco_items.get_items()[0]
self.assertEquals(unicode(disco_item.get_jid()), unicode(self.comp.jid) + "/Example") self.assertEquals(unicode(disco_item.get_jid()), unicode(self.comp.jid) + "/Example")
self.assertEquals(disco_item.get_node(), "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] disco_item = disco_items.get_items()[1]
self.assertEquals(unicode(disco_item.get_jid()), unicode(self.comp.jid) + "/Example2") self.assertEquals(unicode(disco_item.get_jid()), unicode(self.comp.jid) + "/Example2")
self.assertEquals(disco_item.get_node(), "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") self.assertEquals(disco_item.get_name(), "Example2")
# Be careful, account_classes cannot contains parent classes # Be careful, account_classes cannot contains parent classes

View File

@@ -66,11 +66,17 @@ class Lang:
""" """
return self.get_lang_class(self.get_lang_from_node(node)) 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: 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" register_instructions = u"Enter connection parameters"
message_status = u" accounts registered." message_status = u" accounts registered."
account_name = u"Connection name" account_name = u"Connection name"
password_saved_for_session = u"Password will be kept during your " \ password_saved_for_session = u"Password will be kept during your " \
u"Jabber session" u"Jabber session"
ask_password_subject = u"Password request" ask_password_subject = u"Password request"
@@ -78,8 +84,18 @@ class Lang:
"for account %s\n" "for account %s\n"
new_account_message_subject = u"New account '%s' created" new_account_message_subject = u"New account '%s' created"
new_account_message_body = u"New account 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" 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_action_0 = u"Do nothing"
field_chat_action_0 = field_action_0 field_chat_action_0 = field_action_0
field_online_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_dnd_action_0 = field_action_0
field_offline_action_0 = field_action_0 field_offline_action_0 = field_action_0
update_account_message_subject = u"Updated account '%s'" check_error_subject = u"Error"
update_account_message_body = u"Updated account" check_error_body = u"An error has occured:\n\t%s"
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)"
class fr: class fr:
register_title = u"Enregistrement d'une nouvelle connexion à un " \ component_name = u"composant générique Jabber Component Library"
u"serveur email." register_title = u"Enregistrement d'une nouvelle connexion"
register_instructions = u"Entrer les paramètres de connexion" register_instructions = u"Entrer les paramètres de connexion"
message_status = u" comptes enregistrés."
account_name = u"Nom de la connexion" account_name = u"Nom de la connexion"
account_login = u"Nom d'utilisateur"
account_password = u"Mot de passe" password_saved_for_session = u"Le mot de passe sera garder tout au " \
account_password_store = u"Sauvegarder le mot de passe sur le " \ u"long de la session Jabber."
u"serveur Jabber ?" ask_password_subject = u"Demande de mot de passe"
account_host = u"Adresse du serveur email" ask_password_body = u"Répondre à ce message avec le mot de passe " \
account_port = u"Port du serveur email" u"du compte %s\n"
account_type = u"Type du serveur email" new_account_message_subject = u"Le compte '%s' a été créé"
account_mailbox = u"Chemin de la boîte email (IMAP)" new_account_message_body = u"Compte créé"
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'"
update_account_message_subject = u"Le compte '%s' a été mis " \ update_account_message_subject = u"Le compte '%s' a été mis " \
u"à jour" u"à jour"
update_account_message_body = u"Compte mis à 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éé" mandatory_field = u"%s est requis"
ask_password_subject = u"Demande de mot de passe"
ask_password_body = u"Répondre à ce message avec le mot de passe " \ field_chat_action = u"Action lorsque l'état est 'Free For Chat'"
u"du compte suivant : \n" \ field_online_action = u"Action lorsque l'état est 'Online'"
u"\thost = %s\n" \ field_away_action = u"Action lorsque l'état est 'Away'"
u"\tlogin = %s\n" field_xa_action = u"Action lorsque l'état est 'Not Available'"
password_saved_for_session = u"Le mot de passe sera garder tout au " \ field_dnd_action = u"Action lorsque l'état est 'Do not Disturb'"
u"long de la session Jabber." field_offline_action = u"Action lorsque l'état est 'Offline'"
check_error_subject = u"Erreur lors de la vérification des emails."
check_error_body = u"Une erreur est survenue lors de la " \ field_action_0 = u"Ne rien Faire"
u"vérification des emails :\n\t%s" field_chat_action_0 = field_action_0
new_mail_subject = u"Nouvel email de %s" field_online_action_0 = field_action_0
new_digest_subject = u"%i nouveau(x) email(s)" 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: 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_title = u"Registratie van verbindingen voor Jabber Mail"
register_instructions = u"Instellingen voor verbinding" register_instructions = u"Instellingen voor verbinding"
account_name = u"Accountnaam" account_name = u"Accountnaam"
@@ -211,6 +192,7 @@ class Lang:
new_digest_subject = u"%i nieuwe e-mail(s)" new_digest_subject = u"%i nieuwe e-mail(s)"
class es: 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_title = u"Registro de nueva cuenta de email"
register_instructions = u"Inserta los datos para la nueva cuenta" register_instructions = u"Inserta los datos para la nueva cuenta"
account_name = u"Nombre para la cuenta" account_name = u"Nombre para la cuenta"
@@ -260,6 +242,7 @@ class Lang:
new_digest_subject = u"%i email(s) nuevo(s)" new_digest_subject = u"%i email(s) nuevo(s)"
class pl: 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_title = u"Rejestracja w komponencie E-Mail"
register_instructions = u"Wprowadź parametry połączenia" register_instructions = u"Wprowadź parametry połączenia"
account_name = u"Nazwa połączenia" account_name = u"Nazwa połączenia"
@@ -303,3 +286,45 @@ class Lang:
u"emaili:\n\t%s" u"emaili:\n\t%s"
new_mail_subject = u"Nowy email od %s" new_mail_subject = u"Nowy email od %s"
new_digest_subject = u"%i nowy(ch) email(i)" 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)"

View File

@@ -1,4 +1,3 @@
# -*- coding: UTF-8 -*-
## ##
## test_lang.py ## test_lang.py
## Login : David Rousselie <dax@happycoders.org> ## Login : David Rousselie <dax@happycoders.org>
@@ -62,9 +61,82 @@ class Lang_TestCase(unittest.TestCase):
iq_node.setLang("fr") iq_node.setLang("fr")
lang = self.lang.get_lang_class_from_node(iq_node) lang = self.lang.get_lang_class_from_node(iq_node)
self.assertEquals(lang, Lang.fr) 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(): 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__': if __name__ == '__main__':
unittest.main(defaultTest='suite') unittest.main(defaultTest='suite')