기록중

Flutter 서버에서 파일을 받은 후 현지화 언어 적용

lian_is_clone 2024. 9. 20. 17:45

오늘은 알고보면 아주 쉽고 머리 띵한 코드였다...

 

===== 문제점  =====

이전 앱을 런칭하면서 오타 및 자잘한 코드수정에 대해 매번 업로드를 해야되는 번거로움이 있다.

이번 앱을 만들면서 서버에서 파일을 받아와 택스트를 수정할 수 있게 만들어 보자 

================

였습니다.

 

그래서 현지화 파일을 만들면 되겠네 라고 말하고 기본 사용법부터 확인했습니다.

 

사용자들이 많이 사용하는 라이브러리 

easy_localization 를 사용하였습니다.

flutter pub add easy_localization

version
easy_localization: ^3.0.7

 

 

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await EasyLocalization.ensureInitialized();

  runApp(EasyLocalization(
    supportedLocales: [
      Locale('en', 'US'),
      Locale('ar', 'DZ'),
      Locale('de', 'DE'),
      Locale('ru', 'RU')
    ],
    path: 'resources/langs',
    child: MyApp(),
  ));
}

 

기본 설정 후

 

pubspec.yaml 파일을 수정

 

  assets:
    - assets/translations/

 

기본설정은 pub.dev 홈페이지 들어가 있으니 참고바랍니다.

 

 

 

 

제가 생각한 로직

 

앱 열기 -> 파일 받기 -> 파일 저장 -> 현지화데이터 적용

 

게임할 때도 추가 다운로드 있는 그런 느낌?

 

그래서 찾은게 

 

download_assets 라이브러리

 

무언가 assets파일에 저장시켜줄것만 같다. 

 

설정 후 서버에 파일 만들고 주소를 입력하였다...

 

두둥! assets파일이 아니라 폰의 다운로드파일에 저장이 되어버렸다...

 

하 무었이 문제인가 했는데 제작자 왈 만들다보니 저장할 때 문제가 있어보인다 그래서 정확하게 정립할 때 까지는 다운로드를 사용하겠다. 이럼...

 

이래저레 찾아보자...

 

Intl이라는 것으로 현지화파일을 바꿀 수 있덴다. 

 

처음 설치하였던 easy_localization 을 pub remove 시키고 

 

다시 설정하고 다시 해본다...

 

일단 파일은 가져와지니 다행이다 

 

이래저래 만들어봤다가 다 안된다...

 

혹시나 하는 마음에 다시 easy_localization 으로 돌아왔다 뭔가 있지않을까...

 

기본 필수항목 외 다른항목들을 자세히 보았다...

 

assetLoader 이라는 항목이 눈에 띄었다... 이것은 무엇에 쓰길래 있을까?

 

 

뭔가 기본적으로 만들어주고있다. 분석을 해보자

 

 

 

 

대충 보니 호출할 때 load를 호출하고 스트링과 locale을 받고있고 json형태로 무언가를 반환하고있다.

 

그럼 내가 저걸 하나 만들어서 서버에서 파일을 받고 json을 주면 되겠구나라고 생각했다.

 

그럼 또 내가 생각한 로직이 아닌데?

 

파일 저장을 안하잖아... 근데? 또 생각해보면 처음 파일을 가지고와 저장하는것이나 이거나 무슨차이?

 

import 'dart:convert';
import 'dart:io';

import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:path_provider/path_provider.dart';
import 'package:peterslab_mobile_jp/config/config.dart';

class LocalFileDownload extends AssetLoader {
  late File _langDataFile;

  @override
  Future<Map<String, dynamic>?> load(String path, Locale locale) async {
    const baseLoader = RootBundleAssetLoader();
    try {
      final url = Uri.parse("${AppConfig.downloadUrl}/${locale.toString()}.json");
      final response = await http.get(url);
      if (response.statusCode == 200) {
        final dir = Platform.isAndroid
            ? await getExternalStorageDirectory()
            : await getApplicationDocumentsDirectory();
        final filePath = '${dir!.path}/${locale.toString()}.json';
        _langDataFile = File(filePath);
        await _langDataFile.writeAsBytes(response.bodyBytes);
        final translations = json.decode(await _langDataFile.readAsString());
        return translations;
      } else {
        return await baseLoader.load(path, locale);
      }
    } catch (e) {
      return await baseLoader.load(path, locale);
    }
  }
}

 

최종 나온 결과물이다. 

 

로컬에도 파일을 만들어놔 만약 에러가 났을때 혹은 서버에 파일이 없을 때를 대비하여 기본폴더를 주기로 하고 마무리했다.

 

이래도 나중 app store나 play store에 올릴때 문제가 안될려나...