WEB-521 fix(i18n): add missing translations and apply translate pipes across …#2934
Conversation
|
Note
|
| 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
- WEB-419: Fix layout of Interbank Transfer page #2786 — Modifies
make-account-transferstemplate and interbank/regular transfer fields; closely related to the transfer-form placeholder localization here. - WEB-436: Fix Spanish Translation for Login Page and Family Members tab #2820 — Updates Spanish locale files; overlaps translation key additions in this PR.
- WEB-478-fix/i18n/savings-account-details-missing #2856 — Broad i18n/translation updates; related to added translation keys and normalization.
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.
Comment @coderabbitai help to get the list of available commands and usage tips.
There was a problem hiding this comment.
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_transferandaccount_transfer,Cash_mgmtandcash_mgmt). While this might be intentional to support different UI contexts, please confirm:
- Is this duplication necessary, or can the UI be refactored to use a single case convention?
- Are there plans to maintain both variants going forward?
- 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 optimizingformatNamecalls within the loop.The method is called on every iteration in the
@forloop at line 33 of the template ({{ formatName(grouping) }}). SinceformatNameinvokestranslateService.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
@forloops 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
@forloops 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 translatingaria-labelandtitleattributes for full i18n coverage.The
aria-labelandtitleattributes 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-labelandtitleattributes.Also applies to: 27-29, 39-41, 56-58, 70-72, 144-145
83-87: Consider tracking by ID for better performance.The
@forloops 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 tweakCurrent 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: KeeppasswordPreferenceskeys exactly consistent across localesThe new
passwordPreferencesmessages 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, usingmustinstead ofmost) 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 idiomaticThe three added prompts:
EnterAmountEnterPhoneNumberEnterTransferDescriptionare 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 localizedUsing
labels.text.NoNotesAvailablefor the no-notes state is correct and the@forloop already has atrackclause 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 fallbackThe new
labels.menus.*lookup is guarded and only overridesbreadcrumbLabelwhen a real translation is found (instantresult 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 factoryUsing
TranslateService.instantfor the dialog title and all definition form-field labels is consistent with how these dynamic fields are built, and thelabels.inputs.*keys line up with the translation data.Since
getDefinitionFormFieldsin 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 duplicationThe create component’s usage of
TranslateService.instantfor 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
getDefinitionFormFieldslogic (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 ifYesnoPipeis 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
asyncpipe in templates- Component-level subscriptions to
TranslateService.onLangChangeto 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
📒 Files selected for processing (42)
src/app/account-transfers/list-standing-instructions/list-standing-instructions.component.htmlsrc/app/account-transfers/make-account-transfers/make-account-transfers.component.htmlsrc/app/accounting/search-journal-entry/search-journal-entry.component.htmlsrc/app/accounting/search-journal-entry/search-journal-entry.component.tssrc/app/centers/centers.component.htmlsrc/app/clients/client-stepper/client-family-members-step/client-family-member-dialog/client-family-member-dialog.component.htmlsrc/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.htmlsrc/app/clients/clients-view/family-members-tab/add-family-member/add-family-member.component.htmlsrc/app/clients/clients-view/family-members-tab/edit-family-member/edit-family-member.component.htmlsrc/app/clients/clients.component.htmlsrc/app/clients/edit-client/edit-client.component.htmlsrc/app/core/shell/breadcrumb/breadcrumb.component.tssrc/app/groups/groups.component.htmlsrc/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.htmlsrc/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.tssrc/app/loans/loans-view/account-details/account-details.component.htmlsrc/app/loans/loans-view/general-tab/general-tab.component.htmlsrc/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.htmlsrc/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.htmlsrc/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.tssrc/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.tssrc/app/organization/organization-routing.module.tssrc/app/organization/password-preferences/password-preferences.component.htmlsrc/app/organization/working-days/working-days.component.htmlsrc/app/pipes/yesno.pipe.tssrc/app/shared/file-upload/file-upload.component.htmlsrc/app/shared/tabs/entity-notes-tab/entity-notes-tab.component.htmlsrc/app/system/manage-jobs/cob-workflow/loan-locked/loan-locked.component.htmlsrc/app/system/roles-and-permissions/view-role/view-role.component.tssrc/assets/translations/cs-CS.jsonsrc/assets/translations/de-DE.jsonsrc/assets/translations/en-US.jsonsrc/assets/translations/es-CL.jsonsrc/assets/translations/es-MX.jsonsrc/assets/translations/fr-FR.jsonsrc/assets/translations/it-IT.jsonsrc/assets/translations/ko-KO.jsonsrc/assets/translations/lt-LT.jsonsrc/assets/translations/lv-LV.jsonsrc/assets/translations/ne-NE.jsonsrc/assets/translations/pt-PT.jsonsrc/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.htmlsrc/app/clients/clients.component.htmlsrc/app/clients/client-stepper/client-family-members-step/client-family-member-dialog/client-family-member-dialog.component.htmlsrc/app/account-transfers/make-account-transfers/make-account-transfers.component.htmlsrc/app/pipes/yesno.pipe.tssrc/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.htmlsrc/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.htmlsrc/app/core/shell/breadcrumb/breadcrumb.component.tssrc/app/organization/password-preferences/password-preferences.component.htmlsrc/app/organization/working-days/working-days.component.htmlsrc/app/groups/groups.component.htmlsrc/app/loans/loans-view/general-tab/general-tab.component.htmlsrc/app/centers/centers.component.htmlsrc/app/account-transfers/list-standing-instructions/list-standing-instructions.component.htmlsrc/app/organization/organization-routing.module.tssrc/app/shared/file-upload/file-upload.component.htmlsrc/app/clients/clients-view/family-members-tab/add-family-member/add-family-member.component.htmlsrc/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.htmlsrc/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.tssrc/app/system/roles-and-permissions/view-role/view-role.component.tssrc/app/shared/tabs/entity-notes-tab/entity-notes-tab.component.htmlsrc/app/system/manage-jobs/cob-workflow/loan-locked/loan-locked.component.htmlsrc/app/loans/loans-view/account-details/account-details.component.htmlsrc/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.htmlsrc/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.tssrc/app/accounting/search-journal-entry/search-journal-entry.component.htmlsrc/app/accounting/search-journal-entry/search-journal-entry.component.tssrc/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.htmlsrc/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.tssrc/app/loans/loans-view/account-details/account-details.component.htmlsrc/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:
- Getting these translations reviewed by a native Swahili speaker to ensure accuracy and natural phrasing
- Testing the UI with these translations to verify all strings display correctly without truncation
- 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_transferandaccount_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
passwordPreferencessection 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
@forcontrol flow correctly includes a track expression, which is essential for efficient rendering and avoiding unnecessary DOM updates.
8-10: The component correctly imports thetranslateKeypipe throughSTANDALONE_SHARED_IMPORTS, which includesTranslatePipefrom@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
passwordPreferencessection 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
translateKeypipe is available throughSTANDALONE_SHARED_IMPORTSand 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 goodThe 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 additionsThe 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 andpasswordPreferencesblockThe added
everytranslation and the three password policy messages inpasswordPreferencesare 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 correctlyThe 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 naturallyThe 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 keysSwitching
optionfrom hard-coded labels tolabels.inputs.*keys is consistent with the translations (es-MX has"All","Manual Entries","System Entries"underlabels.inputs). Just make sure:
- The template renders
optionvia the translate pipe (not as a raw string).- All supported locales define these three keys under
labels.inputsso 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 Entriesandlabels.inputs.System Entriesentries line up with the TS change inSearchJournalEntryComponent, 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
passwordPreferencessection (lines 860-864) is properly nested underlabels- 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 goodThe 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 correctThe 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 typoThe 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 doneAll 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 accurateThe 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 rulesYou'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 correctThe added keys for day names and payment‑shift behavior (
Monday–Sunday, “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
passwordPreferencesmessages 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 translatedThe 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: NewpasswordPreferencesobject 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
catalogssection (lines 755-761 haveMONDAY,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, andSelectDatefollow 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 usagesThe added keys (e.g.,
Edit Criteria Definition,Account_transfervariants,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 goodUsing
{{ 'labels.text.NoFileSelected' | translate }}for the readonly input placeholder is correct and consistent with the other i18n changes; just confirmlabels.text.NoFileSelectedis present in all locale files.src/app/organization/organization-routing.module.ts (1)
551-557: Breadcrumb typo fix is correctUpdating 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 localizedSwitching the two search inputs to
labels.text.SearchByNameandlabels.text.SearchByExternalIDvia 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: EnsureentryTypeFilterData.optionvalues are translation keysRendering
{{ filter.option | translate }}is correct provided everyfilter.optionis 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 newlabels.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 correctlyThe three placeholders now use
labels.text.ClientName,labels.text.FromClientId, andlabels.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 localizedAll 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 correctLocalizing “every” via
labels.commons.everyand using 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 keysThe 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
TranslatePipeis 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
findto extract catalog values followed bytranslateKey: '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: ThetranslateKeypipe is properly configured and translation keys are in place.The additions of
translateKey: 'catalogs'for bothweekDays[i].nameandrepaymentRescheduleType.valueare correct:
- The
TranslatePipe(namedtranslateKey) is included inSTANDALONE_SHARED_IMPORTS- The
weekDaysarray contains translation key values ('Monday', 'Tuesday', 'Wednesday', etc.) that match thelabels.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 textThe extensive additions significantly improve internationalization coverage across the application.
860-864: Excellent password validation message additionsThe new
passwordPreferencessection 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 translationsThe 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
src/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.html
Show resolved
Hide resolved
src/app/system/roles-and-permissions/view-role/view-role.component.ts
Outdated
Show resolved
Hide resolved
4437244 to
21b3824
Compare
There was a problem hiding this comment.
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 consistentThe 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 onLOAN_PROVISIONINGnow 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 translationsThe
namevalue is now"Recurring Deposit Accounts", which aligns with thelabels.heading.Recurring Deposit Accountstranslation 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-labelcontent, 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 forentryTypeFilterData.The
entryTypeFilterDataarray currently has an implicitany[]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 localizingtitleattributesThe 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 adjacenttitle="..."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.,
EnterAmount→Enter Amountor using proper translation key paths).Affected keys
Lines 2949-2952:
EnterAmountEnterPhoneNumberEnterTransferDescriptionLines 3052-3053:
FilterByLoanIdOrErrorLines 3169-3170:
NoFileSelectedNoNotesAvailableLines 3253-3261:
SearchByNameSearchByClientSearchByExternalIDSelectDateSelectOrTypeClientNameLines 3075-3076:
FromAccountIdFromClientIdAlso applies to: 3052-3053, 3169-3170, 3253-3261, 3075-3076
860-864: Consider UI implications of lengthy password preference strings.The
passwordPreferencessection 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_transferandaccount_transfer(lines 548-549)Authorisationandauthorisation(lines 552-553)Cash_mgmtandcash_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 conventionSeveral 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
📒 Files selected for processing (43)
src/app/account-transfers/list-standing-instructions/list-standing-instructions.component.htmlsrc/app/account-transfers/make-account-transfers/make-account-transfers.component.htmlsrc/app/accounting/search-journal-entry/search-journal-entry.component.htmlsrc/app/accounting/search-journal-entry/search-journal-entry.component.tssrc/app/centers/centers.component.htmlsrc/app/clients/client-stepper/client-family-members-step/client-family-member-dialog/client-family-member-dialog.component.htmlsrc/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.htmlsrc/app/clients/clients-view/family-members-tab/add-family-member/add-family-member.component.htmlsrc/app/clients/clients-view/family-members-tab/edit-family-member/edit-family-member.component.htmlsrc/app/clients/clients.component.htmlsrc/app/clients/edit-client/edit-client.component.htmlsrc/app/core/shell/breadcrumb/breadcrumb.component.tssrc/app/groups/groups.component.htmlsrc/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.htmlsrc/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.tssrc/app/loans/loans-view/account-details/account-details.component.htmlsrc/app/loans/loans-view/general-tab/general-tab.component.htmlsrc/app/organization/bulk-import/view-bulk-import/bulk-imports.tssrc/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.htmlsrc/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.htmlsrc/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.tssrc/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.tssrc/app/organization/organization-routing.module.tssrc/app/organization/password-preferences/password-preferences.component.htmlsrc/app/organization/working-days/working-days.component.htmlsrc/app/pipes/yesno.pipe.tssrc/app/shared/file-upload/file-upload.component.htmlsrc/app/shared/tabs/entity-notes-tab/entity-notes-tab.component.htmlsrc/app/system/manage-jobs/cob-workflow/loan-locked/loan-locked.component.htmlsrc/app/system/roles-and-permissions/view-role/view-role.component.tssrc/assets/translations/cs-CS.jsonsrc/assets/translations/de-DE.jsonsrc/assets/translations/en-US.jsonsrc/assets/translations/es-CL.jsonsrc/assets/translations/es-MX.jsonsrc/assets/translations/fr-FR.jsonsrc/assets/translations/it-IT.jsonsrc/assets/translations/ko-KO.jsonsrc/assets/translations/lt-LT.jsonsrc/assets/translations/lv-LV.jsonsrc/assets/translations/ne-NE.jsonsrc/assets/translations/pt-PT.jsonsrc/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.tssrc/app/clients/clients.component.htmlsrc/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.htmlsrc/app/loans/loans-view/general-tab/general-tab.component.htmlsrc/app/organization/bulk-import/view-bulk-import/bulk-imports.tssrc/app/account-transfers/make-account-transfers/make-account-transfers.component.htmlsrc/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.htmlsrc/app/clients/clients-view/family-members-tab/add-family-member/add-family-member.component.htmlsrc/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.htmlsrc/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 thefindandtranslateKeypipes are properly imported and implemented.src/app/loans/loans-view/general-tab/general-tab.component.html (1)
32-32: No changes required. Theele.propertyis 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 underlabels.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 translationsThe added readonly
matInputfields for Bank, Client, Account Type, and Account correctly re-use existinglabels.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 usageThe added/updated labels (
"Edit Criteria Definition","Change Loan Officer",ClientName, the variousEnter*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 asmake-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 fineThe 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:
- This duplication is intentional to support different UI contexts
- The translations should maintain consistent capitalization, or
- 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 Definitionkey 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
passwordPreferencessection 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 patternThe 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 translationsThe Latvian translations for day names (pirmdiena, otrdiena, etc.) and scheduling options are accurate and follow proper Latvian grammar conventions.
2856-2857: LGTM - UI placeholder translationsThe 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
passwordPreferencesblock 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_transferandaccount_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
passwordPreferencessection 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
UploadDocumentHintclearly 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:
- Button labels and actions - Edit Criteria Definition, Change Loan Officer
- Catalog normalization - Capitalization variants for flexible key lookup
- Scheduling features - Days of the week and scheduling options
- Password validation - New passwordPreferences section with detailed rules
- UI placeholders and hints - Form fields, search, selection prompts
- Entry types - Manual/System entries
- 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 translationsThe new
passwordPreferencessection properly covers different password validation policies. The translations clearly communicate the requirements in Nepali.
797-808: LGTM: Day names and scheduling optionsThe 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 sectionThe 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 Definitionbutton label reads correctlyItalian wording is clear and matches surrounding button-label style; no issues spotted.
548-605: New catalog entries and schedule options look consistentThe 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 accurateThe new
everylabel andpasswordPreferencesblock 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 Entriestranslations are idiomatic enough and consistent with nearby accounting terminology; no functional or clarity issues.
2627-2627:Change Loan Officermenu entry is consistentThe translation fits the existing infinitive-style action labels in the
menussection and is unambiguous.
2856-2856: New search, prompt, and placeholder texts are clearAll 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 safeThe newly added keys (e.g.,
labels.buttons.Edit Criteria Definition, the variouslabels.catalogs.*entries,commons.every,passwordPreferences.*,inputs.Manual Entries/inputs.System Entries, and text keys likeClientName,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 i18nUsing
{{ 'labels.heading.' + bulkImport.name | translate }}(and appending the translatedTemplatesuffix) is a clean way to localize these headings, and it now matches the correctedBulkImportsnames (including “Recurring Deposit Accounts”). As long as eachbulkImport.namehas a correspondinglabels.heading.*key in the JSON (which this PR adds), this will render correctly across locales.Also applies to: 70-70
...p/clients/clients-view/family-members-tab/add-family-member/add-family-member.component.html
Outdated
Show resolved
Hide resolved
|
@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
21b3824 to
fa6d98a
Compare
@IOhacker Sorry for the typo—I’ve fixed it. |
There was a problem hiding this comment.
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
anytostring, which is an improvement. However, the early return guardif (!string)at line 180 suggests the function may receivenullorundefined, but the parameter typestringdoesn'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:
- Update the parameter type to
string | null | undefinedto match the guard logic- 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 astringis 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" fromlabels.buttonstolabels.headingin translation filesThe components use the key path
labels.heading.Edit Criteria Definition(in bothCreateLoanProvisioningCriteriaComponent.editDefinition()andEditLoanProvisioningCriteriaComponent.editDefinition()), but in both lt-LT.json and en-US.json the string is currently underlabels.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.headingin 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
passwordPreferencesblock 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
idproperty 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 i18nThe new
TranslateServiceimport/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 Definitionexists in all locale JSONs; inlt-LT.jsonthe new translation currently sits underlabels.buttons.Edit Criteria Definition, so that locale will likely fall back to English for this title unless you also add it underlabels.heading.- Line 152: If
layout.addButtonTextis rendered as‑is byFormDialogComponent, consider passing a translated value instead (for example viathis.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 checksThe 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 inlt-LT.jsonthe string is underlabels.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 alabels.buttons.Confirmkey), unlessFormDialogComponentalready 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
translateKeypipe, but the status dropdown still displaysstatus.namedirectly. 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
placeholderssection 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
passwordPreferencessection 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:
- The Swahili translations accurately reflect the English messages
- 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:
- Whether both variations are actually needed in the codebase
- Using a single key with CSS text-transform if this is purely for display formatting
- 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/SSBENEFICIARYTPTare 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
📒 Files selected for processing (43)
src/app/account-transfers/list-standing-instructions/list-standing-instructions.component.htmlsrc/app/account-transfers/make-account-transfers/make-account-transfers.component.htmlsrc/app/accounting/search-journal-entry/search-journal-entry.component.htmlsrc/app/accounting/search-journal-entry/search-journal-entry.component.tssrc/app/centers/centers.component.htmlsrc/app/clients/client-stepper/client-family-members-step/client-family-member-dialog/client-family-member-dialog.component.htmlsrc/app/clients/clients-view/custom-dialogs/edit-notes-dialog/edit-notes-dialog.component.htmlsrc/app/clients/clients-view/family-members-tab/add-family-member/add-family-member.component.htmlsrc/app/clients/clients-view/family-members-tab/edit-family-member/edit-family-member.component.htmlsrc/app/clients/clients.component.htmlsrc/app/clients/edit-client/edit-client.component.htmlsrc/app/core/shell/breadcrumb/breadcrumb.component.tssrc/app/groups/groups.component.htmlsrc/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.htmlsrc/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.tssrc/app/loans/loans-view/account-details/account-details.component.htmlsrc/app/loans/loans-view/general-tab/general-tab.component.htmlsrc/app/organization/bulk-import/view-bulk-import/bulk-imports.tssrc/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.htmlsrc/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.htmlsrc/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.tssrc/app/organization/loan-provisioning-criteria/edit-loan-provisioning-criteria/edit-loan-provisioning-criteria.component.tssrc/app/organization/organization-routing.module.tssrc/app/organization/password-preferences/password-preferences.component.htmlsrc/app/organization/working-days/working-days.component.htmlsrc/app/pipes/yesno.pipe.tssrc/app/shared/file-upload/file-upload.component.htmlsrc/app/shared/tabs/entity-notes-tab/entity-notes-tab.component.htmlsrc/app/system/manage-jobs/cob-workflow/loan-locked/loan-locked.component.htmlsrc/app/system/roles-and-permissions/view-role/view-role.component.tssrc/assets/translations/cs-CS.jsonsrc/assets/translations/de-DE.jsonsrc/assets/translations/en-US.jsonsrc/assets/translations/es-CL.jsonsrc/assets/translations/es-MX.jsonsrc/assets/translations/fr-FR.jsonsrc/assets/translations/it-IT.jsonsrc/assets/translations/ko-KO.jsonsrc/assets/translations/lt-LT.jsonsrc/assets/translations/lv-LV.jsonsrc/assets/translations/ne-NE.jsonsrc/assets/translations/pt-PT.jsonsrc/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.tssrc/app/shared/tabs/entity-notes-tab/entity-notes-tab.component.htmlsrc/app/account-transfers/make-account-transfers/make-account-transfers.component.htmlsrc/app/system/roles-and-permissions/view-role/view-role.component.tssrc/app/loans/loans-account-stepper/loans-account-preview-step/loans-account-preview-step.component.tssrc/app/loans/loans-view/account-details/account-details.component.htmlsrc/app/organization/bulk-import/view-bulk-import/view-bulk-import.component.htmlsrc/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.tssrc/app/organization/entity-data-table-checks/create-entity-data-table-checks/create-entity-data-table-checks.component.htmlsrc/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.htmlsrc/app/loans/loans-view/account-details/account-details.component.htmlsrc/app/organization/loan-provisioning-criteria/create-loan-provisioning-criteria/create-loan-provisioning-criteria.component.tssrc/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 consistentThe new
passwordPreferencesblock 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
passwordPreferencessection 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 likeCash_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 (
CamelCasewith 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: ImpureyesNopipe is now correctly simplified; only minor typing nit remains.Switching to
@Pipe({ name: 'yesNo', pure: false })and removing the unusedonLangChangesubscription resolves the earlier lifecycle/memory concern; Angular’s change detection will now re‑invoke this impure pipe when the language changes, so theTranslateService.instant('labels.buttons.' + result)lookup stays in sync without extra plumbing.One small improvement you could consider (non-blocking):
transformcurrently returnsnullwhenvalue == nullbut is typed asstring. If strict null checks are enabled, changing the signature totransform(value: boolean | null | undefined, ...): string | nullwould 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
passwordPreferencessection 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
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 additionsThe new translation entries added in this PR follow good patterns:
- Catalog entries (lines 548-810): Properly include both capitalized and lowercase variants (e.g.,
Account_transferandaccount_transfer) to support different UI contexts- Placeholder keys (lines 2856-2860): CamelCase keys like
ClientName,FromAccountId,SelectDatefollow modern UI conventions- UI helper messages (lines 3169-3170): Keys like
NoFileSelected,NoNotesAvailableare clear and self-documentingAll 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 localesThe English keys in the
passwordPreferencessection 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 consistentKey and Italian translation (“Modifica Definizione Criteri”) are clear and consistent with surrounding button labels.
548-606: Catalog / enum additions look structurally soundNew 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 fineTranslation (“Cambiare l'ufficiale di prestito”) is understandable and consistent with other imperative-style menu items.
2856-2856:ClientNamehelper text is clear
"ClientName": "Nome del cliente"is straightforward and matches usage implied by client search / display contexts.
3053-3053:FilterByLoanIdOrErrorlabel 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:Optionalflag 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
passwordPreferencesmessages 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 localesThe 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 localesSwitching 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.EnterPhoneNumberlabels.text.SelectDatelabels.text.SelectOrTypeClientNamelabels.text.EnterAmountlabels.text.EnterTransferDescriptionNo 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 correctlyAll 18
bulkImport.namevalues have matchinglabels.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
translationKeyfield to each bulk import definition and binding to that instead ofname, or- Backing this with a small test/script that asserts every
bulkImport.namehas a correspondinglabels.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 consistentThe 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 coherentThe 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 correctThis 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.
…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
Bug Fixes
Style
✏️ Tip: You can customize this high-level summary in your review settings.