Allow to access to a language directly though instance.tld/:lang

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel 2021-11-07 21:02:36 +01:00
parent 7c4a76cc89
commit 5de0cee025
No known key found for this signature in database
GPG key ID: A061B9DDE0CA0773
5 changed files with 46 additions and 7 deletions

View file

@ -0,0 +1,15 @@
<template>
<div>a</div>
</template>
<script lang="ts">
import { Component, Vue } from "vue-property-decorator";
import RouteName from "@/router/name";
@Component
export default class HomepageRedirectComponent extends Vue {
created(): void {
this.$router.replace({ name: RouteName.HOME });
}
}
</script>

View file

@ -13,7 +13,7 @@ import { groupsRoutes } from "./groups";
import { discussionRoutes } from "./discussion"; import { discussionRoutes } from "./discussion";
import { userRoutes } from "./user"; import { userRoutes } from "./user";
import RouteName from "./name"; import RouteName from "./name";
import { i18n } from "@/utils/i18n"; import { AVAILABLE_LANGUAGES, i18n } from "@/utils/i18n";
Vue.use(Router); Vue.use(Router);
@ -183,12 +183,23 @@ export const routes = [
announcer: { message: (): string => i18n.t("Page not found") as string }, announcer: { message: (): string => i18n.t("Page not found") as string },
}, },
}, },
{
path: "*",
redirect: { name: RouteName.PAGE_NOT_FOUND },
},
]; ];
for (const locale of AVAILABLE_LANGUAGES) {
routes.push({
path: `/${locale}`,
component: (): Promise<ImportedComponent> =>
import(
/* webpackChunkName: "HomepageRedirectComponent" */ "../components/Utils/HomepageRedirectComponent.vue"
),
});
}
routes.push({
path: "*",
redirect: { name: RouteName.PAGE_NOT_FOUND },
});
const router = new Router({ const router = new Router({
scrollBehavior, scrollBehavior,
mode: "history", mode: "history",

View file

@ -10,6 +10,8 @@ const DEFAULT_LOCALE = "en_US";
const localeInLocalStorage = getLocaleData(); const localeInLocalStorage = getLocaleData();
export const AVAILABLE_LANGUAGES = Object.keys(langs);
console.debug("localeInLocalStorage", localeInLocalStorage); console.debug("localeInLocalStorage", localeInLocalStorage);
let language = let language =

View file

@ -18,11 +18,13 @@ defmodule Mobilizon.Web.Plugs.SetLocalePlug do
def call(conn, _) do def call(conn, _) do
locale = locale =
[ [
eventual_path_locale(conn.path_info),
conn.assigns[:user_locale], conn.assigns[:user_locale],
conn.assigns[:detected_locale], conn.assigns[:detected_locale],
default_locale(), default_locale(),
"en" "en"
] ]
|> Enum.filter(& &1)
|> Enum.map(&determine_best_locale/1) |> Enum.map(&determine_best_locale/1)
|> Enum.filter(&supported_locale?/1) |> Enum.filter(&supported_locale?/1)
|> hd() |> hd()
@ -31,6 +33,15 @@ defmodule Mobilizon.Web.Plugs.SetLocalePlug do
assign(conn, :locale, locale) assign(conn, :locale, locale)
end end
defp eventual_path_locale(path_info) do
with [locale] <- path_info,
true <- supported_locale?(locale) do
locale
else
_ -> nil
end
end
@spec supported_locale?(String.t()) :: boolean() @spec supported_locale?(String.t()) :: boolean()
defp supported_locale?(locale) do defp supported_locale?(locale) do
GettextBackend GettextBackend

View file

@ -50,8 +50,8 @@ defmodule Mobilizon.Web.Views.Utils do
index_content index_content
|> replace_meta(tags) |> replace_meta(tags)
|> String.replace( |> String.replace(
"<html lang=\"en\" dir=\"auto\">", ~s(<html lang="en" dir="auto">),
"<html lang=\"#{locale}\" dir=\"#{get_language_direction(locale)}\">" ~s(<html lang="#{locale}" dir="#{get_language_direction(locale)}">)
) )
end end