Skip to content

Feature/dutch nl nl language support#10304

Merged
pavinduLakshan merged 30 commits into
wso2:masterfrom
Shazaanashraff:feature/dutch-nl-NL-language-support
May 25, 2026
Merged

Feature/dutch nl nl language support#10304
pavinduLakshan merged 30 commits into
wso2:masterfrom
Shazaanashraff:feature/dutch-nl-NL-language-support

Conversation

@Shazaanashraff
Copy link
Copy Markdown
Contributor

@Shazaanashraff Shazaanashraff commented May 19, 2026

Purpose

Adds complete out-of-the-box Dutch (nl-NL) language support to all WSO2 Identity Server user-facing portals. Before this PR, Dutch was not available in the language switcher. This is a full re-implementation of #10273, addressing all gaps flagged in that review.

What this PR does in plain terms:

  • The sign-in page, password recovery pages, and My Account dashboard all have a language switcher dropdown. Dutch was missing from that list. This PR adds it.
  • For the React-based My Account portal: added ~2,200 Dutch translated strings across 4 TypeScript files under modules/i18n/src/translations/nl-NL/.
  • For the Java-based JSP portals (login, recovery, accounts, x509): added Resources_nl_NL.properties to each of the 4 portals — these are simple key=value text files that Java loads at runtime to serve translated strings.
  • Registered Dutch in the language switcher dropdown of each portal by adding one line to each LanguageOptions.properties file.
  • Registered Dutch in the LocaleOptions.properties in the recovery portal (controls the locale attribute dropdown in self-registration).
  • Registered the NL_NL locale export in modules/i18n/src/translations/index.ts.
  • All changes are purely additive — 3,853 insertions, 0 deletions to existing code.

Screenshots: Attached (language switcher showing Dutch, login page in Dutch, My Account dashboard in Dutch).

Related Issues

OOTB Support for Dutch language in Identity Server Frontend applications wso2/product-is#27782

Related PRs

#10273 (prior attempt — closed; this PR addresses all gaps flagged in that review)

Checklist

  • e2e cypress tests locally verified. (for internal contributers)
  • Manual test round performed and verified.
  • UX/UI review done on the final implementation.
  • Documentation provided. (Add links if there are any)
  • Relevant backend changes deployed and verified
  • Unit tests provided. (Add links if there are any)
  • Integration tests provided. (Add links if there are any)

Manual test summary:
Downloaded WSO2 IS 7.3.0 from GitHub releases. Configured deployment.toml with CORS and myaccount callback URL, deployed the built portal WARs, started IS, then ran the React dev server (pnpm --filter @wso2is/myaccount start). Logged in at https://localhost:9000/myaccount with admin/admin.

Verified:

  • "Nederlands - Nederland" appears in the language switcher dropdown ✓
  • Login page and loading screen render in Dutch after selection ✓
  • My Account dashboard renders in Dutch (via dev server with updated @wso2is/i18n) ✓
  • JSP portal strings (sign-in, privacy policy, terms of service, password recovery) render in Dutch ✓
  • All other existing languages unaffected ✓

Unit tests added:

  • modules/i18n/src/__tests__/nl-NL-registration.test.ts — verifies NL_NL export exists with correct meta and is included in supportedI18nLanguages
  • modules/i18n/src/__tests__/nl-NL-completeness.test.ts — verifies common and myAccount namespaces exist and match en-US top-level key structure
  • modules/i18n/src/__tests__/nl-NL-no-english-bleed.test.ts — spot-checks that key values are Dutch (Annuleren, Opslaan, Verwijderen, Zoeken, Afmelden)
  • scripts/check-nl-properties.js — Node script confirming all 4 Resources_nl_NL.properties files exist and all 4 LanguageOptions.properties contain the nl_NL entry

All tests passed locally (pnpm --filter @wso2is/i18n test).

Security checks

Screenshot 2026-05-19 164338 Screenshot 2026-05-19 171122 Screenshot 2026-05-19 171154 Screenshot 2026-05-19 171208 Screenshot 2026-05-19 171229

Note for reviewer: A native Dutch speaker review is requested before merge to verify translation quality. No behavioural changes — this is purely additive (new locale files only). CI regression suite should pass unchanged.

Add complete Dutch translations for all WSO2 Identity Server user-facing
portals and the React i18n module:

- modules/i18n: nl-NL locale (meta, index, common, common-users, myaccount)
- authentication-portal: Resources_nl_NL.properties + LanguageOptions entry
- recovery-portal: Resources_nl_NL.properties + LanguageOptions entry
- accounts portal: Resources_nl_NL.properties + LanguageOptions entry
- x509-certificate-authentication-portal: Resources_nl_NL.properties + LanguageOptions entry

Resolves: wso2/product-is#27782
Add Dutch (nl-NL) to the locale dropdown used in the self-registration
locale attribute input (recovery-portal/LocaleOptions.properties).

Completes the nl-NL surface coverage so Dutch users can select Nederlands
(Nederland) as their preferred locale when self-registering.
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 19, 2026

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Dutch language support added across identity platform portals. Portal language switchers and locale configuration updated, backend translation property files created, React i18n TypeScript modules introduced for metadata and portal strings, and comprehensive tests and validation scripts provided.

Changes

Dutch (nl-NL) locale implementation

Layer / File(s) Summary
Release declaration and language configuration
.changeset/add-dutch-nl-NL-language-support.md, identity-apps-core/apps/*/src/main/resources/LanguageOptions.properties, identity-apps-core/apps/recovery-portal/src/main/resources/LocaleOptions.properties
Changeset declares minor version bumps for i18n and portal packages. Language switcher entries (lang.switch.nl_NL) and locale mapping (locale.switch.nl_NL) added to accounts, authentication, recovery, and X509 portal configuration files.
Backend translation resource bundles
identity-apps-core/apps/*/src/main/resources/.../i18n/Resources_nl_NL.properties
Dutch i18n property files created for accounts, authentication, recovery, and X509 certificate portals, translating UI text, authentication flows (OTP, TOTP, push, FIDO, magic link), password recovery and reset, account management, SCIM attributes, and error messages.
React i18n TypeScript modules and exports
modules/i18n/src/translations/nl-NL/*, modules/i18n/src/translations/index.ts
Dutch locale metadata object and portal translation modules (common, commonUsers, myAccount) defined with TypeScript types. Modules re-exported through portals barrel and main translations index.
Tests and validation scripts
modules/i18n/src/__tests__/nl-NL-*.test.ts, scripts/check-nl-properties.js
Jest test suites validate nl-NL locale registration metadata and recursively compare Dutch and English translation structures. Node.js validation script verifies existence of nl-NL resource files and presence of lang.switch.nl_NL configuration entries.
Maintenance
.gitignore
Gitignore updated to exclude test artifact file.

Suggested reviewers

  • NipuniBhagya
  • pavinduLakshan
🚥 Pre-merge checks | ✅ 5 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Feature/dutch nl nl language support' clearly describes the main change: adding Dutch language support. It directly aligns with the changeset's primary objective of implementing nl-NL translations across all portals.
Description check ✅ Passed The PR description is comprehensive and well-structured, covering purpose, related issues, manual testing verification, unit test details, security checks, and screenshots. It thoroughly documents the scope of changes and testing performed.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Changeset Required ✅ Passed Changeset file .changeset/add-dutch-nl-NL-language-support.md exists with all required packages and proper minor version updates.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • 🛠️ create changeset

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

❤️ Share

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

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (4)
modules/i18n/src/__tests__/nl-NL-completeness.test.ts (1)

23-23: 💤 Low value

Consider adding explicit type annotations.

Variables myaccount and commonUsers lack explicit type annotations. As per coding guidelines, variables should have explicit types even when the type is obvious.

✨ Suggested improvement
-    const myaccount = NL_NL.resources.portals.myAccount;
+    const myaccount: Record<string, unknown> = NL_NL.resources.portals.myAccount as Record<string, unknown>;
-    const commonUsers = NL_NL.resources.portals.commonUsers;
+    const commonUsers: Record<string, unknown> = NL_NL.resources.portals.commonUsers as Record<string, unknown>;

As per coding guidelines, explicit type annotations should be used everywhere.

Also applies to: 30-30

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modules/i18n/src/__tests__/nl-NL-completeness.test.ts` at line 23, The
variables `myaccount` and `commonUsers` are missing explicit type annotations;
update their declarations to include the appropriate type (e.g., the portal
resource type or a matching interface) instead of relying on type
inference—locate the assignments that use `NL_NL.resources.portals.myAccount`
and `NL_NL.resources.portals.commonUsers` and annotate them with the correct
type (same type used across other portal resource tests or the portal resource
interface) so the declarations are explicitly typed.
scripts/check-nl-properties.js (1)

31-40: 💤 Low value

Consider adding error handling for file operations.

The fs.readFileSync call on line 32 will throw an uncaught exception if the file doesn't exist or can't be read. While these files should exist, adding error handling would make the script more robust and provide clearer error messages.

🛡️ Suggested improvement
 langFiles.forEach((file) => {
+    try {
         const content = fs.readFileSync(path.resolve(file), "utf8");
         const hasNl = content.includes("lang.switch.nl_NL");
         console.log(`${hasNl ? "✓" : "✗"} ${file.split("/").slice(-2).join("/")} has nl_NL entry`);
         if (hasNl) {
             passed++;
         } else {
             failed++;
         }
+    } catch (error) {
+        console.log(`✗ ${file.split("/").slice(-2).join("/")} - Error reading file: ${error.message}`);
+        failed++;
+    }
 });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/check-nl-properties.js` around lines 31 - 40, Wrap the file read and
inspect logic inside the langFiles.forEach callback (where fs.readFileSync is
called) with a try/catch so IO errors are caught; on error, log a clear message
including the file name and the caught error, increment failed (so the script
reflects the problem) and continue to the next file, otherwise proceed to
compute hasNl and update passed/failed as now; ensure you reference the existing
symbols langFiles.forEach, fs.readFileSync, hasNl, passed and failed when making
the change.
modules/i18n/src/__tests__/nl-NL-registration.test.ts (1)

14-14: ⚡ Quick win

Replace any with proper typing.

The map callback uses (bundle: any) which violates the coding guideline: "Never use any; use proper types or unknown with type guards." Consider using unknown with proper type checking.

♻️ Suggested improvement
     it("nl-NL is re-exported from the translation barrel", () => {
-        const codes = Object.values(translations).map((bundle: any) => bundle.meta?.code);
+        const codes: (string | undefined)[] = Object.values(translations).map(
+            (bundle: unknown): string | undefined => 
+                typeof bundle === "object" && bundle !== null && "meta" in bundle 
+                    ? (bundle as { meta?: { code?: string } }).meta?.code 
+                    : undefined
+        );
         expect(codes).toContain("nl-NL");
     });

As per coding guidelines, any should never be used.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modules/i18n/src/__tests__/nl-NL-registration.test.ts` at line 14, The map
callback for computing `codes` currently uses `(bundle: any)`—replace `any` with
`unknown` and add a runtime type guard for `bundle` to ensure it's an object
with a `meta` property that contains `code`; update the callback signature to
`(bundle: unknown)` and inside the mapper check `typeof bundle === 'object' &&
bundle !== null && 'meta' in bundle` (or implement a reusable type predicate
like `isTranslationBundle`) before accessing `bundle.meta.code`, returning the
code or undefined accordingly so the types are safe without using `any`.
modules/i18n/src/__tests__/nl-NL-no-english-bleed.test.ts (1)

4-8: ⚡ Quick win

Replace as any with proper typing.

The test assertions use (common as any) which violates the coding guideline: "Never use any; use proper types or unknown with type guards." Consider properly typing the common object or using a type-safe accessor pattern.

♻️ Suggested improvement
+interface CommonTranslations {
+    cancel: string;
+    save: string;
+    delete: string;
+    search: string;
+    logout: string;
+}
+
 describe("nl-NL common spot-check Dutch values", () => {
-    it("cancel is Dutch", () => expect((common as any).cancel).toBe("Annuleren"));
-    it("save is Dutch", () => expect((common as any).save).toBe("Opslaan"));
-    it("delete is Dutch", () => expect((common as any).delete).toBe("Verwijderen"));
-    it("search is Dutch", () => expect((common as any).search).toBe("Zoeken"));
-    it("logout is Dutch", () => expect((common as any).logout).toBe("Afmelden"));
+    const typedCommon: CommonTranslations = common as CommonTranslations;
+    
+    it("cancel is Dutch", () => expect(typedCommon.cancel).toBe("Annuleren"));
+    it("save is Dutch", () => expect(typedCommon.save).toBe("Opslaan"));
+    it("delete is Dutch", () => expect(typedCommon.delete).toBe("Verwijderen"));
+    it("search is Dutch", () => expect(typedCommon.search).toBe("Zoeken"));
+    it("logout is Dutch", () => expect(typedCommon.logout).toBe("Afmelden"));
 });

As per coding guidelines, any should never be used.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modules/i18n/src/__tests__/nl-NL-no-english-bleed.test.ts` around lines 4 -
8, The tests use an untyped cast `(common as any)` — replace this with a proper
type for `common` (e.g., declare or import an interface like `CommonStrings`
with properties cancel, save, delete, search, logout) and cast/annotate `common`
to that type (or use `unknown` + a runtime type guard) so each assertion reads
e.g. `expect((common as CommonStrings).cancel).toBe("Annuleren")`; update the
test file’s top to import/declare `CommonStrings` and remove all `as any`
occurrences, or add a short type guard function to safely assert properties
before asserting values.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_nl_NL.properties`:
- Line 227: Fix the typo in the property value for key
If.you.specify.tenant.domain.you.registered.under.super.tenant by replacing
"supertenannt" with the correct word "supertenant" so the user-facing Dutch
string reads "Als u geen tenantdomein opgeeft, wordt u geregistreerd onder de
supertenant".
- Line 457: The encoded SCIM key `VW5sb2rIFRpbWU_` is malformed and won't match
runtime lookups for "Unlock Time"; replace that key with the correct Base64
encoding `VW5sb2NrIFRpbWU=` while keeping the translation value `Ontgrendeltijd`
unchanged so the entry becomes `VW5sb2NrIFRpbWU=:{Ontgrendeltijd}` (i.e., update
the left-hand key only).

---

Nitpick comments:
In `@modules/i18n/src/__tests__/nl-NL-completeness.test.ts`:
- Line 23: The variables `myaccount` and `commonUsers` are missing explicit type
annotations; update their declarations to include the appropriate type (e.g.,
the portal resource type or a matching interface) instead of relying on type
inference—locate the assignments that use `NL_NL.resources.portals.myAccount`
and `NL_NL.resources.portals.commonUsers` and annotate them with the correct
type (same type used across other portal resource tests or the portal resource
interface) so the declarations are explicitly typed.

In `@modules/i18n/src/__tests__/nl-NL-no-english-bleed.test.ts`:
- Around line 4-8: The tests use an untyped cast `(common as any)` — replace
this with a proper type for `common` (e.g., declare or import an interface like
`CommonStrings` with properties cancel, save, delete, search, logout) and
cast/annotate `common` to that type (or use `unknown` + a runtime type guard) so
each assertion reads e.g. `expect((common as
CommonStrings).cancel).toBe("Annuleren")`; update the test file’s top to
import/declare `CommonStrings` and remove all `as any` occurrences, or add a
short type guard function to safely assert properties before asserting values.

In `@modules/i18n/src/__tests__/nl-NL-registration.test.ts`:
- Line 14: The map callback for computing `codes` currently uses `(bundle:
any)`—replace `any` with `unknown` and add a runtime type guard for `bundle` to
ensure it's an object with a `meta` property that contains `code`; update the
callback signature to `(bundle: unknown)` and inside the mapper check `typeof
bundle === 'object' && bundle !== null && 'meta' in bundle` (or implement a
reusable type predicate like `isTranslationBundle`) before accessing
`bundle.meta.code`, returning the code or undefined accordingly so the types are
safe without using `any`.

In `@scripts/check-nl-properties.js`:
- Around line 31-40: Wrap the file read and inspect logic inside the
langFiles.forEach callback (where fs.readFileSync is called) with a try/catch so
IO errors are caught; on error, log a clear message including the file name and
the caught error, increment failed (so the script reflects the problem) and
continue to the next file, otherwise proceed to compute hasNl and update
passed/failed as now; ensure you reference the existing symbols
langFiles.forEach, fs.readFileSync, hasNl, passed and failed when making the
change.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

Run ID: 456ad181-4c5e-4f20-89ac-e1ff457a68ba

📥 Commits

Reviewing files that changed from the base of the PR and between fba5383 and 23340a6.

📒 Files selected for processing (21)
  • .changeset/add-dutch-nl-NL-language-support.md
  • identity-apps-core/apps/accounts/src/main/resources/LanguageOptions.properties
  • identity-apps-core/apps/accounts/src/main/resources/org/wso2/carbon/identity/application/accounts/endpoint/i18n/Resources_nl_NL.properties
  • identity-apps-core/apps/authentication-portal/src/main/resources/LanguageOptions.properties
  • identity-apps-core/apps/authentication-portal/src/main/resources/org/wso2/carbon/identity/application/authentication/endpoint/i18n/Resources_nl_NL.properties
  • identity-apps-core/apps/recovery-portal/src/main/resources/LanguageOptions.properties
  • identity-apps-core/apps/recovery-portal/src/main/resources/LocaleOptions.properties
  • identity-apps-core/apps/recovery-portal/src/main/resources/org/wso2/carbon/identity/mgt/recovery/endpoint/i18n/Resources_nl_NL.properties
  • identity-apps-core/apps/x509-certificate-authentication-portal/src/main/resources/LanguageOptions.properties
  • identity-apps-core/apps/x509-certificate-authentication-portal/src/main/resources/org/wso2/carbon/identity/application/authentication/endpoint/i18n/Resources_nl_NL.properties
  • modules/i18n/src/__tests__/nl-NL-completeness.test.ts
  • modules/i18n/src/__tests__/nl-NL-no-english-bleed.test.ts
  • modules/i18n/src/__tests__/nl-NL-registration.test.ts
  • modules/i18n/src/translations/index.ts
  • modules/i18n/src/translations/nl-NL/index.ts
  • modules/i18n/src/translations/nl-NL/meta.ts
  • modules/i18n/src/translations/nl-NL/portals/common-users.ts
  • modules/i18n/src/translations/nl-NL/portals/common.ts
  • modules/i18n/src/translations/nl-NL/portals/index.ts
  • modules/i18n/src/translations/nl-NL/portals/myaccount.ts
  • scripts/check-nl-properties.js

Comment thread scripts/check-nl-properties.js Outdated
Comment thread .changeset/add-dutchlang-support.md
Comment thread modules/i18n/src/__tests__/nl-NL-completeness.test.ts Outdated
Comment thread modules/i18n/src/__tests__/nl-NL-no-english-bleed.test.ts Outdated
Comment thread modules/i18n/src/__tests__/nl-NL-no-english-bleed.test.ts Outdated
Comment thread modules/i18n/src/__tests__/nl-NL-registration.test.ts Outdated
Comment thread modules/i18n/src/__tests__/nl-NL-registration.test.ts Outdated
Co-authored-by: Pavindu Lakshan <pavindulakshan@gmail.com>
Copy link
Copy Markdown
Member

@pavinduLakshan pavinduLakshan left a comment

Choose a reason for hiding this comment

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

Let's add the license header to all newly added files, and address the review comments from coderabbit.

@coderabbitai coderabbitai Bot requested a review from pavinduLakshan May 22, 2026 16:42
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@modules/i18n/src/__tests__/nl-NL-registration.test.ts`:
- Line 14: The test uses `any` and lacks an explicit type for `codes`; replace
`any` with a proper type and annotate `codes` explicitly: define or import an
interface like `TranslationBundle { meta?: { code?: string } }` (or use
`unknown` with a type guard) then change the map to
Object.values(translations).map((bundle: TranslationBundle) =>
bundle.meta?.code) and declare const codes: (string | undefined)[] = ... so
`bundle` is strongly typed and `codes` has an explicit type referencing
`meta?.code`.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

Run ID: 994b700f-15db-4031-8c80-7f155d426517

📥 Commits

Reviewing files that changed from the base of the PR and between 7a679e3 and 45bccf2.

📒 Files selected for processing (3)
  • modules/i18n/src/__tests__/nl-NL-completeness.test.ts
  • modules/i18n/src/__tests__/nl-NL-no-english-bleed.test.ts
  • modules/i18n/src/__tests__/nl-NL-registration.test.ts
✅ Files skipped from review due to trivial changes (2)
  • modules/i18n/src/tests/nl-NL-no-english-bleed.test.ts
  • modules/i18n/src/tests/nl-NL-completeness.test.ts

Comment thread modules/i18n/src/__tests__/nl-NL-registration.test.ts Outdated
@pavinduLakshan
Copy link
Copy Markdown
Member

There is a typescript build failure due to the recently added new i18n. shall we include those as well in nl translations?

@Shazaanashraff
Copy link
Copy Markdown
Contributor Author

completed the new push with the latest minor changes requested

  1. Add explicit return type to i18n test helper
  2. Flatten Dutch X509 error messages
  3. Remove redundant nl-NL structure tests
  4. Add license header to Dutch registration test

Sorry for the minor issues. I am new to the WS02 workspace, i did this for the internship opportunity for SE.

@pavinduLakshan
Copy link
Copy Markdown
Member

completed the new push with the latest minor changes requested

  1. Add explicit return type to i18n test helper
  2. Flatten Dutch X509 error messages
  3. Remove redundant nl-NL structure tests
  4. Add license header to Dutch registration test

Thanks, I will take a look.

Sorry for the minor issues. I am new to the WS02 workspace, i did this for the internship opportunity for SE.

No worries, you're already well ahead of the level of most external contributions we typically receive :)

Comment thread modules/i18n/src/__tests__/nl-NL-completeness.test.ts Outdated
Comment thread modules/i18n/src/__tests__/nl-NL-registration.test.ts Outdated
Comment thread modules/i18n/src/translations/nl-NL/index.ts Outdated
Comment thread modules/i18n/src/__tests__/nl-NL-completeness.test.ts Outdated
Comment thread .changeset/add-dutch-nl-NL-language-support.md Outdated
Co-authored-by: Pavindu Lakshan <pavindulakshan@gmail.com>
@pavinduLakshan
Copy link
Copy Markdown
Member

Hi @Shazaanashraff, could you check and resolve https://github.com/wso2/identity-apps/pull/10304/changes#r3293825732 as well? Once done, we are good to merge.

@pavinduLakshan
Copy link
Copy Markdown
Member

PS: I did some minor changes to the PR myself, so please take a pull before pushing your changes.

@pavinduLakshan
Copy link
Copy Markdown
Member

pavinduLakshan commented May 24, 2026

The typecheck job is failing with the following errors.

Error: src/translations/nl-NL/portals/myaccount.ts(23,5): error TS2741: Property 'policyConsentManagement' is missing in type '{ accountRecovery: { SMSRecovery: { descriptions: { add: string; emptyMobile: string; update: string; view: string; }; forms: { mobileResetForm: { inputs: { mobile: { label: string; placeholder: string; validations: { ...; }; }; }; }; }; heading: string; notifications: { ...; }; }; codeRecovery: { ...; }; emailRecov...' but required in type '{ advancedSearch: { form: { inputs: { filterAttribute: { label: string; placeholder: string; validations: { empty: string; }; }; filterCondition: { label: string; placeholder: string; validations: { empty: string; }; }; filterValue: { ...; }; }; }; ... 4 more ...; resultsIndicator: string; }; ... 20 more ...; mobile...'.

This occurs because the nl translation doesn't have i18n keys for policyConsentManagement object.

Error: src/translations/nl-NL/portals/myaccount.ts(1643,5): error TS2741: Property 'consents' is missing in type '{ applications: { subTitle: string; title: string; }; overview: { subTitle: string; title: string; }; personalInfo: { subTitle: string; title: string; }; personalInfoWithoutExportProfile: { subTitle: string; title: string; }; personalInfoWithoutLinkedAccounts: { ...; }; privacy: { ...; }; readOnlyProfileBanner: stri...' but required in type '{ applications: Page; consents: Page; overview: Page; personalInfo: Page; personalInfoWithoutLinkedAccounts: Page; personalInfoWithoutExportProfile: Page; privacy: Page; readOnlyProfileBanner: string; security: Page; }'.

Due to missing translations in NL translation file for consents object

Error: src/translations/nl-NL/portals/myaccount.ts(1723,5): error TS2741: Property 'policyConsentManagement' is missing in type '{ accountRecovery: { description: string; emptyPlaceholderText: string; heading: string; }; changePassword: { actionTitles: { change: string; }; description: string; heading: string; }; consentManagement: { ...; }; ... 6 more ...; userSessions: { ...; }; }' but required in type '{ accountRecovery: { description: string; emptyPlaceholderText: string; heading: string; }; changePassword: { actionTitles: { change: string; }; description: string; heading: string; }; createPassword: { ...; }; ... 7 more ...; userSessions: { ...; }; }'.

This occurs because the nl translation doesn't have i18n keys for policyConsentManagement object.

@Shazaanashraff
Copy link
Copy Markdown
Contributor Author

changes:

  1. removed the test cases mentioned due to typescript already enforcing it, cleaned up the helper functions
  2. Added missing translation keys - Added the three required Dutch translation keys that were causing typecheck failures
    a) policyConsentManagement in components section - handles policy-specific consent management UI translations
    b) consents in pages section - the main consents page with title "Toestemmingen" (Permissions)
    c) policyConsentManagement in sections section - policy consent management section with management descriptions

all typechecks were passed locally
please run the CI build to verify everything works as intended

@pavinduLakshan
Copy link
Copy Markdown
Member

changes:

  1. removed the test cases mentioned due to typescript already enforcing it, cleaned up the helper functions
  2. Added missing translation keys - Added the three required Dutch translation keys that were causing typecheck failures
    a) policyConsentManagement in components section - handles policy-specific consent management UI translations
    b) consents in pages section - the main consents page with title "Toestemmingen" (Permissions)
    c) policyConsentManagement in sections section - policy consent management section with management descriptions

all typechecks were passed locally please run the CI build to verify everything works as intended

Typecheck job still fails with the following error, due to missing translations for consentRevokeModal and some others.

Error: src/translations/nl-NL/portals/myaccount.ts(452,17): error TS2353: Object literal may only specify known properties, and '"consentRevokeModal"' does not exist in type '{ revokeModal: { heading: string; message: string; }; }'.
Error: src/translations/nl-NL/portals/myaccount.ts(459,17): error TS2353: Object literal may only specify known properties, and '"consentReceiptFetch"' does not exist in type '{ fetch: Notification; revoke: Notification; }'.
Error: src/translations/nl-NL/portals/myaccount.ts(1834,13): error TS2353: Object literal may only specify known properties, and '"actionTitles"' does not exist in type '{ description: string; heading: string; placeholders: { emptyConsentList: { heading: string; }; }; }'.

Once you fix the issues locally, you can run pnpm nx run i18n:typecheck from the project root to verify there are no more errors. That will avoid back and forth between fixing Github CI errors and waiting for the CI checks to be triggered by someone.

@Shazaanashraff
Copy link
Copy Markdown
Contributor Author

ran the typecheck after the change
image
everything works fine

@Shazaanashraff
Copy link
Copy Markdown
Contributor Author

brotherrrr.
was searching for the files for so long, trying to figure out the issue.
finally realised my fork isnt synced up with the upstream
added the new translations in the recent push
my bad
did all 7 checks from the build just in case
image

@pavinduLakshan
Copy link
Copy Markdown
Member

brotherrrr. was searching for the files for so long, trying to figure out the issue. finally realised my fork isnt synced up with the upstream added the new translations in the recent push my bad did all 7 checks from the build just in case image

Nice!! Let me retrigger the CI and see.

@codecov
Copy link
Copy Markdown

codecov Bot commented May 25, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 55.70%. Comparing base (77e6e92) to head (2b00cd0).
⚠️ Report is 8 commits behind head on master.

Additional details and impacted files
@@           Coverage Diff           @@
##           master   #10304   +/-   ##
=======================================
  Coverage   55.70%   55.70%           
=======================================
  Files          42       42           
  Lines        1016     1016           
  Branches      246      254    +8     
=======================================
  Hits          566      566           
- Misses        416      450   +34     
+ Partials       34        0   -34     
Flag Coverage Δ
@wso2is/core 55.70% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.
see 10 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@Shazaanashraff
Copy link
Copy Markdown
Contributor Author

hope this works
let me know if there is any issue

Copy link
Copy Markdown
Member

@pavinduLakshan pavinduLakshan left a comment

Choose a reason for hiding this comment

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

All tests passed, and local verification was successful as well, so I’m proceeding with the merge.

Thank you very much, @Shazaanashraff, for this contribution. This is one of the most requested features in the WSO2 Identity Server, and we really appreciate your contribution. Keep up the great work!

@pavinduLakshan pavinduLakshan merged commit caf770e into wso2:master May 25, 2026
2 checks passed
@Shazaanashraff
Copy link
Copy Markdown
Contributor Author

All tests passed, and local verification was successful as well, so I’m proceeding with the merge.

Thank you very much, @Shazaanashraff, for this contribution. This is one of the most requested features in the WSO2 Identity Server, and we really appreciate your contribution. Keep up the great work!

put up a word for me for that internship......

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants