{"id":13547464,"url":"https://github.com/cicirello/user-statistician","last_synced_at":"2025-04-04T13:12:26.772Z","repository":{"id":38079597,"uuid":"382116141","full_name":"cicirello/user-statistician","owner":"cicirello","description":"Generate a GitHub stats SVG for your GitHub Profile README in GitHub Actions","archived":false,"fork":false,"pushed_at":"2025-03-22T02:14:06.000Z","size":1681,"stargazers_count":86,"open_issues_count":7,"forks_count":37,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-28T12:08:55.218Z","etag":null,"topics":["actions","activity","contributions","github","github-actions","github-activity","github-profile","github-profile-readme","github-statistics","github-stats","hacktoberfest","language-distribution","profile","profile-readme","profile-readme-stats","readme","readme-stats","stats","svg","user-statistics"],"latest_commit_sha":null,"homepage":"https://actions.cicirello.org/user-statistician/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cicirello.png","metadata":{"funding":{"github":"cicirello","patreon":null,"open_collective":null,"ko_fi":"cicirello","tidelift":null,"community_bridge":null,"liberapay":"cicirello","issuehunt":null,"otechie":null,"custom":null},"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","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":"2021-07-01T17:58:26.000Z","updated_at":"2025-02-22T23:48:37.000Z","dependencies_parsed_at":"2023-10-15T02:59:58.783Z","dependency_job_id":"19fa102a-d691-454e-b69b-464e7217f687","html_url":"https://github.com/cicirello/user-statistician","commit_stats":{"total_commits":903,"total_committers":34,"mean_commits":"26.558823529411764","dds":"0.11184939091915835","last_synced_commit":"edee8cd5f6a1efa2eff5790f1ff7cd6c3e252e50"},"previous_names":[],"tags_count":42,"template":false,"template_full_name":"cicirello/python-github-action-template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cicirello%2Fuser-statistician","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cicirello%2Fuser-statistician/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cicirello%2Fuser-statistician/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cicirello%2Fuser-statistician/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cicirello","download_url":"https://codeload.github.com/cicirello/user-statistician/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247182401,"owners_count":20897381,"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":["actions","activity","contributions","github","github-actions","github-activity","github-profile","github-profile-readme","github-statistics","github-stats","hacktoberfest","language-distribution","profile","profile-readme","profile-readme-stats","readme","readme-stats","stats","svg","user-statistics"],"created_at":"2024-08-01T12:00:56.350Z","updated_at":"2025-04-04T13:12:26.750Z","avatar_url":"https://github.com/cicirello.png","language":"Python","funding_links":["https://github.com/sponsors/cicirello","https://ko-fi.com/cicirello","https://liberapay.com/cicirello"],"categories":["Tools"],"sub_categories":[],"readme":"# user-statistician\n\n[![user-statistician](https://actions.cicirello.org/images/user-statistician640.png)](#user-statistician)\n\nCheck out all of our GitHub Actions: https://actions.cicirello.org/\n\n## About user-statistician [![Mentioned in Awesome README](https://awesome.re/mentioned-badge.svg)](https://github.com/matiassingers/awesome-readme)\n\n| __GitHub Actions__ | [![GitHub release (latest by date)](https://img.shields.io/github/v/release/cicirello/user-statistician?label=Marketplace\u0026logo=GitHub)](https://github.com/marketplace/actions/user-statistician) [![Count of Action Users](https://badgen.net/github/dependents-repo/cicirello/user-statistician?icon=github\u0026label=used%20by)](https://github.com/cicirello/user-statistician/network/dependents) |\n| :--- | :--- |\n| __Build Status__ | [![build](https://github.com/cicirello/user-statistician/actions/workflows/build.yml/badge.svg)](https://github.com/cicirello/user-statistician/actions/workflows/build.yml) [![samples](https://github.com/cicirello/user-statistician/actions/workflows/generate-samples.yml/badge.svg)](https://github.com/cicirello/user-statistician/actions/workflows/generate-samples.yml) [![CodeQL](https://github.com/cicirello/user-statistician/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/cicirello/user-statistician/actions/workflows/codeql-analysis.yml) |\n| __Source Info__ | [![License](https://img.shields.io/github/license/cicirello/user-statistician)](https://github.com/cicirello/user-statistician/blob/main/LICENSE) [![GitHub top language](https://img.shields.io/github/languages/top/cicirello/user-statistician)](https://github.com/cicirello/user-statistician) |\n| __Contributors__ | [![GitHub contributors](https://img.shields.io/github/contributors/cicirello/user-statistician)](https://github.com/cicirello/user-statistician/graphs/contributors) [![good first issue](https://img.shields.io/github/issues/cicirello/user-statistician/good%20first%20issue)](https://github.com/cicirello/user-statistician/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) |\n| __Support__ | [![GitHub Sponsors](https://img.shields.io/badge/sponsor-30363D?logo=GitHub-Sponsors\u0026logoColor=#EA4AAA)](https://github.com/sponsors/cicirello) [![Liberapay](https://img.shields.io/badge/Liberapay-F6C915?logo=liberapay\u0026logoColor=black)](https://liberapay.com/cicirello) [![Ko-Fi](https://img.shields.io/badge/Ko--fi-F16061?logo=ko-fi\u0026logoColor=white)](https://ko-fi.com/cicirello) |\n\nThe [cicirello/user-statistician](https://github.com/cicirello/user-statistician) GitHub \nAction generates a detailed visual summary of your activity on GitHub in the form of an SVG, \nsuitable to display on\nyour [GitHub Profile README](https://docs.github.com/en/github/setting-up-and-managing-your-github-profile/customizing-your-profile/managing-your-profile-readme). \nAlthough the intended use-case is to generate an SVG image for your GitHub Profile README,\nyou can also potentially link to the image from a personal website, or from anywhere else\nwhere you'd like to share a summary of your activity on GitHub. The SVG that the action \ngenerates includes statistics for the repositories that\nyou own, your contribution statistics (e.g., commits, issues, PRs, etc), as well as\nthe distribution of languages within public repositories that you own. \nThe user stats image can be customized, including the colors such as with one\nof the built-in themes or your own set of custom colors. You can also pick and choose\nwhich sections of the card to include, as well as the order of appearance of \nthe sections; and you can choose to hide individual stats. \n\nThe `user-statistician` action runs entirely here on GitHub.\nTo use it, you just need to set up a workflow in your GitHub\nProfile repository (or technically any repository that you own) on a schedule (daily\nshould be sufficient), and then add a link to the image in your README. The action \nhandles committing and pushing the generated image to the repository. \n\n__Features__: The features of the \n[cicirello/user-statistician](https://github.com/cicirello/user-statistician)\nGitHub Action include the following:\n* Generates detailed stats for your GitHub Profile README all in a single SVG.\n* Ability to generate separate SVGs for the individual categories of stats\n  if you prefer.\n* Highly customizable (color themes, custom colors, section ordering, custom title).\n* [International](#locale) with option to generate SVG in 32 [languages](#locale).\n* Runs entirely here on GitHub.\n* Updates the SVG on a schedule of your choice (e.g., daily), rather than \n  on-demand when someone views your profile, which has the following advantages:\n    * The SVG is simply served when requested, avoiding \n      the delay associated with waiting for API queries to gather the data to generate \n      the SVG. \n    * The API queries associated with generating the SVG happen once per \n      cycle of your configured schedule, regardless of how frequently your \n      profile is visited, decreasing system load.\n\n__Show Your Support__: If you find the `user-statistician` action useful, \nplease consider starring the repository; and if you use it for your profile \nREADME, please consider either linking the image to this repository, or \notherwise sharing how it was generated with your profile visitors. \n\n\n## Table of Contents\n\nThe remainder of the documentation is organized into the following sections:\n* [Quickstart](#quickstart)\n* [Example Workflows and Image Samples](#example-workflows-and-image-samples):\n  This section includes workflows to get you started using the action, as well as\n  sample images.\n* [The Stats](#the-stats): This documents all of the statistics included in the\n  SVGs that the action generates.\n* [Inputs](#inputs): Documentation of all of the inputs to the action, their\n  default values, and the effects they have on the behavior of the action.\n* [Outputs](#outputs): Documentation of outputs of the action.\n* [All Possible Action Inputs](#all-possible-action-inputs): This section provides\n  a workflow that summarizes all of the action's inputs along with their default values.\n* [Built With](#built-with): A list of the tools, etc used to develop this action.\n* [Blog Posts](#blog-posts): A selection of blog posts about the GitHub Action.\n* [Support the Project](#support-the-project): Ways that you can support the project.\n* [Contributors](#contributors): Information for potential contributors.\n  * [Contributing a Translation](#contributing-a-translation): Detailed instructions\n    for contributing a language translation for a new locale, the most common type\n\tof contribution to this project.\n\n## Quickstart \nSee the [Quickstart](https://github.com/cicirello/user-statistician/blob/main/quickstart) directory \nfor ready-to-use workflows and quickstart instructions.\n\n## Example Workflows and Image Samples\n\nThis section provides example workflows demonstrating various features\nof the action, as well as samples of the corresponding images that they generate.\nIf you would like to see live examples, in addition to the detailed examples\nbelow, then you can check out [my GitHub profile](https://github.com/cicirello),\nas well as [my personal website](https://www.cicirello.org/software/#ghstats),\nboth of these are updated nightly. The GitHub stats card on my GitHub\nprofile uses the built-in dark theme, and all other settings are the defaults,\nand is generated by \n[this workflow file](https://github.com/cicirello/cicirello/blob/master/.github/workflows/userstats.yml).\nThe stats card on my personal website uses a set of custom colors to match the\ncolor palette of my website, and is generated by\n[this workflow file](https://github.com/cicirello/status/blob/main/.github/workflows/userstats.yml).\n\nThere are also several ready-to-use workflows and quickstart instructions in\nthe [Quickstart](https://github.com/cicirello/user-statistician/blob/main/quickstart) directory.\n\n### Example 1: All default inputs\n\nThis first example uses all of the default inputs (see [Inputs](#inputs) section\nfor details of available inputs). Specifically, it uses the default color\ntheme (a light theme), and includes all available statistics in the image and\nthe default title. The action commits and pushes the image by default as well.\n\n```yml\nname: user-statistician\n\non:\n  schedule:\n    - cron: '0 3 * * *'\n  workflow_dispatch:\n\njobs:\n  stats:\n    runs-on: ubuntu-latest\n      \n    steps:\n    - uses: actions/checkout@v4\n\n    - name: Generate the user stats image\n      uses: cicirello/user-statistician@v1\n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n```\n\nThis example workflow runs on a schedule (every day at 3am) and also includes\nthe `workflow_dispatch` event so that you can run it manually if desired.\nSee GitHub's documentation for details \non [schedule syntax](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#schedule)\nand [workflow_dispatch](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#workflow_dispatch).\nThe `actions/checkout@v4` step is required because the action generates the stats image\nfor the owner of the checked out repository, and it is also for the commit and push\nfunctionality. Additionally, the `GITHUB_TOKEN` must be passed via an environment\nvariable to `cicirello/user-statistician` (see \nthe `GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}`) in order to be able to query \nGitHub's GraphQL API. The default permissions of the `GITHUB_TOKEN` are sufficient\nfor the API queries as well as (in most cases) for pushing the image to your \nrepository. If you are running this in a repository with branch \nprotection rules that require either reviews or checks, then see the section\nbelow on [Protected branches with required checks](#protected-branches-with-required-checks).\n\nThe default behavior of the language distribution chart is to explicitly\nlist all languages that individually make up at least 1% of the code in your\npublic repositories, with low percentage languages combined into an \"Other\".\nThe language distribution chart is intended to be equivalent to the\nlanguage charts that GitHub generates for each repository, but by combining\nall of the repositories that you own. \n\nAssuming that you use the default image filename and path, then you can\ninsert the image into your README with the following markdown:\n\n```markdown\n![My user statistics](images/userstats.svg)\n```\n\nAlthough not required, it is appreciated if you instead link the image to this repository\nso that others know how you generated it, with the following markdown:\n\n```markdown\n[![My user statistics](images/userstats.svg)](https://github.com/cicirello/user-statistician)\n```\n\nHere is a sample of what this will produce:\n\n[![Default input values uses light theme](https://raw.githubusercontent.com/cicirello/user-statistician/samples/images/light.svg)](https://github.com/cicirello/user-statistician)\n\n### Example 2: Dark theme without title\n\nThis example shows how to change colors to the\ndark theme, as well as disabling the title.\n\n```yml\nname: user-statistician\n\non:\n  schedule:\n    - cron: '0 3 * * *'\n  workflow_dispatch:\n\njobs:\n  stats:\n    runs-on: ubuntu-latest\n      \n    steps:\n    - uses: actions/checkout@v4\n\n    - name: Generate the user stats image\n      uses: cicirello/user-statistician@v1\n      with:\n        colors: dark\n        include-title: false\n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n```\n\nHere is a sample of what this will produce:\n\n[![Dark theme without title](https://raw.githubusercontent.com/cicirello/user-statistician/samples/images/dark.svg)](https://github.com/cicirello/user-statistician)\n\n### Example 3: Dark-dimmed theme with custom title, some hidden stats, an animated language chart, and including all languages in language distribution chart\n\nThis example shows the dark-dimmed theme, uses a custom title, includes all\nlanguages in language distribution chart, and hides\nseveral statistics (joined, mostStarred, mostForked, followers, following, \nand private). Note by hiding joined, mostStarred, mostForked, followers,\nand following that the action will automatically hide the header row for the\n\"General Stats and Info\" section since we've hidden all of the non-zero \nstats from that section. If someone were to sponsor me, or if I was to\nsponsor someone else, then the \"General Stats and Info\" section will show up the next time\ngenerated since this sample didn't hide the sponsors or sponsoring counts.\nIf we want to guarantee that this entire section is hidden, we could instead\nspecify \"general\" among the \"keys\" we pass to `hide-keys`.\n\n```yml\nname: user-statistician\n\non:\n  schedule:\n    - cron: '0 3 * * *'\n  workflow_dispatch:\n\njobs:\n  stats:\n    runs-on: ubuntu-latest\n      \n    steps:\n    - uses: actions/checkout@v4\n\n    - name: Generate the user stats image\n      uses: cicirello/user-statistician@v1\n      with:\n        colors: dark-dimmed\n        custom-title: My GitHub Statistics\n        hide-keys: joined, mostStarred, mostForked, followers, following, private\n        max-languages: 100\n        animated-language-chart: true\n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n```\n\nHere is a sample of what this will produce:\n\n[![Dark-dimmed theme with custom title, animated language chart, and some hidden stats](https://raw.githubusercontent.com/cicirello/user-statistician/samples/images/dark-dimmed.svg)](https://github.com/cicirello/user-statistician)\n\n### Example 4: Multiple SVGs for repository stats, contribution stats, and language distribution\n\nIf you would rather have separate SVGs for each type of GitHub stats (repository \nstats, contribution stats, and language distribution), then you can accomplish this\nby running the action multiple times in a single workflow. This example does this.\nNote that you must use the `image-file` input to give each of the SVGs its own\nfilename in this case, which will likewise change the markdown needed to insert\nthe images into your readme.\n\n```yml\nname: user-statistician\n\non:\n  schedule:\n    - cron: '0 3 * * *'\n  workflow_dispatch:\n\njobs:\n  stats:\n    runs-on: ubuntu-latest\n      \n    steps:\n    - uses: actions/checkout@v4\n\n    - name: Generate the languages distribution\n      uses: cicirello/user-statistician@v1\n      with:\n        image-file: images/languages.svg\n        hide-keys: general, contributions, repositories\n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n\n    - name: Generate the contributions stats\n      uses: cicirello/user-statistician@v1\n      with:\n        image-file: images/contribs.svg\n        hide-keys: general, languages, repositories\n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n\n    - name: Generate the repositories stats\n      uses: cicirello/user-statistician@v1\n      with:\n        image-file: images/repos.svg\n        hide-keys: general, contributions, languages\n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n```\n\n### Specific version vs major release\n\nAll of the above examples used the major release tag\nfor the `user-statistician` step \n(i.e., `uses: cicirello/user-statistician@v1`):\n\n```yml\n    - name: Generate the user stats image\n      uses: cicirello/user-statistician@v1\n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n```\n\nThe advantage to this is that you will automatically\nget all non-breaking changes and bug fixes without the\nneed to alter your workflow. If you prefer to \nuse a specific release, just use the SemVer of the\nrelease that you wish to use, such as with the following:\n\n```yml\n    - name: Generate the user stats image\n      uses: cicirello/user-statistician@v1.22.0\n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n```\n\nIf you do use a specific release, then we recommend\nconfiguring [GitHub's Dependabot](https://github.blog/2020-06-01-keep-all-your-packages-up-to-date-with-dependabot/)\nin your repository.  Dependabot can be used to monitor dependencies,\nincluding GitHub Actions, and generates automated pull requests to update\nversions. The PRs it generates includes the text of release notes and ChangeLogs\ngiving you the opportunity to decide whether to upgrade the version.\n\n### Protected branches with required checks\n\nThe default permissions of the `GITHUB_TOKEN` are sufficient for pushing\nto a protected branch, provided that the branch protection hasn't been\nconfigured with required reviews nor with required checks. If your\nGitHub profile repository does have a branch protection rule with\nrequired reviews or required checks, there are a couple solutions.\n\n__Not Recommended:__ First, you could create a personal access token (PAT) \nwith necessary permissions, save it as a repository secret, and use the PAT\nwith during the `actions/checkout` step \n(see [actions/checkout](https://github.com/actions/checkout)'s documentation). \nHowever, we do not recommend doing so.\nIf anyone else has write access to the repository, then they can potentially\ncreate additional workflows using that PAT. This is probably reasonably safe\nsince it is probably rare to have collaborators on ones profile repository.\nHowever, we still do not recommend this approach, as you must have had a reason\nto put the required checks in place. If you decide to go this route anyway, note\nthat the `user-statistician` action will still only need the `GITHUB_TOKEN` and not\nthe PAT.\n\n__Recommended:__ The second (and recommended) approach to dealing with a \nprotected branch with\nrequired checks is to set up a dedicated branch for generating the stats image.\nThis is actually what we are doing in this repository to generate the samples.\nOur `main` branch is protected with required checks, after all this is a development\nproject repository and not a profile repository. We have a separate branch, `samples`,\nthat is protected, but does not have any required checks. The `GITHUB_TOKEN`\nis sufficient to push to this branch.\n\nHere is how you can do something similar if your profile repository has \nrequired checks on its main branch. First, create a branch, perhaps called `stats`.\nThe special `stats` branch does not need to be kept up to date with `main`. In fact,\nonce you create the `stats` branch, you can delete everything from that branch (e.g.,\nyou'll notice that the `samples` branch of this repository only has an \"images\"\ndirectory). Next, create or modify a workflow in your `main` (or default) branch \nthat checks out the dedicated `stats` branch (see the modified `actions/checkout` \nstep) as follows:\n\n```yml\nname: user-statistician\n\non:\n  schedule:\n    - cron: '0 3 * * *'\n  workflow_dispatch:\n\njobs:\n  stats:\n    runs-on: ubuntu-latest\n      \n    steps:\n    - uses: actions/checkout@v4\n      with:\n        ref: stats   # Or whatever you named your dedicated branch\n\n    - name: Generate the user stats image\n      uses: cicirello/user-statistician@v1\n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n```\n\nSince the image is now in a different branch than your README,\nyou also need to modify the markdown used to insert the\nimage into your profile README to refer explicitly to that branch\nas follows:\n\n```markdown\n![My user statistics](../BRANCHNAME/images/userstats.svg)\n```\n\nThe relative link in the example above is relative to the branch\nof the README that the viewer is viewing, so we can go up one level\nwith `..` and then into the branch where our SVG resides.\n\nA version that links the image to this repository\nso that others know how you generated it is as follows:\n\n```markdown\n[![My user statistics](../BRANCHNAME/images/userstats.svg)](https://github.com/cicirello/user-statistician)\n```\n\n\n## The Stats\n\nThe statistics displayed in the image are organized into categories. The stats\ncard can be customized to hide either individual statistics, or entire categories\nif desired. Details of each category follows. Note that the \"Key\" is what you need if\nyou are using the `hide-keys` input to either hide individual statistics or \nentire categories (see the [Inputs](#inputs) section).\n\n### General Stats and Info\n\nThe key to hide this entire category is: `general`. The statistics include the \nfollowing.\n\n| Key | Statistic | Details |\n| --- | --- | ------ |\n| `joined` | Year Joined | the year user joined GitHub |\n| `featured` | Featured repository | user optionally selects this with an input | \n| `mostStarred` | Most starred repository | name of repo |\n| `mostForked` | Most forked repository | name of repo |\n| `followers` | Followers | simple count |\n| `following` | Following | simple count |\n| `sponsors` | Sponsors | simple count |\n| `sponsoring` | Sponsoring | simple count |\n\n### Repositories\n\nThe Repositories category in the image includes\ntwo columns with data summarizing information\nabout the public non-forks that you own, as well as all public repositories\nthat you own, including forks.\n  \nThe key to hide this entire category is: `repositories`.\nThe statistics include the following.\n\n| Key | Statistic | Details |\n| --- | --- | ------ |\n| `public` | My Repositories | simple count |\n| `starredBy` | Starred By | simple count |\n| `forkedBy` | Forked By  | simple count |\n| `watchedBy` | Watched By | number watching your repositories |\n| `templates` | Templates | number of your repositories that are templates |\n| `archived` | Archived | number of your repositories that you have archived |\n\n### Contributions\n\nThe Contributions category in the image includes\ntwo columns with data summarizing information\nabout your contributions during the past year, as well as\ntotals over all years. The contribution counts are as \nreported by the GitHub GraphQL API. For details of how GitHub \ncounts contributions, see \n[GitHub's documentation](https://docs.github.com/en/github/setting-up-and-managing-your-github-profile/managing-contribution-graphs-on-your-profile/why-are-my-contributions-not-showing-up-on-my-profile).\nThe contribution data included is all public. This is true even\nof the \"Private Contributions\" entry on the stats image, as \nthe \"restrictedContributionsCount\" returned from the query executed by the action \nwill only be non-zero if you have opted in to sharing private contributions via \n[GitHub's profile settings](https://docs.github.com/en/github/setting-up-and-managing-your-github-profile/managing-contribution-graphs-on-your-profile/publicizing-or-hiding-your-private-contributions-on-your-profile). \nYou can also hide the \"Private Contributions\" entry (see the \n[Inputs section](#inputs)) regardless of your GitHub settings, or any of the \nother entries. Each statistic will also auto-hide if the count is 0.\n\nThe key to hide this entire category is: `contributions`.\nThe contributions statistics in the image include the following.\n\n| Key | Statistic | Details |\n| --- | --- | ------ |\n| `commits` | Commits | simple count |\n| `issues` | Issues | simple count |\n| `prs` | Pull Requests | simple count |\n| `reviews` | Pull Request Reviews | simple count |\n| `contribTo` | Contributed To | number of repositories owned by others that you have contributed to |\n| `private` | Private Contributions | number of private contributions if you have shared them via your GitHub settings |\n\nNote that due to limitations in the available data from the GitHub GraphQL API, the\n\"Total\" column for `contribTo` on the generated SVG is deliberately blank.\n\nPlease note that GitHub's \"restrictedContributionsCount\" (which is your private contributions\ncount) doesn't distinguish the type of contributions, so we cannot simply add\nthese to the specific counts by type. \n\n### Language Distribution\n\nThe key to hide the language distribution section of the card is: `languages`.\n\nThe default behavior of the language distribution chart is to explicitly\nlist all languages that individually make up at least 1% of the code in your\npublic repositories, with low percentage languages combined into an \"Other\".\nThe language distribution chart is intended to be equivalent to the\nlanguage charts that GitHub generates for each repository, but by combining\nall of the repositories that you own. The percentages are based on file sizes. \nYou can also configure the number of languages to explicitly list\n(see the [Inputs](#inputs) section).\n\nHere are a few questions that we anticipate you might have:\n\n__Why file sizes?__ Well, that is what GitHub\nuses for the language charts within repositories, and that is the data that GitHub's\nAPI makes available to us.\n\n__Why are some of my languages missing?__ There are a variety of reasons that a \nlanguage might not be represented. GitHub \nuses [Linguist](https://github.com/github/linguist) to detect the language\nof each file in your repositories. There are several reasons that it might\nexclude either individual files from the analysis, or entire languages. \nYou can find the full list \nin [Linguist's documentation](https://github.com/github/linguist/blob/master/docs/how-linguist-works.md).\nAmong Linguist's default exclusions are languages classified as \"data\" and \"prose\",\nas well as generated code, vendored code, and documentation. Some languages\nthat GitHub classifies as \"data\" are XML, JSON, GraphQL, among others.\nMarkdown is among the languages classified as \"prose\". To see how GitHub has\nclassified languages, look at \n[Linguist's languages.yml](https://github.com/github/linguist/blob/master/lib/linguist/languages.yml).\n\n__Can I include languages that Linguist excludes?__ Yes, you can. GitHub's Linguist\nenables you to [configure Linguist on a per-repository basis](https://github.com/github/linguist/blob/master/docs/overrides.md) \nvia a `.gitattributes` file. In fact, we've done this very thing on this repository\nto tell Linguist to include GraphQL (e.g., see our [.gitattributes](https://github.com/cicirello/user-statistician/blob/main/.gitattributes)).\n\n__Can I exclude files or languages that Linguist includes?__ Yes, you can. With this, again\nsee [Linguist's override documentation](https://github.com/github/linguist/blob/master/docs/overrides.md). For example, Linguist\nexcludes documentation by default, but perhaps\nyou have documentation that is not in one of the paths that Linguist normally\ntreats as documentation. You can use your repository's `.gitattributes` file\nto mark files or directories as documentation (likewise for vendored code, generated code,\netc). For an example of this, see the [.gitattributes of one of our other repositories](https://github.com/cicirello/Chips-n-Salsa/blob/master/.gitattributes) where we direct\nLinguist to treat a directory as documentation.\n\n__Can I exclude entire repositories from the language stats?__ Yes, the action has an input for \nthat.  See [Inputs](#inputs) section.\n\n## Inputs\n\nAll inputs include default values, and are thus optional provided the \ndefaults are relevant to your use-case.\n\n### `image-file`\n\nThe `image-file` input is the name of the file (including path relative to the \nroot of the repository) for the user statistics image that is generated\nby the action. It defaults to `image-file: images/userstats.svg`. The action\nwill create any directories that don't already exist, as necessary. The image is\nan svg.\n\n### `include-title`\n\nThe `include-title` controls whether or not the user statistics card \nincludes a title. It defaults to `true`. If you'd rather not have a \ntitle in the image, then just pass `include-title: false` (actually, anything\nother than `true`, case insensitive, will be treated as `false`).\n\n### `custom-title`\n\nIf you include a title in the user statistics image, the default \ntitle is of the form \"Your Name's GitHub Activity\", where \"Your Name\" is the \npublic name of the owner of the repository that is using the action.\nAlthough note that in the case where the API query returns a null name,\nthen the fallback behavior is to use the user id in its place.\n\nYou can customize the title using the `custom-title` input. For example,\n`custom-title: Hello GitHub` will set the title accordingly. Be aware that\nthe image width is fixed, and is not resized based on title length. Note that\nif you pass a custom title with the `custom-title` input and also pass\n`include-title: false`, then the conflicting input values will be resolved in\nfavor of the `include-title: false`.\n\n### `small-title`\n\nThis input controls the font size of the title. The default is `small-title: false`,\nwhich is a font size of 18px (the font size of the rest of the text in the SVG is 14px).\nThe default should be a good choice in most cases. However, depending upon the\nlength of a custom title, or if you use the default title but have a long name, or if\nyour chosen locale leads to a lengthy title, then \nyou might consider using a smaller size for the title. If you pass\n`small-title: true`, then it will decrease the font size of the title to 16px.\n\n### `featured-repository`\n\nIf you want to feature a repository in the General Stats and Info section,\nyou can use this input to do so. For example, although the action includes\nthe Most Starred and Most Forked repositories in that section by default,\nperhaps there is another repository that you are particularly proud of, or\nwhich you feel is a better representative of your overall work. The default is\nnothing featured since it is impossible to predict what you would want here.\nTo use, just pass the name of the repository via this input. Note that the action\ndoesn't attempt to validate whether this repository actually exists.\n\n### `max-languages`\n\nThis input is the maximum number of languages to explicitly include in \nthe language distribution chart. The default is `max-languages: auto`, which\nwill explicitly show all languages that make up at least 1% of the code in your\npublic repositories (excluding forks). All other languages will be combined\ninto an \"Other\". You can also specify the number of languages explicitly. \nFor example, `max-languages: 5` will explicitly include the 5 languages with the\nhighest percentages, and will then combine all other languages into an \"Other\".\nAlthough if your repositories contain 5 or less languages, then \"Other\" will\nnot be listed.  If you want to explicitly include all languages that occur\nin your repositories, then just pass a high integer value, such as with\n`max-languages: 100`.\n\n### `language-repository-exclusions`\n\nThis input is a list of repositories to exclude entirely from the language\ndistribution chart. The default is an empty list. To exclude one or more\ndirectories from the language distribution chart, pass a comma or space\nseparated list of the repository names. The following example will exclude\nrepositories named \"repo1\" and \"repo2\":\n\n```yml\n    - name: Generate the user stats image\n      uses: cicirello/user-statistician@v1\n      with:\n        language-repository-exclusions: repo1, repo2\n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n```\n\nIf you have many repositories to exclude, you might consider specifying the list\nwith a multiline YAML string, such as the following example (the `\u003e` is one of \nYAML's ways to specify a multiline string):\n\n```yml\n    - name: Generate the user stats image\n      uses: cicirello/user-statistician@v1\n      with:\n        language-repository-exclusions: \u003e\n          repo1\n          repo2\n          repo3\n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n```\n\n### `animated-language-chart`\n\nThis input can be used to enable animation of the languages pie chart.\nThis feature is disabled by default. You can enable it with: `animated-language-chart: true`.\nIf enabled, the pie chart will rotate continuously.\n\n### `language-animation-speed`\n\nIf you enable the language chart animation using the `animated-language-chart` input,\nthen you can control the speed of the animation with the `language-animation-speed`\ninput.  The default is a full rotation in 10 seconds.  Perhaps you want\na slower rotation, such as 20 seconds, then you can pass: `language-animation-speed: 20`.\nOr perhaps you want a faster rotation, such as 5 seconds,\nthen you can pass: `language-animation-speed: 5`.  The input must be an integer.\n\n### `top-icon`\n\nThis input control whether an icon is displayed in the top left and top right corners\nsurrounding the title. It also controls which icon is displayed. First, if you\ndisable the title altogether with `include-title: false` (see earlier), that also\ndisables the icon, regardless of how you set `top-icon`. The options for this input\ninclude `default`, `none`, or one of the named icons in the following table. The\ndefault is `top-icon: default` (explained in table below).\n\n| `top-icon` | meaning |\n| --- | --- |\n| `default` | Use theme-defined icon (see `colors` docs below) or GitHub Octocat if custom colors are used |\n| `none` | Disables the icon altogether |\n| `bat` | A bat, such as for use around Halloween |\n| `github` | The GitHub Octocat, from [Octicons](https://primer.style/octicons/) |\n| `pumpkin` | A pumpkin, such as for use around Halloween |\n\nSetting `top-icon` to a named icon from the list above overrides whatever icon is\nspecified as the default by your chosen theme (see below).\n\n### `colors`\n\nThe `colors` input enables you to either select from a set of\nbuilt-in color themes, or to define your own set of custom colors.\nAt the present time, there are nine built-in themes that are based \non GitHub's color palette and themes of the same names. If you want to \nknow the specific colors used in each of these,\nsee the source in [src/Colors.py](https://github.com/cicirello/user-statistician/blob/main/src/Colors.py). Also see \nthe [Example Workflows and Image Samples](#example-workflows-and-image-samples)\nsection of this readme for a few samples.\n\nThe default is `colors: light`. You can change to a different color theme\nby just passing its name (e.g., `colors: dark`). Here is a list of the \ncurrently supported built-in themes, along with the default icon (see the documentation of `top-icon` above):\n\n| Theme Name | Default `top-icon` | Dark or Light? |\n| --- | --- | --- |\n| `batty` | `bat` | light |\n| `dark` | `github` | dark |\n| `dark-colorblind` | `github` | dark |\n| `dark-dimmed` | `github` | dark |\n| `dark-high-contrast` | `github` | dark |\n| `dark-tritanopia` | `github` | dark |\n| `halloween` | `pumpkin` | dark |\n| `halloween-light` | `pumpkin` | light |\n| `light` | `github` | light |\n| `light-colorblind` | `github` | light |\n| `light-high-contrast` | `github` | light |\n| `light-tritanopia` | `github` | light |\n\nNote that at the present time a couple of these are identical. For example,\n`light`, `light-colorblind`, and `light-tritanopia` are currently identical \nbecause the part of GitHub's color palettes from which these themes derive\ndo not differ. They have been included as valid values for the `colors` input\nto the action for consistency.\n\nIf you have a specific set of colors that you'd like to instead use, you\ncan pass a list of colors (space or comma separated). The list should include\nat least 4 colors in the following order: background color, border color, \nicon color, title color, and (optionally) text color. If only 4 colors are specified,\nthen all text will use the title color. If you pass more than 5 colors, the extras\nare ignored. If you pass less than 4 colors, then the default `light` theme will\nbe used.  Here is an example: `colors: '#f6f8fa #c8e1ff #0366d6 #24292e #24292e'`.\nThis example happens to be the `light` theme. Because `#` has special meaning to \nYAML (it is used for comments), you must either put quotes around the input value \nas shown in this example, or you can escape each `#` individually. The colors in this \nlist can be specified either with hex (as in the example above), or with any \nnamed colors that are recognized by SVG, or some combination of the two. Here is an \nexample with named colors: `colors: black yellow green white white`. Notice that you \ndon't need quotes around the input if none of the colors are specified by hex.\n\n__The action does not do any validation of the colors that you pass.__ If you pass\ninvalid color names or invalid hex color values, then the image generated will be\nincorrect. The color values that you specify are inserted verbatim into the appropriate\nplaces within the SVG.\n\n### `border-radius`\n\nThis input is the radius of the border of the SVG. The default is `border-radius: 6`.\n\n### `show-border`\n\nThis input controls whether or not the SVG has a border. The default is `true`.\n\n### `image-width`\n\nThis input is used to set the minimum width of the SVG. The action\nwill auto-adjust the width as necessary based on the length of the\ntitle, the length of the section headings, and names of languages in\nthe language distribution chart. This includes factoring in the specific\nheadings, labels, etc associated with the chosen locale. The \ndefault, `image-width: 0`, directs the action to strictly base the width \nof the SVG on its content. You only need to use this input if you desire\nto set a fixed width that is larger.\n\n### `hide-keys`\n\nThe action automatically hides any statistics with a value of 0. For example,\nif you have no pull requests, the action automatically will hide the pull requests\nentry from the image rather than listing it as 0. Otherwise, all supported statistics\nare shown by default. If you wish to hide any regardless of whether it has a value of 0, \nthen just pass a list of the \"keys\" corresponding to those you want to hide. \nThe list can be either space or comma separated.\nIf you want to hide an entire group, including the relevant column headings, then you\ncan pass the \"key\" for the category itself. Alternatively, if you\nlist all of the keys for the elements\nof that group, then the entire group, including column headings, will be hidden. \nFor example, `hide-keys: followers following sponsors sponsoring private` will hide\nthe \"Followers\", \"Following\", \"Sponsors\", and \"Sponsoring\" counts from \nthe \"General Stats and Info\" section, and thus will also eliminate the column \nheadings for that entire section, and this will\nalso hide the \"Private Contributions\" item from the \"Contributions\" section.\nAnother way of accomplishing the same thing is to use the \"key\" for the category\nsuch as: `hide-keys: general private`. \n\nSee earlier in the section [The Stats](#the-stats) for the keys needed for this input.\nThe keys are case sensitive.\n\n### `category-order`\n\nThis input enables customizing the order of the stats categories on the card.\nThe categories are indicated by their keys, just like in the `hide-keys` input.\nThe default is: `category-order: general, repositories, contributions, languages`.\nYou can change the order by passing the list in a different order. For example,\nperhaps you want the language chart right after the repositories stats section.\nYou can do that with: `category-order: general, repositories, languages, contributions`.\nThis input provides another way of controlling which sections appear on the\ncard. For example, if all you want are the repositories stats and the languages \nchart, you can do that \nwith: `category-order: repositories, languages` without using the `hide-keys` \ninput. These two inputs also work in combination. If you use `hide-keys`\nto hide a category that you include in the `category-order` input, that category\nwill be hidden despite being in the `category-order`.\n\n### `locale`\n\nThis input is an ISO 639-1 (two character) or ISO 639-2 (three character) language code for the\nlanguage used in names of statistics, section and column headings, and default title on the user \nstats card. The default is `locale: en`, which is English. If an unsupported locale is passed, then the \naction will use the default of \"en\". The following locales are currently supported:\n\n| locale code | language |\n| :--- | :--- |\n| hy | Armenian |\n| id | Bahasa Indonesia |\n| bn | Bengali |\n| cs | Czech |\n| nl | Dutch |\n| en | English |\n| fi | Finnish |\n| fr | French |\n| de | German |\n| el | Greek |\n| hi | Hindi |\n| hu | Hungarian |\n| it | Italian |\n| ja | Japanese |\n| ko | Korean |\n| lt | Lithuanian |\n| ml | Malayalam |\n| no | Norwegian |\n| or | Odia |\n| fa | Persian |\n| pl | Polish |\n| pt | Portuguese |\n| ro | Romanian | \n| ru | Russian |\n| sat | Santali |\n| sr | Serbian |\n| es | Spanish |\n| sv | Swedish |\n| tl | Tagalog |\n| th | Thai |\n| tr | Turkish |\n| uk | Ukrainian |\n\nIf you are interested in contributing a new locale, see the \nsection [Contributing a Translation](#contributing-a-translation) \nfor detailed instructions for doing so.\n\n### `fail-on-error`\n\nThis input enables you to control what happens if the\naction fails for some reason (e.g., error communicating\nwith the GitHub GraphQL API, etc). Note that in all of\nour testing so far, this has not happened yet. But as software\ndevelopers, we all know that anything that can go wrong, will\ngo wrong eventually.\n\nThe default is `fail-on-error: true`, which means that if\nan error occurs it will cause the workflow to fail. The rationale\nfor this default is that the failed workflow will lead to a\nGitHub notification so that you know something went wrong.\nIf you'd rather just let it quietly fail, to most likely correct\nitself during the next run, then pass `fail-on-error: false`\n(actually anything other than `true` will be treated as `false`).\n\n### `commit-and-push`\n\nThe `commit-and-push` input controls whether the action commits\nand pushes the generated image upon creation. It defaults to\n`commit-and-push: true`. If the user stats image has changed since\nlast commit, then as long as you are not running this in a detached\nhead state (such as on a pull request event), the action will commit\nand push the new user stats image. If you are in a detached head\nstate, such as if you were to run this during a pull request \n(not sure why you would), then the action will simply and quietly\nskip the commit/push without issuing an error. \n\nIf your branch is protected with either required reviews or required\nchecks, then the push will fail with an error. Whether this also\nfails your workflow depends on how you have set \nthe `fail-on-error` input. See the earlier discussion for what you \ncan do if you wish to use the action in a repository with\nthat has configured required reviews or required checks:\n[Protected branches with required checks](#protected-branches-with-required-checks).\n\nThe author of the commit is set to the github-actions bot.\n\n### `commit-message`\n\nThe `commit-message` input enables customizing the commit message. The\ndefault is `commit-message: 'Automated change by https://github.com/cicirello/user-statistician'`.\n\n## Outputs\n\nThe action has only the following action output variable.\n\n### `exit-code`\n\nIf the input `fail-on-error` is set to `false`, then in addition to\nquietly failing (i.e., not failing the workflow run), the output `exit-code`\nwill be set to a non-zero exit code that may be useful in debugging the\nissue. If the input `fail-on-error` is set to `true` (the default), your\nworkflow run won't have the opportunity to check the `exit-code` output.\nHowever, the `exit-code` and a descriptive error message will still be\nlogged in the workflow output. In either case, if you believe that the\nfailure is a bug, please include this in any bug reports.\n\n\n## All Possible Action Inputs\n\nThe workflow here shows all possible inputs, with their default\nvalues, and also shows how to access the action's `exit-code`\noutput if desired.\n\n```yml\nname: user-statistician\n\non:\n  schedule:\n    - cron: '0 3 * * *'\n  workflow_dispatch:\n\njobs:\n  stats:\n    runs-on: ubuntu-latest\n      \n    steps:\n    - uses: actions/checkout@v4\n\n    - name: Generate the user stats image\n      id: statsStep # Only needed if you want to check the exit-code\n      uses: cicirello/user-statistician@v1\n      with:\n        image-file: images/userstats.svg\n        include-title: true\n        custom-title: '' # Defaults to title pattern described earlier\n        small-title: false\n        featured-repository: '' # Defaults to nothing featured\n        max-languages: auto\n        language-repository-exclusions: '' # None excluded\n        animated-language-chart: false\n        language-animation-speed: 10\n        top-icon: default\n        colors: light\n        border-radius: 6\n        show-border: true\n        image-width: 0\n        hide-keys: '' # None hidden\n        category-order: general, repositories, contributions, languages\n        locale: en\n        fail-on-error: true\n        commit-and-push: true\n        commit-message: 'Automated change by https://github.com/cicirello/user-statistician'\n      env:\n        GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}\n\n    - name: Check exit code if desired\n      run: |\n        # Note that if you set fail-on-error to true, you'll\n        # never actually get here if an error occurs. But if you\n        # set fail-on-error to false, then instead of failing the\n        # workflow, the action will output the exit code that would\n        # have failed the workflow and you can check it here.\n        echo \"exitCode = ${{ steps.statsStep.outputs.exit-code }}\"\n```\n\n## Built With\n\nThe `user-statistician` action uses the following:\n* Python (implemented almost entirely in Python);\n* The [cicirello/pyaction](https://actions.cicirello.org/pyaction/) Docker container image, \n  which includes the GitHub CLI installed on a python:3-slim base image (see\n  [pyaction's GitHub repository](https://github.com/cicirello/pyaction));\n* [The GitHub CLI](https://cli.github.com/);\n* [GitHub GraphQL API](https://docs.github.com/en/graphql);\n* [GitHub Octicons](https://github.com/primer/octicons) for the icons in the stats image; \n* [JSON](https://www.json.org/) for managing the various language translations; and\n* We started with our template repository for GitHub Actions implemented in \n  Python: [cicirello/python-github-action-template](https://github.com/cicirello/python-github-action-template).\n\n## Blog Posts\n\nHere is a selection of [DEV.to](https://dev.to/) blog posts about the user-statistician:\n* [Hacktoberfest 2023 Contributors Wanted: Additional Translations for the user-statistician GitHub Action](https://dev.to/cicirello/hacktoberfest-2023-contributors-wanted-additional-translations-for-the-user-statistician-github-action-3bb5), posted on DEV on September 30, 2023.\n* [Hacktoberfest Progress Update: Translation Contributions Still Welcome](https://dev.to/cicirello/hacktoberfest-progress-update-translation-contributions-still-welcome-4aof), posted on DEV on October 12, 2022.\n* [Hacktoberfest Language Translation Contributors Wanted for the user-statistician GitHub Action](https://dev.to/cicirello/hacktoberfest-language-translation-contributors-wanted-for-the-user-statistician-github-action-2elg), posted on DEV on September 30, 2022.\n* [Halloween Themes for the user-statistician GitHub Action](https://dev.to/cicirello/halloween-themes-for-the-user-statistician-github-action-4do6), posted on DEV on September 28, 2022.\n* [Configuring GitHub's Linguist to Improve Repository Language Reporting](https://dev.to/cicirello/configuring-githubs-linguist-to-improve-repository-language-reporting-295b), posted on DEV on August 31, 2022.\n* [The user-statistician GitHub Action mentioned in Awesome-README](https://dev.to/cicirello/the-user-statistician-github-action-mentioned-in-awesome-readme-5g3o), posted on DEV on August 25, 2022.\n* [Progress and Lessons Learned Internationalizing the user-statistician GitHub Action](https://dev.to/cicirello/progress-and-lessons-learned-internationalizing-the-user-statistician-github-action-2he9), posted on DEV on October 13, 2021.\n* [Hacktoberfest Participants Help Us Internationalize the user-statistician GitHub Action](https://dev.to/cicirello/hacktoberfest-participants-help-us-internationalize-the-user-statistician-github-action-2bga), posted on DEV on September 29, 2021.\n* [Generate a GitHub stats SVG for your GitHub Profile README in GitHub Actions](https://dev.to/cicirello/generate-a-github-stats-svg-for-your-github-profile-readme-in-github-actions-1iaj), posted on DEV on July 29, 2021.\n\n## Support the Project\n\nYou can support the project in a number of ways:\n* __Starring__: If you find the `user-statistician` action useful, consider starring the\n  repository.\n* __Linking or Sharing__: If you use it to generate an SVG for your \n  GitHub Profile README, consider\n  either linking the image back to this repository, or otherwise sharing\n  how you generated the stats SVG.\n* __Reporting Issues__: If you find a bug or have a suggestion for a new feature, \n  please report it via the [Issue tracker](https://github.com/cicirello/user-statistician/issues).\n* __Contributing Code__: If there is an open issue that you think you can help with, \n  submit a pull request.\n* __Sponsoring__: You can also consider \n  [becoming a sponsor](https://github.com/sponsors/cicirello).\n\n## Contributors\n\nIf you would like to contribute to the project, please start by reading\nour [Contributing Guidelines](https://github.com/cicirello/.github/blob/main/CONTRIBUTING.md)\nand our [Code of Conduct](https://github.com/cicirello/.github/blob/main/CODE_OF_CONDUCT.md). \nAfter reading the contributing guidelines and code of conduct, fork the repository, create\na feature branch in your fork, make your changes, and submit a pull request. Please note that\nevery pull request must be associated with an issue that it addresses. If there is a change \nthat you would like to propose that doesn't already have an issue, please submit an issue \nfirst.\n\n### Contributing a Translation\n\nThe most common type of contribution to this project has been language translations. Here is\nstep-by-step guidance on how to contribute a translation.\n* Is there an [open issue](https://github.com/cicirello/user-statistician/issues?q=is%3Aopen) \n  for the language you want to contribute? If so, and if nobody is assigned to it, comment on\n  the issue expressing interest, and I will assign you to it (e.g., so we don't have multiple\n  people working on the same thing). If there isn't an open issue for it, then submit an issue\n  for a feature request for the language. Then comment on your new issue indicating if you are\n  interested in contributing the translation (e.g., so I know the difference between just a \n  request for a language vs a request with offer to contribute it). I'll then assign you to it.\n* Fork the repository, and create a branch in your fork for your proposed translation.\n* Find the [ISO 639-1 two-character language \n  code](https://www.loc.gov/standards/iso639-2/php/English_list.php) for the language. Some \n  languages have both a two-character code and a three-character code in the table at that link.\n  In those cases, we are going with the two-character code. But there are some languages that\n  only have a three-character ISO-639-2 code, and in those cases we'll use the three-character\n  code. For example, one of the currently supported languages is Santali, whose code is `sat`.\n* In the [src/StatConfig.py](src/StatConfig.py) file, look for the set `supportedLocales` and \n  add a string for the locale code alphabetically.\n* Next, within the directory [src/locales](src/locales), create a JSON file named with the locale\n  code (in all lowercase) and file extension `.json`. For example, the English version is in\n  `en.json`. You might consider starting with a copy of the file for a different language that \n  you also know, and then editing the various strings.\n* Don't change any of the key fields, since those are used internally.\n* Translate the `\"titleTemplate\"`, the first mapping you see in each of the JSON files. The `{0}`\n  that you see in a title template string is a placeholder for where the user's name will go. The\n  `\"titleTemplate\"` is required to have that someplace, or else the test cases will fail.\n* Translate the `\"categoryLabels\"`, which are the headings of each of the sections of the SVG, as \n  well as the column headings within those sections. The categories that don't have columns should \n  just have `null` for the column headings as you will see in any of the existing JSON files.\n* Translate the `\"statLabels\"`, which are the labels for each individual statistic on the SVG.\n* Run the unit tests locally. The test cases will verify that there are strings associated with\n  all required keys for all locale codes, although they obviously won't verify that the translations\n  are correct. To run the unit tests locally, from the root of the repository, \n  execute: `python -B -m unittest tests/tests.py`.  Note that for the tests to include your locale,\n  as well as for the Action itself to include your locale, the code for it must be in the \n  `supportedLocales` set within [src/StatConfig.py](src/StatConfig.py). See the earlier step on this.\n* Despite what the pull request template indicates, you do not need to update the README to document\n  the new locale code. We'll do that later at the time a new release is made that includes your new\n  locale. The reason not to document it at the time of your PR is that all changes to the README from \n  the default branch go live immediately on GitHub's Marketplace, which may confuse users into \n  believing the new locale is available before it actually is.\n\n## License\n\nThis GitHub action is licensed under the [MIT License](https://github.com/cicirello/user-statistician/blob/main/LICENSE). If you contribute\nto the project, you agree that your contributions are likewise licensed through\nthe MIT License. \n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcicirello%2Fuser-statistician","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcicirello%2Fuser-statistician","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcicirello%2Fuser-statistician/lists"}