파이썬 애플리케이션
ai-i18n-tools는 Python과 Jinja, Django, Qt .ui 파일에서 UI 문자열을 추출한 다음, 소스 언어 문자열을 키로 사용하는 플랫 JSON, GNU gettext 카탈로그 또는 둘 다를 작성합니다. sourceLocale는 모든 언어가 될 수 있습니다. 런타임 헬퍼는 표준 라이브러리 i18n.py(Python 3.10 이상)입니다. Streamlit, Tkinter, PyQt, PySide, PyWebView, Flask, Pyramid, FastAPI는 해당 헬퍼를 호출합니다. Django는 Django 자체의 gettext를 사용합니다.
기존 단일 언어 앱에 로캘 추가하기: Python 앱에 i18n 추가하기, i18n.py 프롬프트 및 Django / gettext 프롬프트 포함. 프레임워크 선택기: Python 통합. 함수 목록: Python 런타임(i18n.py).
실행 가능한 복사본은 examples/python-streamlit, examples/python-flask, examples/python-fastapi 및 examples/python-gettext에 있습니다. 이들은 Python 프로젝트입니다. 처음 세 개는 virtualenv와 pip install -r requirements.txt를 사용합니다. python-gettext은(는) 표준 라이브러리만 사용합니다. 이들은 npm 패키지가 아닙니다. 릴리스 아카이브 ai-i18n-tools-python-examples.zip에는 동일한 네 개의 디렉터리가 포함되어 있습니다. npm tarball 및 독립 실행형 실행 파일에는 포함되어 있지 않습니다.
스캐폴드
ai-i18n-tools init -t ui-python -P cheaperinference
ai-i18n-tools init -t ui-python-gettext -P anthropic
ai-i18n-tools init -t ui-python-flask -P groq
ai-i18n-tools init -t ui-python-django -P ollamaui-python은(는) 평면 JSON 및 i18n.py을(를) 작성합니다. ui-python-gettext은(는) JSON 및 .po / .mo을(를) 작성합니다. ui-python-flask은(는) translations/ 및 i18n.py 아래에 gettext 카탈로그를 작성합니다. ui-python-django은(는) locale/<lang>/LC_MESSAGES/django.po을(를) 작성하며 i18n.py은(는) 작성하지 않습니다.
리포지토리 README도 번역하세요. 위의 init 명령어에 --with-readme를 추가하세요. README 및 Markdown 문서에 i18n 추가하기를 참조하세요.
스캔 루트는 node_modules, .git, .venv, venv, env, site-packages, __pycache__, .tox, .nox, .pytest_cache, .mypy_cache, .ruff_cache 및 .eggs을(를) 건너뜁니다.
번역 호출
카탈로그 항목을 먼저 조회한 다음 보간합니다.
이식성:
t("Hello, {name}!", name=name)
t("Total: {price:,.2f}", price=price)
_("Hello, %s!") % name
_("Total: {price:,.2f}").format(price=price)Python 3.14에서 헬퍼는 템플릿 문자열도 허용합니다:
translate(t"Hello, {name}!")translate은(는) t의 별칭입니다. 키워드 인수는 템플릿 문자열에서 가져온 값을 재정의합니다.
네이티브 gettext는 템플릿이 인수이므로 여전히 안전합니다:
_("Hello, %s!") % name
ngettext("1 file", "{count} files", count, count=count)
pgettext("menu", "Open")이들은 카탈로그 조회 전에 평가되므로 추출기는 이를 안전하지 않은 것으로 표시하고 migrate-python-i18n은(는) 이를 다시 작성합니다:
_(f"Hello, {name}!")
_("Hello, %s!" % name)
_("Hello, {name}!".format(name=name))migrate-python-i18n은(는) --write을(를) 전달하기 전까지는 드라이 런(dry run)입니다. migrate-python-i18n-report.md을(를) 작성합니다. {value=} 및 중첩된 형식 사양과 같은 디버그 필드는 보고되며 그대로 유지됩니다.
{% trans %} 및 {% blocktrans %}은(는) gettext %(name)s 자리 표시자가 됩니다. Jinja는 공백을 제거하고 축소합니다. Django는 태그에 trimmed이(가) 명시되지 않는 한 내부 공백을 유지합니다.
카탈로그
플랫 JSON 키는 소스 언어 문자열, 즉 sourceLocale의 텍스트입니다. 해당 언어는 모든 언어가 될 수 있습니다. 컨텍스트는 context + U+0004 + 해당 소스 문자열을 사용합니다. 복수형 슬롯은 translate-ui가 이미 작성하는 {md5}_one, {md5}_other 및 기타 CLDR 형식으로 유지됩니다. 헬퍼는 공백이 제거된 단수형을 MD5로 해시하고 처음 8개의 16진수 문자를 읽습니다.
Gettext 파일은 컨텍스트에 msgctxt을(를) 사용하고 복수형에 msgid / msgid_plural을(를) 사용합니다. ui.gettext.compileMo은(는) .po 옆에 .mo을(를) 작성합니다. purge-locale은(는) 해당 로캘의 .po 및 .mo을(를) 삭제합니다. flatOutput이(가) false이면 평면 JSON 파일은 작성되지 않았으므로 그대로 둡니다.
영어 소스 로캘과 명시적 복수형 소스가 있는 t(..., plurals=True)은(는) 모델을 건너뛰고 소스 문자열에서 one / other을(를) 저장합니다.
각 프레임워크의 로캘
set_locale은(는) ContextVar 토큰을 반환합니다. 동시 요청 시 로케일이 유출되지 않도록 FastAPI 및 Flask 미들웨어를 포함한 finally에서 이를 재설정하십시오.
- Streamlit.
streamlit_language_selector(sidebar=True, key="lang_selector")은st.session_state.locale및st.query_params["lang"]를 작성합니다. 모든 위젯에 고정된key을 지정하세요.examples/python-streamlit를 참조하세요. - FastAPI. 미들웨어에서
?lang=또는Accept-Language을 읽고,set_locale을 호출한 다음finally에서reset_locale을 수행하세요. 경로는t()및_()을 호출합니다.examples/python-fastapi를 참조하세요. - Flask 및 Pyramid. 요청에서 로캘을 설정하고 템플릿 컨텍스트에
_,t,current_locale,ui_languages및direction을 주입하세요.examples/python-flask을 참조하세요. - 기존 gettext.
_(),gettext()및ngettext()을 그대로 유지하세요.ui.gettext가 현재locales/트리를 가리키도록 설정하고extract를 실행한 다음translate-ui를 실행하세요.examples/python-gettext을 참조하세요. - Django.
gettext,ngettext및{% blocktrans %}를 사용하세요. 초기화 템플릿ui-python-django은 Django의locale/디렉터리 및django도메인과 일치합니다. - Tkinter. 각 위젯을 생성할 때
t()또는_()을 호출한 다음set_locale이후에 표시되는 텍스트를 다시 빌드하세요. - PyQt / PySide.
self.tr("...")가 추출됩니다.notr="true"가 아닌 경우.ui파일이<string>요소를 제공합니다.comment속성은 gettext 컨텍스트가 됩니다. - PyWebView / PyWebKit. 위에서 언급한 Python 템플릿을 사용하여 Python 셸을 추출하세요.
data-i18n마커를 사용하거나 로캘당 하나의 HTML 문서를 사용하여 HTML 페이지를 추출하세요.