user84
user84

Reputation: 885

Issues Configuring Internationalization (i18n) in Angular 19

I am working on an Angular 19 project, and I'm trying to add internationalization (i18n) features to support multiple languages. I've followed several guides and suggestions, but I keep running into issues.

Here are the steps I've taken so far:

  1. Installed the necessary package: npm install @angular/localize --legacy-peer-deps

  2. Updated my tsconfig.json:

  "compileOnSave": false,
  "compilerOptions": {
    "outDir": "./dist/out-tsc",
    "strict": true,
    "noImplicitOverride": true,
    "noPropertyAccessFromIndexSignature": true,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "skipLibCheck": true,
    "isolatedModules": true,
    "esModuleInterop": true,
    "experimentalDecorators": true,
    "moduleResolution": "bundler",
    "importHelpers": true,
    "target": "ES2022",
    "module": "ES2022"
  },
  "files": [
    "node_modules/@angular/localize/init"
  ],
  "angularCompilerOptions": {
    "enableIvy": true,
    "enableI18nLegacyMessageIdFormat": false,
    "strictInjectionParameters": true,
    "strictInputAccessModifiers": true,
    "strictTemplates": true
  }
}
  1. Updated my angular.json:
{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "newProjectRoot": "projects",
  "projects": {
    "YourProjectName": {
      "projectType": "application",
      "schematics": {
        "@schematics/angular:component": {
          "style": "scss"
        }
      },
      "root": "",
      "sourceRoot": "src",
      "prefix": "app",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist/your-project-name",
            "index": "src/index.html",
            "main": "src/main.ts",
            "polyfills": [
              "zone.js"
            ],
            "tsConfig": "tsconfig.app.json",
            "inlineStyleLanguage": "scss",
            "assets": [
              "src/favicon.ico",
              "src/assets",
              {
                "glob": "**/*",
                "input": "public"
              }
            ],
            "styles": [
              "@angular/material/prebuilt-themes/azure-blue.css",
              "src/styles.scss"
            ],
            "scripts": []
          },
          "configurations": {
            "production": {
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "500kB",
                  "maximumError": "1MB"
                },
                {
                  "type": "anyComponentStyle",
                  "maximumWarning": "4kB",
                  "maximumError": "8kB"
                }
              ],
              "outputHashing": "all"
            },
            "development": {
              "optimization": false,
              "extractLicenses": false,
              "sourceMap": true
            },
            "en": {
              "localize": ["en"],
              "i18nFile": "src/locale/messages.xlf",
              "i18nLocale": "en",
              "outputPath": "dist/your-project-name/en",
              "aot": true,
              "buildOptimizer": true
            },
            "fr": {
              "localize": ["fr"],
              "i18nFile": "src/locale/messages.fr.xlf",
              "i18nLocale": "fr",
              "outputPath": "dist/your-project-name/fr",
              "aot": true,
              "buildOptimizer": true
            }
          },
          "defaultConfiguration": "production"
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "port": 4200,
            "browserTarget": "YourProjectName:build:development"
          },
          "configurations": {
            "production": {
              "browserTarget": "YourProjectName:build:production"
            },
            "en": {
              "browserTarget": "YourProjectName:build:en"
            },
            "fr": {
              "browserTarget": "YourProjectName:build:fr"
            }
          }
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "YourProjectName:build"
          }
        }
      }
    }
  }
}
  1. Created translation files in src/locale:

Issues Encountered:

When trying to serve the application for specific locales using:

ng serve --configuration=fr
ng serve --configuration=en

I encounter the following error:

Error: Schema validation failed with the following errors:
  Data path "" must have required property 'buildTarget'.
/Users/ali/angular-applications/YourProjectName/node_modules/rxjs/dist/cjs/internal/util/reportUnhandledError.js:13
            throw err;
            ^

SchemaValidationException [Error]: Schema validation failed with the following errors:
  Data path "" must have required property 'buildTarget'.
    at /Users/ali/angular-applications/YourProjectName/node_modules/@angular-devkit/architect/src/architect.js:38:27 {
  errors: [
    {
      instancePath: '',
      schemaPath: '#/required',
      keyword: 'required',
      params: { missingProperty: 'buildTarget' },
      message: "must have required property 'buildTarget'"
    }
  ]
}

Questions:

  1. How can I properly configure angular.json to support multiple locales without encountering the buildTarget error?

  2. Are there any other steps I might have missed in setting up Angular i18n?

Any help or guidance would be greatly appreciated!

Thank you in advance!

Upvotes: 2

Views: 861

Answers (1)

Naren Murali
Naren Murali

Reputation: 57986

Could you replace all instance of browserTarget to buildTarget.

Below is a sample angular.json (ssr enabled) for reference:

{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "newProjectRoot": "projects",
  "projects": {
    "test": {
      "projectType": "application",
      "schematics": {
        "@schematics/angular:component": {
          "style": "scss"
        }
      },
      "root": "",
      "sourceRoot": "src",
      "prefix": "app",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:application",
          "options": {
            "outputPath": "dist/test",
            "index": "src/index.html",
            "browser": "src/main.ts",
            "polyfills": [
              "zone.js"
            ],
            "tsConfig": "tsconfig.app.json",
            "inlineStyleLanguage": "scss",
            "assets": [
              {
                "glob": "**/*",
                "input": "public"
              }
            ],
            "styles": [
              "src/styles.scss"
            ],
            "scripts": [],
            "server": "src/main.server.ts",
            "prerender": true,
            "ssr": {
              "entry": "src/server.ts"
            }
          },
          "configurations": {
            "production": {
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "500kB",
                  "maximumError": "1MB"
                },
                {
                  "type": "anyComponentStyle",
                  "maximumWarning": "4kB",
                  "maximumError": "8kB"
                }
              ],
              "outputHashing": "all"
            },
            "development": {
              "optimization": false,
              "extractLicenses": false,
              "sourceMap": true
            }
          },
          "defaultConfiguration": "production"
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "configurations": {
            "production": {
              "buildTarget": "test:build:production"
            },
            "development": {
              "buildTarget": "test:build:development"
            }
          },
          "defaultConfiguration": "development"
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n"
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "polyfills": [
              "zone.js",
              "zone.js/testing"
            ],
            "tsConfig": "tsconfig.spec.json",
            "inlineStyleLanguage": "scss",
            "assets": [
              {
                "glob": "**/*",
                "input": "public"
              }
            ],
            "styles": [
              "src/styles.scss"
            ],
            "scripts": []
          }
        }
      }
    }
  }
}

Upvotes: 0

Related Questions