diff --git a/eslint.config.ts b/eslint.config.ts index 243ae89..34da99a 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -1,3 +1,4 @@ +import vueI18n from '@intlify/eslint-plugin-vue-i18n'; import pluginVitest from '@vitest/eslint-plugin'; import skipFormatting from '@vue/eslint-config-prettier/skip-formatting'; import { @@ -37,6 +38,20 @@ export default defineConfigWithVueTs( files: ['e2e/**/*.{test,spec}.{js,ts,jsx,tsx}'], }, ...pluginOxlint.configs['flat/recommended'], + + // https://eslint-plugin-vue-i18n.intlify.dev/started.html#getting-started + ...vueI18n.configs.recommended, + { + rules: { + '@intlify/vue-i18n/no-raw-text': 'off', + }, + settings: { + 'vue-i18n': { + localeDir: './src/locales/**/*.json', + messageSyntaxVersion: '^11.0.0', + }, + }, + }, { plugins: { import: pluginImport, diff --git a/package.json b/package.json index 7f157b9..a0520d0 100644 --- a/package.json +++ b/package.json @@ -82,6 +82,7 @@ "@iconify-json/clarity": "^1.2.4", "@iconify-json/line-md": "^1.2.11", "@iconify-json/material-symbols": "^1.2.42", + "@intlify/eslint-plugin-vue-i18n": "^4.1.0", "@intlify/unplugin-vue-i18n": "^11.0.0", "@playwright/test": "^1.55.0", "@prettier/plugin-oxc": "^0.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ea585e3..8a9d018 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -96,6 +96,9 @@ importers: '@iconify-json/material-symbols': specifier: ^1.2.42 version: 1.2.42 + '@intlify/eslint-plugin-vue-i18n': + specifier: ^4.1.0 + version: 4.1.0(eslint@9.38.0(jiti@2.6.1))(jsonc-eslint-parser@2.4.1)(vue-eslint-parser@10.2.0(eslint@9.38.0(jiti@2.6.1)))(yaml-eslint-parser@1.3.0) '@intlify/unplugin-vue-i18n': specifier: ^11.0.0 version: 11.0.1(@vue/compiler-dom@3.5.22)(eslint@9.38.0(jiti@2.6.1))(rollup@4.52.5)(typescript@5.9.2)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.2)))(vue@3.5.22(typescript@5.9.2)) @@ -463,6 +466,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} @@ -1452,6 +1459,15 @@ packages: resolution: {integrity: sha512-whh0trqRsSqVLNEUCwU59pyJZYpU8AmSWl8M3Jz2Mv5ESPP6kFh4juas2NpZ1iCvy7GlNRffUD1xr84gceimjg==} engines: {node: '>= 16'} + '@intlify/eslint-plugin-vue-i18n@4.1.0': + resolution: {integrity: sha512-MPAr3LGTrkB5CZBHN5eUf4kASUEiSaDM371jADmxNbTL1Ew7IAyCIBGm3+/1sWcvsfVHe4wz8RFoo6FpeQZ4Nw==} + engines: {node: '>=18.0.0'} + peerDependencies: + eslint: ^8.0.0 || ^9.0.0-0 + jsonc-eslint-parser: ^2.3.0 + vue-eslint-parser: ^10.0.0 + yaml-eslint-parser: ^1.2.2 + '@intlify/message-compiler@11.1.12': resolution: {integrity: sha512-Fv9iQSJoJaXl4ZGkOCN1LDM3trzze0AS2zRz2EHLiwenwL6t0Ki9KySYlyr27yVOj5aVz0e55JePO+kELIvfdQ==} engines: {node: '>= 16'} @@ -3745,6 +3761,10 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + engines: {node: '>=18'} + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -3972,6 +3992,9 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-language-code@3.1.0: + resolution: {integrity: sha512-zJdQ3QTeLye+iphMeK3wks+vXSRFKh68/Pnlw7aOfApFSEIOhYa8P9vwwa6QrImNNBMJTiL1PpYF0f4BxDuEgA==} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -5332,6 +5355,10 @@ packages: resolution: {integrity: sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==} engines: {node: '>=16.0.0'} + synckit@0.10.4: + resolution: {integrity: sha512-2SG1TnJGjMkD4+gblONMGYSrwAzYi+ymOitD+Jb/iMYm57nH20PlkVeMQRah3yDMKEa0QQYUF/QPWpdW7C6zNg==} + engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.11.11: resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -6308,6 +6335,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/runtime@7.28.4': {} + '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 @@ -7060,6 +7089,31 @@ snapshots: '@intlify/message-compiler': 11.1.12 '@intlify/shared': 11.1.12 + '@intlify/eslint-plugin-vue-i18n@4.1.0(eslint@9.38.0(jiti@2.6.1))(jsonc-eslint-parser@2.4.1)(vue-eslint-parser@10.2.0(eslint@9.38.0(jiti@2.6.1)))(yaml-eslint-parser@1.3.0)': + dependencies: + '@eslint/eslintrc': 3.3.1 + '@intlify/core-base': 11.1.12 + '@intlify/message-compiler': 11.1.12 + debug: 4.4.3 + eslint: 9.38.0(jiti@2.6.1) + eslint-compat-utils: 0.6.5(eslint@9.38.0(jiti@2.6.1)) + glob: 10.4.5 + globals: 16.5.0 + ignore: 7.0.5 + import-fresh: 3.3.1 + is-language-code: 3.1.0 + js-yaml: 4.1.0 + json5: 2.2.3 + jsonc-eslint-parser: 2.4.1 + lodash: 4.17.21 + parse5: 7.3.0 + semver: 7.7.3 + synckit: 0.10.4 + vue-eslint-parser: 10.2.0(eslint@9.38.0(jiti@2.6.1)) + yaml-eslint-parser: 1.3.0 + transitivePeerDependencies: + - supports-color + '@intlify/message-compiler@11.1.12': dependencies: '@intlify/shared': 11.1.12 @@ -9614,6 +9668,8 @@ snapshots: globals@15.15.0: {} + globals@16.5.0: {} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -9841,6 +9897,10 @@ snapshots: dependencies: is-docker: 3.0.0 + is-language-code@3.1.0: + dependencies: + '@babel/runtime': 7.28.4 + is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -11330,6 +11390,11 @@ snapshots: sync-message-port@1.1.3: {} + synckit@0.10.4: + dependencies: + '@pkgr/core': 0.2.9 + tslib: 2.8.1 + synckit@0.11.11: dependencies: '@pkgr/core': 0.2.9