diff --git a/package-lock.json b/package-lock.json
index b7d247a8..ec5e6825 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -3066,18 +3066,9 @@
}
},
"cookie": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
- "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
- },
- "cookie-parser": {
- "version": "1.4.5",
- "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz",
- "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==",
- "requires": {
- "cookie": "0.4.0",
- "cookie-signature": "1.0.6"
- }
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
},
"cookie-signature": {
"version": "1.0.6",
@@ -4501,6 +4492,11 @@
"vary": "~1.1.2"
},
"dependencies": {
+ "cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+ },
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -4536,6 +4532,11 @@
"uid-safe": "~2.1.5"
},
"dependencies": {
+ "cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+ },
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
diff --git a/package.json b/package.json
index e8394b6e..bdc3d254 100644
--- a/package.json
+++ b/package.json
@@ -33,7 +33,7 @@
"bufferutil": "^4.0.3",
"compression": "^1.7.3",
"connect-redis": "^5.0.0",
- "cookie-parser": "^1.4.5",
+ "cookie": "^0.4.1",
"core-js": "^3.8.3",
"cors": "^2.8.4",
"etag": "^1.8.1",
diff --git a/src/components/ChatMessage.jsx b/src/components/ChatMessage.jsx
index 483d6595..d6526a07 100644
--- a/src/components/ChatMessage.jsx
+++ b/src/components/ChatMessage.jsx
@@ -41,7 +41,7 @@ function ChatMessage({
{
e.target.onerror = null;
e.target.src = './cf/xx.gif';
diff --git a/src/components/LanguageSelect.jsx b/src/components/LanguageSelect.jsx
new file mode 100644
index 00000000..e25f1a20
--- /dev/null
+++ b/src/components/LanguageSelect.jsx
@@ -0,0 +1,79 @@
+/*
+ * Language selection
+ * language is set with cookies and requires a refresh.
+ * Current language is set under window.lang by the server
+ * Available languages under window.langSel
+ * [['hz', 'am'], ['de', 'de'], ...]
+ * [languageCode, countryCode (for flag)]
+ * @flow
+ */
+import React, { useState, useEffect } from 'react';
+import { t } from 'ttag';
+import { MONTH } from '../core/constants';
+
+function LanguageSelect() {
+ if (!navigator.cookieEnabled) {
+ return null;
+ }
+
+ const { lang, langs } = window.ssv;
+
+ const [langSel, setLangSel] = useState(lang);
+ const [ccSel, setCCSel] = useState('xx');
+
+ useEffect(() => {
+ for (let i = 0; i < langs.length; i += 1) {
+ const [lc, cc] = langs[i];
+ if (lc === langSel) {
+ setCCSel(cc);
+ return;
+ }
+ }
+ }, [langSel]);
+
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default LanguageSelect;
diff --git a/src/components/SettingsModal.jsx b/src/components/SettingsModal.jsx
index fd90daf7..8a27e228 100644
--- a/src/components/SettingsModal.jsx
+++ b/src/components/SettingsModal.jsx
@@ -7,6 +7,7 @@ import React from 'react';
import { connect } from 'react-redux';
import { c, t } from 'ttag';
+import LanguageSelect from './LanguageSelect';
import MdToggleButtonHover from './MdToggleButtonHover';
import {
toggleGrid,
@@ -49,11 +50,12 @@ const rowStyles = {
};
const SettingsItemSelect = ({
- title, description, values, selected, onSelect,
+ title, description, values, selected, onSelect, icon,
}) => (
{title}
+ {(icon) &&
![]({icon})
}