Skip to content

WEB-521 fix(i18n): add missing translations and apply translate pipes across …#2934

Merged
IOhacker merged 1 commit intoopenMF:devfrom
shubhamkumar9199:fix/i18n-global
Dec 26, 2025
Merged

WEB-521 fix(i18n): add missing translations and apply translate pipes across …#2934
IOhacker merged 1 commit intoopenMF:devfrom
shubhamkumar9199:fix/i18n-global

Conversation

@shubhamkumar9199
Copy link
Contributor

@shubhamkumar9199 shubhamkumar9199 commented Dec 26, 2025

…web-app

This pr
Applied global i18n fixes across the web-app to ensure UI strings are translated correctly.
WEB-521

Please make sure these boxes are checked before submitting your pull request - thanks!

  • If you have multiple commits please combine them into one commit by squashing them.

  • Read and understood the contribution guidelines at web-app/.github/CONTRIBUTING.md.

Summary by CodeRabbit

  • New Features

    • Expanded i18n: many placeholders, labels, filters, breadcrumbs and tab messages now use translation keys; large additions/normalizations across locale files (new placeholders, weekdays, password policy texts, transfer/client labels, etc.).
  • Bug Fixes

    • Fixed typo in bulk-import display name ("Reccuring" → "Recurring").
  • Style

    • Yes/No display pipe made impure to support dynamic translation updates.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Dec 26, 2025

Note

.coderabbit.yaml has unrecognized properties

CodeRabbit is using all valid settings from your configuration. Unrecognized properties (listed below) have been ignored and may indicate typos or deprecated fields that can be removed.

⚠️ Parsing warnings (1)
Validation error: Unrecognized key(s) in object: 'pre_merge_checks'
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Walkthrough

Replaces many hard-coded UI strings with translation bindings, adds TranslateService/TranslatePipe usage in some components, marks YesnoPipe as impure, fixes a breadcrumb typo, updates a bulk-import name, and adds extensive translation entries across 13 locale JSON files.

Changes

Cohort / File(s) Summary
Template localization
src/app/account-transfers/list-standing-instructions/list-standing-instructions.component.html, src/app/account-transfers/make-account-transfers/make-account-transfers.component.html, src/app/centers/centers.component.html, src/app/clients/client-stepper/client-family-members-step/client-family-member-dialog/client-family-member-dialog.component.html, src/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.html, src/app/clients/clients-view/family-members-tab/add-family-member/add-family-member.component.html, src/app/clients/clients-view/family-members-tab/edit-family-member/edit-family-member.component.html, src/app/clients/clients.component.html, src/app/clients/edit-client/edit-client.component.html, src/app/groups/groups.component.html, src/app/shared/file-upload/file-upload.component.html, src/app/shared/tabs/entity-notes-tab/entity-notes-tab.component.html, src/app/system/manage-jobs/cob-workflow/loan-locked/loan-locked.component.html
Replaced hard-coded placeholders, titles, aria-labels and empty-state strings with translation bindings (`{{ '...'
Accounting filters
src/app/accounting/search-journal-entry/search-journal-entry.component.html, src/app/accounting/search-journal-entry/search-journal-entry.component.ts
Display now uses `
Loan UI / translation pipe
src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.html, src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.ts, src/app/loans/loans-view/account-details/account-details.component.html, src/app/loans/loans-view/general-tab/general-tab.component.html
Added TranslatePipe to component imports and applied translateKey: 'catalogs' / translate tokens to several displayed values and connector text.
Organization components & data
src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.html, src/app/organization/bulk-import/view-bulk-import/bulk-imports.ts, src/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.html, src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/*.ts, src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/*.ts, src/app/organization/password-preferences/password-preferences.component.html, src/app/organization/working-days/working-days.component.html, src/app/organization/organization-routing.module.ts
Templates switched to translation keys for headings/labels; loan-provisioning components inject/use TranslateService for runtime labels; fixed typo in BulkImports name for recurring deposits.
Breadcrumbs & role formatting
src/app/core/shell/breadcrumb/breadcrumb.component.ts, src/app/system/roles-and-permissions/view-role/view-role.component.ts
Breadcrumb labels now resolved via TranslateService for certain action/menu items; role name formatting attempts catalog translation first and added a falsy-input guard.
Yes/No pipe
src/app/pipes/yesno.pipe.ts
Marked YesnoPipe impure (pure: false) to enable re-evaluation on language changes (transform implementation unchanged).
Account transfers UI (interbank/non-interbank)
src/app/account-transfers/make-account-transfers/... (templates)
Localized placeholders for phone, date, client/account selection, amount, description across interbank and non-interbank flows.
Translation assets (13 locales)
src/assets/translations/{cs-CS,de-DE,en-US,es-CL,es-MX,fr-FR,it-IT,ko-KO,lt-LT,lv-LV,ne-NE,pt-PT,sw-SW}.json
Large additions/normalizations: new keys (Edit Criteria Definition, FromAccountId, FromClientId, EnterAmount, EnterPhoneNumber, EnterTransferDescription, SelectDate, Optional, NoFileSelected, NoNotesAvailable, passwordPreferences, weekdays, many capitalization variants and catalog entries) to support UI localization across locales.

Sequence Diagram(s)

(Skipped — changes are presentation/i18n updates without new multi-component control flow.)

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • IOhacker
  • alberto-art3ch
  • gkbishnoi07

Pre-merge checks and finishing touches

❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Title check ❓ Inconclusive The title partially captures the main change—it addresses i18n fixes—but is incomplete and vague, truncating with '…' and failing to convey the full scope of the work. Complete the title by specifying the key areas affected (e.g., 'fix(i18n): add missing translations and apply translate pipes across components and languages').
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 8

♻️ Duplicate comments (1)
src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.html (1)

70-70: Same translation key coverage concern as lines 5-7.

This uses the same dynamic key construction pattern. Ensure all bulk import types have corresponding translation entries.

🧹 Nitpick comments (22)
src/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.html (1)

5-5: Good localization change! Consider property binding for consistency.

The placeholder text is now properly localized, which aligns well with the i18n improvements across the application.

For better consistency with Angular best practices, consider using property binding instead of attribute interpolation:

🔎 Optional refactor to use property binding
-      <textarea formControlName="note" matInput placeholder="{{ 'labels.text.Write a note' | translate }}"></textarea>
+      <textarea formControlName="note" matInput [placeholder]="'labels.text.Write a note' | translate"></textarea>

Property binding is slightly more efficient and more idiomatic in Angular templates.

src/assets/translations/sw-SW.json (2)

548-610: Verify the dual capitalization pattern for catalog keys.

Many keys have been added with both capitalized and lowercase variants (e.g., Account_transfer and account_transfer, Cash_mgmt and cash_mgmt). While this might be intentional to support different UI contexts, please confirm:

  1. Is this duplication necessary, or can the UI be refactored to use a single case convention?
  2. Are there plans to maintain both variants going forward?
  3. Consider documenting this pattern in the codebase if it's a deliberate design decision.

This pattern increases maintenance overhead as both variants need to be kept in sync.


860-864: Consider shortening password preference translations for better UI display.

The password preference messages are quite lengthy (121-202 characters). For example:

  • Line 862: "Password must be at least 6 characters, no more than 50 characters long..." (202 characters)
  • Line 863: "Password must be 12 to 50 characters long, containing at least..." (183 characters)

Long strings may cause UI display issues such as:

  • Text overflow in dialog boxes
  • Poor mobile responsiveness
  • Difficulty reading on smaller screens

Consider breaking these into shorter, more digestible messages or using progressive disclosure (e.g., showing detailed requirements only when the password field is focused).

src/app/system/roles-and-permissions/view-role/view-role.component.ts (1)

179-202: Consider optimizing formatName calls within the loop.

The method is called on every iteration in the @for loop at line 33 of the template ({{ formatName(grouping) }}). Since formatName invokes translateService.instant() synchronously on each call, this executes repeatedly during change detection cycles and could impact performance with many groupings.

Consider one of these approaches:

  • Cache translated values in the component
  • Convert to a pure pipe for the transformation
  • Memoize translation results
src/app/clients/client-stepper/client-family-members-step/client-family-member-dialog/client-family-member-dialog.component.html (1)

49-53: Consider tracking by ID for better performance.

The @for loops currently track by object reference. Tracking by unique identifiers (e.g., track relation.id) provides better change detection performance and prevents unnecessary re-renders when the object reference changes but the data remains the same.

🔎 Proposed refactor
-        @for (relation of data.options.relationshipIdOptions; track relation) {
+        @for (relation of data.options.relationshipIdOptions; track relation.id) {
           <mat-option [value]="relation.id">
             {{ relation.name | translateKey: 'catalogs' }}
           </mat-option>
         }

...

-        @for (gender of data.options.genderIdOptions; track gender) {
+        @for (gender of data.options.genderIdOptions; track gender.id) {
           <mat-option [value]="gender.id">
             {{ gender.name | translateKey: 'catalogs' }}
           </mat-option>
         }

...

-        @for (profession of data.options.professionIdOptions; track profession) {
+        @for (profession of data.options.professionIdOptions; track profession.id) {
           <mat-option [value]="profession.id">
             {{ profession.name | translateKey: 'catalogs' }}
           </mat-option>
         }

...

-        @for (maritalStatus of data.options.maritalStatusIdOptions; track maritalStatus) {
+        @for (maritalStatus of data.options.maritalStatusIdOptions; track maritalStatus.id) {
           <mat-option [value]="maritalStatus.id">
             {{ maritalStatus.name | translateKey: 'catalogs' }}
           </mat-option>
         }

As per coding guidelines, trackBy should be verified for *ngFor (and @for) loops.

Also applies to: 66-70, 83-88, 94-98

src/app/clients/clients-view/family-members-tab/edit-family-member/edit-family-member.component.html (1)

48-52: Consider tracking by ID for better performance.

The @for loops currently track by object reference. Tracking by unique identifiers (e.g., track relation.id) provides better change detection performance and prevents unnecessary re-renders.

🔎 Proposed refactor
-          @for (relation of addFamilyMemberTemplate.relationshipIdOptions; track relation) {
+          @for (relation of addFamilyMemberTemplate.relationshipIdOptions; track relation.id) {
             <mat-option [value]="relation.id">
               {{ relation.name | translateKey: 'catalogs' }}
             </mat-option>
           }

...

-          @for (gender of addFamilyMemberTemplate.genderIdOptions; track gender) {
+          @for (gender of addFamilyMemberTemplate.genderIdOptions; track gender.id) {
             <mat-option [value]="gender.id">
               {{ gender.name | translateKey: 'catalogs' }}
             </mat-option>
           }

...

-          @for (profession of addFamilyMemberTemplate.professionIdOptions; track profession) {
+          @for (profession of addFamilyMemberTemplate.professionIdOptions; track profession.id) {
             <mat-option [value]="profession.id">
               {{ profession.name | translateKey: 'catalogs' }}
             </mat-option>
           }

...

-          @for (maritalStatus of addFamilyMemberTemplate.maritalStatusIdOptions; track maritalStatus) {
+          @for (maritalStatus of addFamilyMemberTemplate.maritalStatusIdOptions; track maritalStatus.id) {
             <mat-option [value]="maritalStatus.id">
               {{ maritalStatus.name | translateKey: 'catalogs' }}
             </mat-option>
           }

As per coding guidelines, trackBy should be verified for Angular loops.

Also applies to: 65-69, 82-87, 93-98

src/app/clients/clients-view/family-members-tab/add-family-member/add-family-member.component.html (3)

11-11: Placeholders duplicate labels—consider removing or making them more helpful.

The placeholders repeat the same text as the <mat-label> elements (e.g., both show "First Name"). Placeholders are typically used to provide example values or additional hints, not to duplicate the label. Consider either removing these redundant placeholders or replacing them with example values.

Example refactor
         <input
           formControlName="firstName"
           required
           matInput
           aria-label="First Name"
-          placeholder="{{ 'labels.inputs.First Name' | translate }}"
           title="First Name"
         />

Alternatively, provide example values:

-          placeholder="{{ 'labels.inputs.First Name' | translate }}"
+          placeholder="e.g., John"

Also applies to: 28-28, 40-40, 57-57, 71-71


10-12: Consider translating aria-label and title attributes for full i18n coverage.

The aria-label and title attributes remain hard-coded in English while the rest of the UI is translated. For complete internationalization and accessibility, these attributes should also use translation pipes to ensure screen readers and tooltips display content in the user's selected language.

Example refactor
         <input
           formControlName="firstName"
           required
           matInput
-          aria-label="First Name"
+          [attr.aria-label]="'labels.inputs.First Name' | translate"
           placeholder="{{ 'labels.inputs.First Name' | translate }}"
-          title="First Name"
+          [attr.title]="'labels.inputs.First Name' | translate"
         />

Apply similar changes to all other inputs with hard-coded aria-label and title attributes.

Also applies to: 27-29, 39-41, 56-58, 70-72, 144-145


83-87: Consider tracking by ID for better performance.

The @for loops currently track by object reference. Tracking by unique identifiers (e.g., track relation.id) provides better change detection performance and prevents unnecessary re-renders.

🔎 Proposed refactor
-          @for (relation of addFamilyMemberTemplate.relationshipIdOptions; track relation) {
+          @for (relation of addFamilyMemberTemplate.relationshipIdOptions; track relation.id) {
             <mat-option [value]="relation.id">
               {{ relation.name | translateKey: 'catalogs' }}
             </mat-option>
           }

...

-          @for (gender of addFamilyMemberTemplate.genderIdOptions; track gender) {
+          @for (gender of addFamilyMemberTemplate.genderIdOptions; track gender.id) {
             <mat-option [value]="gender.id">
               {{ gender.name | translateKey: 'catalogs' }}
             </mat-option>
           }

...

-          @for (profession of addFamilyMemberTemplate.professionIdOptions; track profession) {
+          @for (profession of addFamilyMemberTemplate.professionIdOptions; track profession.id) {
             <mat-option [value]="profession.id">
               {{ profession.name | translateKey: 'catalogs' }}
             </mat-option>
           }

...

-          @for (maritalStatus of addFamilyMemberTemplate.maritalStatusIdOptions; track maritalStatus) {
+          @for (maritalStatus of addFamilyMemberTemplate.maritalStatusIdOptions; track maritalStatus.id) {
             <mat-option [value]="maritalStatus.id">
               {{ maritalStatus.name | translateKey: 'catalogs' }}
             </mat-option>
           }

As per coding guidelines, trackBy should be verified for Angular loops.

Also applies to: 100-104, 117-121, 128-132

src/assets/translations/de-DE.json (1)

564-564: Consider using "Sammelblatt" instead of "Sammlungsblatt".

The term "Sammlungsblatt" is technically correct, but "Sammelblatt" is more commonly used in German financial/business contexts for "Collection sheet" and would be more natural for users.

🔎 Suggested terminology improvement
-      "Collection_sheet": "Sammlungsblatt",
+      "Collection_sheet": "Sammelblatt",
src/assets/translations/it-IT.json (1)

2627-2627: Menu label “Change Loan Officer” – optional wording tweak

Current translation “Cambiare l'ufficiale di prestito” is clear enough, but you might consider “Cambia addetto al prestito” or “Cambia responsabile del prestito” for slightly more natural Italian. This is purely stylistic; no functional impact.

src/assets/translations/es-MX.json (1)

853-863: Keep passwordPreferences keys exactly consistent across locales

The new passwordPreferences messages and their Spanish translations look fine, but the keys are long English phrases (e.g., "Password most be at least 1 character and not more that 50 characters long"). Any variation of spelling or spacing in other locale files or in the frontend code (for example, using must instead of most) would break lookups.

If possible in future work, consider normalizing these to shorter, stable key IDs (e.g., passwordPreferences.minLength, passwordPreferences.strongPolicy, etc.) and mapping them from code, to reduce the chance of subtle key mismatches across locales.

src/assets/translations/fr-FR.json (4)

545-605: Catalog key variants look good; consider capitalization consistency for “Transfert de compte”

The added catalog variants (e.g. Account_transfer/account_transfer, Accounting/accounting, Cash_mgmt/cash_mgmt, etc.) are correctly mapped and the French terms are appropriate.

Minor nit: you now have both “Transfert de Compte” (lines 548–549) and “Transfert de compte” (line 614) for similar concepts. Consider standardizing one style (probably “Transfert de compte”) for consistency.


609-636: New catalog entries for Group/Savings/Share/TPT look reasonable

  • "Group": "Groupe" and "Savings Account": "Compte d'épargne" align with other uses in the file.
  • "SHAREACCOUNT" / "SHAREPRODUCT" translations are clear.
  • "SSBENEFICIARYTPT": "Bénéficiaires TPT Service Autoservice" is understandable but a bit heavy; something like “Bénéficiaires TPT en libre-service” might read more naturally in French if you revisit wording later.

1966-1970: “Manual/System Entries” are fine; optional style tweak

"Manual Entries": "Entrées Manuelles" and "System Entries": "Entrées Système" are understandable.

If you want more idiomatic French and alignment with most other labels, you could de‑capitalize the adjectives:

-"Manual Entries": "Entrées Manuelles",
-"System Entries": "Entrées Système",
+"Manual Entries": "Entrées manuelles",
+"System Entries": "Entrées système",

2949-2952: “Enter…” prompts are OK; “Saisir …” would be more idiomatic

The three added prompts:

  • EnterAmount
  • EnterPhoneNumber
  • EnterTransferDescription

are correctly understandable as “Entrer …”. In French UI, “Saisir …” is usually more natural:

-"EnterAmount": "Entrer le montant",
-"EnterPhoneNumber": "Entrer le numéro de téléphone",
-"EnterTransferDescription": "Entrer la description du transfert",
+"EnterAmount": "Saisir le montant",
+"EnterPhoneNumber": "Saisir le numéro de téléphone",
+"EnterTransferDescription": "Saisir la description du transfert",
src/app/shared/tabs/entity-notes-tab/entity-notes-tab.component.html (1)

35-75: Empty-state message correctly localized

Using labels.text.NoNotesAvailable for the no-notes state is correct and the @for loop already has a track clause as per guidelines. You may optionally localize the “Created by”, “Edit note”, and “Delete” strings later for full coverage.

src/app/core/shell/breadcrumb/breadcrumb.component.ts (1)

173-190: Action breadcrumb translation logic is sound, with safe fallback

The new labels.menus.* lookup is guarded and only overrides breadcrumbLabel when a real translation is found (instant result differs from the key), so existing labels are preserved if a key is missing. The composite condition correctly scopes this to account-action routes.

If this list of route titles grows further, consider extracting the “is account-actions breadcrumb” check into a small helper for readability.

src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.ts (1)

35-36: TranslateService-based labels are wired correctly; consider deduping shared form-field factory

Using TranslateService.instant for the dialog title and all definition form-field labels is consistent with how these dynamic fields are built, and the labels.inputs.* keys line up with the translation data.

Since getDefinitionFormFields in this edit component and the create component are effectively identical (including translation keys), you may want to extract a shared helper or service to avoid drift between them over time.

Also applies to: 68-69, 158-233

src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.ts (1)

35-36: Create flow i18n matches edit flow; shared helper would reduce duplication

The create component’s usage of TranslateService.instant for the Edit Definition dialog title and field labels aligns with the edit component, so users get consistent localized text in both flows.

As with the edit component, consider centralizing the shared getDefinitionFormFields logic (including translation keys) to avoid future inconsistencies between create/edit implementations.

Also applies to: 68-69, 148-225

src/app/pipes/yesno.pipe.ts (1)

5-5: Consider the performance implications of the impure pipe.

Making this pipe impure (pure: false) means it will be re-evaluated on every change detection cycle across the entire application. While this ensures the pipe responds to language changes, it can impact performance—especially if YesnoPipe is used frequently across multiple templates.

For a simple boolean-to-string transformation, the performance impact may be acceptable. However, if you notice performance degradation, consider alternative patterns such as:

  • Using observables with the async pipe in templates
  • Component-level subscriptions to TranslateService.onLangChange to update bound properties
  • Exploring Angular signals for reactive i18n (if your Angular version supports it)
src/app/clients/clients.component.html (1)

7-7: Use property binding instead of interpolation for the placeholder attribute.

The translation key 'labels.text.SearchByClient' exists in all locale files and TranslatePipe is properly imported. However, Angular best practice is to use property binding [placeholder] instead of string interpolation for binding attributes:

-          placeholder="{{ 'labels.text.SearchByClient' | translate }}"
+          [placeholder]="'labels.text.SearchByClient' | translate"
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b096389 and 4437244.

📒 Files selected for processing (42)
  • src/app/account-transfers/list-standing-instructions/list-standing-instructions.component.html
  • src/app/account-transfers/make-account-transfers/make-account-transfers.component.html
  • src/app/accounting/search-journal-entry/search-journal-entry.component.html
  • src/app/accounting/search-journal-entry/search-journal-entry.component.ts
  • src/app/centers/centers.component.html
  • src/app/clients/client-stepper/client-family-members-step/client-family-member-dialog/client-family-member-dialog.component.html
  • src/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.html
  • src/app/clients/clients-view/family-members-tab/add-family-member/add-family-member.component.html
  • src/app/clients/clients-view/family-members-tab/edit-family-member/edit-family-member.component.html
  • src/app/clients/clients.component.html
  • src/app/clients/edit-client/edit-client.component.html
  • src/app/core/shell/breadcrumb/breadcrumb.component.ts
  • src/app/groups/groups.component.html
  • src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.html
  • src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.ts
  • src/app/loans/loans-view/account-details/account-details.component.html
  • src/app/loans/loans-view/general-tab/general-tab.component.html
  • src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.html
  • src/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.html
  • src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.ts
  • src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.ts
  • src/app/organization/organization-routing.module.ts
  • src/app/organization/password-preferences/password-preferences.component.html
  • src/app/organization/working-days/working-days.component.html
  • src/app/pipes/yesno.pipe.ts
  • src/app/shared/file-upload/file-upload.component.html
  • src/app/shared/tabs/entity-notes-tab/entity-notes-tab.component.html
  • src/app/system/manage-jobs/cob-workflow/loan-locked/loan-locked.component.html
  • src/app/system/roles-and-permissions/view-role/view-role.component.ts
  • src/assets/translations/cs-CS.json
  • src/assets/translations/de-DE.json
  • src/assets/translations/en-US.json
  • src/assets/translations/es-CL.json
  • src/assets/translations/es-MX.json
  • src/assets/translations/fr-FR.json
  • src/assets/translations/it-IT.json
  • src/assets/translations/ko-KO.json
  • src/assets/translations/lt-LT.json
  • src/assets/translations/lv-LV.json
  • src/assets/translations/ne-NE.json
  • src/assets/translations/pt-PT.json
  • src/assets/translations/sw-SW.json
💤 Files with no reviewable changes (1)
  • src/app/clients/edit-client/edit-client.component.html
🧰 Additional context used
📓 Path-based instructions (1)
src/app/**

⚙️ CodeRabbit configuration file

src/app/**: For Angular code: verify component separation, trackBy on *ngFor,
strict type safety, and clean observable patterns.

Files:

  • src/app/clients/clients-view/family-members-tab/edit-family-member/edit-family-member.component.html
  • src/app/clients/clients.component.html
  • src/app/clients/client-stepper/client-family-members-step/client-family-member-dialog/client-family-member-dialog.component.html
  • src/app/account-transfers/make-account-transfers/make-account-transfers.component.html
  • src/app/pipes/yesno.pipe.ts
  • src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.html
  • src/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.html
  • src/app/core/shell/breadcrumb/breadcrumb.component.ts
  • src/app/organization/password-preferences/password-preferences.component.html
  • src/app/organization/working-days/working-days.component.html
  • src/app/groups/groups.component.html
  • src/app/loans/loans-view/general-tab/general-tab.component.html
  • src/app/centers/centers.component.html
  • src/app/account-transfers/list-standing-instructions/list-standing-instructions.component.html
  • src/app/organization/organization-routing.module.ts
  • src/app/shared/file-upload/file-upload.component.html
  • src/app/clients/clients-view/family-members-tab/add-family-member/add-family-member.component.html
  • src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.html
  • src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.ts
  • src/app/system/roles-and-permissions/view-role/view-role.component.ts
  • src/app/shared/tabs/entity-notes-tab/entity-notes-tab.component.html
  • src/app/system/manage-jobs/cob-workflow/loan-locked/loan-locked.component.html
  • src/app/loans/loans-view/account-details/account-details.component.html
  • src/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.html
  • src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.ts
  • src/app/accounting/search-journal-entry/search-journal-entry.component.html
  • src/app/accounting/search-journal-entry/search-journal-entry.component.ts
  • src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.ts
🧠 Learnings (1)
📚 Learning: 2025-12-09T14:24:31.429Z
Learnt from: alberto-art3ch
Repo: openMF/web-app PR: 2876
File: src/app/loans/loans-view/loan-account-actions/loan-reaging/loan-reaging.component.ts:91-94
Timestamp: 2025-12-09T14:24:31.429Z
Learning: In the LoanReagingComponent (src/app/loans/loans-view/loan-account-actions/loan-reaging/loan-reaging.component.ts), the transactionAmount field uses both Validators.min and Validators.max set to the same value (loanTransactionData.amount). This is intentional - it requires users to enter the exact amount as a confirmation/validation step before submitting the re-age operation.

Applied to files:

  • src/app/account-transfers/make-account-transfers/make-account-transfers.component.html
  • src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.ts
  • src/app/loans/loans-view/account-details/account-details.component.html
  • src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.ts
🔇 Additional comments (60)
src/assets/translations/sw-SW.json (1)

1-3808: Translation file additions look structurally sound.

The additions to this Swahili translation file include:

  • ✅ Valid JSON syntax with proper escaping
  • ✅ Placeholder variables (e.g., {{params[0].value}}, {{id}}) are correctly preserved
  • ✅ Comprehensive coverage of new UI elements (breadcrumbs, labels, inputs, menus, etc.)
  • ✅ Consistent terminology (e.g., "LOAN_PROVISIONING" → "Utoaji wa Mkopo" used consistently)

The additions support the i18n improvements mentioned in the PR objectives. However, consider:

  1. Getting these translations reviewed by a native Swahili speaker to ensure accuracy and natural phrasing
  2. Testing the UI with these translations to verify all strings display correctly without truncation
  3. Documenting any special conventions (like the capitalization variants) in a translation guide

Based on the PR objectives, these comprehensive i18n additions align well with ensuring UI strings are translated correctly across the application.

src/app/system/manage-jobs/cob-workflow/loan-locked/loan-locked.component.html (1)

6-10: LGTM! Placeholder successfully localized.

The translation pipe is correctly applied to the input placeholder, making this field i18n-ready. The implementation is consistent with the existing pattern used for attribute bindings elsewhere in the template (e.g., matTooltip on lines 69, 77).

src/assets/translations/pt-PT.json (5)

548-610: LGTM! Comprehensive catalog translations added.

The additions include both capitalized and lowercase variants of catalog keys (e.g., Account_transfer and account_transfer), which is appropriate for supporting different display contexts throughout the UI. All Portuguese translations appear accurate and well-formed.


798-810: LGTM! Day names and payment adjustment terms properly translated.

The day names (Monday-Sunday) and payment date adjustment terms (e.g., "move to next working day") are accurately translated to Portuguese and will properly support loan scheduling and payment features.


860-864: LGTM! Password validation messages properly localized.

The new passwordPreferences section provides clear Portuguese translations for three different password complexity levels. The messages appropriately describe character requirements, special character rules, and length constraints.


2949-2951: LGTM! UI placeholders and labels properly localized.

The additions include well-translated Portuguese text for:

  • Form input placeholders (EnterAmount, EnterPhoneNumber, EnterTransferDescription)
  • Search functionality (SearchByName, SearchByClient, SearchByExternalID)
  • Filter options (FilterByLoanIdOrError)
  • Field labels (FromAccountId, FromClientId)
  • Status messages (NoFileSelected, NoNotesAvailable)
  • Selection prompts (SelectDate, SelectOrTypeClientName)

All translations are clear, consistent, and appropriate for their UI context.

Also applies to: 3052-3052, 3074-3075, 3169-3170, 3185-3185, 3253-3261


418-418: LGTM! Additional UI labels properly translated.

The remaining additions include:

  • Button labels: "Edit Criteria Definition"
  • Journal entry types: "Manual Entries" vs "System Entries"
  • Menu items: "Change Loan Officer"
  • Field labels: "ClientName"

All translations accurately convey the intended meaning in Portuguese.

Also applies to: 1966-1969, 2626-2627, 2856-2856

src/app/organization/password-preferences/password-preferences.component.html (2)

6-6: LGTM: Proper use of track in @for.

The @for control flow correctly includes a track expression, which is essential for efficient rendering and avoiding unnecessary DOM updates.


8-10: The component correctly imports the translateKey pipe through STANDALONE_SHARED_IMPORTS, which includes TranslatePipe from @pipes/translate.pipe. The pipe is properly defined with the name 'translateKey' and is configured as a standalone pipe. No import issues exist.

src/assets/translations/de-DE.json (5)

860-864: Password preferences translations look good.

The new passwordPreferences section provides clear, grammatically correct German translations for password validation requirements. The compound sentence structure is appropriate for German and maintains clarity despite the complexity of the requirements.


2948-2950: Input field translations are appropriate and user-friendly.

The placeholder text translations use proper German imperative forms (e.g., "Betrag eingeben", "Telefonnummer eingeben") which are natural and clear for users. The "Von" preposition in ID fields correctly indicates the source/origin.

Also applies to: 3073-3074


3168-3169: Status message translations are clear and appropriate.

These empty-state messages use natural German phrasing that clearly communicates the absence of files or notes to the user.


799-810: Day names and scheduling terminology are correctly translated.

The day names follow proper German capitalization conventions, and the scheduling terms use appropriate business/financial terminology with correct verb placement for German compound infinitives.


418-418: New entity and feature translations are contextually appropriate.

The additions for "Edit Criteria Definition", share account types (SHAREACCOUNT, SHAREPRODUCT), and LOAN_PROVISIONING provide proper German business/financial terminology. The translation "Begünstigte TPT Selbstbedienung" for SSBENEFICIARYTPT maintains the acronym "TPT" which appears to be a system-specific term.

Also applies to: 633-635, 710-710

src/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.html (1)

11-11: Consistency concern: consider translating other dropdown values in this form.

The translateKey pipe is available through STANDALONE_SHARED_IMPORTS and correctly transforms entity names using the 'catalogs' group. However, only entity names at line 11 are translated, while status names (line 28), data table names (line 45), and product names (lines 63 and 82) are not. For a uniform i18n implementation, consider applying the same translation pattern to these other dropdown values.

src/assets/translations/it-IT.json (5)

418-418: Button label translation for “Edit Criteria Definition” looks good

The Italian string “Modifica Definizione Criteri” is clear and aligned with nearby “Edit …” button labels; no functional or i18n issues spotted.


548-605: Catalog / enum / scheduling labels: consistent additions

The new catalog keys (e.g., Account_transfer/account_transfer, various module names, transaction types, and LOAN_PROVISIONING) and the weekday/scheduling options are translated consistently and match existing style. No key/JSON issues or obvious semantic mismatches detected.

Also applies to: 608-610, 633-636, 710-710, 798-810


854-864: Password-related commons string and passwordPreferences block

The added every translation and the three password policy messages in passwordPreferences are accurate and clearly describe the rules in Italian. Since the keys here are full English sentences, please double‑check they exactly match the keys used in the English/base locale and in any backend responses, as even minor differences would prevent lookups from resolving.


1966-1969: “Manual/System Entries” accounting labels translated correctly

The new labels “Inserimenti Manuali” and “Inserimenti di Sistema” are understandable in context and match surrounding accounting terminology; structure and casing are consistent with nearby entries.


2856-2856: New helper texts and placeholders read naturally

The added client-name/ID search labels, “Enter…” prompts, “No file/notes” messages, “Optional” flag, and select/date client prompts are idiomatic Italian and consistent with the rest of the UI copy. No key naming or JSON issues spotted.

Also applies to: 2950-2952, 3053-3053, 3074-3075, 3169-3170, 3185-3185, 3253-3255, 3260-3261

src/app/accounting/search-journal-entry/search-journal-entry.component.ts (1)

94-107: entryTypeFilterData now correctly uses i18n keys

Switching option from hard-coded labels to labels.inputs.* keys is consistent with the translations (es-MX has "All", "Manual Entries", "System Entries" under labels.inputs). Just make sure:

  • The template renders option via the translate pipe (not as a raw string).
  • All supported locales define these three keys under labels.inputs so the dropdown stays complete.
src/assets/translations/es-MX.json (1)

418-419: Overall es-MX i18n additions look structurally sound and consistent

  • The new button/catalog/menu/heading/input/text keys are valid JSON, correctly nested, and align with the existing naming scheme (e.g., LOAN_PROVISIONING, weekday names, “same day”/“move to next working day”, search helpers, empty-state texts).
  • Newly added labels.inputs.Manual Entries and labels.inputs.System Entries entries line up with the TS change in SearchJournalEntryComponent, so this locale will render those filters correctly.
  • The new search- and transfer-related helper texts (EnterAmount, EnterPhoneNumber, EnterTransferDescription, SearchByName, SearchByClient, SearchByExternalID, FilterByLoanIdOrError, SelectDate, SelectOrTypeClientName, NoFileSelected, NoNotesAvailable, Optional) are clear and appropriate for es-MX.

No blocking issues from a JSON or i18n-structure standpoint.

Please double-check that the same keys (including exact spelling/casing) exist and are translated in all other locale JSONs touched by this PR so runtime lookups don’t silently fall back to English or show raw keys.

Also applies to: 548-552, 570-572, 574-581, 583-585, 598-604, 633-636, 709-810, 853-863, 1966-1969, 2630-2630, 2858-2858, 2951-2956, 3055-3056, 3076-3077, 3171-3172, 3187-3187

src/assets/translations/lt-LT.json (1)

1-3811: LGTM! Translation additions are well-structured.

The new Lithuanian translation entries follow the existing file patterns correctly:

  • The new passwordPreferences section (lines 860-864) is properly nested under labels
  • Capitalization variants for catalog entries (e.g., Account_transfer/account_transfer) support flexible UI rendering
  • Day names, scheduling phrases, and search placeholders are consistently translated
  • JSON structure remains valid with proper nesting and syntax
src/assets/translations/cs-CS.json (7)

418-418: Button label translations look good

The translations for "Edit Criteria Definition" and "Change Loan Officer" are grammatically correct and consistent with the rest of the Czech translations in the file.

Also applies to: 627-627


799-810: Day names and scheduling translations are correct

The Czech day names (pondělí, úterý, středa, etc.) are properly translated in lowercase, which is correct for Czech. The scheduling-related phrases are also grammatically accurate.


860-864: Password validation translations are accurate, but note English source typo

The Czech translations for password validation rules are grammatically correct and clear. However, there's a typo in the English source key on line 861:

"Password most be at least 1 character..." 

Should be "must be" instead of "most be". The Czech translation correctly uses "musí" (must), so the translation is accurate despite the English typo. Consider fixing the English key if possible.

The English source typo should be corrected in the English locale file if this hasn't been addressed already.


1966-1966: Manual and System entry labels are correctly translated

"Ruční záznamy" (Manual Entries) and "Systémové záznamy" (System Entries) are accurate and consistent with the accounting terminology used throughout the file.

Also applies to: 1969-1969


2947-2950: Form field and search translations are well done

All the new placeholder and search-related translations (EnterAmount, SearchByName, SelectDate, etc.) are grammatically correct and use appropriate Czech UI conventions. The imperative verb forms (Zadejte, Vyberte, Filtrovat) are properly used for user instructions.

Also applies to: 3052-3052, 3073-3074, 3167-3169, 3184-3184, 3252-3255, 3258-3259


854-854: Remaining translations are accurate

The translations for "every" (každý) and "ClientName" (Jméno klienta) are correct and consistent with Czech grammar and the terminology used throughout the file.

Also applies to: 2855-2855


548-610: Czech translation capitalization does not follow standard grammar rules

You're correct that catalog entries in the Czech translation use title case (e.g., "Datová Tabulka", "Účetnictví", "Převod Účtu") which capitalizes every word. In standard Czech, only the first word should be capitalized unless it's a proper noun.

However, this capitalization pattern appears intentional and consistent throughout the file—both the PascalCase and lowercase key variants map to the same capitalized translation. The same approach is used across all language files (English uses "Data Table", German uses "Datentabelle", etc.).

If this title case styling is meant for UI display purposes (menu items, category labels), verify that:

  • This matches the project's localization style guide
  • It's intentional for visual distinction in the interface
  • The same convention is applied consistently across all Czech translations

If strict Czech grammar rules should be followed, consider standardizing to sentence case: "datová tabulka", "účetnictví", "převod účtu".

src/assets/translations/fr-FR.json (6)

418-423: New button label translation looks correct

"Edit Criteria Definition": "Modifier la définition des critères" is accurate and consistent with other button labels.


798-811: Day names and business‑day handling options look correct

The added keys for day names and payment‑shift behavior (MondaySunday, “same day”, “move to next working day”, etc.) are correctly translated and consistent with existing uppercase weekday entries.


854-864: Commons “every” and passwordPreferences translations are accurate

  • "every": "chaque" matches how it’s used in surrounding validation fragments.
  • New passwordPreferences messages are clearly translated and faithfully capture the English constraints (length, character classes, no spaces/repeats).

3053-3076: Filter and “From…Id” labels look good

  • "FilterByLoanIdOrError": "Filtrer par ID de prêt ou erreur" matches the key semantics.
  • "FromAccountId" / "FromClientId" translations are clear and technically accurate.

No issues from an i18n standpoint.


3168-3185: Empty‑state and “Optional” labels are fine

  • "NoFileSelected" and "NoNotesAvailable" are correctly rendered.
  • "Optional": "Optionnel" is understandable and consistent with how it’s likely used in forms.

Nothing to block here.


3252-3260: Search/selection helper texts are well translated

The added helper labels (SearchByName, SearchByClient, SearchByExternalID, SelectDate, SelectOrTypeClientName) are accurate and consistent with the rest of the FR locale.

src/assets/translations/lv-LV.json (5)

548-605: Catalog capitalization variants look consistent.

The paired capitalization entries (e.g., Account_transfer/account_transfer, Authorisation/authorisation) provide case-insensitive lookup support. This pattern is applied consistently across all added catalog entries.


860-864: New passwordPreferences object provides password policy translations.

The nested structure cleanly separates password policy messages from other labels. The translations describe common password requirements (length, character types, no spaces).


798-810: Days of week and scheduling phrases added.

The day names use lowercase which differs from the uppercase format in the catalogs section (lines 755-761 have MONDAY, TUESDAY, etc.). Verify this is intentional for different UI contexts.


2949-2951: Placeholder and search text keys use camelCase convention.

Keys like EnterAmount, FromAccountId, NoFileSelected, SearchByName, and SelectDate follow a camelCase pattern. This is consistent across the added keys and matches the pattern used in other locale files mentioned in the AI summary.

Also applies to: 3074-3075, 3169-3170, 3253-3260


1-3810: Overall LGTM for Latvian translation expansion.

The translation file expansion follows established patterns and includes comprehensive coverage of new UI strings for:

  • Password preferences
  • Catalog capitalization variants
  • Placeholder texts
  • Days of week
  • Search/filter labels

The JSON structure is valid and the keys are organized consistently within their respective sections.

src/assets/translations/ko-KO.json (1)

418-418: New Korean translations align with template usages

The added keys (e.g., Edit Criteria Definition, Account_transfer variants, LOAN_PROVISIONING, weekdays & payment‑day rules, Manual Entries/System Entries, EnterAmount/EnterPhoneNumber/EnterTransferDescription, ClientName, FromAccountId, FromClientId, NoFileSelected, NoNotesAvailable, Optional, SearchBy*, SelectDate, SelectOrTypeClientName) are structurally correct and match the Angular templates that were updated to use them. Just ensure the same keys exist consistently in all other locale JSON files so users don’t see raw keys in non‑Korean locales.

Also applies to: 548-605, 710-711, 798-811, 854-864, 860-864, 1967-1971, 2949-2951, 3052-3053, 3074-3075, 3169-3171, 3185-3185, 3253-3255, 3260-3261

src/app/shared/file-upload/file-upload.component.html (1)

3-8: Localized file-upload placeholder looks good

Using {{ 'labels.text.NoFileSelected' | translate }} for the readonly input placeholder is correct and consistent with the other i18n changes; just confirm labels.text.NoFileSelected is present in all locale files.

src/app/organization/organization-routing.module.ts (1)

551-557: Breadcrumb typo fix is correct

Updating the bulk-loan route title/breadcrumb to “Bulk Loan Reassignment” fixes the spelling without affecting routing behavior.

src/app/centers/centers.component.html (1)

5-9: Search placeholders correctly localized

Switching the two search inputs to labels.text.SearchByName and labels.text.SearchByExternalID via the translate pipe is consistent with the rest of the app’s i18n. Verify these keys are defined across all locales.

src/app/accounting/search-journal-entry/search-journal-entry.component.html (1)

19-22: Ensure entryTypeFilterData.option values are translation keys

Rendering {{ filter.option | translate }} is correct provided every filter.option is now an i18n key (e.g. labels.inputs.All, labels.inputs.Manual Entries, labels.inputs.System Entries) and not already‑translated text. That matches the AI summary and the new labels.inputs.* keys in the JSON; just confirm the TS data was fully updated.

src/app/account-transfers/list-standing-instructions/list-standing-instructions.component.html (1)

18-23: Standing-instruction filter placeholders localized correctly

The three placeholders now use labels.text.ClientName, labels.text.FromClientId, and labels.text.FromAccountId, which aligns with the new translation keys and keeps the filtering behavior unchanged.

Also applies to: 40-42

src/app/account-transfers/make-account-transfers/make-account-transfers.component.html (1)

51-63: Transfer-form placeholders and readonly field labels correctly localized

All newly translated placeholders (EnterPhoneNumber, SelectDate, SelectOrTypeClientName, EnterAmount, EnterTransferDescription) and readonly field placeholders (Bank, Client, Account Type, Account) are wired consistently with the existing reactive form and interbank logic, without changing validation behavior.

Also applies to: 93-113, 131-138, 187-199, 212-227, 237-257, 259-287, 289-309, 329-343

src/app/loans/loans-view/account-details/account-details.component.html (1)

13-14: Repayments line i18n update looks correct

Localizing “every” via labels.commons.every and using &nbsp; before the frequency label keeps spacing/layout intact while enabling translation.

src/assets/translations/es-CL.json (1)

545-612: New translation entries align with recently introduced UI keys

The added entries for:

  • labels.catalogs/labels.menus (e.g., "Change Loan Officer")
  • labels.commons.every
  • input/help strings (EnterAmount, EnterPhoneNumber, EnterTransferDescription, SearchByName, SearchByClient, SearchByExternalID, SelectDate, SelectOrTypeClientName, FilterByLoanIdOrError)

all correspond cleanly to the new or updated usages in the TS/HTML changes and will support the new i18n behavior without breaking existing keys.

No structural JSON issues are apparent in the modified regions.

Also applies to: 2602-2719, 2949-2951, 3053-3056, 3253-3261

src/assets/translations/en-US.json (3)

549-613: Good pattern: case-variant catalog entries for flexible lookups.

The addition of both uppercase and lowercase variants (e.g., Account_transfer/account_transfer, Cash_mgmt/cash_mgmt) provides flexibility for case-insensitive key lookups across the application. This is a sensible approach for i18n consistency.


801-813: LGTM: Day names and working day phrases.

The day name translations and working day action phrases (same day, move to next working day, etc.) are correctly added and will support localization of scheduling features.


2958-2960: LGTM: Form placeholder and label translations.

The new placeholder translations (EnterAmount, EnterPhoneNumber, SelectDate, SearchByName, etc.) follow a consistent naming convention and provide appropriate user-facing text for form inputs and search fields.

Also applies to: 3061-3061, 3083-3084, 3262-3263, 3278-3278, 3353-3362

src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.ts (1)

26-26: LGTM!

The addition of TranslatePipe is correctly implemented. The import is properly declared and added to the component's standalone imports array, enabling translation functionality in the template.

Also applies to: 57-58

src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.html (1)

190-192: LGTM!

The translation pipe chains are correctly implemented. The pattern of using find to extract catalog values followed by translateKey: 'catalogs' to translate them is consistent and appropriate for enabling i18n on these catalog fields.

Also applies to: 201-201, 233-233, 291-291

src/app/loans/loans-view/general-tab/general-tab.component.html (1)

32-32: No action required. All translation keys for the dynamic key construction (labels.inputs.Principal, labels.inputs.Interest, labels.inputs.Fees, labels.inputs.Penalties, labels.inputs.Total) are present in the translation files.

Likely an incorrect or invalid review comment.

src/app/organization/working-days/working-days.component.html (1)

12-12: The translateKey pipe is properly configured and translation keys are in place.

The additions of translateKey: 'catalogs' for both weekDays[i].name and repaymentRescheduleType.value are correct:

  • The TranslatePipe (named translateKey) is included in STANDALONE_SHARED_IMPORTS
  • The weekDays array contains translation key values ('Monday', 'Tuesday', 'Wednesday', etc.) that match the labels.catalogs.* keys in all translation files
  • The pipe properly handles language reactivity with subscriptions
  • The pattern is consistent with the rest of the codebase
src/assets/translations/ne-NE.json (3)

1-3810: LGTM - Comprehensive translation additions!

This translation file demonstrates a substantial and well-structured expansion of the Nepali (ne-NE) locale. The additions align perfectly with the PR objectives of applying global i18n fixes:

✅ JSON syntax is valid throughout
✅ All new translation keys mentioned in the summary are present
✅ Password preferences section (lines 860-864) provides clear validation messages
✅ UI localization blocks for filters, searches, and placeholders are complete
✅ Day names and time-related translations are properly added
✅ No empty translation values or English placeholders detected
✅ Consistent UTF-8 encoding for Nepali text

The extensive additions significantly improve internationalization coverage across the application.


860-864: Excellent password validation message additions

The new passwordPreferences section provides clear, comprehensive password validation messages in Nepali:

  • Character length requirements (1-50 characters)
  • Moderate complexity (6+ chars with uppercase, lowercase, numeric)
  • Strong complexity (12-50 chars with uppercase, lowercase, numeric, special, no spaces/repeating chars)

These translations will significantly improve the user experience for Nepali-speaking users by providing clear guidance on password requirements.


2948-2950: Well-structured UI placeholder translations

The addition of input placeholders and helper text translations enhances the user interface for Nepali users:

  • Form input placeholders (EnterAmount, EnterPhoneNumber, EnterTransferDescription)
  • Filter/search helpers (FilterByLoanIdOrError, SearchByName, SearchByClient)
  • Status messages (NoFileSelected, NoNotesAvailable)
  • Date/selection helpers (SelectDate, SelectOrTypeClientName)

These additions follow a consistent naming convention and provide clear guidance for form interactions.

Also applies to: 3051-3052, 3168-3169, 3252-3255, 3259-3260

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 5

♻️ Duplicate comments (3)
src/assets/translations/fr-FR.json (1)

548-553: Catalog and scheduling labels: casing variants and working‑day texts look consistent

The new catalog entries (e.g. Account_transfer/account_transfer, accounting, Cash_mgmt, Datatable, Externalservices, Interop, Investor, Loan_product_attribute, etc.), share-account constants, LOAN_PROVISIONING, and the added weekday/working‑day adjustment phrases are all translated consistently and will cover different case/underscore variants from the backend. "every": "chaque" is also correct for composing phrases such as “Repaid every …”. This also resolves the earlier review note on LOAN_PROVISIONING now reading “Provision de prêt”.

Also applies to: 563-605, 633-635, 710-710, 798-810, 854-854

src/assets/translations/en-US.json (1)

864-868: Past issue appears resolved.

The passwordPreferences section has been added and the translation keys look correct. The past review comment mentioned typos ("most" → "must", "that" → "than") in line 865, but the current code uses correct spelling: "Password must be at least 1 character and not more than 50 characters long". The issue appears to have been addressed.

All three password policy strings are grammatically correct and clearly communicate the password requirements.

src/app/organization/bulk-import/view-bulk-import/bulk-imports.ts (1)

81-81: Recurring deposit bulk‑import name typo fixed to match translations

The name value is now "Recurring Deposit Accounts", which aligns with the labels.heading.Recurring Deposit Accounts translation key used by the template, so the heading will localize instead of falling back to a raw key. This addresses the earlier review’s mismatch between the bulk‑import name and the i18n keys.

🧹 Nitpick comments (12)
src/app/clients/clients-view/family-members-tab/add-family-member/add-family-member.component.html (1)

11-11: Consider removing redundant placeholders.

These placeholders duplicate the mat-label content, which is redundant in Material Design. When the label floats on focus, the placeholder and label show the same text. Placeholders are typically reserved for format hints (e.g., "MM/DD/YYYY") or additional context like "Optional" (line 143).

Example refactor
         <input
           formControlName="firstName"
           required
           matInput
           [attr.aria-label]="'labels.inputs.First Name' | translate"
-          [placeholder]="'labels.inputs.First Name' | translate"
           [title]="'labels.inputs.First Name' | translate"
         />

Note: Line 143 should keep its placeholder since it provides additional context ("Optional").

Also applies to: 28-28, 40-40, 57-57, 71-71

src/app/accounting/search-journal-entry/search-journal-entry.component.ts (1)

94-107: Consider adding explicit type for entryTypeFilterData.

The entryTypeFilterData array currently has an implicit any[] type. For better type safety and code maintainability, consider defining an interface:

interface EntryTypeFilter {
  option: string;
  value: string | boolean;
}

Then declare the array as:

-  entryTypeFilterData = [
+  entryTypeFilterData: EntryTypeFilter[] = [

This provides better IntelliSense support and catches potential type errors at compile time.

src/app/account-transfers/make-account-transfers/make-account-transfers.component.html (1)

60-60: i18n placeholders are correctly wired; consider also localizing title attributes

The new placeholders all point to labels.text.* keys that exist in the translations and match the field semantics. To fully localize these inputs, you could also move the adjacent title="..." strings (e.g. “Phone number”, “Client name”, “Transfer amount”, “Transfer description”, “Transaction Date”) to translation keys and use the translate pipe there as well.

Also applies to: 102-102, 136-136, 194-194, 219-219, 246-246, 305-305, 335-335

src/assets/translations/de-DE.json (3)

584-585: Korrigieren Sie die Zusammensetzung des Substantivs (Correct compound noun formatting).

Im Deutschen werden zusammengesetzte Substantive entweder zusammengeschrieben oder mit Bindestrich geschrieben, nicht mit Leerzeichen getrennt. "Darlehen Neuplanung" sollte als "Darlehensneuplanung" oder "Darlehens-Neuplanung" geschrieben werden.

In German, compound nouns should be written together or hyphenated, not separated by spaces.

🔎 Korrekturvorschlag (Suggested correction)
-    "Loan_reschedule": "Darlehen Neuplanung",
-    "loan_reschedule": "Darlehen Neuplanung",
+    "Loan_reschedule": "Darlehensneuplanung",
+    "loan_reschedule": "Darlehensneuplanung",

590-591: Verwenden Sie Bindestriche für zusammengesetzte Fremdwörter (Use hyphens for compound loan words).

Bei Zusammensetzungen mit Fremdwörtern wie "Portfolio" ist ein Bindestrich im Deutschen üblich und verbessert die Lesbarkeit.

When composing loan words like "Portfolio" with German words, hyphens are conventional and improve readability in German.

🔎 Korrekturvorschlag (Suggested correction)
-    "portfolio_center": "Portfolio Zentrum",
-    "portfolio_group": "Portfolio Gruppe",
+    "portfolio_center": "Portfolio-Zentrum",
+    "portfolio_group": "Portfolio-Gruppe",

604-605: Bindestrich bei Akronym-Zusammensetzungen erforderlich (Hyphen required for acronym compounds).

Bei der Zusammensetzung von Akronymen mit deutschen Wörtern sollte ein Bindestrich verwendet werden: "XBRL-Zuordnung" statt "XBRL Zuordnung".

When composing acronyms with German words, a hyphen should be used.

🔎 Korrekturvorschlag (Suggested correction)
-    "Xbrlmapping": "XBRL Zuordnung",
-    "xbrlmapping": "XBRL Zuordnung",
+    "Xbrlmapping": "XBRL-Zuordnung",
+    "xbrlmapping": "XBRL-Zuordnung",
src/assets/translations/es-MX.json (1)

859-863: Consider reviewing password validation message lengths for UI compatibility.

The password validation messages, particularly lines 861-862, are quite lengthy (220-280 characters). While comprehensive user guidance is valuable, ensure these strings are properly handled in the UI to avoid layout issues in password forms or validation dialogs.

If these messages will be displayed inline or in tooltips, consider:

  • Testing with the actual UI components to verify proper wrapping/display
  • Potentially breaking them into separate bullet points if the UI supports it
  • Ensuring mobile responsiveness with these longer strings
src/assets/translations/en-US.json (1)

3062-3062: Minor capitalization inconsistency in filter text.

In the filter placeholders, there's slight inconsistency in capitalization:

  • Line 3062: "Filter by loan Id or error" (lowercase "loan")
  • Line 3354: "Search by client name, external Id" (lowercase "client", capitalized "Id")

While other parts of the translation file typically capitalize entity names like "Loan" and "Client", these filters use lowercase. This might be intentional for a more casual placeholder tone, but it's worth verifying consistency with the app's style guide.

Also note: "Id" vs "ID" capitalization varies throughout (e.g., "external Id" vs "Client ID" elsewhere).

Also applies to: 3354-3356

src/assets/translations/ko-KO.json (3)

2949-2952: Inconsistent key naming: camelCase format deviates from established conventions.

Several translation keys use camelCase format (e.g., EnterAmount, SearchByName, NoFileSelected, FromAccountId) while the rest of the file consistently uses space-separated or hyphenated formats (e.g., "Account Number", "Client Name").

This inconsistency may indicate:

  • Copy-paste errors from code identifiers
  • Keys that might be displayed raw to users if lookups fail
  • Reduced maintainability and searchability

Consider standardizing these to match the existing convention (e.g., EnterAmountEnter Amount or using proper translation key paths).

Affected keys

Lines 2949-2952:

  • EnterAmount
  • EnterPhoneNumber
  • EnterTransferDescription

Lines 3052-3053:

  • FilterByLoanIdOrError

Lines 3169-3170:

  • NoFileSelected
  • NoNotesAvailable

Lines 3253-3261:

  • SearchByName
  • SearchByClient
  • SearchByExternalID
  • SelectDate
  • SelectOrTypeClientName

Lines 3075-3076:

  • FromAccountId
  • FromClientId

Also applies to: 3052-3053, 3169-3170, 3253-3261, 3075-3076


860-864: Consider UI implications of lengthy password preference strings.

The passwordPreferences section contains very long translations (130-150+ characters), particularly for complex password rules. While the translations appear accurate, such lengthy strings may cause:

  • Layout overflow in dialogs, tooltips, or form labels
  • Poor mobile user experience
  • Reduced scannability

Consider whether these should be:

  • Displayed as bulleted lists instead of single strings
  • Shown in expandable sections
  • Split into multiple shorter messages

This is especially relevant for line 863 (~150 characters) which combines multiple password requirements into a single sentence.


548-610: Review necessity of case-variant duplicate keys in catalogs section.

Multiple catalog entries exist with only casing differences, each with identical translations:

  • Account_transfer and account_transfer (lines 548-549)
  • Authorisation and authorisation (lines 552-553)
  • Cash_mgmt and cash_mgmt (lines 562-563)
  • Similar patterns for ~15 other entries

While this might be intentional to support case-insensitive lookups or different naming conventions across the codebase, it:

  • Doubles the maintenance burden
  • Could indicate inconsistent key naming practices
  • May confuse future maintainers

Consider verifying whether both variants are actually used, or if the codebase could standardize on a single casing convention.

src/assets/translations/ne-NE.json (1)

3071-3072: Optional: Consider consistent key naming convention

Several translation keys use PascalCase or camelCase (e.g., FromAccountId, FromClientId, NoNotesAvailable, SearchByName, SelectDate) while most other keys in the file use lowercase or kebab-case patterns.

While this isn't incorrect, consistent naming conventions make the translation file easier to maintain and search. Consider standardizing to one convention (e.g., all lowercase with underscores or all camelCase).

Also applies to: 3167-3167, 3250-3253, 3257-3258

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4437244 and 21b3824.

📒 Files selected for processing (43)
  • src/app/account-transfers/list-standing-instructions/list-standing-instructions.component.html
  • src/app/account-transfers/make-account-transfers/make-account-transfers.component.html
  • src/app/accounting/search-journal-entry/search-journal-entry.component.html
  • src/app/accounting/search-journal-entry/search-journal-entry.component.ts
  • src/app/centers/centers.component.html
  • src/app/clients/client-stepper/client-family-members-step/client-family-member-dialog/client-family-member-dialog.component.html
  • src/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.html
  • src/app/clients/clients-view/family-members-tab/add-family-member/add-family-member.component.html
  • src/app/clients/clients-view/family-members-tab/edit-family-member/edit-family-member.component.html
  • src/app/clients/clients.component.html
  • src/app/clients/edit-client/edit-client.component.html
  • src/app/core/shell/breadcrumb/breadcrumb.component.ts
  • src/app/groups/groups.component.html
  • src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.html
  • src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.ts
  • src/app/loans/loans-view/account-details/account-details.component.html
  • src/app/loans/loans-view/general-tab/general-tab.component.html
  • src/app/organization/bulk-import/view-bulk-import/bulk-imports.ts
  • src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.html
  • src/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.html
  • src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.ts
  • src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.ts
  • src/app/organization/organization-routing.module.ts
  • src/app/organization/password-preferences/password-preferences.component.html
  • src/app/organization/working-days/working-days.component.html
  • src/app/pipes/yesno.pipe.ts
  • src/app/shared/file-upload/file-upload.component.html
  • src/app/shared/tabs/entity-notes-tab/entity-notes-tab.component.html
  • src/app/system/manage-jobs/cob-workflow/loan-locked/loan-locked.component.html
  • src/app/system/roles-and-permissions/view-role/view-role.component.ts
  • src/assets/translations/cs-CS.json
  • src/assets/translations/de-DE.json
  • src/assets/translations/en-US.json
  • src/assets/translations/es-CL.json
  • src/assets/translations/es-MX.json
  • src/assets/translations/fr-FR.json
  • src/assets/translations/it-IT.json
  • src/assets/translations/ko-KO.json
  • src/assets/translations/lt-LT.json
  • src/assets/translations/lv-LV.json
  • src/assets/translations/ne-NE.json
  • src/assets/translations/pt-PT.json
  • src/assets/translations/sw-SW.json
💤 Files with no reviewable changes (1)
  • src/app/clients/edit-client/edit-client.component.html
🚧 Files skipped from review as they are similar to previous changes (20)
  • src/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.html
  • src/app/shared/tabs/entity-notes-tab/entity-notes-tab.component.html
  • src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.ts
  • src/app/core/shell/breadcrumb/breadcrumb.component.ts
  • src/app/clients/client-stepper/client-family-members-step/client-family-member-dialog/client-family-member-dialog.component.html
  • src/app/centers/centers.component.html
  • src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.ts
  • src/app/organization/password-preferences/password-preferences.component.html
  • src/app/clients/clients-view/family-members-tab/edit-family-member/edit-family-member.component.html
  • src/app/shared/file-upload/file-upload.component.html
  • src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.ts
  • src/app/accounting/search-journal-entry/search-journal-entry.component.html
  • src/app/organization/working-days/working-days.component.html
  • src/app/system/manage-jobs/cob-workflow/loan-locked/loan-locked.component.html
  • src/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.html
  • src/app/organization/organization-routing.module.ts
  • src/app/loans/loans-view/account-details/account-details.component.html
  • src/app/account-transfers/list-standing-instructions/list-standing-instructions.component.html
  • src/app/groups/groups.component.html
  • src/app/system/roles-and-permissions/view-role/view-role.component.ts
🧰 Additional context used
📓 Path-based instructions (1)
src/app/**

⚙️ CodeRabbit configuration file

src/app/**: For Angular code: verify component separation, trackBy on *ngFor,
strict type safety, and clean observable patterns.

Files:

  • src/app/accounting/search-journal-entry/search-journal-entry.component.ts
  • src/app/clients/clients.component.html
  • src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.html
  • src/app/loans/loans-view/general-tab/general-tab.component.html
  • src/app/organization/bulk-import/view-bulk-import/bulk-imports.ts
  • src/app/account-transfers/make-account-transfers/make-account-transfers.component.html
  • src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.html
  • src/app/clients/clients-view/family-members-tab/add-family-member/add-family-member.component.html
  • src/app/pipes/yesno.pipe.ts
🧠 Learnings (1)
📚 Learning: 2025-12-09T14:24:31.429Z
Learnt from: alberto-art3ch
Repo: openMF/web-app PR: 2876
File: src/app/loans/loans-view/loan-account-actions/loan-reaging/loan-reaging.component.ts:91-94
Timestamp: 2025-12-09T14:24:31.429Z
Learning: In the LoanReagingComponent (src/app/loans/loans-view/loan-account-actions/loan-reaging/loan-reaging.component.ts), the transactionAmount field uses both Validators.min and Validators.max set to the same value (loanTransactionData.amount). This is intentional - it requires users to enter the exact amount as a confirmation/validation step before submitting the re-age operation.

Applied to files:

  • src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.html
  • src/app/account-transfers/make-account-transfers/make-account-transfers.component.html
🔇 Additional comments (47)
src/app/clients/clients.component.html (1)

7-7: LGTM! Correct i18n implementation.

The placeholder text has been properly internationalized using the translate pipe. The syntax is correct and consistent with other translations throughout the template.

src/app/pipes/yesno.pipe.ts (2)

4-4: Impure pipe approach is acceptable for this use case.

Making the pipe impure ensures it re-evaluates when the language changes, which is correct for i18n. While impure pipes have a performance cost (evaluated on every change detection cycle), this is acceptable for a simple yes/no translation pipe that won't be used excessively.


8-14: LGTM!

The transform logic correctly handles null values and uses the appropriate translation keys for yes/no values.

src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.html (1)

190-193: Code looks good. The translation keys for catalog amortization types, interest calculation periods, transaction processing strategies, and days in month are already defined in all 13 locale files, and both the find and translateKey pipes are properly imported and implemented.

src/app/loans/loans-view/general-tab/general-tab.component.html (1)

32-32: No changes required. The ele.property is always defined and all required translation keys exist.

The property field is typed as required (not optional) in the component and is populated with hardcoded values ('Principal', 'Interest', 'Fee', 'Penalty', 'Total'). These translation keys all exist in the locale files under labels.inputs, so the dynamic key construction is safe and will produce valid translation keys without risk of undefined or malformed values.

src/app/accounting/search-journal-entry/search-journal-entry.component.ts (1)

94-107: Translation keys are correctly defined in all locale files and template properly uses the translate pipe.

The three translation keys (labels.inputs.All, labels.inputs.Manual Entries, labels.inputs.System Entries) are present in all 13 locale JSON files, and the template at line 21 correctly applies the translate pipe: {{ filter.option | translate }}. Implementation is correct.

src/app/account-transfers/make-account-transfers/make-account-transfers.component.html (1)

260-266: Readonly interbank detail fields use consistent translations

The added readonly matInput fields for Bank, Client, Account Type, and Account correctly re-use existing labels.inputs.* keys for both labels and placeholders, which keeps the interbank view consistent with the rest of the form. Using [readonly]="true" is appropriate here so values remain part of the reactive form while being non-editable.

Also applies to: 270-276, 284-284, 290-296

src/assets/translations/fr-FR.json (2)

418-418: New French UI strings read naturally and align with template usage

The added/updated labels ("Edit Criteria Definition", "Change Loan Officer", ClientName, the various Enter* prompts, search helpers, “No file selected / No notes available”, “Optional”, and date/client-name search texts) are idiomatic French and match how they’re consumed in templates such as make-account-transfers.component.html. No JSON-structure issues spotted for these keys.

Also applies to: 2627-2627, 2856-2856, 2949-2951, 3053-3053, 3074-3075, 3168-3169, 3184-3184, 3252-3255, 3258-3259


1966-1966: “Manual/System Entries” translations are fine

The new "Manual Entries""Entrées Manuelles" and "System Entries""Entrées Système" labels are clear and consistent with existing surrounding terminology.

Also applies to: 1969-1969

src/assets/translations/lt-LT.json (3)

418-418: Translation looks good.

The translation "Redaguoti kriterijų apibrėžimą" is grammatically correct and consistent with other "Edit" button translations in the file.


548-605: Verify intentional duplication of catalog entries.

Many catalog entries have both capitalized and lowercase versions with identical translations (e.g., "Account_transfer" and "account_transfer" both → "Sąskaitos Perkėlimas").

Please confirm whether:

  1. This duplication is intentional to support different UI contexts
  2. The translations should maintain consistent capitalization, or
  3. One version should use lowercase/sentence case in Lithuanian

Examples:

  • Lines 548-549: Account_transfer / account_transfer
  • Lines 551: accounting
  • Lines 562-563: Cash_mgmt / cash_mgmt
  • Lines 570-571: Datatable / datatable

860-864: New translation entries look good.

The newly added translations are clear, grammatically correct, and user-friendly:

  • Password preferences (lines 860-864): Clear security requirement messages
  • UI prompts (lines 2948-2951, 3075-3076, 3169-3170, 3253-3261): Well-translated user interface text
  • Optional label (line 3186): Correctly translated as "Neprivaloma"

All entries maintain consistency with existing translation patterns in the file.

Also applies to: 2948-2951, 3075-3076, 3169-3170, 3186-3186, 3253-3261

src/assets/translations/es-CL.json (2)

977-977: LGTM! Past review issue resolved.

The missing labels.heading.Edit Criteria Definition key has been properly added with the correct Spanish translation "Editar Definición de Criterios". This resolves the past review comment and ensures the provisioning criteria dialog titles will display correctly.


548-609: Excellent translation additions!

The new translation entries are well-executed:

  • Catalog entries provide comprehensive coverage for UI categorization
  • Day names and scheduling options are properly translated
  • The passwordPreferences section offers clear, user-friendly validation messages
  • UI strings like "Optional", "NoFileSelected", and search placeholders are appropriate for Chilean Spanish

The translations maintain consistency with the existing file structure and quality standards.

Also applies to: 797-809, 854-863, 1966-1969, 2628-2628, 2857-2862, 3054-3054, 3076-3077, 3170-3171, 3186-3186

src/assets/translations/es-MX.json (1)

1-3813: Translation file expansion looks good.

The additions significantly expand i18n coverage with:

  • New translation keys for UI strings across multiple modules
  • Capitalized variants for naming convention consistency (lines 548-609)
  • Day-of-week names and scheduling options (lines 797-809)
  • Password validation content (lines 859-863)
  • Various form labels and dialog contexts

The JSON structure is valid, translations are appropriate for Spanish (Mexico), and the changes align with the global i18n fixes described in the PR objectives.

src/assets/translations/lv-LV.json (3)

548-605: LGTM - Intentional catalog entry pattern

The catalog entries with both capitalized and lowercase variants (e.g., "Account_transfer" and "account_transfer") appear to be an intentional design pattern to support the i18n system's lookup mechanism across different UI contexts. The Latvian translations are consistent and well-formed.


799-810: LGTM - Day names and scheduling translations

The Latvian translations for day names (pirmdiena, otrdiena, etc.) and scheduling options are accurate and follow proper Latvian grammar conventions.


2856-2857: LGTM - UI placeholder translations

The placeholder and label translations are well-crafted using proper Latvian imperative forms (e.g., "Ievadiet summu" for "Enter Amount") and maintain consistency with good UI/UX practices.

Also applies to: 2949-2952

src/assets/translations/cs-CS.json (4)

548-610: Translation keys follow a consistent dual-case pattern.

The addition of both capitalized and lowercase variants (e.g., Account_transfer/account_transfer, Authorisation/authorisation) is consistent with the existing pattern in the codebase, enabling case-insensitive translation lookups. The Czech translations appear appropriate.


798-810: Day names and workflow phrases added correctly.

The day translations (Monday-Sunday in lowercase) and workflow action phrases (same day, move to next working day, etc.) are properly added. These support i18n for scheduling and calendar features.


860-864: Password preferences translations are comprehensive.

The passwordPreferences block includes all three password validation rule translations. The Czech text accurately conveys the password requirements (minimum length, character requirements, no spaces/consecutive repeating characters).


2947-2949: UI placeholder and label translations added.

New translations for form inputs and placeholders (EnterAmount, EnterPhoneNumber, FromAccountId, NoFileSelected, Optional, SearchByName, etc.) are correctly added to support the i18n pipeline across the application.

Also applies to: 3072-3073, 3167-3168, 3183-3183, 3252-3258

src/assets/translations/en-US.json (3)

549-607: LGTM - Catalog translations are well-structured.

The catalog section includes both lowercase and capitalized key variants (e.g., "account_transfer" and "Account_transfer"), which is a good i18n pattern to support different UI contexts. All display values are consistently formatted with proper title case ("Account Transfer", "Cash Management", "External Services", etc.).

The comprehensive coverage of catalog items (transactions, jobs, portfolios, reports, etc.) aligns well with the PR's goal of applying global i18n fixes.


801-813: LGTM - Days and scheduling options are clearly defined.

The new translations for days of the week and repayment scheduling options ("same day", "move to next working day", "move to next repayment meeting day", etc.) are grammatically correct and provide clear guidance for users configuring payment schedules.


419-419: New UI labels are grammatically correct and clear.

The newly added labels across various sections are well-written:

  • "Edit Criteria Definition" (line 419) - clear action label
  • "Manual Entries" / "System Entries" (lines 1972-1975) - good distinction between entry types
  • "Change Loan Officer" (line 2635) - clear menu action

These additions enhance the UI's clarity and support the broader i18n effort.

Also applies to: 1972-1975, 2635-2635

src/assets/translations/pt-PT.json (10)

418-418: LGTM! New translation added correctly.

The translation for "Edit Criteria Definition" follows the existing pattern for edit buttons and uses consistent terminology.


548-610: Good addition of capitalization variants for catalog keys.

The addition of both capitalized and lowercase variants (e.g., Account_transfer and account_transfer) with identical Portuguese translations improves i18n key lookup flexibility across the application. The translations are consistent throughout.


798-810: LGTM! New scheduling-related translations added.

The translations for days of the week and scheduling options (e.g., "same day", "move to next working day") are properly translated and will support scheduling features in the application.


860-864: LGTM! New password preferences section added.

The new passwordPreferences section provides comprehensive Portuguese translations for different password validation rules. The translations clearly communicate password requirements to users, which is important for security and user experience.


1966-1969: LGTM! Entry type translations added.

The translations for "Manual Entries" and "System Entries" are appropriate and consistent with the terminology used throughout the file.


2627-2627: LGTM! Menu translation added correctly.

The translation for "Change Loan Officer" uses consistent terminology found elsewhere in the file.


2856-2857: LGTM! Comprehensive UI placeholder and label translations added.

The new translations for form placeholders, labels, and hints (e.g., EnterAmount, SelectDate, ClientName, NoFileSelected) are properly translated and follow consistent patterns. These additions will improve the user experience by ensuring all UI text is properly localized.

Also applies to: 2949-2951, 3053-3053, 3074-3075, 3169-3171, 3185-3186, 3253-3256, 3260-3261


854-854: LGTM! Common word translation added.

The translation of "every" to "cada" is correct and will be useful for frequency-related UI text.


3422-3422: LGTM! Upload hint translation added.

The translation for UploadDocumentHint clearly instructs users to upload a PDF or image to generate a preview, which is helpful for the document upload feature.


1-3811: Excellent translation coverage improvements!

This PR successfully adds comprehensive Portuguese translations across multiple categories:

  1. Button labels and actions - Edit Criteria Definition, Change Loan Officer
  2. Catalog normalization - Capitalization variants for flexible key lookup
  3. Scheduling features - Days of the week and scheduling options
  4. Password validation - New passwordPreferences section with detailed rules
  5. UI placeholders and hints - Form fields, search, selection prompts
  6. Entry types - Manual/System entries
  7. User guidance - Upload hints and various UI text

All translations:

  • Follow consistent terminology throughout the file
  • Use appropriate Portuguese grammar and conventions
  • Maintain proper JSON structure
  • Align with the PR objective of improving i18n coverage

The additions will significantly enhance the Portuguese user experience across the application.

src/assets/translations/ko-KO.json (1)

418-418: Translation additions are comprehensive and complete.

The new translations added to the Korean locale appear complete and well-structured:

✓ Core UI elements (Edit Criteria Definition, Optional, etc.)
✓ Catalog entries for multiple modules (Authorization, Cash Management, Configuration, etc.)
✓ Day names and date handling phrases (Monday-Sunday, "same day", "move to next working day", etc.)
✓ Password preference validation messages
✓ Search and filter placeholders
✓ Client-related identifiers (ClientName, FromAccountId, etc.)

The Korean translations appear grammatically correct and contextually appropriate. No missing translations detected in the added sections.

Note: Specific concerns about formatting (camelCase keys, string length) have been raised in separate comments.

Also applies to: 548-610, 799-810, 860-864, 2856-2856, 3169-3170, 3186-3186

src/assets/translations/ne-NE.json (3)

858-862: Good addition: Password preferences translations

The new passwordPreferences section properly covers different password validation policies. The translations clearly communicate the requirements in Nepali.


797-808: LGTM: Day names and scheduling options

The day name translations and payment scheduling options ("same day", "move to next working day", etc.) are well translated and essential for the loan scheduling functionality.


548-603: Remove duplicate case-variant keys in the catalogs section

The case-variant key pairs in the catalogs section (e.g., "Authorisation"/"authorisation", "Cash_mgmt"/"cash_mgmt", "Portfolio"/"portfolio") do technically exist in the translation file. However, codebase analysis shows these keys are not actively referenced by the application code. Keys like "Authorisation", "authorisation", "Cash_mgmt", and "cash_mgmt" have no usage matches in TypeScript, JavaScript, or HTML files. While duplicate keys with different casing don't directly cause runtime failures, removing the unused variants will reduce maintenance overhead and clarify which casing convention is actually needed.

Likely an incorrect or invalid review comment.

src/assets/translations/it-IT.json (6)

418-418: Edit Criteria Definition button label reads correctly

Italian wording is clear and matches surrounding button-label style; no issues spotted.


548-605: New catalog entries and schedule options look consistent

The added catalog values (module names, share-related codes, LOAN_PROVISIONING, weekdays, and “same day / move to next … day” options) are valid JSON, correctly spelled in Italian, and align stylistically with existing catalog entries.

Also applies to: 633-635, 710-710, 798-810


854-854: Password-related helper strings are accurate

The new every label and passwordPreferences block are syntactically correct and the Italian descriptions accurately reflect the underlying password rules while remaining understandable to end users.

Also applies to: 860-864


1966-1969: Manual/System entries labels are fine

Manual Entries / System Entries translations are idiomatic enough and consistent with nearby accounting terminology; no functional or clarity issues.


2627-2627: Change Loan Officer menu entry is consistent

The translation fits the existing infinitive-style action labels in the menus section and is unambiguous.


2856-2856: New search, prompt, and placeholder texts are clear

All newly added helper strings (ClientName, enter/phone/description prompts, filter/search variants, from-account/client IDs, “no file/notes” messages, “Optional”, and date/client-name selectors) are grammatically correct, contextually appropriate, and maintain consistent imperative/label style with the rest of the locale.

Also applies to: 2950-2952, 3053-3053, 3074-3075, 3169-3170, 3185-3185, 3253-3255, 3259-3260

src/assets/translations/sw-SW.json (1)

418-864: New Swahili translations and keys look consistent and structurally safe

The newly added keys (e.g., labels.buttons.Edit Criteria Definition, the various labels.catalogs.* entries, commons.every, passwordPreferences.*, inputs.Manual Entries / inputs.System Entries, and text keys like ClientName, EnterAmount, FilterByLoanIdOrError, SearchByName, SearchByClient, SearchByExternalID, SelectDate, NoFileSelected, NoNotesAvailable, Optional, etc.) are well-formed JSON, follow existing naming patterns, and align with how they’re consumed in templates elsewhere in the PR. I don’t see interpolation/placeholder or structural issues here.

Also applies to: 1964-1967, 2854-3269

src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.html (1)

5-7: Dynamic bulk‑import headings correctly wired to i18n

Using {{ 'labels.heading.' + bulkImport.name | translate }} (and appending the translated Template suffix) is a clean way to localize these headings, and it now matches the corrected BulkImports names (including “Recurring Deposit Accounts”). As long as each bulkImport.name has a corresponding labels.heading.* key in the JSON (which this PR adds), this will render correctly across locales.

Also applies to: 70-70

@IOhacker
Copy link
Contributor

@shubhamkumar9199 I think this key "Password most be at least 1 character and not more that 50 characters long" has a typo that must be fixed accross the i18n files

…web-app

fix: address code review issues

fix: translate accessibility attributes and fix translation errors
@shubhamkumar9199
Copy link
Contributor Author

shubhamkumar9199 commented Dec 26, 2025

@shubhamkumar9199 I think this key "Password most be at least 1 character and not more that 50 characters long" has a typo that must be fixed accross the i18n files

@IOhacker Sorry for the typo—I’ve fixed it.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
src/app/shared/tabs/entity-notes-tab/entity-notes-tab.component.html (1)

44-66: Complete i18n coverage for remaining hard-coded strings.

Several user-facing strings remain hard-coded and should be translated to align with this PR's i18n objectives:

  • Line 44: "Created by" prefix
  • Lines 55, 64: Title attributes ("Edit note", "Delete note")
  • Lines 57, 66: Button labels ("Edit", "Delete")
🔎 Proposed fixes
               <div class="note-meta">
-                <div class="created-by">Created by {{ entityNote.createdByUsername }}</div>
+                <div class="created-by">{{ 'labels.text.CreatedBy' | translate }} {{ entityNote.createdByUsername }}</div>
                 <div class="created-date">
                   {{ entityNote.createdOn | dateFormat }}
                 </div>
                 <button
                   type="button"
                   mat-raised-button
                   color="primary"
                   (click)="editNote(entityNote.id, entityNote.note, i)"
-                  title="Edit note"
+                  [title]="'labels.text.EditNote' | translate"
                 >
-                  Edit
+                  {{ 'labels.buttons.Edit' | translate }}
                 </button>
                 <button
                   type="button"
                   mat-raised-button
                   color="warn"
                   (click)="deleteNote(entityNote.id, i)"
-                  title="Delete note"
+                  [title]="'labels.text.DeleteNote' | translate"
                 >
-                  Delete
+                  {{ 'labels.buttons.Delete' | translate }}
                 </button>
src/app/system/roles-and-permissions/view-role/view-role.component.ts (1)

179-202: Complete the type safety improvements from the previous review.

The parameter type was changed from any to string, which is an improvement. However, the early return guard if (!string) at line 180 suggests the function may receive null or undefined, but the parameter type string doesn't allow these values. Additionally, there's no explicit return type annotation.

To fully comply with the strict type safety requirement in the coding guidelines:

  1. Update the parameter type to string | null | undefined to match the guard logic
  2. Add an explicit return type annotation : string
🔎 Proposed fix for complete type safety
-  formatName(string: string) {
+  formatName(string: string | null | undefined): string {
     if (!string) {
-      return string;
+      return '';
     }

Note: Changed the early return to return ''; to ensure a string is always returned, matching the return type.

As per coding guidelines, Angular code should use strict type safety. This also addresses the previous review comment more completely.

src/assets/translations/lt-LT.json (1)

304-305: Move "Edit Criteria Definition" from labels.buttons to labels.heading in translation files

The components use the key path labels.heading.Edit Criteria Definition (in both CreateLoanProvisioningCriteriaComponent.editDefinition() and EditLoanProvisioningCriteriaComponent.editDefinition()), but in both lt-LT.json and en-US.json the string is currently under labels.buttons (lines 418-419). This causes the dialog title to display the untranslated English key instead of the translated text.

Move the entry to labels.heading in lt-LT.json:

   "heading": {
+    "Edit Criteria Definition": "Redaguoti kriterijų apibrėžimą",
     "Account Linked Financial": "Sąskaitų, susietų su įvairia finansine veikla, sąrašas. Norėdami sužinoti daugiau, spustelėkite:",

(Same issue also exists in en-US.json and should be corrected there as well.)

♻️ Duplicate comments (2)
src/assets/translations/en-US.json (1)

864-868: LGTM! Previous typo issue has been addressed.

The translation key now correctly uses "must" and "than" instead of the previously flagged "most" and "that" typos. The passwordPreferences block is properly structured.

src/assets/translations/lv-LV.json (1)

3170-3170: Latvian grammatical error remains unfixed.

The grammatical error previously identified at line 3170 is still present. In Latvian, "fails" (file) is a masculine noun, so the past participle should agree in gender:

  • Current: "Nav izvēlēta fails" (feminine participle)
  • Correct: "Nav izvēlēts fails" (masculine participle)
🔎 Proposed fix
-      "NoFileSelected": "Nav izvēlēta fails",
+      "NoFileSelected": "Nav izvēlēts fails",
🧹 Nitpick comments (14)
src/app/shared/tabs/entity-notes-tab/entity-notes-tab.component.html (1)

37-37: Track by unique ID for better performance.

Currently tracking by object reference. For better change detection performance, track by the unique id property instead.

🔎 Proposed fix
-        @for (entityNote of entityNotes; track entityNote; let i = $index) {
+        @for (entityNote of entityNotes; track entityNote.id; let i = $index) {
src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.ts (1)

35-36: TranslateService wiring and labels look consistent; double‑check dialog title key and Confirm button i18n

The new TranslateService import/injection and usage for the dialog title and all definition form field labels are consistent and align with the rest of the app’s i18n patterns (labels.heading.*, labels.inputs.*). No functional issues here.

Two follow‑ups to verify:

  • Line 150: Ensure the key labels.heading.Edit Criteria Definition exists in all locale JSONs; in lt-LT.json the new translation currently sits under labels.buttons.Edit Criteria Definition, so that locale will likely fall back to English for this title unless you also add it under labels.heading.
  • Line 152: If layout.addButtonText is rendered as‑is by FormDialogComponent, consider passing a translated value instead (for example via this.translateService.instant('labels.buttons.Confirm')) so the Confirm button is localized as well.

Also applies to: 68-69, 148-224

src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.ts (1)

35-36: Consistent i18n integration; mirror key/path and button translation checks

The TranslateService import/injection and the use of translated labels for the edit definition dialog and its fields are correct and consistent with the create component. No functional issues.

As with the create component:

  • Line 160: This expects labels.heading.Edit Criteria Definition; currently in lt-LT.json the string is under labels.buttons.Edit Criteria Definition, so that locale will miss the title translation unless you also add the heading key.
  • Line 162: Consider translating the addButtonText: 'Confirm' string (for example via a labels.buttons.Confirm key), unless FormDialogComponent already performs translation on that value.

Also applies to: 68-69, 158-233

src/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.html (1)

26-31: Consider applying translation to status names for consistency.

The entity dropdown (line 11) now uses the translateKey pipe, but the status dropdown still displays status.name directly. If status names are static strings similar to entity names, consider applying translation for consistency:

 @for (status of statusList; track status) {
   <mat-option [value]="status.code">
-    {{ status.name }}
+    {{ status.name | translateKey: 'catalogs' }}
   </mat-option>
 }

If status names already come localized from the API, this can be ignored.

src/assets/translations/pt-PT.json (1)

854-854: Password rules/validation keys are correctly aligned and fix the reported typo.

The new "passwordPreferences" block and related input messages:

  • Use correctly spelled English keys, including
    "Password must be at least 1 character and not more than 50 characters long" (fixing the “most” / “that” typo reported in the PR comments).
  • Preserve intent and constraints in the PT-PT translations (length ranges, required character classes, “no spaces / no consecutive repeating characters”, etc.).
  • Reuse password wording consistently with existing keys like "Password validation" and "Password minimun length must be" (despite the historic “minimun” typo in the key name, which is unchanged).

No blocking issues here; just keep in mind that correcting the original English key spelling across all locales must be consistent (and it is for pt-PT in this diff).

Also applies to: 860-864, 2309-2309, 2562-2570

src/assets/translations/it-IT.json (1)

2949-2951: New entry placeholders read naturally in Italian

  • "EnterAmount" → “Inserisci l'importo”
  • "EnterPhoneNumber" → “Inserisci il numero di telefono”
  • "EnterTransferDescription" → “Inserisci la descrizione del trasferimento”

These look good as input placeholders or helper prompts.

If you want stricter grouping by semantics later, these could be moved under the placeholders section for consistency, but it’s not required for functionality.

src/assets/translations/sw-SW.json (2)

860-864: Verify password preference translations for accuracy.

The passwordPreferences section has been added with three password validation messages. The English source strings appear grammatically correct. However, based on the PR objectives, a typo was reported by IOhacker regarding password validation messages. Please verify:

  1. The Swahili translations accurately reflect the English messages
  2. Similar password validation messages in other translation files have been corrected for the reported typo ("Password most be" → "Password must be" and "not more that" → "not more than")

Based on the PR objectives comment about fixing typos across i18n files.


548-610: Review duplicate catalog keys with different casing.

Multiple catalog entries exist with both PascalCase and lowercase variations using the same translation:

  • "Account_transfer" and "account_transfer" → "Uhamisho wa Akaunti"
  • "Accounting" and "accounting" → "Uhasibu"
  • "Authorisation" and "authorisation" → "Idhini"
  • And several others...

While this pattern may be intentional for different UI contexts, it could create maintenance overhead. Consider:

  1. Whether both variations are actually needed in the codebase
  2. Using a single key with CSS text-transform if this is purely for display formatting
  3. Documenting the reason for duplication if it serves different purposes
src/assets/translations/fr-FR.json (6)

633-635: Loan provisioning, share, amortization, weekdays and working‑day strategy

  • LOAN_PROVISIONING: “Provision de prêt” is a clear improvement over the earlier wording and addresses the previous review note.
  • SHAREACCOUNT / SHAREPRODUCT / SSBENEFICIARYTPT are translated in a way users will understand.
  • “Amortissement égal du montant restant dû” correctly reflects “Equal Amortization of Outstanding amount”.
  • Weekday names and payment‑date strategy strings (“même jour”, “déplacer au jour ouvrable suivant”, etc.) are accurate, if slightly literal, but not misleading.

All good; any further stylistic polishing would be optional.

Also applies to: 710-710, 798-810


1966-1966: Consider more idiomatic French for “Manual/System Entries”

“Entrées Manuelles” / “Entrées Système” are understandable but a bit literal for accounting; “Écritures” is the usual term.

Optional wording tweak
-      "Manual Entries": "Entrées Manuelles",
+      "Manual Entries": "Écritures manuelles",
@@
-      "System Entries": "Entrées Système",
+      "System Entries": "Écritures système",

Also applies to: 1969-1969


2949-2951: Placeholders for amount/phone/description are understandable; minor style nit

“Entrer le montant / numéro de téléphone / la description du transfert” is clear, but French UI text usually uses “Entrez …” or “Saisir …”.

Optional imperative‑form tweak
-      "EnterAmount": "Entrer le montant",
-      "EnterPhoneNumber": "Entrer le numéro de téléphone",
-      "EnterTransferDescription": "Entrer la description du transfert",
+      "EnterAmount": "Entrez le montant",
+      "EnterPhoneNumber": "Entrez le numéro de téléphone",
+      "EnterTransferDescription": "Entrez la description du transfert",

3053-3053: FilterByLoanIdOrError label is serviceable; could be slightly clearer

“Filtrer par ID de prêt ou erreur” works, but “erreur” alone is a bit vague; you might consider clarifying it’s an error message, if that matches usage.

Optional clarity tweak
-      "FilterByLoanIdOrError": "Filtrer par ID de prêt ou erreur",
+      "FilterByLoanIdOrError": "Filtrer par ID de prêt ou message d'erreur",

3073-3075: fromEmail / fromName / FromAccountId labels

  • "fromEmail": "de l'email" and "fromName": "deNom" are consistent with existing style (“fromEmail” technical keys).
  • "FromAccountId": "Depuis l'ID du compte" / "FromClientId": "Depuis l'ID du client" are understandable but slightly awkward; “ID du compte source” / “ID du client source” would read more naturally if these are labels, not descriptions.
Optional wording tweak if these are user‑visible labels
-      "FromAccountId": "Depuis l'ID du compte",
-      "FromClientId": "Depuis l'ID du client",
+      "FromAccountId": "ID du compte source",
+      "FromClientId": "ID du client source",

3184-3184: “Optional” → “Optionnel” is acceptable

“Optionnel” is understood; “Facultatif” would be a slightly more standard UI term, but this is purely stylistic.

Optional terminology change
-      "Optional": "Optionnel",
+      "Optional": "Facultatif",
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 21b3824 and fa6d98a.

📒 Files selected for processing (43)
  • src/app/account-transfers/list-standing-instructions/list-standing-instructions.component.html
  • src/app/account-transfers/make-account-transfers/make-account-transfers.component.html
  • src/app/accounting/search-journal-entry/search-journal-entry.component.html
  • src/app/accounting/search-journal-entry/search-journal-entry.component.ts
  • src/app/centers/centers.component.html
  • src/app/clients/client-stepper/client-family-members-step/client-family-member-dialog/client-family-member-dialog.component.html
  • src/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.html
  • src/app/clients/clients-view/family-members-tab/add-family-member/add-family-member.component.html
  • src/app/clients/clients-view/family-members-tab/edit-family-member/edit-family-member.component.html
  • src/app/clients/clients.component.html
  • src/app/clients/edit-client/edit-client.component.html
  • src/app/core/shell/breadcrumb/breadcrumb.component.ts
  • src/app/groups/groups.component.html
  • src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.html
  • src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.ts
  • src/app/loans/loans-view/account-details/account-details.component.html
  • src/app/loans/loans-view/general-tab/general-tab.component.html
  • src/app/organization/bulk-import/view-bulk-import/bulk-imports.ts
  • src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.html
  • src/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.html
  • src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.ts
  • src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.ts
  • src/app/organization/organization-routing.module.ts
  • src/app/organization/password-preferences/password-preferences.component.html
  • src/app/organization/working-days/working-days.component.html
  • src/app/pipes/yesno.pipe.ts
  • src/app/shared/file-upload/file-upload.component.html
  • src/app/shared/tabs/entity-notes-tab/entity-notes-tab.component.html
  • src/app/system/manage-jobs/cob-workflow/loan-locked/loan-locked.component.html
  • src/app/system/roles-and-permissions/view-role/view-role.component.ts
  • src/assets/translations/cs-CS.json
  • src/assets/translations/de-DE.json
  • src/assets/translations/en-US.json
  • src/assets/translations/es-CL.json
  • src/assets/translations/es-MX.json
  • src/assets/translations/fr-FR.json
  • src/assets/translations/it-IT.json
  • src/assets/translations/ko-KO.json
  • src/assets/translations/lt-LT.json
  • src/assets/translations/lv-LV.json
  • src/assets/translations/ne-NE.json
  • src/assets/translations/pt-PT.json
  • src/assets/translations/sw-SW.json
💤 Files with no reviewable changes (1)
  • src/app/clients/edit-client/edit-client.component.html
✅ Files skipped from review due to trivial changes (1)
  • src/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.html
🚧 Files skipped from review as they are similar to previous changes (18)
  • src/app/organization/password-preferences/password-preferences.component.html
  • src/app/account-transfers/list-standing-instructions/list-standing-instructions.component.html
  • src/app/clients/clients-view/family-members-tab/edit-family-member/edit-family-member.component.html
  • src/app/clients/clients.component.html
  • src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.html
  • src/app/core/shell/breadcrumb/breadcrumb.component.ts
  • src/app/clients/client-stepper/client-family-members-step/client-family-member-dialog/client-family-member-dialog.component.html
  • src/app/loans/loans-view/general-tab/general-tab.component.html
  • src/app/groups/groups.component.html
  • src/app/organization/working-days/working-days.component.html
  • src/app/system/manage-jobs/cob-workflow/loan-locked/loan-locked.component.html
  • src/app/organization/bulk-import/view-bulk-import/bulk-imports.ts
  • src/app/accounting/search-journal-entry/search-journal-entry.component.ts
  • src/app/centers/centers.component.html
  • src/app/accounting/search-journal-entry/search-journal-entry.component.html
  • src/app/clients/clients-view/family-members-tab/add-family-member/add-family-member.component.html
  • src/app/shared/file-upload/file-upload.component.html
  • src/app/organization/organization-routing.module.ts
🧰 Additional context used
📓 Path-based instructions (1)
src/app/**

⚙️ CodeRabbit configuration file

src/app/**: For Angular code: verify component separation, trackBy on *ngFor,
strict type safety, and clean observable patterns.

Files:

  • src/app/pipes/yesno.pipe.ts
  • src/app/shared/tabs/entity-notes-tab/entity-notes-tab.component.html
  • src/app/account-transfers/make-account-transfers/make-account-transfers.component.html
  • src/app/system/roles-and-permissions/view-role/view-role.component.ts
  • src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.ts
  • src/app/loans/loans-view/account-details/account-details.component.html
  • src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.html
  • src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.ts
  • src/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.html
  • src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.ts
🧠 Learnings (1)
📚 Learning: 2025-12-09T14:24:31.429Z
Learnt from: alberto-art3ch
Repo: openMF/web-app PR: 2876
File: src/app/loans/loans-view/loan-account-actions/loan-reaging/loan-reaging.component.ts:91-94
Timestamp: 2025-12-09T14:24:31.429Z
Learning: In the LoanReagingComponent (src/app/loans/loans-view/loan-account-actions/loan-reaging/loan-reaging.component.ts), the transactionAmount field uses both Validators.min and Validators.max set to the same value (loanTransactionData.amount). This is intentional - it requires users to enter the exact amount as a confirmation/validation step before submitting the re-age operation.

Applied to files:

  • src/app/account-transfers/make-account-transfers/make-account-transfers.component.html
  • src/app/loans/loans-view/account-details/account-details.component.html
  • src/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.ts
  • src/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.ts
🔇 Additional comments (57)
src/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.ts (1)

26-26: LGTM! Translation infrastructure correctly added.

The TranslatePipe import and registration in the standalone component's imports array are correctly implemented, enabling i18n capabilities in the template.

Also applies to: 57-58

src/app/shared/tabs/entity-notes-tab/entity-notes-tab.component.html (1)

74-74: LGTM! Translation applied correctly.

The empty-state message now uses the translate pipe, consistent with the PR's i18n objectives.

src/assets/translations/lt-LT.json (1)

813-824: Password messages: wording fix looks correct; structure is consistent

The new passwordPreferences block and related password helper texts now use grammatically correct English (“Password must be at least 1 character and not more than 50 characters long”), addressing the earlier “most / that” typo, and the Lithuanian translations are coherent with the existing password‑validation phrasing.

No changes needed here; just ensure the consuming code points to labels.passwordPreferences.* consistently across all locales.

Also applies to: 860-864, 2562-2570

src/assets/translations/es-CL.json (2)

859-863: Password preferences translations look good and address the reported typo.

The new passwordPreferences section correctly translates the password validation messages into Spanish (Chile). The English keys have been corrected (the typo "Password most be..." mentioned in PR comments has been fixed to "Password must be..."), and the Spanish translations are accurate and grammatically correct.


548-809: Verification script references keys not present in the provided code snippet.

The translation entries shown (lines 548-809) are accurate and grammatically correct. However, the proposed verification script searches for keys (ClientName, FromAccountId, FromClientId, NoFileSelected, NoNotesAvailable, Optional, FilterByLoanIdOrError, SelectDate) that do not appear in the provided snippet and are not found anywhere in the application code.

The keys actually present in the snippet (Loans, CENTER, CLIENT, MONDAY, etc.) are confirmed to be used in the codebase. Clarify which keys are actually new in this change, or provide the correct line numbers where the keys mentioned in the verification script are located.

src/assets/translations/es-MX.json (4)

548-609: LGTM! Catalog translations are consistent.

The dual-casing pattern for catalog entries (e.g., Account_transfer/account_transfer, Cash_mgmt/cash_mgmt) appears intentional for different UI contexts. Spanish translations are accurate and grammatically correct.


2858-2863: LGTM! UI placeholder translations are clear and appropriate.

The new placeholder entries like ClientName, FromAccountId, EnterAmount, NoFileSelected, SearchByName, etc., have accurate Spanish translations that are user-friendly and consistent with existing patterns.

Also applies to: 3077-3078, 3171-3172, 3255-3263


797-809: LGTM! Schedule and system terminology translations are accurate.

The additions include:

  • Day names (Monday-Sunday) with correct Spanish translations
  • Scheduling options ("same day", "move to next working day", etc.) appropriately translated
  • Manual Entries / System Entries distinction clearly translated
  • Consistent use of "Créditos" for "Loan" terminology

All translations are grammatically correct and maintain consistency with existing terminology.

Also applies to: 1966-1969, 2629-2629


859-863: The password validation messages in es-MX.json are correct. A comprehensive search across all 14 locale files (en-US.json, cs-CS.json, de-DE.json, es-CL.json, es-MX.json, fr-FR.json, it-IT.json, ko-KO.json, lt-LT.json, lv-LV.json, ne-NE.json, pt-PT.json, and sw-SW.json) confirms that the reported typo ("Password most be" / "not more that") is not present in any file. The Spanish translations on lines 860-862 are accurate.

src/assets/translations/de-DE.json (3)

2948-2950: Good additions for UI placeholder strings.

The new placeholder entries (EnterAmount, EnterPhoneNumber, EnterTransferDescription, FilterByLoanIdOrError, NoFileSelected, NoNotesAvailable) have been added with appropriate German translations. These improve the UI completeness.

Also applies to: 3053-3053, 3169-3170


548-610: Comprehensive catalog and scheduling translations added.

The additions include:

  • Catalog entries with both capitalized and lowercase variants for different UI contexts (lines 548-610)
  • Day of the week translations (lines 799-805)
  • Repayment scheduling options (lines 806-810)

These translations are grammatically correct and improve i18n coverage.

Also applies to: 799-810


854-854: No changes needed for "jeden" translation.

The translation "jeden" is grammatically appropriate for its context and consistent with related translations in the file (e.g., "Repeat Every": "Wiederhole jeden"). No evidence found of dynamic usage requiring gender or case variants.

src/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.html (1)

11-11: LGTM! Translation pipe correctly applied to entity names.

The translateKey: 'catalogs' pipe is properly used to translate entity names, and corresponding translation keys exist in the catalogs section of the translation files.

src/assets/translations/pt-PT.json (2)

418-418: Catalog and button additions look consistent with other locales.

The new/updated keys for buttons and catalogs (e.g., "Edit Criteria Definition", "Account_transfer"/"account_transfer", section names like Cash_mgmt, Collection_sheet, Datatable, Externalservices, portfolio/group/center variants, SHAREACCOUNT/SHAREPRODUCT/SSBENEFICIARYTPT, LOAN_PROVISIONING, and day-name / schedule-behavior strings) are all:

  • Using the same English keys that other locales use.
  • Preserving placeholders and capitalization patterns.
  • Mapped to idiomatic, consistent PT-PT values.

No functional or i18n-key issues from these changes on this file.

Also applies to: 548-553, 562-603, 633-636, 710-711, 798-811


1966-1969: New helper/search/placeholder/status strings are wired and named coherently.

The added keys for:

  • Journal entry controls ("Manual Entries", "System Entries"),
  • Date/day labels ("Monday" in inputs),
  • Client/amount/transfer helpers ("ClientName", "EnterAmount", "EnterPhoneNumber", "EnterTransferDescription"),
  • Search/filter helpers ("FilterByLoanIdOrError", "SearchByName", "SearchByClient", "SearchByExternalID", "SelectDate", "SelectOrTypeClientName"),
  • Status/optional UI ("NoFileSelected", "NoNotesAvailable", "Optional"),
  • Texts like "Buy Down Fees" and "UploadDocumentHint",

all follow existing naming conventions (CamelCase with no spaces for programmatic keys, natural-language translations), and the PT-PT values are clear and consistent with surrounding texts.

No issues from an i18n or runtime-usage standpoint in this group.

Also applies to: 2018-2018, 2856-2856, 2949-2951, 3052-3052, 3074-3075, 3169-3171, 3185-3185, 3253-3256, 3260-3261, 3421-3422

src/app/pipes/yesno.pipe.ts (1)

4-14: Impure yesNo pipe is now correctly simplified; only minor typing nit remains.

Switching to @Pipe({ name: 'yesNo', pure: false }) and removing the unused onLangChange subscription resolves the earlier lifecycle/memory concern; Angular’s change detection will now re‑invoke this impure pipe when the language changes, so the TranslateService.instant('labels.buttons.' + result) lookup stays in sync without extra plumbing.

One small improvement you could consider (non-blocking): transform currently returns null when value == null but is typed as string. If strict null checks are enabled, changing the signature to transform(value: boolean | null | undefined, ...): string | null would be more accurate.

src/assets/translations/lv-LV.json (2)

418-418: Good coverage of missing translations.

The translation additions across the file provide comprehensive coverage for:

  • Catalog entries with appropriate capitalization variants
  • Day names and payment options
  • UI labels and placeholders
  • Password preferences
  • Manual and system entries

The translations appear consistent with existing patterns in the file and align well with the PR objective of applying global i18n fixes.

Also applies to: 548-810, 2627-3261


860-864: Password preferences translation is correct across all locale files.

The "Password must be" text (not "most") is correctly present in all 13 translation files, including lv-LV.json at line 861. No instances of the original typo exist in the codebase.

src/assets/translations/cs-CS.json (6)

418-418: Translation addition looks good.

The translation "Upravit definici kritérií" for "Edit Criteria Definition" is appropriate and consistent with the existing translation patterns in the file.


548-810: Comprehensive catalog translations added successfully.

The addition of catalog translations for various entities (Account_transfer, Cash_mgmt, Collection_sheet, etc.) along with day names and working day phrases properly supports internationalization across the application. The Czech translations appear accurate and follow consistent naming conventions.


1966-1970: Manual and System Entries translations are appropriate.

The translations for "Manual Entries" (Ruční záznamy) and "System Entries" (Systémové záznamy) are correctly localized for Czech and consistent with the accounting/data entry context.


2947-2950: Form placeholder translations are clear and user-friendly.

The placeholder translations (EnterAmount, EnterPhoneNumber, EnterTransferDescription, SelectDate, SelectOrTypeClientName) properly use Czech imperative forms and provide clear guidance to users filling out forms.

Also applies to: 2958-2959


2855-2855: Miscellaneous translation additions are accurate.

All the miscellaneous translations added throughout the file are grammatically correct and contextually appropriate:

  • ClientName, FilterByLoanIdOrError, NoFileSelected, NoNotesAvailable, Optional, Change Loan Officer, FromAccountId, and FromClientId all have proper Czech translations that will enhance the user experience for Czech-speaking users.

Also applies to: 3051-3051, 3168-3169, 3184-3184, 2627-2627, 3073-3074


860-864: Czech translations are accurate and no typo issues were found in the translation files.

The passwordPreferences section in cs-CS.json contains accurate Czech translations. All English keys are correct (using "must" and "than"), and the typo mentioned in PR comments ("Password most be" / "not more that") does not exist in the translation files, including en-US.json. No further action is needed.

src/app/loans/loans-view/account-details/account-details.component.html (1)

13-14: Internationalization properly applied to "every" text.

The change successfully replaces hard-coded "every" text with the translation pipe {{ 'labels.commons.every' | translate }}, which properly supports internationalization. The translation key exists in all locale files (verified in cs-CS.json line 854).

The use of &nbsp; on line 14 is appropriate to maintain non-breaking space between the repayment frequency number and type.

src/assets/translations/ko-KO.json (2)

548-810: Well-structured translation additions

The new translation entries added in this PR follow good patterns:

  1. Catalog entries (lines 548-810): Properly include both capitalized and lowercase variants (e.g., Account_transfer and account_transfer) to support different UI contexts
  2. Placeholder keys (lines 2856-2860): CamelCase keys like ClientName, FromAccountId, SelectDate follow modern UI conventions
  3. UI helper messages (lines 3169-3170): Keys like NoFileSelected, NoNotesAvailable are clear and self-documenting

All new entries have corresponding Korean translations, maintaining completeness of the locale file.

Also applies to: 2856-2860, 3169-3170


860-864: No action needed—passwordPreferences keys are correct across all locales

The English keys in the passwordPreferences section use correct spelling ("must" and "than"). Verification across all translation files (en-US, de-DE, fr-FR, es-MX, es-CL, it-IT, pt-PT, ko-KO, and others) confirms these password validation messages are consistently spelled correctly throughout.

src/assets/translations/it-IT.json (12)

418-418: New “Edit Criteria Definition” label is consistent

Key and Italian translation (“Modifica Definizione Criteri”) are clear and consistent with surrounding button labels.


548-606: Catalog / enum additions look structurally sound

New catalog keys (e.g., Account_transfer, Cash_mgmt, Datatable, Externalservices, Infrastructure, Investor, Jobs, Loan_product_attribute, Loan_reschedule, Organisation, Portfolio, SHAREACCOUNT, SHAREPRODUCT, SSBENEFICIARYTPT, LOAN_PROVISIONING, weekday and schedule options) are valid JSON, follow existing naming patterns (capitalized + lowercase variants), and have reasonable Italian translations. No placeholder or interpolation issues here.

Also applies to: 608-610, 633-635, 710-710, 798-810


1966-1970: Manual/System entries labels align with surrounding accounting text

"Manual Entries" and "System Entries" translations (“Inserimenti Manuali” / “Inserimenti di Sistema”) are consistent with nearby phrases like “Manual Entries Allowed” and match the accounting context.


2627-2627: “Change Loan Officer” menu entry is fine

Translation (“Cambiare l'ufficiale di prestito”) is understandable and consistent with other imperative-style menu items.


2856-2856: ClientName helper text is clear

"ClientName": "Nome del cliente" is straightforward and matches usage implied by client search / display contexts.


3053-3053: FilterByLoanIdOrError label is accurate

“Filtra per ID prestito o errore” correctly reflects the key and is concise for filter UI.


3074-3075: From‑account/client identifiers translated appropriately

"FromAccountId" → “Dall'ID account” and "FromClientId" → “Dall'ID cliente” are accurate and match other account/client ID wordings.


3169-3170: Empty‑state messages for files and notes are good

“Nessun file selezionato” and “Nessuna nota disponibile” are idiomatic Italian for these empty states.


3185-3185: Optional flag text is correct

“Opzionale” is the expected translation and fits well as a short label or hint.


3253-3255: Search helper texts for client lookups are clear and helpful

  • "SearchByName" → “Cerca per nome”
  • "SearchByClient" → “Cerca per nome cliente, ID esterno, cellulare” (nicely clarifies all supported fields)
  • "SearchByExternalID" → “Cerca per ID esterno”

These should make the search UX clearer without changing semantics.


3259-3260: Date/client selection prompts are well-phrased

  • "SelectDate" → “Seleziona data”
  • "SelectOrTypeClientName" → “Seleziona o digita il nome del cliente”

Both are idiomatic and match common UI phrasing.


854-864: Password preferences block and "every" token are correct; password typo fixed

  • "every": "ogni" aligns with existing commons grammar.
  • New passwordPreferences messages correctly express the password rules in Italian and the English keys now use "must be" / "more than", addressing the earlier "most be" / "more that" typo.
src/assets/translations/sw-SW.json (1)

418-418: Multiple new translation entries added to sw-SW.json with valid JSON structure.

This PR adds comprehensive translation coverage across various sections:

  • Edit actions and loan provisioning (lines 418, 710)
  • Payment schedule and day-of-week translations (lines 798-810)
  • Transaction entry types and UI labels (lines 1964, 1967, 2625, 2854)
  • Client search and selection strings (lines 3250-3257)
  • Additional form fields and system messages (lines 3072-3073, 3167-3168, 3182-3183)

All entries follow the existing JSON patterns and the structure is valid. The additions align with the PR objective of expanding i18n coverage.

Recommendation: Have a native Swahili speaker review the translation accuracy to ensure the meanings are correctly conveyed in context.

src/assets/translations/ne-NE.json (1)

858-862: Password preference messages corrected consistently across all locales

The password policy keys now use the correct spelling ("must" and "than") in all 13 locale files (en-US, de-DE, fr-FR, es-CL, es-MX, it-IT, pt-PT, cs-CS, lt-LT, lv-LV, ko-KO, sw-SW, and ne-NE), ensuring the translations stay in sync with the corrected English strings.

src/app/account-transfers/make-account-transfers/make-account-transfers.component.html (1)

60-61: Placeholders are now properly localized; all keys present across all locales

Switching hard‑coded placeholders to translated ones (phone, date, client selector, amount, and description fields, plus the readonly interbank fields) is consistent with the rest of the app's i18n approach and matches the new labels.text.* entries in the translation files. The following keys have been verified as present in all 13 supported locales:

  • labels.text.EnterPhoneNumber
  • labels.text.SelectDate
  • labels.text.SelectOrTypeClientName
  • labels.text.EnterAmount
  • labels.text.EnterTransferDescription

No raw key strings will appear in any locale. The implementation is complete and correct.

src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.html (1)

5-7: Dynamic heading translations are verified and working correctly

All 18 bulkImport.name values have matching labels.heading.* keys in en-US.json. The pattern {{ 'labels.heading.' + bulkImport.name | translate }} on lines 5-7 and 70-71 is correct and aligns with existing translation entries.

To guard against future name/key drift (like the earlier "Reccuring…" typo), consider either:

  • Adding an explicit translationKey field to each bulk import definition and binding to that instead of name, or
  • Backing this with a small test/script that asserts every bulkImport.name has a corresponding labels.heading.* key in the base locale.
src/assets/translations/fr-FR.json (14)

418-418: “Edit Criteria Definition” button translation is correct

“Modifier la définition des critères” is accurate and idiomatic for this context.


548-553: Catalog keys for Account_transfer/Accounting/Authorisation look consistent

The added variants (Account_transfer, account_transfer, accounting, Authorisation, authorisation) all map cleanly to “Transfert de Compte”/“Comptabilité”/“Autorisation”, which is consistent with surrounding catalog entries.


562-567: Cash/Collection/Configuration catalog labels are understandable

  • “Cash_mgmt” → “Gestion de Trésorerie”
  • “Collection_sheet” → “Feuille de Collecte”
  • “Configuration” → “Configuration”

All are clear; casing is in line with existing catalog entries.


570-573: Datatable / Externalservices translations are fine

“Table de Données” and “Services Externes” are correct and match usage in the rest of the UI.


574-581: Infrastructure / Interop / Investor / Jobs entries are coherent

The French values mirror the English concepts correctly (Infrastructure, Interopérabilité, Investisseur, Emplois). No action needed.


582-605: Loan product/catalog variants and savings/share keys look good

  • “Attribut Produit Prêt”, “Reprogrammation Prêt”, “Organisation”, “Portefeuille”, “Rapport”, “Spécial”, etc. are all understandable and aligned with domain language.
  • “Savings Account” → “Compte d'épargne” is correct in this catalog context.
  • XBRL mapping entries are correctly rendered as “Cartographie XBRL”.

No translation issues spotted here.

Also applies to: 608-611


854-854: Commons: “every” → “chaque” is correct

This small addition matches prior wording patterns (“chaque”) and will compose well in validation sentences.


860-864: Password preference messages: English typo fixed and FR remains correct

  • The English key now reads “Password must be at least 1 character and not more than 50 characters long”, fixing the “most/that” typos raised in the PR comment.
  • French translations for all three password policies are accurate and precise.

Nothing further to change here.


2627-2627: “Change Loan Officer” menu label is fine

“Changer l'agent de crédit” is natural and consistent with other loan‑officer labels.


2856-2856: ClientName helper text is consistent

"ClientName": "Nom du client" matches other “Client Name” usages and should work well wherever this compact key is reused.


3168-3169: No‑file / no‑notes messages look good

“Aucun fichier sélectionné” and “Aucune note disponible” are idiomatic and match typical FR UX phrasing.


3252-3254: SearchBy helper texts are clear*

  • “Rechercher par nom”
  • “Rechercher par nom de client, ID externe, mobile”
  • “Rechercher par ID externe”

All convey the intended filters well.


3258-3259: SelectDate / SelectOrTypeClientName phrasing is good

“Sélectionner la date” and “Sélectionner ou saisir le nom du client” are natural in French and match other helper‑text patterns.


3691-3691: Tooltip “Create Interest Refund” translated correctly

“Créer un remboursement d’intérêts” is precise and aligns with other interest‑refund terminology you’ve added.

Copy link
Contributor

@IOhacker IOhacker left a comment

Choose a reason for hiding this comment

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

LGTM

@IOhacker IOhacker merged commit 7e55843 into openMF:dev Dec 26, 2025
4 checks passed
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.

2 participants