aboutsummaryrefslogtreecommitdiff
path: root/misc/i18n/README.md
blob: c08302cf6b675d053d1a5c809f472e37e37293a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# lingo

Very basic Golang library for i18n. There are others that do the job, but this is my take on the problem.

## Features:

1. Storing messages in JSON files.
2. Support for nested declarations.
3. Detecting language based on Request headers.
4. Very simple to use.

## Usage:

1. Import Lingo into your project

   ```go
     import "github.com/kortem/lingo"
   ```

1. Create a dir to store translations, and write them in JSON files named [locale].json. For example:

   ```
     en_US.json
     sr_RS.json
     de.json
     ...
   ```

   You can write nested JSON too.

   ```json
   {
     "main.title": "CutleryPlus",
     "main.subtitle": "Knives that put cut in cutlery.",
     "menu": {
       "home": "Home",
       "products": {
         "self": "Products",
         "forks": "Forks",
         "knives": "Knives",
         "spoons": "Spoons"
       }
     }
   }
   ```

1. Initialize a Lingo like this:

   ```go
     l := lingo.New("default_locale", "path/to/translations/dir")
   ```

1. Get bundle for specific locale via either `string`:

   ```go
     t1 := l.TranslationsForLocale("en_US")
     t2 := l.TranslationsForLocale("de_DE")
   ```

   This way Lingo will return the bundle for specific locale, or default if given is not found.
   Alternatively (or primarily), you can get it with `*http.Request`:

   ```go
     t := l.TranslationsForRequest(req)
   ```

   This way Lingo finds best suited locale via `Accept-Language` header, or if there is no match, returns default.
   `Accept-Language` header is set by the browser, so basically it will serve the language the user has set to his browser.

1. Once you get T instance just fire away!

   ```go
     r1 := t1.Value("main.subtitle")
     // "Knives that put cut in cutlery."
     r1 := t2.Value("main.subtitle")
     // "Messer, die legte in Besteck geschnitten."
     r3 := t1.Value("menu.products.self")
     // "Products"
     r5 := t1.Value("error.404", req.URL.Path)
     // "Page index.html not found!"
   ```

## Contributions:

I regard this little library as feature-complete, but if you have an idea on how to improve it, feel free to create issues. Also, pull requests are welcome. Enjoy!