diff --git a/.github/workflows/deno.yml b/.github/workflows/deno.yml index 168f51a..660dc3d 100644 --- a/.github/workflows/deno.yml +++ b/.github/workflows/deno.yml @@ -26,4 +26,4 @@ jobs: with: deno-version: ${{ matrix.deno }} - run: deno --version - - run: deno test --allow-net --allow-env test/deno/*.js + - run: deno install && deno test --allow-net --allow-env test/deno/*.js diff --git a/README.md b/README.md index 7107a4b..19d2467 100644 --- a/README.md +++ b/README.md @@ -238,6 +238,35 @@ app.get('/', async (req) => { await app.listen({ port }) ``` +#### Fresh 2.x + +```js +import i18next from 'https://deno.land/x/i18next/index.js' +import i18nextMiddleware from 'https://deno.land/x/i18next_http_middleware/index.js' +import { App, createDefine } from "jsr:@fresh/core"; + +i18next + .use(i18nextMiddleware.LanguageDetector) + .init({ + preload: ["en", "fr"], + fallbackLng: "en", + resources: { + en: { + translation: { hi: "hello" } + }, + fr: { + translation: { hi: "bonjour" } + } + } + }); + +const app = new App() + .use(i18nextMiddleware.freshPlugin(i18next)) + .get("/", (ctx) => { + return new Response(ctx.state.t('hi')) + }); +``` + ## add routes ```js diff --git a/lib/index.js b/lib/index.js index ccefe1d..21d25be 100644 --- a/lib/index.js +++ b/lib/index.js @@ -137,6 +137,22 @@ export function koaPlugin (i18next, options) { } } +export function freshPlugin (i18next) { + return async (ctx) => { + const placeholder = { headers: new Headers() } + handle(i18next, { attachLocals: true })(ctx.req, placeholder, () => {}) + ctx.state.t = ctx.req.t + ctx.state.i18n = ctx.req.i18n + ctx.state.lng = ctx.req.lng + ctx.state.locale = ctx.req.locale + ctx.state.language = ctx.req.language + ctx.state.languages = ctx.req.languages + const resp = await ctx.next() + resp.headers.set('Content-Language', placeholder.headers.get('Content-Language')) + return resp + } +} + export const hapiPlugin = { name: 'i18next-http-middleware', version: '1', @@ -311,6 +327,7 @@ export default { plugin, hapiPlugin, koaPlugin, + freshPlugin, handle, getResourcesHandler, missingKeyHandler, diff --git a/package.json b/package.json index d475bb8..5c5a861 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,8 @@ "@babel/core": "7.26.0", "@babel/preset-env": "7.26.0", "@hapi/hapi": "^21.3.12", + "@opentelemetry/api": "^1.9.0", + "@preact/signals": "^2.2.1", "@types/express-serve-static-core": "^5.0.1", "@koa/router": "12.0.1", "koa": "2.16.1", @@ -48,6 +50,8 @@ "fastify": "5.3.2", "i18next": "25.5.2", "mocha": "10.8.2", + "preact": "10.27.2", + "preact-render-to-string": "6.6.3", "supertest": "7.0.0", "tsd": "0.31.2", "uglify-js": "3.19.3" diff --git a/test/deno/addRoute.fresh.js b/test/deno/addRoute.fresh.js new file mode 100644 index 0000000..3a5906c --- /dev/null +++ b/test/deno/addRoute.fresh.js @@ -0,0 +1,33 @@ +import { expect } from 'jsr:@std/expect' +import i18next from 'https://deno.land/x/i18next/index.js' +import i18nextMiddleware from '../../index.js' +const { test } = Deno +import { App } from "jsr:@fresh/core"; + +i18next + .init({ + preload: ["en", "fr"], + fallbackLng: "en" + }); + +test('addRoute fresh', async () => { + const routeHandle = (ctx) => { + expect(ctx.state.lng).toEqual('en') + expect(ctx.state.locale).toEqual('en') + expect(ctx.state.language).toEqual('en') + expect(ctx.state.languages).toEqual( ['en']) + expect(ctx.state.i18n).not.toBeUndefined() + expect(ctx.state.t).not.toBeUndefined() + + expect(ctx.state.t('key')).toEqual('key') + return new Response(ctx.state.t('key')) + } + const app = new App() + .use(i18nextMiddleware.freshPlugin(i18next)) + i18nextMiddleware.addRoute(i18next, '/myroute/:lng/:ns', ['en'], app, 'get', routeHandle) + const handler = app.handler() + const res = await handler( + new Request('http://localhost/myroute/en/test') + ); + expect(await res.text()).toEqual('key') +}) diff --git a/test/deno/middleware.fresh.js b/test/deno/middleware.fresh.js new file mode 100644 index 0000000..4243f29 --- /dev/null +++ b/test/deno/middleware.fresh.js @@ -0,0 +1,39 @@ +import { expect } from 'jsr:@std/expect' +import i18next from 'https://deno.land/x/i18next/index.js' +import i18nextMiddleware from '../../index.js' +const { test } = Deno +import { App } from "jsr:@fresh/core"; + +i18next + .use(i18nextMiddleware.LanguageDetector) + .init({ + preload: ["en", "fr"], + fallbackLng: "en", + resources: { + en: { + translation: { hi: "hello" } + }, + fr: { + translation: { hi: "bonjour" } + } + } + }); + +test('middleware fresh', async () => { + const handler = new App() + .use(i18nextMiddleware.freshPlugin(i18next)) + .get("/", (ctx) => { + return new Response(ctx.state.t('hi')) + }) + .handler(); + + const headers = new Headers() + headers.append('Accept-Language', 'fr') + const res = await handler( + new Request('http://localhost', + { headers } + )); + const resHeaders = Object.fromEntries(res.headers.entries()) + expect(resHeaders).toEqual(expect.objectContaining({ 'content-language': 'fr'})) + expect(await res.text()).toEqual("bonjour") +})