{"id":31551344,"url":"https://github.com/betomorrow/sync-wording","last_synced_at":"2025-10-25T15:35:56.987Z","repository":{"id":42946787,"uuid":"233568553","full_name":"BeTomorrow/sync-wording","owner":"BeTomorrow","description":"Tool to sync app wording from Google Sheet","archived":false,"fork":false,"pushed_at":"2025-01-09T17:49:28.000Z","size":140,"stargazers_count":3,"open_issues_count":4,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-04T14:53:31.793Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","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/BeTomorrow.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}},"created_at":"2020-01-13T10:22:05.000Z","updated_at":"2025-01-09T17:47:34.000Z","dependencies_parsed_at":"2023-01-24T02:30:35.267Z","dependency_job_id":null,"html_url":"https://github.com/BeTomorrow/sync-wording","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/BeTomorrow/sync-wording","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BeTomorrow%2Fsync-wording","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BeTomorrow%2Fsync-wording/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BeTomorrow%2Fsync-wording/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BeTomorrow%2Fsync-wording/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BeTomorrow","download_url":"https://codeload.github.com/BeTomorrow/sync-wording/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BeTomorrow%2Fsync-wording/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278358483,"owners_count":25973946,"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","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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-10-04T18:41:53.283Z","updated_at":"2025-10-04T18:41:56.943Z","avatar_url":"https://github.com/BeTomorrow.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Sync Wording\n\nThis tool allow you to manage app's wording with simple Google Sheet file. Just create a sheet with columns for keys and wording. This tool will generate wording files. Your product owner will be able to edit himself apllication's wording\n\n## Quick Start\n\nYou can find a sample sheet [here](https://docs.google.com/spreadsheets/d/18Zf_XSU80j_I_VOp9Z4ShdOeUydR6Odyty-ExGBZaz4/edit?usp=sharing) but it's just a simple sheet with one column for keys and columns for languages like this\n\n| Keys                 | English   | French |\n| -------------------- | --------- | ------ |\n| user.firstname_title | Firstname | Prénom |\n| user.lastname_title  | Lastname  | Nom    |\n\n## Integration to your project\n\n- Install sync-wording as dev dependencies ` npm install @betomorrow/sync-wording --save-dev`\n- Create wording config file named `wording_config.json` at project root location.\n\n```json\n{\n  \"sheetId\": \"18Zf_XSU80j_I_VOp9Z4ShdOeUydR6Odyty-ExGBZaz4\",\n  \"output_dir\": \"src/assets/strings/\",\n  \"languages\": {\n    \"en\": {\n      \"column\": \"B\"\n    },\n    \"fr\": {\n      \"column\": \"C\"\n    }\n  }\n}\n```\n\n- Add scripts lines to invoke tools easily with npm in `package.json`\n\n```json\n{\n  \"scripts\": {\n    \"upgrade-wording\": \"sync-wording --upgrade\"\n  }\n}\n```\n\n- Then run `npm run upgrade-wording`\n\nIt will ask you to grant access on Google Sheet\n\n```bash\n\u003e Task :app:downloadWording\nPlease open the following address in your browser:\n  https://accounts.google.com/o/oauth2/v2/auth?access_type=offline\u0026scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.readonly\u0026response_type=code\u0026client_id=1309740887-6u609jvssi5c2e56vd5n5dc4drgsc906.apps.googleusercontent.com\u0026redirect_uri=http%3A%2F%2Flocalhost%3A8181%2Foauth2callback\n\n```\n\n- Open url in your browser\n- Grant access\n\n[Authorization Sample]\n\nIt will update wording files : `${output_dir}/en.json` and `${output_dir}/fr.json`\n\n## Wording validation\n\nIn your google sheet, you can add column indicate that it's a valid translation\n\n| Keys                 | English   | French | Validation |\n| -------------------- | --------- | ------ | ---------- |\n| user.firstname_title | Firstname | Prénom | OK         |\n| user.lastname_title  | Lastname  | Nom    | KO         |\n\nThen update your configuration file like this\n\n```json\n{\n  \"sheetId\": \"18Zf_XSU80j_I_VOp9Z4ShdOeUydR6Odyty-ExGBZaz4\",\n  \"output_dir\": \"src/assets/strings/\",\n  \"validation\": {\n    \"column\": \"D\",\n    \"expected\": \"OK\"\n  },\n  \"languages\": {\n    \"en\": {\n      \"column\": \"B\"\n    },\n    \"fr\": {\n      \"column\": \"C\"\n    }\n  }\n}\n```\n\nNow the tool will warn you when you update wording containing invalid translations\n\n## Options\n\nThis tools support 3 options\n\n- **`--config`** : Configuration path\n- **`--upgrade`** : Export sheet in local xlsx file that you can commit for later edit. It prevent risks to have unwanted wording changes when you fix bugs. And then update wording\n- **`--update`** : Update wording files from local xlsx file\n- **`--invalid`** : (error|warning) exist with error when invalid translations found or just warn\n\n## Complete Configuration\n\n```text\n{\n  \"credentials\": \"credentials.json\",      // Optional, json google api service credentials, default : use embedded credentials\n  \"wording_file\": \"wording.xlsx\",         // Optional, local xlsx wording file path\n\n  \"sheetId\": \"THE SHEET ID\",              // *Required*\n  \"shhetNames\": [\"commons\", \"app\"],       // Optional, default: use all sheets\n  \"sheetStartIndex\": 2,                   // Optional, start row index, default : 2\n  \"keyColumn\": \"A\",                       // Optional, default : \"A\"\n  \"format\" : \"json\",                      // Optional, json output format (json|flat-json|angular-json), default: \"json\"\n  \"ignoreEmptyKeys\" : false               // Optional, whether or not empty keys should be kept, default: false\n  \"validation\" : {                        // Optional, global configuration to validate wording\n    \"column\" : \"E\"\n    \"expected\" : \"OK\"\n  }\n  \"output_dir\": \"src/assets/strings/\",\n  \"languages\": {\n    \"en\": {\n      \"output\": \"src/assets/strings/default.json\",  // Optional, default: \"${output_dir}/${language_name}.json\"\n      \"column\": \"B\",\n      \"validation\" : {                        // Optional, local configuration to validate wording\n        \"column\" : \"E\"\n        \"expected\" : \"OK\"\n      }\n    },\n    \"fr\": {\n      \"output\": \"src/assets/strings/fr.json\",\n      \"column\": \"C\"\n    }\n    // [...] Add more languages here\n  }\n}\n```\n\n## Note\n\nThis tool includes Google Projet credentials for convenience use but you can setup your own projet. Create new project in [GCP Console](https://console.cloud.google.com) then enable **Drive API** in _API library_ and create and download credentials.\n\n## Development\n\nCurrent repository use this Sheet : https://docs.google.com/spreadsheets/d/18Zf_XSU80j_I_VOp9Z4ShdOeUydR6Odyty-ExGBZaz4/edit#gid=0\n\nBuild and install locally\n\n```bash\nnpm run build\nnpm run installPackage\n```\n\nRun\n\n```bash\nrm  .google_*\nsync-wording --upgrade\n```\n\nPublish\n\n```bash\nnpm login\nnpm publish\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbetomorrow%2Fsync-wording","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbetomorrow%2Fsync-wording","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbetomorrow%2Fsync-wording/lists"}