{"_id":"i18n-proto","_rev":"28-7f1e66200e0b3dd930978b165af86401","name":"i18n-proto","dist-tags":{"latest":"1.0.5"},"versions":{"1.0.0":{"name":"i18n-proto","version":"1.0.0","keywords":["i18n"],"author":"","license":"MIT","_id":"i18n-proto@1.0.0","maintainers":[{"name":"heilage","email":"heilage.nsk@gmail.com"}],"homepage":"https://github.com/ctizen/i18n-proto#readme","bugs":{"url":"https://github.com/ctizen/i18n-proto/issues"},"dist":{"shasum":"4265eade2ba906085013a6e7a02e7cbe58afb650","tarball":"https://registry.npmjs.org/i18n-proto/-/i18n-proto-1.0.0.tgz","integrity":"sha512-LEk0AzJy77F/qFcZBSwMr+eDndOw62JG+PylyXxsPj/3VFwH9XmPkV5z/IvQtbWzaghSvUjsiYlcHHpVxHpXeA==","signatures":[{"sig":"MEQCIH+Dx2maGmI/qt79bSMB9qEZfH/Uw+pbUAHgbg+/RVsMAiAypZ4FDbxmfszc0kKYmpF+VRVvfEEB+Keda4+Rcn7UoA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.ts","_from":".","_shasum":"4265eade2ba906085013a6e7a02e7cbe58afb650","gitHead":"c1a13d27b58321b387a0dfe05c3e7ce1b850bd8c","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"heilage","email":"heilage.nsk@gmail.com"},"repository":{"url":"git+https://github.com/ctizen/i18n-proto.git","type":"git"},"_npmVersion":"3.10.10","description":"Typings & protocol description for i18n interactions","directories":{},"_nodeVersion":"6.10.3","_npmOperationalInternal":{"tmp":"tmp/i18n-proto-1.0.0.tgz_1501147984770_0.8692361232824624","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"i18n-proto","version":"1.0.1","keywords":["i18n"],"author":"","license":"MIT","_id":"i18n-proto@1.0.1","maintainers":[{"name":"heilage","email":"heilage.nsk@gmail.com"},{"name":"lastw","email":"me@lastw.net"}],"homepage":"https://github.com/ctizen/i18n-proto#readme","bugs":{"url":"https://github.com/ctizen/i18n-proto/issues"},"dist":{"shasum":"0a564b8cc893eee1f46800931561df0b917ccff0","tarball":"https://registry.npmjs.org/i18n-proto/-/i18n-proto-1.0.1.tgz","integrity":"sha512-08/ctqDY1davSk43vMH/izFAjNi06KjAu2/frCDSqeUg3Spfc838ms1kPafsrpjR9PZy11CuPZCbKwcyWrf9kA==","signatures":[{"sig":"MEUCIQD2mIPFWdWtspT/uy16j4xOlcIOU/p8vjePqC+Bt6HwAwIgWTAIyjh6IKAvyk406huE4VIAgYUolBDKoJtXZLa5Qnw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.ts","_from":".","_shasum":"0a564b8cc893eee1f46800931561df0b917ccff0","gitHead":"ef133e3d0feff1e01e5e011f8711cb289d952c92","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"heilage","email":"heilage.nsk@gmail.com"},"repository":{"url":"git+https://github.com/ctizen/i18n-proto.git","type":"git"},"_npmVersion":"3.10.10","description":"Typings & protocol description for i18n interactions","directories":{},"_nodeVersion":"6.10.3","_npmOperationalInternal":{"tmp":"tmp/i18n-proto-1.0.1.tgz_1501156874118_0.36890799133107066","host":"s3://npm-registry-packages"}},"1.0.2":{"name":"i18n-proto","version":"1.0.2","keywords":["i18n"],"author":"","license":"MIT","_id":"i18n-proto@1.0.2","maintainers":[{"name":"heilage","email":"heilage.nsk@gmail.com"},{"name":"lastw","email":"me@lastw.net"},{"name":"cherebedov.sergey","email":"cherebedov.sergey@gmail.com"},{"name":"korostelev","email":"vasiliy.korostelev@gmail.com"},{"name":"a.fedosov","email":"alex@fedosov.me"},{"name":"trufid","email":"m.zhivodkov@2gis.ru"},{"name":"egoroof","email":"mail@egoroof.ru"},{"name":"trufi","email":"stevemyz@gmail.com"}],"homepage":"https://github.com/2gis/i18n-proto#readme","bugs":{"url":"https://github.com/2gis/i18n-proto/issues"},"dist":{"shasum":"466d27e124954d616c86ef499cfae9ecf56f1ca4","tarball":"https://registry.npmjs.org/i18n-proto/-/i18n-proto-1.0.2.tgz","integrity":"sha512-PlEufCE+eJbdKYwitUeP4BR9e1MiMrMAoepLF5qSOIApon9XbvkPvYPutlwOdTFZoKgJKXrFnkP0LJ8ijq4i6Q==","signatures":[{"sig":"MEQCIFxrgPy3sJSG92Wdsbi/wx/+2PFTRMtFQyurGgGKoW3EAiAWRD2B3yemzl7fukqPZu06TGzMxRRizXqBTCz79FYXng==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.ts","_from":".","_shasum":"466d27e124954d616c86ef499cfae9ecf56f1ca4","gitHead":"7277d66b7a60a99ed7389dc6c5fcc11ad21ef55b","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"heilage","email":"heilage.nsk@gmail.com"},"repository":{"url":"git+https://github.com/2gis/i18n-proto.git","type":"git"},"_npmVersion":"3.10.10","description":"Typings & protocol description for i18n interactions","directories":{},"_nodeVersion":"6.10.3","_npmOperationalInternal":{"tmp":"tmp/i18n-proto-1.0.2.tgz_1501591283535_0.01925228931941092","host":"s3://npm-registry-packages"}},"1.0.3":{"name":"i18n-proto","version":"1.0.3","keywords":["i18n"],"author":"","license":"MIT","_id":"i18n-proto@1.0.3","maintainers":[{"name":"heilage","email":"heilage.nsk@gmail.com"},{"name":"lastw","email":"me@lastw.net"},{"name":"cherebedov.sergey","email":"cherebedov.sergey@gmail.com"},{"name":"korostelev","email":"vasiliy.korostelev@gmail.com"},{"name":"a.fedosov","email":"alex@fedosov.me"},{"name":"trufid","email":"m.zhivodkov@2gis.ru"},{"name":"egoroof","email":"mail@egoroof.ru"},{"name":"trufi","email":"stevemyz@gmail.com"}],"homepage":"https://github.com/2gis/i18n-proto#readme","bugs":{"url":"https://github.com/2gis/i18n-proto/issues"},"dist":{"shasum":"ec1992a7c7c607df31ae7683caac461813c4cb27","tarball":"https://registry.npmjs.org/i18n-proto/-/i18n-proto-1.0.3.tgz","integrity":"sha512-P02fTpHIozCL4aMnjtHU+9tfrUBag2xZi2TGQCefUFvVpzoE6SqdNMzxRdg8vyekO3k22QyJKz6rKLPm5H+kkA==","signatures":[{"sig":"MEQCIGx+sLXht4Dyv+Oor5ekVexXVFux46yfwiDXBk6FcsyXAiBCcJiZi7FlC8qK1t905mdDZVtitIa4xaioJ5jz/gpeMg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.ts","_from":".","_shasum":"ec1992a7c7c607df31ae7683caac461813c4cb27","gitHead":"fb68ffa111a606d65e2fe10bfb5d77304b7bcc79","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"heilage","email":"heilage.nsk@gmail.com"},"repository":{"url":"git+https://github.com/2gis/i18n-proto.git","type":"git"},"_npmVersion":"3.10.10","description":"Typings & protocol description for i18n interactions","directories":{},"_nodeVersion":"6.10.3","_npmOperationalInternal":{"tmp":"tmp/i18n-proto-1.0.3.tgz_1501592320522_0.6600819702725857","host":"s3://npm-registry-packages"}},"1.0.4":{"name":"i18n-proto","version":"1.0.4","keywords":["i18n"],"author":"","license":"MIT","_id":"i18n-proto@1.0.4","maintainers":[{"name":"heilage","email":"heilage.nsk@gmail.com"},{"name":"lastw","email":"me@lastw.net"},{"name":"cherebedov.sergey","email":"cherebedov.sergey@gmail.com"},{"name":"korostelev","email":"vasiliy.korostelev@gmail.com"},{"name":"a.fedosov","email":"alex@fedosov.me"},{"name":"trufid","email":"m.zhivodkov@2gis.ru"},{"name":"egoroof","email":"mail@egoroof.ru"},{"name":"trufi","email":"stevemyz@gmail.com"}],"homepage":"https://github.com/2gis/i18n-proto#readme","bugs":{"url":"https://github.com/2gis/i18n-proto/issues"},"dist":{"shasum":"fe9803542f2f5f1ccfb019da88f1bc14472eef42","tarball":"https://registry.npmjs.org/i18n-proto/-/i18n-proto-1.0.4.tgz","integrity":"sha512-k4OiyB9aYVvi3a16SxXMjOHM1sIGjRCFEySS6qP6s9JYQPhuprxDHseavPQj2Lr3Kin0Y87NEPey98cVecXH9w==","signatures":[{"sig":"MEYCIQDwir6mfM50vX68MOETWGk4Ku+KXPnYtxl5PCd8kfTAqAIhAOTyCgEaVR/uSDF0b3KSoXIRYYUMW3vh4KXyEGbk8M1N","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.ts","_from":".","_shasum":"fe9803542f2f5f1ccfb019da88f1bc14472eef42","gitHead":"5b4da04f6d7464293b04fe18565a6cb2ba8f7b71","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"heilage","email":"heilage.nsk@gmail.com"},"repository":{"url":"git+https://github.com/2gis/i18n-proto.git","type":"git"},"_npmVersion":"3.10.10","description":"Typings & protocol description for i18n interactions","directories":{},"_nodeVersion":"6.10.3","_npmOperationalInternal":{"tmp":"tmp/i18n-proto-1.0.4.tgz_1501592421657_0.17009143298491836","host":"s3://npm-registry-packages"}},"1.0.5":{"name":"i18n-proto","version":"1.0.5","keywords":["i18n"],"author":"","license":"MIT","_id":"i18n-proto@1.0.5","maintainers":[{"name":"heilage","email":"heilage.nsk@gmail.com"},{"name":"lastw","email":"me@lastw.net"},{"name":"cherebedov.sergey","email":"cherebedov.sergey@gmail.com"},{"name":"korostelev","email":"vasiliy.korostelev@gmail.com"},{"name":"a.fedosov","email":"alex@fedosov.me"},{"name":"trufid","email":"m.zhivodkov@2gis.ru"},{"name":"egoroof","email":"mail@egoroof.ru"},{"name":"trufi","email":"stevemyz@gmail.com"}],"homepage":"https://github.com/2gis/i18n-proto#readme","bugs":{"url":"https://github.com/2gis/i18n-proto/issues"},"dist":{"shasum":"5688a311022b46ca25612a15d53bee649930da0d","tarball":"https://registry.npmjs.org/i18n-proto/-/i18n-proto-1.0.5.tgz","integrity":"sha512-GTfRkYXsLKH0geFb4JRP/KBFXN6YM6PpXkpuG2lEWrwAF6bGLaDSJfh/kwc3vqtIqEmvnQ+7fL6cgIcupKtROA==","signatures":[{"sig":"MEUCIQDA/po1syFSUV7/oJ+Jo4uqj7cD+Edhhq4EzknScVVBbQIgH4XuwYq+VE8r7DxKcs08lHxer+pNmF5LbU23rv/ueMg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.ts","_from":".","_shasum":"5688a311022b46ca25612a15d53bee649930da0d","gitHead":"948a136a9e7e03aaec5247b7e0b2a62bcefeff86","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"heilage","email":"heilage.nsk@gmail.com"},"repository":{"url":"git+https://github.com/2gis/i18n-proto.git","type":"git"},"_npmVersion":"3.10.10","description":"Typings & protocol description for i18n interactions","directories":{},"_nodeVersion":"6.10.3","_npmOperationalInternal":{"tmp":"tmp/i18n-proto-1.0.5.tgz_1502429140661_0.7864924785681069","host":"s3://npm-registry-packages"}}},"time":{"created":"2017-07-27T09:33:05.747Z","modified":"2026-09-04T09:00:34.148Z","1.0.0":"2017-07-27T09:33:05.747Z","1.0.1":"2017-07-27T12:01:14.992Z","1.0.2":"2017-08-01T12:41:24.559Z","1.0.3":"2017-08-01T12:58:41.529Z","1.0.4":"2017-08-01T13:00:22.575Z","1.0.5":"2017-08-11T05:25:41.647Z"},"bugs":{"url":"https://github.com/2gis/i18n-proto/issues"},"license":"MIT","homepage":"https://github.com/2gis/i18n-proto#readme","keywords":["i18n"],"repository":{"url":"git+https://github.com/2gis/i18n-proto.git","type":"git"},"description":"Typings & protocol description for i18n interactions","maintainers":[{"email":"artem.malko@gmail.com","name":"artem.malko"},{"email":"stevemyz@gmail.com","name":"trufi"},{"email":"me@lastw.net","name":"lastw"},{"email":"mbeloshitsky@gmail.com","name":"itanka9"},{"email":"a.artemev@inbox.ru","name":"alxart"},{"email":"vitaliy.gis@gmail.com","name":"vitaliy.gis"},{"email":"mail@kuznetsov.it","name":"kuznetcoff"},{"email":"oleg1556@gmail.com","name":"kalyanov"},{"email":"count@ngs.ru","name":"kto-to"},{"email":"m.novoselcev@2gis.ru","name":"mnovoseltsev"},{"email":"heilage.nsk@gmail.com","name":"heilage"}],"readme":"## Интернационализационные пакеты и их использование\n\nСлой интернационализации выполнен в виде нескольких минимально зависимых друг от друга пакетов, чтобы упростить их доработку и внедрение в рабочие проекты. Список пакетов на текущий момент включает:\n- **i18n-proto** - пакет с общими форматами и протоколами, используется для унификации договоренностей между остальными пакетами.\n- **i18n-stex** - STrings EXtractor, пакет, выделяющий из исходного кода строки переводов в формате, заданном протоколом.\n- **i18n-json-po** - конвертер из формата, заданного протоколом, в общепринятый формат PO/POT (он же формат gettext).\n- **i18n-po-json** - конвертер в обратную сторону.\n- **i18n-dialect** - независимая библиотека, которая инкапсулирует внутри себя всю грязную работу по локализации строк в рантайме приложения. В отличие от остальных пакетов, не может быть использована как отдельный CLI-tool и предназначена для внедрения непосредственно в целевое приложение в виде зависимости.\n\n### Основные концепции и идеи\n\nВ основу пакетной архитектуры легли следующие идеи и требования:\n- **Слой интернационализации не должен ничего знать об архитектуре целевого приложения**. Это позволит переиспользовать его практически без изменений в любом приложении, если оно написано на JS/TS.\n- **Каждый пакет должен быть максимально простым для пользователя и выполнять единственную цель**. По сути, это про UNIX-way и разделение ответственности. Требование простоты для пользователя можно также трактовать с точки зрения предоставляемого интерфейса: **пакет или библиотека должны предоставлять максимально ограниченный интерфейс, достаточный для выполнения цели**.\n- Каждый пакет должен быть покрыт тестами и документацией. Написание исчерпывающих тестов для программы с четко очерченной целью не должно представлять существенной сложности.\n\nПри доработке пакетов следует принять во внимание следующие моменты:\n- Если выявлен баг и его нужно поправить, обязательно нужны тесты на этот баг.\n- Если тем или иным образом уточняется или дополняется цель пакета, нужно убедиться, что обновленная цель соответствует вышеуказанным концепциям. В частности, не следует допускать размазывания ответственности и нечеткого назначения (типа, пакет делает вот это, но еще немного и вон то, хотя оно и не очень относится к первому).\n- Если выясняется, что пакет должен работать иначе, нужно опять же четко определить границы его ответственности. \n\nПример 1: библиотека интернационализации ни в коем случае не должна принимать на себя обязанность самостоятельной загрузки файлов переводов, поскольку конкретный способ загрузки определяет конечное приложение. Вместо этого библиотека должна принимать функцию получения перевода из конечного приложения в качестве параметра конфигурации.\n\nПример 2: пакет экстрактора строк не должен брать на себя обязанность формирования корректного файла PO/POT, поскольку это не его основная задача. При этом формирование данных в JSON-формате выглядит достаточно простым для реализации в составе экстрактора строк, поэтому разумно выбрать в качестве промежуточного именно этот формат.\n\nПример 3: библиотека интернационализации не должна брать на себя обязанность управления локализационными настройками (наименования валют, последовательность дней в неделе, формат даты, и т.д.), поскольку настройки не относятся к переводам. Можно даже сказать больше - выбор конкретного _перевода_ зависит от одной из локальных _настроек_, поэтому реализацию локальных настроек должно брать на себя приложение. Кроме того, разные настройки могут зависеть от разных факторов; например, наименование валюты зависит только от текущей страны, с другой стороны формат даты может быть привязан к текущему выбранному языку.\n\n### Области ответственности пакетов и библиотек\n\nПо исходной задумке библиотеки и пакеты слоя интернационализации имеют следующие цели и области ответственности:\n\n- **i18n-proto** \n  - Единая точка задания контрактов между остальными пакетами.\n  - Определяет интерфейсы взаимодействия. \n- **i18n-stex**\n  - Вход: список файлов с исходным кодом конечного приложения.\n  - Выход: список строк переводов с параметрами, контекстами, комментариями и прочим в формате, заданном протоколом\n  - Также осуществляет проверку корректности вхождений строк переводов в исходных файлах и выдает ошибки и предупреждения при необходимости.\n- **i18n-json-po**\n  - Вход: данные в формате, заданном протоколом.\n  - Выход: валидный PO/POT файл, с которым могут работать любые стандартные gettext-утилиты.\n  - Также осуществляет базовые проверки корректности данных, выдавая ошибки и предупреждения.\n  - Также имеет некоторые настройки выходного формата, позволяющие, например, отключить указание вхождений строки в результирующем файле.\n- **i18n-po-json**\n  - Вход: валидный PO/POT файл, с которым могут работать любые стандартные gettext-утилиты.\n  - Выход: данные в формате, заданном протоколом.\n  - Также осуществляет базовые проверки корректности данных, выдавая ошибки и предупреждения.\n  - Также имеет некоторые настройки выходного формата, позволяющие, например, отключить указание вхождений строки в результирующем файле.\n- **i18n-dialect**\n  - Единая точка входа для клиентского приложения\n  - Предоставляет интернационализационные функции (_t, _pt, etc), используемые приложением в рантайме. Поддерживает необходимую функциональность, заявленную для этих функций (в частности, выбор плюральных форм, подстановки, макросы).\n  - Гарантирует, что формат предоставляемых интернационализационных функций корректно обрабатывается парсером i18n-stex.\n  - Предоставляет ограниченный интерфейс, позволяющий:\n    - Получить перевод для строки в рантайме согласно текущим настройкам (это опять же про _t, _pt, etc).\n    - Инициализировать смену текущего перевода на требуемый.\n    - Задать способ получения данных переводов.\n    - Задать способ сигнализирования клиентскому приложению о том, что переводы получены, готовы и их нужно перезагрузить.\n    - Задать список общих макросов.\n    - Передать иные настройки, определять которые должно конечное приложение, а не библиотека.\n\n**Всё, что не указано явно в списке целей, не должно являться дополнительной целью или побочным эффектом реализации.** Если в результате доработок получается, что список не полностью отражает состояние пакета, следует еще раз продумать и прояснить границы ответственности этого пакета.\n","readmeFilename":"README.ru.md"}