{"id":14965572,"url":"https://github.com/efabrica-team/translatte","last_synced_at":"2025-10-25T11:32:03.591Z","repository":{"id":34646953,"uuid":"181710543","full_name":"efabrica-team/translatte","owner":"efabrica-team","description":null,"archived":false,"fork":false,"pushed_at":"2025-01-17T15:46:27.000Z","size":57,"stargazers_count":8,"open_issues_count":2,"forks_count":3,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-01-31T07:05:20.568Z","etag":null,"topics":["nette-framework","translator"],"latest_commit_sha":null,"homepage":null,"language":"PHP","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/efabrica-team.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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}},"created_at":"2019-04-16T14:51:22.000Z","updated_at":"2025-01-26T17:38:26.000Z","dependencies_parsed_at":"2024-08-06T11:29:08.884Z","dependency_job_id":"052aafa1-cc91-44db-a1fe-bc223a2a8ae1","html_url":"https://github.com/efabrica-team/translatte","commit_stats":{"total_commits":24,"total_committers":5,"mean_commits":4.8,"dds":0.5,"last_synced_commit":"df7c6ab3f0fb67a47f8bb524806ceb821fe006af"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/efabrica-team%2Ftranslatte","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/efabrica-team%2Ftranslatte/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/efabrica-team%2Ftranslatte/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/efabrica-team%2Ftranslatte/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/efabrica-team","download_url":"https://codeload.github.com/efabrica-team/translatte/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238128688,"owners_count":19421080,"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":["nette-framework","translator"],"created_at":"2024-09-24T13:34:55.996Z","updated_at":"2025-10-25T11:32:03.585Z","avatar_url":"https://github.com/efabrica-team.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Translatte\n\n[![Build Status](https://travis-ci.org/efabrica-team/translatte.svg?branch=master)](https://travis-ci.org/efabrica-team/translatte)\n[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/efabrica-team/translatte/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/efabrica-team/translatte/?branch=master)\n[![Code Coverage](https://scrutinizer-ci.com/g/efabrica-team/translatte/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/efabrica-team/translatte/?branch=master)\n\nTranslator for Nette framework.\n\n## Usage\n```php\nuse Efabrica\\Translatte\\Translator;\nuse Efabrica\\Translatte\\Resource\\NeonDirectoryResource;\n\n// Create new translator with default language\n$translator = new Translator('sk_SK');\n\n// Register new resources where translations are stored\n$translator-\u003eaddResource(new NeonDirectoryResource([__DIR__ . '/lang', __DIR__ . '/another/lang']));\n$translator-\u003eaddResource(new NeonResource(__DIR__ . '/dictionary.sk_SK.neon', 'sk_SK'));\n\n// Translate basic string\n$translator-\u003etranslate('dictionary.forms.error']);\n\n// Translate with pluralization\n$translator-\u003etranslate('key', 10);\n\n// Translate with parameters\n$translator-\u003etranslate('key', ['name' =\u003e 'Peter']);\n\n// Translate with pluralization and parameters\n$translator-\u003etranslate('key', 10, ['page' =\u003e 'login']);\n\n// Select translation language on the fly\n$translator-\u003etranslate('key', 1, [], 'en_US');\n```\n\n### Nette extension\n```\nextensions:\n\ttranslation: Efabrica\\Translatte\\Bridge\\Nette\\TranslationExtension\n\t\n# Minimal configuration\ntranslation:\n    default: 'sk_SK' # mandatory\n\n# Full configuration\ntranslation:\n    default: 'sk_SK' # mandatory\n    fallback: # optional\n        - 'en_US'\n        - 'en_UK'\n    dirs:\n        - %appDir%/lang\n    cache: Efabrica\\Translatte\\Cache\\NullCache() # optional\n    resolvers: # optional\n        - Efabrica\\Translatte\\Resolver\\StaticResolver('sk_Sk')\n    resources: # optional\n        - Efabrica\\Translatte\\Resource\\NeonDirectoryResource(%appDir%/localize)\n    recordTranslate: # optional    \n        -  Efabrica\\Translatte\\Record\\NullRecord()     \n```\n\n### Syntactic sugar\n\n**dictionary.sk_SK.neon**:\n\n```\ncart:\n    products_in_cart: 'V košíku je jeden produkt|V košíku sú %count% produkty|V košíku je %count% produktov'\n```\n\n**Source: src/PluralForm.php**\n\n```\nExample of count syntax:\nsk: '1|2-4|0,5-Inf'\ncz: '1|2-4|0,5-Inf'\nen: '1|0,2-Inf'\n\nExample of special count syntax (https://symfony.com/doc/3.1/components/translation/usage.html#pluralization):\nen: '[-Inf,-10]big negative count|]-10,0[negative count|{0}zero count|{1}one count|{2,3,4}two,three,four count|]4,Inf]more than four count' \nsk: '[-Inf,-10]veľký negatívny počet|]-10,0[negatívny počet|{0}nula počet|{1}jedna počet|{2,3,4}dva,tri,štyri počet|]4,Inf]viac ako štyri počet' \n```\n\n**index.php**:\n```\n// Translator setup\n$translator = ...\n\n// To params array is set count variable\n$translator-\u003etranslate('dictionary.cart.products_in_cart', 2); // V košíku sú 2 produkty\n\n// Param count from params array is used to select right plural form\n$translator-\u003etranslate('dictionary.cart.products_in_cart', ['count' =\u003e 2]); // V košíku sú 2 produkty\n\n// If we set both params nothing is override\n$translator-\u003etranslate('dictionary.cart.products_in_cart', 10, ['count' =\u003e 2]); // V košíku je 2 produktov\n```\n\n## \n\n## Main classes\n### Resolver\nResolves which language has translator to use.  \nAvailable resolvers:\n * **StaticResolver** - Resolves to given static lang.\n * **ChainResolver** - Multiple resolvers can be registered to this resolver. First resolver which returns non empty string is used.\n\n### Resource\nRepresents \"storage\" with translation strings. It can be anything - directory with translation files, database, redis or external api call.  \nAvailable resources:\n * **NeonResource** - One neon file.\n * **NeonDirectoryResource** - Multiple directories in which resource search neon files in format \"{prefix}.{lang}.neon\".\n\n### Cache\nUsed for cache generated directory.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fefabrica-team%2Ftranslatte","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fefabrica-team%2Ftranslatte","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fefabrica-team%2Ftranslatte/lists"}