1. pubspec.yaml 옵션수정
dependencies:
flutter:
sdk: flutter
# 추가
flutter_localizations:
sdk: flutter
flutter:
#추가
generate: true
generate: true 속성은 Flutter 프레임워크에게 "이 프로젝트는 외부 설정 파일(예: .arb)을 바탕으로 Dart 코드를 자동으로 생성하는 기능(Synthetic Package)을 사용하겠다"고 알려주는 속성이다.
빌드 시점에 lib/l10n/ 아래에 가상 패키지(Synthetic Package) 생성된다.
app_localizations_en.dart
app_localizations_ko.dart
app_localizations.dart
2. 프로젝트 루트 디렉토리의 pubspec.yaml과 동일한 위치에 l10n.yaml 생성
# 모든 번역 파일(.arb)이 모여 있는 폴더
arb-dir: lib/l10n
# 번역의 기준이 되는 파일 딱 하나만 지정 (보통 개발자가 가장 잘 아는 언어)
template-arb-file: app_en.arb
# 생성될 Dart 파일 이름
output-localization-file: app_localizations.dart
3. 번역파일 .arb
app_en.arb
{
"lbl_home": "Home",
"lbl_add": "Add",
"lbl_phoneNo": "Phone Number",
"btn_save": "Save",
"btn_cancel": "Cancel",
"vld_phoneNo": "Please enter Phone No.",
"msg_hello": "Hello, {name}!"
}
app_ko.arb
{
"lbl_home": "홈",
"lbl_add": "추가",
"lbl_phoneNo": "핸드폰 번호",
"btn_save": "저장",
"btn_cancel": "취소",
"vld_phoneNo": "핸드폰 번호를 입력하세요."
"msg_hello": "안녕, {name}님!"
}
4. 소스적용
import 'package:flutter/material.dart';
import 'package:[프로젝트명]/l10n/app_localizations.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
// 다국어 설정을 위한 대리자 등록
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
// 지원할 언어 목록
supportedLocales: const [
Locale('ko'),
Locale('en'),
],
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
const MyHomePage({super.key});
@override
Widget build(BuildContext context) {
// 현재 지역화 설정 객체 가져오기
var l10n = AppLocalizations.of(context)!;
return Scaffold(
appBar: AppBar(title: Text(l10n.lbl_home)),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// 일반 텍스트 사용
Text(l10n.helloWorld),
// 파라미터가 포함된 텍스트 사용
Text(l10n.msg_hello('Flutter')),
],
),
),
);
}
}
추가
표준이라해서 사용했는데 이 패키지의 문제는 BuildContext객체가 없는 곳에서 사용할 수 없다는 문제가 있다.
게다가 다국어 추가시에는 매번 빌드가 되어야 반영이 되는 불편함도 있다.
그래서 결국엔 그 전에 사용하던 easy_localization 으로 되돌아 왔다. 이게 편하고 좋다.