Moved locales to BCP47 codes
This is a big change, as it renames locale and documentation folders. - renamed translation folders following BCP47 codes - improved display of available translations Each translation is now displayed in its own language and in the current user's language. - the default language is now "en" instead of "en-US" - renamed folders in docs/src and docs/translations - don't copy images from docs/src when they don't contain an index.md file - added a user.Lang() method that returns a code that is guaranteed to be available in the locale list
2
.gitignore
vendored
@@ -14,7 +14,7 @@
|
||||
!/docs/assets/.keep
|
||||
/docs/src/.obsidian
|
||||
/docs/src/*/*.md
|
||||
!/docs/src/en-US/*
|
||||
!/docs/src/en/*
|
||||
|
||||
/locales/translations/*/messages.mo
|
||||
|
||||
|
||||
@@ -52,4 +52,4 @@ build: generate
|
||||
|
||||
clean:
|
||||
rm -rf assets/*
|
||||
find src -name '*.md' -not -regex "src/en-US/.*" -delete
|
||||
find src -name '*.md' -not -regex "src/en/.*" -delete
|
||||
|
||||
@@ -99,7 +99,7 @@ func SetupRoutes(s *server.Server) {
|
||||
server.WithPermission("system", "read"),
|
||||
).Get("/about", handler.serveAbout)
|
||||
|
||||
// Main redirection (TODO: do something with user language when we have translations)
|
||||
// Documentation
|
||||
docHandler.With(server.WithPermission("docs", "read")).Get("/", handler.localeRedirect)
|
||||
docHandler.With(server.WithPermission("docs", "read")).Get("/{path}", handler.localeRedirect)
|
||||
|
||||
@@ -147,7 +147,7 @@ func (h *helpHandlers) getSection(r *http.Request) (*Section, string) {
|
||||
|
||||
tag := server.Locale(r).Tag.String()
|
||||
if _, ok := manifest.Sections[tag]; !ok {
|
||||
tag = "en-US"
|
||||
tag = "en"
|
||||
}
|
||||
return manifest.Sections[tag], tag
|
||||
}
|
||||
@@ -201,7 +201,7 @@ func (h *helpHandlers) serveStatic(w http.ResponseWriter, r *http.Request) {
|
||||
func (h *helpHandlers) localeRedirect(w http.ResponseWriter, r *http.Request) {
|
||||
tag := server.Locale(r).Tag.String()
|
||||
if _, ok := manifest.Sections[tag]; !ok {
|
||||
tag = "en-US"
|
||||
tag = "en"
|
||||
}
|
||||
|
||||
server.Redirect(w, r, routePrefix+"/"+tag+"/"+chi.URLParam(r, "path"))
|
||||
|
||||
@@ -27,7 +27,7 @@ func TestPermissions(t *testing.T) {
|
||||
switch user {
|
||||
case "admin", "staff", "user":
|
||||
rsp.AssertStatus(t, 303)
|
||||
rsp.AssertRedirect(t, "/docs/en-US/")
|
||||
rsp.AssertRedirect(t, "/docs/en/")
|
||||
case "disabled":
|
||||
rsp.AssertStatus(t, 403)
|
||||
case "":
|
||||
@@ -42,7 +42,7 @@ func TestPermissions(t *testing.T) {
|
||||
switch user {
|
||||
case "admin", "staff", "user":
|
||||
rsp.AssertStatus(t, 303)
|
||||
rsp.AssertRedirect(t, "/docs/en-US/bookmark")
|
||||
rsp.AssertRedirect(t, "/docs/en/bookmark")
|
||||
case "disabled":
|
||||
rsp.AssertStatus(t, 403)
|
||||
case "":
|
||||
@@ -52,7 +52,7 @@ func TestPermissions(t *testing.T) {
|
||||
}),
|
||||
),
|
||||
RT(
|
||||
WithTarget("/docs/en-US/"),
|
||||
WithTarget("/docs/en/"),
|
||||
WithAssert(func(t *testing.T, rsp *Response) {
|
||||
switch user {
|
||||
case "admin", "staff", "user":
|
||||
@@ -66,7 +66,7 @@ func TestPermissions(t *testing.T) {
|
||||
}),
|
||||
),
|
||||
RT(
|
||||
WithTarget("/docs/en-US/bookmark"),
|
||||
WithTarget("/docs/en/bookmark"),
|
||||
WithAssert(func(t *testing.T, rsp *Response) {
|
||||
switch user {
|
||||
case "admin", "staff", "user":
|
||||
@@ -80,11 +80,11 @@ func TestPermissions(t *testing.T) {
|
||||
}),
|
||||
),
|
||||
RT(
|
||||
WithTarget("/docs/en-US/not-found"),
|
||||
WithTarget("/docs/en/not-found"),
|
||||
AssertStatus(404),
|
||||
),
|
||||
RT(
|
||||
WithTarget("/docs/en-US/img/bookmark-new.webp"),
|
||||
WithTarget("/docs/en/img/bookmark-new.webp"),
|
||||
AssertStatus(200),
|
||||
WithAssert(func(t *testing.T, rsp *Response) {
|
||||
require.Equal(t, "image/webp", rsp.Header.Get("content-type"))
|
||||
|
||||
@@ -96,7 +96,7 @@ def po2text(catalog: Catalog, destdir: Path):
|
||||
def extract(_):
|
||||
template = Catalog(**CATALOG_OPTIONS)
|
||||
|
||||
for f in (ROOT / "en-US").rglob("*.md"):
|
||||
for f in (ROOT / "en").rglob("*.md"):
|
||||
for lineno, message, comments, context in extract_from_file(
|
||||
extract_blocks,
|
||||
f,
|
||||
@@ -166,7 +166,7 @@ def generate(_):
|
||||
for po_file in sorted(po_files):
|
||||
code = po_file.parent.name
|
||||
|
||||
if code == "en_US":
|
||||
if code == "en":
|
||||
continue
|
||||
|
||||
# Write markdown files
|
||||
@@ -194,7 +194,7 @@ def generate(_):
|
||||
print("[-] {:8} {}".format(code, count_info))
|
||||
continue
|
||||
|
||||
destdir = HERE / "src" / str(catalog.locale_identifier).replace("_", "-")
|
||||
destdir = HERE / "src" / po_file.parent.name
|
||||
os.makedirs(destdir, exist_ok=True)
|
||||
|
||||
nb_files = 0
|
||||
@@ -211,7 +211,7 @@ def check(_):
|
||||
has_errors = False
|
||||
for filename in po_files:
|
||||
code = filename.parent.name
|
||||
if code == "en_US":
|
||||
if code == "en":
|
||||
continue
|
||||
|
||||
with filename.open("rb") as fp:
|
||||
|
||||
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 9.5 KiB After Width: | Height: | Size: 9.5 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 117 KiB After Width: | Height: | Size: 117 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 117 KiB After Width: | Height: | Size: 117 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 117 KiB After Width: | Height: | Size: 117 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 119 KiB After Width: | Height: | Size: 119 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |