플러터는 다국어 지원을 위한 intl 패키지를 제공합니다. 이 패키지를 사용하면 앱을 여러 언어로 번역하여 제공할 수 있습니다. 플러터 intl은 다양한 다국어 기능을 제공하며, 현재 지원되는 언어의 목록도 상당히 많습니다.
다음은 플러터 intl을 사용해서 어떻게 언어를 지원하는지에 대한 간단한 예시입니다.
- intl 패키지 추가하기
먼저 pubspec.yaml
파일에서 intl 패키지를 추가해야 합니다. 이를 위해 dependencies
섹션에 다음과 같이 intl을 추가합니다.
dependencies:
flutter:
sdk: flutter
intl: ^0.17.0
- 언어 파일 생성하기
다국어 지원을 위해 앱 내 각 언어에 대한 메시지를 정의하는 파일을 생성해야 합니다. 일반적으로 lib/l10n
디렉토리 내에 언어별 파일을 작성하는 것이 좋습니다.
lib
└── l10n
├── app_en.arb
├── app_ko.arb
└── ...
app_en.arb
와 app_ko.arb
는 각각 영어와 한국어로 앱의 메시지를 정의하는 파일입니다. 이 파일에는 앱의 각 요소에 대한 번역된 문자열을 포함해야 합니다.
- 번역된 문자열 사용하기
이제 번역된 문자열을 앱에서 사용할 수 있습니다. l10n/intl_messages.dart
파일을 생성하여 다음과 같이 작성합니다.
import 'package:intl/intl.dart';
class AppLocalizations {
static Future<AppLocalizations> load(Locale locale) {
final name = locale.countryCode.isEmpty ? locale.languageCode : locale.toString();
final localeName = Intl.canonicalizedLocale(name);
return initializeMessages(localeName).then((_) {
Intl.defaultLocale = localeName;
return AppLocalizations();
});
}
static AppLocalizations of(BuildContext context) {
return Localizations.of<AppLocalizations>(context, AppLocalizations);
}
String get greeting {
return Intl.message('Hello', name: 'greeting');
}
}
AppLocalizations
클래스는 다국어 지원을 위한 클래스로, 각 언어에 따른 번역된 문자열을 반환합니다. greeting
메서드는 ‘Hello’라는 문자열을 반환하는 예시입니다. 이 중국어나 일본어 등 다른 언어로 번역하려면 name
매개변수에 해당 언어의 키를 지정하면 됩니다.
- 앱에서 언어 설정하기
마지막으로, 앱에서 언어를 설정하는 방법을 알아보겠습니다. 앱의 main.dart
파일에서 다음과 같이 작성합니다.
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 사용자가 설정한 로케일 가져오기
var locale = await getPreferredLocale();
runApp(MyApp(locale: locale));
}
Future<Locale> getPreferredLocale() async {
// 사용자가 설정한 로케일을 가져오는 로직
// 여기서는 간단하게 영어로 설정했다고 가정합니다.
return Locale('en');
}
class MyApp extends StatefulWidget {
final Locale locale;
const MyApp({Key key, this.locale}) : super(key: key);
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
AppLocalizations _appLocalizations;
@override
void initState() {
super.initState();
// 번역된 문자열 가져오기
AppLocalizations.load(widget.locale).then((localizations) {
setState(() {
_appLocalizations = localizations;
});
});
}
@override
Widget build(BuildContext context) {
if (_appLocalizations == null) {
// 번역이 완료되지 않았을 경우 로딩 화면 또는 다른 처리를 할 수 있습니다.
return CircularProgressIndicator();
}
return MaterialApp(
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
AppLocalizations.delegate,
],
supportedLocales: [
// 지원하는 언어 목록을 추가합니다.
const Locale('en'),
const Locale('ko'),
// ...
],
locale: widget.locale,
// ...
);
}
}
위 예시에서 MyApp
위젯의 locale
매개변수에 사용자가 설정한 로케일을 전달하여 앱의 언어를 설정합니다. supportedLocales
에 지원하는 언어 목록을 추가하고, locale
에 현재 언어 설정을 전달합니다.
이렇게 하면 플러터 intl을 사용하여 다국어를 지원하는 앱을 만들 수 있습니다. 추가로 AppLocalizations
클래스에서 지원하는 다양한 기능을 사용하면 번역된 문자열을 동적으로 변경하거나 문화 관련 기능을 사용할 수도 있습니다.
자세한 내용은 플러터 공식 문서를 참조하세요.