라이브러리에 있는 Python gettext 모듈과 이를 사용하는 모듈을 동시에 호출하고 설정할 수 있나요?

StackOverflow https://stackoverflow.com/questions/246137

문제

나는 번역해야 할 텍스트 피드백을 포함하는 라이브러리를 코딩하고 있습니다.

내 앱의 모든 곳에서 가져오는 _config.py 모듈에 다음 줄을 넣었습니다.

import gettext, os, sys
pathname = os.path.dirname(sys.argv[0])
localdir = os.path.abspath(pathname) + "/locale"
gettext.install("messages", localdir)

./locale/lang_LANG/LC_MESSAGES에 *.mo 파일이 있고 번역해야 하는 모든 문자열에 _() 함수를 적용합니다.

이제 프로그래머로 추정되는 사용자가 자신만의 메시지를 작성할 수 있는 기능을 추가했습니다.나는 그가 기본 구현에 신경쓰는 것을 원하지 않기 때문에 그가 Apple이 되어 다음과 같이 간단하게 만들 수 있기를 바랍니다.

lib_object.message = "My message"

나는 그것을 깔끔하게 만들기 위해 속성을 사용했지만, 내 사용자가 자신의 코드(내 코드를 사용)를 번역하고 다음과 같은 작업을 수행하면 어떻게 될까요?

import gettext, os, sys
pathname = os.path.dirname(sys.argv[0])
localdir = os.path.abspath(pathname) + "/locale"
gettext.install("user_app", localdir)

lib_object.message = _("My message")

이게 문제가 되나요 ?사용자를 괴롭히지 않고 문제를 방지하려면 어떻게 해야 합니까?

도움이 되었습니까?

해결책

클래스 기반 gettext API를 사용하여 메시지 카탈로그를 격리할 수 있습니다.이는 에서 권장하는 사항이기도 합니다. 파이썬 gettext 문서.

단점은 당신이나 다른 개발자가 gettext 메소드를 사용하거나 _() 특정 gettext 클래스에 바인딩된 로컬 범위의 메서드입니다.자체 문자열 카탈로그가 있는 클래스의 예:

import gettext

class MyClass(object):
    def __init__(self, locale_for_instance):
        self.lang = gettext.translation("appname", localedir, \
                                         locale=locale_for_instance)

    def some_method(self, arg):
        return self.lang.gettext("You called some method")

    def other_method(self, arg): # does the same thing
        _ = self.lang.gettext
        return _("You called some method")

추가하기 위해 코드를 붙일 수 있습니다. _() 데코레이터에서는 이를 필요로 하는 모든 메소드에 다음과 같은 접두사가 붙습니다. @with_local_gettext

(참고로 위의 내용을 테스트하지는 않았지만 제대로 작동해야 합니다(tm))

목표가 사용자를 괴롭히지 않는 것이라면(그리고 그 사람이 별로 좋지 않은 경우) 코드에서 클래스 기반 접근 방식을 사용하고 사용자가 전역 접근 방식을 사용하도록 할 수 있을 것 같습니다.

다른 팁

한 번만 얻을 수 있습니다. 일반적으로 라이브러리 작업에는 쓸모가 없습니다. 라이브러리 코드는 Mailman이하는 일과 유사한 일을해야합니다.이 모듈에 대한 올바른 인수를 전달하는 GetText () 용 래퍼가있어서 사용하려는 각 모듈에서 '_'로 가져옵니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top