2010-05-23 2 views
3

PyGTK 응용 프로그램에서 일부 현지화 및 번역 설정을 정리하고 있습니다. 이 응용 프로그램은 GNU/Linux 시스템에서만 사용하도록되어 있습니다. 우리가 원하는 기능 중 하나는 사용자가 응용 프로그램에 사용되는 언어를 선택하는 것입니다 (일부는 모국어 선호, 일부는 일관성을 위해 영어 선호, 일부는 낭만주의 등으로 인해 프랑스어와 유사 함).PyGTK UI 문자열에 사용 가능한 언어 나열

이 기능을 사용하려면 실제로 다양한 언어로 된 콤보 상자를 표시해야합니다. 이 목록을 어떻게 얻을 수 있습니까? 사실, 언어 코드 ("en", "ru"등)와 언어 이름이 인 자국어 언어 ("영어 (미국)", "Русские") 쌍의 목록이 필요합니다.

브 루트 포스 메서드를 구현해야한다면 모든 언어 코드 디렉토리 (예 : "en/") 상대 경로"LC_MESSAGES/OurAppName.mo "를 포함합니다.

프로그래밍 방식이 더 있습니까?

답변

2

gettext를 사용하면 번역을 사용할 수 있는지 확인할 수 있지만 babel (내 우분투 시스템에서 패키지 python-pybabel으로 사용 가능)을 사용하여 이름을 가져올 수 있습니다.

import gettext 
import babel 

messagefiles = gettext.find('OurAppName', 
    languages=babel.Locale('en').languages.keys(), 
    all=True) 
messagefiles.sort() 

languages = [path.split('/')[-3] for path in messagefiles] 
langlist = zip(languages, 
    [babel.Locale.parse(lang).display_name for lang in languages]) 

print langlist 

relevant section of the Python docs를 참조하십시오 프로그램의 중간에 언어를 변경하려면 : 여기 당신이 원하는 목록을 반환하는 코드입니다. 이것은 확실하지 않지만 GTK 위젯을 모두 재구성해야합니다.

gettext.find에 대한 자세한 내용은 여기 link입니다.

+0

나는 gettext.find (...) 메소드 나 babel 패키지를 알지 못했습니다. 나는 곧 이것을 시도 할 것이다. – detly

+0

그런데 pybabel에 대한 괜찮은 문서가 있습니까? – detly

+0

꽤 괜찮지 만 온라인이 아니며 패키지와 함께 설치됩니다. – ptomato

0

다음은 gettext.find에서 영감을 얻었지만 Babel의 언어 목록이 필요없는 파일이 있는지 확인합니다. 그것은 로캘 코드를 반환하지만, 각각에 대해 display_name을 얻으려면 여전히 바벨 (babel)을 사용해야합니다.

def available_langs(self, domain=None, localedir=None): 
    if domain is None: 
     domain = gettext._current_domain 
    if localedir is None: 
     localedir = gettext._default_localedir 
    files = glob(os.path.join(localedir, '*', 'LC_MESSAGES', '%s.mo' % domain)) 
    langs = [file.split(os.path.sep)[-3] for file in files] 
    return langs