{"id":13451747,"url":"https://github.com/tryggvigy/pseudo-localization","last_synced_at":"2025-03-23T19:32:37.020Z","repository":{"id":32857018,"uuid":"143794125","full_name":"tryggvigy/pseudo-localization","owner":"tryggvigy","description":"Dynamic pseudo-localization in the browser and nodejs","archived":false,"fork":false,"pushed_at":"2023-03-02T19:27:47.000Z","size":1369,"stargazers_count":141,"open_issues_count":9,"forks_count":16,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-07-03T18:02:10.633Z","etag":null,"topics":["bidi","chaos-engineering","i18n","internationalization","l10n","language","localization","pseudo","pseudo-localization","pseudo-localize","translation"],"latest_commit_sha":null,"homepage":"https://tryggvigy.github.io/pseudo-localization/hamlet.html","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tryggvigy.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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}},"created_at":"2018-08-06T23:31:16.000Z","updated_at":"2024-07-02T14:00:49.000Z","dependencies_parsed_at":"2024-01-16T03:45:59.677Z","dependency_job_id":"85667ee4-5290-42c3-a778-129d237f0f6f","html_url":"https://github.com/tryggvigy/pseudo-localization","commit_stats":{"total_commits":74,"total_committers":10,"mean_commits":7.4,"dds":0.5405405405405406,"last_synced_commit":"2b952f0d09414c5dbea6a562b543d98c61bd28c1"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tryggvigy%2Fpseudo-localization","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tryggvigy%2Fpseudo-localization/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tryggvigy%2Fpseudo-localization/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tryggvigy%2Fpseudo-localization/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tryggvigy","download_url":"https://codeload.github.com/tryggvigy/pseudo-localization/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":213325083,"owners_count":15570231,"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":["bidi","chaos-engineering","i18n","internationalization","l10n","language","localization","pseudo","pseudo-localization","pseudo-localize","translation"],"created_at":"2024-07-31T07:01:01.201Z","updated_at":"2025-03-23T19:32:37.007Z","avatar_url":"https://github.com/tryggvigy.png","language":"HTML","funding_links":[],"categories":["Testing","Chaos Testing","HTML"],"sub_categories":["Chaos Testing","A11y (accessibility)"],"readme":"\u003csub\u003eInspired by pseudo-localization at [Netflix](https://medium.com/netflix-techblog/pseudo-localization-netflix-12fff76fbcbe) and [Firefox](https://reviewboard.mozilla.org/r/248606/diff/2#index_header).\u003c/sub\u003e\n\n# Pseudo-Localization\n\nPseudo-localization helps developers test UI elements for localization issues before actual translations are available. This package transforms text into a pseudo-language to simulate real-world localization challenges.\n\n## Preview\n\n| English                                                                                                                 | Pseudo Language                                                                                                                  |\n| ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |\n| ![English example](https://user-images.githubusercontent.com/2373958/44001651-21f32b42-9e36-11e8-80eb-5b88e8fd9b13.png) | ![Pseudo-localized example](https://user-images.githubusercontent.com/2373958/44311352-2a29fb00-a3e6-11e8-88ed-5485697f7a40.png) |\n\n### [Live Demo](https://tryggvigy.github.io/pseudo-localization/hamlet.html)\n\nSee it in action on [https://tryggvigy.github.io/pseudo-localization/hamlet.html](https://tryggvigy.github.io/pseudo-localization/hamlet.html)\n\nChanges to the DOM trigger pseudo-localization in real time. Try modifying text nodes or adding/removing elements via DevTools.\n\n---\n\n## Why Use This?\n\nPseudo-localization helps detect issues such as:\n\n- **Text Overflow** – Translations are often longer than the original text, which may cause UI breaking.\n- **Font Rendering** – Certain languages have larger glyphs or diacritics that may be cut off.\n- **Right-to-Left (RTL) Support** – Ensures proper layout handling for RTL languages.\n- **Hardcoded Strings** – Identifies untranslated or hardcoded text that should be localized.\n\n---\n\n## Installation\n\n### Via npm\n\n```sh\nnpm install pseudo-localization\n```\n\n### Copy The Source Code\n\nCopy the files from [`src`](https://github.com/tryggvigy/pseudo-localization/blob/master/src) and use them directly.\n\n---\n\n## Usage\n\n### `pseudoLocalizeString`\n\nTransform individual strings:\n\n```js\nimport { pseudoLocalizeString } from 'pseudo-localization';\n\nconsole.log(pseudoLocalizeString('hello')); // ħḗḗŀŀǿǿ\nconsole.log(pseudoLocalizeString('hello', { strategy: 'bidi' })); // oʅʅǝɥ\n```\n\nUse-case: Ensure text is passing through a translation function.\n\n```js\nimport translate from './my-translation-lib';\nconst _ = (key) =\u003e pseudoLocalizeString(translate(key, navigator.language));\n\nconsole.log(_('Some Localized Text')); // Şǿǿḿḗḗ Ŀǿǿƈȧȧŀīẑḗḗḓ Ŧḗḗẋŧ\n```\n\n---\n\n### `pseudo-localization/dom`\n\nAutomatically localize the entire page or parts of the DOM.\n\n#### React Example\n\n```jsx\nimport React, { useEffect } from 'react';\nimport { PseudoLocalizeDom } from 'pseudo-localization/dom';\n\nfunction Page() {\n  useEffect(() =\u003e PseudoLocalizeDom.start(), []);\n  return \u003ch1\u003eThis text will be pseudo-localized!\u003c/h1\u003e;\n}\n```\n\n---\n\n## Strategies\n\nPseudo-localization supports two strategies:\n\n### 1. Accented (`accented`)\n\nExpands text and replaces Latin letters with accented Unicode counterparts.\n\n```js\npseudoLocalization.start({ strategy: 'accented' });\n```\n\nExample output: **Ȧȧƈƈḗḗƞŧḗḗḓ Ḗḗƞɠŀīīşħ**\n\n![Accented example](https://user-images.githubusercontent.com/2373958/44311259-62303e80-a3e4-11e8-884a-54c77416b922.png)\n\n---\n\n### 2. Bidirectional (`bidi`)\n\nSimulates an RTL language by reversing words and using right-to-left Unicode formatting.\n\n```js\npseudoLocalization.start({ strategy: 'bidi' });\n```\n\nExample output: **ɥsıʅƃuƎ ıpıԐ**\n\n![Bidi example](https://user-images.githubusercontent.com/2373958/44311263-770cd200-a3e4-11e8-97e4-9a1896bd5975.png)\n\n---\n\n## API Reference\n\n### `pseudoLocalizeString(str: string, options?: Options): string`\n\n- `str`: String to localize.\n- `options.strategy`: `'accented'` (default) or `'bidi'`.\n\n### `PseudoLocalizeDom.start(options?: DomOptions): StopFn`\n\nPseudo-localizes the page and watches for DOM changes.\n\n```js\nimport { PseudoLocalizeDom } from 'pseudo-localization/dom';\nconst stop = new PseudoLocalizeDom().start();\n// Stop pseudo-localization later\nstop();\n```\n\n#### `DomOptions`\n\n- `strategy`: `'accented'` or `'bidi'`.\n- `blacklistedNodeNames`: Nodes to ignore (default: `['STYLE']`).\n- `root`: Root element for localization (default: `document.body`).\n\n---\n\n## CLI Usage\n\nA command-line interface (CLI) is available for quick testing and automation.\n\n```sh\nnpx pseudo-localization \"hello world\"\n```\n\n### CLI Options\n\n```\npseudo-localization [src] [options]\n\nPositionals:\n  src  Input string\n\nOptions:\n  --strategy    Localization strategy (accented or bidi)\n  --help        Show help\n```\n\n---\n\n## Browser Compatibility\n\nWorks in all modern browsers.\n\n---\n\nBy using pseudo-localization, you can catch UI issues early, ensuring your app is truly localization-ready!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftryggvigy%2Fpseudo-localization","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftryggvigy%2Fpseudo-localization","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftryggvigy%2Fpseudo-localization/lists"}