{"record":{"id":"0088c43c315fc02d","repo":"angular/angular-cli","slug":"unable-to-load-message-extractor-please-ensure","errorCode":null,"errorMessage":"Unable to load message extractor. Please ensure '@angular/localize' is installed.","messagePattern":"Unable to load message extractor\\. Please ensure '@angular/localize' is installed\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/angular_devkit/build_angular/src/builders/extract-i18n/ivy-extract-loader.ts","lineNumber":53,"sourceCode":"    },\n    (error) => {\n      callback(error);\n    },\n  );\n}\n\nasync function extract(\n  loaderContext: import('webpack').LoaderContext<LocalizeExtractLoaderOptions>,\n  content: string,\n  map: string | LoaderSourceMap | undefined,\n  options: LocalizeExtractLoaderOptions,\n) {\n  let MessageExtractor;\n  try {\n    const { MessageExtractor: MsgExtractor } = await import('@angular/localize/tools');\n    MessageExtractor = MsgExtractor;\n  } catch {\n    throw new Error(\n      `Unable to load message extractor. Please ensure '@angular/localize' is installed.`,\n    );\n  }\n\n  // Setup a Webpack-based logger instance\n  const logger = {\n    // level 2 is warnings\n    level: 2,\n    debug(...args: string[]): void {\n      // eslint-disable-next-line no-console\n      console.debug(...args);\n    },\n    info(...args: string[]): void {\n      loaderContext.emitWarning(new Error(args.join('')));\n    },\n    warn(...args: string[]): void {\n      loaderContext.emitWarning(new Error(args.join('')));\n    },","sourceCodeStart":35,"sourceCodeEnd":71,"githubUrl":"https://github.com/angular/angular-cli/blob/bb72145f9ab45aee29f523236b3a25cd0813a841/packages/angular_devkit/build_angular/src/builders/extract-i18n/ivy-extract-loader.ts#L35-L71","documentation":"ivy-extract-loader dynamically imports `@angular/localize/tools` to obtain the MessageExtractor class used for ivy i18n extraction. If that dynamic import fails (module not installed, version mismatch, or not resolvable), it throws this error telling the user to install @angular/localize. The extract-i18n builder relies on this package as a peer runtime dependency even though the CLI itself does not bundle its tools.","triggerScenarios":"Running `ng extract-i18n` when `@angular/localize` is not in the project's node_modules; a broken/partial install where the `tools` entry point is missing; a version mismatch where the installed localize version does not export MessageExtractor from its tools entry point.","commonSituations":"Fresh projects where localize was never added (`ng add @angular/localize` skipped); monorepos where the dependency is hoisted incorrectly or absent from the workspace; upgrading Angular CLI without upgrading @angular/localize to a compatible version.","solutions":["Install the package: `ng add @angular/localize` or `npm install @angular/localize --save-dev` (or yarn/pnpm equivalent).","Ensure the installed @angular/localize version matches your Angular CLI/framework version.","Delete node_modules and the lockfile entry and reinstall to repair a partial install.","If using pnpm/npm workspaces, confirm the package is resolvable from the project directory (check node_modules/@angular/localize/tools exists)."],"exampleFix":"// before (package.json devDependencies)\n// \"@angular/localize\" missing\n// after\n\"devDependencies\": {\n  \"@angular/localize\": \"^18.0.0\"\n}","handlingStrategy":"validation","validationCode":"import { createRequire } from 'module';\nconst require = createRequire(import.meta.url);\ntry {\n  require.resolve('@angular/localize/tools');\n} catch {\n  throw new Error(\"Install @angular/localize: ng add @angular/localize\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  await ngExtractI18n();\n} catch (e) {\n  if (e.message.includes(\"Unable to load message extractor\")) {\n    console.error(\"Run: ng add @angular/localize\");\n  } else throw e;\n}","preventionTips":["Always run `ng add @angular/localize` when enabling i18n extraction.","Keep @angular/localize version in lockstep with the Angular CLI version.","In monorepos, declare the dependency in the relevant workspace package.","Verify node_modules/@angular/localize/tools exists in CI before running extraction."],"tags":["extract-i18n","missing-dependency","angular-localize","angular"],"backgroundTag":"missing-dependency","analyzedSha":"bb72145f9ab45aee29f523236b3a25cd0813a841","analyzedAt":"2026-08-30T02:47:34.745Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}