Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
738 changes: 738 additions & 0 deletions lib/gen/strings.g.dart

Large diffs are not rendered by default.

1,049 changes: 1,049 additions & 0 deletions lib/gen/strings_ar.g.dart

Large diffs are not rendered by default.

1,034 changes: 1,034 additions & 0 deletions lib/gen/strings_bg.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_bn.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_bs.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_ca.g.dart

Large diffs are not rendered by default.

1,057 changes: 1,057 additions & 0 deletions lib/gen/strings_cs.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_da.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_de.g.dart

Large diffs are not rendered by default.

70 changes: 70 additions & 0 deletions lib/gen/strings_en.g.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
///
/// Generated file. Do not edit.
///
// coverage:ignore-file
// ignore_for_file: type=lint, unused_import
// dart format off

part of 'strings.g.dart';

// Path: <root>
typedef TranslationsEn = Translations; // ignore: unused_element
class Translations with BaseTranslations<AppLocale, Translations> {
/// Returns the current translations of the given [context].
///
/// Usage:
/// final t = Translations.of(context);
static Translations of(BuildContext context) => InheritedLocaleData.of<AppLocale, Translations>(context).translations;

/// You can call this constructor and build your own translation instance of this locale.
/// Constructing via the enum [AppLocale.build] is preferred.
Translations({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
$meta = meta ?? TranslationMetadata(
locale: AppLocale.en,
overrides: overrides ?? {},
cardinalResolver: cardinalResolver,
ordinalResolver: ordinalResolver,
) {
$meta.setFlatMapFunction(_flatMapFunction);
}

/// Metadata for the translations of <en>.
@override final TranslationMetadata<AppLocale, Translations> $meta;

/// Access flat map
dynamic operator[](String key) => $meta.getTranslation(key);

late final Translations _root = this; // ignore: unused_field

Translations $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => Translations(meta: meta ?? this.$meta);

// Translations
late final TranslationsDependenciesEn dependencies = TranslationsDependenciesEn._(_root);
}
Comment on lines +12 to +44
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

The base Translations class is missing almost all the translation keys (e.g., invalidURLForSource, noReleaseFound, primary, etc.) that are present in other locale files like strings_ar.g.dart. Since AppLocale.en is configured as the baseLocale in AppLocaleUtils, this class defines the interface that all other translations must implement. As it stands, the project will fail to compile because the other generated classes (like TranslationsAr) are attempting to override members that do not exist in the base class.

Additionally, the English locale contains a dependencies key that is missing from other locales, which is another source of compilation errors. It appears that slang might have processed an incorrect file (possibly containing dependency info) as the source for the English locale. Please ensure your base translation file (e.g., assets/translations/strings_en.i18n.json) is correctly populated with all keys.


// Path: dependencies
class TranslationsDependenciesEn {
TranslationsDependenciesEn._(this._root);

final Translations _root; // ignore: unused_field

// Translations

/// en: '^3.0.1'
String get translate => '^3.0.1';
}

/// The flat map containing all translations for locale <en>.
/// Only for edge cases! For simple maps, use the map function of this library.
///
/// The Dart AOT compiler has issues with very large switch statements,
/// so the map is split into smaller functions (512 entries each).
extension on Translations {
dynamic _flatMapFunction(String path) {
return switch (path) {
'dependencies.translate' => '^3.0.1',
_ => null,
};
}
}
1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_en_EO.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_es.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_et.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_fa.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_fr.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_gl.g.dart

Large diffs are not rendered by default.

1,063 changes: 1,063 additions & 0 deletions lib/gen/strings_he.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_hi.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_hu.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_hy.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_id.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_it.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_ja.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_kmr.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_ko.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_ml.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_ms.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_nl.g.dart

Large diffs are not rendered by default.

1,074 changes: 1,074 additions & 0 deletions lib/gen/strings_pl.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_pt.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_pt_BR.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_ro.g.dart

Large diffs are not rendered by default.

1,056 changes: 1,056 additions & 0 deletions lib/gen/strings_ru.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_sv.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_tr.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_ug.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_uk.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_vi.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_zh.g.dart

Large diffs are not rendered by default.

1,044 changes: 1,044 additions & 0 deletions lib/gen/strings_zh_TW.g.dart

Large diffs are not rendered by default.

85 changes: 50 additions & 35 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import 'dart:ui' as ui;
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:path/path.dart';
import 'package:updatium/gen/strings.g.dart';
Comment on lines +9 to +10
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

4. Conflicting t definitions 🐞 Bug ≡ Correctness

lib/main.dart imports Slang generated strings.g.dart (defines top-level getter t) and
slang_converter.dart (defines top-level function t(String)), so uses like t('ok') become
ambiguous/invalid and will not compile.
Agent Prompt
### Issue description
There are two different top-level `t` symbols in scope (Slang getter and SimpleLocalization wrapper function). Current call sites like `t('ok')` cannot be resolved correctly.

### Issue Context
Slang's `t` is a getter returning `Translations` (usage: `t.someKey` / `context.t.someKey`). The existing converter defines `t(String key)`.

### Fix Focus Areas
- lib/main.dart[6-26]
- lib/main.dart[648-659]
- lib/gen/strings.g.dart[648-658]
- lib/services/slang_converter.dart[1-6]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

import 'package:updatium/pages/home.dart';
import 'package:updatium/providers/apps_provider.dart';
import 'package:updatium/providers/logs_provider.dart';
Expand All @@ -17,6 +19,8 @@ import 'package:provider/provider.dart';
import 'package:dynamic_color/dynamic_color.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:background_fetch/background_fetch.dart';
import 'package:updatium/services/slang-converter.dart';
import 'package:updatium/lib/gen/strings.g.dart';
Comment on lines +22 to +23
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

3. Broken import paths 🐞 Bug ≡ Correctness

lib/main.dart imports package:updatium/services/slang-converter.dart (no such file in repo) and
also imports package:updatium/lib/gen/strings.g.dart (invalid package URI), both of which block
compilation.
Agent Prompt
### Issue description
`lib/main.dart` has invalid imports: a non-existent file (`slang-converter.dart`) and a wrong package URI that includes `/lib/`.

### Issue Context
The generated file lives at `lib/gen/strings.g.dart` and should be imported as `package:updatium/gen/strings.g.dart`.

### Fix Focus Areas
- lib/main.dart[6-26]
- lib/gen/strings.g.dart[1-30]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

import 'package:updatium/services/slang_converter.dart';
import 'package:simple_localization/src/simple_localization_controller.dart';
import 'package:simple_localization/src/localization.dart';
Expand Down Expand Up @@ -80,33 +84,21 @@ bool isLocaleRTL(Locale locale) {
}

Future<void> loadTranslations() async {
// See easy_localization/issues/210
await SimpleLocalizationController.initEasyLocation();
var s = SettingsProvider();
try {
await s.initializeSettings();
var forceLocale = s.forcedLocale;
final controller = SimpleLocalizationController(
saveLocale: true,
forceLocale: forceLocale,
fallbackLocale: fallbackLocale,
supportedLocales: supportedLocales.map((e) => e.key).toList(),
assetLoader: RootBundleAssetLoader.fromRootBundle(),
useOnlyLangCode: false,
useFallbackTranslations: true,
path: localeDir,
onLoadError: (FlutterError e) {
throw e;
},
);
await controller.loadTranslations();
Localization.load(
controller.locale,
translations: controller.translations,
fallbackTranslations: controller.fallbackTranslations,
);

if (forceLocale != null) {
final appLocale = AppLocaleUtils.parseLocaleParts(
languageCode: forceLocale.languageCode,
countryCode: forceLocale.countryCode,
);
LocaleSettings.setLocale(appLocale);
} else {
await LocaleSettings.useDeviceLocale();
}
} finally {
// Clean up the temporary SettingsProvider instance
s.dispose();
}
}
Expand Down Expand Up @@ -165,7 +157,8 @@ void main() async {
} catch (e) {
// Already added, do nothing (see #375)
}
await SimpleLocalization.ensureInitialized();

await loadTranslations();

// Enable edge-to-edge mode for Android 10+ (API 29)
try {
Expand All @@ -187,6 +180,20 @@ void main() async {
await np.initialize();
FlutterForegroundTask.initCommunicationPort();

runApp(
TranslationProvider(
child: MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => AppsProvider()),
ChangeNotifierProvider(create: (context) => SettingsProvider()),
Provider(create: (context) => np),
Provider(create: (context) => LogsProvider()),
],
child: const Updatium(),
),
),
);

runApp(
MultiProvider(
providers: [
Comment on lines +183 to 199
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

1. Two runapp calls 🐞 Bug ≡ Correctness

main() calls runApp twice; the second call replaces the widget tree without
TranslationProvider, but _UpdatiumState.build still calls TranslationProvider.of(context),
which will throw at runtime.
Agent Prompt
### Issue description
`main()` calls `runApp(...)` twice. The second call overwrites the first tree and removes `TranslationProvider`, but the app later uses `TranslationProvider.of(context)`.

### Issue Context
This will crash when building `Updatium` because no `TranslationProvider` ancestor exists in the final widget tree.

### Fix Focus Areas
- lib/main.dart[147-215]
- lib/main.dart[581-596]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Expand Down Expand Up @@ -235,7 +242,7 @@ class _UpdatiumState extends State<Updatium> {
WidgetsBinding.instance.platformDispatcher.onLocaleChanged;
WidgetsBinding.instance.platformDispatcher.onLocaleChanged = () {
if (_settingsProvider?.forcedLocale == null) {
_settingsProvider?.resetLocaleSafe(context);
LocaleSettings.useDeviceLocale();
}
};
}
Expand Down Expand Up @@ -408,13 +415,15 @@ class _UpdatiumState extends State<Updatium> {
}
}

// Sync local and device locale if needed
if (!supportedLocales.map((e) => e.key).contains(context.locale)) {
settingsProvider.resetLocaleSafe(context);
} else if (settingsProvider.forcedLocale != null &&
context.locale != settingsProvider.forcedLocale) {
// Apply forced locale if it's set but not currently active
context.setLocale(settingsProvider.forcedLocale!);
// Sync local and device locale if needed for slang
if (settingsProvider.forcedLocale != null) {
final appLocale = AppLocaleUtils.parseLocaleParts(
languageCode: settingsProvider.forcedLocale!.languageCode,
countryCode: settingsProvider.forcedLocale!.countryCode,
);
if (LocaleSettings.currentLocale != appLocale) {
LocaleSettings.setLocale(appLocale);
}
}
}

Expand Down Expand Up @@ -569,15 +578,21 @@ class _UpdatiumState extends State<Updatium> {
);
}

final slangLocale = TranslationProvider.of(context).locale;

return Directionality(
textDirection: isLocaleRTL(context.locale)
textDirection: isLocaleRTL(slangLocale.flutterLocale)
? ui.TextDirection.rtl
: ui.TextDirection.ltr,
child: MaterialApp(
title: 'Updatium',
localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales,
locale: context.locale,
localizationsDelegates: const [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
]
supportedLocales: AppLocaleUtils.supportedLocales,
locale: slangLocale.flutterLocale,
Comment on lines +589 to +595
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

2. Missing comma in materialapp 🐞 Bug ≡ Correctness

The MaterialApp(...) argument list is missing a comma after the localizationsDelegates list,
producing a Dart syntax error and preventing compilation.
Agent Prompt
### Issue description
`MaterialApp` named parameters must be comma-separated; the comma after `localizationsDelegates: const [...]` is missing.

### Issue Context
This is a hard syntax error.

### Fix Focus Areas
- lib/main.dart[587-596]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

navigatorKey: globalNavigatorKey,
debugShowCheckedModeBanner: false,
theme: createTheme(lightColorScheme),
Expand Down
88 changes: 88 additions & 0 deletions pubspec.lock
Original file line number Diff line number Diff line change
@@ -1,6 +1,22 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
_fe_analyzer_shared:
dependency: transitive
description:
name: _fe_analyzer_shared
sha256: cd6add6f846f35fb79f3c315296703c1a24f3cfd7f4739d91a74961c1c7e9f1b
url: "https://pub.dev"
source: hosted
version: "100.0.0"
analyzer:
dependency: transitive
description:
name: analyzer
sha256: "6ba98576948803398b69e3a444df24eacdbe12ed699c7014e120ea38552debbf"
url: "https://pub.dev"
source: hosted
version: "13.0.0"
android_intent_plus:
dependency: "direct main"
description:
Expand Down Expand Up @@ -130,6 +146,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.2"
build:
dependency: transitive
description:
name: build
sha256: a156715e7cd728130c592f30552575908aae5b100005fbc1f0fb16b3c03a3d10
url: "https://pub.dev"
source: hosted
version: "4.0.6"
characters:
dependency: transitive
description:
Expand Down Expand Up @@ -186,6 +210,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.0"
convert:
dependency: transitive
description:
name: convert
sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68
url: "https://pub.dev"
source: hosted
version: "3.1.2"
cross_file:
dependency: transitive
description:
Expand All @@ -210,6 +242,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.2"
dart_style:
dependency: transitive
description:
name: dart_style
sha256: "59d53ef8eaed9d288ed9767618e2b31c4fa0383a127db59d5eb2e737a7638a60"
url: "https://pub.dev"
source: hosted
version: "3.1.9"
dbus:
dependency: transitive
description:
Expand Down Expand Up @@ -510,6 +550,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.1.0"
glob:
dependency: transitive
description:
name: glob
sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de
url: "https://pub.dev"
source: hosted
version: "2.1.3"
gtk:
dependency: transitive
description:
Expand Down Expand Up @@ -942,6 +990,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.6.0"
serial_csv:
dependency: transitive
description:
name: serial_csv
sha256: "2d62bb70cb3ce7251383fc86ea9aae1298ab1e57af6ef4e93b6a9751c5c268dd"
url: "https://pub.dev"
source: hosted
version: "0.5.2"
share_plus:
dependency: "direct main"
description:
Expand Down Expand Up @@ -1037,6 +1093,30 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
slang:
dependency: "direct main"
description:
name: slang
sha256: ea6702ed6b1c82065fb2de906fe34ac9298117342e3c2ea2567132efdc81bd17
url: "https://pub.dev"
source: hosted
version: "4.14.0"
slang_build_runner:
dependency: "direct main"
description:
name: slang_build_runner
sha256: "1db59254041026aec97df5aca30a602e09e9d1546c3d16b55c3c7cf4c16cdb6c"
url: "https://pub.dev"
source: hosted
version: "4.14.0"
slang_flutter:
dependency: "direct main"
description:
name: slang_flutter
sha256: dcc4e77527c91b12348fc8bdd43d3eb92d8cea37c12a23a1f9719cdc12c804c6
url: "https://pub.dev"
source: hosted
version: "4.14.0"
source_span:
dependency: transitive
description:
Expand Down Expand Up @@ -1245,6 +1325,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "15.2.0"
watcher:
dependency: transitive
description:
name: watcher
sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635"
url: "https://pub.dev"
source: hosted
version: "1.2.1"
web:
dependency: transitive
description:
Expand Down
3 changes: 3 additions & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,9 @@ dependencies:
progress_indicator_m3e: ^0.1.1
loading_indicator_m3e: ^0.1.1
dynamic_color: ^1.8.1
slang: ^4.14.0
slang_flutter: ^4.14.0
slang_build_runner: ^4.14.0
Comment on lines +99 to +101
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

5. Missing flutter_localizations dep 🐞 Bug ≡ Correctness

main.dart now references GlobalMaterialLocalizations / GlobalWidgetsLocalizations /
GlobalCupertinoLocalizations, but pubspec.yaml does not include the flutter_localizations SDK
dependency, causing unresolved symbols/build failure.
Agent Prompt
### Issue description
`GlobalMaterialLocalizations` and related delegates require the Flutter SDK package `flutter_localizations`, which must be added to `pubspec.yaml`.

### Issue Context
`main.dart` references these delegates directly.

### Fix Focus Areas
- pubspec.yaml[86-101]
- lib/main.dart[587-595]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

flutter_launcher_icons:
android: "ic_launcher"
adaptive_icon_background: "#ffffff"
Expand Down
3 changes: 3 additions & 0 deletions slang.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# slang.yaml
input_directory: assets/translations
input_file_pattern: .json
Comment on lines +1 to +3
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

1. Package.json breaks translations 🐞 Bug ≡ Correctness

slang.yaml matches all .json files under assets/translations, so package.json is treated as
a translation source and generates an en Translations class containing only
dependencies.translate. Other locale classes still implements Translations but do not implement
the generated dependencies member, so the generated localization code will not compile and real
en.json keys (e.g., ok, cancel) are not available in the base type.
Agent Prompt
## Issue description
`slang.yaml` is currently configured to treat every `.json` file in `assets/translations` as a localization input. Because `assets/translations/package.json` exists (Node metadata), Slang is generating the base `Translations` API from that file instead of the real locale file(s), which corrupts the generated type contract and breaks compilation.

## Issue Context
- `assets/translations/en.json` contains the actual UI strings.
- `assets/translations/package.json` contains `{ "dependencies": { "translate": "^3.0.1" } }` and is not a locale file.
- The generated `lib/gen/strings_en.g.dart` ends up containing only `dependencies.translate`, and introduces a `dependencies` member on `Translations` that other locale implementations (e.g. `TranslationsAr`) do not implement.

## Fix Focus Areas
- slang.yaml[1-3]
- assets/translations/package.json[1-5]
- lib/gen/strings_en.g.dart[10-70]

### Concrete fix
1. Update `slang.yaml` to only include actual locale JSON files (e.g., by narrowing `input_file_pattern` to a locale filename pattern and/or moving/excluding `package.json` from `input_directory`).
2. Re-run code generation (`dart run slang`) and verify:
   - `lib/gen/strings_en.g.dart` contains the full set of translation getters/flat-map entries from `assets/translations/en.json`.
   - All locale files that `implements Translations` implement the full same API surface (no missing members like `dependencies`).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Loading