{"id":23773642,"url":"https://github.com/beenotung/node-easynmt","last_synced_at":"2025-12-30T22:58:00.441Z","repository":{"id":232363594,"uuid":"784161948","full_name":"beenotung/node-EasyNMT","owner":"beenotung","description":"multi-language translate using UKPLab/EasyNMT","archived":false,"fork":false,"pushed_at":"2024-04-23T15:55:26.000Z","size":22,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-04-23T18:57:44.437Z","etag":null,"topics":["api","browser","client","docker","easynmt","http","isomorphic","m2m100","mbart50","neural-machine-translation","node","opus-mt","server","translation","typescript","wrapper"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/node-easynmt","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/beenotung.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-04-09T10:01:19.000Z","updated_at":"2024-06-03T05:44:40.134Z","dependencies_parsed_at":"2024-04-09T11:40:34.806Z","dependency_job_id":"dc16f35b-2919-48f5-aae6-a49fed0dfc7b","html_url":"https://github.com/beenotung/node-EasyNMT","commit_stats":null,"previous_names":["beenotung/node-easynmt"],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beenotung%2Fnode-EasyNMT","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beenotung%2Fnode-EasyNMT/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beenotung%2Fnode-EasyNMT/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beenotung%2Fnode-EasyNMT/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/beenotung","download_url":"https://codeload.github.com/beenotung/node-EasyNMT/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239961444,"owners_count":19725545,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","browser","client","docker","easynmt","http","isomorphic","m2m100","mbart50","neural-machine-translation","node","opus-mt","server","translation","typescript","wrapper"],"created_at":"2025-01-01T05:41:45.361Z","updated_at":"2025-12-30T22:58:00.436Z","avatar_url":"https://github.com/beenotung.png","language":"TypeScript","readme":"# node-EasyNMT\n\nmulti-language translate using [UKPLab/EasyNMT](https://github.com/UKPLab/EasyNMT)\n\n[![npm Package Version](https://img.shields.io/npm/v/node-easynmt)](https://www.npmjs.com/package/node-easynmt)\n\nRemark: For the server side, you need to have docker installed and available in the `PATH`. Also, your current user should have the privilege to run docker cli.\n\n## Usage (browser)\n\n```html\n\u003cscript src=\"https://cdn.jsdelivr.net/npm/node-easynmt@1/bundle.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n  console.log(easyNMT)\n  /*\n  {\n    translate,\n    patchedTranslate,\n    clearCache,\n    preloadModel,\n  }\n  */\n\u003c/script\u003e\n```\n\n## Usage (nodejs)\n\n### Installation\n\n```bash\nnpm i node-easynmt\n```\n\nrun server:\n\n```typescript\nimport { autoStartServer } from 'node-easynmt/server'\n\n// start a docker container if not already running\nautoStartServer({ port: 24080 })\n  .then(() =\u003e console.log('ready.'))\n  .catch(err =\u003e console.error(err))\n```\n\ncall from client:\n\n```typescript\nimport { translate } from 'node-easynmt/client'\n\nlet zh = '世界你好'\nlet en = await translate({\n  text: zh,\n  source_lang: 'zh',\n  target_lang: 'en',\n})\nconsole.log(`sample: ${zh} -\u003e ${en}`)\n```\n\n### Typescript Signature\n\nCore Function: `translate()`\n\n```typescript\n/**\n * @description set HTTP request to the translate service running in the docker container\n * */\nexport function translate(options: TranslateOptions): Promise\u003cstring\u003e\n\nexport type TranslateOptions = {\n  /** @default 'localhost' */\n  host?: string\n  /** @default 24080 */\n  port?: number\n  /** @example 'Hello World!' */\n  text: string\n  /** @example 'zh' */\n  target_lang: string\n  /** @description auto detect if not specified */\n  source_lang?: string\n  /** @default false */\n  debug?: boolean\n}\n```\n\nPatched core function: `patchedTranslate()`\n\n```typescript\n/**\n * @description apply combination of fixes to workaround common errors\n */\nexport async function patchedTranslate(\n  options: PatchedTranslateOptions,\n): Promise\u003cstring\u003e\n\nexport type PatchedTranslateOptions = TranslateOptions \u0026 {\n  /**\n   * @description to avoid ajax timeout when doing lots on translate concurrently\n   * @default true\n   * */\n  async_queue?: boolean\n  /**\n   * @description to keep in-memory cache\n   * @default true\n   * */\n  cached?: boolean\n  /**\n   * @description to avoid repeating (wrong) result.\n   * e.g. without wrapping: Transparent -\u003e 透明透明\n   * @default true\n   */\n  wrap_text?: boolean\n  /**\n   * @description trim the output if the input is already trimmed\n   * @default true\n   */\n  smart_trim?: boolean\n}\n```\n\nHelper Functions:\n\n```typescript\n/**\n * @description optionally step to preload the translate model before the actual usage.\n */\nexport async function preloadModel(options: {\n  target_lang: string\n  source_lang: string\n  /**\n   * @description to log in console or not\n   * @default false\n   *\n   */\n  debug?: boolean\n}): Promise\u003cvoid\u003e\n\n/**\n * @description release the memory used by patchedTranslate()\n */\nexport function clearCache(): void\n```\n\n## Usage (cli)\n\nrun server:\n\n```bash\ndocker run -p 24080:80 easynmt/api:2.0-cpu\n```\n\nsend request:\n\n```bash\ncurl \"http://localhost:24080/translate?target_lang=en\u0026text=Hallo%20Welt\"\n```\n\njson response:\n\n```json\n{\n  \"target_lang\": \"en\",\n  \"source_lang\": null,\n  \"detected_langs\": [\"de\"],\n  \"translated\": [\"Hello world\"],\n  \"translation_time\": 77.64211463928223\n}\n```\n\n## License\n\nThis project is licensed with [BSD-2-Clause](./LICENSE)\n\nThis is free, libre, and open-source software. It comes down to four essential freedoms [[ref]](https://seirdy.one/2021/01/27/whatsapp-and-the-domestication-of-users.html#fnref:2):\n\n- The freedom to run the program as you wish, for any purpose\n- The freedom to study how the program works, and change it so it does your computing as you wish\n- The freedom to redistribute copies so you can help others\n- The freedom to distribute copies of your modified versions to others\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeenotung%2Fnode-easynmt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbeenotung%2Fnode-easynmt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeenotung%2Fnode-easynmt/lists"}