JJ_MKVMaker/lib/l10n/tr.dart

35 lines
1.3 KiB
Dart

/// 화면 글자 번역 (한국어 원문 → 고른 언어).
///
/// 코드의 화면 글자는 한국어 원문을 그대로 열쇠로 쓴다: `tr('MKV 만들기')`, `trf('동영상 {0}개', [n])`.
/// 고른 언어의 사전에 없으면 영어 사전, 그래도 없으면 한국어 원문을 보여 준다.
/// 사전은 앱이 시작할 때 (그리고 언어를 바꿀 때) [setTranslations] 로 넣는다 (lib/app/i18n_controller.dart).
library;
String _lang = 'ko';
Map<String, String> _dict = const {};
Map<String, String> _fallback = const {};
/// 지금 화면 언어 코드 (ko · en · ja · zh-Hans …)
String get uiLanguage => _lang;
/// 화면 언어와 사전을 바꾼다. [fallback] 은 사전에 없는 글자를 찾을 사전 (보통 영어).
void setTranslations(String lang, Map<String, String> dict, [Map<String, String> fallback = const {}]) {
_lang = lang;
_dict = dict;
_fallback = fallback;
}
/// 한국어 원문 → 지금 언어
String tr(String ko) {
if (_lang == 'ko') return ko;
return _dict[ko] ?? _fallback[ko] ?? ko;
}
final _slot = RegExp(r'\{(\d+)\}');
/// 자리 표시 ({0}, {1} …) 가 있는 글자: `trf('동영상 {0}개', [n])`
String trf(String ko, List<Object?> args) => tr(ko).replaceAllMapped(_slot, (m) {
final i = int.parse(m.group(1)!);
return i < args.length ? '${args[i]}' : m.group(0)!;
});