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 으로 되돌아 왔다. 이게 편하고 좋다.