{"_id":"@channel.io/lokalise-mcp","_rev":"7-c78c1bd9c126c68012a416fea7f4dde8","name":"@channel.io/lokalise-mcp","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.0-alpha.3":{"name":"@channel.io/lokalise-mcp","version":"0.0.0-alpha.3","keywords":["lokalise","mcp","i18n","channel"],"author":{"name":"Channel Corp."},"license":"UNLICENSED","_id":"@channel.io/lokalise-mcp@0.0.0-alpha.3","maintainers":[{"name":"zoyi","email":"eng@channel.io"},{"name":"quino0627","email":"dongwook627@gmail.com"},{"name":"sungik.dev","email":"sungik.dev@gmail.com"}],"homepage":"https://github.com/channel-io/ch-mcp-tools#readme","bugs":{"url":"https://github.com/channel-io/ch-mcp-tools/issues"},"bin":{"lokalise-mcp":"dist/index.js"},"dist":{"shasum":"95c3d4b6178748cd0c41e012a5e52bef902adef9","tarball":"https://registry.npmjs.org/@channel.io/lokalise-mcp/-/lokalise-mcp-0.0.0-alpha.3.tgz","fileCount":6,"integrity":"sha512-69rGNtCdTAKcnMj6Lg0uv2LlrAHQtjhFjQNmT3TAyWDrW7wH4D1cT5Y2N+3ksG9TCZWnlOlJsAl/mc190ZfAHQ==","signatures":[{"sig":"MEQCIHEeFu3W9BfsCWh1pWrW+A2dSesKeBx6bqQF8j9FJd1LAiAG4TidoBeh09Sy2iEAJHIlZd8v+FJIxXjB3S7c2xuVxw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11736},"type":"module","_from":"file:channel.io-lokalise-mcp-0.0.0-alpha.3.tgz","engines":{"node":">=14.0.0"},"scripts":{"lint":"eslint . --ext .js,.jsx,.ts,.tsx","build":"tsc && chmod +x dist/index.js","format":"prettier --write .","lint:fix":"eslint . --ext .js,.jsx,.ts,.tsx --fix","format:check":"prettier --check ."},"_npmUser":{"name":"zoyi","email":"eng@channel.io"},"_resolved":"/private/var/folders/py/2jpr9rx52_n9rc8n909jnjvr0000gn/T/3c927c413eff17e34ef6359db63fd6cb/channel.io-lokalise-mcp-0.0.0-alpha.3.tgz","_integrity":"sha512-69rGNtCdTAKcnMj6Lg0uv2LlrAHQtjhFjQNmT3TAyWDrW7wH4D1cT5Y2N+3ksG9TCZWnlOlJsAl/mc190ZfAHQ==","repository":{"url":"git+https://github.com/channel-io/ch-mcp-tools.git","type":"git"},"_npmVersion":"9.6.7","description":"Model Context Protocol server for Lokalise integration","directories":{},"_nodeVersion":"18.17.0","dependencies":{"zod":"^3.24.2","axios":"1.6.7","@lokalise/node-api":"^14.4.0","@ch-mcp-tools/mcp-utils":"^0.1.0","@modelcontextprotocol/sdk":"^1.6.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"5.0.4","@types/node":"18.17.0"},"_npmOperationalInternal":{"tmp":"tmp/lokalise-mcp_0.0.0-alpha.3_1745842385848_0.63630448138203","host":"s3://npm-registry-packages-npm-production"}},"0.0.0-alpha.4":{"name":"@channel.io/lokalise-mcp","version":"0.0.0-alpha.4","keywords":["lokalise","mcp","i18n","channel"],"author":{"name":"Channel Corp."},"license":"UNLICENSED","_id":"@channel.io/lokalise-mcp@0.0.0-alpha.4","maintainers":[{"name":"zoyi","email":"eng@channel.io"},{"name":"quino0627","email":"dongwook627@gmail.com"},{"name":"sungik.dev","email":"sungik.dev@gmail.com"}],"homepage":"https://github.com/channel-io/ch-mcp-tools#readme","bugs":{"url":"https://github.com/channel-io/ch-mcp-tools/issues"},"bin":{"lokalise-mcp":"dist/index.js"},"dist":{"shasum":"c0f55b6fb8254594447b8abcc208117c06bbd1b7","tarball":"https://registry.npmjs.org/@channel.io/lokalise-mcp/-/lokalise-mcp-0.0.0-alpha.4.tgz","fileCount":6,"integrity":"sha512-x01JanW4OOGcdBTx+z4C+YbB2vEPwn/dz6erqEXOcuhsVVb00zdjt2w9bEdl+N64PhT6SKORb4loyvvpE2GAZA==","signatures":[{"sig":"MEUCIQDC5AXl7Y9BfYvjLUUGT6I1oHPqPtbjCzkL8u9Fr8x/sAIgNm56qfkw+0hGju9XO5ncDw8li/atUp0C6Cv7tR1XQ+s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11525},"type":"module","_from":"file:channel.io-lokalise-mcp-0.0.0-alpha.4.tgz","engines":{"node":">=14.0.0"},"scripts":{"lint":"eslint . --ext .js,.jsx,.ts,.tsx","build":"tsc && chmod +x dist/index.js","format":"prettier --write .","lint:fix":"eslint . --ext .js,.jsx,.ts,.tsx --fix","format:check":"prettier --check ."},"_npmUser":{"name":"zoyi","email":"eng@channel.io"},"_resolved":"/tmp/bbf070dd776e4dc7860ace6308d2505a/channel.io-lokalise-mcp-0.0.0-alpha.4.tgz","_integrity":"sha512-x01JanW4OOGcdBTx+z4C+YbB2vEPwn/dz6erqEXOcuhsVVb00zdjt2w9bEdl+N64PhT6SKORb4loyvvpE2GAZA==","repository":{"url":"git+https://github.com/channel-io/ch-mcp-tools.git","type":"git"},"_npmVersion":"10.2.4","description":"Model Context Protocol server for Lokalise integration","directories":{},"_nodeVersion":"20.11.0","dependencies":{"zod":"^3.24.2","axios":"1.6.7","@lokalise/node-api":"^14.4.0","@modelcontextprotocol/sdk":"^1.6.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"5.0.4","@types/node":"18.17.0"},"_npmOperationalInternal":{"tmp":"tmp/lokalise-mcp_0.0.0-alpha.4_1745846655105_0.46276263201510615","host":"s3://npm-registry-packages-npm-production"}},"0.0.0":{"name":"@channel.io/lokalise-mcp","version":"0.0.0","keywords":["lokalise","mcp","i18n","channel"],"author":{"name":"Channel Corp."},"license":"UNLICENSED","_id":"@channel.io/lokalise-mcp@0.0.0","maintainers":[{"name":"zoyi","email":"eng@channel.io"},{"name":"quino0627","email":"dongwook627@gmail.com"},{"name":"sungik.dev","email":"sungik.dev@gmail.com"}],"homepage":"https://github.com/channel-io/ch-mcp-tools#readme","bugs":{"url":"https://github.com/channel-io/ch-mcp-tools/issues"},"bin":{"lokalise-mcp":"dist/index.js"},"dist":{"shasum":"a81410c0d420e6f958658161d52fb9440fca8b43","tarball":"https://registry.npmjs.org/@channel.io/lokalise-mcp/-/lokalise-mcp-0.0.0.tgz","fileCount":6,"integrity":"sha512-2FiM0rbj2tXGE4eqO9n9H78l8SS5nuW87bbXdL23QgAbEJtqXAxgtq5Hj3M4S2dbcy/OIHZV4rJiBBI6gpx+iA==","signatures":[{"sig":"MEYCIQC26l1n2sjNUcylSLy/vsCXmh59cuJLsNXFIJhBQyt/7AIhANhGO0Frj7WsRsJFkGyuOt0UZAJGjjRPEeN4uwh7eK4d","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11517},"type":"module","_from":"file:channel.io-lokalise-mcp-0.0.0.tgz","engines":{"node":">=14.0.0"},"scripts":{"lint":"eslint . --ext .js,.jsx,.ts,.tsx","build":"tsc && chmod +x dist/index.js","format":"prettier --write .","lint:fix":"eslint . --ext .js,.jsx,.ts,.tsx --fix","format:check":"prettier --check ."},"_npmUser":{"name":"zoyi","email":"eng@channel.io"},"_resolved":"/tmp/a462c8683f411615440b504caf281d78/channel.io-lokalise-mcp-0.0.0.tgz","_integrity":"sha512-2FiM0rbj2tXGE4eqO9n9H78l8SS5nuW87bbXdL23QgAbEJtqXAxgtq5Hj3M4S2dbcy/OIHZV4rJiBBI6gpx+iA==","repository":{"url":"git+https://github.com/channel-io/ch-mcp-tools.git","type":"git"},"_npmVersion":"10.2.4","description":"Model Context Protocol server for Lokalise integration","directories":{},"_nodeVersion":"20.11.0","dependencies":{"zod":"^3.24.2","axios":"1.6.7","@lokalise/node-api":"^14.4.0","@modelcontextprotocol/sdk":"^1.6.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"5.0.4","@types/node":"18.17.0"},"_npmOperationalInternal":{"tmp":"tmp/lokalise-mcp_0.0.0_1745911779204_0.06054430152531931","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@channel.io/lokalise-mcp","version":"0.1.0","keywords":["lokalise","mcp","i18n","channel"],"author":{"name":"Channel Corp."},"license":"UNLICENSED","_id":"@channel.io/lokalise-mcp@0.1.0","maintainers":[{"name":"zoyi","email":"eng@channel.io"},{"name":"quino0627","email":"dongwook627@gmail.com"},{"name":"sungik.dev","email":"sungik.dev@gmail.com"}],"homepage":"https://github.com/channel-io/ch-mcp-tools#readme","bugs":{"url":"https://github.com/channel-io/ch-mcp-tools/issues"},"bin":{"lokalise-mcp":"dist/index.js"},"dist":{"shasum":"2fa1bacfe6da21a453ad233bf01a859d0c671b75","tarball":"https://registry.npmjs.org/@channel.io/lokalise-mcp/-/lokalise-mcp-0.1.0.tgz","fileCount":5,"integrity":"sha512-8MNEEoJxYgpQ+FKk+Wsy78AFxhFHvQAeWq8DuUanEUDgMaOO/PC8uo3xHAl9qREsoBSJ/aLk4EH6e8qPNZllyg==","signatures":[{"sig":"MEUCIQCQepcnTIc2fGciSVWRgCXT3mlaDADBsKNIeOjyU/ZoYQIgEiv2LA66i7u5vClhwwE2yKsnXponGrNZJ4XvVePzYz0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40455},"type":"module","_from":"file:channel.io-lokalise-mcp-0.1.0.tgz","engines":{"node":">=14.0.0"},"scripts":{"lint":"eslint . --ext .js,.jsx,.ts,.tsx","build":"tsup && chmod +x dist/index.js","format":"prettier --write .","lint:fix":"eslint . --ext .js,.jsx,.ts,.tsx --fix","format:check":"prettier --check ."},"_npmUser":{"name":"zoyi","email":"eng@channel.io"},"_resolved":"/tmp/476a4d15da48ad4a3eade86666aacc91/channel.io-lokalise-mcp-0.1.0.tgz","_integrity":"sha512-8MNEEoJxYgpQ+FKk+Wsy78AFxhFHvQAeWq8DuUanEUDgMaOO/PC8uo3xHAl9qREsoBSJ/aLk4EH6e8qPNZllyg==","repository":{"url":"git+https://github.com/channel-io/ch-mcp-tools.git","type":"git"},"_npmVersion":"10.2.4","description":"Model Context Protocol server for Lokalise integration","directories":{},"_nodeVersion":"20.11.0","dependencies":{"zod":"^3.24.2","axios":"1.6.7","@lokalise/node-api":"^14.4.0","@modelcontextprotocol/sdk":"^1.6.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"5.0.4","@types/node":"18.17.0"},"_npmOperationalInternal":{"tmp":"tmp/lokalise-mcp_0.1.0_1746165096732_0.49582595456728473","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-04-28T13:24:15.005Z","modified":"2026-01-26T12:51:52.166Z","1.0.0":"2025-04-21T15:32:42.871Z","0.0.0-alpha.3":"2025-04-28T12:13:06.018Z","0.0.0-alpha.4":"2025-04-28T13:24:15.292Z","0.0.0":"2025-04-29T07:29:39.386Z","0.1.0":"2025-05-02T05:51:36.921Z"},"bugs":{"url":"https://github.com/channel-io/ch-mcp-tools/issues"},"author":{"name":"Channel Corp."},"license":"UNLICENSED","homepage":"https://github.com/channel-io/ch-mcp-tools#readme","keywords":["lokalise","mcp","i18n","channel"],"repository":{"url":"git+https://github.com/channel-io/ch-mcp-tools.git","type":"git"},"description":"Model Context Protocol server for Lokalise integration","maintainers":[{"email":"polar@channel.io","name":"polarshin"},{"email":"eng@channel.io","name":"zoyi"},{"email":"dongwook627@gmail.com","name":"quino0627"},{"email":"sungik.dev@gmail.com","name":"sungik.dev"}],"readme":"# Lokalise MCP\n\nChannel 팀을 위한 Lokalise MCP 도구입니다. 이 도구는 Cursor에서 번역 키 생성 및 관리를 도와주는 AI 도구입니다.\n\n## Cursor MCP 설정\n\nCursor에서 MCP로 사용하려면 `.cursor/mcp.json` 파일에 다음과 같이 설정합니다:\n\n```json\n{\n  \"mcpServers\": {\n    \"lokalise-mcp\": {\n      \"command\": \"npx -y @channel.io/lokalise-mcp\",\n      \"env\": {\n        \"LOKALISE_TOKEN\": \"your-lokalise-token\",\n        \"PROJECT_ID\": \"your-project-id\",\n        \"PLATFORMS\": [\"web\", \"ios\", \"android\"]\n      }\n    }\n  }\n}\n```\n\n### 환경 변수 설명\n\n- **LOKALISE_TOKEN**: Lokalise API에 접근하기 위한 개인 액세스 토큰입니다. Lokalise 계정 설정에서 발급받을 수 있습니다.\n- **PROJECT_ID**: 작업할 Lokalise 프로젝트의 고유 식별자입니다. Lokalise 프로젝트 URL이나 설정에서 확인할 수 있습니다.\n- **PLATFORMS**: 번역 키가 지원할 플랫폼 목록입니다.\n\n## 주요 기능\n\n이 MCP 서버는 두 가지 주요 기능을 제공합니다:\n\n1. **번역 키 조회**: 프로젝트에 이미 존재하는 번역 키를 검색합니다\n2. **번역 키 생성**: 새로운 번역 키를 생성하고 초기 번역값을 설정합니다\n\n## 함께 사용하면 좋은 Cursor Rule 예시\n\n아래의 프롬프트를 사용하면 효과적으로 번역 키 추가 작업을 진행할 수 있습니다:\n\n> 이 프롬프트는 ch-desk-web에서 사용하는 프롬프트입니다. 다른 프로젝트에서 사용하려면 프롬프트를 일부 수정해야 할 수 있습니다.\n\n````\n당신은 cursor 내에 통합된 LLM 에이전트입니다. 하드코딩된 한글 문자열에 대한 번역 키 추가 작업을 자동화하기 위해 아래 가이드라인을 준수하세요.\n\n\n## 목적\n- 코드베이스에서 하드코딩된 한글 문자열을 찾아 대응하는 번역 키를 생성 및 적용합니다.\n- 기본적으로 <업무 파이프라인>을 따라 작업을 진행합니다.\n\n\n## [!CRITICAL] 제약 조건\n- <업무 파이프라인>의 단계를 반드시 지키도록\n- 만약 <업무 파이프라인>의 특정 단계에서 작업 수행을 실패하면 그 즉시 실패 원인과 함께 응답 종료\n\n\n## [!CRITICAL] 필수 참고 사항\n\n### 명령어 정의\n- '/completion'이란 현재 챗을 완료하고 사용자에게 추가 프롬프트를 요청할 때 사용하는 명령어입니다.\n\n### MCP tool 주의 사항\n- lokalise_create_keys를 통한 번역키 생성은 비가역적으로 진행되며, 이미 존재하는 키를 삭제하거나 수정할 수 없음\n- lokalise_create_keys 전에 lokalise_get_keys를 통한 중복 확인 단계를 수행하지 않으면 중복 키 생성 시 오류가 발생할 수 있음\n\n### 번역 키 네이밍 규칙\n- snake_case.snake_case.snake_case 네이밍 사용\n- 계층 구조 준수: 코드베이스의 구조를 참조하여, 위계와 맥락에 따라 번역키에 적절히 이름을 붙이기\n\n\n## 업무 파이프라인\n\n### 1. 작업 맥락 파악\n- 사용자가 참조로 제공한 \"작업 범위\" 내에서 하드코딩된 한글 문자열 검색 (주석 처리된 문자열 제외)\n- 번역이 필요한 페이지/컴포넌트의 구조와 문맥 파악\n\n### 2. 번역 키:값 준비\n- <번역 키 네이밍 규칙>에 따라 `{ \"key\": \"value\" }` 형식으로 번역 키:값 목록 준비 (`value`는 원본 한글)\n- [!IMPORTANT] 특수 요소 처리:\n  * 템플릿 리터럴(`${}`) → `import { sprintf } from 'sprintf-js'`에서 parse할 수 있는 형식으로 변환 (e.g. `\"${name}님 안녕하세요\"` → `\"%s님 안녕하세요\"`)\n  * HTML 태그 → 번역 값에 직접 innerHTML로 처리 (e.g. `제 이름은 <b>라온</b>입니다.`)\n  * 줄바꿈 등 특수 문자 → 적절히 이스케이프 시퀀스 활용\n\n### 3. 번역 값 중복 확인\n- 동일한 번역 값(`value`)을 가진 키가 있는지 확인\n  - [!IMPORTANT] 리포지토리 루트에 있는 `l10n/ko.json` 파일에서 batch로 grep 하여 추출\n- 중복이 없다면 최종 번역 키:값 목록 준비 후 다음 단계로 넘어감\n- 중복 발견 시 옵션 제안:\n  * 기존 키 재사용 (도메인 로직이 아니라 일반적인 번역 키인 경우)\n  * 새 키 생성 (도메인 의존적인 번역 키인 경우)\n- [!CRITICAL] 옵션에 대한 제안은 하되, 최종 결정은 사용자에게 물어볼 것 (/completion)\n  - 가독성 있게 코드블록(json)으로 제안할 것\n  - 사용자의 답변을 바탕으로 최종 `{ \"key\": \"value\" }` 형식의 번역 키:값 목록 준비\n\n### 4. 번역 키 생성 전 품질 검증\n- \"작업 범위\" 내 놓친 번역 키가 있는지 확인\n- 이전 단계가 모두 정상적으로 수행되었는지 확인\n\n### 5. 번역 키 생성 및 통합\n- `lokalise_get_keys` 도구로 번역키 중복 확인\n  - [!CRITICAL] 중복 키가 있는 경우:\n    * 키에 version postfix를 붙여 중복 회피 (e.g. `meet.meet_banner.title` → `meet.meet_banner.title.v1`)\n    * 사용자에게 다시 최종 결정을 물어볼 것 (/completion)\n- `lokalise_create_keys` 도구로 키 생성\n  - [!CRITICAL] 사용자에게 번역 키 태그를 한번도 받지 못한 경우 사용자에게 직접 요청할 것 (/completion)\n- `yarn download-l10n` 스크립트 실행하여 번역 파일 갱신\n- 코드 적용:\n  * `import useTranslator from 'Hooks/useTranslator'` 훅을 사용한 번역 키 적용\n  * 기본적으로 translate 함수를 사용\n  * 템플릿 변수 처리해야하는 경우, 함수의 파라미터를 적절히 사용\n  * innerHTML 처리해야하는 경우, translate 대신 translateWithInnerHtml 함수를 사용\n\n\n## 번역 키:값 예시\n\n### 일반적인 번역 키:값\n```json\n{\n  \"channel_settings.manage_webhooks.webhook_list.empty\": \"Webhook이 없습니다. 새 Webhook을 만들어 주세요.\"\n  \"channel_settings.manage_webhooks.show_webhook.modal.title\": \"새 Webhook이 만들어졌습니다.\"\n  \"channel_settings.manage_webhooks.show_webhook.modal.ok\": \"확인\"\n  \"channel_settings.manage_webhooks.edit_webhook.modal.title\": \"Webhook 관리\"\n  \"channel_settings.manage_webhooks.delete_webhook.success\": \"Webhook이 삭제되었습니다.\"\n  \"channel_settings.plugin_setting.button_customize\": \"버튼 커스터마이징\"\n  \"channel_settings.plugin_setting.button_customize.reset\": \"초기화\"\n  \"channel_settings.integrations.messengers.line.apply_modal.locale\": \"언어\"\n  \"channel_settings.integrations.messengers.line.apply_modal.locale.description\": \"선택하신 언어에 따라 고객에게 부재중 메시지와 같은 자동 메시지가 전송됩니다.\"\n  \"channel_settings.integrations.messengers.line.apply_modal.channel_id\": \"라인 Channel ID\"\n  \"channel_settings.integrations.messengers.line.apply_modal.channel_id.placeholder\": \"라인 Channel ID 입력\"\n  \"channel_settings.integrations.messengers.line.apply_modal.channel_secret\": \"라인 Channel Secret\"\n  \"channel_settings.integrations.messengers.line.apply_modal.channel_secret.placeholder\": \"라인 Channel Secret 입력\"\n  \"channel_settings.integrations.messengers.line.apply_modal.access_token\": \"Access token\\n(long-lived)\"\n  \"channel_settings.integrations.messengers.line.apply_modal.access_token.placeholder\": \"Access token 입력\"\n  \"channel_settings.integrations.messengers.line.apply_modal.id\": \"Basic ID (또는 Premium ID)\"\n  \"channel_settings.integrations.messengers.line.apply_modal.id.placeholder\": \"Basic ID 또는 Premium ID를 입력\"\n  \"channel_settings.integrations.messengers.line.webhook_link_modal.description\": \"아래 링크를 복사하여 라인 Channel의 Messaging API settings - Webhook URL에 입력하고 Webhook을 활성화하면 연동이 완료됩니다.\"\n}\n```\n\n### with common prefix\n```json\n{\n  \"common.cancel\": \"취소\"\n  \"common.confirm\": \"확인\"\n  \"common.close\": \"닫기\"\n  \"common.delete\": \"삭제\"\n  \"common.save\": \"저장\"\n  \"common.copy\": \"복사\"\n  \"common.apply\": \"적용\"\n  \"common.me\": \"나\"\n  \"common.next\": \"다음\"\n  \"common.retry\": \"재시도\"\n  \"common.time\": \"시간\"\n  \"common.no_data\": \"표시할 내용이 없습니다.\"\n  \"common.not_empty\": \"비워둘 수 없습니다\"\n}\n```\n\n### with error prefix\n```json\n{\n  \"error.do_not_empty\": \"비워둘 수 없습니다.\"\n  \"error.max_length\": \"%s자까지 입력할 수 있습니다.\"\n  \"error.available_english_number\": \"영문, 숫자, -, _만 사용할 수 있습니다.\"\n  \"error.aspect_ratio\": \"가로:세로 비율이 %s이 아닌 경우 등록할 수 없습니다.\"\n  \"error.min_width\": \"가로 %spx 이하일 경우 등록할 수 없습니다.\"\n  \"error.max_file_size\": \"최대 %s까지 등록할 수 있습니다.\"\n  \"error.content_type\": \"%s만 등록할 수 있습니다.\"\n  \"error.require_version_update.title\": \"앗, 이전 버전의 앱을 사용 중이에요\"\n  \"error.unsupported_file_extension\": \"파일 형식을 다시 확인해주세요.\"\n  \"error.invalid_url\": \"잘못된 주소입니다.\"\n}\n```\n\n### with innerHTML & escape sequence\n```json\n{\n  \"log_message.create_chat\": \"<b>%(subject)s<\\/b>님이 <b>%(object)s<\\/b>(을)를 만들었습니다.\"\n  \"log_message.invite_chat\": \"<b>%(subject)s<\\/b>님이 <b>%(object)s<\\/b>을(를) 초대했습니다.\"\n  \"common.powered_by\": \"<b>채널톡<\\/b> 이용중\"\n  \"channel.invite_recommend_description\": \"현재 채널에 <b>%s명<\\/b>의 매니저가 있습니다. <b>매니저를 추가해도 추가 과금이 없으니<\\/b> 안심하고 매니저를 초대하여 대화해보세요.\"\n  \"campaign_editor.ui.operating_panel.activated_description\": \"언제, 어떻게 메시지를 전송할지 설정합니다. '운영' 설정을 끝으로 메시지가 전송됩니다.<br>\\n예) 서울 접속자 중 가입하고 2주 동안 구매가 없으면 <b><u>매주 월요일 아침 9시에<\\/u><\\/b> 전송\",\n  \"campaign_editor.ui.delay_panel.activated_description\": \"아래 '대기 시간' 만큼 기다렸다가 다시 대상 고객을 체크하고 '운영' 단계로 넘어갑니다.<br>\\n예) 서울 접속자 중 가입하고 <b><u>2주 동안<\\/u><\\/b> 구매가 없으면 매주 월요일 아침 9시에 전송\"\n}\n```\n\n### with template variable\n```json\n{\n  \"chat_action.manager_list.header\": \"%s명 참여\"\n  \"confirm_delete_member\": \"%s님을 채널에서 삭제하시겠습니까?\"\n  \"invitation.sns.message\": \"%s님이 '%s' 채널로 당신을 초대했습니다.\\n채널에 참여해 주시기 바랍니다.\"\n  \"settings.billing.order_histories.discount_tooltip\": \"%s%% 할인 쿠폰 적용됨\"\n  \"support_bot.max\": \"최대 %s개까지 추가할 수 있습니다.\"\n  \"bot.select.create_new_bot\": \"'%s' 새로 만들기...\"\n  \"teamchats.participants_list.title\": \"참여자 ∙ %s\"\n  \"expressive_query.values.format.plural\": \"%s 또는 %s개\"\n  \"common.append_new_value\": \"'%s' 입력\"\n  \"marketing.otm.success_modal.title_content\": \"%s명에게 메시지를 성공적으로 전달했습니다!👏\"\n  \"user_profile_page.menu.copy_link.tooltip\": \"유저 링크 복사\\n%s\"\n  \"log_message.invite_chat\": \"<b>%(subject)s<\\/b>님이 <b>%(object)s<\\/b>을(를) 초대했습니다.\"\n  \"log_message.leave_chat\": \"<b>%(subject)s<\\/b>님이 대화를 떠났습니다.\"\n  \"log_message.change_chat_name\": \"<b>%(subject)s<\\/b>님이 그룹이름을 <b>%(object)s<\\/b>(으)로 변경하였습니다.\"\n  \"notification.upload_file.description\": \"%(name)s 님이 파일을 업로드했습니다.\"\n  \"log_message.remove\": \"<b>%(subject)s<\\/b>님이 상담을 삭제하였습니다.\"\n  \"log_message.close\": \"<b>%(subject)s<\\/b>님이 상담을 종료하였습니다.\"\n  \"log_message.unhold\": \"<b>%(subject)s<\\/b>님이 상담을 보류 해제 하였습니다.\"\n}\n```\n\n````\n","readmeFilename":"README.md"}