-
-
-
-
- Buddies Online: ?/{buddyList.length}
-
- buddyList[index].name }
- items={ buddyList.map(user => (
-
-
-
- )) }
- />
-
-
-
-
-
-
- Ignored Users Online: ?/{ignoreList.length}
-
- ignoreList[index].name }
- items={ ignoreList.map(user => (
-
-
-
- )) }
- />
-
-
-
-
-
-
- {name}
- Location: ({country?.toUpperCase()})
- User Level: {userLevel}
- Account Age: {accountageSecs}
- Real Name: {realName}
-
-
-
-
-
-
-
- Server Name: {serverName}
- Server Version: {serverVersion}
-
-
-
+ return (
+
+
+
+
+
+ Buddies Online: ?/{buddyList.length}
+
+ buddyList[index].name }
+ items={ buddyList.map(user => (
+
+
+
+ )) }
+ />
+
+
- )
- }
+
+
+
+ Ignored Users Online: ?/{ignoreList.length}
+
+ ignoreList[index].name }
+ items={ ignoreList.map(user => (
+
+
+
+ )) }
+ />
+
+
+
+
+
+
+ {name}
+ Location: ({country?.toUpperCase()})
+ User Level: {userLevel}
+ Account Age: {accountageSecs}
+ Real Name: {realName}
+
+
+
+
+
+
+
+
+ Server Name: {serverName}
+ Server Version: {serverVersion}
+
+
+
+
+
+
+
+
+ )
}
interface AccountProps {
diff --git a/webclient/src/containers/App/AppShell.tsx b/webclient/src/containers/App/AppShell.tsx
index 14ee0077..beec032e 100644
--- a/webclient/src/containers/App/AppShell.tsx
+++ b/webclient/src/containers/App/AppShell.tsx
@@ -1,4 +1,4 @@
-import { Component } from 'react';
+import { Component, Suspense } from 'react';
import { Provider } from 'react-redux';
import { MemoryRouter as Router } from 'react-router-dom';
import CssBaseline from '@material-ui/core/CssBaseline';
@@ -23,19 +23,21 @@ class AppShell extends Component {
render() {
return (
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
);
}
}
diff --git a/webclient/src/containers/Login/Login.css b/webclient/src/containers/Login/Login.css
index 3bb97690..7166187a 100644
--- a/webclient/src/containers/Login/Login.css
+++ b/webclient/src/containers/Login/Login.css
@@ -185,11 +185,15 @@
margin-top: 30px;
}
-.login-footer_register {
+.login-footer__register {
margin-bottom: 10px;
font-weight: bold;
}
+.login-footer__language {
+ margin-top: 20px;
+}
+
.login-content__connectionStatus {
text-align: center;
margin: 20px 0;
diff --git a/webclient/src/containers/Login/Login.i18n.json b/webclient/src/containers/Login/Login.i18n.json
new file mode 100644
index 00000000..fecbd3f8
--- /dev/null
+++ b/webclient/src/containers/Login/Login.i18n.json
@@ -0,0 +1,6 @@
+{
+ "LoginContainer": {
+ "title": "Login",
+ "subtitle": "A cross-platform virtual tabletop for multiplayer card games."
+ }
+}
diff --git a/webclient/src/containers/Login/Login.tsx b/webclient/src/containers/Login/Login.tsx
index f107feb8..04153c98 100644
--- a/webclient/src/containers/Login/Login.tsx
+++ b/webclient/src/containers/Login/Login.tsx
@@ -1,4 +1,5 @@
import { useState, useCallback } from 'react';
+import { useTranslation } from 'react-i18next';
import { connect } from 'react-redux';
import { Redirect } from 'react-router-dom';
import { makeStyles } from '@material-ui/core/styles';
@@ -6,9 +7,9 @@ import Button from '@material-ui/core/Button';
import Paper from '@material-ui/core/Paper';
import Typography from '@material-ui/core/Typography';
-
import { AuthenticationService } from 'api';
import { RegistrationDialog, RequestPasswordResetDialog, ResetPasswordDialog, AccountActivationDialog } from 'dialogs';
+import { LanguageDropdown } from 'components';
import { LoginForm } from 'forms';
import { useReduxEffect, useFireOnce } from 'hooks';
import { Images } from 'images';
@@ -58,6 +59,8 @@ const useStyles = makeStyles(theme => ({
const Login = ({ state, description }: LoginProps) => {
const classes = useStyles();
+ const { t } = useTranslation();
+
const isConnected = AuthenticationService.isConnected(state);
const [hostIdToRemember, setHostIdToRemember] = useState(null);
@@ -239,8 +242,8 @@ const Login = ({ state, description }: LoginProps) => {
COCKATRICE
-