×
Namespaces

Variants
Actions
Revision as of 16:14, 27 February 2013 by lpvalente (Talk | contribs)

Archived:Adicionando suporte a várias linguagens em PySymbian

From Nokia Developer Wiki
Jump to: navigation, search

Archived.pngAquivado: Este artigo foi arquivado, pois o conteúdo não é mais considerado relevante para se criar soluções comerciais atuais. Se você achar que este artigo ainda é importante, inclua o template {{ForArchiveReview|escreva a sua justificativa}}.

Acredita-se que este artigo ainda seja válido no contexto original (quando ele foi escrito)


Article Metadata

Exemplo de código
Compatibilidade
Artigo
Tradução:
Por marcelobarrosalmeida
Última alteração feita por lpvalente em 27 Feb 2013


Contents

Introdução

Neste artigo é apresentada uma estratégia para suporte a múltiplos idiomas em sua aplicação Python para S60. Basicamente um idioma default é definido e o suporte a novos idiomas podem ser adicionados posteriormente. Além disso, existe a possibilidade de se ter traduções parciais, muito comum na vida de um projeto. Traduções faltantes em um novo idioma são cobertas pelo idioma default, permitindo uma evolução incremental do projeto.

A estratégia é composta de um script principal (wm_locale.py) usado para carregar dinamicamente os idiomas suportados e por arquivos de localização, contendo as traduções. Os arquivos de localização também são arquivos python e são importados como módulos. Usando a introspecção do Python, as traduções podem ser carregadas, sendo que as traduções faltantes são cobertas pelo idioma default.

Vamos ao código

O script principal está a seguir:

wm_locale.py

# -*- coding: utf-8 -*-
#
# Marcelo Barros de Almeida
# marcelobarrosalmeida (at) gmail.com
#
 
__all__ = [ "Locale" ]
 
class Loc_Data(object):
"Translation data holder"
pass
 
class Default(object):
"Default language support"
def __init__(self):
self.loc = Loc_Data()
self.loc.zero = u'Zero'
self.loc.one = u'One'
self.loc.two = u'Two'
self.loc.three = u'Three'
self.loc.four = u'Four'
self.loc.five = u'Five'
self.loc.six = u'Six'
self.loc.seven = u'Seven'
self.loc.eight = u'Eight'
self.loc.nine = u'Nine'
self.loc.change_language = u'Change Language'
self.loc.english_us = u'English (USA)'
self.loc.finnish = u'Finnish'
self.loc.hungarian = u'Hungarian'
self.loc.portuguese_br = u'Portuguese (Brazil)'
self.loc.about = u'About'
self.loc.exit = u'Exit'
 
class Locale(Default):
"Multiple language support class"
 
LOC_MODULE = "wm_locale_%s"
 
def __init__(self,lang = ""):
"Load all locale strings for one specific language or default if empty"
self.set_locale(lang)
 
def set_locale(self,lang = ""):
"Load all locale strings for one specific language or default if empty"
Default.__init__(self)
 
try:
lang_mod = __import__( self.LOC_MODULE % ( lang ) )
except ImportError:
pass
else:
self.merge_locale(lang_mod)
 
def merge_locale(self, lang_mod):
"Merge new location string into default locale"
 
# substitui as strings existentes e mantém a mais antiga
# se estiver faltando no módulo de localização
for k,v in self.loc.__dict__.iteritems():
if hasattr(lang_mod,k):
nv = lang_mod.__getattribute__(k)
self.loc.__setattr__(k,nv)

Todas as traduções default são definidas na classe Default() usando o atributo self.loc. Cada string em seu programa deve ser representada por um novo atributo em self.loc.

Os módulos de localização são carregados dinamicamente usando uma convenção para o nome do arquivo usado, a saber:

LOC_MODULE = "wm_locale_%s"

Isto, é, se você tem as traduções para o idioma pt_BR, crie um arquivo chamado wm_locale_pt_BR.py e, dentro dele, coloque todas as traduções presentes no idioma default, removing a classe e a referência a self.loc. Assim, cada localização fica bastante simples e mesmo pessoas sem conhecimento de programação conseguirão fornecer um arquivo de traduções. Para o exemplo citado, o arquivo de localização seria escrito como:

wm_locale_pt_BR.py

# -*- coding: utf-8 -*-
#
# Marcelo Barros de Almeida
# marcelobarrosalmeida (at) gmail.com
#
zero = u'Zero'
one = u'Um'
two = u'Dois'
three = u'Três'
four = u'Quatro'
five = u'Cinco'
six = u'Seis'
seven = u'Sete'
eight = u'Oito'
nine = u'Nove'
change_language = u'Mudar idioma'
english_us = u'Inglês (EUA)'
finnish = u'Finlandês'
hungarian = u'Húngaro'
portuguese_br = u'Português (Brasil)'
about = u'Sobre'
exit = u'Sair'

O programa a seguir demonstra como fazer uso do suporte a vários idiomas.

wm_locale_demo.py

# -*- coding: utf-8 -*-
#
# Marcelo Barros de Almeida
# marcelobarrosalmeida (at) gmail.com
#
 
import sys
sys.path.append(r'e:\python')
 
import appuifw
import e32
import wm_locale
 
class Locale_Demo(object):
def __init__(self):
appuifw.app.exit_key_handler = self.close
appuifw.app.title = u"Locale Demo"
self.update_locale()
self.app_lock = e32.Ao_lock()
 
def close(self):
self.app_lock.signal()
 
def about(self):
appuifw.note( u"Locale Demo by Marcelo Barros", "info" )
 
def update_locale(self,lang=""):
self.labels = wm_locale.Locale(lang)
self.refresh()
 
def refresh(self):
entries = [
self.labels.loc.zero,
self.labels.loc.one,
self.labels.loc.two,
self.labels.loc.three,
self.labels.loc.four,
self.labels.loc.five,
self.labels.loc.six,
self.labels.loc.seven,
self.labels.loc.eight,
self.labels.loc.nine
]
 
self.body = appuifw.Listbox(entries)
 
self.menu = [
(self.labels.loc.change_language, (
(self.labels.loc.english_us, lambda: self.update_locale("en_US")),
(self.labels.loc.finnish, lambda: self.update_locale("fi")),
(self.labels.loc.hungarian, lambda: self.update_locale("hu")),
(self.labels.loc.portuguese_br, lambda: self.update_locale("pt_BR"))
)
),
(self.labels.loc.about, self.about),
(self.labels.loc.exit, self.close)
]
 
appuifw.app.menu = self.menu
appuifw.app.body = self.body
 
def run(self):
self.app_lock.wait()
appuifw.app.menu = []
appuifw.app.body = None
appuifw.app.set_exit()
 
if __name__ == "__main__":
 
ld = Locale_Demo()
ld.run()

À medida que tenha mais arquivos com traduções, vá acrescentando-os ao seu projeto. As traduções a seguir foram fornecidas por [1]. Perceba que algumas traduções estão faltando.

wm_locale_en_US.py

zero = u'Zero'
one = u'One'
two = u'Two'
three = u'Three'
four = u'Four'
five = u'Five'
six = u'Six'
seven = u'Seven'
eight = u'Eight'
nine = u'Nine'
change_language = u'Change Language'
english_us = u'English (USA)'
finnish = u'Finnish'
hungarian = u'Hungarian'
portuguese_br = u'Portuguese (Brazil)'
about = u'About'
exit = u'Exit'

wm_locale_fi.py

zero = u'nolla'
one = u'yksi'
two = u'kaksi'
three = u'kolme'
four = u'neljä'
five = u'viisi'
six = u'kuusi'
seven = u'seitsemän'
eight = u'kandeksan'
nine = u'yhdeksän'
change_language = u'Vaihda kieli'
english_us = u'englanti'
finnish = u'suomi'
hungarian = u'unkari'
about = u'Tietoja'
exit = u'Poistu'

wm_locale_hu.py

zero = u'nulla'
one = u'egy'
two = u'kett\u0151'
three = u'három'
four = u'négy'
five = u'öt'
six = u'hat'
seven = u'hét'
eight = u'nyolc'
nine = u'kilenc'
change_language = u'Nyelv változtatás'
english_us = u'angol'
finnish = u'finn'
hungarian = u'magyar'
about = u'Információ'
exit = u'Kijárat'

Screenshots e código fonte

Exemplo mostrando os elementos da lista em inglês e o menu de seleção de idiomas.

MBA locale demo01.jpg

Exemplo mostrando os elementos da lista em Português e o menu de seleção de idiomas.

MBA locale demo02.jpg

Exemplo mostrando os elementos da lista em Húngaro.

MBA locale demo03.jpg

Baixe o código fonte do exemplo: Media:MBA locale demo src.zip

Referencias

Meus agradecimentos ao Rafael T. e ao JOM pelas boas discussões no Fórum Nokia.

90 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×