diff --git a/README.md b/README.md
index d9ca40930..62d756e37 100644
--- a/README.md
+++ b/README.md
@@ -88,6 +88,7 @@ This will run a demo version, which you can turn into a fully licenced version b
### Version 4.16.0
- Complete overhaul of the translations. Switching to [i18next](https://www.i18next.com). Translated all languages using Machine Learning (via Crowdin).
+- Added translations for the Ukrainian language, and a link to provide help for Ukraine.
- Fix the empty file download when logging using Google OAuth
- Upgrade the documentation to the latest version of Docusaurus
- Add more integration tests, covering password accounts and account deletion
diff --git a/frontend/src/Layout.tsx b/frontend/src/Layout.tsx
index 4ea36b736..caa38e8c5 100644
--- a/frontend/src/Layout.tsx
+++ b/frontend/src/Layout.tsx
@@ -26,6 +26,8 @@ import { Alert, AlertTitle, Button, Hidden } from '@mui/material';
import useBackendCapabilities from './global/useBackendCapabilities';
import useIsPro from 'auth/useIsPro';
import ProButton from 'components/ProButton';
+import { Flag } from 'components/Flag';
+import { useTranslation } from 'react-i18next';
const Home = lazy(() => import('./views/Home' /* webpackChunkName: "home" */));
const Game = lazy(() => import('./views/Game' /* webpackChunkName: "game" */));
@@ -103,6 +105,7 @@ function App() {
const goToHome = useCallback(() => navigate('/'), [navigate]);
const location = useLocation();
const isOnGamePage = !!useMatch('game/:gameId/*');
+ const { t } = useTranslation();
// Tracks page views on every location change
useEffect(() => {
@@ -113,7 +116,7 @@ function App() {
{!backend.licenced ? (
- Retrospected is Unlicenced
+ {t('Main.unlicenced.title')}
This software is unlicenced. You can obtain a licence{' '}
) : null}
-
+
) : null}
+
+
+
+
+ {t('Main.helpUkraine')}
+
+
+
+
{isOnGamePage ? : null}
{isInitialised ? (
) : (
- Loading...
+ {t('Main.loading')}
)}
@@ -225,4 +244,23 @@ const Spacer = styled.div`
flex: 1;
`;
+const HelpUkraine = styled.div`
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin: 0 20px;
+ a {
+ font-style: unset;
+ text-decoration: unset;
+ font-size: 1.2rem;
+ font-weight: 100;
+ color: #0057b7;
+ }
+ border: 1px solid #0057b7;
+ border-radius: 5px;
+ padding: 10px;
+ backdrop-filter: blur(10px);
+ background-color: rgba(255, 255, 255, 0.3);
+`;
+
export default App;
diff --git a/frontend/src/components/Flag.tsx b/frontend/src/components/Flag.tsx
new file mode 100644
index 000000000..50a90fe23
--- /dev/null
+++ b/frontend/src/components/Flag.tsx
@@ -0,0 +1,36 @@
+import styled from '@emotion/styled';
+import 'flag-icons/css/flag-icons.min.css';
+
+type FlagProps = {
+ country: string;
+};
+
+export function Flag({ country }: FlagProps) {
+ return (
+
+
+
+ );
+}
+
+const FlagIcon = styled.div`
+ font-size: 32px;
+ margin-left: 10px;
+ height: 32px;
+ margin-right: 8px;
+ position: relative;
+`;
+
+const FlagOverlay = styled.div`
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ height: 32px;
+ background: linear-gradient(
+ to bottom,
+ rgba(255, 255, 255, 0.5) 0%,
+ rgba(255, 255, 255, 0) 100%
+ );
+`;
diff --git a/frontend/src/components/LanguagePicker.tsx b/frontend/src/components/LanguagePicker.tsx
index 0c25e5ff4..917ee2026 100644
--- a/frontend/src/components/LanguagePicker.tsx
+++ b/frontend/src/components/LanguagePicker.tsx
@@ -4,7 +4,7 @@ import Select from '@mui/material/Select';
import { SelectChangeEvent } from '@mui/material';
import MenuItem from '@mui/material/MenuItem';
import { languages } from '../translations';
-import 'flag-icons/css/flag-icons.min.css';
+import { Flag } from './Flag';
interface LanguagePickerProps {
value: string;
@@ -33,9 +33,7 @@ const LanguagePicker = ({ value, onChange }: LanguagePickerProps) => {
data-cy={`language-picker-item-${language.locale}`}
>
-
-
-
+
{language.name}
{language.englishName}
@@ -56,34 +54,15 @@ const LanguageItem = styled.div`
align-items: center;
`;
-const Flag = styled.div`
- font-size: 32px;
- margin-left: 10px;
- height: 32px;
- margin-right: 8px;
- position: relative;
-`;
-
-const FlagOverlay = styled.div`
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- height: 32px;
- background: linear-gradient(
- to bottom,
- rgba(255, 255, 255, 0.5) 0%,
- rgba(255, 255, 255, 0) 100%
- );
-`;
const Names = styled.div`
margin-left: 5px;
display: flex;
flex-direction: column;
font-size: 0.8em;
`;
+
const Name = styled.div``;
+
const EnglishName = styled.div`
color: grey;
`;
diff --git a/frontend/src/translations/locales/ar-SA.json b/frontend/src/translations/locales/ar-SA.json
index 8c03cb190..819ecfb6f 100644
--- a/frontend/src/translations/locales/ar-SA.json
+++ b/frontend/src/translations/locales/ar-SA.json
@@ -11,7 +11,12 @@
"header": "إختيار اللُّغة"
},
"Main": {
- "hint": "يمكنُكَ دعوة أشخاص إلى هذه الجلسة عن طريق نسخ عنوان هذه الصفحة"
+ "hint": "يمكنُكَ دعوة أشخاص إلى هذه الجلسة عن طريق نسخ عنوان هذه الصفحة",
+ "helpUkraine": "ساعد أوكرانيا!",
+ "loading": "تحميل...",
+ "unlicenced": {
+ "title": "الاستطلاع التراجعي غير مرخص"
+ }
},
"Home": {
"welcome": "مرحبا، {{name}}"
diff --git a/frontend/src/translations/locales/de-DE.json b/frontend/src/translations/locales/de-DE.json
index 8cffb89c7..baabe0011 100644
--- a/frontend/src/translations/locales/de-DE.json
+++ b/frontend/src/translations/locales/de-DE.json
@@ -11,7 +11,12 @@
"header": "Sprache auswählen"
},
"Main": {
- "hint": "Du kannst Andere zu dieser Session einladen indem Du ihnen die URL schickst"
+ "hint": "Du kannst Andere zu dieser Session einladen indem Du ihnen die URL schickst",
+ "helpUkraine": "Hilf der Ukraine!",
+ "loading": "Wird geladen...",
+ "unlicenced": {
+ "title": "Retrospected ist nicht lizenziert"
+ }
},
"Home": {
"welcome": "Willkommen, {{name}}"
diff --git a/frontend/src/translations/locales/en-GB.json b/frontend/src/translations/locales/en-GB.json
index e607597fc..2726e3218 100644
--- a/frontend/src/translations/locales/en-GB.json
+++ b/frontend/src/translations/locales/en-GB.json
@@ -11,7 +11,12 @@
"header": "Choose a language"
},
"Main": {
- "hint": "You can invite others to this session by copy-pasting the URL"
+ "hint": "You can invite others to this session by copy-pasting the URL",
+ "helpUkraine": "Help Ukraine!",
+ "loading": "Loading...",
+ "unlicenced": {
+ "title": "Retrospected is Unlicenced"
+ }
},
"Home": {
"welcome": "Welcome, {{name}}"
diff --git a/frontend/src/translations/locales/es-ES.json b/frontend/src/translations/locales/es-ES.json
index d83ffaa44..4b9605d8b 100644
--- a/frontend/src/translations/locales/es-ES.json
+++ b/frontend/src/translations/locales/es-ES.json
@@ -11,7 +11,12 @@
"header": "Escoje un idioma"
},
"Main": {
- "hint": "Puedes invitar a otros a esta sesión compartiendo la URL"
+ "hint": "Puedes invitar a otros a esta sesión compartiendo la URL",
+ "helpUkraine": "¡Ayuda a Ucrania!",
+ "loading": "Cargando...",
+ "unlicenced": {
+ "title": "El retrospectivo está sin licencia"
+ }
},
"Home": {
"welcome": "Bienvenido, {{name}}"
diff --git a/frontend/src/translations/locales/fr-FR.json b/frontend/src/translations/locales/fr-FR.json
index e563bc85a..6829cee14 100644
--- a/frontend/src/translations/locales/fr-FR.json
+++ b/frontend/src/translations/locales/fr-FR.json
@@ -11,7 +11,12 @@
"header": "Changez de langue"
},
"Main": {
- "hint": "Vous pouvez inviter d'autres participants en leur envoyant l'URL de cette page"
+ "hint": "Vous pouvez inviter d'autres participants en leur envoyant l'URL de cette page",
+ "helpUkraine": "Aidez l'Ukraine!",
+ "loading": "Chargement en cours...",
+ "unlicenced": {
+ "title": "Retrospected est sans licence"
+ }
},
"Home": {
"welcome": "Bienvenue, {{name}}"
@@ -140,7 +145,7 @@
"sailboat": "Bateau"
},
"Clients": {
- "header": "Participants:",
+ "header": "Participants :",
"joined": "{{users}} connecté.",
"left": "{{users}} déconnecté."
},
diff --git a/frontend/src/translations/locales/hu-HU.json b/frontend/src/translations/locales/hu-HU.json
index dfe3a8f26..9b2c51117 100644
--- a/frontend/src/translations/locales/hu-HU.json
+++ b/frontend/src/translations/locales/hu-HU.json
@@ -11,7 +11,12 @@
"header": "Válassz nyelvet"
},
"Main": {
- "hint": "Ha meg akarsz hívni másokat, másold ki és oszd meg velük az URL-t"
+ "hint": "Ha meg akarsz hívni másokat, másold ki és oszd meg velük az URL-t",
+ "helpUkraine": "Segíts Ukrajnának!",
+ "loading": "Betöltés...",
+ "unlicenced": {
+ "title": "Az utólag jogosítvány nélküli"
+ }
},
"Home": {
"welcome": "Isten hozott, {{name}}"
diff --git a/frontend/src/translations/locales/it-IT.json b/frontend/src/translations/locales/it-IT.json
index a7b04b9ce..6f14224e7 100644
--- a/frontend/src/translations/locales/it-IT.json
+++ b/frontend/src/translations/locales/it-IT.json
@@ -11,7 +11,12 @@
"header": "Scegli una lingua"
},
"Main": {
- "hint": "Puoi invitare altre persone a questa sessione copiando ed incollando la URL"
+ "hint": "Puoi invitare altre persone a questa sessione copiando ed incollando la URL",
+ "helpUkraine": "Aiuta Ucraina!",
+ "loading": "Caricamento...",
+ "unlicenced": {
+ "title": "Retrospected is Unlicenced"
+ }
},
"Home": {
"welcome": "Benvenuto, {{name}}"
diff --git a/frontend/src/translations/locales/ja-JP.json b/frontend/src/translations/locales/ja-JP.json
index 0eaf0b003..cb3c5166d 100644
--- a/frontend/src/translations/locales/ja-JP.json
+++ b/frontend/src/translations/locales/ja-JP.json
@@ -11,7 +11,12 @@
"header": "言語を選択"
},
"Main": {
- "hint": "URLを共有すれば新たな参加者を本セッションに招待できます"
+ "hint": "URLを共有すれば新たな参加者を本セッションに招待できます",
+ "helpUkraine": "ウクライナを助けよう!",
+ "loading": "読み込み中...",
+ "unlicenced": {
+ "title": "Retrospected is unlicenced"
+ }
},
"Home": {
"welcome": "ようこそ、 {{name}}"
diff --git a/frontend/src/translations/locales/nl-NL.json b/frontend/src/translations/locales/nl-NL.json
index 917d7e87b..a4e59adaf 100644
--- a/frontend/src/translations/locales/nl-NL.json
+++ b/frontend/src/translations/locales/nl-NL.json
@@ -11,7 +11,12 @@
"header": "Kies een taal"
},
"Main": {
- "hint": "Je kan anderen uitnodigen voor deze sessie door de URL te kopiëren en te plakken"
+ "hint": "Je kan anderen uitnodigen voor deze sessie door de URL te kopiëren en te plakken",
+ "helpUkraine": "Help Oekraïne",
+ "loading": "Laden...",
+ "unlicenced": {
+ "title": "Retrospected is niet toegestaan"
+ }
},
"Home": {
"welcome": "Welkom, {{name}}"
diff --git a/frontend/src/translations/locales/pl-PL.json b/frontend/src/translations/locales/pl-PL.json
index 4ad40c07d..76902895e 100644
--- a/frontend/src/translations/locales/pl-PL.json
+++ b/frontend/src/translations/locales/pl-PL.json
@@ -11,7 +11,12 @@
"header": "Wybierz język"
},
"Main": {
- "hint": "Możesz zaprosić inne osoby do tej sesji wysyłając im URL"
+ "hint": "Możesz zaprosić inne osoby do tej sesji wysyłając im URL",
+ "helpUkraine": "Pomóż Ukrainie!",
+ "loading": "Ładowanie...",
+ "unlicenced": {
+ "title": "Retrospected jest nielicencjonowany"
+ }
},
"Home": {
"welcome": "Witaj, {{name}}"
diff --git a/frontend/src/translations/locales/pt-BR.json b/frontend/src/translations/locales/pt-BR.json
index 02b922bd2..f95849424 100644
--- a/frontend/src/translations/locales/pt-BR.json
+++ b/frontend/src/translations/locales/pt-BR.json
@@ -11,7 +11,12 @@
"header": "Escolha uma língua"
},
"Main": {
- "hint": "Você pode convidar outras pessoas para esta seção compartilhando a URL"
+ "hint": "Você pode convidar outras pessoas para esta seção compartilhando a URL",
+ "helpUkraine": "Ajude a Ucrânia!",
+ "loading": "Carregandochar@@0",
+ "unlicenced": {
+ "title": "Retrospectiva Não Autorizada"
+ }
},
"Home": {
"welcome": "Bem-vindo, {{name}}"
diff --git a/frontend/src/translations/locales/pt-PT.json b/frontend/src/translations/locales/pt-PT.json
index f01f4a9cb..6cf9bfbdc 100644
--- a/frontend/src/translations/locales/pt-PT.json
+++ b/frontend/src/translations/locales/pt-PT.json
@@ -11,7 +11,12 @@
"header": "Escolha um idioma"
},
"Main": {
- "hint": "Você pode convidar outros para esta sessão copiando a URL"
+ "hint": "Você pode convidar outros para esta sessão copiando a URL",
+ "helpUkraine": "Ajude a Ucrânia!",
+ "loading": "Carregandochar@@0",
+ "unlicenced": {
+ "title": "Retrospectiva Não Autorizada"
+ }
},
"Home": {
"welcome": "Bem-vindo, {{name}}"
diff --git a/frontend/src/translations/locales/uk-UA.json b/frontend/src/translations/locales/uk-UA.json
index 81f47c26f..e2107653e 100644
--- a/frontend/src/translations/locales/uk-UA.json
+++ b/frontend/src/translations/locales/uk-UA.json
@@ -11,7 +11,12 @@
"header": "Виберіть мову"
},
"Main": {
- "hint": "Ви можете запросити інших до цього сеансу, скопіювавши URL"
+ "hint": "Ви можете запросити інших до цього сеансу, скопіювавши URL",
+ "helpUkraine": "Допоможіть Україні!",
+ "loading": "Завантажується...",
+ "unlicenced": {
+ "title": "Ретроспекція не ліцензована"
+ }
},
"Home": {
"welcome": "Ласкаво просимо, {{name}}"
diff --git a/frontend/src/translations/locales/zh-CN.json b/frontend/src/translations/locales/zh-CN.json
index 65517fd10..5323fa2ea 100644
--- a/frontend/src/translations/locales/zh-CN.json
+++ b/frontend/src/translations/locales/zh-CN.json
@@ -11,7 +11,12 @@
"header": "切换语言"
},
"Main": {
- "hint": "复制并分享网址,即可让别人加入此议程"
+ "hint": "复制并分享网址,即可让别人加入此议程",
+ "helpUkraine": "帮助乌克兰!",
+ "loading": "加载中...",
+ "unlicenced": {
+ "title": "返回是未授权的"
+ }
},
"Home": {
"welcome": "欢迎, {{name}}"
diff --git a/frontend/src/translations/locales/zh-TW.json b/frontend/src/translations/locales/zh-TW.json
index b8e4da7b2..497e53212 100644
--- a/frontend/src/translations/locales/zh-TW.json
+++ b/frontend/src/translations/locales/zh-TW.json
@@ -11,7 +11,12 @@
"header": "切換語言"
},
"Main": {
- "hint": "複製並分享網址,即可讓別人加入此議程"
+ "hint": "複製並分享網址,即可讓別人加入此議程",
+ "helpUkraine": "幫助烏克蘭!",
+ "loading": "正在加載...",
+ "unlicenced": {
+ "title": "追溯是未經許可的"
+ }
},
"Home": {
"welcome": "歡迎, {{name}}"