Conversation
Summary of ChangesHello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request introduces a new "Safe Mode" feature, providing users with an option to simplify the application interface by replacing the "Add App" functionality with "Import/Export" in the main navigation. This mode is configurable via a new setting. Additionally, the pull request refactors the export directory handling by removing the Highlights
Changelog
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
📝 WalkthroughWalkthroughAdds a Safe Mode setting (persisted), new localized strings across locales, and changes Home navigation to dynamically replace the Add App page with Import/Export when Safe Mode is enabled. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant SettingsPage as Settings Page
participant SettingsProv as SettingsProvider
participant HomePage as Home Page
participant PageResolver as Page Resolver
User->>SettingsPage: toggle Safe Mode
SettingsPage->>SettingsProv: set safeMode(val)
SettingsProv->>SettingsProv: persist to SharedPreferences
SettingsProv->>HomePage: notifyListeners
HomePage->>PageResolver: getPages(settingsProvider)
alt safeMode == true
PageResolver->>HomePage: pages with ImportExportPage
else safeMode == false
PageResolver->>HomePage: pages with AddAppPage
end
HomePage->>HomePage: rebuild UI / update navigation
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
📝 Coding Plan
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Code Review
This pull request introduces a new "Safe Mode" feature, allowing users to hide the "Add App" page and display an "Import/Export" page instead, with a toggle available in the settings. The navigation pages are now dynamically generated based on the safeMode setting, and adding new apps is prevented when safe mode is active. However, the current implementation has two critical issues: a LateInitializationError in home.dart due to _iconControllers and _iconAnimations being initialized too late, and the pickExportDir functionality in settings_provider.dart was removed without a replacement, breaking the ability to select an export directory.
| Future<void> pickExportDir({bool remove = false}) async { | ||
| var existingSAFPerms = await DocMan.perms.list(); | ||
| // DocMan functionality removed | ||
| var currentOneWayDataSyncDir = await getExportDir(); | ||
| Uri? newOneWayDataSyncDir; | ||
| if (!remove) { | ||
| final pickedDir = await DocMan.pick.directory(); | ||
| newOneWayDataSyncDir = pickedDir != null | ||
| ? Uri.parse(pickedDir.uri) | ||
| : null; | ||
| } | ||
| if (currentOneWayDataSyncDir?.path != newOneWayDataSyncDir?.path) { | ||
| if (newOneWayDataSyncDir == null) { | ||
| prefs?.remove('exportDir'); | ||
| } else { | ||
| prefs?.setString('exportDir', newOneWayDataSyncDir.toString()); | ||
| } | ||
| notifyListeners(); | ||
| } | ||
| for (var e in existingSAFPerms) { | ||
| await DocMan.perms.release(e.uri); | ||
| // SAF picker functionality removed | ||
| } | ||
| // DocMan permission release functionality removed | ||
| } |
There was a problem hiding this comment.
The pickExportDir function has been emptied, with comments indicating that DocMan functionality was removed. This breaks the ability for users to select an export directory, which is a critical part of the export feature. If an export directory is not already set, the export functionality will not work.
Please restore this functionality, perhaps using another file picker library if docman is being deprecated.
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
lib/pages/home.dart (1)
162-177:⚠️ Potential issue | 🟡 MinorType safety issue when accessing page key in safe mode.
When
safeModeisfalse, the code correctly returns early. However, ifsafeModestate changes during thegoToAddAppexecution (e.g., via a race condition), line 170's castpages[1].widget.key as GlobalKey<AddAppPageState>?would fail becauseImportExportPagedoesn't use that key type.Consider storing a direct reference to the
AddAppPagekey (as suggested above) rather than extracting it from the dynamically-built pages list.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@lib/pages/home.dart` around lines 162 - 177, The goToAddApp method currently casts pages[1].widget.key to GlobalKey<AddAppPageState>, which can fail if the pages list changes mid-execution; instead, keep a dedicated GlobalKey<AddAppPageState> (e.g., addAppKey) as a member and use it directly (or expose a typed getter) rather than extracting from getPages(), and update goToAddApp to reference addAppKey, await its currentState safely, and guard against null before calling linkFn; this eliminates the unsafe cast and the race that occurs when the pages list or page type changes during execution.lib/providers/settings_provider.dart (1)
421-439:⚠️ Potential issue | 🔴 CriticalCritical: Export functionality is broken—
pickExportDir()is non-functional andgetExportDir()lacks accessibility validation.The changes to these methods break the export flow:
getExportDir()now returns any stored URI without verifying accessibility. Callers expectnullto signal that the picker should be invoked or to show appropriate UI hints (e.g.,import_export.dart:305-328FutureBuilder and conditional hint text).
pickExportDir()is a complete no-op. It retrieves but discards the current directory and has no picker or storage logic. The flow inapps_provider.dart:2334–2335callspickExportDir()then immediately callsgetExportDir()expecting the newly picked value—this will return the stale/old value or null.The UI in
import_export.dart:328exposes a "pickExportDir" button to users, but it will be non-functional.If DocMan is being removed, you must implement an alternative directory picker (e.g., SAF picker) or storage mechanism, otherwise exports will silently fail or proceed with invalid paths.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@lib/providers/settings_provider.dart` around lines 421 - 439, getExportDir currently returns any stored URI without checking accessibility and pickExportDir is a no-op, breaking the export flow; update getExportDir to validate that the stored Uri (from prefs 'exportDir') is accessible/readable and return null if not (so callers like import_export.dart FutureBuilder trigger the picker/UI hint), and implement pickExportDir to actually invoke the platform directory picker or fallback mechanism, persist the chosen Uri into prefs under 'exportDir', and return or set the new value so callers (e.g., apps_provider.dart flow) receive the updated directory; ensure pickExportDir also handles removal when remove=true by clearing prefs and releasing any platform permissions.
🧹 Nitpick comments (1)
lib/pages/home.dart (1)
428-431: Inconsistent indentation.Lines 429-431 have inconsistent indentation compared to the surrounding code block.
🔧 Proposed fix
final settingsProvider = context.read<SettingsProvider>(); - final pages = getPages(settingsProvider); - return !(pages[0].widget.key as GlobalKey<AppsPageState>).currentState! - .clearSelected(); + final pages = getPages(settingsProvider); + return !(pages[0].widget.key as GlobalKey<AppsPageState>).currentState! + .clearSelected(); },🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@lib/pages/home.dart` around lines 428 - 431, The three-line block using SettingsProvider/getPages and accessing (pages[0].widget.key as GlobalKey<AppsPageState>).currentState!.clearSelected() is mis-indented; reformat those lines to match the surrounding block indentation (align with the enclosing return/statement level), preserving the exact expressions and casts (SettingsProvider, getPages, AppsPageState, clearSelected) and ensure the chained call remains on one logical statement with consistent leading spaces.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@assets/translations/en.json`:
- Around line 264-266: The three new translation keys safeMode,
safeModeDescription, and safeModeAddAppDisabled were added to en.json but are
missing from the other locale files causing the integrity check to fail; open
each locale JSON (ar, bs, ca, cs, da, de, en-EO, es, et, fa, fr, gl, he, hu, id,
it, ja, ko, ml, nl, pl, pt-BR, pt, ru, sv, tr, uk, vi, zh-Hant-TW, zh) and add
these three keys with appropriate localized strings (matching the meaning in
en.json) ensuring correct JSON syntax and preserving ordering/formatting
consistent with existing files so the translation integrity script passes.
In `@lib/pages/home.dart`:
- Around line 48-64: The getPages() function is recreating
GlobalKey<AppsPageState>() and GlobalKey<AddAppPageState>() on every call which
breaks state access; instead, add stable instance fields (e.g. final
GlobalKey<AppsPageState> _appsKey and final GlobalKey<AddAppPageState>
_addAppKey) initialized once (at declaration or in initState()) and use those
keys in getPages() when constructing AppsPage and AddAppPage; update any access
sites that cast pages[0].widget.key or similar to use these stable keys to
ensure .currentState is reachable and deep-link handlers can find the state.
- Around line 71-90: The post-frame initialization currently in
WidgetsBinding.instance.addPostFrameCallback causes LateInitializationError
because _iconControllers and _iconAnimations are accessed in build before that
callback runs; move the initialization into didChangeDependencies (or initState
pattern that accesses context safely) and run it once: in didChangeDependencies
check a bool like _iconsInitialized, fetch the SettingsProvider via
context.read<SettingsProvider>(), call getPages(settingsProvider) to get
pagesList, create the AnimationController list (_iconControllers) and
corresponding Tween/CurvedAnimation list (_iconAnimations), set
_iconsInitialized = true and call setState(); ensure disposal logic still
disposes every controller in dispose().
---
Outside diff comments:
In `@lib/pages/home.dart`:
- Around line 162-177: The goToAddApp method currently casts pages[1].widget.key
to GlobalKey<AddAppPageState>, which can fail if the pages list changes
mid-execution; instead, keep a dedicated GlobalKey<AddAppPageState> (e.g.,
addAppKey) as a member and use it directly (or expose a typed getter) rather
than extracting from getPages(), and update goToAddApp to reference addAppKey,
await its currentState safely, and guard against null before calling linkFn;
this eliminates the unsafe cast and the race that occurs when the pages list or
page type changes during execution.
In `@lib/providers/settings_provider.dart`:
- Around line 421-439: getExportDir currently returns any stored URI without
checking accessibility and pickExportDir is a no-op, breaking the export flow;
update getExportDir to validate that the stored Uri (from prefs 'exportDir') is
accessible/readable and return null if not (so callers like import_export.dart
FutureBuilder trigger the picker/UI hint), and implement pickExportDir to
actually invoke the platform directory picker or fallback mechanism, persist the
chosen Uri into prefs under 'exportDir', and return or set the new value so
callers (e.g., apps_provider.dart flow) receive the updated directory; ensure
pickExportDir also handles removal when remove=true by clearing prefs and
releasing any platform permissions.
---
Nitpick comments:
In `@lib/pages/home.dart`:
- Around line 428-431: The three-line block using SettingsProvider/getPages and
accessing (pages[0].widget.key as
GlobalKey<AppsPageState>).currentState!.clearSelected() is mis-indented;
reformat those lines to match the surrounding block indentation (align with the
enclosing return/statement level), preserving the exact expressions and casts
(SettingsProvider, getPages, AppsPageState, clearSelected) and ensure the
chained call remains on one logical statement with consistent leading spaces.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 8351b047-18c1-4f5a-9f96-1b2f70fd7c1b
📒 Files selected for processing (4)
assets/translations/en.jsonlib/pages/home.dartlib/pages/settings.dartlib/providers/settings_provider.dart
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
lib/pages/home.dart (1)
300-309:⚠️ Potential issue | 🟠 Major
switchToPage(0)can wait forever when already on Apps.At Line 305, looping while
currentState != nullnever exits if the current page is already Apps, causing an unbounded async loop and breaking subsequent navigation flows.🐛 Proposed fix
Future<void> switchToPage(int index) async { setIsReversing(index); - final settingsProvider = context.read<SettingsProvider>(); - final pages = getPages(settingsProvider); if (index == 0) { - while ((pages[0].widget.key as GlobalKey<AppsPageState>).currentState != - null) { - // Avoid duplicate GlobalKey error - await Future.delayed(const Duration(microseconds: 1)); - } + if (selectedIndexHistory.isEmpty) return; // already on Apps setState(() { selectedIndexHistory.clear(); }); + return; } else if (selectedIndexHistory.isEmpty || (selectedIndexHistory.isNotEmpty && selectedIndexHistory.last != index)) {🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@lib/pages/home.dart` around lines 300 - 309, The loop in switchToPage uses the wrong condition and can hang when the Apps page is already active; invert the check so we wait until the Apps page key becomes non-null instead of waiting while it's non-null. Specifically, in switchToPage change the while condition that inspects (pages[0].widget.key as GlobalKey<AppsPageState>).currentState from "while (currentState != null)" to "while (currentState == null)" so the code awaits the widget being mounted instead of looping forever when Apps is already present.
♻️ Duplicate comments (2)
lib/pages/home.dart (2)
71-90:⚠️ Potential issue | 🔴 Critical
lateanimation fields can crash on first frame.
build()reads_iconControllers/_iconAnimations(Line 386, Line 397) before the post-frame callback runs, so first render can throwLateInitializationError.🐛 Proposed fix
`@override` void initState() { super.initState(); - // Initialize animation controllers for each nav item - WidgetsBinding.instance.addPostFrameCallback((_) { - final settingsProvider = context.read<SettingsProvider>(); - final pagesList = getPages(settingsProvider); - _iconControllers = List.generate( - pagesList.length, - (index) => AnimationController( - duration: const Duration(milliseconds: 600), - vsync: this, - ), - ); - - _iconAnimations = _iconControllers - .map( - (controller) => Tween<double>(begin: 0, end: 1).animate( - CurvedAnimation(parent: controller, curve: Curves.easeInOut), - ), - ) - .toList(); - setState(() {}); // Rebuild after initialization - }); + _iconControllers = List.generate( + 3, + (index) => AnimationController( + duration: const Duration(milliseconds: 600), + vsync: this, + ), + ); + _iconAnimations = _iconControllers + .map( + (controller) => Tween<double>(begin: 0, end: 1).animate( + CurvedAnimation(parent: controller, curve: Curves.easeInOut), + ), + ) + .toList(); initDeepLinks();🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@lib/pages/home.dart` around lines 71 - 90, The crash occurs because _iconControllers and _iconAnimations are declared late but build() may access them before the post-frame callback populates them; initialize them to empty lists synchronously (e.g., set _iconControllers = <AnimationController>[] and _iconAnimations = <Animation<double>>[] in the field declaration or at the start of initState) and then in the existing WidgetsBinding.instance.addPostFrameCallback populate/replace those lists using getPages and the generated controllers, calling setState afterwards; this ensures build() can safely read _iconControllers/_iconAnimations before the post-frame callback runs.
48-60:⚠️ Potential issue | 🔴 CriticalUndefined page keys will fail compilation.
_appsPageKey(Line 53) and_addAppPageKey(Line 60) are used but not declared in_HomePageState, which is a compile-time error.🐛 Proposed fix
class _HomePageState extends State<HomePage> with TickerProviderStateMixin { List<int> selectedIndexHistory = []; bool isReversing = false; int prevAppCount = -1; bool prevIsLoading = true; late AppLinks _appLinks; StreamSubscription<Uri>? _linkSubscription; bool isLinkActivity = false; late List<AnimationController> _iconControllers; late List<Animation<double>> _iconAnimations; + final GlobalKey<AppsPageState> _appsPageKey = GlobalKey<AppsPageState>(); + final GlobalKey<AddAppPageState> _addAppPageKey = GlobalKey<AddAppPageState>();🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@lib/pages/home.dart` around lines 48 - 60, The build uses undeclared page keys _appsPageKey and _addAppPageKey in _HomePageState causing a compile error; fix it by declaring them as fields on _HomePageState (e.g. final GlobalKey or GlobalKey<State> typed keys) and initialize them before use so AppsPage(key: _appsPageKey) and AddAppPage(key: _addAppPageKey) receive valid keys; locate the _HomePageState class and add the _appsPageKey and _addAppPageKey declarations (typed appropriately for AppsPage and AddAppPage) and initialize them in-place or in initState.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@lib/pages/home.dart`:
- Around line 428-431: The back handler force-unwraps currentState on the
AppsPage GlobalKey, which can throw if the page is unmounted; update the
expression in home.dart to use a null-aware access on (pages[0].widget.key as
GlobalKey<AppsPageState>).currentState?.clearSelected() and provide a safe
boolean fallback (e.g. use ?? true or ?? false depending on desired behavior) so
the handler doesn't crash when currentState is null; keep references to
SettingsProvider, getPages, AppsPageState, clearSelected and pages when applying
the change.
---
Outside diff comments:
In `@lib/pages/home.dart`:
- Around line 300-309: The loop in switchToPage uses the wrong condition and can
hang when the Apps page is already active; invert the check so we wait until the
Apps page key becomes non-null instead of waiting while it's non-null.
Specifically, in switchToPage change the while condition that inspects
(pages[0].widget.key as GlobalKey<AppsPageState>).currentState from "while
(currentState != null)" to "while (currentState == null)" so the code awaits the
widget being mounted instead of looping forever when Apps is already present.
---
Duplicate comments:
In `@lib/pages/home.dart`:
- Around line 71-90: The crash occurs because _iconControllers and
_iconAnimations are declared late but build() may access them before the
post-frame callback populates them; initialize them to empty lists synchronously
(e.g., set _iconControllers = <AnimationController>[] and _iconAnimations =
<Animation<double>>[] in the field declaration or at the start of initState) and
then in the existing WidgetsBinding.instance.addPostFrameCallback
populate/replace those lists using getPages and the generated controllers,
calling setState afterwards; this ensures build() can safely read
_iconControllers/_iconAnimations before the post-frame callback runs.
- Around line 48-60: The build uses undeclared page keys _appsPageKey and
_addAppPageKey in _HomePageState causing a compile error; fix it by declaring
them as fields on _HomePageState (e.g. final GlobalKey or GlobalKey<State> typed
keys) and initialize them before use so AppsPage(key: _appsPageKey) and
AddAppPage(key: _addAppPageKey) receive valid keys; locate the _HomePageState
class and add the _appsPageKey and _addAppPageKey declarations (typed
appropriately for AppsPage and AddAppPage) and initialize them in-place or in
initState.
There was a problem hiding this comment.
🚫 CI Build Failed
The automated build process failed. Please review the build logs and fix the issues before requesting another review.
Next steps:
- Check the build logs for specific errors
- Fix the identified issues
- Push your fixes to this branch
- The CI will automatically re-run
Once the build passes, this review will be dismissed automatically.
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
✅ CI Build Passed - Automatically dismissing previous rejection as the build now succeeds.
There was a problem hiding this comment.
Actionable comments posted: 8
Note
Due to the large number of review comments, Critical severity comments were prioritized as inline comments.
♻️ Duplicate comments (1)
lib/pages/home.dart (1)
49-65:⚠️ Potential issue | 🔴 CriticalKeep the page
GlobalKeys stable.
getPages()still creates freshGlobalKeys and page instances on every call, so thecurrentStatelookups used by the deep-link handlers andonWillPopnever point at the mountedAppsPage/AddAppPage. In practice this can hanggoToAddApp()/goToExistingApp(), skipclearSelected(), and reset page state on rebuild.🛠️ Proposed fix
class _HomePageState extends State<HomePage> with TickerProviderStateMixin { + final GlobalKey<AppsPageState> _appsPageKey = GlobalKey<AppsPageState>(); + final GlobalKey<AddAppPageState> _addAppPageKey = + GlobalKey<AddAppPageState>(); + List<NavigationPageItem> getPages(SettingsProvider settingsProvider) { return [ NavigationPageItem( tr('appsString'), Icons.apps, - AppsPage(key: GlobalKey<AppsPageState>()), + AppsPage(key: _appsPageKey), ), NavigationPageItem( settingsProvider.safeMode ? tr('importExport') : tr('addApp'), settingsProvider.safeMode ? Icons.import_export : Icons.add_circle, settingsProvider.safeMode ? const ImportExportPage() - : AddAppPage(key: GlobalKey<AddAppPageState>()), + : AddAppPage(key: _addAppPageKey), ), NavigationPageItem(tr('settings'), Icons.settings, const SettingsPage()), ]; }Then use
_appsPageKey/_addAppPageKeydirectly at thecurrentStatecall sites instead of recastingpages[i].widget.key.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@lib/pages/home.dart` around lines 49 - 65, getPages currently constructs new GlobalKey instances and page widgets on each call causing stale currentState lookups; make two persistent fields (e.g. _appsPageKey and _addAppPageKey of types GlobalKey<AppsPageState> and GlobalKey<AddAppPageState>) and use them when building the NavigationPageItem widgets inside getPages so the same keys are reused across rebuilds, and update any deep-link/onWillPop call sites that extract currentState from pages[i].widget.key to instead reference _appsPageKey.currentState and _addAppPageKey.currentState directly.
🟠 Major comments (16)
assets/translations/gl.json-247-249 (1)
247-249:⚠️ Potential issue | 🟠 MajorSync
gl.jsonwith source locale—18 keys missing.The Safe Mode additions here are syntactically correct. However, CI is failing because
gl.jsonis missing 18 translation keys that exist inen.json:apkcombo, apkmirror, apkpure, appLogsHint, appSourceHint, aptoide, codeberg, gitlab, html, huaweiappgallery, izzyondroid, jenkins, neutroncode, rustore, sourcehut, telegramapp, uptodown, wikiHint
Please add these missing translations before merge.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/translations/gl.json` around lines 247 - 249, Add the 18 missing translation keys to gl.json so it matches en.json: apkcombo, apkmirror, apkpure, appLogsHint, appSourceHint, aptoide, codeberg, gitlab, html, huaweiappgallery, izzyondroid, jenkins, neutroncode, rustore, sourcehut, telegramapp, uptodown, wikiHint; insert each key into the JSON object in the same style as the existing Safe Mode entries (use proper Galician translations where available, otherwise add the English string or a short placeholder), ensuring valid JSON syntax and no duplicate keys so CI will pass.assets/translations/ko.json.bak-1-429 (1)
1-429:⚠️ Potential issue | 🟠 MajorRemove the
.bakbackup file from this commit.The
ko.json.bakfile is a backup artifact that should not be committed to the repository. The actualko.jsonfile already contains the Safe Mode translations (verified), so this backup is unnecessary. Additionally,.bakpatterns should be added to.gitignoreto prevent accidental inclusion of editor backups in future commits.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/translations/ko.json.bak` around lines 1 - 429, This commit accidentally includes a backup artifact (ko.json.bak); remove that file from the commit/branch and from future commits, and add a .bak pattern to .gitignore so editor backups aren't tracked; specifically, delete/unstage the file named ko.json.bak (or remove it from the index if already committed), ensure the real ko.json remains, update .gitignore to include *.bak (or .bak) and create a follow-up commit that removes the backup and updates .gitignore.assets/translations/id.json-247-250 (1)
247-250:⚠️ Potential issue | 🟠 Major
id.jsonstill has missing translation keys.The Safe Mode additions and phrasing update at Line 247-250 look fine, but the file still fails key-parity checks in CI.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/translations/id.json` around lines 247 - 250, The Indonesian translation file is missing keys required for key-parity CI checks; compare the master English keys (e.g., "safeMode", "safeModeDescription", "safeModeAddAppDisabled", "tryInferAppIdFromCode") against assets/translations/id.json and add any missing keys with appropriate Indonesian translations (or placeholder values) so all keys present in the source locale are present here; ensure the JSON remains valid (no trailing commas) and run the parity script/CI locally to confirm the file passes before pushing.assets/translations/et.json-247-250 (1)
247-250:⚠️ Potential issue | 🟠 Major
et.jsonstill fails translation key parity.Despite the new entries at Line 247-250, CI reports missing keys in
assets/translations/et.json, so this file still blocks the translation pipeline.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/translations/et.json` around lines 247 - 250, The Estonian translations file assets/translations/et.json is missing keys required by the source locale; ensure key parity by adding all missing translation keys found in the source (e.g., check against keys like "safeMode", "safeModeDescription", "safeModeAddAppDisabled", "tryInferAppIdFromCode" and any others present in the source locale but absent here), update et.json with those keys and appropriate Estonian values, then re-run the translation/CI check (or the i18n parity script) to confirm no keys are missing.assets/translations/fa.json-247-249 (1)
247-249:⚠️ Potential issue | 🟠 Major
fa.jsonstill fails the translation-key completeness check.Line 247-249 adds the Safe Mode entries, but CI still reports missing keys for
assets/translations/fa.json.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/translations/fa.json` around lines 247 - 249, The Persian translation file is still failing completeness — add any missing translation keys present in the canonical source (e.g., ensure all keys analogous to the English file are present) and fix JSON syntax (remove the trailing comma after "safeModeAddAppDisabled") so the file parses; specifically confirm the keys "safeMode", "safeModeDescription", and "safeModeAddAppDisabled" are present and translated, add any other missing keys reported by CI, and validate the file with a JSON linter before pushing.assets/translations/tr.json-247-249 (1)
247-249:⚠️ Potential issue | 🟠 Major
tr.jsonremains out-of-sync withen.jsonkeys.The new Safe Mode strings are valid, but CI still flags missing keys in this locale file.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/translations/tr.json` around lines 247 - 249, The Turkish locale file is missing keys compared to en.json causing CI failures; open assets/translations/tr.json and ensure it contains the same keys as en.json for the Safe Mode section (e.g., "safeMode", "safeModeDescription", "safeModeAddAppDisabled" and any other new Safe Mode-related keys present in en.json), add the missing keys with appropriate Turkish translations, and re-run the i18n/CI check to verify synchronization.assets/translations/en-EO.json-247-249 (1)
247-249:⚠️ Potential issue | 🟠 Major
en-EO.jsonstill has missing keys relative toen.json.The Safe Mode additions are correct, but CI still flags missing keys in this locale, so translation parity is not complete yet.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/translations/en-EO.json` around lines 247 - 249, The en-EO locale is missing keys compared to en.json causing CI failures; update assets/translations/en-EO.json to include all keys present in en.json (not just "safeMode", "safeModeDescription", "safeModeAddAppDisabled"), adding any missing top-level and nested keys with proper Esperanto translations or temporary English fallbacks, then run the locale key parity check to confirm all keys match; focus your updates around the safeMode-related keys and ensure the full key set is synchronized.assets/translations/nl.json.bak-1-429 (1)
1-429:⚠️ Potential issue | 🟠 MajorChanges were made to
nl.json.bak, but CI validatesnl.json.The pipeline failure is for
nl.json; updatingassets/translations/nl.json.bakwill not fix runtime/test key parity.Suggested fix direction
- assets/translations/nl.json.bak + assets/translations/nl.jsonApply these translation updates to
assets/translations/nl.json(or sync both, withnl.jsonas the source used by the app/tests).🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/translations/nl.json.bak` around lines 1 - 429, The CI failure is due to translations being updated only in assets/translations/nl.json.bak while the app/tests validate assets/translations/nl.json; sync the real translation file. Copy or apply the changes from nl.json.bak into assets/translations/nl.json (ensure keys like "invalidURLForSource", "noReleaseFound", "googleVerificationWarningP1", etc., match exactly) or make nl.json the authoritative source and update the backup accordingly, then run the translation validation to confirm parity.assets/translations/ja.json-247-250 (1)
247-250:⚠️ Potential issue | 🟠 MajorTranslation key parity is still failing for
ja.json.The additions at lines 247–250 are fine, but CI still reports 18 missing keys in
assets/translations/ja.json: apkcombo, apkmirror, apkpure, appLogsHint, appSourceHint, aptoide, codeberg, gitlab, html, huaweiappgallery, izzyondroid, jenkins, neutroncode, rustore, sourcehut, telegramapp, uptodown, wikiHint. This remains a merge blocker.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/translations/ja.json` around lines 247 - 250, The ja.json is missing 18 translation keys required by CI; open assets/translations/ja.json and add the missing keys (apkcombo, apkmirror, apkpure, appLogsHint, appSourceHint, aptoide, codeberg, gitlab, html, huaweiappgallery, izzyondroid, jenkins, neutroncode, rustore, sourcehut, telegramapp, uptodown, wikiHint) alongside the existing keys such as "safeMode", "safeModeDescription", "safeModeAddAppDisabled", and "tryInferAppIdFromCode"; provide appropriate Japanese strings for each key so the file has parity with the other locales and CI will stop reporting missing keys.assets/translations/ml.json-253-256 (1)
253-256:⚠️ Potential issue | 🟠 Major
minStarCountappears to have been dropped in this edit block.After Line 255, the file jumps to
addInfoBelow(Line 256) andminStarCountis missing, which breaks translation parity and affects the GitHub source settings label.Suggested fix
"safeMode": "സുരക്ഷിത മോഡ്", "safeModeDescription": "അപ്പ് ചേർക്കൽ പേജ് മറയ്ക്കുകയും പകരം ഇറക്കുമതി/കയറ്റുമതി കാണിക്കുക", "safeModeAddAppDisabled": "അപ്പ് ചേർക്കൽ സുരക്ഷിത മോഡിൽ പ്രവർത്തനരഹിതമാണ്", + "minStarCount": "Minimum star count", "addInfoBelow": "ഈ വിവരങ്ങൾ താഴെ ചേർക്കുക.",🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/translations/ml.json` around lines 253 - 256, The translation key minStarCount was accidentally removed between safeModeAddAppDisabled and addInfoBelow, breaking parity; restore the missing "minStarCount" entry with the correct Malayalam translation (matching the original key name minStarCount) inserted after safeModeAddAppDisabled and before addInfoBelow so the JSON keys order/parity and the GitHub source settings label are preserved—look for the surrounding keys safeMode, safeModeDescription, safeModeAddAppDisabled, and addInfoBelow to locate where to re-add minStarCount.assets/translations/vi.json-247-250 (1)
247-250:⚠️ Potential issue | 🟠 Major
vi.jsonstill needs to be fully synced.Translation Management is still failing on
vi.json, so the real Vietnamese locale is incomplete after this change. The backup file in this PR will not satisfy that check.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/translations/vi.json` around lines 247 - 250, The Vietnamese translations file (vi.json) is incomplete and failing translation management; ensure the full locale is synchronized by adding all missing keys and correct translations instead of the backup entries shown — update the entries around "safeMode", "safeModeDescription", "safeModeAddAppDisabled", and "tryInferAppIdFromCode" and any other untranslated or placeholder keys to match the canonical translation source (e.g., from en.json or the translation master), run the translation validation/tooling to confirm no missing keys or format errors, and commit the fully synced vi.json so the translation check passes.assets/translations/ru.json-247-250 (1)
247-250:⚠️ Potential issue | 🟠 MajorSync
ru.jsonwith the source locale before merging.CI is still reporting missing translation keys in
ru.json, so adding the Safe Mode entries here was not sufficient to make the locale valid again.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/translations/ru.json` around lines 247 - 250, The ru.json file is missing other translation keys from the source locale; update/sync ru.json with the full set of keys from the source locale (not just add safeMode, safeModeDescription, safeModeAddAppDisabled, tryInferAppIdFromCode) so the locale passes CI. Locate the canonical source locale file (e.g., en.json) and merge any missing keys into ru.json, provide Russian translations (or placeholders) for all new keys, and then run the project's translation/validation script or CI checks locally to confirm no keys are missing before pushing the change.assets/translations/pt.json-247-250 (1)
247-250:⚠️ Potential issue | 🟠 MajorSync
pt.jsonwith the source locale before merging.The Translation Management job is still reporting missing keys in
pt.json, so this locale update is incomplete and the PR will stay red until the file is brought back in sync withen.json.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/translations/pt.json` around lines 247 - 250, pt.json is out of sync with the source locale (en.json); update the Portuguese translations to include all missing keys present in en.json and remove any stale differences—compare en.json against the current keys (e.g., "safeMode", "safeModeDescription", "safeModeAddAppDisabled", "tryInferAppIdFromCode"), add the absent keys with Portuguese values or placeholders, keep key ordering consistent with en.json, ensure valid JSON (no trailing commas) and run the translation/CI validation script so the Translation Management job passes before merging.assets/translations/vi.json.bak-1-429 (1)
1-429:⚠️ Potential issue | 🟠 MajorMove
.baklocale files outside the translations asset directory.The localization loader ignores
.bakfiles and only loads.jsonfiles matching supported locales. While CI validates only.jsonfiles, keeping backup files in the bundled asset directory adds unnecessary clutter, creates confusion about which file is used, and keeps them tracked in version control. Store backups outsideassets/translations/instead.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/translations/vi.json.bak` around lines 1 - 429, Remove the backup locale file (e.g. vi.json.bak) from the translations asset bundle and place it outside the translations assets directory (or into a dedicated backups folder) so the localization loader only sees supported .json files; update project assets configuration (and .gitignore or packaging rules if needed) to stop including *.bak files in builds and remove vi.json.bak from version control so CI and runtime only load the canonical vi.json.assets/translations/hu.json.bak-1-429 (1)
1-429:⚠️ Potential issue | 🟠 MajorAdd 17 missing translation keys to hu.json.
The Hungarian translation file is missing keys that exist in the English template:
aptoide,neutroncode,rustore,sourcehut,apkpure,apkcombo,appSourceHint,gitlab,huaweiappgallery,apkmirror,izzyondroid,jenkins,appLogsHint,uptodown,codeberg,html,wikiHint,telegramapp. These will cause runtime failures when the app tries to display these strings. The.bakfile is a documented backup created by the translation management system and can be ignored.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/translations/hu.json.bak` around lines 1 - 429, The Hungarian translation is missing 17 keys (aptoide, neutroncode, rustore, sourcehut, apkpure, apkcombo, appSourceHint, gitlab, huaweiappgallery, apkmirror, izzyondroid, jenkins, appLogsHint, uptodown, codeberg, html, wikiHint, telegramapp); add these keys to the Hungarian JSON (assets/translations/hu.json) with appropriate Hungarian strings (or temporary English fallbacks) matching the same key names so runtime lookups succeed, ensuring the keys exactly match the missing identifiers listed and that the file remains valid JSON.assets/translations/zh-Hant-TW.json.bak-1-429 (1)
1-429:⚠️ Potential issue | 🟠 MajorRemove all backup files (*.bak) from version control and add to .gitignore.
All 17 translation backup files in
assets/translations/were committed in a single update but are now out of sync with their corresponding main.jsonfiles. For example,zh-Hant-TW.json.bakis missing the 3 Safe Mode keys that exist inzh-Hant-TW.json.Backup files should not be tracked in version control—they create maintenance overhead and are prone to becoming stale. Add
*.bakto.gitignoreand remove the backup files from the repository.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/translations/zh-Hant-TW.json.bak` around lines 1 - 429, The repo contains committed translation backup files like assets/translations/zh-Hant-TW.json.bak that are stale—remove all *.bak translation backups (all 17) from version control while leaving the main .json translation files intact, and add the *.bak pattern to .gitignore so future backups are not tracked; ensure you remove the files from the index (not just locally) and commit the .gitignore change.
🟡 Minor comments (2)
lib/pages/home.dart-379-381 (1)
379-381:⚠️ Potential issue | 🟡 MinorLocalize the Semantics label and hint to match the rest of the codebase.
The hard-coded English strings at lines 379-381 are inconsistent with how all other Semantics widgets in the app use
tr(). This causes screen reader users on non-English locales to hear untranslated navigation copy. Wrap both the label and the conditional hint text intr()calls—the translation keys for'importExport'and'addApp'already exist in the translation files. You'll also need to add a translation key for'Main navigation'.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@lib/pages/home.dart` around lines 379 - 381, Localize the Semantics strings in the bottomNavigationBar: wrap the Semantics `label` and the conditional `hint` in tr() calls instead of hard-coded English, using the existing translation keys 'importExport' and 'addApp' for the conditional branch tied to `settingsProvider.safeMode`, and add a new translation key (e.g. 'mainNavigation') to your i18n files to replace "Main navigation" so screen readers get localized text; update the `Semantics` invocation in home.dart accordingly.assets/translations/pl.json.bak-1-459 (1)
1-459:⚠️ Potential issue | 🟡 MinorRemove
pl.json.bakfromassets/translations/since it is unused at runtime.The
.bakfile is never loaded byeasy_localizationand adds unnecessary bloat to the asset bundle. The new translation keys (safeMode,safeModeDescription,safeModeAddAppDisabled) are already present in the activepl.jsonfile. If version history is needed, use Git instead of committing backup files.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/translations/pl.json.bak` around lines 1 - 459, Remove the unused backup translation file pl.json.bak from the repository and assets so it is not bundled at runtime; confirm that the active pl.json already contains the new keys (safeMode, safeModeDescription, safeModeAddAppDisabled) and that easy_localization only loads the canonical pl.json, then commit the deletion (use Git history if you need the backup instead of keeping a .bak file in assets).
🧹 Nitpick comments (1)
assets/translations/gl.json (1)
248-249: Consider consistent terminology for “app” labels.These new strings use “aplicación”, while existing UI keys (for example,
addApp) use “app”. Consider aligning terms for consistency.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@assets/translations/gl.json` around lines 248 - 249, The new translation keys safeModeDescription and safeModeAddAppDisabled use the term “aplicación” which is inconsistent with existing keys like addApp that use “app”; update the Galician strings to use the same term (“app”) or match whichever canonical term the UI uses, e.g., replace “aplicación” with “app” in safeModeDescription and safeModeAddAppDisabled so terminology is consistent across keys.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@assets/translations/bs.json`:
- Around line 247-249: The bs.json file is missing many keys compared to the
base locale; add all missing keys so the file has full parity (including
placeholder patterns and plural forms) with the source locale; update or copy
the corresponding entries from the base locale into bs.json for every missing
key (e.g., ensure keys such as "safeMode", "safeModeDescription",
"safeModeAddAppDisabled" remain and add the other ~469 missing keys), preserve
placeholder tokens and ICU/plural syntax exactly, and validate the JSON after
syncing to unblock CI.
In `@assets/translations/cs.json`:
- Around line 247-249: cs.json is missing translation keys required for parity
with the base locale; update the file to include all keys present in the base
translation (ensure you add any missing keys beyond the existing "safeMode",
"safeModeDescription", and "safeModeAddAppDisabled"), using the same key names
as in the base file so CI's key parity check passes; after adding the keys, run
the translation parity/CI check locally (or re-run the pipeline) to confirm no
keys are missing.
In `@assets/translations/da.json`:
- Around line 247-249: da.json is missing required translation keys causing the
completeness check to fail; open the source locale (e.g., en.json) and sync all
missing keys into assets/translations/da.json, ensuring you include every
top-level and nested key (including "safeMode", "safeModeDescription",
"safeModeAddAppDisabled" and any keys present in en.json but absent here),
preserve the exact key names and JSON structure, provide Danish translations for
each missing entry, and validate the JSON before committing.
In `@assets/translations/it.json`:
- Around line 247-249: The it.json locale is missing translation keys beyond the
three Safe Mode entries ("safeMode", "safeModeDescription",
"safeModeAddAppDisabled"); update it by syncing the full keyset from the source
locale (e.g., compare with the canonical en.json) and add all missing keys with
Italian translations or placeholders, ensuring you cover nested keys and
metadata; after updating, run the translation validation script/CI check used in
the repo to confirm no keys are missing and commit the synchronized it.json.
In `@assets/translations/ko.json`:
- Around line 247-250: The Korean translation file ko.json is missing required
keys beyond the newly added Safe Mode entries; synchronize ko.json with the
source keyset (e.g., en.json) by merging all missing keys into ko.json and
providing Korean strings or placeholders for them. Locate the translation keys
(such as safeMode, safeModeDescription, safeModeAddAppDisabled,
tryInferAppIdFromCode) in the diff as anchors, run or re-run the project’s i18n
extraction/sync script (or copy missing keys from the canonical locale) to
ensure the full keyset is present, then validate the file with the localization
lint/CI check so the missing-key errors are resolved.
In `@assets/translations/pt-BR.json`:
- Around line 247-250: The pt-BR translation file is missing keys compared to
the base locale; update assets/translations/pt-BR.json by synchronizing all keys
from the base locale (e.g., add any keys missing beyond "safeMode",
"safeModeDescription", "safeModeAddAppDisabled", "tryInferAppIdFromCode") and
provide Portuguese translations for each new key so the file matches the base
locale structure exactly; ensure no leftover keys are removed and run the
translation validation script to confirm the file is in sync.
In `@assets/translations/sv.json`:
- Around line 247-249: The Swedish locale is missing translation keys compared
to the source set; update the sv.json to full key parity by adding any missing
entries (not just "safeMode", "safeModeDescription", and
"safeModeAddAppDisabled") that exist in the source translations, using the same
key names and providing Swedish translations (pull the full key list from the
source locale, e.g., en.json) and then re-run the i18n/CI check to confirm no
keys are missing.
In `@assets/translations/uk.json`:
- Around line 247-249: uk.json is missing keys compared to the base locale so
the translation check fails; synchronize this file with the base locale (e.g.,
en.json) by adding any missing keys and removing/adjusting any extras while
preserving the existing translations for "safeMode", "safeModeDescription", and
"safeModeAddAppDisabled". To fix: run the project's i18n sync script or diff
uk.json against the base locale and copy over all missing keys (providing
Ukrainian strings or placeholders), ensure the keyset and ordering match the
base, and re-run the translation/CI check to confirm the file is fully in sync.
---
Major comments:
In `@assets/translations/en-EO.json`:
- Around line 247-249: The en-EO locale is missing keys compared to en.json
causing CI failures; update assets/translations/en-EO.json to include all keys
present in en.json (not just "safeMode", "safeModeDescription",
"safeModeAddAppDisabled"), adding any missing top-level and nested keys with
proper Esperanto translations or temporary English fallbacks, then run the
locale key parity check to confirm all keys match; focus your updates around the
safeMode-related keys and ensure the full key set is synchronized.
In `@assets/translations/et.json`:
- Around line 247-250: The Estonian translations file
assets/translations/et.json is missing keys required by the source locale;
ensure key parity by adding all missing translation keys found in the source
(e.g., check against keys like "safeMode", "safeModeDescription",
"safeModeAddAppDisabled", "tryInferAppIdFromCode" and any others present in the
source locale but absent here), update et.json with those keys and appropriate
Estonian values, then re-run the translation/CI check (or the i18n parity
script) to confirm no keys are missing.
In `@assets/translations/fa.json`:
- Around line 247-249: The Persian translation file is still failing
completeness — add any missing translation keys present in the canonical source
(e.g., ensure all keys analogous to the English file are present) and fix JSON
syntax (remove the trailing comma after "safeModeAddAppDisabled") so the file
parses; specifically confirm the keys "safeMode", "safeModeDescription", and
"safeModeAddAppDisabled" are present and translated, add any other missing keys
reported by CI, and validate the file with a JSON linter before pushing.
In `@assets/translations/gl.json`:
- Around line 247-249: Add the 18 missing translation keys to gl.json so it
matches en.json: apkcombo, apkmirror, apkpure, appLogsHint, appSourceHint,
aptoide, codeberg, gitlab, html, huaweiappgallery, izzyondroid, jenkins,
neutroncode, rustore, sourcehut, telegramapp, uptodown, wikiHint; insert each
key into the JSON object in the same style as the existing Safe Mode entries
(use proper Galician translations where available, otherwise add the English
string or a short placeholder), ensuring valid JSON syntax and no duplicate keys
so CI will pass.
In `@assets/translations/hu.json.bak`:
- Around line 1-429: The Hungarian translation is missing 17 keys (aptoide,
neutroncode, rustore, sourcehut, apkpure, apkcombo, appSourceHint, gitlab,
huaweiappgallery, apkmirror, izzyondroid, jenkins, appLogsHint, uptodown,
codeberg, html, wikiHint, telegramapp); add these keys to the Hungarian JSON
(assets/translations/hu.json) with appropriate Hungarian strings (or temporary
English fallbacks) matching the same key names so runtime lookups succeed,
ensuring the keys exactly match the missing identifiers listed and that the file
remains valid JSON.
In `@assets/translations/id.json`:
- Around line 247-250: The Indonesian translation file is missing keys required
for key-parity CI checks; compare the master English keys (e.g., "safeMode",
"safeModeDescription", "safeModeAddAppDisabled", "tryInferAppIdFromCode")
against assets/translations/id.json and add any missing keys with appropriate
Indonesian translations (or placeholder values) so all keys present in the
source locale are present here; ensure the JSON remains valid (no trailing
commas) and run the parity script/CI locally to confirm the file passes before
pushing.
In `@assets/translations/ja.json`:
- Around line 247-250: The ja.json is missing 18 translation keys required by
CI; open assets/translations/ja.json and add the missing keys (apkcombo,
apkmirror, apkpure, appLogsHint, appSourceHint, aptoide, codeberg, gitlab, html,
huaweiappgallery, izzyondroid, jenkins, neutroncode, rustore, sourcehut,
telegramapp, uptodown, wikiHint) alongside the existing keys such as "safeMode",
"safeModeDescription", "safeModeAddAppDisabled", and "tryInferAppIdFromCode";
provide appropriate Japanese strings for each key so the file has parity with
the other locales and CI will stop reporting missing keys.
In `@assets/translations/ko.json.bak`:
- Around line 1-429: This commit accidentally includes a backup artifact
(ko.json.bak); remove that file from the commit/branch and from future commits,
and add a .bak pattern to .gitignore so editor backups aren't tracked;
specifically, delete/unstage the file named ko.json.bak (or remove it from the
index if already committed), ensure the real ko.json remains, update .gitignore
to include *.bak (or .bak) and create a follow-up commit that removes the backup
and updates .gitignore.
In `@assets/translations/ml.json`:
- Around line 253-256: The translation key minStarCount was accidentally removed
between safeModeAddAppDisabled and addInfoBelow, breaking parity; restore the
missing "minStarCount" entry with the correct Malayalam translation (matching
the original key name minStarCount) inserted after safeModeAddAppDisabled and
before addInfoBelow so the JSON keys order/parity and the GitHub source settings
label are preserved—look for the surrounding keys safeMode, safeModeDescription,
safeModeAddAppDisabled, and addInfoBelow to locate where to re-add minStarCount.
In `@assets/translations/nl.json.bak`:
- Around line 1-429: The CI failure is due to translations being updated only in
assets/translations/nl.json.bak while the app/tests validate
assets/translations/nl.json; sync the real translation file. Copy or apply the
changes from nl.json.bak into assets/translations/nl.json (ensure keys like
"invalidURLForSource", "noReleaseFound", "googleVerificationWarningP1", etc.,
match exactly) or make nl.json the authoritative source and update the backup
accordingly, then run the translation validation to confirm parity.
In `@assets/translations/pt.json`:
- Around line 247-250: pt.json is out of sync with the source locale (en.json);
update the Portuguese translations to include all missing keys present in
en.json and remove any stale differences—compare en.json against the current
keys (e.g., "safeMode", "safeModeDescription", "safeModeAddAppDisabled",
"tryInferAppIdFromCode"), add the absent keys with Portuguese values or
placeholders, keep key ordering consistent with en.json, ensure valid JSON (no
trailing commas) and run the translation/CI validation script so the Translation
Management job passes before merging.
In `@assets/translations/ru.json`:
- Around line 247-250: The ru.json file is missing other translation keys from
the source locale; update/sync ru.json with the full set of keys from the source
locale (not just add safeMode, safeModeDescription, safeModeAddAppDisabled,
tryInferAppIdFromCode) so the locale passes CI. Locate the canonical source
locale file (e.g., en.json) and merge any missing keys into ru.json, provide
Russian translations (or placeholders) for all new keys, and then run the
project's translation/validation script or CI checks locally to confirm no keys
are missing before pushing the change.
In `@assets/translations/tr.json`:
- Around line 247-249: The Turkish locale file is missing keys compared to
en.json causing CI failures; open assets/translations/tr.json and ensure it
contains the same keys as en.json for the Safe Mode section (e.g., "safeMode",
"safeModeDescription", "safeModeAddAppDisabled" and any other new Safe
Mode-related keys present in en.json), add the missing keys with appropriate
Turkish translations, and re-run the i18n/CI check to verify synchronization.
In `@assets/translations/vi.json`:
- Around line 247-250: The Vietnamese translations file (vi.json) is incomplete
and failing translation management; ensure the full locale is synchronized by
adding all missing keys and correct translations instead of the backup entries
shown — update the entries around "safeMode", "safeModeDescription",
"safeModeAddAppDisabled", and "tryInferAppIdFromCode" and any other untranslated
or placeholder keys to match the canonical translation source (e.g., from
en.json or the translation master), run the translation validation/tooling to
confirm no missing keys or format errors, and commit the fully synced vi.json so
the translation check passes.
In `@assets/translations/vi.json.bak`:
- Around line 1-429: Remove the backup locale file (e.g. vi.json.bak) from the
translations asset bundle and place it outside the translations assets directory
(or into a dedicated backups folder) so the localization loader only sees
supported .json files; update project assets configuration (and .gitignore or
packaging rules if needed) to stop including *.bak files in builds and remove
vi.json.bak from version control so CI and runtime only load the canonical
vi.json.
In `@assets/translations/zh-Hant-TW.json.bak`:
- Around line 1-429: The repo contains committed translation backup files like
assets/translations/zh-Hant-TW.json.bak that are stale—remove all *.bak
translation backups (all 17) from version control while leaving the main .json
translation files intact, and add the *.bak pattern to .gitignore so future
backups are not tracked; ensure you remove the files from the index (not just
locally) and commit the .gitignore change.
---
Minor comments:
In `@assets/translations/pl.json.bak`:
- Around line 1-459: Remove the unused backup translation file pl.json.bak from
the repository and assets so it is not bundled at runtime; confirm that the
active pl.json already contains the new keys (safeMode, safeModeDescription,
safeModeAddAppDisabled) and that easy_localization only loads the canonical
pl.json, then commit the deletion (use Git history if you need the backup
instead of keeping a .bak file in assets).
In `@lib/pages/home.dart`:
- Around line 379-381: Localize the Semantics strings in the
bottomNavigationBar: wrap the Semantics `label` and the conditional `hint` in
tr() calls instead of hard-coded English, using the existing translation keys
'importExport' and 'addApp' for the conditional branch tied to
`settingsProvider.safeMode`, and add a new translation key (e.g.
'mainNavigation') to your i18n files to replace "Main navigation" so screen
readers get localized text; update the `Semantics` invocation in home.dart
accordingly.
---
Duplicate comments:
In `@lib/pages/home.dart`:
- Around line 49-65: getPages currently constructs new GlobalKey instances and
page widgets on each call causing stale currentState lookups; make two
persistent fields (e.g. _appsPageKey and _addAppPageKey of types
GlobalKey<AppsPageState> and GlobalKey<AddAppPageState>) and use them when
building the NavigationPageItem widgets inside getPages so the same keys are
reused across rebuilds, and update any deep-link/onWillPop call sites that
extract currentState from pages[i].widget.key to instead reference
_appsPageKey.currentState and _addAppPageKey.currentState directly.
---
Nitpick comments:
In `@assets/translations/gl.json`:
- Around line 248-249: The new translation keys safeModeDescription and
safeModeAddAppDisabled use the term “aplicación” which is inconsistent with
existing keys like addApp that use “app”; update the Galician strings to use the
same term (“app”) or match whichever canonical term the UI uses, e.g., replace
“aplicación” with “app” in safeModeDescription and safeModeAddAppDisabled so
terminology is consistent across keys.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: ba7e9ef9-5738-4426-bf9c-cac9ff2dfd88
📒 Files selected for processing (48)
assets/translations/ar.jsonassets/translations/bs.jsonassets/translations/ca.jsonassets/translations/cs.jsonassets/translations/da.jsonassets/translations/de.jsonassets/translations/en-EO.jsonassets/translations/es.jsonassets/translations/et.jsonassets/translations/fa.jsonassets/translations/fr.jsonassets/translations/gl.jsonassets/translations/he.jsonassets/translations/hu.jsonassets/translations/hu.json.bakassets/translations/id.jsonassets/translations/id.json.bakassets/translations/it.jsonassets/translations/it.json.bakassets/translations/ja.jsonassets/translations/ja.json.bakassets/translations/ko.jsonassets/translations/ko.json.bakassets/translations/ml.jsonassets/translations/ml.json.bakassets/translations/nl.jsonassets/translations/nl.json.bakassets/translations/pl.jsonassets/translations/pl.json.bakassets/translations/pt-BR.jsonassets/translations/pt-BR.json.bakassets/translations/pt.jsonassets/translations/pt.json.bakassets/translations/ru.jsonassets/translations/ru.json.bakassets/translations/sv.jsonassets/translations/sv.json.bakassets/translations/tr.jsonassets/translations/tr.json.bakassets/translations/uk.jsonassets/translations/uk.json.bakassets/translations/vi.jsonassets/translations/vi.json.bakassets/translations/zh-Hant-TW.jsonassets/translations/zh-Hant-TW.json.bakassets/translations/zh.jsonassets/translations/zh.json.baklib/pages/home.dart
✅ Files skipped from review due to trivial changes (12)
- assets/translations/it.json.bak
- assets/translations/zh.json.bak
- assets/translations/ja.json.bak
- assets/translations/tr.json.bak
- assets/translations/hu.json
- assets/translations/id.json.bak
- assets/translations/uk.json.bak
- assets/translations/sv.json.bak
- assets/translations/pt.json.bak
- assets/translations/ru.json.bak
- assets/translations/pt-BR.json.bak
- assets/translations/ml.json.bak
| "safeMode": "Sigurnosni režim", | ||
| "safeModeDescription": "Sakrij stranicu za dodavanje aplikacija i prikaži uvoz/izvoz umjesto toga", | ||
| "safeModeAddAppDisabled": "Dodavanje aplikacija je onemogućeno u sigurnosnom režimu", |
There was a problem hiding this comment.
Unblock CI by fully syncing bs.json keys with the base locale.
The added Safe Mode strings look fine, but the pipeline is still failing due to missing keys in this file (469 missing keys and explicit Missing keys in bs.json). Please complete key parity with the source locale (including placeholders/plurals) before merge.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@assets/translations/bs.json` around lines 247 - 249, The bs.json file is
missing many keys compared to the base locale; add all missing keys so the file
has full parity (including placeholder patterns and plural forms) with the
source locale; update or copy the corresponding entries from the base locale
into bs.json for every missing key (e.g., ensure keys such as "safeMode",
"safeModeDescription", "safeModeAddAppDisabled" remain and add the other ~469
missing keys), preserve placeholder tokens and ICU/plural syntax exactly, and
validate the JSON after syncing to unblock CI.
| "safeMode": "Bezpečný režim", | ||
| "safeModeDescription": "Skrýt stránku přidání aplikace a místo toho zobrazit Import/Export", | ||
| "safeModeAddAppDisabled": "Přidání aplikace je v bezpečném režimu zakázáno", |
There was a problem hiding this comment.
Translation check is still failing for this locale.
cs.json is still reported with missing keys by CI. Please complete key parity with the base translation file so the translation pipeline passes.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@assets/translations/cs.json` around lines 247 - 249, cs.json is missing
translation keys required for parity with the base locale; update the file to
include all keys present in the base translation (ensure you add any missing
keys beyond the existing "safeMode", "safeModeDescription", and
"safeModeAddAppDisabled"), using the same key names as in the base file so CI's
key parity check passes; after adding the keys, run the translation parity/CI
check locally (or re-run the pipeline) to confirm no keys are missing.
| "safeMode": "Sikker tilstand", | ||
| "safeModeDescription": "Skjul Tilføj app-side og vis Import/Eksport i stedet", | ||
| "safeModeAddAppDisabled": "Tilføj app er deaktiveret i sikker tilstand", |
There was a problem hiding this comment.
da.json still fails key completeness checks.
The Translation Management job reports missing keys for this locale. Please sync all required keys to fix the CI failure.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@assets/translations/da.json` around lines 247 - 249, da.json is missing
required translation keys causing the completeness check to fail; open the
source locale (e.g., en.json) and sync all missing keys into
assets/translations/da.json, ensuring you include every top-level and nested key
(including "safeMode", "safeModeDescription", "safeModeAddAppDisabled" and any
keys present in en.json but absent here), preserve the exact key names and JSON
structure, provide Danish translations for each missing entry, and validate the
JSON before committing.
| "safeMode": "Modalità sicura", | ||
| "safeModeDescription": "Nascondi pagina Aggiungi app e mostra Importa/Esporta invece", | ||
| "safeModeAddAppDisabled": "Aggiungi app è disabilitato in modalità sicura", |
There was a problem hiding this comment.
CI blocker: it.json still has missing translation keys.
The Translation Management job explicitly flags missing keys in this locale. Adding the three Safe Mode strings is not sufficient yet; please sync the full keyset with the source locale.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@assets/translations/it.json` around lines 247 - 249, The it.json locale is
missing translation keys beyond the three Safe Mode entries ("safeMode",
"safeModeDescription", "safeModeAddAppDisabled"); update it by syncing the full
keyset from the source locale (e.g., compare with the canonical en.json) and add
all missing keys with Italian translations or placeholders, ensuring you cover
nested keys and metadata; after updating, run the translation validation
script/CI check used in the repo to confirm no keys are missing and commit the
synchronized it.json.
| "safeMode": "안전 모드", | ||
| "safeModeDescription": "앱 추가 페이지를 숨기고 대신 가져오기/내보내기 표시", | ||
| "safeModeAddAppDisabled": "앱 추가는 안전 모드에서 비활성화됩니다", | ||
| "tryInferAppIdFromCode": "소스 코드에서 앱 ID를 추론해보세요", |
There was a problem hiding this comment.
CI blocker: ko.json is still missing required keys.
The translation workflow still reports missing keys for this file. Please synchronize this locale with the source keyset (not only the newly added Safe Mode entries).
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@assets/translations/ko.json` around lines 247 - 250, The Korean translation
file ko.json is missing required keys beyond the newly added Safe Mode entries;
synchronize ko.json with the source keyset (e.g., en.json) by merging all
missing keys into ko.json and providing Korean strings or placeholders for them.
Locate the translation keys (such as safeMode, safeModeDescription,
safeModeAddAppDisabled, tryInferAppIdFromCode) in the diff as anchors, run or
re-run the project’s i18n extraction/sync script (or copy missing keys from the
canonical locale) to ensure the full keyset is present, then validate the file
with the localization lint/CI check so the missing-key errors are resolved.
| "safeMode": "Modo seguro", | ||
| "safeModeDescription": "Ocultar página Adicionar app e mostrar Importar/Exportar em vez disso", | ||
| "safeModeAddAppDisabled": "Adicionar app está desabilitado no modo seguro", | ||
| "tryInferAppIdFromCode": "Tentar inferir o ID do aplicativo a partir do código-fonte", |
There was a problem hiding this comment.
CI blocker: pt-BR.json is still out of sync with required keys.
The translation workflow explicitly flags missing keys in this file. Please complete full key synchronization with the base locale to unblock the PR.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@assets/translations/pt-BR.json` around lines 247 - 250, The pt-BR translation
file is missing keys compared to the base locale; update
assets/translations/pt-BR.json by synchronizing all keys from the base locale
(e.g., add any keys missing beyond "safeMode", "safeModeDescription",
"safeModeAddAppDisabled", "tryInferAppIdFromCode") and provide Portuguese
translations for each new key so the file matches the base locale structure
exactly; ensure no leftover keys are removed and run the translation validation
script to confirm the file is in sync.
| "safeMode": "Säkert läge", | ||
| "safeModeDescription": "Dölj Lägg till app-sida och visa Importera/Exportera istället", | ||
| "safeModeAddAppDisabled": "Lägg till app är inaktiverat i säkert läge", |
There was a problem hiding this comment.
Translation pipeline blocker remains for sv.json.
CI still reports missing keys in this file. Please bring this locale to full key parity with the source translation set.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@assets/translations/sv.json` around lines 247 - 249, The Swedish locale is
missing translation keys compared to the source set; update the sv.json to full
key parity by adding any missing entries (not just "safeMode",
"safeModeDescription", and "safeModeAddAppDisabled") that exist in the source
translations, using the same key names and providing Swedish translations (pull
the full key list from the source locale, e.g., en.json) and then re-run the
i18n/CI check to confirm no keys are missing.
| "safeMode": "Безпечний режим", | ||
| "safeModeDescription": "Приховати сторінку Додати додаток і показати Імпорт/Експорт натомість", | ||
| "safeModeAddAppDisabled": "Додавання додатка вимкнено в безпечному режимі", |
There was a problem hiding this comment.
CI blocker: locale keyset is still incomplete.
The translation pipeline reports missing keys in uk.json, so this file is still out of sync with the base locale despite adding the Safe Mode entries. Please fully sync keys to unblock the Translation Management check.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@assets/translations/uk.json` around lines 247 - 249, uk.json is missing keys
compared to the base locale so the translation check fails; synchronize this
file with the base locale (e.g., en.json) by adding any missing keys and
removing/adjusting any extras while preserving the existing translations for
"safeMode", "safeModeDescription", and "safeModeAddAppDisabled". To fix: run the
project's i18n sync script or diff uk.json against the base locale and copy over
all missing keys (providing Ukrainian strings or placeholders), ensure the
keyset and ordering match the base, and re-run the translation/CI check to
confirm the file is fully in sync.
Summary by CodeRabbit
New Features
Localization