Skip to content

Feature/migrate to flutter localization#170

Closed
omeritzics wants to merge 40 commits intomainfrom
feature/migrate-to-flutter-localization
Closed

Feature/migrate to flutter localization#170
omeritzics wants to merge 40 commits intomainfrom
feature/migrate-to-flutter-localization

Conversation

@omeritzics
Copy link
Owner

@omeritzics omeritzics commented Feb 27, 2026

PR Type

Enhancement


Description

  • Comprehensive migration from easy_localization package to Flutter's native localization system

  • Replaced all tr() and plural() function calls with AppLocalizations.of(context)! method invocations across the entire codebase

  • Updated main.dart to use Flutter's native AppLocalizations.delegate and removed EasyLocalization wrapper

  • Generated complete localization files for multiple languages (English, Chinese, Portuguese, and 20+ additional languages)

  • Updated all app pages (apps.dart, settings.dart, add_app.dart, app.dart, import_export.dart, home.dart) to use native Flutter localization

  • Migrated all app sources (GitHub, GitLab, Telegram, APKMirror, Tencent, and others) to the new localization system

  • Updated providers (apps_provider.dart, settings_provider.dart, notifications_provider.dart) to use native localization

  • Added accessibility improvements with Semantics widgets in the apps page

  • Added error handling with mounted checks in download callbacks


Diagram Walkthrough

flowchart LR
  A["easy_localization<br/>package"] -->|"Remove imports<br/>and tr() calls"| B["Flutter native<br/>AppLocalizations"]
  C["All UI pages<br/>and components"] -->|"Update to use<br/>AppLocalizations.of"| B
  D["App sources<br/>and providers"] -->|"Migrate localization<br/>calls"| B
  B -->|"Generate"| E["Localization files<br/>25+ languages"]
  F["main.dart"] -->|"Configure<br/>AppLocalizations.delegate"| B
Loading

File Walkthrough

Relevant files
Localization
1 files
app_localizations_zh.dart
Add complete Chinese localization translations                     

lib/generated/app_localizations_zh.dart

  • Generated Chinese localization file with 2659 lines of translations
    for the Updatium app
  • Includes AppLocalizationsZh class extending AppLocalizations with
    Chinese (Simplified) translations
  • Includes AppLocalizationsZhHantTw class extending AppLocalizationsZh
    with Traditional Chinese (Taiwan) translations
  • Covers all UI strings including app management, settings,
    notifications, and error messages
[link]   
Enhancement
15 files
apps.dart
Migrate localization to Flutter native system                       

lib/pages/apps.dart

  • Replaced easy_localization package imports with Flutter's native
    AppLocalizations system
  • Updated all tr() function calls to use AppLocalizations.of(context)!
    method calls
  • Added Semantics widgets to improve accessibility for install/update
    buttons with labels and hints
  • Added error handling with mounted checks in download callbacks to
    prevent state updates on unmounted widgets
  • Added grid/list view toggle button in the toolbar and fixed regex
    escape sequences
+191/-117
import_export.dart
Migrate import/export page to Flutter localization             

lib/pages/import_export.dart

  • Replaced easy_localization imports with Flutter's native
    AppLocalizations
  • Updated all tr() and plural() function calls to use
    AppLocalizations.of(context)! method calls
  • Improved code consistency by using the new localization API throughout
    the import/export page
  • Fixed several localization calls that were using incorrect syntax
+42/-47 
telegramapp.dart
Update Telegram app source localization                                   

lib/app_sources/telegramapp.dart

  • Removed easy_localization package import
  • Replaced tr('app') call with AppLocalizations.of(context)!.app for
    native Flutter localization
  • Updated the Telegram app source name to use the new localization
    system
+2/-2     
app_localizations_pt.dart
Generated Portuguese localization implementation for Flutter

lib/generated/app_localizations_pt.dart

  • Generated Portuguese localization file with 2659 lines of translation
    strings
  • Includes base Portuguese (pt) class AppLocalizationsPt extending
    AppLocalizations
  • Includes Brazilian Portuguese (pt_BR) class AppLocalizationsPtBr
    extending AppLocalizationsPt
  • Implements all localization methods for UI strings, error messages,
    and plural forms
[link]   
settings.dart
Migrate settings page to Flutter native localization         

lib/pages/settings.dart

  • Removed easy_localization package import and replaced with Flutter's
    native AppLocalizations
  • Updated all tr() function calls to use AppLocalizations.of(context)!
    pattern
  • Fixed localization calls for parameterized strings using direct method
    invocation
  • Updated approximately 100+ localization references throughout the
    settings page
+75/-79 
apps_provider.dart
Migrate apps provider to Flutter native localization         

lib/providers/apps_provider.dart

  • Removed easy_localization import and added AppLocalizations import
  • Updated error messages and user-facing strings to use
    AppLocalizations.of(context)! pattern
  • Modified export functionality to use
    AppLocalizations.of(globalNavigatorKey.currentContext!)!
  • Updated background update check function to initialize localization
    using AppLocalizations.delegate.load()
  • Replaced tr() and plural() calls with native localization methods
+59/-44 
gitlab.dart
Migrate GitLab source to Flutter native localization         

lib/app_sources/gitlab.dart

  • Removed easy_localization import and added AppLocalizations import
  • Updated form field labels and descriptions to use
    AppLocalizations.of(context)! pattern
  • Replaced tr() function calls with native localization method
    invocations
+5/-5     
tencent.dart
Migrate Tencent source to Flutter native localization       

lib/app_sources/tencent.dart

  • Removed easy_localization import and added AppLocalizations import
  • Updated source name initialization to use
    AppLocalizations.of(context)! pattern
+2/-2     
app_localizations_en.dart
Generated English and Esperanto localization strings         

lib/generated/app_localizations_en.dart

  • Generated localization file for English language containing 2658 lines
    of translation strings
  • Includes AppLocalizationsEn class extending AppLocalizations with
    English translations
  • Includes AppLocalizationsEnEo class extending AppLocalizationsEn with
    Esperanto translations
  • Covers all UI strings including errors, buttons, settings,
    notifications, and pluralization rules
+2658/-0
add_app.dart
Migrate add app page to Flutter localization                         

lib/pages/add_app.dart

  • Replaced easy_localization import with AppLocalizations from generated
    localizations
  • Updated all tr() function calls to use AppLocalizations.of(context)!
    method calls
  • Changed plural form calls from plural() to
    AppLocalizations.of(context)!.source(2) pattern
  • Updated string interpolation to use direct method calls instead of
    translation keys
+39/-41 
app.dart
Migrate app detail page to Flutter localization                   

lib/pages/app.dart

  • Removed easy_localization import and replaced with AppLocalizations
  • Converted all tr() calls to AppLocalizations.of(context)! method
    invocations
  • Updated plural form handling from plural() to
    AppLocalizations.of(context)!.apk() pattern
  • Refactored string concatenation to use direct localization method
    calls
+42/-44 
main.dart
Migrate main app to Flutter native localization                   

lib/main.dart

  • Removed easy_localization package imports and related controller
    initialization code
  • Added flutter_localizations and AppLocalizations imports
  • Removed loadTranslations() function and EasyLocalization wrapper
  • Updated MaterialApp to use AppLocalizations.delegate and hardcoded
    supportedLocales list
  • Changed locale management to use settingsProvider.forcedLocale
    directly
[link]   
github.dart
Migrate GitHub source to Flutter localization                       

lib/app_sources/github.dart

  • Removed easy_localization import and added AppLocalizations import
  • Converted all tr() function calls to AppLocalizations.of(context)!
    method calls
  • Updated form item labels and validation messages to use new
    localization pattern
  • Maintained all translation keys but changed access method
+22/-22 
generated_form.dart
Migrate generated form component to Flutter localization 

lib/components/generated_form.dart

  • Removed easy_localization import and added AppLocalizations import
  • Replaced all tr() calls with AppLocalizations.of(context)! method
    invocations
  • Updated form validation messages and UI labels to use new localization
    approach
  • Changed tooltip and label strings to use direct method calls
+7/-7     
apkmirror.dart
Migrate APKMirror source to Flutter localization                 

lib/app_sources/apkmirror.dart

  • Removed easy_localization import and added AppLocalizations import
  • Converted form item labels from tr() to AppLocalizations.of(context)!
    method calls
  • Updated validation error messages to use new localization pattern
+3/-3     
Additional files
93 files
ar.json +5/-5     
conflict_debug.txt +5/-0     
convert_l10n.py +148/-0 
find_flutter.txt +1/-0     
flutter_path.txt +1/-0     
gen_output.txt +165/-0 
home_list.txt +1/-0     
l10n.yaml +6/-0     
apkcombo.dart +0/-1     
apkpure.dart +4/-4     
aptoide.dart +2/-2     
directAPKLink.dart +4/-4     
fdroid.dart +6/-6     
fdroidrepo.dart +7/-7     
html.dart +20/-20 
huaweiappgallery.dart +0/-1     
rustore.dart +2/-2     
sourcehut.dart +2/-2     
uptodown.dart +2/-2     
vivoappstore.dart +2/-2     
generated_form_modal.dart +3/-3     
custom_errors.dart +56/-22 
app_localizations.dart +2479/-0
app_localizations_ar.dart +1339/-0
app_localizations_bs.dart +1339/-0
app_localizations_ca.dart +1339/-0
app_localizations_cs.dart +1339/-0
app_localizations_da.dart +1339/-0
app_localizations_de.dart +1339/-0
app_localizations_es.dart +1339/-0
app_localizations_et.dart +1339/-0
app_localizations_fa.dart +1339/-0
app_localizations_fr.dart +1339/-0
app_localizations_gl.dart +1339/-0
app_localizations_he.dart +1339/-0
app_localizations_hu.dart +1339/-0
app_localizations_id.dart [link]   
app_localizations_it.dart [link]   
app_localizations_ja.dart [link]   
app_localizations_ko.dart [link]   
app_localizations_ml.dart [link]   
app_localizations_nl.dart [link]   
app_localizations_pl.dart [link]   
app_localizations_ru.dart [link]   
app_localizations_sv.dart [link]   
app_localizations_tr.dart [link]   
app_localizations_uk.dart [link]   
app_localizations_vi.dart [link]   
app_ar.arb [link]   
app_bs.arb [link]   
app_ca.arb [link]   
app_cs.arb +778/-0 
app_da.arb +778/-0 
app_de.arb +779/-0 
app_en.arb +783/-0 
app_en_EO.arb +778/-0 
app_es.arb +779/-0 
app_et.arb +779/-0 
app_fa.arb +778/-0 
app_fr.arb +779/-0 
app_gl.arb +778/-0 
app_he.arb +770/-0 
app_hu.arb +779/-0 
app_id.arb +779/-0 
app_it.arb +778/-0 
app_ja.arb +779/-0 
app_ko.arb +779/-0 
app_ml.arb +779/-0 
app_nl.arb +778/-0 
app_pl.arb +778/-0 
app_pt.arb +779/-0 
app_pt_BR.arb +778/-0 
app_ru.arb +778/-0 
app_sv.arb +778/-0 
app_tr.arb +778/-0 
app_uk.arb +778/-0 
app_vi.arb [link]   
app_zh.arb [link]   
app_zh_Hant_TW.arb [link]   
githubstars.dart [link]   
home.dart +17/-19 
security_disclaimer.dart +10/-10 
logs_provider.dart +0/-1     
notifications_provider.dart +38/-57 
settings_provider.dart +79/-18 
source_provider.dart +28/-30 
line_debug.txt +2/-0     
marker_debug.txt +3/-0     
msg_list.txt +1/-0     
od_output.txt +5/-0     
output.txt +1/-0     
pubspec.yaml +5/-1     
resolve_conflict_1.py +81/-0   

@qodo-free-for-open-source-projects

Review Summary by Qodo

Migrate to Flutter native localization system

✨ Enhancement

Grey Divider

Walkthroughs

Description
• Comprehensive migration from easy_localization package to Flutter's native localization system
• Replaced all tr() and plural() function calls with AppLocalizations.of(context)!
  method-based access across the entire codebase
• Updated main.dart to use Flutter's native localizationsDelegates and removed
  EasyLocalization widget wrapper
• Generated localization files for 30+ language variants including English, Chinese, Portuguese, and
  many others
• Updated all app pages (apps.dart, settings.dart, add_app.dart, app.dart,
  import_export.dart, etc.) to use new localization pattern
• Migrated all app sources (GitHub, GitLab, Telegram, Tencent, APKMirror, etc.) to native Flutter
  localization
• Updated components and providers to use AppLocalizations instead of easy_localization
• Improved accessibility by adding Semantics widgets to install/update buttons
• Added grid/list view toggle button in the toolbar
Diagram
flowchart LR
  A["easy_localization<br/>package"] -->|"Replace with"| B["Flutter native<br/>AppLocalizations"]
  C["tr() calls"] -->|"Convert to"| D["AppLocalizations.of<br/>context methods"]
  E["EasyLocalization<br/>widget"] -->|"Replace with"| F["localizationsDelegates<br/>& supportedLocales"]
  G["30+ language<br/>ARB files"] -->|"Generate"| H["Generated localization<br/>Dart files"]
  B --> I["Updated pages<br/>& components"]
  D --> I
  F --> I
  H --> I
Loading

Grey Divider

File Changes

1. lib/generated/app_localizations_zh.dart Localization +0/-0

Add comprehensive Chinese localization strings

• Generated Chinese localization file with 2659 lines of translated strings
• Includes translations for both Simplified Chinese (zh) and Traditional Chinese Taiwan
 (zh_Hant_TW)
• Contains string methods for UI elements, error messages, notifications, and settings
• Implements plural handling using intl.Intl.pluralLogic for dynamic string formatting

lib/generated/app_localizations_zh.dart


2. lib/pages/apps.dart ✨ Enhancement +191/-117

Migrate to Flutter native localization system

• Replaced easy_localization package with Flutter's native AppLocalizations
• Updated all tr() and plural() calls to use AppLocalizations.of(context)! method calls
• Added Semantics widgets to improve accessibility for install/update buttons
• Added grid/list view toggle button in the toolbar and fixed regex escape sequences

lib/pages/apps.dart


3. lib/pages/import_export.dart ✨ Enhancement +42/-47

Migrate import/export page to Flutter localization

• Removed easy_localization import and replaced with AppLocalizations
• Updated all localization calls from tr() to AppLocalizations.of(context)! method syntax
• Fixed string interpolation in several localization calls
• Maintained all existing functionality while using native Flutter localization

lib/pages/import_export.dart


View more (106)
4. lib/app_sources/telegramapp.dart 🐞 Bug fix +2/-2

Update Telegram source localization reference

• Removed easy_localization import dependency
• Updated name property to use AppLocalizations.of(context)!.app instead of tr('app')
• Note: Code has syntax issue - context is not available in class constructor

lib/app_sources/telegramapp.dart


5. lib/generated/app_localizations_pt.dart Localization +0/-0

Generated Portuguese localization implementation file

• Generated Portuguese localization file with 2659 lines of translation strings
• Implements AppLocalizationsPt class extending AppLocalizations base class
• Includes AppLocalizationsPtBr subclass for Brazilian Portuguese variant
• Covers all UI strings including errors, settings, notifications, and plural forms

lib/generated/app_localizations_pt.dart


6. lib/pages/settings.dart ✨ Enhancement +75/-79

Migrate settings page to Flutter localization

• Replaced easy_localization package imports with Flutter's native AppLocalizations
• Updated all tr() function calls to use AppLocalizations.of(context)! pattern
• Changed localization access from string-based to method-based (e.g., .neverManualOnly)
• Updated plural form handling from plural() to direct method calls like
 removeAppQuestion(count)

lib/pages/settings.dart


7. lib/providers/apps_provider.dart ✨ Enhancement +59/-44

Migrate apps provider to Flutter localization

• Removed easy_localization dependency and replaced with AppLocalizations
• Updated all localization calls from tr() to AppLocalizations.of(context)! pattern
• Modified background update check function to initialize localization without EasyLocalization
• Changed plural form calls from plural() to direct method invocations

lib/providers/apps_provider.dart


8. lib/app_sources/gitlab.dart ✨ Enhancement +5/-5

Migrate GitLab source to Flutter localization

• Removed easy_localization import and added AppLocalizations import
• Updated localization calls from tr() to AppLocalizations.of(context)! pattern
• Changed all string-based translation keys to method-based access

lib/app_sources/gitlab.dart


9. lib/app_sources/tencent.dart ✨ Enhancement +2/-2

Migrate Tencent source to Flutter localization

• Removed easy_localization import and added AppLocalizations import
• Updated localization call from tr() to AppLocalizations.of(context)! pattern

lib/app_sources/tencent.dart


10. lib/generated/app_localizations_en.dart ✨ Enhancement +2658/-0

Generated English and Esperanto localization strings file

• Generated localization file for English language containing 2658 lines of translation strings
• Includes AppLocalizationsEn class extending AppLocalizations with English translations
• Includes AppLocalizationsEnEo class extending AppLocalizationsEn with Esperanto translations
• Covers all UI strings including errors, buttons, settings, notifications, and pluralization logic

lib/generated/app_localizations_en.dart


11. lib/pages/add_app.dart ✨ Enhancement +39/-41

Migrate add app page to Flutter localization

• Replaced easy_localization package imports with Flutter's native AppLocalizations
• Updated all tr() function calls to use AppLocalizations.of(context)! pattern
• Converted parameterized translations to use method calls instead of args arrays
• Updated plural translations to use AppLocalizations.of(context)!.source(2) pattern

lib/pages/add_app.dart


12. lib/pages/app.dart ✨ Enhancement +42/-44

Migrate app detail page to Flutter localization

• Removed easy_localization import and replaced with AppLocalizations
• Converted all tr() calls to AppLocalizations.of(context)! method calls
• Updated plural function calls to use AppLocalizations.of(context)!.apk() pattern
• Simplified translation access throughout the app detail page

lib/pages/app.dart


13. lib/main.dart ✨ Enhancement +0/-0

Migrate main app to Flutter native localization system

• Removed easy_localization package initialization and related imports
• Replaced EasyLocalization widget wrapper with native Flutter localization setup
• Updated localizationsDelegates to use AppLocalizations.delegate and Flutter's global delegates
• Added explicit supportedLocales list with all 30+ supported language variants
• Removed loadTranslations() function and related locale loading logic
• Changed locale binding from context.locale to settingsProvider.forcedLocale

lib/main.dart


14. lib/app_sources/github.dart ✨ Enhancement +22/-22

Migrate GitHub source to Flutter localization

• Removed easy_localization import and added AppLocalizations import
• Converted all tr() function calls to AppLocalizations.of(context)! method calls
• Updated parameterized translations to use direct method invocation
• Maintained all GitHub source configuration and search settings translations

lib/app_sources/github.dart


15. lib/components/generated_form.dart ✨ Enhancement +7/-7

Migrate generated form component to Flutter localization

• Removed easy_localization import and added AppLocalizations import
• Updated form validation error messages to use AppLocalizations.of(context)!
• Converted dropdown error, label, and tooltip translations to new localization pattern
• Updated color picker and form item removal/addition button tooltips

lib/components/generated_form.dart


16. lib/app_sources/apkmirror.dart ✨ Enhancement +3/-3

Migrate APKMirror source to Flutter localization

• Removed easy_localization import and added AppLocalizations import
• Updated form field labels for fallback releases and regex filtering to use
 AppLocalizations.of(context)!
• Converted all tr() calls to new localization method pattern

lib/app_sources/apkmirror.dart


17. assets/translations/ar.json Additional files +5/-5

...

assets/translations/ar.json


18. conflict_debug.txt Additional files +5/-0

...

conflict_debug.txt


19. convert_l10n.py Additional files +148/-0

...

convert_l10n.py


20. find_flutter.txt Additional files +1/-0

...

find_flutter.txt


21. flutter_path.txt Additional files +1/-0

...

flutter_path.txt


22. gen_output.txt Additional files +165/-0

...

gen_output.txt


23. home_list.txt Additional files +1/-0

...

home_list.txt


24. l10n.yaml Additional files +6/-0

...

l10n.yaml


25. lib/app_sources/apkcombo.dart Additional files +0/-1

...

lib/app_sources/apkcombo.dart


26. lib/app_sources/apkpure.dart Additional files +4/-4

...

lib/app_sources/apkpure.dart


27. lib/app_sources/aptoide.dart Additional files +2/-2

...

lib/app_sources/aptoide.dart


28. lib/app_sources/directAPKLink.dart Additional files +4/-4

...

lib/app_sources/directAPKLink.dart


29. lib/app_sources/fdroid.dart Additional files +6/-6

...

lib/app_sources/fdroid.dart


30. lib/app_sources/fdroidrepo.dart Additional files +7/-7

...

lib/app_sources/fdroidrepo.dart


31. lib/app_sources/html.dart Additional files +20/-20

...

lib/app_sources/html.dart


32. lib/app_sources/huaweiappgallery.dart Additional files +0/-1

...

lib/app_sources/huaweiappgallery.dart


33. lib/app_sources/rustore.dart Additional files +2/-2

...

lib/app_sources/rustore.dart


34. lib/app_sources/sourcehut.dart Additional files +2/-2

...

lib/app_sources/sourcehut.dart


35. lib/app_sources/uptodown.dart Additional files +2/-2

...

lib/app_sources/uptodown.dart


36. lib/app_sources/vivoappstore.dart Additional files +2/-2

...

lib/app_sources/vivoappstore.dart


37. lib/components/generated_form_modal.dart Additional files +3/-3

...

lib/components/generated_form_modal.dart


38. lib/custom_errors.dart Additional files +56/-22

...

lib/custom_errors.dart


39. lib/generated/app_localizations.dart Additional files +2479/-0

...

lib/generated/app_localizations.dart


40. lib/generated/app_localizations_ar.dart Additional files +1339/-0

...

lib/generated/app_localizations_ar.dart


41. lib/generated/app_localizations_bs.dart Additional files +1339/-0

...

lib/generated/app_localizations_bs.dart


42. lib/generated/app_localizations_ca.dart Additional files +1339/-0

...

lib/generated/app_localizations_ca.dart


43. lib/generated/app_localizations_cs.dart Additional files +1339/-0

...

lib/generated/app_localizations_cs.dart


44. lib/generated/app_localizations_da.dart Additional files +1339/-0

...

lib/generated/app_localizations_da.dart


45. lib/generated/app_localizations_de.dart Additional files +1339/-0

...

lib/generated/app_localizations_de.dart


46. lib/generated/app_localizations_es.dart Additional files +1339/-0

...

lib/generated/app_localizations_es.dart


47. lib/generated/app_localizations_et.dart Additional files +1339/-0

...

lib/generated/app_localizations_et.dart


48. lib/generated/app_localizations_fa.dart Additional files +1339/-0

...

lib/generated/app_localizations_fa.dart


49. lib/generated/app_localizations_fr.dart Additional files +1339/-0

...

lib/generated/app_localizations_fr.dart


50. lib/generated/app_localizations_gl.dart Additional files +1339/-0

...

lib/generated/app_localizations_gl.dart


51. lib/generated/app_localizations_he.dart Additional files +1339/-0

...

lib/generated/app_localizations_he.dart


52. lib/generated/app_localizations_hu.dart Additional files +1339/-0

...

lib/generated/app_localizations_hu.dart


53. lib/generated/app_localizations_id.dart Additional files +0/-0

...

lib/generated/app_localizations_id.dart


54. lib/generated/app_localizations_it.dart Additional files +0/-0

...

lib/generated/app_localizations_it.dart


55. lib/generated/app_localizations_ja.dart Additional files +0/-0

...

lib/generated/app_localizations_ja.dart


56. lib/generated/app_localizations_ko.dart Additional files +0/-0

...

lib/generated/app_localizations_ko.dart


57. lib/generated/app_localizations_ml.dart Additional files +0/-0

...

lib/generated/app_localizations_ml.dart


58. lib/generated/app_localizations_nl.dart Additional files +0/-0

...

lib/generated/app_localizations_nl.dart


59. lib/generated/app_localizations_pl.dart Additional files +0/-0

...

lib/generated/app_localizations_pl.dart


60. lib/generated/app_localizations_ru.dart Additional files +0/-0

...

lib/generated/app_localizations_ru.dart


61. lib/generated/app_localizations_sv.dart Additional files +0/-0

...

lib/generated/app_localizations_sv.dart


62. lib/generated/app_localizations_tr.dart Additional files +0/-0

...

lib/generated/app_localizations_tr.dart


63. lib/generated/app_localizations_uk.dart Additional files +0/-0

...

lib/generated/app_localizations_uk.dart


64. lib/generated/app_localizations_vi.dart Additional files +0/-0

...

lib/generated/app_localizations_vi.dart


65. lib/l10n/app_ar.arb Additional files +0/-0

...

lib/l10n/app_ar.arb


66. lib/l10n/app_bs.arb Additional files +0/-0

...

lib/l10n/app_bs.arb


67. lib/l10n/app_ca.arb Additional files +0/-0

...

lib/l10n/app_ca.arb


68. lib/l10n/app_cs.arb Additional files +778/-0

...

lib/l10n/app_cs.arb


69. lib/l10n/app_da.arb Additional files +778/-0

...

lib/l10n/app_da.arb


70. lib/l10n/app_de.arb Additional files +779/-0

...

lib/l10n/app_de.arb


71. lib/l10n/app_en.arb Additional files +783/-0

...

lib/l10n/app_en.arb


72. lib/l10n/app_en_EO.arb Additional files +778/-0

...

lib/l10n/app_en_EO.arb


73. lib/l10n/app_es.arb Additional files +779/-0

...

lib/l10n/app_es.arb


74. lib/l10n/app_et.arb Additional files +779/-0

...

lib/l10n/app_et.arb


75. lib/l10n/app_fa.arb Additional files +778/-0

...

lib/l10n/app_fa.arb


76. lib/l10n/app_fr.arb Additional files +779/-0

...

lib/l10n/app_fr.arb


77. lib/l10n/app_gl.arb Additional files +778/-0

...

lib/l10n/app_gl.arb


78. lib/l10n/app_he.arb Additional files +770/-0

...

lib/l10n/app_he.arb


79. lib/l10n/app_hu.arb Additional files +779/-0

...

lib/l10n/app_hu.arb


80. lib/l10n/app_id.arb Additional files +779/-0

...

lib/l10n/app_id.arb


81. lib/l10n/app_it.arb Additional files +778/-0

...

lib/l10n/app_it.arb


82. lib/l10n/app_ja.arb Additional files +779/-0

...

lib/l10n/app_ja.arb


83. lib/l10n/app_ko.arb Additional files +779/-0

...

lib/l10n/app_ko.arb


84. lib/l10n/app_ml.arb Additional files +779/-0

...

lib/l10n/app_ml.arb


85. lib/l10n/app_nl.arb Additional files +778/-0

...

lib/l10n/app_nl.arb


86. lib/l10n/app_pl.arb Additional files +778/-0

...

lib/l10n/app_pl.arb


87. lib/l10n/app_pt.arb Additional files +779/-0

...

lib/l10n/app_pt.arb


88. lib/l10n/app_pt_BR.arb Additional files +778/-0

...

lib/l10n/app_pt_BR.arb


89. lib/l10n/app_ru.arb Additional files +778/-0

...

lib/l10n/app_ru.arb


90. lib/l10n/app_sv.arb Additional files +778/-0

...

lib/l10n/app_sv.arb


91. lib/l10n/app_tr.arb Additional files +778/-0

...

lib/l10n/app_tr.arb


92. lib/l10n/app_uk.arb Additional files +778/-0

...

lib/l10n/app_uk.arb


93. lib/l10n/app_vi.arb Additional files +0/-0

...

lib/l10n/app_vi.arb


94. lib/l10n/app_zh.arb Additional files +0/-0

...

lib/l10n/app_zh.arb


95. lib/l10n/app_zh_Hant_TW.arb Additional files +0/-0

...

lib/l10n/app_zh_Hant_TW.arb


96. lib/mass_app_sources/githubstars.dart Additional files +0/-0

...

lib/mass_app_sources/githubstars.dart


97. lib/pages/home.dart Additional files +17/-19

...

lib/pages/home.dart


98. lib/pages/security_disclaimer.dart Additional files +10/-10

...

lib/pages/security_disclaimer.dart


99. lib/providers/logs_provider.dart Additional files +0/-1

...

lib/providers/logs_provider.dart


100. lib/providers/notifications_provider.dart Additional files +38/-57

...

lib/providers/notifications_provider.dart


101. lib/providers/settings_provider.dart Additional files +79/-18

...

lib/providers/settings_provider.dart


102. lib/providers/source_provider.dart Additional files +28/-30

...

lib/providers/source_provider.dart


103. line_debug.txt Additional files +2/-0

...

line_debug.txt


104. marker_debug.txt Additional files +3/-0

...

marker_debug.txt


105. msg_list.txt Additional files +1/-0

...

msg_list.txt


106. od_output.txt Additional files +5/-0

...

od_output.txt


107. output.txt Additional files +1/-0

...

output.txt


108. pubspec.yaml Additional files +5/-1

...

pubspec.yaml


109. resolve_conflict_1.py Additional files +81/-0

...

resolve_conflict_1.py


Grey Divider

Qodo Logo

@qodo-free-for-open-source-projects
Copy link

qodo-free-for-open-source-projects bot commented Feb 27, 2026

Code Review by Qodo

🐞 Bugs (4) 📘 Rule violations (4) 📎 Requirement gaps (0)

Grey Divider


Action required

1. deleteFile() uses undefined context 📘 Rule violation ⛯ Reliability
Description
deleteFile() constructs an UpdatiumError using AppLocalizations.of(context) even though no
context exists in scope, and also calls a string literal like a function. This breaks error
handling at a file-deletion failure point and can crash/stop compilation instead of gracefully
reporting the failure.
Code

lib/providers/apps_provider.dart[R304-306]

throw UpdatiumError(
-      tr('fileDeletionError', args: [e.path ?? tr('unknown')]),
+      "fileDeletionError"(e.path ?? AppLocalizations.of(context)!\.unknown),
);
Evidence
The checklist requires handling failure points with meaningful, working error handling (PR
Compliance ID 3). The updated deleteFile() error construction references an undefined context
and uses an invalid call form, so the failure path itself is broken.

Rule 3: Generic: Robust Error Handling and Edge Case Management
lib/providers/apps_provider.dart[300-307]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`deleteFile()` currently throws an `UpdatiumError` using an undefined `context` and an invalid localization call (`&amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;fileDeletionError&amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;(...)`). This breaks the error-handling path and can prevent graceful degradation on file-deletion failures.
## Issue Context
This code runs when file deletion fails (`PathAccessException`). Per compliance requirements, failure points must be handled reliably and provide meaningful context.
## Fix Focus Areas
- lib/providers/apps_provider.dart[300-307]

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


2. Null-assert on currentContext! 📘 Rule violation ⛯ Reliability
Description
Multiple error constructors localize messages via globalNavigatorKey.currentContext!, which can be
null (e.g., early startup/background flows). This can cause a crash while building an error message,
preventing graceful handling of the original failure.
Code

lib/custom_errors.dart[R24-30]

class RateLimitError extends UpdatiumError {
late int remainingMinutes;
RateLimitError(this.remainingMinutes)
-    : super(plural('tooManyRequestsTryAgainInMinutes', remainingMinutes));
+      : super(
+          AppLocalizations.of(globalNavigatorKey.currentContext!)!
+              .tooManyRequestsTryAgainInMinutes(remainingMinutes),
+        );
Evidence
The checklist requires explicit handling of null/edge cases and avoiding unhandled failure points
(PR Compliance ID 3). The new AppLocalizations.of(globalNavigatorKey.currentContext!)! pattern
introduces a null-assertion crash risk in error creation.

Rule 3: Generic: Robust Error Handling and Edge Case Management
lib/custom_errors.dart[24-30]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Error constructors are using `globalNavigatorKey.currentContext!` for localization. If `currentContext` is null, constructing the error will crash, defeating robust error handling.
## Issue Context
Errors may be created outside of an active widget tree (startup/background). Localization should be performed with a guaranteed-safe context or provided `AppLocalizations` instance.
## Fix Focus Areas
- lib/custom_errors.dart[24-113]

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


3. resetLocaleSafe() left unimplemented 📘 Rule violation ⛯ Reliability
Description
resetLocaleSafe() was changed to a TODO with only a debugPrint, so the locale-reset edge case is
no longer handled. This can leave the app in an inconsistent locale state instead of gracefully
recovering.
Code

lib/providers/settings_provider.dart[R385-388]

void resetLocaleSafe(BuildContext context) {
-    if (context.supportedLocales.contains(context.deviceLocale)) {
-      context.resetLocale();
-    } else {
-      context.setLocale(context.fallbackLocale!);
-      context.deleteSaveLocale();
-    }
+    // TODO: Implement proper locale reset logic with Flutter's official localization
+    debugPrint('Locale reset requested - not implemented yet');
}
Evidence
The checklist requires explicit edge case handling and graceful degradation (PR Compliance ID 3).
The updated resetLocaleSafe() no longer performs any corrective action and only logs a message.

Rule 3: Generic: Robust Error Handling and Edge Case Management
lib/providers/settings_provider.dart[385-388]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`resetLocaleSafe()` no longer handles locale mismatch/reset scenarios and only prints a TODO message.
## Issue Context
Locale mismatch is an edge case that should be handled deterministically by resetting to a supported locale or clearing the forced locale.
## Fix Focus Areas
- lib/providers/settings_provider.dart[385-388]

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


View more (3)
4. Localization syntax breaks build 🐞 Bug ✓ Correctness
Description
Several migrated call sites contain invalid Dart syntax (e.g., AppLocalizations.of(context)!\.x
and string-literal function calls like "importX"(name)), which will prevent the app from
compiling.
Code

lib/custom_errors.dart[R169-175]

 content: GestureDetector(
   onLongPress: () {
     Clipboard.setData(ClipboardData(text: e.toString()));
     ScaffoldMessenger.of(
       context,
-              ).showSnackBar(SnackBar(content: Text(tr('copiedToClipboard'))));
+              ).showSnackBar(SnackBar(content: Text(AppLocalizations.of(context)!\.copiedToClipboard)));
   },
Evidence
The current code contains invalid token sequences (!\.) and attempts to call string literals as
functions; additionally, the generated AppLocalizations.of is already non-nullable, so ! should
not be used at call sites.

lib/custom_errors.dart[160-175]
lib/pages/import_export.dart[193-203]
lib/pages/settings.dart[136-142]
lib/generated/app_localizations.dart[95-97]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The localization migration introduced invalid Dart syntax at multiple call sites (`AppLocalizations.of(context)!\.` and `&amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;key&amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;(args)`), which breaks compilation.
### Issue Context
`AppLocalizations.of(context)` is generated as non-nullable and should be used as `AppLocalizations.of(context).someKey` or `AppLocalizations.of(context).someMethod(arg)`.
### Fix Focus Areas
- lib/custom_errors.dart[160-210]
- lib/pages/import_export.dart[193-205]
- lib/pages/settings.dart[132-145]
- lib/components/generated_form_modal.dart[70-96]

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


5. Incorrect locale list 🐞 Bug ✓ Correctness
Description
MaterialApp.supportedLocales is hardcoded with invalid/mismatching locale definitions (e.g.,
Locale('in'), Locale('zh','Hant_TW')), diverging from the generated
AppLocalizations.supportedLocales and breaking locale matching/selection for affected languages.
Code

lib/main.dart[R806-845]

+            localizationsDelegates: const [
+              AppLocalizations.delegate,
+              GlobalMaterialLocalizations.delegate,
+              GlobalWidgetsLocalizations.delegate,
+              GlobalCupertinoLocalizations.delegate,
+            ],
+            supportedLocales: const [
+              Locale('en'),
+              Locale('zh'),
+              Locale('zh', 'Hant_TW'),
+              Locale('it'),
+              Locale('ja'),
+              Locale('he'),
+              Locale('hu'),
+              Locale('de'),
+              Locale('fa'),
+              Locale('fr'),
+              Locale('es'),
+              Locale('pl'),
+              Locale('ru'),
+              Locale('bs'),
+              Locale('pt'),
+              Locale('pt', 'BR'),
+              Locale('cs'),
+              Locale('sv'),
+              Locale('nl'),
+              Locale('vi'),
+              Locale('tr'),
+              Locale('uk'),
+              Locale('da'),
+              Locale('et'),
+              Locale('en', 'EO'),
+              Locale('in'),
+              Locale('ko'),
+              Locale('ca'),
+              Locale('ar'),
+              Locale('ml'),
+              Locale('gl'),
+            ],
+            locale: settingsProvider.forcedLocale,
Evidence
The app hardcodes locales that do not match the gen_l10n output. The generated list clearly uses
Locale('id') and Locale.fromSubtags(...scriptCode: 'Hant') for Traditional Chinese, while
main.dart uses Locale('in') and a nonstandard countryCode value Hant_TW.

lib/main.dart[804-845]
lib/generated/app_localizations.dart[119-150]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Hardcoded locales in `MaterialApp` don&amp;amp;amp;amp;amp;amp;amp;amp;amp;#x27;t match the generated localization configuration (incorrect Indonesian and Traditional Chinese locale definitions).
### Issue Context
Flutter gen_l10n already generates `AppLocalizations.supportedLocales` and `AppLocalizations.localizationsDelegates`.
### Fix Focus Areas
- lib/main.dart[804-846]
- lib/providers/settings_provider.dart[291-376]
- lib/generated/app_localizations.dart[112-150]

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


6. Debug artifacts committed🐞 Bug ⛨ Security
Description
The PR adds local debug/output files containing merge-conflict markers and machine-specific paths
(e.g., /home/...), which should not be committed and may leak environment information.
Code

conflict_debug.txt[R1-5]

+<<<<<<< HEAD
+            action = Semantics(
+              button: true,
+              label: AppLocalizations.of(context)!.install,
+              hint: appsProvider.areDownloadsRunning()
Evidence
Newly added files include conflict markers (>>>>>>) and local filesystem paths/log output. These
are not application assets and should be removed from the repo.

conflict_debug.txt[1-5]
marker_debug.txt[1-3]
find_flutter.txt[1-1]
gen_output.txt[1-5]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Local debug/log files and conflict-marker artifacts were added to the repository.
### Issue Context
These files are not part of the app and may leak local environment information.
### Fix Focus Areas
- conflict_debug.txt[1-5]
- marker_debug.txt[1-3]
- gen_output.txt[1-20]
- find_flutter.txt[1-1]
- flutter_path.txt[1-1]
- output.txt[1-5]
- od_output.txt[1-20]
- home_list.txt[1-5]
- msg_list.txt[1-5]

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



Remediation recommended

7. Generic name set used 📘 Rule violation ✓ Correctness
Description
forcedLocale uses a variable named set to hold the validated locale result, which is generic and
obscures intent. This reduces readability and makes the code less self-documenting.
Code

lib/providers/settings_provider.dart[R301-336]

+    var set = const [
+      Locale('en'),
+      Locale('zh'),
+      Locale('zh', 'Hant_TW'),
+      Locale('it'),
+      Locale('ja'),
+      Locale('he'),
+      Locale('hu'),
+      Locale('de'),
+      Locale('fa'),
+      Locale('fr'),
+      Locale('es'),
+      Locale('pl'),
+      Locale('ru'),
+      Locale('bs'),
+      Locale('pt'),
+      Locale('pt', 'BR'),
+      Locale('cs'),
+      Locale('sv'),
+      Locale('nl'),
+      Locale('vi'),
+      Locale('tr'),
+      Locale('uk'),
+      Locale('da'),
+      Locale('et'),
+      Locale('en', 'EO'),
+      Locale('in'),
+      Locale('ko'),
+      Locale('ca'),
+      Locale('ar'),
+      Locale('ml'),
+      Locale('gl'),
+    ].where((element) => element == fl).isNotEmpty
? fl
: null;
return set;
Evidence
The checklist requires identifiers to clearly express purpose and intent (PR Compliance ID 2). The
variable name set does not describe that it represents the validated/allowed locale value.

Rule 2: Generic: Meaningful Naming and Self-Documenting Code
lib/providers/settings_provider.dart[301-337]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The variable `set` is too generic and hides the meaning of the value being returned from `forcedLocale`.
## Issue Context
This code is validating a stored locale against supported locales and returning either the validated locale or null.
## Fix Focus Areas
- lib/providers/settings_provider.dart[291-337]

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


8. Notifications no longer localized 🐞 Bug ✓ Correctness
Description
Notifications (and some other user-facing strings) were replaced with hardcoded English text rather
than using the new AppLocalizations, causing an i18n regression for non-English users.
Code

lib/providers/notifications_provider.dart[R38-53]

UpdateNotification(List<App> updates, {int? id})
: super(
id ?? 2,
-        tr('updatesAvailable'),
+        'Updates available',
'',
'UPDATES_AVAILABLE',
-        tr('updatesAvailableNotifChannel'),
-        tr('updatesAvailableNotifDescription'),
+        'Updates available notifications',
+        'Notifications about available updates',
Importance.max,
) {
message = updates.isEmpty
-        ? tr('noNewUpdates')
+        ? 'No new updates'
: updates.length == 1
-        ? tr('xHasAnUpdate', args: [updates[0].finalName])
-        : plural(
-            'xAndNMoreUpdatesAvailable',
-            updates.length - 1,
-            args: [updates[0].finalName, (updates.length - 1).toString()],
-          );
+        ? '${updates[0].finalName} has an update'
+        : '${updates[0].finalName} and ${(updates.length - 1).toString()} more updates available';
}
Evidence
The notification titles/channel names/messages are now literal English strings, which bypass the
localization system introduced by this PR.

lib/providers/notifications_provider.dart[37-53]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Hardcoded English strings in notifications bypass localization.
### Issue Context
This PR’s goal is migrating to Flutter’s official localization; user-facing strings should remain localized.
### Fix Focus Areas
- lib/providers/notifications_provider.dart[37-80]
- lib/providers/source_provider.dart[500-850]

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


Grey Divider

ⓘ The new review experience is currently in Beta. Learn more

Grey Divider

Qodo Logo

@gemini-code-assist
Copy link

Summary of Changes

Hello, 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 overhauls the application's internationalization infrastructure by transitioning to Flutter's built-in localization capabilities. This change streamlines the process of managing and integrating translated content, laying the groundwork for more robust and maintainable multilingual support.

Highlights

  • Localization System Migration: The application's localization system has been migrated from the easy_localization package to Flutter's native flutter_localizations and intl packages. This involves a significant refactoring of how localized strings are accessed throughout the codebase.
  • Translation File Conversion: A new Python script, convert_l10n.py, was introduced to automate the conversion of existing JSON translation files into the new Application Resource Bundle (ARB) format required by Flutter's localization system.
  • Codebase Updates: Numerous Dart files across various app sources and components have been updated to replace calls to tr('key') with the new AppLocalizations.of(context)!.key syntax, ensuring compatibility with the new localization setup.
  • New Localization Files: New generated localization files (app_localizations.dart and language-specific app_localizations_xx.dart files) and a l10n.yaml configuration file have been added to support the new localization workflow.
Changelog
  • assets/translations/ar.json
    • Modified pluralization rules for 'APK' and 'Certificate Hash' entries.
  • conflict_debug.txt
    • Added a new file, likely a debug output from a merge conflict or test run.
  • convert_l10n.py
    • Added a new Python script to convert JSON translation files to ARB format.
  • find_flutter.txt
    • Added a new file, likely a log related to Flutter executable path discovery.
  • flutter_path.txt
    • Added a new file, likely a log detailing Flutter path environment variables.
  • gen_output.txt
    • Added a new file, likely containing the output log from the flutter gen-l10n command.
  • home_list.txt
    • Added a new file, likely a list of home directory contents for debugging.
  • l10n.yaml
    • Added a new configuration file for Flutter's localization generation tool.
  • lib/app_sources/apkcombo.dart
    • Removed the easy_localization import.
  • lib/app_sources/apkmirror.dart
    • Replaced easy_localization import with app_localizations.dart.
    • Updated tr() calls to use AppLocalizations.of(context)!.key.
  • lib/app_sources/apkpure.dart
    • Replaced easy_localization import with app_localizations.dart.
    • Updated tr() calls to use AppLocalizations.of(context)!.key.
  • lib/app_sources/aptoide.dart
    • Replaced easy_localization import with app_localizations.dart.
    • Updated tr() calls to use AppLocalizations.of(context)!.key.
  • lib/app_sources/directAPKLink.dart
    • Replaced easy_localization import with app_localizations.dart.
    • Updated tr() calls to use AppLocalizations.of(context)!.key.
  • lib/app_sources/fdroid.dart
    • Replaced easy_localization import with app_localizations.dart.
    • Updated tr() calls to use AppLocalizations.of(context)!.key.
  • lib/app_sources/fdroidrepo.dart
    • Replaced easy_localization import with app_localizations.dart.
    • Updated tr() calls to use AppLocalizations.of(context)!.key.
  • lib/app_sources/github.dart
    • Removed the easy_localization import.
    • Added app_localizations.dart import.
    • Updated tr() calls to use AppLocalizations.of(context)!.key.
  • lib/app_sources/gitlab.dart
    • Removed the easy_localization import.
    • Added app_localizations.dart import.
    • Updated tr() calls to use AppLocalizations.of(context)!.key.
  • lib/app_sources/html.dart
    • Replaced easy_localization import with app_localizations.dart.
    • Updated tr() calls to use AppLocalizations.of(context)!.key.
  • lib/app_sources/huaweiappgallery.dart
    • Removed the easy_localization import.
  • lib/app_sources/rustore.dart
    • Replaced easy_localization import with app_localizations.dart.
    • Updated tr() calls to use AppLocalizations.of(context)!.key.
  • lib/app_sources/sourcehut.dart
    • Replaced easy_localization import with app_localizations.dart.
    • Updated tr() calls to use AppLocalizations.of(context)!.key.
  • lib/app_sources/telegramapp.dart
    • Replaced easy_localization import with app_localizations.dart.
    • Updated tr() calls to use AppLocalizations.of(context)!.key.
  • lib/app_sources/tencent.dart
    • Replaced easy_localization import with app_localizations.dart.
    • Updated tr() calls to use AppLocalizations.of(context)!.key.
  • lib/app_sources/uptodown.dart
    • Replaced easy_localization import with app_localizations.dart.
    • Updated tr() calls to use AppLocalizations.of(context)!.key.
  • lib/app_sources/vivoappstore.dart
    • Replaced easy_localization import with app_localizations.dart.
    • Updated tr() calls to use AppLocalizations.of(context)!.key.
  • lib/components/generated_form.dart
    • Replaced easy_localization import with app_localizations.dart.
    • Updated tr() calls to use AppLocalizations.of(context)!.key.
  • lib/components/generated_form_modal.dart
    • Replaced easy_localization import with app_localizations.dart.
    • Updated tr() calls to use AppLocalizations.of(context)!.key.
  • lib/custom_errors.dart
    • Replaced easy_localization import with app_localizations.dart.
    • Updated tr() and plural() calls to use AppLocalizations.of(globalNavigatorKey.currentContext!)!.key.
  • lib/generated/app_localizations.dart
    • Added a new file for Flutter's generated localization delegate and supported locales.
  • lib/generated/app_localizations_ar.dart
    • Added a new file for Arabic localized strings.
  • lib/generated/app_localizations_bs.dart
    • Added a new file for Bosnian localized strings.
  • lib/generated/app_localizations_ca.dart
    • Added a new file for Catalan localized strings.
  • lib/generated/app_localizations_cs.dart
    • Added a new file for Czech localized strings.
  • lib/generated/app_localizations_da.dart
    • Added a new file for Danish localized strings.
  • lib/generated/app_localizations_de.dart
    • Added a new file for German localized strings.
  • lib/generated/app_localizations_en.dart
    • Added a new file for English localized strings.
  • lib/generated/app_localizations_es.dart
    • Added a new file for Spanish localized strings.
  • lib/generated/app_localizations_et.dart
    • Added a new file for Estonian localized strings.
  • lib/generated/app_localizations_fa.dart
    • Added a new file for Persian localized strings.
  • lib/generated/app_localizations_fr.dart
    • Added a new file for French localized strings.
Activity
  • The pull request was created by omeritzics.
  • The pull request description is empty, so the intent is derived from the title and changes.
Using Gemini Code Assist

The 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 /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

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 .gemini/ folder in the base of the repository. Detailed instructions can be found here.

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

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request successfully migrates the project to Flutter's built-in localization, which is a great improvement. The changes involve updating numerous files to use AppLocalizations and adding a conversion script. However, there are a few critical issues to address. Several debug and conflict-related files have been accidentally included and should be removed. The new Python conversion script contains hardcoded paths, making it non-portable. Most importantly, there's an unsafe use of globalNavigatorKey.currentContext for localization within error classes, which could lead to runtime crashes, especially in background tasks. Addressing these points will ensure the stability and maintainability of the new localization system.

Comment on lines 26 to +30
RateLimitError(this.remainingMinutes)
: super(plural('tooManyRequestsTryAgainInMinutes', remainingMinutes));
: super(
AppLocalizations.of(globalNavigatorKey.currentContext!)!
.tooManyRequestsTryAgainInMinutes(remainingMinutes),
);

Choose a reason for hiding this comment

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

critical

Using globalNavigatorKey.currentContext! in error constructors is unsafe and will cause a crash when an error is created from a background process (like an update check) that has no BuildContext.

To fix this, localization should happen when the error is displayed, not when it's created. I suggest refactoring UpdatiumError and its subclasses to format the message when it's needed, using a valid BuildContext.

For example, you could add a method to UpdatiumError:

// In UpdatiumError
class UpdatiumError {
  // ...
  String getMessage(BuildContext context) => message;
}

// In RateLimitError
class RateLimitError extends UpdatiumError {
  final int remainingMinutes;
  RateLimitError(this.remainingMinutes) : super('');

  @override
  String getMessage(BuildContext context) {
    return AppLocalizations.of(context)!.tooManyRequestsTryAgainInMinutes(remainingMinutes);
  }
}

Then showMessage would use error.getMessage(context) to display the localized text safely.

Comment on lines +1 to +5
<<<<<<< HEAD
action = Semantics(
button: true,
label: AppLocalizations.of(context)!.install,
hint: appsProvider.areDownloadsRunning()

Choose a reason for hiding this comment

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

high

This file appears to be a merge conflict artifact. It, along with find_flutter.txt, flutter_path.txt, gen_output.txt, and home_list.txt, seems to be a temporary or debug file that was accidentally committed. These files should be removed from the pull request and added to .gitignore to prevent them from being committed in the future.

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Repository owner deleted a comment from qodo-free-for-open-source-projects bot Feb 27, 2026
Copy link

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

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

🚫 CI Build Failed

The automated build process failed. Please review the build logs and fix the issues before requesting another review.

Next steps:

  1. Check the build logs for specific errors
  2. Fix the identified issues
  3. Push your fixes to this branch
  4. The CI will automatically re-run

Once the build passes, this review will be dismissed automatically.

Comment on lines 304 to 306
throw UpdatiumError(
tr('fileDeletionError', args: [e.path ?? tr('unknown')]),
"fileDeletionError"(e.path ?? AppLocalizations.of(context)!\.unknown),
);

Choose a reason for hiding this comment

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

Action required

1. deletefile() uses undefined context 📘 Rule violation ⛯ Reliability

deleteFile() constructs an UpdatiumError using AppLocalizations.of(context) even though no
context exists in scope, and also calls a string literal like a function. This breaks error
handling at a file-deletion failure point and can crash/stop compilation instead of gracefully
reporting the failure.
Agent Prompt
## Issue description
`deleteFile()` currently throws an `UpdatiumError` using an undefined `context` and an invalid localization call (`"fileDeletionError"(...)`). This breaks the error-handling path and can prevent graceful degradation on file-deletion failures.

## Issue Context
This code runs when file deletion fails (`PathAccessException`). Per compliance requirements, failure points must be handled reliably and provide meaningful context.

## Fix Focus Areas
- lib/providers/apps_provider.dart[300-307]

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

Comment on lines 24 to +30
class RateLimitError extends UpdatiumError {
late int remainingMinutes;
RateLimitError(this.remainingMinutes)
: super(plural('tooManyRequestsTryAgainInMinutes', remainingMinutes));
: super(
AppLocalizations.of(globalNavigatorKey.currentContext!)!
.tooManyRequestsTryAgainInMinutes(remainingMinutes),
);

Choose a reason for hiding this comment

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

Action required

2. Null-assert on currentcontext! 📘 Rule violation ⛯ Reliability

Multiple error constructors localize messages via globalNavigatorKey.currentContext!, which can be
null (e.g., early startup/background flows). This can cause a crash while building an error message,
preventing graceful handling of the original failure.
Agent Prompt
## Issue description
Error constructors are using `globalNavigatorKey.currentContext!` for localization. If `currentContext` is null, constructing the error will crash, defeating robust error handling.

## Issue Context
Errors may be created outside of an active widget tree (startup/background). Localization should be performed with a guaranteed-safe context or provided `AppLocalizations` instance.

## Fix Focus Areas
- lib/custom_errors.dart[24-113]

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

Comment on lines 385 to 388
void resetLocaleSafe(BuildContext context) {
if (context.supportedLocales.contains(context.deviceLocale)) {
context.resetLocale();
} else {
context.setLocale(context.fallbackLocale!);
context.deleteSaveLocale();
}
// TODO: Implement proper locale reset logic with Flutter's official localization
debugPrint('Locale reset requested - not implemented yet');
}

Choose a reason for hiding this comment

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

Action required

3. resetlocalesafe() left unimplemented 📘 Rule violation ⛯ Reliability

resetLocaleSafe() was changed to a TODO with only a debugPrint, so the locale-reset edge case is
no longer handled. This can leave the app in an inconsistent locale state instead of gracefully
recovering.
Agent Prompt
## Issue description
`resetLocaleSafe()` no longer handles locale mismatch/reset scenarios and only prints a TODO message.

## Issue Context
Locale mismatch is an edge case that should be handled deterministically by resetting to a supported locale or clearing the forced locale.

## Fix Focus Areas
- lib/providers/settings_provider.dart[385-388]

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

Comment on lines 169 to 175
content: GestureDetector(
onLongPress: () {
Clipboard.setData(ClipboardData(text: e.toString()));
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text(tr('copiedToClipboard'))));
).showSnackBar(SnackBar(content: Text(AppLocalizations.of(context)!\.copiedToClipboard)));
},

Choose a reason for hiding this comment

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

Action required

4. Localization syntax breaks build 🐞 Bug ✓ Correctness

Several migrated call sites contain invalid Dart syntax (e.g., AppLocalizations.of(context)!\.x
and string-literal function calls like "importX"(name)), which will prevent the app from
compiling.
Agent Prompt
### Issue description
The localization migration introduced invalid Dart syntax at multiple call sites (`AppLocalizations.of(context)!\.` and `"key"(args)`), which breaks compilation.

### Issue Context
`AppLocalizations.of(context)` is generated as non-nullable and should be used as `AppLocalizations.of(context).someKey` or `AppLocalizations.of(context).someMethod(arg)`.

### Fix Focus Areas
- lib/custom_errors.dart[160-210]
- lib/pages/import_export.dart[193-205]
- lib/pages/settings.dart[132-145]
- lib/components/generated_form_modal.dart[70-96]

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

Comment on lines +806 to +845
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: const [
Locale('en'),
Locale('zh'),
Locale('zh', 'Hant_TW'),
Locale('it'),
Locale('ja'),
Locale('he'),
Locale('hu'),
Locale('de'),
Locale('fa'),
Locale('fr'),
Locale('es'),
Locale('pl'),
Locale('ru'),
Locale('bs'),
Locale('pt'),
Locale('pt', 'BR'),
Locale('cs'),
Locale('sv'),
Locale('nl'),
Locale('vi'),
Locale('tr'),
Locale('uk'),
Locale('da'),
Locale('et'),
Locale('en', 'EO'),
Locale('in'),
Locale('ko'),
Locale('ca'),
Locale('ar'),
Locale('ml'),
Locale('gl'),
],
locale: settingsProvider.forcedLocale,

Choose a reason for hiding this comment

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

Action required

5. Incorrect locale list 🐞 Bug ✓ Correctness

MaterialApp.supportedLocales is hardcoded with invalid/mismatching locale definitions (e.g.,
Locale('in'), Locale('zh','Hant_TW')), diverging from the generated
AppLocalizations.supportedLocales and breaking locale matching/selection for affected languages.
Agent Prompt
### Issue description
Hardcoded locales in `MaterialApp` don't match the generated localization configuration (incorrect Indonesian and Traditional Chinese locale definitions).

### Issue Context
Flutter gen_l10n already generates `AppLocalizations.supportedLocales` and `AppLocalizations.localizationsDelegates`.

### Fix Focus Areas
- lib/main.dart[804-846]
- lib/providers/settings_provider.dart[291-376]
- lib/generated/app_localizations.dart[112-150]

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

@omeritzics
Copy link
Owner Author

/improve

@qodo-free-for-open-source-projects
Copy link

qodo-free-for-open-source-projects bot commented Mar 1, 2026

PR Code Suggestions ✨

Latest suggestions up to 1b117c4

CategorySuggestion                                                                                                                                    Impact
Possible issue
Remove nested overridden methods

Fix invalid nested method declarations in the AppLocalizationsEnEo class. The
current structure will cause a compilation error and should be replaced with
four separate, correctly overridden methods.

lib/generated/app_localizations_en.dart [2566-2608]

 @override
-String xAndNMoreUpdatesAvailable(num count) {
-  @override
-  String xAndNMoreUpdatesAvailable(Object p0, num count) {
-    String _temp0 = intl.Intl.pluralLogic(
-      count,
-      locale: localeName,
-      other: '$p0 kaj $count aliaj apoj havas ĝisdatigojn.',
-      one: '$p0 kaj 1 alia apo havas ĝisdatigojn.',
-    );
-    return '$_temp0';
-  }
+String xAndNMoreUpdatesAvailable(Object p0, num count) {
+  final String _temp0 = intl.Intl.pluralLogic(
+    count,
+    locale: localeName,
+    other: '$p0 kaj $count aliaj apoj havas ĝisdatigojn.',
+    one: '$p0 kaj 1 alia apo havas ĝisdatigojn.',
+  );
+  return '$_temp0';
+}
 
-  @override
-  String xAndNMoreUpdatesInstalled(Object p0, num count) {
-    String _temp0 = intl.Intl.pluralLogic(
-      count,
-      locale: localeName,
-      other: '$p0 kaj $count aliaj apoj ĝisdatiĝis.',
-      one: '$p0 kaj 1 alia apo ĝisdatiĝis.',
-    );
-    return '$_temp0';
-  }
+@override
+String xAndNMoreUpdatesInstalled(Object p0, num count) {
+  final String _temp0 = intl.Intl.pluralLogic(
+    count,
+    locale: localeName,
+    other: '$p0 kaj $count aliaj apoj ĝisdatiĝis.',
+    one: '$p0 kaj 1 alia apo ĝisdatiĝis.',
+  );
+  return '$_temp0';
+}
 
-  @override
-  String xAndNMoreUpdatesFailed(Object p0, num count) {
-    String _temp0 = intl.Intl.pluralLogic(
-      count,
-      locale: localeName,
-      other: 'Ne eblas ĝisdatigi $p0 et $count aliajn apojn.',
-      one: 'Ne eblas ĝisdatigi $p0 kaj 1 alian apon.',
-    );
-    return '$_temp0';
-  }
+@override
+String xAndNMoreUpdatesFailed(Object p0, num count) {
+  final String _temp0 = intl.Intl.pluralLogic(
+    count,
+    locale: localeName,
+    other: 'Ne eblas ĝisdatigi $p0 et $count aliajn apojn.',
+    one: 'Ne eblas ĝisdatigi $p0 kaj 1 alian apon.',
+  );
+  return '$_temp0';
+}
 
-  @override
-  String xAndNMoreUpdatesPossiblyInstalled(Object p0, num count) {
-    String _temp0 = intl.Intl.pluralLogic(
-      count,
-      locale: localeName,
-      other: '$p0 kaj $count aliaj apoj eble ĝisdatiĝis.',
-      one: '$p0 kaj 1 alia apo eble ĝisdatiĝis.',
-    );
+@override
+String xAndNMoreUpdatesPossiblyInstalled(Object p0, num count) {
+  final String _temp0 = intl.Intl.pluralLogic(
+    count,
+    locale: localeName,
+    other: '$p0 kaj $count aliaj apoj eble ĝisdatiĝis.',
+    one: '$p0 kaj 1 alia apo eble ĝisdatiĝis.',
+  );
+  return '$_temp0';
+}

[Suggestion processed]

Suggestion importance[1-10]: 10

__

Why: The suggestion correctly identifies invalid Dart syntax where multiple methods are nested inside another, which would cause a compilation failure. Applying this change is critical to fix the build-breaking error.

High
Fallback instead of throwing

Instead of throwing an error for an unsupported locale, fall back to a default
language (English) and report the error only in debug mode to prevent the app
from crashing.

lib/generated/app_localizations.dart [2473-2478]

-throw FlutterError(
-  'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely '
-  'an issue with the localizations generation tool. Please file an issue '
-  'on GitHub with a reproducible sample app and the gen-l10n configuration '
-  'that was used.'
-);
+assert(() {
+  FlutterError.reportError(FlutterErrorDetails(
+    exception: FlutterError(
+      'AppLocalizations.delegate failed to load unsupported locale "$locale". Falling back to "en".'
+    ),
+  ));
+  return true;
+}());
 
+return AppLocalizationsEn();
+
  • Apply / Chat
Suggestion importance[1-10]: 8

__

Why: This suggestion prevents a potential app crash on startup for users with unsupported locales by implementing a fallback to a default language, which is a critical improvement for app robustness and user experience.

Medium
Prevent crashes on missing localization

Refactor the of method to use an assert with a clearer error message for easier
debugging, and add a maybeOf method for safely accessing localizations when they
might be absent.

lib/generated/app_localizations.dart [95-97]

-static AppLocalizations of(BuildContext context) {
-  return Localizations.of<AppLocalizations>(context, AppLocalizations)!;
+static AppLocalizations? maybeOf(BuildContext context) {
+  return Localizations.of<AppLocalizations>(context, AppLocalizations);
 }
 
+static AppLocalizations of(BuildContext context) {
+  final AppLocalizations? result = maybeOf(context);
+  assert(result != null, 'No AppLocalizations found in context. Did you add AppLocalizations.delegate to localizationsDelegates?');
+  return result!;
+}
+
  • Apply / Chat
Suggestion importance[1-10]: 6

__

Why: This is a good suggestion that improves developer experience by providing a clearer error message in debug mode and adding a safe maybeOf accessor, which is a standard Flutter pattern.

Low
  • More

Previous suggestions

Suggestions up to commit 0a1a589
CategorySuggestion                                                                                                                                    Impact
Possible issue
Fix broken pluralization block

Fix a syntax error in the xAndNMoreUpdatesPossiblyInstalled method by removing a
duplicate one: parameter and an extra closing parenthesis from the
Intl.pluralLogic call.

lib/generated/app_localizations_en.dart [1281-1291]

 String xAndNMoreUpdatesPossiblyInstalled(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
     other: '$p0 and $count more apps may have been updated.',
     one: '$p0 and 1 more app may have been updated.',
   );
-    one: '$count and 1 more app may have been updated.',
-  );
   return '$_temp0';
 }

[Suggestion processed]

Suggestion importance[1-10]: 10

__

Why: The suggestion correctly identifies a critical syntax error in the xAndNMoreUpdatesPossiblyInstalled method that would prevent the code from compiling.

High
Fix override signatures and interpolation

Correct the method signatures and string interpolation for several xAndNMore...
methods in the AppLocalizationsEnEo class to match their parent definitions and
prevent compilation errors.

lib/generated/app_localizations_en.dart [2568-2610]

 @override
-String xAndNMoreUpdatesAvailable(num count) {
+String xAndNMoreUpdatesAvailable(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '$count kaj $count aliaj apoj havas ĝisdatigojn.',
-    one: '$count kaj 1 alia apo havas ĝisdatigojn.',
+    other: '$p0 kaj $count aliaj apoj havas ĝisdatigojn.',
+    one: '$p0 kaj 1 alia apo havas ĝisdatigojn.',
   );
   return '$_temp0';
 }
 
 @override
-String xAndNMoreUpdatesInstalled(num count) {
+String xAndNMoreUpdatesInstalled(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '$count kaj $count aliaj apoj ĝisdatiĝis.',
-    one: '$count kaj 1 alia apo ĝisdatiĝis.',
+    other: '$p0 kaj $count aliaj apoj ĝisdatiĝis.',
+    one: '$p0 kaj 1 alia apo ĝisdatiĝis.',
   );
   return '$_temp0';
 }
 
 @override
-String xAndNMoreUpdatesFailed(num count) {
+String xAndNMoreUpdatesFailed(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: 'Ne eblas ĝisdatigi $count et $count aliajn apojn.',
-    one: 'Ne eblas ĝisdatigi $count kaj 1 alian apon.',
+    other: 'Ne eblas ĝisdatigi $p0 et $count aliajn apojn.',
+    one: 'Ne eblas ĝisdatigi $p0 kaj 1 alian apon.',
   );
   return '$_temp0';
 }
 
 @override
-String xAndNMoreUpdatesPossiblyInstalled(num count) {
+String xAndNMoreUpdatesPossiblyInstalled(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '$count kaj $count aliaj apoj eble ĝisdatiĝis.',
-    one: '$count kaj 1 alia apo eble ĝisdatiĝis.',
+    other: '$p0 kaj $count aliaj apoj eble ĝisdatiĝis.',
+    one: '$p0 kaj 1 alia apo eble ĝisdatiĝis.',
   );
   return '$_temp0';
 }

[Suggestion processed]

Suggestion importance[1-10]: 10

__

Why: The suggestion correctly identifies that multiple methods in AppLocalizationsEnEo have incorrect signatures, which would cause compilation errors, and also fixes the incorrect string interpolation within them.

High
Fix plural method parameter mismatch

Add a missing p0 parameter to the xAndNMore... plural methods and update their
string templates. The current implementation incorrectly uses count for both the
app name and the quantity.

lib/generated/app_localizations.dart [2317-2335]

-String xAndNMoreUpdatesAvailable(num count);
+String xAndNMoreUpdatesAvailable(Object p0, num count);
 
 /// No description provided for @xAndNMoreUpdatesInstalled.
 ///
 /// In en, this message translates to:
-/// **'{count, plural, one{{count} and 1 more app was updated.} other{{count} and {count} more apps were updated.}}'**
-String xAndNMoreUpdatesInstalled(num count);
+/// **'{count, plural, one{{p0} and 1 more app was updated.} other{{p0} and {count} more apps were updated.}}'**
+String xAndNMoreUpdatesInstalled(Object p0, num count);
 
 /// No description provided for @xAndNMoreUpdatesFailed.
 ///
 /// In en, this message translates to:
-/// **'{count, plural, one{Failed to update {count} and 1 more app.} other{Failed to update {count} and {count} more apps.}}'**
-String xAndNMoreUpdatesFailed(num count);
+/// **'{count, plural, one{Failed to update {p0} and 1 more app.} other{Failed to update {p0} and {count} more apps.}}'**
+String xAndNMoreUpdatesFailed(Object p0, num count);
 
 /// No description provided for @xAndNMoreUpdatesPossiblyInstalled.
 ///
 /// In en, this message translates to:
-/// **'{count, plural, one{{count} and 1 more app may have been updated.} other{{count} and {count} more apps may have been updated.}}'**
-String xAndNMoreUpdatesPossiblyInstalled(num count);
+/// **'{count, plural, one{{p0} and 1 more app may have been updated.} other{{p0} and {count} more apps may have been updated.}}'**
+String xAndNMoreUpdatesPossiblyInstalled(Object p0, num count);

[Suggestion processed]

Suggestion importance[1-10]: 8

__

Why: The suggestion correctly identifies a bug in the pluralization string templates where {count} is used for both the app name and the quantity, which would lead to incorrect localization strings. Fixing this is critical for correct functionality.

Medium
Separate error from delay

Fix the bgUpdateGotErrorRetryInMinutes method by separating the error from the
retry delay. The current string template incorrectly uses {count} for both
values, so the signature should be changed to accept a separate error parameter
p0.

lib/generated/app_localizations.dart [2265-2269]

 /// No description provided for @bgUpdateGotErrorRetryInMinutes.
 ///
 /// In en, this message translates to:
-/// **'{count, plural, one{BG update checking encountered a {count}, will schedule a retry check in {count} minute} other{BG update checking encountered a {count}, will schedule a retry check in {count} minutes}}'**
-String bgUpdateGotErrorRetryInMinutes(num count);
+/// **'{count, plural, one{BG update checking encountered {p0}; will schedule a retry check in {count} minute} other{BG update checking encountered {p0}; will schedule a retry check in {count} minutes}}'**
+String bgUpdateGotErrorRetryInMinutes(Object p0, num count);

[Suggestion processed]

Suggestion importance[1-10]: 8

__

Why: The suggestion correctly identifies a critical bug in the localization template where {count} is ambiguously used for both an error and a time value. This would result in nonsensical messages, and the proposed fix is necessary for correctness.

Medium
Use structured locale matching

Refactor the locale lookup logic to use the structured properties of the Locale
object (languageCode, scriptCode, countryCode) instead of locale.toString().
This ensures a more robust and platform-independent matching.

lib/generated/app_localizations.dart [2419-2423]

 AppLocalizations lookupAppLocalizations(Locale locale) {
-    // Lookup logic when language+script+country codes are specified.
-  switch (locale.toString()) {
-    case 'zh_Hant_TW': return AppLocalizationsZhHantTw();
+  // Lookup logic when language+script+country codes are specified.
+  if (locale.languageCode == 'zh' && locale.scriptCode == 'Hant' && locale.countryCode == 'TW') {
+    return AppLocalizationsZhHantTw();
   }

[Suggestion processed]

Suggestion importance[1-10]: 7

__

Why: The suggestion correctly points out that comparing locale.toString() is not robust. Using structured properties like languageCode and countryCode is a best practice for locale matching and prevents potential bugs across different platforms.

Medium
General
Translate remaining English strings

Translate four English strings in the Portuguese localization file
(AppLocalizationsPt) to Portuguese to ensure a consistent user interface.

lib/generated/app_localizations_pt.dart [453-463]

 @override
-String get networkError => 'Network connection failed';
+String get networkError => 'Falha na conexão de rede';
 
 @override
-String get invalidUrlFormat => 'Invalid URL format';
+String get invalidUrlFormat => 'Formato de URL inválido';
 
 @override
-String get accessDenied => 'Access denied';
+String get accessDenied => 'Acesso negado';
 
 @override
-String get importFailed => 'Import failed';
+String get importFailed => 'Falha na importação';

[Suggestion processed]

Suggestion importance[1-10]: 6

__

Why: The suggestion correctly identifies untranslated strings in the AppLocalizationsPt class and provides accurate Portuguese translations, improving the user experience.

Low
Fix user-visible typo

Fix a grammatical typo in the xWasRemovedDueToErrorY string for the Brazilian
Portuguese (pt_BR) localization from for removido to foi removido.

lib/generated/app_localizations_pt.dart [1856-1859]

 @override
 String xWasRemovedDueToErrorY(Object p0, Object p1) {
-  return '$p0 for removido devido ao erro: $p1';
+  return '$p0 foi removido devido ao erro: $p1';
 }

[Suggestion processed]

Suggestion importance[1-10]: 5

__

Why: The suggestion correctly identifies and fixes a grammatical error in a user-facing string for the Brazilian Portuguese localization, improving translation quality.

Low
Suggestions up to commit 6d42656
CategorySuggestion                                                                                                                                    Impact
Possible issue
Fix invalid override signatures

Fix the signatures of four overridden methods in AppLocalizationsPtBr to match
their parent definitions in AppLocalizationsPt by adding the missing Object p0
parameter.

lib/generated/app_localizations_pt.dart [2566-2608]

 @override
-String xAndNMoreUpdatesAvailable(num count) {
+String xAndNMoreUpdatesAvailable(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '$count e mais $count apps têm atualizações.',
-    one: '$count e mais 1 app têm atualizações.',
+    other: '$p0 e mais $count apps têm atualizações.',
+    one: '$p0 e mais 1 app têm atualizações.',
   );
   return '$_temp0';
 }
 
 @override
-String xAndNMoreUpdatesInstalled(num count) {
+String xAndNMoreUpdatesInstalled(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '$count e mais $count apps foram atualizados.',
-    one: '$count e mais 1 app foram atualizados.',
+    other: '$p0 e mais $count apps foram atualizados.',
+    one: '$p0 e mais 1 app foi atualizado.',
   );
   return '$_temp0';
 }
 
 @override
-String xAndNMoreUpdatesFailed(num count) {
+String xAndNMoreUpdatesFailed(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: 'Falha ao atualizar $count e mais $count apps.',
-    one: 'Falha ao atualizar $count e mais 1 app.',
+    other: 'Falha ao atualizar $p0 e mais $count apps.',
+    one: 'Falha ao atualizar $p0 e mais 1 app.',
   );
   return '$_temp0';
 }
 
 @override
-String xAndNMoreUpdatesPossiblyInstalled(num count) {
+String xAndNMoreUpdatesPossiblyInstalled(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '$count e mais $count apps podem ter sido atualizados.',
-    one: '$count e mais 1 app podem ter sido atualizados.',
+    other: '$p0 e mais $count apps podem ter sido atualizados.',
+    one: '$p0 e mais 1 app pode ter sido atualizado.',
   );
   return '$_temp0';
 }

[Suggestion processed]

Suggestion importance[1-10]: 10

__

Why: The suggestion correctly identifies that the overridden methods in AppLocalizationsPtBr have incorrect signatures, which would cause a compilation error.

High
Fix signature and interpolation errors

In AppLocalizationsZhHantTw, fix the signatures and string interpolations for
the xAndNMore... plural methods to correctly use the p0 parameter for the app
name.

lib/generated/app_localizations_zh.dart [2566-2608]

 @override
-String xAndNMoreUpdatesAvailable(num count) {
+String xAndNMoreUpdatesAvailable(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '$count 和另外 $count 個應用程式有更新。',
-    one: '$count 和另外 1 個應用程式有更新。',
+    other: '“$p0”和另外 $count 個應用程式有更新。',
+    one: '“$p0”和另外 1 個應用程式有更新。',
   );
   return '$_temp0';
 }
 
 @override
-String xAndNMoreUpdatesInstalled(num count) {
+String xAndNMoreUpdatesInstalled(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '$count 和另外 $count 個應用程式已更新。',
-    one: '$count 和另外 1 個應用程式已更新。',
+    other: '“$p0”和另外 $count 個應用程式已更新。',
+    one: '“$p0”和另外 1 個應用程式已更新。',
   );
   return '$_temp0';
 }
 
 @override
-String xAndNMoreUpdatesFailed(num count) {
+String xAndNMoreUpdatesFailed(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '更新 $count 和另外 $count 個應用程式失敗。',
-    one: '更新 $count 和另外 1 個應用程式失敗。',
+    other: '“$p0”和另外 $count 個應用程式更新失敗。',
+    one: '“$p0”和另外 1 個應用程式更新失敗。',
   );
   return '$_temp0';
 }
 
 @override
-String xAndNMoreUpdatesPossiblyInstalled(num count) {
+String xAndNMoreUpdatesPossiblyInstalled(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '$count 和另外 $count 個應用程式可能已更新。',
-    one: '$count 和另外 1 個應用程式可能已更新。',
+    other: '已嘗試更新“$p0”和另外 $count 個應用程式。',
+    one: '已嘗試更新“$p0”和另外 1 個應用程式。',
   );
   return '$_temp0';
 }

[Suggestion processed]

Suggestion importance[1-10]: 9

__

Why: This suggestion correctly identifies and fixes incorrect method signatures and string interpolations in the AppLocalizationsZhHantTw class, which would likely cause compilation or runtime errors.

High
Fix incorrect retry message

Correct the Portuguese translation for bgUpdateGotErrorRetryInMinutes to produce
a coherent message about retrying after an error.

lib/generated/app_localizations_pt.dart [2478-2487]

 @override
 String bgUpdateGotErrorRetryInMinutes(num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: 'A busca de atualizações em segundo plano encontrou um $count, será agendado uma nova tentativa em $count minutos',
-    one: 'A busca de atualizações em segundo plano encontrou um $count, será agendado uma nova tentativa em $count minuto',
+    other: 'A busca de atualizações em segundo plano encontrou um erro; uma nova tentativa será agendada em $count minutos',
+    one: 'A busca de atualizações em segundo plano encontrou um erro; uma nova tentativa será agendada em $count minuto',
   );
   return '$_temp0';
 }

[Suggestion processed]

Suggestion importance[1-10]: 7

__

Why: The suggestion correctly points out that the translation string for bgUpdateGotErrorRetryInMinutes is nonsensical and fixes it to be grammatically correct and meaningful.

Medium
Incremental [*]
Fix missing plural logic assignment

In the bgUpdateGotErrorRetryInMinutes method, fix a compilation error by
re-adding the missing String _temp0 = intl.Intl.pluralLogic(count, and removing
a duplicated one: block.

lib/generated/app_localizations_en.dart [2481-2489]

 String bgUpdateGotErrorRetryInMinutes(num count) {
+  String _temp0 = intl.Intl.pluralLogic(
+    count,
     locale: localeName,
     other: 'La serĉo de fonaj ĝisdatigoj renkontis eraron; nova provo estos programita post $count minutoj',
     one: 'La serĉo de fonaj ĝisdatigoj renkontis eraron; nova provo estos programita post $count minuto',
   );
-    one: 'La serĉo de fonaj ĝisdatigoj renkontis al $count, nova programota provo en $count minuto',
-  );
   return '$_temp0';
 }

[Suggestion processed]

Suggestion importance[1-10]: 9

__

Why: This suggestion correctly identifies and fixes multiple critical syntax errors that would cause a compilation failure, making it a high-impact and necessary change.

High
Fix singular grammar in text

In the xAndNMoreUpdatesAvailable method, change the verb from "have" to "has" in
the singular case for correct subject-verb agreement.

lib/generated/app_localizations_en.dart [1248-1256]

 String xAndNMoreUpdatesAvailable(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
     other: '$p0 and $count more apps have updates.',
-    one: '$p0 and 1 more app have updates.',
+    one: '$p0 and 1 more app has updates.',
   );
   return '$_temp0';
 }

[Suggestion processed]

Suggestion importance[1-10]: 4

__

Why: The suggestion correctly identifies and fixes a grammatical error in a user-facing string, improving the overall quality of the application's text.

Low
General
Translate remaining English strings

Translate the remaining English strings in the AppLocalizationsZh class to
Chinese to ensure a fully localized user interface.

lib/generated/app_localizations_zh.dart [167-463]

 @override
-String get noAppsSubtext => 'You can add your first app by tapping on \'Add App\' below.';
+String get noAppsSubtext => '您可以点击下方“添加应用”来添加第一个应用。';
 
 @override
-String get networkError => 'Network connection failed';
+String get networkError => '网络连接失败';
 
 @override
-String get invalidUrlFormat => 'Invalid URL format';
+String get invalidUrlFormat => 'URL 格式无效';
 
 @override
-String get accessDenied => 'Access denied';
+String get accessDenied => '访问被拒绝';
 
 @override
-String get importFailed => 'Import failed';
+String get importFailed => '导入失败';

[Suggestion processed]

Suggestion importance[1-10]: 7

__

Why: The suggestion correctly points out untranslated English strings in a Chinese localization file, and fixing this improves the user experience by providing a consistent language.

Medium
Align plural and displayed counts

In clearedNLogsBeforeXAfterY, fix the pluralization logic to use the count
variable and correct the untranslated English labels in the singular form.

lib/generated/app_localizations_pt.dart [2555-2564]

 @override
 String clearedNLogsBeforeXAfterY(num count, Object n, Object before, Object after) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: 'Limpou $n registros (antes = $before, depois = $after)',
-    one: 'Limpou $n registros (before = $before, after = $after)',
+    other: 'Limpou $count registros (antes = $before, depois = $after)',
+    one: 'Limpou $count registro (antes = $before, depois = $after)',
   );
   return '$_temp0';
 }

[Suggestion processed]

Suggestion importance[1-10]: 6

__

Why: The suggestion correctly identifies and fixes two issues in the translation string: using an incorrect variable for the count and including untranslated English words.

Low
✅ Suggestions up to commit 7c0b7b1
CategorySuggestion                                                                                                                                    Impact
Possible issue
Fix plural messages to use app label
Suggestion Impact:Updated the xAndNMore... localization methods to accept an Object p0 label parameter and corrected plural messages to use p0 plus "mais count" (and fixed singular verb agreement), matching the suggested fix.

code diff:

-  String xAndNMoreUpdatesAvailable(num count) {
-    String _temp0 = intl.Intl.pluralLogic(
-      count,
-      locale: localeName,
-      other: '$count e $count outras aplicações possuem atualizações.',
-      one: '$count e uma outra aplicação possui atualizações.',
-    );
-    return '$_temp0';
-  }
-
-  @override
-  String xAndNMoreUpdatesInstalled(num count) {
-    String _temp0 = intl.Intl.pluralLogic(
-      count,
-      locale: localeName,
-      other: '$count e $count outras aplicações foram atualizadas.',
-      one: '$count e uma outra aplicação foram atualizadas.',
-    );
-    return '$_temp0';
-  }
-
-  @override
-  String xAndNMoreUpdatesFailed(num count) {
-    String _temp0 = intl.Intl.pluralLogic(
-      count,
-      locale: localeName,
-      other: 'Falha ao atualizar $count e $count outras aplicações.',
-      one: 'Falha ao atualizar $count e mais 1 aplicação.',
-    );
-    return '$_temp0';
-  }
-
-  @override
-  String xAndNMoreUpdatesPossiblyInstalled(num count) {
-    String _temp0 = intl.Intl.pluralLogic(
-      count,
-      locale: localeName,
-      other: '$count e $count outras aplicações podem ter sido atualizadas.',
-      one: '$count e uma outra aplicação podem ter sido atualizadas.',
+  String xAndNMoreUpdatesAvailable(Object p0, num count) {
+    String _temp0 = intl.Intl.pluralLogic(
+      count,
+      locale: localeName,
+      other: '$p0 e mais $count outras aplicações possuem atualizações.',
+      one: '$p0 e mais 1 outra aplicação possui atualizações.',
+    );
+    return '$_temp0';
+  }
+
+  @override
+  String xAndNMoreUpdatesInstalled(Object p0, num count) {
+    String _temp0 = intl.Intl.pluralLogic(
+      count,
+      locale: localeName,
+      other: '$p0 e mais $count outras aplicações foram atualizadas.',
+      one: '$p0 e mais 1 outra aplicação foi atualizada.',
+    );
+    return '$_temp0';
+  }
+
+  @override
+  String xAndNMoreUpdatesFailed(Object p0, num count) {
+    String _temp0 = intl.Intl.pluralLogic(
+      count,
+      locale: localeName,
+      other: 'Falha ao atualizar $p0 e mais $count outras aplicações.',
+      one: 'Falha ao atualizar $p0 e mais 1 outra aplicação.',
+    );
+    return '$_temp0';
+  }
+
+  @override
+  String xAndNMoreUpdatesPossiblyInstalled(Object p0, num count) {
+    String _temp0 = intl.Intl.pluralLogic(
+      count,
+      locale: localeName,
+      other: '$p0 e mais $count outras aplicações podem ter sido atualizadas.',
+      one: '$p0 e mais 1 outra aplicação pode ter sido atualizada.',
     );

Fix the xAndNMore... pluralization methods by adding an app label parameter and
using the count parameter correctly for the number of additional apps.

lib/generated/app_localizations_pt.dart [1247-1289]

 @override
-String xAndNMoreUpdatesAvailable(num count) {
+String xAndNMoreUpdatesAvailable(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '$count e $count outras aplicações possuem atualizações.',
-    one: '$count e uma outra aplicação possui atualizações.',
+    other: '$p0 e mais $count outras aplicações possuem atualizações.',
+    one: '$p0 e mais 1 outra aplicação possui atualizações.',
   );
   return '$_temp0';
 }
 
 @override
-String xAndNMoreUpdatesInstalled(num count) {
+String xAndNMoreUpdatesInstalled(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '$count e $count outras aplicações foram atualizadas.',
-    one: '$count e uma outra aplicação foram atualizadas.',
+    other: '$p0 e mais $count outras aplicações foram atualizadas.',
+    one: '$p0 e mais 1 outra aplicação foi atualizada.',
   );
   return '$_temp0';
 }
 
 @override
-String xAndNMoreUpdatesFailed(num count) {
+String xAndNMoreUpdatesFailed(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: 'Falha ao atualizar $count e $count outras aplicações.',
-    one: 'Falha ao atualizar $count e mais 1 aplicação.',
+    other: 'Falha ao atualizar $p0 e mais $count outras aplicações.',
+    one: 'Falha ao atualizar $p0 e mais 1 outra aplicação.',
   );
   return '$_temp0';
 }
 
 @override
-String xAndNMoreUpdatesPossiblyInstalled(num count) {
+String xAndNMoreUpdatesPossiblyInstalled(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '$count e $count outras aplicações podem ter sido atualizadas.',
-    one: '$count e uma outra aplicação podem ter sido atualizadas.',
+    other: '$p0 e mais $count outras aplicações podem ter sido atualizadas.',
+    one: '$p0 e mais 1 outra aplicação pode ter sido atualizada.',
   );
   return '$_temp0';
 }

[Suggestion processed]

Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies a bug where the count parameter is misused in pluralization strings, which would result in confusing UI text.

Medium
Remove incorrect error interpolation
Suggestion Impact:Updated `bgUpdateGotErrorRetryInMinutes` Portuguese plural strings to refer to a generic error and keep `$count` only for the retry delay in minutes, matching the suggested wording.

code diff:

@@ -1161,8 +1161,8 @@
     String _temp0 = intl.Intl.pluralLogic(
       count,
       locale: localeName,
-      other: 'A verificação de atualizações em segundo plano encontrou um $count, agendada uma nova verificação em $count minutos',
-      one: 'A verificação de atualizações em segundo plano encontrou um $count, agendada uma nova verificação em $count minuto',
+      other: 'A verificação de atualizações em segundo plano encontrou um erro; uma nova verificação será agendada em $count minutos',
+      one: 'A verificação de atualizações em segundo plano encontrou um erro; uma nova verificação será agendada em $count minuto',
     );

Correct the bgUpdateGotErrorRetryInMinutes message to describe a generic error
and use the count parameter only for the retry delay in minutes.

lib/generated/app_localizations_pt.dart [1159-1168]

 @override
 String bgUpdateGotErrorRetryInMinutes(num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: 'A verificação de atualizações em segundo plano encontrou um $count, agendada uma nova verificação em $count minutos',
-    one: 'A verificação de atualizações em segundo plano encontrou um $count, agendada uma nova verificação em $count minuto',
+    other: 'A verificação de atualizações em segundo plano encontrou um erro; uma nova verificação será agendada em $count minutos',
+    one: 'A verificação de atualizações em segundo plano encontrou um erro; uma nova verificação será agendada em $count minuto',
   );
   return '$_temp0';
 }

[Suggestion processed]

Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies a logical error in the translation string where the count variable is used incorrectly, leading to a nonsensical message.

Medium
Fix incorrect count interpolation
Suggestion Impact:The commit changed the affected localization methods to accept an additional parameter (p0) and updated the pluralized message templates to interpolate p0 for the app label and count for the remaining app count, fixing the incorrect "$count and $count more..." strings.

code diff:

-  String xAndNMoreUpdatesAvailable(num count) {
-    String _temp0 = intl.Intl.pluralLogic(
-      count,
-      locale: localeName,
-      other: '$count and $count more apps have updates.',
-      one: '$count and 1 more app have updates.',
-    );
-    return '$_temp0';
-  }
-
-  @override
-  String xAndNMoreUpdatesInstalled(num count) {
-    String _temp0 = intl.Intl.pluralLogic(
-      count,
-      locale: localeName,
-      other: '$count and $count more apps were updated.',
-      one: '$count and 1 more app was updated.',
-    );
-    return '$_temp0';
-  }
-
-  @override
-  String xAndNMoreUpdatesFailed(num count) {
-    String _temp0 = intl.Intl.pluralLogic(
-      count,
-      locale: localeName,
-      other: 'Failed to update $count and $count more apps.',
-      one: 'Failed to update $count and 1 more app.',
-    );
-    return '$_temp0';
-  }
-
-  @override
-  String xAndNMoreUpdatesPossiblyInstalled(num count) {
-    String _temp0 = intl.Intl.pluralLogic(
-      count,
-      locale: localeName,
-      other: '$count and $count more apps may have been updated.',
+  String xAndNMoreUpdatesAvailable(Object p0, num count) {
+    String _temp0 = intl.Intl.pluralLogic(
+      count,
+      locale: localeName,
+      other: '$p0 and $count more apps have updates.',
+      one: '$p0 and 1 more app have updates.',
+    );
+    return '$_temp0';
+  }
+
+  @override
+  String xAndNMoreUpdatesInstalled(Object p0, num count) {
+    String _temp0 = intl.Intl.pluralLogic(
+      count,
+      locale: localeName,
+      other: '$p0 and $count more apps were updated.',
+      one: '$p0 and 1 more app was updated.',
+    );
+    return '$_temp0';
+  }
+
+  @override
+  String xAndNMoreUpdatesFailed(Object p0, num count) {
+    String _temp0 = intl.Intl.pluralLogic(
+      count,
+      locale: localeName,
+      other: 'Failed to update $p0 and $count more apps.',
+      one: 'Failed to update $p0 and 1 more app.',
+    );
+    return '$_temp0';
+  }
+
+  @override
+  String xAndNMoreUpdatesPossiblyInstalled(Object p0, num count) {
+    String _temp0 = intl.Intl.pluralLogic(
+      count,
+      locale: localeName,
+      other: '$p0 and $count more apps may have been updated.',
+      one: '$p0 and 1 more app may have been updated.',
+    );

Update the xAndNMore... localization methods to accept an app label parameter
(p0) in addition to count. This fixes the string templates that incorrectly used
count for both the app name and the number of additional apps.

lib/generated/app_localizations_en.dart [1247-1287]

 @override
-String xAndNMoreUpdatesAvailable(num count) {
+String xAndNMoreUpdatesAvailable(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '$count and $count more apps have updates.',
-    one: '$count and 1 more app have updates.',
+    other: '$p0 and $count more apps have updates.',
+    one: '$p0 and 1 more app have updates.',
   );
   return '$_temp0';
 }
 
 @override
-String xAndNMoreUpdatesInstalled(num count) {
+String xAndNMoreUpdatesInstalled(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '$count and $count more apps were updated.',
-    one: '$count and 1 more app was updated.',
+    other: '$p0 and $count more apps were updated.',
+    one: '$p0 and 1 more app was updated.',
   );
   return '$_temp0';
 }
 
 @override
-String xAndNMoreUpdatesFailed(num count) {
+String xAndNMoreUpdatesFailed(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: 'Failed to update $count and $count more apps.',
-    one: 'Failed to update $count and 1 more app.',
+    other: 'Failed to update $p0 and $count more apps.',
+    one: 'Failed to update $p0 and 1 more app.',
   );
   return '$_temp0';
 }
 
 @override
-String xAndNMoreUpdatesPossiblyInstalled(num count) {
+String xAndNMoreUpdatesPossiblyInstalled(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '$count and $count more apps may have been updated.',
-    one: '$count and 1 more app may have been updated.',
+    other: '$p0 and $count more apps may have been updated.',
+    one: '$p0 and 1 more app may have been updated.',
   );
   return '$_temp0';
 }

[Suggestion processed]

Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies a bug in the string interpolation for pluralized messages, which would lead to nonsensical user notifications, and proposes a valid fix.

Medium
Fix broken plural notifications
Suggestion Impact:The commit updated the xAndNMore... methods to take an extra Object p0 parameter and changed the message templates to interpolate p0 for the app label and count for the number of additional apps, fixing the prior "$count and $count more" style bug.

code diff:

-  String xAndNMoreUpdatesAvailable(num count) {
-    String _temp0 = intl.Intl.pluralLogic(
-      count,
-      locale: localeName,
-      other: '$count and $count more apps have updates.',
-      one: '$count and 1 more app have updates.',
-    );
-    return '$_temp0';
-  }
-
-  @override
-  String xAndNMoreUpdatesInstalled(num count) {
-    String _temp0 = intl.Intl.pluralLogic(
-      count,
-      locale: localeName,
-      other: '$count and $count more apps were updated.',
-      one: '$count and 1 more app was updated.',
-    );
-    return '$_temp0';
-  }
-
-  @override
-  String xAndNMoreUpdatesFailed(num count) {
-    String _temp0 = intl.Intl.pluralLogic(
-      count,
-      locale: localeName,
-      other: 'Failed to update $count and $count more apps.',
-      one: 'Failed to update $count and 1 more app.',
-    );
-    return '$_temp0';
-  }
-
-  @override
-  String xAndNMoreUpdatesPossiblyInstalled(num count) {
-    String _temp0 = intl.Intl.pluralLogic(
-      count,
-      locale: localeName,
-      other: '$count and $count more apps may have been updated.',
+  String xAndNMoreUpdatesAvailable(Object p0, num count) {
+    String _temp0 = intl.Intl.pluralLogic(
+      count,
+      locale: localeName,
+      other: '$p0 and $count more apps have updates.',
+      one: '$p0 and 1 more app have updates.',
+    );
+    return '$_temp0';
+  }
+
+  @override
+  String xAndNMoreUpdatesInstalled(Object p0, num count) {
+    String _temp0 = intl.Intl.pluralLogic(
+      count,
+      locale: localeName,
+      other: '$p0 and $count more apps were updated.',
+      one: '$p0 and 1 more app was updated.',
+    );
+    return '$_temp0';
+  }
+
+  @override
+  String xAndNMoreUpdatesFailed(Object p0, num count) {
+    String _temp0 = intl.Intl.pluralLogic(
+      count,
+      locale: localeName,
+      other: 'Failed to update $p0 and $count more apps.',
+      one: 'Failed to update $p0 and 1 more app.',
+    );
+    return '$_temp0';
+  }
+
+  @override
+  String xAndNMoreUpdatesPossiblyInstalled(Object p0, num count) {
+    String _temp0 = intl.Intl.pluralLogic(
+      count,
+      locale: localeName,
+      other: '$p0 and $count more apps may have been updated.',
+      one: '$p0 and 1 more app may have been updated.',
+    );

Update the Esperanto xAndNMore... localization methods to accept an app label
parameter (p0) in addition to count. This fixes the string templates that
incorrectly used count for both the app name and the number of additional apps.

lib/generated/app_localizations_en.dart [2566-2606]

 @override
-String xAndNMoreUpdatesAvailable(num count) {
+String xAndNMoreUpdatesAvailable(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '$count kaj $count aliaj apoj havas ĝisdatigojn.',
-    one: '$count kaj 1 alia apo havas ĝisdatigojn.',
+    other: '$p0 kaj $count aliaj apoj havas ĝisdatigojn.',
+    one: '$p0 kaj 1 alia apo havas ĝisdatigojn.',
   );
   return '$_temp0';
 }
 
 @override
-String xAndNMoreUpdatesInstalled(num count) {
+String xAndNMoreUpdatesInstalled(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '$count kaj $count aliaj apoj ĝisdatiĝis.',
-    one: '$count kaj 1 alia apo ĝisdatiĝis.',
+    other: '$p0 kaj $count aliaj apoj ĝisdatiĝis.',
+    one: '$p0 kaj 1 alia apo ĝisdatiĝis.',
   );
   return '$_temp0';
 }
 
 @override
-String xAndNMoreUpdatesFailed(num count) {
+String xAndNMoreUpdatesFailed(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: 'Ne eblas ĝisdatigi $count et $count aliajn apojn.',
-    one: 'Ne eblas ĝisdatigi $count kaj 1 alian apon.',
+    other: 'Ne eblas ĝisdatigi $p0 kaj $count aliajn apojn.',
+    one: 'Ne eblas ĝisdatigi $p0 kaj 1 alian apon.',
   );
   return '$_temp0';
 }
 
 @override
-String xAndNMoreUpdatesPossiblyInstalled(num count) {
+String xAndNMoreUpdatesPossiblyInstalled(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '$count kaj $count aliaj apoj eble ĝisdatiĝis.',
-    one: '$count kaj 1 alia apo eble ĝisdatiĝis.',
+    other: '$p0 kaj $count aliaj apoj eble ĝisdatiĝis.',
+    one: '$p0 kaj 1 alia apo eble ĝisdatiĝis.',
   );
   return '$_temp0';
 }

[Suggestion processed]

Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies the same string interpolation bug from the English localizations in the Esperanto localizations, which would cause nonsensical user notifications.

Medium
Fix retry message interpolation

Fix an incorrect string interpolation in the traditional Chinese translation for
the background update error message.

lib/generated/app_localizations_zh.dart [2478-2487]

 @override
 String bgUpdateGotErrorRetryInMinutes(num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '背景更新檢查遇到 $count,將在 $count 分鐘後重新檢查',
-    one: '背景更新檢查遇到 $count,將在 $count 分鐘後重新檢查',
+    other: '背景更新檢查遇到問題,將在 $count 分鐘後重新檢查',
+    one: '背景更新檢查遇到問題,將在 $count 分鐘後重新檢查',
   );
   return '$_temp0';
 }

[Suggestion processed]

Suggestion importance[1-10]: 6

__

Why: The suggestion correctly identifies and fixes a bug in a user-facing error message for the traditional Chinese localization, which would otherwise display a nonsensical string.

Low
Keep pluralization and count consistent

In the clearedNLogsBeforeXAfterY method, ensure the same variable is used for
both pluralization logic and for displaying the number of cleared logs to
prevent grammatical errors.

lib/generated/app_localizations_pt.dart [1236-1245]

 @override
 String clearedNLogsBeforeXAfterY(num count, Object n, Object before, Object after) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: 'Foram limpos $n logs (antes = $before, depois = $after)',
-    one: 'Foi limpo $n log (antes = $before, depois = $after)',
+    other: 'Foram limpos $count logs (antes = $before, depois = $after)',
+    one: 'Foi limpo $count log (antes = $before, depois = $after)',
   );
   return '$_temp0';
 }

[Suggestion processed]

Suggestion importance[1-10]: 6

__

Why: The suggestion correctly points out a potential inconsistency between the parameter used for pluralization (count) and the one displayed (n), which could lead to grammatical errors.

Low
Remove bogus error interpolation
Suggestion Impact:The Esperanto strings for bgUpdateGotErrorRetryInMinutes were updated to remove the bogus "$count" error interpolation and to describe a generic error with retry scheduled after $count minutes (matching the suggestion intent).

code diff:

@@ -2477,10 +2479,10 @@
 
   @override
   String bgUpdateGotErrorRetryInMinutes(num count) {
-    String _temp0 = intl.Intl.pluralLogic(
-      count,
-      locale: localeName,
-      other: 'La serĉo de fonaj ĝisdatigoj renkontis al $count, nova programota provo en $count minutoj',
+      locale: localeName,
+      other: 'La serĉo de fonaj ĝisdatigoj renkontis eraron; nova provo estos programita post $count minutoj',
+      one: 'La serĉo de fonaj ĝisdatigoj renkontis eraron; nova provo estos programita post $count minuto',
+    );
       one: 'La serĉo de fonaj ĝisdatigoj renkontis al $count, nova programota provo en $count minuto',
     );
     return '$_temp0';

Fix the Esperanto localization for bgUpdateGotErrorRetryInMinutes. The current
string incorrectly interpolates the count variable as an error value; it should
be used only for the retry delay.

lib/generated/app_localizations_en.dart [2478-2487]

 @override
 String bgUpdateGotErrorRetryInMinutes(num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: 'La serĉo de fonaj ĝisdatigoj renkontis al $count, nova programota provo en $count minutoj',
-    one: 'La serĉo de fonaj ĝisdatigoj renkontis al $count, nova programota provo en $count minuto',
+    other: 'La serĉo de fonaj ĝisdatigoj renkontis eraron; nova provo estos programita post $count minutoj',
+    one: 'La serĉo de fonaj ĝisdatigoj renkontis eraron; nova provo estos programita post $count minuto',
   );
   return '$_temp0';
 }

[Suggestion processed]

Suggestion importance[1-10]: 6

__

Why: The suggestion correctly identifies a copy-paste error in the Esperanto localization string that misuses the count variable, leading to a confusing message.

Low
✅ Suggestions up to commit ecc1340
CategorySuggestion                                                                                                                                    Impact
Possible issue
Correct plural message parameters
Suggestion Impact:Updated xAndNMoreUpdatesAvailable to accept Object p0 and replaced the incorrect “$count” app label with “$p0” in the plural message strings.

code diff:

-  String xAndNMoreUpdatesAvailable(num count) {
-    String _temp0 = intl.Intl.pluralLogic(
-      count,
-      locale: localeName,
-      other: '“$count”和另外 $count 个应用可以更新了。',
-      one: '“$count”和另外 1 个应用可以更新了。',
+  String xAndNMoreUpdatesAvailable(Object p0, num count) {
+    String _temp0 = intl.Intl.pluralLogic(
+      count,
+      locale: localeName,
+      other: '“$p0”和另外 $count 个应用可以更新了。',
+      one: '“$p0”和另外 1 个应用可以更新了。',
     );
     return '$_temp0';
   }

Correct the method signature and message template for all xAndNMore... methods
in both AppLocalizationsZh and AppLocalizationsZhHantTw to accept an app label
parameter (p0) and use it correctly.

lib/generated/app_localizations_zh.dart [1247-1256]

 @override
-String xAndNMoreUpdatesAvailable(num count) {
+String xAndNMoreUpdatesAvailable(Object p0, num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '“$count”和另外 $count 个应用可以更新了。',
-    one: '“$count”和另外 1 个应用可以更新了。',
+    other: '“$p0”和另外 $count 个应用可以更新了。',
+    one: '“$p0”和另外 1 个应用可以更新了。',
   );
   return '$_temp0';
 }

[Suggestion processed]

Suggestion importance[1-10]: 8

__

Why: This suggestion correctly identifies a significant bug in multiple localization methods where the wrong variable is used, leading to nonsensical UI text, and also points out a likely method signature mismatch.

Medium
Fix missing parameter interpolation
Suggestion Impact:Updated fileDeletionError in the Traditional Chinese (Taiwan) localization to use "$p0" and improved the wording/punctuation, resolving the missing interpolation bug.

code diff:

@@ -2417,7 +2417,7 @@
 
   @override
   String fileDeletionError(Object p0) {
-    return '刪除文件失敗( 嘗試手動刪除, 然後再次嘗試 ) : “ _% ”';
+    return '刪除檔案失敗(請嘗試手動刪除後再試一次):「$p0」';
   }

Fix the fileDeletionError message in AppLocalizationsZhHantTw to correctly
interpolate the file path parameter p0 instead of showing a literal _%.

lib/generated/app_localizations_zh.dart [2418-2421]

 @override
 String fileDeletionError(Object p0) {
-  return '刪除文件失敗( 嘗試手動刪除, 然後再次嘗試 ) : “ _% ”';
+  return '刪除檔案失敗(請嘗試手動刪除後再試一次):「$p0」';
 }

[Suggestion processed]

Suggestion importance[1-10]: 7

__

Why: This is a valid bug fix for an incorrect localization string that fails to display the file path in an error message, making it unhelpful for the user.

Medium
Remove incorrect variable duplication
Suggestion Impact:Updated the Chinese localization strings in bgUpdateGotErrorRetryInMinutes to remove “$count” as the problem text, leaving only the retry-in-$count-minutes message.

code diff:

@@ -1161,8 +1161,8 @@
     String _temp0 = intl.Intl.pluralLogic(
       count,
       locale: localeName,
-      other: '后台更新检查遇到了“$count”问题,将于 $count 分钟后重试',
-      one: '后台更新检查遇到了“$count”问题,将于 $count 分钟后重试',
+      other: '后台更新检查遇到问题,将于 $count 分钟后重试',
+      one: '后台更新检查遇到问题,将于 $count 分钟后重试',
     );
     return '$_temp0';
   }

In the bgUpdateGotErrorRetryInMinutes method, remove the incorrect interpolation
of count as the "problem" value to fix the nonsensical error message.

lib/generated/app_localizations_zh.dart [1159-1168]

 @override
 String bgUpdateGotErrorRetryInMinutes(num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: '后台更新检查遇到了“$count”问题,将于 $count 分钟后重试',
-    one: '后台更新检查遇到了“$count”问题,将于 $count 分钟后重试',
+    other: '后台更新检查遇到问题,将于 $count 分钟后重试',
+    one: '后台更新检查遇到问题,将于 $count 分钟后重试',
   );
   return '$_temp0';
 }

[Suggestion processed]

Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies and fixes a bug where a variable is misused in a localization string, which would result in a confusing and grammatically incorrect message for the user.

Medium
Fix incorrect pluralized message
Suggestion Impact:Updated the pluralized message to say a generic "encountered an error" while keeping $count only for the retry delay minutes/minute.

code diff:

@@ -1161,8 +1161,8 @@
     String _temp0 = intl.Intl.pluralLogic(
       count,
       locale: localeName,
-      other: 'BG update checking encountered a $count, will schedule a retry check in $count minutes',
-      one: 'BG update checking encountered a $count, will schedule a retry check in $count minute',
+      other: 'BG update checking encountered an error; will schedule a retry check in $count minutes',
+      one: 'BG update checking encountered an error; will schedule a retry check in $count minute',

Fix the bgUpdateGotErrorRetryInMinutes message which incorrectly uses the count
variable twice. The string should be changed to report a generic error and use
count only for the retry delay.

lib/generated/app_localizations_en.dart [1159-1168]

 @override
 String bgUpdateGotErrorRetryInMinutes(num count) {
   String _temp0 = intl.Intl.pluralLogic(
     count,
     locale: localeName,
-    other: 'BG update checking encountered a $count, will schedule a retry check in $count minutes',
-    one: 'BG update checking encountered a $count, will schedule a retry check in $count minute',
+    other: 'BG update checking encountered an error; will schedule a retry check in $count minutes',
+    one: 'BG update checking encountered an error; will schedule a retry check in $count minute',
   );
   return '$_temp0';
 }
Suggestion importance[1-10]: 5

__

Why: The suggestion correctly identifies that the count variable is misused in the localization string, which would result in a confusing message for the user.

Low

Co-authored-by: qodo-free-for-open-source-projects[bot] <189517486+qodo-free-for-open-source-projects[bot]@users.noreply.github.com>
Co-authored-by: qodo-free-for-open-source-projects[bot] <189517486+qodo-free-for-open-source-projects[bot]@users.noreply.github.com>
Co-authored-by: qodo-free-for-open-source-projects[bot] <189517486+qodo-free-for-open-source-projects[bot]@users.noreply.github.com>
Co-authored-by: qodo-free-for-open-source-projects[bot] <189517486+qodo-free-for-open-source-projects[bot]@users.noreply.github.com>
Co-authored-by: qodo-free-for-open-source-projects[bot] <189517486+qodo-free-for-open-source-projects[bot]@users.noreply.github.com>
Repository owner deleted a comment from qodo-free-for-open-source-projects bot Mar 3, 2026
Co-authored-by: qodo-free-for-open-source-projects[bot] <189517486+qodo-free-for-open-source-projects[bot]@users.noreply.github.com>
Co-authored-by: qodo-free-for-open-source-projects[bot] <189517486+qodo-free-for-open-source-projects[bot]@users.noreply.github.com>
@qodo-free-for-open-source-projects

Persistent suggestions updated to latest commit 0a1a589

Co-authored-by: qodo-free-for-open-source-projects[bot] <189517486+qodo-free-for-open-source-projects[bot]@users.noreply.github.com>
Co-authored-by: qodo-free-for-open-source-projects[bot] <189517486+qodo-free-for-open-source-projects[bot]@users.noreply.github.com>
Co-authored-by: qodo-free-for-open-source-projects[bot] <189517486+qodo-free-for-open-source-projects[bot]@users.noreply.github.com>
Co-authored-by: qodo-free-for-open-source-projects[bot] <189517486+qodo-free-for-open-source-projects[bot]@users.noreply.github.com>
Co-authored-by: qodo-free-for-open-source-projects[bot] <189517486+qodo-free-for-open-source-projects[bot]@users.noreply.github.com>
Co-authored-by: qodo-free-for-open-source-projects[bot] <189517486+qodo-free-for-open-source-projects[bot]@users.noreply.github.com>
Co-authored-by: qodo-free-for-open-source-projects[bot] <189517486+qodo-free-for-open-source-projects[bot]@users.noreply.github.com>
@qodo-free-for-open-source-projects

Persistent suggestions updated to latest commit 1b117c4

Co-authored-by: qodo-free-for-open-source-projects[bot] <189517486+qodo-free-for-open-source-projects[bot]@users.noreply.github.com>
@omeritzics omeritzics closed this Mar 3, 2026
@omeritzics omeritzics deleted the feature/migrate-to-flutter-localization branch March 3, 2026 09:00
@omeritzics
Copy link
Owner Author

Related: #255

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant