mirror of
https://github.com/google/comprehensive-rust.git
synced 2024-12-15 14:27:50 +02:00
6a30bbe54a
Bumps [actions/labeler](https://github.com/actions/labeler) from 4 to 5. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/labeler/releases">actions/labeler's releases</a>.</em></p> <blockquote> <h2>v5.0.0</h2> <h2>What's Changed</h2> <p>This release contains the following breaking changes:</p> <ol> <li> <p>The ability to apply labels based on the names of base and/or head branches was added (<a href="https://redirect.github.com/actions/labeler/issues/186">#186</a> and <a href="https://redirect.github.com/actions/labeler/issues/54">#54</a>). The match object for changed files was expanded with new combinations in order to make it more intuitive and flexible (<a href="https://redirect.github.com/actions/labeler/issues/423">#423</a> and <a href="https://redirect.github.com/actions/labeler/issues/101">#101</a>). As a result, the configuration file structure was significantly redesigned and is not compatible with the structure of the previous version. Please read the <a href="https://github.com/actions/labeler/tree/main#pull-request-labeler">action documentation</a> to find out how to adapt your configuration files for use with the new action version.</p> </li> <li> <p>The bug related to the <code>sync-labels</code> input was fixed (<a href="https://redirect.github.com/actions/labeler/issues/112">#112</a>). Now the input value is read correctly.</p> </li> <li> <p>By default, <code>dot</code> input is set to <code>true</code>. Now, paths starting with a dot (e.g. <code>.github</code>) are matched by default.</p> </li> <li> <p>Version 5 of this action updated the <a href="https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#runs-for-javascript-actions">runtime to Node.js 20</a>. All scripts are now run with Node.js 20 instead of Node.js 16 and are affected by any breaking changes between Node.js 16 and 20.</p> </li> </ol> <p>For more information, please read the <a href="https://github.com/actions/labeler/tree/main#pull-request-labeler">action documentation</a>.</p> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/joshdales"><code>@joshdales</code></a> made their first contribution in <a href="https://redirect.github.com/actions/labeler/pull/203">actions/labeler#203</a></li> <li><a href="https://github.com/dusan-trickovic"><code>@dusan-trickovic</code></a> made their first contribution in <a href="https://redirect.github.com/actions/labeler/pull/626">actions/labeler#626</a></li> <li><a href="https://github.com/sungh0lim"><code>@sungh0lim</code></a> made their first contribution in <a href="https://redirect.github.com/actions/labeler/pull/630">actions/labeler#630</a></li> <li><a href="https://github.com/TrianguloY"><code>@TrianguloY</code></a> made their first contribution in <a href="https://redirect.github.com/actions/labeler/pull/629">actions/labeler#629</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/labeler/compare/v4...v5.0.0">https://github.com/actions/labeler/compare/v4...v5.0.0</a></p> <h2>v5.0.0-beta.1</h2> <h2>What's Changed</h2> <p>In scope of this beta release, the structure of the configuration file (<code>.github/labeler.yml</code>) was changed from</p> <pre lang="yml"><code>LabelName: - any: - changed-files: ['list', 'of', 'globs'] - base-branch: ['list', 'of', 'regexps'] - head-branch: ['list', 'of', 'regexps'] - all: - changed-files: ['list', 'of', 'globs'] - base-branch: ['list', 'of', 'regexps'] - head-branch: ['list', 'of', 'regexps'] </code></pre> <p>to</p> <pre lang="yml"><code>LabelName: - any: - changed-files: - AnyGlobToAnyFile: ['list', 'of', 'globs'] - AnyGlobToAllFiles: ['list', 'of', 'globs'] - AllGlobsToAnyFile: ['list', 'of', 'globs'] - AllGlobsToAllFiles: ['list', 'of', 'globs'] - base-branch: ['list', 'of', 'regexps'] - head-branch: ['list', 'of', 'regexps'] - all: - changed-files: - AnyGlobToAnyFile: ['list', 'of', 'globs'] - AnyGlobToAllFiles: ['list', 'of', 'globs'] - AllGlobsToAnyFile: ['list', 'of', 'globs'] </tr></table> </code></pre> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="8558fd7429
"><code>8558fd7</code></a> Merge pull request <a href="https://redirect.github.com/actions/labeler/issues/709">#709</a> from actions/v5.0.0-beta</li> <li><a href="000ca75fe6
"><code>000ca75</code></a> Merge pull request <a href="https://redirect.github.com/actions/labeler/issues/700">#700</a> from MaksimZhukov/apply-suggestions-and-update-docume...</li> <li><a href="cb66c2f078
"><code>cb66c2f</code></a> Update dist</li> <li><a href="9181355e36
"><code>9181355</code></a> Apply suggestions for the beta vesrion and update the documentation</li> <li><a href="efe4c1c90e
"><code>efe4c1c</code></a> Merge pull request <a href="https://redirect.github.com/actions/labeler/issues/699">#699</a> from MaksimZhukov/update-node-runtime-and-dependencies</li> <li><a href="c0957ad7c3
"><code>c0957ad</code></a> Run Prettier</li> <li><a href="8dc8d1842f
"><code>8dc8d18</code></a> Update Node.js version in reusable workflows</li> <li><a href="d0d0bbebfb
"><code>d0d0bbe</code></a> Update documentation</li> <li><a href="1375c42512
"><code>1375c42</code></a> 5.0.0</li> <li><a href="ab7411ec21
"><code>ab7411e</code></a> Change version of Node.js runtime to node20</li> <li>Additional commits viewable in <a href="https://github.com/actions/labeler/compare/v4...v5">compare view</a></li> </ul> </details> <br /> [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/labeler&package-manager=github_actions&previous-version=4&new-version=5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Martin Geisler <martin@geisler.net>
217 lines
8.4 KiB
Markdown
217 lines
8.4 KiB
Markdown
# Translations of Comprehensive Rust 🦀
|
|
|
|
We would love to have your help with translating the course into other
|
|
languages! Please see the [translations page] for the existing translations..
|
|
|
|
[translations page]: https://google.github.io/comprehensive-rust/running-the-course/translations.html
|
|
|
|
We use the [Gettext] system for translations. This means that you don't modify
|
|
the Markdown files directly: instead you modify `.po` files in a `po/`
|
|
directory. The `.po` files are small text-based translation databases.
|
|
|
|
> **Tip:** You should not edit the `.po` files by hand. Instead use a PO editor,
|
|
> such as [Poedit](https://poedit.net/). There are also several online editors
|
|
> available. This will ensure that the file is encoded correctly.
|
|
|
|
> **Important:** You need to run `dprint fmt` after editing the PO file. This
|
|
> ensures consistent formatting of the file. You need to install the Gettext
|
|
> tools for this, see the Preparation section below.
|
|
|
|
There is a `.po` file for each language. They are named after the [ISO 639]
|
|
language codes: Danish would go into `po/da.po`, Korean would go into
|
|
`po/ko.po`, etc. The `.po` files contain all the English text plus the
|
|
translations. They are initialized from a `messages.pot` file (a PO template)
|
|
which contains only the English text.
|
|
|
|
We will show how to update and manipulate the `.po` and `.pot` files using the
|
|
GNU Gettext utilities below.
|
|
|
|
[Gettext]: https://www.gnu.org/software/gettext/manual/html_node/index.html
|
|
[ISO 639]: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
|
|
|
|
## Preparation
|
|
|
|
Please make sure you can [build the course](README.md#building). You will also
|
|
need the `msgmerge` and `msgcat` Gettext tool installed. Please see our
|
|
[contribution guide](CONTRIBUTING.md#formatting) for details.
|
|
|
|
## Creating and Updating Translations
|
|
|
|
First, you need to know how to update the `.pot` and `.po` files.
|
|
|
|
You should never touch the auto-generated `po/messages.pot` file. You should
|
|
also not never the `msgid` entries in a `po/xx.po` file. If you find mistakes,
|
|
you need to update the original English text instead. The fixes to the English
|
|
text will flow into the `.po` files the next time the translators update them.
|
|
|
|
> **Tip:** See our [style guide](STYLE.md) for some things to keep in mind when
|
|
> writing the translation.
|
|
|
|
### Generating the PO Template
|
|
|
|
To extract the original English text and generate a `messages.pot` file, you run
|
|
`mdbook` with a special renderer:
|
|
|
|
```shell
|
|
MDBOOK_OUTPUT='{"xgettext": {"pot-file": "messages.pot"}}' \
|
|
mdbook build -d po
|
|
```
|
|
|
|
You will find the generated POT file as `po/messages.pot`.
|
|
|
|
### Initialize a New Translation
|
|
|
|
To start a new translation, first generate the `po/messages.pot` file. Then use
|
|
`msginit` to create a `xx.po` file for the fictional `xx` language:
|
|
|
|
```shell
|
|
msginit -i po/messages.pot -l xx -o po/xx.po
|
|
```
|
|
|
|
You can also simply copy `po/messages.pot` to `po/xx.po`. Then update the file
|
|
header (the first entry with `msgid ""`) to the correct language.
|
|
|
|
> **Tip:** You can use the
|
|
> [`cloud-translate`](https://github.com/mgeisler/cloud-translate) tool to
|
|
> quickly machine-translate a new translation. Install it with
|
|
>
|
|
> ```shell
|
|
> cargo install cloud-translate
|
|
> ```
|
|
>
|
|
> Untranslated entries will be sent through GCP Cloud Translate. Some of the
|
|
> translations will be wrong after this, so you must inspect them by hand
|
|
> afterwards.
|
|
|
|
Next, please update the file `.github/labeler.yml` to include the new language:
|
|
|
|
```diff
|
|
+"translation/xx":
|
|
+ - changed-files:
|
|
+ - any-glob-to-any-file: po/xx.po
|
|
```
|
|
|
|
### Refreshing an Existing Translation
|
|
|
|
As the English text changes, translations gradually become outdated. The
|
|
translations contain a POT-Creation-Date header which tells you when they were
|
|
last updated with new English messages.
|
|
|
|
To update the `po/xx.po` file with new messages, first extract the English text
|
|
into a `po/messages.pot` template file. Then run
|
|
|
|
```shell
|
|
msgmerge --update po/xx.po po/messages.pot
|
|
```
|
|
|
|
Notice that the POT-Creation-Date field is updated to the current time and date.
|
|
This becomes the new baseline for the translation: new English text added
|
|
afterwards will not show up in your translation, including completely new pages.
|
|
|
|
When running `msgmerge`, unchanged messages stay intact, deleted messages are
|
|
marked as old, and updated messages are marked "fuzzy". A fuzzy entry is not
|
|
used when we publish a translation! You have to go over the fuzzy entries by
|
|
hand and verify that the translation is correct the fuzzy marker.
|
|
|
|
> **Note:** Your PRs should either be the result of running `msgmerge` or the
|
|
> result of new translation work on the PO file for your language. Avoid mixing
|
|
> the two since it often creates a very large diff, which is hard or impossible
|
|
> to review.
|
|
|
|
### Editing a Translation
|
|
|
|
You should install a PO editor to edit the `.po` file for your language. The
|
|
files are simple text files, but it helps to use a dedicated editor since it
|
|
will take care of escaping things like `"` correctly.
|
|
|
|
There are many PO editors available. [Poedit](https://poedit.net/) is a popular
|
|
cross-platform choice, but you can also find several online editors.
|
|
|
|
### Formatting a Translation
|
|
|
|
If the file is not formatted correct, you will get an error on the PR. Make sure
|
|
to follow the [steps](#preparation) to install [Gettext] and
|
|
[`dprint`](https://dprint.dev/) and then run:
|
|
|
|
```shell
|
|
dprint fmt po/xx.po
|
|
```
|
|
|
|
This will automatically format the `.po` file for you. Commit the formatting fix
|
|
and push to your branch. Your PR should now be error free.
|
|
|
|
## Using Translations
|
|
|
|
This will show you how to use the translations to generate localized HTML
|
|
output.
|
|
|
|
> **Note:** `mdbook` will use original untranslated entries for all entries
|
|
> marked as "fuzzy" (visible as "Needs work" in Poedit). This is especially
|
|
> important when using
|
|
> [`cloud-translate`](https://github.com/mgeisler/cloud-translate) for initial
|
|
> translation as all entries will be marked as "fuzzy".
|
|
|
|
### Building a Translation
|
|
|
|
Make sure you have gone through the [build setup](./README.md#building) at least
|
|
once.
|
|
|
|
To use the `po/xx.po` file for your output, run the following command:
|
|
|
|
```shell
|
|
MDBOOK_BOOK__LANGUAGE=xx mdbook build -d book/xx
|
|
```
|
|
|
|
This will update the book's language to `xx`, it will make the `mdbook-gettext`
|
|
preprocessor become active and tell it to use the `po/xx.po` file, and finally
|
|
it will redirect the output to `book/xx`.
|
|
|
|
### Serving a Translation
|
|
|
|
Like normal, you can use `mdbook serve` to view your translation as you work on
|
|
it. You use the same command as with `mdbook build` above:
|
|
|
|
```shell
|
|
MDBOOK_BOOK__LANGUAGE=xx mdbook serve -d book/xx
|
|
```
|
|
|
|
When you update the `po/xx.po` file, the translated book will automatically
|
|
reload.
|
|
|
|
## Reviewing Translations
|
|
|
|
When a new translation is started, we look for people who can help review it.
|
|
These reviewers are often Googlers, but they don't have to be. To automatically
|
|
get an email when new PRs are created for your language, please add yourself to
|
|
the [CODEOWNERS] file.
|
|
|
|
When reviewing a translation, please keep in mind that translations are a labour
|
|
of love. Someone spends their free time translating the course because they want
|
|
to bring Rust to users who speak their language.
|
|
|
|
Nothing is published right away after a PR lands for a new in-progress language.
|
|
It is therefore safe to merge the PR as long as the translation is reasonable.
|
|
This is often better than leaving 50+ comments since this can be overwhelming
|
|
for the contributor. Instead, please work with the contributor to improve things
|
|
in follow-up PRs.
|
|
|
|
### GitHub Suggestions
|
|
|
|
When reviewing a translation PR, please use the
|
|
[GitHub suggestion feature](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/commenting-on-a-pull-request).
|
|
This feature allows you to directly write how you think a line or paragraph
|
|
should be phrased. Use the left-most button in the toolbar to create a
|
|
suggestion.
|
|
|
|
The PR author can
|
|
[apply the changes with a single click](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/incorporating-feedback-in-your-pull-request)
|
|
afterwards, drastically reducing the number of round-trips needed in a review.
|
|
|
|
### Incomplete Translations
|
|
|
|
When the first 1-2 days of the course have been translated, we can publish the
|
|
translation and link it from the [translations page]. The idea is to celebrate
|
|
the hard work, even if it is incomplete.
|
|
|
|
[CODEOWNERS]: https://github.com/google/comprehensive-rust/blob/main/.github/CODEOWNERS
|