티스토리 뷰
요즘 앱들은 다국어 지원이 필수라고 할 수 있다.
안드로이드와 iOS에서는 자체적인 다국어 처리 방법을 잘 제공하고 있지만 flutter에서는 flutter_localizations이라는 라이브러리를 이용해서 다국어 처리를 한다.
Flutter에서 국제화 기본 설명은 아래 링크를 참고 하기 바란다.
https://docs.flutter.dev/development/accessibility-and-localization/internationalization
기본 다국어 처리는 flutter_localizations를 이용해서 할수 있다.
기본 사용법은 다른 곳에서도 잘 다루고 있기 때문에 이곳에서는 다른 라이브러리인 intl과 intl_utils를 사용하는 방법을 다루고자 한다.
아래 방법을 꼭 사용할 필요는 없으며 flutter_localizations를사용해도 무방하다.
flutter에서는 intl을 사용해서 다국어 처리를 하기 위해 다음 과정을 거친다.
1. Message 클래스 생성 : 앱에서 접근해 사용할 Messages 클래스 직접 만들기
2. arb파일 변환 : Messages 클래스를 arb파일로 변환하기
3. 언어별 arb파일 : 변환된 arb파일과 동일한 형식의 언어 arb 파일 만들기
4. 언어별 intl 클래스 변환 : Messages 클래스와 연결될 언어별 intl클래스를 arb파일로 부터 변환하기
안드로이드에서 다국어용 string파일을 만들면 바로 사용할 수 있는것과는 대조적으로 과정이 복잡하다 .
특히 intl클래스 생성후 arb파일 변환 arb파일을 다시 언어별 intl클래스로 변환하는 과정이 많이 번거롭다.
우리가 원하는 가장 좋은 시나리오는 다음과 같다 .
1. 언어별 arb파일 생성 : arb파일을 언어별로 준비
2. class로 변환 : arb파일에서 Messages클래스와 언어별 intl클래스를 모두 자동으로 생성
위에서 처럼 복잡한 intl준비과정을 간단하게 만들어 주는 라이브러리가 intl_utils이다.
https://pub.dev/packages/intl_utils
pubspec.yaml파일을 다음과 같이 설정해보자
dependencies :
intl_utils: 2.1.0
flutter_intl :
enabled: true
class_name: Messages
main_locale: ko
arb_dir: lib/resource/message/arb
output_dir: lib/resource/message/generated
위 설정에서 arb_dir과 outpub_dir을 폴더를 잘 확인하자 언어별 원본 arb파일의 위치와, 자동생성된 언어별 클래스들이 생성되는 위치를 설정하고 있다. 그리고 class_name에 해당하는 Messages가 앱에서 직접 사용하는 클래스가 된다.
이제 원본 arb파일을 언어별로 만들어 /lib/resource/message/arb 폴더에 위치 시키디록 하자
1. /lib/resource/message/arb/intl_en.arb
{
"@@locale": "en",
"@@last_modified": "2021-01-28T17:35:15.524705",
"helloWorld": "Hello, World,
"@helloWorld": {
"type": "text",
"placeholders": {}
},
}
2. /lib/resource/message/arb/intl_ko.arb
{
"@@locale": "ko",
"@@last_modified": "2021-01-28T17:35:15.524705",
"helloWorld": "안녕!, World,
"@helloWorld": {
"type": "text",
"placeholders": {}
},
}
위와 같이 설정을 완료하고 command창에서 intl_utils를 실행 한다.
$ flutter pub run intl_utils:generate
명령어가 정상적으로 수행되고 나면 아래와 같은 자동 생성된 dart파일들이 만들어 진다.
/resource
/generated
/intl
/messages_all.dart // locale에 따라 언어별 리소스를 로드하는 클래스
/messages_en.dart // en 클래스
/messages_ko.dart // ko 클래스
/l10n.dart // intl Messages 클래스
이제 앱에서는 l10n.dart파일에 정의된 Messages클래스를 이용해서 각 언어별 문자를 사용할수 있게 되었다.
import 'package:projectname/resource/message/generated/l10n.dart';
....
Text(Messages.current.helloWorld)
....
Flutter에서 다국어 처리위한 조금은 복잡해 보이는 과정에 대해서 설명하였다.
Flutter에서는 intl을 이용해서 다국어 처리를 한다. 하지만 intl의 언어별 설정 과정이 복잡하고 그 단계가 많아 간략하게 만들어 사용할 수 있는 intl_utils까지 함께 알아 보았다.
arb을 만들어야 한다는 것이 기존 android나 ios개발자에게는 불편하게 느겨질것이다.
하지만 실제 프로젝트에서는 다국어 번역 작업과 arb파일 생성을 weblate와 같은 현지화 도구를 이용하기 때문에 직접 파일을 수정하는 일은 없다.
그냥 기본인 flutter_localizations를 사용해도 큰 불편없이 사용가능 할지도 모르겠다. 하지만 프로젝트의 특징에 따라 intl + intl_utils로 사용하는 것도 고려 해볼만한 방법이다.
'Flutter' 카테고리의 다른 글
[Flutter] Lint : 코딩컨벤션 (0) | 2022.01.11 |
---|---|
[Flutter] Equatable : equals와 hashCode를 위한 라이브러리 (0) | 2021.12.27 |
Flutter 앱개발을 위한 MVVM아키텍처 - 5부 DI와 테스트코드 (7) | 2021.12.01 |
Flutter 앱개발을 위한 MVVM아키텍처 - 4부 폴더(패키지) 구조 (10) | 2021.11.29 |
Flutter 앱 개발을 위한 MVVM아키텍처 - 3부 Data Layer (7) | 2021.11.22 |
- Total
- Today
- Yesterday
- FlutterEngine
- Flutter
- flutter2.0
- dart 2.17
- flutter i18n
- flutter 다국어처리
- LocalKey
- RenderObject
- flutter_secure_storage
- flutter mvvm
- freezed
- Flutter TDD
- Flutter LifeCycle
- widget element
- MVVM
- Widget Tree
- Android
- dart enum
- DART
- python3
- flutter element
- navigator
- flutter l10n
- StatefulWidget LifeCycle
- json_serializable
- enum member
- Mutiple Flutter
- Flutter3.0
- Route
- Element LifeCycle
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |