I download everything from the url and overwrite the .arb files with the data from the url. I want AppLocalization to be rebuilt for each language with new texts. I tried to create this function using intl , intl_translation and arbify but saw neither generateFromArb or GenerateLocalization
My code and pubspec.yaml
import 'dart:io';
import 'package:http/http.dart';
import 'package:path_provider/path_provider.dart';
import 'package:flutter/services.dart';
// import 'package:intl_translation/extract_messages.dart';
// import 'package:intl_translation/generate_localized.dart';
// import 'package:intl_translation/visitors/interpolation_visitor.dart';
// import 'package:intl_translation/visitors/message_finding_visitor.dart';
// import 'package:intl_translation/visitors/plural_gender_visitor.dart';
class TranslationService {
static final TranslationService _singleton = TranslationService._internal();
factory TranslationService() {
return _singleton;
}
TranslationService._internal();
Future<void> downloadAndBuildTranslations(String langCode, String url) async {
try {
final response = await get(Uri.parse(url));
final translations = jsonDecode(response.body) as Map<String, dynamic>;
print('funkcja dziala');
//print(response.body);
final directory = await getApplicationDocumentsDirectory();
final path = directory.path + '/lib/l10n/app_$langCode.arb';
final arbFile = File(path);
// final arbFile = File(
// '/data/user/0/com.zareklamy/app_flutter/lib/l10n/app_${langCode}.arb');
// final directory = await getApplicationDocumentsDirectory();
// print(directory.path); to plugin, którym mogłem sprawdzić dokładny path do aplikacji, możliwe że ten path trzeba przekleić zamiast wpisywać na sztywno
if (arbFile.existsSync()) {
print('${langCode} istnieje'); //sprawdza czy plik istnieje
} else {
print('${langCode} nie istnieje');
}
final Map<String, dynamic> data = {
//narazie tylko ta lista dla testów, wystarczy zamienić na dole z data, na arbFile docelowo
"login_1": "Actual 1",
"login_2": "Actual 2",
"login_3": "Actual 3",
"login_4": "Actual 4",
"login_5": "Actual 5",
"login_6": "Actual 6"
};
final sink = arbFile.openWrite();
sink.write('{\n');
data.forEach((key, value) {
//tutaj
if (key != data.keys.last) {
//i tutaj
sink.write('"$key": "${value.toString()}",\n');
} else {
sink.write('"$key": "${value.toString()}"\n');
}
});
sink.write('}\n');
await sink.close();
final updatedFile = await File(
'/data/user/0/com.zareklamy/app_flutter/lib/l10n/app_${langCode}.arb')
.readAsString();
print('Updated file content: $updatedFile');
} catch (e) {
print('Error downloading or building translations: $e');
}
}
Future<void> rebuildLocalization() async {
final arbFiles = await rootBundle.loadString('AssetManifest.json');
final filesMap = json.decode(arbFiles) as Map<String, dynamic>;
final arbFileNames = filesMap.keys
.where((fileName) => fileName.contains('/l10n/') && fileName.endsWith('.arb'))
.toList();
// Wygenerowanie pliku AppLocalizations
await generateFromArb(
arbFileNames: arbFileNames,
outputDir: 'lib/l10n/',
templateArbFile: 'lib/l10n/app_en.arb',
outputClass: 'AppLocalizations',
deferredLoading: false,
header: '// This file is automatically generated by the Flutter tool. Do not modify.\n',
);
}
}```
`
`
pubspec.yaml:
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
provider: ^6.0.5
another_stepper: ^1.1.6
step_progress_indicator: ^1.0.2
file_picker: ^5.2.5
flutter_html: ^3.0.0-alpha.3
The following adds the Cupertino Icons font to your application.
Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2
dot_navigation_bar: ^1.0.1+4
currency_picker: ^2.0.16
country_picker: ^2.0.20
syncfusion_flutter_charts: ^20.4.41
country_state_city_pro: ^0.0.3
dropdown_button2: ^1.9.2
flutter_cupertino_date_picker: ^1.0.26+2
flutter_local_notifications: ^13.0.0
intl: ^0.17.0
gap: ^2.0.1
flutter_switch: ^0.3.2
flutter_rating_bar: ^4.0.1
percent_indicator: ^4.2.2
top_snackbar_flutter: ^3.0.0+1
email_validator: "^2.1.16"
url_launcher: ^6.1.8
flutter_svg: ^1.1.6
http: ^0.13.5
fl_country_code_picker: ^0.1.1
flutter_secure_storage: ^7.0.1
shared_preferences: ^2.1.0
path_provider: ^2.0.14
new_flutter_tapjoy: ^0.0.5
new_flutter_inbrain: ^1.0.5
flutter_pollfish: ^4.1.3
bitlabs: ^2.0.1
new_flutter_fairbid: ^2.0.2
share_plus: ^6.3.1
new_flutter_ironsource_x: ^1.2.0+3
flutter_svg_provider: ^1.0.3
fluttertoast: ^8.2.1
cs_fyber_ad: ^0.0.6
flutter_ayetstudios: ^1.0.0
flutter_inbrain: ^1.3.0+5
freezed: ^2.1.0
freezed_annotation: ^2.2.0
json_annotation: ^4.7.0
intl_translation: ^0.18.0
new_flutter_ayetstudios: ^1.1.3
dev_dependencies:
flutter_test:
sdk: flutter
flutter_launcher_icons: ^0.11.0
flutter_native_splash: ^2.2.16
build_runner: ^2.3.3
json_serializable: ^6.4.0
`
**TestUrl.dart**
`class TestURL extends StatefulWidget {
const TestURL({Key? key}) : super(key: key);
@override
State<TestURL> createState() => _TestURLState();
}
class _TestURLState extends State<TestURL> {
final translationService = TranslationService();
@override
void initState() {
super.initState();
_initializeMessages();
}
Future<void> _initializeMessages() async {
try {
final languages = {
'en': 'https://www.paidwork.com/language?code=en-us',
'de': 'https://www.paidwork.com/language?code=de',
'fr': 'https://www.paidwork.com/language?code=fr',
// add more languages and translation URLs here
};
for (final langCode in languages.keys) {
final url = languages[langCode]!;
await translationService.downloadAndBuildTranslations(langCode, url);
}
} catch (e) {
print('Error downloading or building translations: $e');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(AppLocalizations.of(context).login_1),
Text(AppLocalizations.of(context).login_2),
Text(AppLocalizations.of(context).login_3),
Text(AppLocalizations.of(context).login_4),
Text(AppLocalizations.of(context).login_5),
ElevatedButton(
onPressed: () async {
try {
final langCode = 'en';
final url =
'https://www.paidwork.com/language?code=$langCode';
await translationService.downloadAndBuildTranslations(
langCode, url);
setState(() {});
} catch (e) {
print('Error downloading or building translations: $e');
}
},
child: Text('Test function'),
),
ElevatedButton(
onPressed: () {
setState(() {});
},
child: Text('Reset state'),
)
],
),
),
);
}
}
`
I tried to use intl , intl_translation and arbify but it didn't work or I had to downgrade other plugins, maybe I used them wrong?