[flutter] RxDart를 사용한 다국어 처리 방법

다국어 지원은 모바일 앱 개발에서 중요한 요소 중 하나입니다. Flutter 앱에서는 RxDart를 사용하여 효과적으로 다국어 처리를 할 수 있습니다. RxDart는 Reactive Extensions의 구현체로, Dart 프로그래밍 언어에서 반응적이고 동시적인 프로그래밍을 지원합니다.

이 글에서는 RxDart를 사용하여 Flutter 앱에서 다국어 처리를 어떻게 할 수 있는지 알아보겠습니다.

1. RxDart 설치하기

먼저, RxDart 패키지를 프로젝트에 추가해야 합니다. pubspec.yaml 파일을 열고 아래와 같이 rxdart 의존성을 추가합니다.

dependencies:
  flutter:
    sdk: flutter
  rxdart: ^0.27.2

의존성을 추가한 후, 패키지를 설치하기 위해 터미널에서 flutter pub get 명령어를 실행합니다.

2. 다국어 파일 준비하기

Flutter 앱에서 사용할 다국어 파일들을 준비합니다. 일반적으로 JSON 형식으로 다국어 데이터를 작성합니다. 예를 들어, en.json, ko.json과 같은 파일을 생성하여 각각 영어와 한국어에 대한 다국어 데이터를 작성합니다.

데이터 파일 예시:

en.json

{
  "greeting": "Hello",
  "bye": "Goodbye"
}

ko.json

{
  "greeting": "안녕하세요",
  "bye": "안녕히가세요"
}

3. Localization 클래스 생성하기

이제 Localization 클래스를 생성하여 다국어 처리를 합니다. RxDart의 BehaviorSubject를 사용하여 다국어 변경 알림을 수신할 수 있습니다.

import 'dart:convert';
import 'package:flutter/services.dart';
import 'package:rxdart/rxdart.dart';

class Localization {
  BehaviorSubject<String> _localeSubject = BehaviorSubject();

  Stream<String> get localeStream => _localeSubject.stream;

  Future<void> load(String lang) async {
    String jsonString = await rootBundle.loadString('assets/$lang.json');
    Map<String, dynamic> translations = json.decode(jsonString);
    _localeSubject.add(json.encode(translations));
  }

  void dispose() {
    _localeSubject.close();
  }
}

위의 코드는 load 메서드를 통해 다국어 파일을 로드하고, BehaviorSubject를 사용하여 현재 언어로 설정된 다국어 데이터를 변경합니다.

4. 다국어 처리하기

이제 앱에서 다국어 처리를 사용할 수 있습니다. Localization 클래스를 초기화하고, 현재 선택된 언어에 따라 다국어 데이터를 반영합니다. 다음은 예시입니다.

void main() {
  Localization localization = Localization();
  runApp(MyApp(localization));
}

class MyApp extends StatelessWidget {
  final Localization localization;

  MyApp(this.localization);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Multi Language App',
      localizationsDelegates: [
        DefaultMaterialLocalizations.delegate,
        DefaultWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        const Locale('en', 'US'),
        const Locale('ko', 'KR'),
      ],
      home: Scaffold(
        appBar: AppBar(
          title: Text('Multi Language App'),
        ),
        body: Center(
          child: StreamBuilder<String>(
            stream: localization.localeStream,
            initialData: '',
            builder: (context, snapshot) {
              Map<String, dynamic> translations = json.decode(snapshot.data);

              return Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text(
                    translations['greeting'],
                    style: TextStyle(fontSize: 24),
                  ),
                  Text(
                    translations['bye'],
                    style: TextStyle(fontSize: 24),
                  ),
                ],
              );
            },
          ),
        ),
      ),
    );
  }
}

위의 코드에서는 localizationsDelegates에 기본 로케일 및 위젯 로케일 및 supportedLocales에 지원하는 언어 목록을 설정합니다.

StreamBuilder를 사용하여 localization.localeStream의 데이터 변경을 감지하고, 해당 언어에 따른 다국어 데이터를 적용합니다.

이제 Flutter 앱에서 RxDart를 사용하여 다국어 처리를 할 준비가 끝났습니다. 해당 코드를 사용하여 다국어 처리를 적용하고, 앱의 언어에 따라 적절한 다국어 데이터를 표시할 수 있습니다.

결론

이 글에서는 RxDart를 사용하여 Flutter 앱에서 다국어 처리를 수행하는 방법을 설명했습니다. RxDart의 BehaviorSubject를 활용하여 다국어 변경 사항을 감지하고, 해당 언어에 맞는 다국어 데이터를 표시할 수 있습니다. Flutter 앱에서 다국어 지원이 필요한 경우 이 방법을 사용하여 효과적으로 다국어 처리를 할 수 있습니다.

참고 자료