- vừa được xem lúc

GetX - Flutter - Multiple language support with GetX (Part 3)

0 0 145

Người đăng: Nguyen Minh Duong

Theo Viblo Asia

Giới thiệu

Xin chào các bạn, nếu là một lập trình viên Flutter, chắc hẳn các bạn đã nghe về GetX, một plugin tuyệt vời và đang ngày một lớn mạnh, mình đã có chia sẻ về GetX ở hai bài trước, các bạn đọc ở link phía dưới nhé. Trải qua nhiều bản update GetX đã bổ sung thêm nhiều function tuyệt vời, giúp việc code flutter trở nên đơn giản hơn bao giờ hết. Ngày hôm nay mình sẽ hướng dẫn cách implement multiple language trong flutter bằng GetX chỉ qua vài bước đơn giản, với GetX bây giờ bạn không phải dùng bất kỳ plugin nào khác để implement function này nữa.

Đọc thêm về GetX:

Tiến hành

Thêm GetX vào pubspec trước nhé, mạnh dạn dùng version mới nhất có thể thôi

dependencies: flutter: sdk: flutter get: ^3.24.0
  • Đầu tiên là tạo các file Strings resource cho từng ngôn ngữ

File st_en_us.dart cho ngôn ngữ english

 const Map<String, String> en = { 'hello': 'Hello', 'multipleLanguage' : 'Multiple language'
};

File st_vi_vn.dart cho ngôn ngữ Tiếng Việt

 const Map<String, String> en = { 'hello': 'Xin chào', 'multipleLanguage' : 'Đa ngôn ngữ'
};

Tiếp theo là class LocalizationService: Class này extends từ class Translations của GetX, chiệu trách nhiệm config các ngôn ngữ support của app, cũng như có function changeLocate nếu bạn muốn tự thay đổi ngôn ngữ ứng dụng mà không cần phụ thuộc vào ngôn ngữ hệ thống

class LocalizationService extends Translations { // locale sẽ được get mỗi khi mới mở app (phụ thuộc vào locale hệ thống hoặc bạn có thể cache lại locale mà người dùng đã setting và set nó ở đây) static final locale = _getLocaleFromLanguage(); // fallbackLocale là locale default nếu locale được set không nằm trong những Locale support static final fallbackLocale = Locale('en', 'US'); // language code của những locale được support static final langCodes = [ 'en', 'vi', ]; // các Locale được support static final locales = [ Locale('en', 'US'), Locale('vi', 'VN'), ]; // cái này là Map các language được support đi kèm với mã code của lang đó: cái này dùng để đổ data vào Dropdownbutton và set language mà không cần quan tâm tới language của hệ thống static final langs = LinkedHashMap.from({ 'en': 'English', 'vi': 'Tiếng Việt', }); // function change language nếu bạn không muốn phụ thuộc vào ngôn ngữ hệ thống static void changeLocale(String langCode) { final locale = _getLocaleFromLanguage(langCode: langCode); Get.updateLocale(locale); } @override Map<String, Map<String, String>> get keys => { 'en_US': en, 'vi_VN': vi, }; static Locale _getLocaleFromLanguage({String langCode}) { var lang = langCode ?? Get.deviceLocale.languageCode; for (int i = 0; i < langCodes.length; i++) { if (lang == langCodes[i]) return locales[i]; } return Get.locale; }
} 

Cấu trúc package như sau

Sử dụng

Đầu tiên là config App, Như thường lệ, để sử dụng được hết các function của GetX các bạn phải sử dụng GetMaterialApp thay cho MaterialApp

class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return GetMaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), locale: LocalizationService.locale, fallbackLocale: LocalizationService.fallbackLocale, translations: LocalizationService(), initialRoute: AppRoute.routeHomeScreen(), initialBinding: AppBinding(), getPages: AppRoute.generateGetPages(), ); }
}

Vai trò của từng component trong LocalizationService mình đã giải thích rõ trong class LocalizationService phía trên

Sử dụng trong HomeScreen

class _HomeScreenState extends State<HomeScreen> { String _selectedLang = LocalizationService.locale.languageCode; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('hello'.tr), ), body: Container( child: Center( child: DropdownButton<String>( icon: Icon(Icons.arrow_drop_down), value: _selectedLang, items: _buildDropdownMenuItems(), onChanged: (String value) { setState(() => _selectedLang = value); LocalizationService.changeLocale(value); }, ), ), ), ); } List<DropdownMenuItem<String>> _buildDropdownMenuItems() { var list = List<DropdownMenuItem<String>>(); LocalizationService.langs.forEach((key, value) { list.add(DropdownMenuItem<String>( value: key, child: Text(key), )); }); return list; }
}

Ở đây để một string tự động dịch theo ngôn ngữ đã được setup thì các bạn chỉ việc thêm vào exstension funcstion 'tr' của GetX Text('hello'.tr), với hello là key của String mà các bạn khai báo trong các strings resource.

Ở trên mình đã thêm một DropDownButton cho phép thay đổi ngôn ngữ ứng dụng mà không phụ thuộc vào ngôn ngữ hệ thống: chỉ việc gọi hàm LocalizationService.changeLocale(String langCode) thì ngay lập tức các string sẽ được update theo đúng ngôn ngữ mới

Demo một tí nhé

Cảm ơn các bạn đã theo dõi ?

Bình luận

Bài viết tương tự

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 1: Làm quen cô nàng Flutter

Lời mở đầu. Gần đây, Flutter nổi lên và được Google PR như một xu thế của lập trình di động vậy.

0 0 254

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 3: Lột trần cô nàng Flutter, BuildContext là gì?

Lời mở đầu. Màn làm quen cô nàng FLutter ở Phần 1 đã gieo rắc vào đầu chúng ta quá nhiều điều bí ẩn về nàng Flutter.

0 0 189

- vừa được xem lúc

[Android] Hiển thị Activity trên màn hình khóa - Show Activity over lock screen

Xin chào các bạn, Hôm nay là 30 tết rồi, ngồi ngắm trời chờ đón giao thừa, trong lúc rảnh rỗi mình quyết định ngồi viết bài sau 1 thời gian vắng bóng. .

0 0 93

- vừa được xem lúc

Tìm hiểu Proguard trong Android

1. Proguard là gì . Cụ thể nó giúp ứng dụng của chúng ta:. .

0 0 82

- vừa được xem lúc

Làm ứng dụng học toán đơn giản với React Native - Phần 6

Chào các bạn một năm mới an khang thịnh vượng, dồi dào sức khỏe. Lại là mình đây Đây là link app mà các bạn đang theo dõi :3 https://play.google.com/store/apps/details?id=com.

0 0 51

- vừa được xem lúc

20 Plugin hữu ích cho Android Studio

1. CodeGlance. Plugin này sẽ nhúng một minimap vào editor cùng với thanh cuộn cũng khá là lớn. Nó sẽ giúp chúng ta xem trước bộ khung của code và cho phép điều hướng đến đoạn code mà ta mong muốn một cách nhanh chóng.

0 0 301