Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat: language picker #6716

Draft
wants to merge 50 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
1444d69
feat(web): add language picker
mind-ar Feb 21, 2024
1710357
fix(web): lint
mind-ar Feb 21, 2024
918ff79
Merge branch 'master' into feat-i18n-picker
mind-ar Feb 21, 2024
ab59e14
feat(web): add i18n local store support
mind-ar Feb 21, 2024
dd22138
Merge branch 'master' into feat-i18n-picker
mind-ar Feb 21, 2024
060b13a
Merge branch 'feat-i18n-picker' of https://github.com/authelia/authel…
mind-ar Feb 21, 2024
9f6844b
Merge branch 'master' into feat-i18n-picker
mind-ar Feb 21, 2024
0e15d64
feat(web): eliminate duplicated picker items
mind-ar Feb 22, 2024
ad18130
Merge branch 'master' into feat-i18n-picker
mind-ar Feb 22, 2024
c623a6e
Update cmd/authelia-gen/types.go
mind-ar Feb 22, 2024
3a94b95
Merge branch 'master' into feat-i18n-picker
mind-ar Feb 22, 2024
0ebd33f
feat(web): add select mode to language selector
mind-ar Feb 22, 2024
136777d
Merge branch 'master' into feat-i18n-picker
mind-ar Feb 22, 2024
5ddb662
Merge branch 'master' into feat-i18n-picker
mind-ar Feb 23, 2024
acd3e9b
feat(web): add better lang picker
mind-ar Feb 23, 2024
a13afb8
Merge branch 'master' into feat-i18n-picker
mind-ar Feb 23, 2024
0064ce7
Merge branch 'feat-i18n-picker' of https://github.com/authelia/authel…
mind-ar Feb 23, 2024
545de51
Merge branch 'master' into feat-i18n-picker
mind-ar Feb 23, 2024
98d1c29
refactor(commands): move get language logic to internal/utils
mind-ar Feb 24, 2024
0205e77
feat(handlers): add handler for available locales list
mind-ar Feb 24, 2024
00d4d94
feat(web): use backend calls for language picker
mind-ar Feb 24, 2024
59fcbf5
refactor(web): apply the rabbit recommendations
mind-ar Feb 24, 2024
37371fb
Merge branch 'master' into feat-i18n-picker
mind-ar Feb 29, 2024
8378955
Merge branch 'master' into feat-i18n-picker
mind-ar Mar 1, 2024
e792fa7
Merge branch 'master' of https://github.com/authelia/authelia into fe…
mind-ar Mar 6, 2024
4092076
fix(web): fix merge errors
mind-ar Mar 6, 2024
495b8e8
Merge branch 'master' into feat-i18n-picker
mind-ar Mar 6, 2024
0a928bf
Merge branch 'master' of https://github.com/authelia/authelia into fe…
mind-ar Mar 7, 2024
5c051e8
fix(web): fix lint error
mind-ar Mar 7, 2024
71c6306
Merge branch 'master' into feat-i18n-picker
mind-ar Mar 8, 2024
065da95
Merge branch 'master' into feat-i18n-picker
mind-ar Mar 8, 2024
0949d3a
i18n(utils): better suppor for locale aliases
mind-ar Mar 9, 2024
64715bc
Merge branch 'master' into feat-i18n-picker
mind-ar Mar 9, 2024
e1fb85d
i18n(handlers): add automatic aliases for macrolanguages
mind-ar Mar 9, 2024
cf85145
i18n(handlers): add etag to locale list
mind-ar Mar 9, 2024
95001ff
Merge branch 'master' into feat-i18n-picker
mind-ar Mar 9, 2024
edb79c3
i18n(web): add comments
mind-ar Mar 9, 2024
821e7d1
i18n(web): migrating i18n supported lng and fallback to backend
mind-ar Mar 10, 2024
860d8d5
i18n(cmd): removed template generation for i18n/index.ts
mind-ar Mar 10, 2024
95be452
Merge branch 'master' into feat-i18n-picker
mind-ar Mar 11, 2024
f61daa0
i18n(handlers): add partial support for custom locales
mind-ar Mar 11, 2024
920e611
Merge branch 'feat-i18n-picker' of https://github.com/authelia/authel…
mind-ar Mar 11, 2024
b1bbd50
Merge branch 'master' into feat-i18n-picker
mind-ar Mar 17, 2024
8c6016c
i18n(handlers): add language merge func
mind-ar Mar 17, 2024
2cf0ace
i18n(handlers): add support for custom locales
mind-ar Mar 17, 2024
17e870c
Merge branch 'master' into feat-i18n-picker
mind-ar Mar 17, 2024
c4fe1a4
Merge branch 'master' of https://github.com/authelia/authelia into fe…
mind-ar Apr 1, 2024
01be57e
fix(handlers): lint
mind-ar Apr 1, 2024
34ca7a5
Merge branch 'master' into feat-i18n-picker
mind-ar Apr 9, 2024
2f07394
Merge branch 'master' into feat-i18n-picker
mind-ar Apr 17, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,6 @@ indent_size = 2
[internal/suites/example/compose/nginx/*/*.conf]
charset = UTF-8
indent_style = space

[*.ts.tmpl]
indent_style = space
6 changes: 6 additions & 0 deletions cmd/authelia-gen/templates/web_i18n_index.ts.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,9 @@ i18n.use(Backend)
});

export default i18n;

export const supportedLngsNames = [
{{- range $i, $value := .Languages }}
{ lng: "{{ $value.Locale }}", name: "{{ $value.Display }}" },
{{- end }}
];
8 changes: 4 additions & 4 deletions internal/suites/environment.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ func waitUntilServiceLogDetected(
func waitUntilAutheliaBackendIsReady(dockerEnvironment *DockerEnvironment) error {
return waitUntilServiceLogDetected(
5*time.Second,
90*time.Second,
120*time.Second,
dockerEnvironment,
"authelia-backend",
[]string{"Startup complete"})
Expand All @@ -50,7 +50,7 @@ func waitUntilAutheliaBackendIsReady(dockerEnvironment *DockerEnvironment) error
func waitUntilAutheliaFrontendIsReady(dockerEnvironment *DockerEnvironment) error {
return waitUntilServiceLogDetected(
5*time.Second,
90*time.Second,
120*time.Second,
dockerEnvironment,
"authelia-frontend",
[]string{"dev server running at", "ready in", "server restarted"})
Expand All @@ -59,7 +59,7 @@ func waitUntilAutheliaFrontendIsReady(dockerEnvironment *DockerEnvironment) erro
func waitUntilK3DIsReady(dockerEnvironment *DockerEnvironment) error {
return waitUntilServiceLogDetected(
5*time.Second,
90*time.Second,
120*time.Second,
dockerEnvironment,
"k3d",
[]string{"API listen on [::]:2376"})
Expand All @@ -68,7 +68,7 @@ func waitUntilK3DIsReady(dockerEnvironment *DockerEnvironment) error {
func waitUntilSambaIsReady(dockerEnvironment *DockerEnvironment) error {
return waitUntilServiceLogDetected(
5*time.Second,
90*time.Second,
120*time.Second,
dockerEnvironment,
"sambaldap",
[]string{"samba entered RUNNING state"})
Expand Down
72 changes: 72 additions & 0 deletions web/src/components/LanguageSelector.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import React, { useState } from "react";

import LanguageIcon from "@mui/icons-material/Language";
import { Box, IconButton, Menu, MenuItem, Theme } from "@mui/material";
import makeStyles from "@mui/styles/makeStyles";
import classnames from "classnames";

import { supportedLngsNames } from "i18n";

export interface Props {
value: string;
onChange: Function;
}

const LanguageSelector = function (props: Props) {
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
const open = Boolean(anchorEl);

const styles = makeStyles((theme: Theme) => ({
topRight: {
position: "absolute",
top: "20px",
right: "20px",
},
}))();

const handleClick = (event: React.MouseEvent<HTMLElement>) => {
setAnchorEl(event.currentTarget);

Check warning on line 28 in web/src/components/LanguageSelector.tsx

View check run for this annotation

Codecov / codecov/patch

web/src/components/LanguageSelector.tsx#L28

Added line #L28 was not covered by tests
};
const handleClose = (lng: string) => {
setAnchorEl(null);

Check warning on line 31 in web/src/components/LanguageSelector.tsx

View check run for this annotation

Codecov / codecov/patch

web/src/components/LanguageSelector.tsx#L31

Added line #L31 was not covered by tests
if (lng !== "") {
props.onChange(lng);

Check warning on line 33 in web/src/components/LanguageSelector.tsx

View check run for this annotation

Codecov / codecov/patch

web/src/components/LanguageSelector.tsx#L33

Added line #L33 was not covered by tests
}
};

const languages = supportedLngsNames.map((lng) => (
<MenuItem key={lng.lng} onClick={() => handleClose(lng.lng)} value={lng.lng}>
{lng.name}
</MenuItem>
));

return (
<Box className={classnames(styles.topRight)}>
<IconButton
onClick={handleClick}
size="small"
sx={{ ml: 2 }}
aria-controls={open ? "account-menu" : undefined}
aria-haspopup="true"
aria-expanded={open ? "true" : undefined}
>
<LanguageIcon></LanguageIcon> <span>{props.value}</span>
</IconButton>
<Menu
anchorEl={anchorEl}
id="account-menu"
open={open}
onClose={() => handleClose("")}
onClick={() => handleClose("")}

Check warning on line 60 in web/src/components/LanguageSelector.tsx

View check run for this annotation

Codecov / codecov/patch

web/src/components/LanguageSelector.tsx#L59-L60

Added lines #L59 - L60 were not covered by tests
transformOrigin={{ horizontal: "right", vertical: "top" }}
anchorOrigin={{ horizontal: "right", vertical: "bottom" }}
>
{languages}
</Menu>
</Box>
);
};

LanguageSelector.defaultProps = {};

export default LanguageSelector;
mind-ar marked this conversation as resolved.
Show resolved Hide resolved
38 changes: 38 additions & 0 deletions web/src/i18n/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,3 +116,41 @@ i18n.use(Backend)
});

export default i18n;

export const supportedLngsNames = [
{ lng: "en", name: "English" },
{ lng: "ar", name: "Arabic" },
{ lng: "ar-SA", name: "Arabic (Saudi Arabia)" },
{ lng: "cs", name: "Czech" },
{ lng: "cs-CZ", name: "Czech (Czechia)" },
{ lng: "da", name: "Danish" },
{ lng: "da-DK", name: "Danish (Denmark)" },
{ lng: "de", name: "German" },
{ lng: "el", name: "Greek" },
{ lng: "el-GR", name: "Greek (Greece)" },
{ lng: "es", name: "Spanish" },
{ lng: "fi", name: "Finnish" },
{ lng: "fr", name: "French" },
{ lng: "hu", name: "Hungarian" },
{ lng: "it", name: "Italian" },
{ lng: "ja", name: "Japanese" },
{ lng: "ja-JP", name: "Japanese (Japan)" },
{ lng: "nb", name: "Norwegian Bokmål" },
{ lng: "nb-NO", name: "Norwegian Bokmål (Norway)" },
{ lng: "nl", name: "Dutch" },
{ lng: "no", name: "Norwegian Bokmål" },
{ lng: "pl", name: "Polish" },
{ lng: "pt", name: "Portuguese" },
{ lng: "pt-BR", name: "Brazilian Portuguese" },
{ lng: "ro", name: "Romanian" },
{ lng: "ru", name: "Russian" },
{ lng: "sl", name: "Slovenian" },
{ lng: "sl-SI", name: "Slovenian (Slovenia)" },
{ lng: "sv", name: "Swedish" },
{ lng: "sv-SE", name: "Swedish (Sweden)" },
{ lng: "uk", name: "Ukrainian" },
{ lng: "uk-UA", name: "Ukrainian (Ukraine)" },
{ lng: "zh", name: "Chinese" },
{ lng: "zh-CN", name: "Chinese (China)" },
{ lng: "zh-TW", name: "Chinese (Taiwan)" },
];
3 changes: 3 additions & 0 deletions web/src/views/LoginPortal/FirstFactor/FirstFactorForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import { useNavigate } from "react-router-dom";

import FixedTextField from "@components/FixedTextField";
import LanguageSelector from "@components/LanguageSelector";
import { ResetPasswordStep1Route } from "@constants/Routes";
import { RedirectionURL, RequestMethod } from "@constants/SearchParams";
import { useNotifications } from "@hooks/NotificationsContext";
Expand Down Expand Up @@ -47,6 +48,7 @@
const usernameRef = useRef() as MutableRefObject<HTMLInputElement>;
const passwordRef = useRef() as MutableRefObject<HTMLInputElement>;
const { t: translate } = useTranslation();
const [lang, setLang] = useState("en");

useEffect(() => {
const timeout = setTimeout(() => usernameRef.current.focus(), 10);
Expand Down Expand Up @@ -105,6 +107,7 @@

return (
<LoginLayout id="first-factor-stage" title={translate("Sign in")} showBrand>
<LanguageSelector value={lang} onChange={(lng: string) => setLang(lng)}></LanguageSelector>

Check warning on line 110 in web/src/views/LoginPortal/FirstFactor/FirstFactorForm.tsx

View check run for this annotation

Codecov / codecov/patch

web/src/views/LoginPortal/FirstFactor/FirstFactorForm.tsx#L110

Added line #L110 was not covered by tests
<Grid container spacing={2}>
<Grid item xs={12}>
<FixedTextField
Expand Down
Loading