Flutter GetX 从远程服务器初始化翻译源?
Flutter GetX initialise translation source from a remote server?
我正在尝试使用 getX 作为 flutter 状态管理工具。 GetX 有其处理语言翻译的方式。我不确定的一件事是如何从远程服务器初始化翻译源而不是对翻译进行硬编码。这样一来,我就可以在不需要发布新应用的情况下修改翻译。
欢迎任何建议。谢谢。
我有 DotNet WebAPI 后端,我发送的翻译格式如下:
[ApiController]
[Route("[controller]")]
public class TranslationsController : ControllerBase
{
[HttpGet]
public async Task<IActionResult> GetAll()
{
return Ok(new
{
en_US = new
{
hi = "Hi",
bye = "Bye"
},
bn_BD = new
{
hi = "ওহে",
bye = "বিদায়"
}
});
}
}
还有我的 AppTranslations class:
class AppTranslations extends Translations {
final Map<String, String> en_US;
final Map<String, String> bn_BD;
AppTranslations({required this.en_US, required this.bn_BD});
static AppTranslations fromJson(dynamic json) {
return AppTranslations(
en_US: Map<String, String>.from(json["en_US"]),
bn_BD: Map<String, String>.from(json["bn_BD"]),
);
}
@override
Map<String, Map<String, String>> get keys => {
"en_US": en_US,
"bn_BD": bn_BD,
};
}
我的 TranslationProvider:
class TranslationProvider extends GetConnect {
Future<AppTranslations?> getTranslations() async {
final url = 'http://192.168.0.106:5000/translations';
final response = await get(url, decoder: AppTranslations.fromJson);
if (response.hasError) {
return Future.error(response.statusText!);
}
return response.body;
}
}
然后在我的 main 函数中:
void main() async {
final translationProvider = TranslationProvider();
final translations = await translationProvider.getTranslations();
runApp(MyApp(translations: translations!));
}
这是我的 MyApp:
class MyApp extends StatelessWidget {
final AppTranslations translations;
const MyApp({Key? key, required this.translations}) : super(key: key);
@override
Widget build(BuildContext context) {
return GetMaterialApp(
translations: translations,
locale: Locale("en_US"),
home: MyHomePage(),
);
}
}
大功告成!现在您可以在 API 中更新您的翻译,更新将反映在应用程序中。
因此,经过一个月的挖掘,显然 Getx 有自己的方法来即时添加翻译。
apiProvider.get('/api/translations').then((value) {
Get.clearTranslations();
Get.addTranslations(value.data['languages']);
}
实际上,您可以在任何地方调用它!
我正在尝试使用 getX 作为 flutter 状态管理工具。 GetX 有其处理语言翻译的方式。我不确定的一件事是如何从远程服务器初始化翻译源而不是对翻译进行硬编码。这样一来,我就可以在不需要发布新应用的情况下修改翻译。
欢迎任何建议。谢谢。
我有 DotNet WebAPI 后端,我发送的翻译格式如下:
[ApiController]
[Route("[controller]")]
public class TranslationsController : ControllerBase
{
[HttpGet]
public async Task<IActionResult> GetAll()
{
return Ok(new
{
en_US = new
{
hi = "Hi",
bye = "Bye"
},
bn_BD = new
{
hi = "ওহে",
bye = "বিদায়"
}
});
}
}
还有我的 AppTranslations class:
class AppTranslations extends Translations {
final Map<String, String> en_US;
final Map<String, String> bn_BD;
AppTranslations({required this.en_US, required this.bn_BD});
static AppTranslations fromJson(dynamic json) {
return AppTranslations(
en_US: Map<String, String>.from(json["en_US"]),
bn_BD: Map<String, String>.from(json["bn_BD"]),
);
}
@override
Map<String, Map<String, String>> get keys => {
"en_US": en_US,
"bn_BD": bn_BD,
};
}
我的 TranslationProvider:
class TranslationProvider extends GetConnect {
Future<AppTranslations?> getTranslations() async {
final url = 'http://192.168.0.106:5000/translations';
final response = await get(url, decoder: AppTranslations.fromJson);
if (response.hasError) {
return Future.error(response.statusText!);
}
return response.body;
}
}
然后在我的 main 函数中:
void main() async {
final translationProvider = TranslationProvider();
final translations = await translationProvider.getTranslations();
runApp(MyApp(translations: translations!));
}
这是我的 MyApp:
class MyApp extends StatelessWidget {
final AppTranslations translations;
const MyApp({Key? key, required this.translations}) : super(key: key);
@override
Widget build(BuildContext context) {
return GetMaterialApp(
translations: translations,
locale: Locale("en_US"),
home: MyHomePage(),
);
}
}
大功告成!现在您可以在 API 中更新您的翻译,更新将反映在应用程序中。
因此,经过一个月的挖掘,显然 Getx 有自己的方法来即时添加翻译。
apiProvider.get('/api/translations').then((value) {
Get.clearTranslations();
Get.addTranslations(value.data['languages']);
}