[Fluter] Localization(L10n) 지원
작업 확인 환경
Flutter 2.2.3 • channel stable • https://github.com/flutter/flutter.git
Framework • revision f4abaa0735 (5 weeks ago) • 2021-07-01 12:46:11 -0700
Engine • revision 241c87ad80
Tools • Dart 2.13.4
날과 씨
Flutter Lockalization 때는 공식 게시물intl을 도입할 때가 많았지만, 자체 조사를 할 때는 사이트마다 프로그램이 미묘하게 달라 혼란스러워 다시는 어리둥절하지 않도록 정리했다.
1단계 패키지 가져오기
1-1. pubspec.yaml에 추가 기술
Internationalizing Flutter apps 웹 사이트를 기반으로 Flutter 프로젝트
pubspec.yaml에 추가pubspec.yaml
dependencies:
flutter:
sdk: flutter
flutter_localizations: # Add this line
sdk: flutter # Add this line
intl: ^0.17.0 # Add this line
flutter:
generate: true # Add this line
요소 설명
flutter_localizations: 영어 이외의 언어에 해당하는 Localization용 패키지intl: Localization 날짜 및 숫자 등을 위한 패키지0.17.0이 최신이다.필요에 따라 version 덮어쓰기.generate:generate 플래그true Localization 코드가 없으면 error1-2. flutter pub get
Fluter 프로젝트의 시작에서 두드리기
flutter pub get를 하고 포장을 프로젝트에 포함시킨다.두 번째 단계는 Localization용yaml을 만드는 거예요.
2-1. l10n.만들기
Fluter 프로젝트의 루트
l10n.yaml에서 만듭니다.(파라미터가 있는 두드리기
flutter gen-l10n도 명령으로 생성할 수 있다)
2-2. l10n.yaml 기술
아래의 기술은 자신의 용도에 대한 변경 등이 있었기 때문에 후술한 설명과 함께 적절하게 개작하여 보존한다.
l10n.yaml
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: l10n.dart
output-class: L10n
synthetic-package: false
요소 설명
arb-dir: Localization을 통해 자동으로 생성되는 폴더 지정arb는 애플 Resource Bundle의 줄임말lib/l10ntemplate-arb-file: Localization을 통해 자동으로 생성된 파일의 원본 Resource 파일app_en.arboutput-localization-file: Localization 처리를 정의하는 파일 이름app_localizations.dartl10n.dart 등 짧은 점으로 지정하는 것이 좋습니다output-class: output-localization-file의 파일에서 자동으로 생성되고 정의된class명칭AppLocalizationsL10n 등을 짧게 지정하는 것이 좋습니다output-dir: Localization 코드를 자동으로 생성하는 폴더--arb-dir와 같은 폴더가 됨--arb-dir와 같을 수 있기 때문에yaml에 기재하지 않았습니다preferred-supported-locales:supportedLocales에서 첫 번째 언어를 지정할 수 있습니다arb 파일에만 Localization 정의를 쓰면 자동으로 생성된 다른 언어의 파일에도 같은 내용이 기재됩니다synthetic-package: 코드 합성 패키지프로젝트용으로 지정된 폴더 생성 여부truetrue때 합성 패키지가 생성된 것 같은데 사용해 본 적이 없어서 몰랐어요.false일 때 output-dir 지정한 폴더에 Localization 코드를 생성합니다 세 번째 단계에서는 Localization용 폴더 및 정의를 만듭니다.
3-1. 폴더 만들기
두 번째 단계
l10n.yaml에서 지정한 arb-dir의 위치, 이름으로 폴더를 만듭니다.3-2. lib/l10n 파일 만들기
생성된 폴더에서 생성된
app_en.arb에 지정된 l10n.yaml 이름의 파일
3-3. template-arb-file에 기술
app_en.arb와 JSON의 묘사 형식은 기본적으로 같다.app_en.arb
{
"@@locale": "en",
"helloWorld": "Hello World!",
"@helloWorld": {
"description": "The conventional newborn programmer greeting"
}
}
요소 설명
app_en.arb: 파일 처리의localearb가 아니라@@localeen: 프로젝트에서 LocalizeKey 호출en_US이 Localize에서 읽히기helloWorld: Hello World!에 대한 모조3-4. 코드 생성
Localization 코드를 생성하려면
@helloWorld를 클릭합니다.이 설명과 생성 위치에 문제가 없으면
helloWorld의 내용을 바탕으로 Localization 파일을 생성합니다.
4단계 응용 프로젝트에서 생성된 코드
4-1. MaterialApp에 추가
기재
flutter gen-l10n의l10n.yaml 및MaterialApp.이 때 생성된 코드의 import도 잊지 않습니다.
main.dart
import 'package:flutter/material.dart';
+import 'package:new_project/l10n/l10n.dart';
...
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
+ localizationsDelegates: L10n.localizationsDelegates,
+ supportedLocales: L10n.supportedLocales,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
MaterialApp의 요소에 대한 설명
localizationsDelegates: Localization Widget용 delegatesupportedLocales 기반, Localization 처리 주위 부담localizationsDelegates를 설명할 때supportedLocales도 필수적이다.localizationsDelegates: Localization 지원 언어Localization 코드 요소에 대한 설명
supportedLocales: Localization의 delegate를 하나로 정리supportedLocales L10n.localizationsDelegates L10n.delegate GlobalMaterialLocalizations.delegate GlobalCupertinoLocalizations.delegate: Localization 지원 언어GlobalWidgetsLocalizations.delegate로 설정한 경우 기재4-2. Localization에서 생성된 코드 적용
L10n.supportedLocales에 instance를 만들어 LocalizeKey를 호출하여 Localization 이후의 텍스트를 호출합니다.main.dart
...
class MyHomePage extends StatelessWidget {
MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
Widget build(BuildContext context) {
+ final l10n = L10n.of(context)!;
return Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Center(
+ child: Text(l10n.helloWorld),
),
);
}
}
Step5
5-1. L10n에 기재
자동으로 생성된 코드는 차분이 생기기 쉬워 제출 대상에 적합하지 않기 때문에
L10n.of(context)에서 설명하고 제출에서 제외합니다..gitignore
**/l10n/*.dart
5-2. .gitignore에서 제외 (lint에만 적용)
자동으로 생성된 코드를 lint을 대상으로 하면 수정할 수 없는 Warning이나 error가 나타날 수 있기 때문에 lint에서 제외됩니다.
analysis_options.yaml
analyzer:
exclude:
- '**/l10n/*.dart'
6 단계 추가 언어 추가
6-1. arb 파일 만들기
.gitignore의 analysis_options.yaml에 기재된 것과 같은 이름으로 추가할 언어의arb 파일을 만듭니다일본어 Localize 추가의 경우 설명 및 제작
l10n.yaml
template-arb-file 파일의 컨텐츠 복사app_ja.arb, 값을 일본어로 변경app_ja.arb
{
"@@locale": "ja",
"helloWorld": "こんにちは世界!",
"@helloWorld": {
"description": "新米プログラマーの挨拶"
}
}
6-2. iOS 프로젝트에 언어 추가
이 Fluter 프로젝트의
app_ja.arb 폴더에 있는 app_en.arb 를 Xcode로 엽니다.왼쪽 열에서
ios를 선택하고 Runner.xcworkspace 키에 Info.plist를 추가합니다.Localizations 키가 존재하지 않을 때 Japanese를 누르면 키 자신을 추가합니다.)
6-3. 터미널 언어 설정 변경 및 확인
터미널 언어를 일본어로 설정하고 프로그램을 시작하면 Localize 화면이 표시되는지 확인하십시오!
7단계 영어 이외의 언어를 기본 언어로 설정
7-1. Localization에서 추기
응용 프로그램에서 터미널 언어가 Localize를 지원하지 않을 때 영어가 Localize이면 영어가 기본 언어가 된다.
영어에 Localize가 없으면 어떤 기준으로 기본 언어인지 알 수 없습니다.
일본어를 기본 언어로 설정할 경우 먼저 2-2단계
+에 언어 코드l10n.yaml를 추가합니다.l10n.yaml
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: l10n.dart
output-class: L10n
synthetic-package: false
+preferred-supported-locales: ja
7-2. MaterialApp에 추가
l10n.yaml에 preferred-supported-locales를 추가합니다.콜백 처리에서 Localize가 만든 언어
MaterialApp에 터미널 언어localeResolutionCallback가 포함되어 있는지 확인합니다.이때
supportedLocales에 언어 코드 + 국가 코드가 포함되어 있기 때문에 언어 코드만 생성된 Locale instance를 비교합니다.포함하면 그locale를 직접 반환합니다.
포함되지 않으면
locale의 첫 번째locale로 돌아갑니다.supportedLocales의 절차로 가장 먼저 오는 것을 설정한다localemain.dartclass MyApp extends StatelessWidget {
// This widget is the root of your application.
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
localizationsDelegates: L10n.localizationsDelegates,
supportedLocales: L10n.supportedLocales,
+ localeResolutionCallback: (locale, supportedLocales) {
+ if (locale != null) {
+ final _locale = Locale(locale.languageCode);
+ if (supportedLocales.contains(_locale)) {
+ return _locale;
+ }
+ }
+ return supportedLocales.first;
+ },
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
MaterialApp의 요소에 대한 설명
locale: 7-1와 localeResolutionCallback 이 앱을 통해 콜백으로 되돌아오는 언어를 앱에 반영locale: 시작할 때 터미널 언어의 우선순위가 가장 높은 언어입니다.supportedLocales시 응용 프로그램이 시작될 때 단말기 언어의 상태를 얻지 못했다locale: null의supportedLocales에서 교부된 값잡담
일반적으로 같은 언어로 다른 나라의 로컬라이즈가 본 보도의 방법으로 대응할 수 없다고 생각하는 일이 나온다.
각각
MaterialApp와 supportedLocales에 로컬라이즈를 진행하는 방법은 별도로 조사한 뒤 써야 한다.참조 페이지
Reference
이 문제에 관하여([Fluter] Localization(L10n) 지원), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/aryzae/articles/0555959ac3800e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)