이번에는 slang 을 이용한 다국어 지원을 알아보려한다. slang 은 앱 화면상에 보이는 String을 하드코딩하지 않게 해주고, 여러 언어를 쉽게 지원해준다.
dependencies:
slang: <version>
slang_flutter: <version> # also add this if you use flutter
dev_dependencies:
build_runner: <version> # ONLY if you use build_runner (1/2)
slang_build_runner: <version> # ONLY if you use build_runner (2/2)```
코드를 입력하세요
<namespace>_<locale?>.<extension>
// File: strings.i18n.json (mandatory, base locale)
{
"hello": "Hello $name",
"save": "Save",
"login": {
"success": "Logged in successfully",
"fail": "Logged in failed"
}
}
dart run build_runner build -d
를 실행시 dart 파일을 생성할 수 있다.
a) 기기의 로케일 사용하기
이 방법은 앱을 시작할 때 사용자의 기기 설정에서 로케일을 자동으로 감지하고 사용하도록 설정합니다. LocaleSettings.useDeviceLocale()
메서드를 호출함으로써, 앱은 사용자의 기기에 설정된 언어로 자동으로 번역을 로드합니다. 이 방식은 사용자에게 친숙한 언어로 앱을 바로 제공하고 싶을 때 유용합니다.
void main() {
WidgetsFlutterBinding.ensureInitialized(); // Flutter 엔진과 위젯 바인딩 초기화
LocaleSettings.useDeviceLocale(); // 기기의 로케일 사용 설정
runApp(MyApp()); // 앱 실행
}
b) 특정 로케일 사용하기
특정 로케일을 사용하고 싶거나, 사용자가 앱 내에서 언어를 선택할 수 있게 하고 싶을 때 이 방법을 사용합니다. 사용자가 선택한 언어는 일반적으로 어떤 형태의 영구 저장소(예: SharedPreferences)에 저장되며, 앱이 시작할 때 이 값을 로드하여 LocaleSettings.setLocaleRaw(storedLocale)
를 호출함으로써 해당 언어를 앱의 기본 언어로 설정합니다.
void initState() {
super.initState();
String storedLocale = loadFromStorage(); // 저장된 로케일 불러오기
LocaleSettings.setLocaleRaw(storedLocale); // 특정 로케일 설정
}
c) 의존성 주입을 사용하여 로케일 관리하기
이 방법은 개발자가 로케일 관리를 직접 수행하고 싶을 때 사용합니다. 예를 들어, 테스트 목적이나 특정 사용자 상호작용에 따라 프로그램적으로 언어를 전환하고 싶을 때 유용합니다. 여기서는 AppLocale.en.build()
와 같은 방식으로 특정 로케일에 대한 인스턴스를 생성하고, 이를 통해 번역에 접근합니다. 이 방식은 로케일을 앱의 다른 부분에 주입하여 사용할 때 유연성을 제공합니다.
final english = AppLocale.en.build(); // 영어 로케일 인스턴스 생성
final german = AppLocale.de.build(); // 독일어 로케일 인스턴스 생성
// 번역 사용
String a = german.login.success; // 'german' 인스턴스를 통해 독일어 번역에 접근
이 세 가지 방법은 앱이 다양한 언어를 지원하는 과정에서 필요에 따라 선택하여 사용할 수 있으며, 각각의 방법은 앱의 국제화 요구사항과 사용자 경험을 최적화하는 데 도움이 됩니다.