Skip to content
Snippets Groups Projects
Verified Commit 70987284 authored by Timm Fitschen's avatar Timm Fitschen
Browse files

MAINT: fix linter complaints

parent eeffb801
No related branches found
No related tags found
1 merge request!9ENH: Introduction of basic i18n (internationalization).
Pipeline #40354 failed
......@@ -3,9 +3,17 @@ import { i18n, ready, changeLanguage } from "../i18n";
test("i18n", async () => {
await ready;
expect(i18n.t("Login", { defaultValue: "n/a" })).toBe("Login");
expect(i18n.t("Authentication failed. Username or password wrong", {defaultValue: "n/a"})).toBe("Authentication failed. Username or password wrong.");
expect(
i18n.t("Authentication failed. Username or password wrong", {
defaultValue: "n/a",
}),
).toBe("Authentication failed. Username or password wrong.");
await changeLanguage("de");
expect(i18n.t("Login", { defaultValue: "n/a" })).toBe("Anmelden");
expect(i18n.t("Authentication failed. Username or password wrong", {defaultValue: "n/a"})).toBe("Anmeldung fehlgeschlagen. Username oder password falsch.");
})
expect(
i18n.t("Authentication failed. Username or password wrong", {
defaultValue: "n/a",
}),
).toBe("Anmeldung fehlgeschlagen. Username oder passwort falsch.");
});
......@@ -204,7 +204,9 @@ const Select = ({ options, onChange, value, className }) => {
const RecordTypeField = ({ options, value, onChange, label }) => {
const _label = label || "RecordType";
const _readOnly = !options;
const className = _readOnly ? "form-control-plaintext" : "form-control form-select";
const className = _readOnly
? "form-control-plaintext"
: "form-control form-select";
return (
<div className="mb-1 row caosdb-f-file-upload-recordtype-select">
......
import React, { useState, useMemo, useCallback } from "react";
import { useTranslation } from 'react-i18next';
import { useTranslation } from "react-i18next";
import PropTypes from "prop-types";
import { InfoService } from "../InfoService";
import { Message } from "./Message";
......@@ -69,12 +69,15 @@ const LoginFormInputs = ({ then, onError, showMessages, showLoadingInfo }) => {
const onBlur = () => timeout.reset();
const onClick = () => timeout.stop();
const wrappedOnError = useCallback(async (error) => {
const wrappedOnError = useCallback(
async (error) => {
showMessages();
if (onError) {
return await onError(error);
}
}, [onError, showMessages]);
},
[onError, showMessages],
);
return (
<form
......@@ -165,16 +168,22 @@ LoginFormMessage.propTypes = {
export const LoginForm = ({ then, onError, message, messageType }) => {
const [showInputs, setShowInputs] = useState("messages");
const showMessages = useCallback(()=>setShowInputs("messages"),[setShowInputs]);
const showLoadingInfo = useCallback(()=>setShowInputs("loading"),[setShowInputs]);
const showMessages = useCallback(
() => setShowInputs("messages"),
[setShowInputs],
);
const showLoadingInfo = useCallback(
() => setShowInputs("loading"),
[setShowInputs],
);
if (showInputs === "inputs") {
return (
<LoginFormInputs
then={then}
onError={onError}
showMessages={() => setShowInputs("messages")}
showLoadingInfo={() => setShowInputs("loading")}
showMessages={showMessages}
showLoadingInfo={showLoadingInfo}
/>
);
} else if (showInputs === "loading") {
......
import { i18n } from "../i18n";
import React, { useState } from "react";
import PropTypes from "prop-types";
import { useTranslation } from "react-i18next";
import { InfoService } from "../InfoService";
import { LoginForm } from "./LoginForm";
......@@ -13,11 +14,11 @@ import { NavDropdown } from "react-bootstrap";
function translateServerMessages(message) {
switch (message) {
case "Authentication failed. Username or password wrong.":
return i18n.t("Authentication failed. Username or password wrong")// no dot at the end
return i18n.t("Authentication failed. Username or password wrong"); // no dot at the end
case "Authentication failed. SessionToken was invalid.":
return i18n.t("Authentication failed. SessionToken was invalid")// no dot at the end
return i18n.t("Authentication failed. SessionToken was invalid"); // no dot at the end
case "Please log in!":
return i18n.t("Please log in!")
return i18n.t("Please log in!");
default:
return message;
}
......@@ -32,8 +33,18 @@ function _UserComponent({session_info, logout_callback}) {
</>
);
return (
<NavDropdown align="end" aria-label={t("Open user menu", {session_info: session_info})} title={title}>
<NavDropdown.Item aria-label={t("Logout")} title={t("Click to log out")} as="button" onClick={logout_callback} href="#">
<NavDropdown
align="end"
aria-label={t("Open user menu", { session_info: session_info })}
title={title}
>
<NavDropdown.Item
aria-label={t("Logout")}
title={t("Click to log out")}
as="button"
onClick={logout_callback}
href="#"
>
{t("Logout")}
</NavDropdown.Item>
</NavDropdown>
......@@ -86,7 +97,10 @@ export function UserComponent({onLogin, onLogout}) {
show_login_form(t("You have been logged out"), "success");
}
} catch (e) {
show_login_form(t("Logout failed") + ": " + translateServerMessages(e.message), "error");
show_login_form(
t("Logout failed") + ": " + translateServerMessages(e.message),
"error",
);
}
};
......@@ -94,7 +108,12 @@ export function UserComponent({onLogin, onLogout}) {
if (session_info.username === "anonymous") {
show_login_form();
} else {
setComponent(<_UserComponent session_info={session_info} logout_callback={logout_callback}/>);
setComponent(
<_UserComponent
session_info={session_info}
logout_callback={logout_callback}
/>,
);
}
};
......@@ -124,13 +143,20 @@ export function UserComponent({onLogin, onLogout}) {
service
.getSessionInfo()
.then(show_session_info)
.catch((error) => show_login_form(translateServerMessages(error.message), "info"));
.catch((error) =>
show_login_form(translateServerMessages(error.message), "info"),
);
show_component = <LoadingInfo size="sm" />;
}
return <div className="user-component">{show_component}</div>;
}
UserComponent.propTypes = {
onLogin: PropTypes.func,
onLogout: PropTypes.func,
};
UserComponent.defaultProps = {
onLogin: () => true,
onLogout: () => true,
......
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import resourcesToBackend from 'i18next-resources-to-backend'
import resourcesToBackend from "i18next-resources-to-backend";
export const ready = i18n
.use(initReactI18next)
.use(resourcesToBackend((language, namespace) => import(`../locales/${language}/${namespace}.json`)))
.use(
resourcesToBackend((language, namespace) =>
import(`../locales/${language}/${namespace}.json`),
),
)
.init({
supportedLngs: ["en", "de"],
lng: "en",
interpolation: {
escapeValue: false
escapeValue: false,
},
react: {
useSuspense: true
}
useSuspense: true,
},
});
export async function changeLanguage(lng) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment