无法加载资产:/data/user/0/com.example.app/app_flutter/localization/en-IN.json 直到热重载
Unable to load asset: /data/user/0/com.example.app/app_flutter/localization/en-IN.json until hot reload
我将 ApplicationDocumentsDirectory
路径提供给名为 easy_localization: ^2.3.3
的本地化库。我曾经在 运行 时间动态地将语言环境 json 文件放入应用程序目录,这样每当用户更改语言时我都可以调用翻译 API 获取结果并创建 json 文件在 Application Directory 中并使用 EasyLocalization.of(context).locale = Locale(langCode, cntryCode);
更改语言。但是,当我关闭并 运行 应用程序时,它显示无法加载资产,但是当我进行热重载时,它将在应用程序下一次关闭时开始完美运行。在设备资源管理器中,我可以看到区域设置 json 文件是在初始化 EasyLocalization
和启动应用程序之前在应用程序目录中创建的。但是无法通过第一个 运行 上的简单本地化来加载这些语言环境文件。我从 main()
开始我的应用程序,如下所示。
EasyLocalization localization = EasyLocalization(
path: '$applicationDirPath/localization',
supportedLocales: [Locale('en', 'US'), Locale('de', 'DE'), Locale('hi', 'IN')],
fallbackLocale: Locale('en', 'IN'),
child: AppRootWidget());
runApp(localization);
assetLoader
可以用来解决这个场景。如下所示将 属性 assetLoader 添加到 EasyLocalization
EasyLocalization localization = EasyLocalization(
path: 'assets/localization',
supportedLocales: [Locale('en', 'US'), Locale('de', 'DE'), Locale('hi', 'IN')],
assetLoader: MyAssetLoader(),
fallbackLocale: Locale('en', 'IN'),
child: AppRootWidget());
您可以使用包 easy_localization_loader
中任何受支持的资产加载器或编写您自己的资产加载器,如下所示。
class MyAssetLoader extends AssetLoader {
@override
Future<Map<String, dynamic>> load(String path, Locale locale) async {
//Assuming the source is in english and json
String sourceString = jsonEncode({"welcome": "Welcome","username":"User Name"}); // you can read the base source language from file and assign to sourceString here
if(locale.languageCode == 'ml') // Translation API can be implemented here by passing sourceString
String translatedRes = jsonEncode({"welcome": "സ്വാഗതം","username":"ഉപയോക്തൃനാമം"}); //Assuming this is the translated response
return json.decode(translatedRes);
}
}
并创建您的 AssetLoader class,如下所示
abstract class AssetLoader {
const AssetLoader();
Future<Map<String, dynamic>> load(String path, Locale locale);
}
我将 ApplicationDocumentsDirectory
路径提供给名为 easy_localization: ^2.3.3
的本地化库。我曾经在 运行 时间动态地将语言环境 json 文件放入应用程序目录,这样每当用户更改语言时我都可以调用翻译 API 获取结果并创建 json 文件在 Application Directory 中并使用 EasyLocalization.of(context).locale = Locale(langCode, cntryCode);
更改语言。但是,当我关闭并 运行 应用程序时,它显示无法加载资产,但是当我进行热重载时,它将在应用程序下一次关闭时开始完美运行。在设备资源管理器中,我可以看到区域设置 json 文件是在初始化 EasyLocalization
和启动应用程序之前在应用程序目录中创建的。但是无法通过第一个 运行 上的简单本地化来加载这些语言环境文件。我从 main()
开始我的应用程序,如下所示。
EasyLocalization localization = EasyLocalization(
path: '$applicationDirPath/localization',
supportedLocales: [Locale('en', 'US'), Locale('de', 'DE'), Locale('hi', 'IN')],
fallbackLocale: Locale('en', 'IN'),
child: AppRootWidget());
runApp(localization);
assetLoader
可以用来解决这个场景。如下所示将 属性 assetLoader 添加到 EasyLocalization
EasyLocalization localization = EasyLocalization(
path: 'assets/localization',
supportedLocales: [Locale('en', 'US'), Locale('de', 'DE'), Locale('hi', 'IN')],
assetLoader: MyAssetLoader(),
fallbackLocale: Locale('en', 'IN'),
child: AppRootWidget());
您可以使用包 easy_localization_loader
中任何受支持的资产加载器或编写您自己的资产加载器,如下所示。
class MyAssetLoader extends AssetLoader {
@override
Future<Map<String, dynamic>> load(String path, Locale locale) async {
//Assuming the source is in english and json
String sourceString = jsonEncode({"welcome": "Welcome","username":"User Name"}); // you can read the base source language from file and assign to sourceString here
if(locale.languageCode == 'ml') // Translation API can be implemented here by passing sourceString
String translatedRes = jsonEncode({"welcome": "സ്വാഗതം","username":"ഉപയോക്തൃനാമം"}); //Assuming this is the translated response
return json.decode(translatedRes);
}
}
并创建您的 AssetLoader class,如下所示
abstract class AssetLoader {
const AssetLoader();
Future<Map<String, dynamic>> load(String path, Locale locale);
}