1

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?

0 Answers0