{"id":34827439,"url":"https://github.com/profullstack/localizer","last_synced_at":"2026-05-16T16:04:24.189Z","repository":{"id":290040660,"uuid":"973187261","full_name":"profullstack/localizer","owner":"profullstack","description":"A simple and lightweight localization and internationalization library for JavaScript applications. Works in both browser and Node.js environments.","archived":false,"fork":false,"pushed_at":"2025-05-15T09:02:24.000Z","size":82,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-12-27T00:52:58.888Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/profullstack.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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,"zenodo":null}},"created_at":"2025-04-26T13:02:05.000Z","updated_at":"2025-05-15T09:02:28.000Z","dependencies_parsed_at":"2025-04-26T14:25:28.739Z","dependency_job_id":"fc227675-d722-453d-b868-92cb42867585","html_url":"https://github.com/profullstack/localizer","commit_stats":null,"previous_names":["profullstack/localizer"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/profullstack/localizer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/profullstack%2Flocalizer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/profullstack%2Flocalizer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/profullstack%2Flocalizer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/profullstack%2Flocalizer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/profullstack","download_url":"https://codeload.github.com/profullstack/localizer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/profullstack%2Flocalizer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33109461,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-16T04:41:52.686Z","status":"ssl_error","status_checked_at":"2026-05-16T04:41:52.009Z","response_time":115,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":[],"created_at":"2025-12-25T15:21:39.996Z","updated_at":"2026-05-16T16:04:24.184Z","avatar_url":"https://github.com/profullstack.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# @profullstack/localizer\n\nA simple localization and internationalization library with RTL support.\n\n## Features\n\n- Simple API for translating text\n- Support for multiple languages with fallback\n- Interpolation of variables in translations\n- Support for pluralization\n- Right-to-Left (RTL) language support\n- DOM translation utilities for automatic UI updates\n- MutationObserver integration for dynamic content\n- Works in both browser and Node.js environments\n\n## Installation\n\n```bash\nnpm install @profullstack/localizer\n# or\nyarn add @profullstack/localizer\n# or\npnpm add @profullstack/localizer\n```\n\n## Usage\n\n### Basic Usage\n\n```javascript\nimport { localizer, _t } from '@profullstack/localizer';\n\n// Load translations\nlocalizer.loadTranslations('en', {\n  'hello': 'Hello',\n  'welcome': 'Welcome, ${name}!'\n});\n\nlocalizer.loadTranslations('fr', {\n  'hello': 'Bonjour',\n  'welcome': 'Bienvenue, ${name}!'\n});\n\nlocalizer.loadTranslations('ar', {\n  'hello': 'مرحبا',\n  'welcome': 'مرحبًا، ${name}!'\n});\n\n// Set the current language\nlocalizer.setLanguage('fr');\n\n// Translate a key\nconsole.log(_t('hello')); // Output: Bonjour\n\n// Translate with interpolation\nconsole.log(_t('welcome', { name: 'John' })); // Output: Bienvenue, John!\n```\n\n### DOM Translation\n\nThe library provides utilities for automatically translating DOM elements:\n\n```javascript\n// Add data-i18n attributes to your HTML\n// \u003ch1 data-i18n=\"welcome\"\u003eWelcome\u003c/h1\u003e\n// \u003cinput placeholder=\"Enter your name\" data-i18n-placeholder=\"enter_name\"\u003e\n\n// Translate all elements with i18n attributes in the document\nlocalizer.translateDOM();\n\n// Translate elements within a specific container\nconst container = document.querySelector('.my-container');\nlocalizer.translateContainer(container);\n\n// Set up automatic translation of dynamically added elements\nlocalizer.observeDOM();\n```\n\n### RTL Support\n\nThe library automatically detects Right-to-Left (RTL) languages and provides methods to check if a language is RTL:\n\n```javascript\n// Check if the current language is RTL\nconst isRTL = localizer.isRTL();\n\n// Check if a specific language is RTL\nconst isArabicRTL = localizer.isLanguageRTL('ar'); // true\nconst isEnglishRTL = localizer.isLanguageRTL('en'); // false\n\n// Apply RTL direction to the document\nlocalizer.applyRTLToDocument();\n\n// The library dispatches an event when the language changes\nwindow.addEventListener('language-changed', (event) =\u003e {\n  const { language, previousLanguage, isRTL } = event.detail;\n  \n  // RTL direction is automatically applied when using applyRTLToDocument()\n  // but you can also handle it manually:\n  document.documentElement.dir = isRTL ? 'rtl' : 'ltr';\n  \n  if (isRTL) {\n    document.body.classList.add('rtl');\n  } else {\n    document.body.classList.remove('rtl');\n  }\n});\n```\n\n### Loading Translations from JSON Files\n\n```javascript\n// In a browser environment\nasync function loadTranslations() {\n  await localizer.loadTranslationsFromUrl('en', '/i18n/en.json');\n  await localizer.loadTranslationsFromUrl('fr', '/i18n/fr.json');\n  await localizer.loadTranslationsFromUrl('ar', '/i18n/ar.json');\n  \n  // Set initial language based on browser preference\n  const browserLang = navigator.language.split('-')[0];\n  if (localizer.getAvailableLanguages().includes(browserLang)) {\n    localizer.setLanguage(browserLang);\n  } else {\n    localizer.setLanguage('en'); // fallback\n  }\n}\n```\n\n## API Reference\n\n### Localizer Class\n\n#### Constructor\n\n```javascript\nconst localizer = new Localizer(options);\n```\n\nOptions:\n- `defaultLanguage`: The default language to use (default: 'en')\n- `fallbackLanguage`: The fallback language to use when a translation is not found (default: 'en')\n- `translations`: Initial translations object (default: {})\n- `interpolationStart`: The start delimiter for interpolation (default: '${')\n- `interpolationEnd`: The end delimiter for interpolation (default: '}')\n- `rtlLanguages`: Array of RTL language codes (default: ['ar', 'he', 'fa', 'ur'])\n\n#### Methods\n\n##### Core Methods\n- `loadTranslations(language, translations)`: Load translations for a language\n- `setLanguage(language)`: Set the current language\n- `getLanguage()`: Get the current language\n- `getAvailableLanguages()`: Get an array of available language codes\n- `translate(key, options)`: Translate a key with optional interpolation and pluralization\n- `loadTranslationsFromUrl(language, url)`: Load translations from a JSON file (browser only)\n- `isRTL()`: Check if the current language is RTL\n- `isLanguageRTL(language)`: Check if a specific language is RTL\n\n##### DOM Methods (Browser Only)\n- `translateDOM(container?)`: Translate all elements with i18n attributes in the document or container\n- `translateContainer(container)`: Translate all elements with i18n attributes in a specific container\n- `observeDOM(rootElement?)`: Set up a MutationObserver to automatically translate new elements\n- `stopObservingDOM()`: Stop observing DOM changes\n- `applyRTLToDocument()`: Apply RTL direction to the document based on the current language\n\n### Translation Function\n\n```javascript\n_t(key, options);\n```\n\nParameters:\n- `key`: The translation key\n- `options`: Options for translation (interpolation values, count for pluralization, etc.)\n\n## DOM Translation Attributes\n\nThe library supports the following data attributes for DOM translation:\n\n- `data-i18n`: Translates the element's text content\n- `data-i18n-placeholder`: Translates the element's placeholder attribute\n- `data-i18n-title`: Translates the element's title attribute\n- `data-i18n-html`: Translates the element's innerHTML (use with caution)\n- `data-i18n-params`: JSON string of parameters for interpolation (used with data-i18n)\n\nExample:\n```html\n\u003ch1 data-i18n=\"welcome\"\u003eWelcome\u003c/h1\u003e\n\u003cinput placeholder=\"Enter your name\" data-i18n-placeholder=\"enter_name\"\u003e\n\u003cbutton title=\"Click me\" data-i18n=\"button.click\" data-i18n-title=\"button.tooltip\"\u003eClick me\u003c/button\u003e\n\u003cp data-i18n=\"greeting\" data-i18n-params='{\"name\":\"John\"}'\u003eHello, John!\u003c/p\u003e\n```\n\n## License\n\nMIT","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprofullstack%2Flocalizer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprofullstack%2Flocalizer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprofullstack%2Flocalizer/lists"}