×
Namespaces

Variants
Actions

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 hamishwillee em 07 May 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.

This page was last modified on 7 May 2013, at 14:15.
83 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.

×