오늘은 알고보면 아주 쉽고 머리 띵한 코드였다...
===== 문제점 =====
이전 앱을 런칭하면서 오타 및 자잘한 코드수정에 대해 매번 업로드를 해야되는 번거로움이 있다.
이번 앱을 만들면서 서버에서 파일을 받아와 택스트를 수정할 수 있게 만들어 보자
================
였습니다.
그래서 현지화 파일을 만들면 되겠네 라고 말하고 기본 사용법부터 확인했습니다.
사용자들이 많이 사용하는 라이브러리
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에 올릴때 문제가 안될려나...
'기록중' 카테고리의 다른 글
Flutter 라이브러리 flutter_appauth 설치 시 셋팅 방법 (1) | 2024.09.25 |
---|---|
Flutter 국제화 시 TextField Widget 오류사항 (0) | 2024.09.24 |
카페24 SSO 연동하면서 SNS(카카오, 네이버) 로그인 해결방안(해결완료) (2) | 2024.09.04 |
웹 서버 구성하기 (0) | 2024.04.22 |
내가 만난 에러 [24.01.24] (1) | 2024.01.24 |