diff --git a/content/Golang/i18n with golang and text package.md b/content/Golang/i18n with golang and text package.md new file mode 100644 index 0000000..ebb3044 --- /dev/null +++ b/content/Golang/i18n with golang and text package.md @@ -0,0 +1,92 @@ +There are no good examples of [golang.org/x/text](https://golang.org/x/text) uses and description of how pluralization made. So, this is it. + +#### Generating translations + +> You should specify valid [ISO-3166 locale code](https://www.iso.org/obp/ui/#iso:code:3166) to get plurals working! + +Write your code: + +```go +import ( + "golang.org/x/text/language" + "golang.org/x/text/message" +) + +lang := language.MustParse('ru-RU') +printer := message.NewPrinter(lang) + +count := 1 +printer.Sprintf("%d butterflies", count) +``` + +Then run generator for your locale (mine is `ru-RU`): + +```shell +gotext -srclang=en-GB update -lang=ru-RU \ + -out=translations.go github.com/path/to-output-folder +``` + +This will generate `out.gotext.json` in `/path/to-output-folder/ru-RU` of your project. Copy it to `messages.out.json`. + +#### Translating and adding plural forms + +Change `"translation"` value in generated `messages.gotext.json` to `string` or `object` of the form shown below if you want pluralize strings, ==then run gotext command again==, it will generate `.go files with translations`. + +According to [source files of gen_common](https://github.com/golang/text/blob/master/feature/plural/gen_common.go#L19), there's a couple of forms: +- `=N`, `!=N`, `%N` for exact matches +- `zero` | `one` | `two` | `few` | `many` | `other` - they're different for each language, so, + +```json +{ + "id": "{Count} butterflies", + "message": "{Count} butterflies", + "translation": { + "select": { + "feature": "plural", + "arg": "Count", + "cases": { + "one": { + "msg": "{Count} бабочка" + }, + "few": { + "msg": "{Count} бабочки" + }, + "many": { + "msg": "{Count} бабочек" + }, + "other": { + "msg": "{Count} бабочуль" + } + } + } + }, + "placeholders": [ + { + "id": "Count", + "string": "%[1]d", + "type": "int", + "underlyingType": "int", + "argNum": 1, + "expr": "count" + } + ] +}, +``` + +#### Using go-generate + +Write this at some `.go` file: + +```go +//go:generate gotext -srclang=en-GB update -out=translations.go -lang=ru-RU github.com/muerwre/vault-golang/internal/api +``` + +Then run go generation: + +```shell +go generate ./... +``` + +#### Useful links +- [All available forms in this .go file](https://github.com/golang/text/blob/master/feature/plural/gen_common.go#L19) +- [Answer, that solved it for me](https://community.crowdin.com/t/plurals-in-gotext-json-files/600) diff --git a/content/golang.org/x/text.md b/content/golang.org/x/text.md new file mode 100644 index 0000000..e69de29