diff --git a/components/common/DropDown.js b/components/common/DropDown.js
index b6b2357b..d240fbd6 100644
--- a/components/common/DropDown.js
+++ b/components/common/DropDown.js
@@ -37,7 +37,7 @@ export default function DropDown({
return (
- {options.find(e => e.value === value)?.label || value}
+
{options.find(e => e.value === value)?.label || value}
} className={styles.icon} size="small" />
{showMenu && (
diff --git a/components/common/Dropdown.module.css b/components/common/Dropdown.module.css
index 4b94f58f..9738b007 100644
--- a/components/common/Dropdown.module.css
+++ b/components/common/Dropdown.module.css
@@ -19,6 +19,10 @@
min-width: 160px;
}
+.text {
+ flex: 1;
+}
+
.icon {
padding-left: 20px;
}
diff --git a/components/common/UpdateNotice.js b/components/common/UpdateNotice.js
new file mode 100644
index 00000000..27ec562a
--- /dev/null
+++ b/components/common/UpdateNotice.js
@@ -0,0 +1,47 @@
+import React from 'react';
+import { FormattedMessage } from 'react-intl';
+import useVersion from 'hooks/useVersion';
+import styles from './UpdateNotice.module.css';
+import ButtonLayout from '../layout/ButtonLayout';
+import Button from './Button';
+import useForceUpdate from '../../hooks/useForceUpdate';
+
+export default function UpdateNotice() {
+ const forceUpdte = useForceUpdate();
+ const { hasUpdate, latest, updateCheck } = useVersion();
+
+ function handleViewClick() {
+ location.href = 'https://github.com/mikecao/umami/releases';
+ updateCheck();
+ forceUpdte();
+ }
+
+ function handleDismissClick() {
+ updateCheck();
+ forceUpdte();
+ }
+
+ if (!hasUpdate) {
+ return null;
+ }
+
+ return (
+
+ );
+}
diff --git a/components/common/UpdateNotice.module.css b/components/common/UpdateNotice.module.css
new file mode 100644
index 00000000..52a97c3b
--- /dev/null
+++ b/components/common/UpdateNotice.module.css
@@ -0,0 +1,13 @@
+.notice {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ padding-top: 10px;
+ font-size: var(--font-size-small);
+ font-weight: 600;
+}
+
+.message {
+ text-align: center;
+ margin-right: 20px;
+}
diff --git a/components/common/WorldMap.js b/components/common/WorldMap.js
index f6eec8d6..a24f7400 100644
--- a/components/common/WorldMap.js
+++ b/components/common/WorldMap.js
@@ -6,6 +6,8 @@ import tinycolor from 'tinycolor2';
import useTheme from 'hooks/useTheme';
import { THEME_COLORS } from 'lib/constants';
import styles from './WorldMap.module.css';
+import useCountryNames from 'hooks/useCountryNames';
+import useLocale from 'hooks/useLocale';
const geoUrl = '/world-110m.json';
@@ -21,6 +23,8 @@ export default function WorldMap({ data, className }) {
}),
[theme],
);
+ const [locale] = useLocale();
+ const countryNames = useCountryNames(locale);
function getFillColor(code) {
if (code === 'AQ') return;
@@ -39,10 +43,10 @@ export default function WorldMap({ data, className }) {
return code === 'AQ' ? 0 : 1;
}
- function handleHover({ ISO_A2: code, NAME: name }) {
+ function handleHover(code) {
if (code === 'AQ') return;
const country = data?.find(({ x }) => x === code);
- setTooltip(`${name}: ${country?.y || 0} visitors`);
+ setTooltip(`${countryNames[code]}: ${country?.y || 0} visitors`);
}
return (
@@ -70,7 +74,7 @@ export default function WorldMap({ data, className }) {
hover: { outline: 'none', fill: colors.hoverColor },
pressed: { outline: 'none' },
}}
- onMouseOver={() => handleHover(geo.properties)}
+ onMouseOver={() => handleHover(code)}
onMouseOut={() => setTooltip(null)}
/>
);
diff --git a/components/forms/AccountEditForm.js b/components/forms/AccountEditForm.js
index 16c6fd3f..ccce3463 100644
--- a/components/forms/AccountEditForm.js
+++ b/components/forms/AccountEditForm.js
@@ -1,6 +1,7 @@
import React, { useState } from 'react';
import { FormattedMessage } from 'react-intl';
import { Formik, Form, Field } from 'formik';
+import { useRouter } from 'next/router';
import { post } from 'lib/web';
import Button from 'components/common/Button';
import FormLayout, {
@@ -29,18 +30,17 @@ const validate = ({ user_id, username, password }) => {
};
export default function AccountEditForm({ values, onSave, onClose }) {
+ const { basePath } = useRouter();
const [message, setMessage] = useState();
const handleSubmit = async values => {
- const response = await post(`/api/account`, values);
+ const { ok, data } = await post(`${basePath}/api/account`, values);
- if (typeof response !== 'string') {
+ if (ok) {
onSave();
} else {
setMessage(
- response || (
-
- ),
+ data ||
,
);
}
};
diff --git a/components/forms/ChangePasswordForm.js b/components/forms/ChangePasswordForm.js
index e2f225b7..c41b6e6b 100644
--- a/components/forms/ChangePasswordForm.js
+++ b/components/forms/ChangePasswordForm.js
@@ -1,5 +1,6 @@
import React, { useState } from 'react';
import { FormattedMessage } from 'react-intl';
+import { useRouter } from 'next/router';
import { Formik, Form, Field } from 'formik';
import { post } from 'lib/web';
import Button from 'components/common/Button';
@@ -37,18 +38,17 @@ const validate = ({ current_password, new_password, confirm_password }) => {
};
export default function ChangePasswordForm({ values, onSave, onClose }) {
+ const { basePath } = useRouter();
const [message, setMessage] = useState();
const handleSubmit = async values => {
- const response = await post(`/api/account/password`, values);
+ const { ok, data } = await post(`${basePath}/api/account/password`, values);
- if (typeof response !== 'string') {
+ if (ok) {
onSave();
} else {
setMessage(
- response || (
-
- ),
+ data ||
,
);
}
};
diff --git a/components/forms/DeleteForm.js b/components/forms/DeleteForm.js
index f53b286f..689cd1fc 100644
--- a/components/forms/DeleteForm.js
+++ b/components/forms/DeleteForm.js
@@ -1,4 +1,6 @@
import React, { useState } from 'react';
+import { FormattedMessage } from 'react-intl';
+import { useRouter } from 'next/router';
import { Formik, Form, Field } from 'formik';
import { del } from 'lib/web';
import Button from 'components/common/Button';
@@ -8,7 +10,6 @@ import FormLayout, {
FormMessage,
FormRow,
} from 'components/layout/FormLayout';
-import { FormattedMessage } from 'react-intl';
const CONFIRMATION_WORD = 'DELETE';
@@ -27,15 +28,18 @@ const validate = ({ confirmation }) => {
};
export default function DeleteForm({ values, onSave, onClose }) {
+ const { basePath } = useRouter();
const [message, setMessage] = useState();
const handleSubmit = async ({ type, id }) => {
- const response = await del(`/api/${type}/${id}`);
+ const { ok, data } = await del(`${basePath}/api/${type}/${id}`);
- if (typeof response !== 'string') {
+ if (ok) {
onSave();
} else {
- setMessage(
);
+ setMessage(
+ data ||
,
+ );
}
};
diff --git a/components/forms/LoginForm.js b/components/forms/LoginForm.js
index a34a4474..3866f240 100644
--- a/components/forms/LoginForm.js
+++ b/components/forms/LoginForm.js
@@ -1,7 +1,7 @@
import React, { useState } from 'react';
import { FormattedMessage } from 'react-intl';
import { Formik, Form, Field } from 'formik';
-import Router from 'next/router';
+import { useRouter } from 'next/router';
import { post } from 'lib/web';
import Button from 'components/common/Button';
import FormLayout, {
@@ -28,22 +28,26 @@ const validate = ({ username, password }) => {
};
export default function LoginForm() {
+ const router = useRouter();
const [message, setMessage] = useState();
const handleSubmit = async ({ username, password }) => {
- const response = await post('/api/auth/login', { username, password });
+ const { ok, status, data } = await post(`${router.basePath}/api/auth/login`, {
+ username,
+ password,
+ });
- if (typeof response !== 'string') {
- await Router.push('/');
+ if (ok) {
+ return router.push('/');
} else {
setMessage(
- response.startsWith('401') ? (
+ status === 401 ? (
) : (
- response
+ data
),
);
}
diff --git a/components/forms/WebsiteEditForm.js b/components/forms/WebsiteEditForm.js
index 7d405e52..3432c2a4 100644
--- a/components/forms/WebsiteEditForm.js
+++ b/components/forms/WebsiteEditForm.js
@@ -11,6 +11,7 @@ import FormLayout, {
} from 'components/layout/FormLayout';
import Checkbox from 'components/common/Checkbox';
import { DOMAIN_REGEX } from 'lib/constants';
+import { useRouter } from 'next/router';
const initialValues = {
name: '',
@@ -34,15 +35,18 @@ const validate = ({ name, domain }) => {
};
export default function WebsiteEditForm({ values, onSave, onClose }) {
+ const { basePath } = useRouter();
const [message, setMessage] = useState();
const handleSubmit = async values => {
- const response = await post(`/api/website`, values);
+ const { ok, data } = await post(`${basePath}/api/website`, values);
- if (typeof response !== 'string') {
+ if (ok) {
onSave();
} else {
- setMessage(
);
+ setMessage(
+ data ||
,
+ );
}
};
diff --git a/components/layout/Header.js b/components/layout/Header.js
index 639db7ea..c48fdd11 100644
--- a/components/layout/Header.js
+++ b/components/layout/Header.js
@@ -6,6 +6,7 @@ import Link from 'components/common/Link';
import Icon from 'components/common/Icon';
import LanguageButton from 'components/settings/LanguageButton';
import ThemeButton from 'components/settings/ThemeButton';
+import UpdateNotice from 'components/common/UpdateNotice';
import UserButton from 'components/settings/UserButton';
import Logo from 'assets/logo.svg';
import styles from './Header.module.css';
@@ -15,6 +16,7 @@ export default function Header() {
return (
+ {user?.is_admin && }
diff --git a/components/layout/Page.js b/components/layout/Page.js
index c9a928c5..28492ddf 100644
--- a/components/layout/Page.js
+++ b/components/layout/Page.js
@@ -1,6 +1,7 @@
import React from 'react';
+import classNames from 'classnames';
import styles from './Page.module.css';
-export default function Page({ children }) {
- return
{children}
;
+export default function Page({ className, children }) {
+ return
{children}
;
}
diff --git a/components/layout/PageHeader.module.css b/components/layout/PageHeader.module.css
index 74f7d1a2..263bd5b7 100644
--- a/components/layout/PageHeader.module.css
+++ b/components/layout/PageHeader.module.css
@@ -4,4 +4,5 @@
align-items: center;
align-content: center;
min-height: 80px;
+ align-self: stretch;
}
diff --git a/components/metrics/CountriesTable.js b/components/metrics/CountriesTable.js
index 58548d06..d562b464 100644
--- a/components/metrics/CountriesTable.js
+++ b/components/metrics/CountriesTable.js
@@ -1,9 +1,18 @@
import React from 'react';
import MetricsTable from './MetricsTable';
-import { countryFilter, percentFilter } from 'lib/filters';
+import { percentFilter } from 'lib/filters';
import { FormattedMessage } from 'react-intl';
+import useCountryNames from 'hooks/useCountryNames';
+import useLocale from 'hooks/useLocale';
export default function CountriesTable({ websiteId, token, limit, onDataLoad = () => {} }) {
+ const [locale] = useLocale();
+ const countryNames = useCountryNames(locale);
+
+ function renderLabel({ x }) {
+ return
{countryNames[x]}
;
+ }
+
return (
}
@@ -12,8 +21,8 @@ export default function CountriesTable({ websiteId, token, limit, onDataLoad = (
websiteId={websiteId}
token={token}
limit={limit}
- dataFilter={countryFilter}
onDataLoad={data => onDataLoad(percentFilter(data))}
+ renderLabel={renderLabel}
/>
);
}
diff --git a/components/metrics/WebsiteChart.js b/components/metrics/WebsiteChart.js
index 99c03951..ea86ad3e 100644
--- a/components/metrics/WebsiteChart.js
+++ b/components/metrics/WebsiteChart.js
@@ -59,7 +59,7 @@ export default function WebsiteChart({
}
return (
- <>
+
- >
+
);
}
diff --git a/components/metrics/WebsiteChart.module.css b/components/metrics/WebsiteChart.module.css
index 29f94670..0e947aea 100644
--- a/components/metrics/WebsiteChart.module.css
+++ b/components/metrics/WebsiteChart.module.css
@@ -1,6 +1,7 @@
.container {
display: flex;
flex-direction: column;
+ align-self: stretch;
}
.title {
diff --git a/components/settings/Settings.js b/components/pages/Settings.js
similarity index 85%
rename from components/settings/Settings.js
rename to components/pages/Settings.js
index be9feb35..35d039df 100644
--- a/components/settings/Settings.js
+++ b/components/pages/Settings.js
@@ -2,9 +2,9 @@ import React, { useState } from 'react';
import { useRouter } from 'next/router';
import Page from 'components/layout/Page';
import MenuLayout from 'components/layout/MenuLayout';
-import WebsiteSettings from './WebsiteSettings';
-import AccountSettings from './AccountSettings';
-import ProfileSettings from './ProfileSettings';
+import WebsiteSettings from '../settings/WebsiteSettings';
+import AccountSettings from '../settings/AccountSettings';
+import ProfileSettings from '../settings/ProfileSettings';
import { useSelector } from 'react-redux';
import { FormattedMessage } from 'react-intl';
@@ -26,7 +26,7 @@ export default function Settings() {
{
label:
,
value: ACCOUNTS,
- hidden: !user.is_admin,
+ hidden: !user?.is_admin,
},
{
label:
,
diff --git a/components/pages/Test.module.css b/components/pages/Test.module.css
new file mode 100644
index 00000000..78977c55
--- /dev/null
+++ b/components/pages/Test.module.css
@@ -0,0 +1,5 @@
+.test {
+ border: 1px solid var(--gray200);
+ border-radius: 5px;
+ padding: 0 20px 20px 20px;
+}
diff --git a/components/pages/TestConsole.js b/components/pages/TestConsole.js
new file mode 100644
index 00000000..f6fa8a23
--- /dev/null
+++ b/components/pages/TestConsole.js
@@ -0,0 +1,94 @@
+import React, { useState } from 'react';
+import { useSelector } from 'react-redux';
+import classNames from 'classnames';
+import Head from 'next/head';
+import Link from 'next/link';
+import Page from '../layout/Page';
+import PageHeader from '../layout/PageHeader';
+import useFetch from '../../hooks/useFetch';
+import DropDown from '../common/DropDown';
+import styles from './Test.module.css';
+import WebsiteChart from '../metrics/WebsiteChart';
+import EventsChart from '../metrics/EventsChart';
+import Button from '../common/Button';
+import EmptyPlaceholder from '../common/EmptyPlaceholder';
+
+export default function TestConsole() {
+ const user = useSelector(state => state.user);
+ const [website, setWebsite] = useState();
+ const { data } = useFetch('/api/websites');
+
+ if (!data || !user?.is_admin) {
+ return null;
+ }
+
+ const options = data.map(({ name, website_id }) => ({ label: name, value: website_id }));
+ const selectedValue = options.find(({ value }) => value === website?.website_id)?.value;
+
+ function handleSelect(value) {
+ setWebsite(data.find(({ website_id }) => website_id === value));
+ }
+
+ function handleClick() {
+ window.umami('event (default)');
+ window.umami.trackView('/page-view', 'https://www.google.com');
+ window.umami.trackEvent('event (custom)', 'custom-type');
+ }
+
+ return (
+
+
+ {typeof window !== 'undefined' && website && (
+
+ )}
+
+
+ Test Console
+
+
+ {!selectedValue && }
+ {selectedValue && (
+ <>
+
+
+
+
CSS events
+
+ Send event
+
+
+
+
Javascript events
+
+ Run script
+
+
+
+
+ >
+ )}
+
+ );
+}
diff --git a/components/WebsiteDetails.js b/components/pages/WebsiteDetails.js
similarity index 86%
rename from components/WebsiteDetails.js
rename to components/pages/WebsiteDetails.js
index b38f55de..66545928 100644
--- a/components/WebsiteDetails.js
+++ b/components/pages/WebsiteDetails.js
@@ -9,14 +9,14 @@ import Link from 'components/common/Link';
import Loading from 'components/common/Loading';
import Arrow from 'assets/arrow-right.svg';
import styles from './WebsiteDetails.module.css';
-import PagesTable from './metrics/PagesTable';
-import ReferrersTable from './metrics/ReferrersTable';
-import BrowsersTable from './metrics/BrowsersTable';
-import OSTable from './metrics/OSTable';
-import DevicesTable from './metrics/DevicesTable';
-import CountriesTable from './metrics/CountriesTable';
-import EventsTable from './metrics/EventsTable';
-import EventsChart from './metrics/EventsChart';
+import PagesTable from '../metrics/PagesTable';
+import ReferrersTable from '../metrics/ReferrersTable';
+import BrowsersTable from '../metrics/BrowsersTable';
+import OSTable from '../metrics/OSTable';
+import DevicesTable from '../metrics/DevicesTable';
+import CountriesTable from '../metrics/CountriesTable';
+import EventsTable from '../metrics/EventsTable';
+import EventsChart from '../metrics/EventsChart';
import useFetch from 'hooks/useFetch';
import usePageQuery from 'hooks/usePageQuery';
@@ -42,16 +42,17 @@ export default function WebsiteDetails({ websiteId, token }) {
} = usePageQuery();
const BackButton = () => (
-
}
- size="small"
- >
-
-
+
+ }
+ size="small"
+ >
+
+
+
);
const menuOptions = [
diff --git a/components/WebsiteDetails.module.css b/components/pages/WebsiteDetails.module.css
similarity index 92%
rename from components/WebsiteDetails.module.css
rename to components/pages/WebsiteDetails.module.css
index 0e1065c6..750a1ac7 100644
--- a/components/WebsiteDetails.module.css
+++ b/components/pages/WebsiteDetails.module.css
@@ -16,6 +16,9 @@
}
.backButton {
+ display: flex;
+ justify-content: center;
+ align-items: center;
margin-bottom: 16px;
}
diff --git a/components/WebsiteList.js b/components/pages/WebsiteList.js
similarity index 100%
rename from components/WebsiteList.js
rename to components/pages/WebsiteList.js
diff --git a/components/WebsiteList.module.css b/components/pages/WebsiteList.module.css
similarity index 87%
rename from components/WebsiteList.module.css
rename to components/pages/WebsiteList.module.css
index 942b71b2..816c5f36 100644
--- a/components/WebsiteList.module.css
+++ b/components/pages/WebsiteList.module.css
@@ -2,6 +2,7 @@
padding-bottom: 30px;
border-bottom: 1px solid var(--gray300);
margin-bottom: 30px;
+ align-self: stretch;
}
.website:last-child {
diff --git a/components/settings/ProfileSettings.js b/components/settings/ProfileSettings.js
index e23c73ed..6fe18d19 100644
--- a/components/settings/ProfileSettings.js
+++ b/components/settings/ProfileSettings.js
@@ -10,6 +10,7 @@ import TimezoneSetting from 'components/settings/TimezoneSetting';
import Dots from 'assets/ellipsis-h.svg';
import styles from './ProfileSettings.module.css';
import DateRangeSetting from './DateRangeSetting';
+import useEscapeKey from 'hooks/useEscapeKey';
export default function ProfileSettings() {
const user = useSelector(state => state.user);
@@ -22,6 +23,10 @@ export default function ProfileSettings() {
setMessage(
);
}
+ useEscapeKey(() => {
+ setChangePassword(false);
+ });
+
return (
<>
diff --git a/hooks/useCountryNames.js b/hooks/useCountryNames.js
new file mode 100644
index 00000000..e631aecd
--- /dev/null
+++ b/hooks/useCountryNames.js
@@ -0,0 +1,34 @@
+import { useState, useEffect } from 'react';
+import { useRouter } from 'next/router';
+import { get } from 'lib/web';
+import enUS from 'public/country/en-US.json';
+
+const countryNames = {
+ 'en-US': enUS,
+};
+
+export default function useCountryNames(locale) {
+ const [list, setList] = useState(countryNames[locale] || enUS);
+ const { basePath } = useRouter();
+
+ async function loadData(locale) {
+ const { ok, data } = await get(`${basePath}/country/${locale}.json`);
+
+ if (ok) {
+ countryNames[locale] = data;
+ setList(countryNames[locale]);
+ } else {
+ setList(enUS);
+ }
+ }
+
+ useEffect(() => {
+ if (!countryNames[locale]) {
+ loadData(locale);
+ } else {
+ setList(countryNames[locale]);
+ }
+ }, [locale]);
+
+ return list;
+}
diff --git a/hooks/useEscapeKey.js b/hooks/useEscapeKey.js
new file mode 100644
index 00000000..b8020c31
--- /dev/null
+++ b/hooks/useEscapeKey.js
@@ -0,0 +1,19 @@
+import { useEffect, useCallback } from 'react';
+
+export default function useEscapeKey(handler) {
+ const escFunction = useCallback(event => {
+ if (event.keyCode === 27) {
+ handler(event);
+ }
+ }, []);
+
+ useEffect(() => {
+ document.addEventListener('keydown', escFunction, false);
+
+ return () => {
+ document.removeEventListener('keydown', escFunction, false);
+ };
+ }, [escFunction]);
+
+ return null;
+}
diff --git a/hooks/useFetch.js b/hooks/useFetch.js
index a99778ae..907f45af 100644
--- a/hooks/useFetch.js
+++ b/hooks/useFetch.js
@@ -2,12 +2,15 @@ import { useState, useEffect } from 'react';
import { useDispatch } from 'react-redux';
import { get } from 'lib/web';
import { updateQuery } from 'redux/actions/queries';
+import { useRouter } from 'next/router';
export default function useFetch(url, params = {}, options = {}) {
const dispatch = useDispatch();
const [data, setData] = useState();
+ const [status, setStatus] = useState();
const [error, setError] = useState();
const [loading, setLoadiing] = useState(false);
+ const { basePath } = useRouter();
const keys = Object.keys(params)
.sort()
.map(key => params[key]);
@@ -18,11 +21,12 @@ export default function useFetch(url, params = {}, options = {}) {
setLoadiing(true);
setError(null);
const time = performance.now();
- const data = await get(url, params);
+ const { data, status } = await get(`${basePath}${url}`, params);
dispatch(updateQuery({ url, time: performance.now() - time, completed: Date.now() }));
setData(data);
+ setStatus(status);
onDataLoad(data);
} catch (e) {
console.error(e);
@@ -46,5 +50,5 @@ export default function useFetch(url, params = {}, options = {}) {
}
}, [url, ...keys, ...update]);
- return { data, error, loading, loadData };
+ return { data, status, error, loading };
}
diff --git a/hooks/useRequireLogin.js b/hooks/useRequireLogin.js
index ffebfca8..5fb93e76 100644
--- a/hooks/useRequireLogin.js
+++ b/hooks/useRequireLogin.js
@@ -1,6 +1,8 @@
import { useState, useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { updateUser } from 'redux/actions/user';
+import { useRouter } from 'next/router';
+import { get } from '../lib/web';
export async function fetchUser() {
const res = await fetch('/api/auth/verify');
@@ -13,29 +15,33 @@ export async function fetchUser() {
}
export default function useRequireLogin() {
+ const router = useRouter();
const dispatch = useDispatch();
const storeUser = useSelector(state => state.user);
const [loading, setLoading] = useState(!storeUser);
const [user, setUser] = useState(storeUser);
+ async function loadUser() {
+ setLoading(true);
+
+ const { ok, data } = await get(`${router.basePath}/api/auth/verify`);
+
+ if (!ok) {
+ return router.push('/login');
+ }
+
+ await dispatch(updateUser(data));
+
+ setUser(user);
+ setLoading(false);
+ }
+
useEffect(() => {
if (!loading && user) {
return;
}
- setLoading(true);
-
- fetchUser().then(async user => {
- if (!user) {
- window.location.href = '/login';
- return;
- }
-
- await dispatch(updateUser(user));
-
- setUser(user);
- setLoading(false);
- });
+ loadUser();
}, []);
return { user, loading };
diff --git a/hooks/useTheme.js b/hooks/useTheme.js
index 7ce158b7..cc610756 100644
--- a/hooks/useTheme.js
+++ b/hooks/useTheme.js
@@ -4,7 +4,7 @@ import { getItem, setItem } from 'lib/web';
import { THEME_CONFIG } from 'lib/constants';
import { useEffect } from 'react';
-export default function useLocale() {
+export default function useTheme() {
const theme = useSelector(state => state.app.theme || getItem(THEME_CONFIG) || 'light');
const dispatch = useDispatch();
diff --git a/hooks/useTimezone.js b/hooks/useTimezone.js
index 5de39f9a..5032a6de 100644
--- a/hooks/useTimezone.js
+++ b/hooks/useTimezone.js
@@ -1,13 +1,14 @@
import { useState, useCallback } from 'react';
import { getTimezone } from 'lib/date';
import { getItem, setItem } from 'lib/web';
+import { TIMEZONE_CONFIG } from 'lib/constants';
export default function useTimezone() {
- const [timezone, setTimezone] = useState(getItem('umami.timezone') || getTimezone());
+ const [timezone, setTimezone] = useState(getItem(TIMEZONE_CONFIG) || getTimezone());
const saveTimezone = useCallback(
value => {
- setItem('umami.timezone', value);
+ setItem(TIMEZONE_CONFIG, value);
setTimezone(value);
},
[setTimezone],
diff --git a/hooks/useVersion.js b/hooks/useVersion.js
new file mode 100644
index 00000000..d8e3d699
--- /dev/null
+++ b/hooks/useVersion.js
@@ -0,0 +1,27 @@
+import { useEffect, useCallback } from 'react';
+import { useDispatch, useSelector } from 'react-redux';
+import semver from 'semver';
+import { getItem, setItem } from 'lib/web';
+import { checkVersion } from 'redux/actions/app';
+import { VERSION_CHECK } from 'lib/constants';
+
+export default function useVersion() {
+ const dispatch = useDispatch();
+ const versions = useSelector(state => state.app.versions);
+ const lastCheck = getItem(VERSION_CHECK);
+
+ const { current, latest } = versions;
+ const hasUpdate = latest && semver.gt(latest, current) && lastCheck?.version !== latest;
+
+ const updateCheck = useCallback(() => {
+ setItem(VERSION_CHECK, { version: latest, time: Date.now() });
+ }, [versions]);
+
+ useEffect(() => {
+ if (!versions.latest) {
+ dispatch(checkVersion());
+ }
+ }, [versions]);
+
+ return { ...versions, hasUpdate, updateCheck };
+}
diff --git a/lang/da-DK.json b/lang/da-DK.json
index c4940630..cd96cb3f 100644
--- a/lang/da-DK.json
+++ b/lang/da-DK.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "Kopier til udklipsholder",
"button.date-range": "Datointerval",
"button.delete": "Slet",
+ "button.dismiss": "Dismiss",
"button.edit": "Rediger",
"button.login": "Log ind",
"button.more": "Mere",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "Få sporingskode",
"message.go-to-settings": "Gå til betjeningspanel",
"message.incorrect-username-password": "Ugyldigt brugernavn/adgangskode.",
+ "message.new-version-available": "A new version of umami {version} is available!",
"message.no-data-available": "Ingen data tilgængelig.",
"message.no-websites-configured": "Du har ikke konfigureret nogen websteder.",
"message.page-not-found": "Side ikke fundet.",
diff --git a/lang/de-DE.json b/lang/de-DE.json
index f960d1eb..7c45d131 100644
--- a/lang/de-DE.json
+++ b/lang/de-DE.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "In die Zwischenablage kopieren",
"button.date-range": "Datumsbereich",
"button.delete": "Löschen",
+ "button.dismiss": "Dismiss",
"button.edit": "Bearbeiten",
"button.login": "Anmelden",
"button.more": "Mehr",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "Erstelle Tracking Kennung",
"message.go-to-settings": "Zu den Einstellungen",
"message.incorrect-username-password": "Falsches Passwort oder Benutzername.",
+ "message.new-version-available": "A new version of umami {version} is available!",
"message.no-data-available": "Keine Daten vorhanden.",
"message.no-websites-configured": "Es ist keine Webseite vorhanden.",
"message.page-not-found": "Seite nicht gefunden.",
diff --git a/lang/el-GR.json b/lang/el-GR.json
index 4b1405e5..14cd69ca 100644
--- a/lang/el-GR.json
+++ b/lang/el-GR.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "Αντιγραφή στο πρόχειρο",
"button.date-range": "Εύρος ημερομηνιών",
"button.delete": "Διαγραφή",
+ "button.dismiss": "Dismiss",
"button.edit": "Επεξεργασία",
"button.login": "Είσοδος",
"button.more": "Περισσότερα",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "Λήψη κώδικα παρακολούθησης",
"message.go-to-settings": "Μεταβείτε στις ρυθμίσεις",
"message.incorrect-username-password": "Εσφαλμένο όνομα χρήστη / κωδικός πρόσβασης.",
+ "message.new-version-available": "A new version of umami {version} is available!",
"message.no-data-available": "Δεν υπάρχουν διαθέσιμα δεδομένα.",
"message.no-websites-configured": "Δεν έχετε ρυθμίσει κανένα ιστότοπο.",
"message.page-not-found": "Η σελίδα δεν βρέθηκε.",
diff --git a/lang/en-US.json b/lang/en-US.json
index 54ee8cad..7c513b95 100644
--- a/lang/en-US.json
+++ b/lang/en-US.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "Copy to clipboard",
"button.date-range": "Date range",
"button.delete": "Delete",
+ "button.dismiss": "Dismiss",
"button.edit": "Edit",
"button.login": "Login",
"button.more": "More",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "Get tracking code",
"message.go-to-settings": "Go to settings",
"message.incorrect-username-password": "Incorrect username/password.",
+ "message.new-version-available": "A new version of umami {version} is available!",
"message.no-data-available": "No data available.",
"message.no-websites-configured": "You don't have any websites configured.",
"message.page-not-found": "Page not found.",
diff --git a/lang/es-MX.json b/lang/es-MX.json
index ed8cf1a2..16d911ea 100644
--- a/lang/es-MX.json
+++ b/lang/es-MX.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "Copiar al portapapeles",
"button.date-range": "Date range",
"button.delete": "Eliminar",
+ "button.dismiss": "Dismiss",
"button.edit": "Editar",
"button.login": "Iniciar sesión",
"button.more": "Más",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "Obtener código de rastreo",
"message.go-to-settings": "Ir a la configuración",
"message.incorrect-username-password": "Nombre de usuario o contraseña incorrectos.",
+ "message.new-version-available": "A new version of umami {version} is available!",
"message.no-data-available": "Sin información disponible.",
"message.no-websites-configured": "No tienes ningún sitio configurado.",
"message.page-not-found": "Page not found",
diff --git a/lang/fo-FO.json b/lang/fo-FO.json
index 800f91c7..db9e972b 100644
--- a/lang/fo-FO.json
+++ b/lang/fo-FO.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "Kopier til clipboard",
"button.date-range": "Vel dato",
"button.delete": "Sletta",
+ "button.dismiss": "Dismiss",
"button.edit": "Ger broyting",
"button.login": "Rita inn",
"button.more": "Meira",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "Fá sporings kotu",
"message.go-to-settings": "Far til stillingar",
"message.incorrect-username-password": "Skeivt brúkaranavn/loyniorð.",
+ "message.new-version-available": "A new version of umami {version} is available!",
"message.no-data-available": "Einki data tøk.",
"message.no-websites-configured": "Tú hevur ongar heimasíður stillaða til.",
"message.page-not-found": "Síðan bleiv ikki funnin.",
diff --git a/lang/fr-FR.json b/lang/fr-FR.json
index 8cfedb33..762cae34 100644
--- a/lang/fr-FR.json
+++ b/lang/fr-FR.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "Copier dans le presse papier",
"button.date-range": "Date range",
"button.delete": "Supprimer",
+ "button.dismiss": "Dismiss",
"button.edit": "Modifier",
"button.login": "Connexion",
"button.more": "Plus",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "Obtenez le code de suivi",
"message.go-to-settings": "Aller aux paramètres",
"message.incorrect-username-password": "nom d'utilisateurs/mot de passe incorrect.",
+ "message.new-version-available": "A new version of umami {version} is available!",
"message.no-data-available": "Pas de données disponibles.",
"message.no-websites-configured": "Vous n'avez configuré aucun site Web.",
"message.page-not-found": "Page non trouvée.",
diff --git a/lang/ja-JP.json b/lang/ja-JP.json
index b15e0c92..51cdaec1 100644
--- a/lang/ja-JP.json
+++ b/lang/ja-JP.json
@@ -5,8 +5,9 @@
"button.cancel": "キャンセル",
"button.change-password": "パスワード変更",
"button.copy-to-clipboard": "クリップボードにコピー",
- "button.date-range": "期間",
+ "button.date-range": "日付範囲",
"button.delete": "削除",
+ "button.dismiss": "無視する",
"button.edit": "編集",
"button.login": "ログイン",
"button.more": "さらに表示",
@@ -14,7 +15,7 @@
"button.reset": "リセット",
"button.save": "保存",
"button.single-day": "一日のみ",
- "button.view-details": "詳細表示",
+ "button.view-details": "詳細を見る",
"label.accounts": "アカウント",
"label.administrator": "管理者",
"label.confirm-password": "パスワード(確認)",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "トラッキングコードを取得",
"message.go-to-settings": "設定する",
"message.incorrect-username-password": "ユーザー名/パスワードが正しくありません。",
+ "message.new-version-available": "新しいバージョン({version})が利用可能です!",
"message.no-data-available": "データがありません。",
"message.no-websites-configured": "Webサイトが設定されていません。",
"message.page-not-found": "ページが見つかりません。",
diff --git a/lang/mn-MN.json b/lang/mn-MN.json
index 377c81b1..b3c033cd 100644
--- a/lang/mn-MN.json
+++ b/lang/mn-MN.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "Хуулах",
"button.date-range": "Хугацааны мужид",
"button.delete": "Устгах",
+ "button.dismiss": "Dismiss",
"button.edit": "Засах",
"button.login": "Нэвтрэх",
"button.more": "Цааш",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "Мөрдөх код авах",
"message.go-to-settings": "Тохиргоо руу очих",
"message.incorrect-username-password": "Буруу хэрэглэгчийн нэр/нууц үг.",
+ "message.new-version-available": "A new version of umami {version} is available!",
"message.no-data-available": "Өгөгдөл алга.",
"message.no-websites-configured": "Та ямар нэгэн веб тохируулаагүй байна.",
"message.page-not-found": "Хуудас олдсонгүй.",
diff --git a/lang/nl-NL.json b/lang/nl-NL.json
index 3ebfcd14..148fd32e 100644
--- a/lang/nl-NL.json
+++ b/lang/nl-NL.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "Kopiëer naar klembord",
"button.date-range": "Datumbereik",
"button.delete": "Verwijderen",
+ "button.dismiss": "Dismiss",
"button.edit": "Bewerken",
"button.login": "Inloggen",
"button.more": "Toon meer",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "Tracking code",
"message.go-to-settings": "Naar instellingen",
"message.incorrect-username-password": "Incorrecte gebruikersnaam/wachtwoord.",
+ "message.new-version-available": "A new version of umami {version} is available!",
"message.no-data-available": "Geen gegevens beschikbaar.",
"message.no-websites-configured": "Je hebt geen websites ingesteld.",
"message.page-not-found": "Pagina niet gevonden.",
diff --git a/lang/ru-RU.json b/lang/ru-RU.json
index b9e19336..62a70a7c 100644
--- a/lang/ru-RU.json
+++ b/lang/ru-RU.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "Скопировать в буфер обмена",
"button.date-range": "Диапазон дат",
"button.delete": "Удалить",
+ "button.dismiss": "Dismiss",
"button.edit": "Редактировать",
"button.login": "Войти",
"button.more": "Больше",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "Получить код отслеживания",
"message.go-to-settings": "Перейти к настройкам",
"message.incorrect-username-password": "Неверное имя пользователя/пароль.",
+ "message.new-version-available": "A new version of umami {version} is available!",
"message.no-data-available": "Нет данных.",
"message.no-websites-configured": "У вас нет настроенных сайтов.",
"message.page-not-found": "Страница не найдена.",
diff --git a/lang/sv-SE.json b/lang/sv-SE.json
index 1a14b60d..9e5e5958 100644
--- a/lang/sv-SE.json
+++ b/lang/sv-SE.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "Kopiera till urklipp",
"button.date-range": "Datumomfång",
"button.delete": "Radera",
+ "button.dismiss": "Dismiss",
"button.edit": "Redigera",
"button.login": "Logga in",
"button.more": "Mer",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "Visa spårningskod",
"message.go-to-settings": "Gå till inställningar",
"message.incorrect-username-password": "Felaktikt användarnamn/lösenord.",
+ "message.new-version-available": "A new version of umami {version} is available!",
"message.no-data-available": "Ingen data tillgänglig.",
"message.no-websites-configured": "Du har inga webbsajter.",
"message.page-not-found": "Sidan kan inte hittas.",
diff --git a/lang/tr-TR.json b/lang/tr-TR.json
index d8748359..2e84051d 100644
--- a/lang/tr-TR.json
+++ b/lang/tr-TR.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "Panoya kopyala",
"button.date-range": "Tarih aralığı",
"button.delete": "Sil",
+ "button.dismiss": "Dismiss",
"button.edit": "Düzenle",
"button.login": "Giriş Yap",
"button.more": "Detaylı göster",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "İzleme kodunu al",
"message.go-to-settings": "Ayarlara git",
"message.incorrect-username-password": "Hatalı kullanıcı adı ya da parola.",
+ "message.new-version-available": "A new version of umami {version} is available!",
"message.no-data-available": "Henüz hiç veri yok.",
"message.no-websites-configured": "Henüz hiç web sitesi tanımlamadınız",
"message.page-not-found": "Sayfa bulunamadı.",
@@ -92,4 +94,4 @@
"title.edit-website": "Web sitesini düzenle",
"title.share-url": "Paylaşım adresi",
"title.tracking-code": "İzleme kodu"
-}
\ No newline at end of file
+}
diff --git a/lang/zh-CN.json b/lang/zh-CN.json
index a51a42be..d5bf54cd 100644
--- a/lang/zh-CN.json
+++ b/lang/zh-CN.json
@@ -7,6 +7,7 @@
"button.copy-to-clipboard": "复制",
"button.date-range": "多日",
"button.delete": "删除",
+ "button.dismiss": "Dismiss",
"button.edit": "编辑",
"button.login": "登录",
"button.more": "更多",
@@ -54,6 +55,7 @@
"message.get-tracking-code": "获得跟踪代码",
"message.go-to-settings": "去设置",
"message.incorrect-username-password": "用户名密码不正确.",
+ "message.new-version-available": "A new version of umami {version} is available!",
"message.no-data-available": "无可用数据.",
"message.no-websites-configured": "你还没有设置任何网站.",
"message.page-not-found": "网页未找到.",
diff --git a/lib/constants.js b/lib/constants.js
index 8acbf0b6..87e0cf1d 100644
--- a/lib/constants.js
+++ b/lib/constants.js
@@ -3,6 +3,7 @@ export const LOCALE_CONFIG = 'umami.locale';
export const TIMEZONE_CONFIG = 'umami.timezone';
export const DATE_RANGE_CONFIG = 'umami.date-range';
export const THEME_CONFIG = 'umami.theme';
+export const VERSION_CHECK = 'umami.version-check';
export const THEME_COLORS = {
light: {
@@ -131,251 +132,3 @@ export const BROWSERS = {
'ios-webview': 'iOS (webview)',
searchbot: 'Searchbot',
};
-
-export const ISO_COUNTRIES = {
- AF: 'Afghanistan',
- AX: 'Aland Islands',
- AL: 'Albania',
- DZ: 'Algeria',
- AS: 'American Samoa',
- AD: 'Andorra',
- AO: 'Angola',
- AI: 'Anguilla',
- AQ: 'Antarctica',
- AG: 'Antigua And Barbuda',
- AR: 'Argentina',
- AM: 'Armenia',
- AW: 'Aruba',
- AU: 'Australia',
- AT: 'Austria',
- AZ: 'Azerbaijan',
- BS: 'Bahamas',
- BH: 'Bahrain',
- BD: 'Bangladesh',
- BB: 'Barbados',
- BY: 'Belarus',
- BE: 'Belgium',
- BZ: 'Belize',
- BJ: 'Benin',
- BM: 'Bermuda',
- BT: 'Bhutan',
- BO: 'Bolivia',
- BA: 'Bosnia And Herzegovina',
- BW: 'Botswana',
- BV: 'Bouvet Island',
- BR: 'Brazil',
- IO: 'British Indian Ocean Territory',
- BN: 'Brunei Darussalam',
- BG: 'Bulgaria',
- BF: 'Burkina Faso',
- BI: 'Burundi',
- KH: 'Cambodia',
- CM: 'Cameroon',
- CA: 'Canada',
- CV: 'Cape Verde',
- KY: 'Cayman Islands',
- CF: 'Central African Republic',
- TD: 'Chad',
- CL: 'Chile',
- CN: 'China',
- CX: 'Christmas Island',
- CC: 'Cocos (Keeling) Islands',
- CO: 'Colombia',
- KM: 'Comoros',
- CG: 'Congo',
- CD: 'Congo, Democratic Republic',
- CK: 'Cook Islands',
- CR: 'Costa Rica',
- CI: "Cote D'Ivoire",
- HR: 'Croatia',
- CU: 'Cuba',
- CY: 'Cyprus',
- CZ: 'Czech Republic',
- DK: 'Denmark',
- DJ: 'Djibouti',
- DM: 'Dominica',
- DO: 'Dominican Republic',
- EC: 'Ecuador',
- EG: 'Egypt',
- SV: 'El Salvador',
- GQ: 'Equatorial Guinea',
- ER: 'Eritrea',
- EE: 'Estonia',
- ET: 'Ethiopia',
- FK: 'Falkland Islands (Malvinas)',
- FO: 'Faroe Islands',
- FJ: 'Fiji',
- FI: 'Finland',
- FR: 'France',
- GF: 'French Guiana',
- PF: 'French Polynesia',
- TF: 'French Southern Territories',
- GA: 'Gabon',
- GM: 'Gambia',
- GE: 'Georgia',
- DE: 'Germany',
- GH: 'Ghana',
- GI: 'Gibraltar',
- GR: 'Greece',
- GL: 'Greenland',
- GD: 'Grenada',
- GP: 'Guadeloupe',
- GU: 'Guam',
- GT: 'Guatemala',
- GG: 'Guernsey',
- GN: 'Guinea',
- GW: 'Guinea-Bissau',
- GY: 'Guyana',
- HT: 'Haiti',
- HM: 'Heard Island & Mcdonald Islands',
- VA: 'Holy See (Vatican City State)',
- HN: 'Honduras',
- HK: 'Hong Kong',
- HU: 'Hungary',
- IS: 'Iceland',
- IN: 'India',
- ID: 'Indonesia',
- IR: 'Iran, Islamic Republic Of',
- IQ: 'Iraq',
- IE: 'Ireland',
- IM: 'Isle Of Man',
- IL: 'Israel',
- IT: 'Italy',
- JM: 'Jamaica',
- JP: 'Japan',
- JE: 'Jersey',
- JO: 'Jordan',
- KZ: 'Kazakhstan',
- KE: 'Kenya',
- KI: 'Kiribati',
- KR: 'Korea',
- KW: 'Kuwait',
- KG: 'Kyrgyzstan',
- LA: "Lao People's Democratic Republic",
- LV: 'Latvia',
- LB: 'Lebanon',
- LS: 'Lesotho',
- LR: 'Liberia',
- LY: 'Libyan Arab Jamahiriya',
- LI: 'Liechtenstein',
- LT: 'Lithuania',
- LU: 'Luxembourg',
- MO: 'Macao',
- MK: 'Macedonia',
- MG: 'Madagascar',
- MW: 'Malawi',
- MY: 'Malaysia',
- MV: 'Maldives',
- ML: 'Mali',
- MT: 'Malta',
- MH: 'Marshall Islands',
- MQ: 'Martinique',
- MR: 'Mauritania',
- MU: 'Mauritius',
- YT: 'Mayotte',
- MX: 'Mexico',
- FM: 'Micronesia, Federated States Of',
- MD: 'Moldova',
- MC: 'Monaco',
- MN: 'Mongolia',
- ME: 'Montenegro',
- MS: 'Montserrat',
- MA: 'Morocco',
- MZ: 'Mozambique',
- MM: 'Myanmar',
- NA: 'Namibia',
- NR: 'Nauru',
- NP: 'Nepal',
- NL: 'Netherlands',
- AN: 'Netherlands Antilles',
- NC: 'New Caledonia',
- NZ: 'New Zealand',
- NI: 'Nicaragua',
- NE: 'Niger',
- NG: 'Nigeria',
- NU: 'Niue',
- NF: 'Norfolk Island',
- MP: 'Northern Mariana Islands',
- NO: 'Norway',
- OM: 'Oman',
- PK: 'Pakistan',
- PW: 'Palau',
- PS: 'Palestinian Territory, Occupied',
- PA: 'Panama',
- PG: 'Papua New Guinea',
- PY: 'Paraguay',
- PE: 'Peru',
- PH: 'Philippines',
- PN: 'Pitcairn',
- PL: 'Poland',
- PT: 'Portugal',
- PR: 'Puerto Rico',
- QA: 'Qatar',
- RE: 'Reunion',
- RO: 'Romania',
- RU: 'Russia',
- RW: 'Rwanda',
- BL: 'Saint Barthelemy',
- SH: 'Saint Helena',
- KN: 'Saint Kitts And Nevis',
- LC: 'Saint Lucia',
- MF: 'Saint Martin',
- PM: 'Saint Pierre And Miquelon',
- VC: 'Saint Vincent And Grenadines',
- WS: 'Samoa',
- SM: 'San Marino',
- ST: 'Sao Tome And Principe',
- SA: 'Saudi Arabia',
- SN: 'Senegal',
- RS: 'Serbia',
- SC: 'Seychelles',
- SL: 'Sierra Leone',
- SG: 'Singapore',
- SK: 'Slovakia',
- SI: 'Slovenia',
- SB: 'Solomon Islands',
- SO: 'Somalia',
- ZA: 'South Africa',
- GS: 'South Georgia And Sandwich Isl.',
- ES: 'Spain',
- LK: 'Sri Lanka',
- SD: 'Sudan',
- SR: 'Suriname',
- SJ: 'Svalbard And Jan Mayen',
- SZ: 'Swaziland',
- SE: 'Sweden',
- CH: 'Switzerland',
- SY: 'Syrian Arab Republic',
- TW: 'Taiwan',
- TJ: 'Tajikistan',
- TZ: 'Tanzania',
- TH: 'Thailand',
- TL: 'Timor-Leste',
- TG: 'Togo',
- TK: 'Tokelau',
- TO: 'Tonga',
- TT: 'Trinidad And Tobago',
- TN: 'Tunisia',
- TR: 'Turkey',
- TM: 'Turkmenistan',
- TC: 'Turks And Caicos Islands',
- TV: 'Tuvalu',
- UG: 'Uganda',
- UA: 'Ukraine',
- AE: 'United Arab Emirates',
- GB: 'United Kingdom',
- US: 'United States',
- UM: 'United States Outlying Islands',
- UY: 'Uruguay',
- UZ: 'Uzbekistan',
- VU: 'Vanuatu',
- VE: 'Venezuela',
- VN: 'Viet Nam',
- VG: 'Virgin Islands, British',
- VI: 'Virgin Islands, U.S.',
- WF: 'Wallis And Futuna',
- EH: 'Western Sahara',
- YE: 'Yemen',
- ZM: 'Zambia',
- ZW: 'Zimbabwe',
-};
diff --git a/lib/filters.js b/lib/filters.js
index dcbb9907..7fd5d833 100644
--- a/lib/filters.js
+++ b/lib/filters.js
@@ -1,5 +1,5 @@
import firstBy from 'thenby';
-import { BROWSERS, ISO_COUNTRIES } from './constants';
+import { BROWSERS } from './constants';
import { removeTrailingSlash, removeWWW, getDomainName } from './url';
export const urlFilter = (data, { raw }) => {
@@ -125,9 +125,6 @@ export const osFilter = data => data.filter(({ x }) => x);
export const deviceFilter = data => data.filter(({ x }) => x);
-export const countryFilter = data =>
- data.map(({ x, y }) => ({ x: ISO_COUNTRIES[x] || x, y })).filter(({ x }) => x);
-
export const percentFilter = data => {
const total = data.reduce((n, { y }) => n + y, 0);
return data.map(({ x, y, ...props }) => ({ x, y, z: total ? (y / total) * 100 : 0, ...props }));
diff --git a/lib/queries.js b/lib/queries.js
index af2b7f5b..d10777fd 100644
--- a/lib/queries.js
+++ b/lib/queries.js
@@ -16,9 +16,13 @@ export function getDatabase() {
}
export async function runQuery(query) {
- return query.catch(e => {
- throw e;
- });
+ return query
+ .catch(e => {
+ throw e;
+ })
+ .finally(async () => {
+ await prisma.$disconnect();
+ });
}
export async function rawQuery(query, params) {
@@ -285,8 +289,9 @@ export async function createAccount(data) {
);
}
-export function getMetrics(website_id, start_at, end_at, url) {
+export function getMetrics(website_id, start_at, end_at, filters = {}) {
const params = [website_id, start_at, end_at];
+ const { url } = filters;
let urlFilter = '';
if (url) {
@@ -348,8 +353,10 @@ export function getPageviews(
);
}
-export function getSessionMetrics(website_id, start_at, end_at, field, url) {
+export function getSessionMetrics(website_id, start_at, end_at, field, filters = {}) {
const params = [website_id, start_at, end_at];
+ const { url } = filters;
+
let urlFilter = '';
if (url) {
@@ -375,13 +382,15 @@ export function getSessionMetrics(website_id, start_at, end_at, field, url) {
);
}
-export function getPageviewMetrics(website_id, start_at, end_at, field, table, domain, url) {
+export function getPageviewMetrics(website_id, start_at, end_at, field, table, filters = {}) {
const params = [website_id, start_at, end_at];
+ const { domain, url } = filters;
+
let domainFilter = '';
let urlFilter = '';
if (domain) {
- domainFilter = `and referrer not like $${params.length + 1}`;
+ domainFilter = `and referrer not like $${params.length + 1} and referrer not like '/%'`;
params.push(`%${domain}%`);
}
@@ -420,8 +429,17 @@ export function getActiveVisitors(website_id) {
);
}
-export function getEvents(website_id, start_at, end_at, timezone = 'utc', unit = 'day', url) {
+export function getEvents(
+ website_id,
+ start_at,
+ end_at,
+ timezone = 'utc',
+ unit = 'day',
+ filters = {},
+) {
const params = [website_id, start_at, end_at];
+ const { url } = filters;
+
let urlFilter = '';
if (url) {
diff --git a/lib/web.js b/lib/web.js
index a20a09c8..aceb6498 100644
--- a/lib/web.js
+++ b/lib/web.js
@@ -1,6 +1,6 @@
import { getQueryString } from './url';
-export const apiRequest = (method, url, body) =>
+export const apiRequest = (method, url, body, headers) =>
fetch(url, {
method,
cache: 'no-cache',
@@ -8,18 +8,15 @@ export const apiRequest = (method, url, body) =>
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
+ ...headers,
},
body,
}).then(res => {
if (res.ok) {
- return res.json();
+ return res.json().then(data => ({ ok: res.ok, status: res.status, data }));
}
- if (['post', 'put', 'delete'].includes(method)) {
- return res.text();
- }
-
- return null;
+ return res.text().then(data => ({ ok: res.ok, status: res.status, res: res, data }));
});
export const get = (url, params) => apiRequest('get', `${url}${getQueryString(params)}`);
diff --git a/package.json b/package.json
index 114d23ed..fe31a1f5 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "umami",
- "version": "0.58.0",
+ "version": "0.67.0",
"description": "A simple, fast, website analytics alternative to Google Analytics. ",
"author": "Mike Cao ",
"license": "MIT",
@@ -13,6 +13,7 @@
"dev": "next dev",
"build": "npm-run-all build-tracker build-lang build-geo build-db build-app",
"start": "next start",
+ "start-env": "node scripts/start-env.js",
"build-app": "next build",
"build-tracker": "rollup -c rollup.tracker.config.js",
"build-db": "npm-run-all copy-db-schema build-db-client",
@@ -29,7 +30,8 @@
"extract-lang": "formatjs extract {pages,components}/**/*.js --out-file build/messages.json",
"merge-lang": "node scripts/merge-lang.js",
"format-lang": "node scripts/format-lang.js",
- "compile-lang": "formatjs compile-folder --ast build lang-compiled"
+ "compile-lang": "formatjs compile-folder --ast build lang-compiled",
+ "check-lang": "node scripts/check-lang.js"
},
"lint-staged": {
"**/*.js": [
@@ -50,7 +52,7 @@
}
},
"dependencies": {
- "@prisma/client": "2.7.1",
+ "@prisma/client": "2.8.0",
"@reduxjs/toolkit": "^1.4.0",
"bcrypt": "^5.0.0",
"chalk": "^4.1.0",
@@ -61,12 +63,12 @@
"date-fns": "^2.16.1",
"date-fns-tz": "^1.0.10",
"detect-browser": "^5.1.1",
- "formik": "^2.1.5",
+ "formik": "^2.1.6",
"immer": "^7.0.9",
"is-localhost-ip": "^1.4.0",
"isbot-fast": "^1.2.0",
"jose": "^2.0.2",
- "maxmind": "^4.1.4",
+ "maxmind": "^4.2.0",
"moment-timezone": "^0.5.31",
"next": "^9.5.3",
"react": "^16.13.1",
@@ -80,6 +82,7 @@
"redux": "^4.0.5",
"redux-thunk": "^2.3.0",
"request-ip": "^2.1.3",
+ "semver": "^7.3.2",
"thenby": "^1.3.4",
"timezone-support": "^2.0.2",
"tinycolor2": "^1.4.2",
@@ -87,7 +90,7 @@
},
"devDependencies": {
"@formatjs/cli": "^2.12.0",
- "@prisma/cli": "2.7.1",
+ "@prisma/cli": "2.8.0",
"@rollup/plugin-buble": "^0.21.3",
"@rollup/plugin-node-resolve": "^9.0.0",
"@rollup/plugin-replace": "^2.3.3",
@@ -113,7 +116,7 @@
"rollup": "^2.28.2",
"rollup-plugin-hashbang": "^2.2.2",
"rollup-plugin-terser": "^7.0.2",
- "stylelint": "^13.7.1",
+ "stylelint": "^13.7.2",
"stylelint-config-css-modules": "^2.2.0",
"stylelint-config-prettier": "^8.0.1",
"stylelint-config-recommended": "^3.0.0",
diff --git a/pages/api/auth/logout.js b/pages/api/auth/logout.js
index a78152f7..8d551dea 100644
--- a/pages/api/auth/logout.js
+++ b/pages/api/auth/logout.js
@@ -1,6 +1,6 @@
import { serialize } from 'cookie';
import { AUTH_COOKIE_NAME } from 'lib/constants';
-import { redirect } from 'lib/response';
+import { ok } from 'lib/response';
export default async (req, res) => {
const cookie = serialize(AUTH_COOKIE_NAME, '', {
@@ -11,5 +11,5 @@ export default async (req, res) => {
res.setHeader('Set-Cookie', [cookie]);
- return redirect(res, '/login');
+ return ok(res);
};
diff --git a/pages/api/website/[id]/events.js b/pages/api/website/[id]/events.js
index da610f17..0498052f 100644
--- a/pages/api/website/[id]/events.js
+++ b/pages/api/website/[id]/events.js
@@ -21,7 +21,7 @@ export default async (req, res) => {
const startDate = new Date(+start_at);
const endDate = new Date(+end_at);
- const events = await getEvents(websiteId, startDate, endDate, tz, unit, url);
+ const events = await getEvents(websiteId, startDate, endDate, tz, unit, { url });
return ok(res, events);
}
diff --git a/pages/api/website/[id]/metrics.js b/pages/api/website/[id]/metrics.js
index f7178bf4..91a0f4cf 100644
--- a/pages/api/website/[id]/metrics.js
+++ b/pages/api/website/[id]/metrics.js
@@ -14,7 +14,7 @@ export default async (req, res) => {
const startDate = new Date(+start_at);
const endDate = new Date(+end_at);
- const metrics = await getMetrics(websiteId, startDate, endDate, url);
+ const metrics = await getMetrics(websiteId, startDate, endDate, { url });
const stats = Object.keys(metrics[0]).reduce((obj, key) => {
obj[key] = Number(metrics[0][key]) || 0;
diff --git a/pages/api/website/[id]/rankings.js b/pages/api/website/[id]/rankings.js
index 3def9d3a..17aa6daa 100644
--- a/pages/api/website/[id]/rankings.js
+++ b/pages/api/website/[id]/rankings.js
@@ -42,7 +42,7 @@ export default async (req, res) => {
const endDate = new Date(+end_at);
if (sessionColumns.includes(type)) {
- const data = await getSessionMetrics(websiteId, startDate, endDate, type, url);
+ const data = await getSessionMetrics(websiteId, startDate, endDate, type, { url });
return ok(res, data);
}
@@ -54,8 +54,10 @@ export default async (req, res) => {
endDate,
getColumn(type),
getTable(type),
- domain,
- type !== 'url' ? url : undefined,
+ {
+ domain,
+ url: type !== 'url' && url,
+ },
);
return ok(res, data);
diff --git a/pages/dashboard/[[...id]].js b/pages/dashboard/[[...id]].js
index 90f08492..d3ce1301 100644
--- a/pages/dashboard/[[...id]].js
+++ b/pages/dashboard/[[...id]].js
@@ -1,7 +1,7 @@
import React from 'react';
import { useRouter } from 'next/router';
import Layout from 'components/layout/Layout';
-import WebsiteList from 'components/WebsiteList';
+import WebsiteList from 'components/pages/WebsiteList';
import useRequireLogin from 'hooks/useRequireLogin';
export default function DashboardPage() {
diff --git a/pages/logout.js b/pages/logout.js
index 540a93e1..6f5af610 100644
--- a/pages/logout.js
+++ b/pages/logout.js
@@ -1,8 +1,12 @@
import { useEffect } from 'react';
+import { useRouter } from 'next/router';
export default function LogoutPage() {
+ const router = useRouter();
+ const { basePath } = router;
+
useEffect(() => {
- fetch('/api/auth/logout').then(() => (window.location.href = '/login'));
+ fetch(`${basePath}/api/auth/logout`).then(() => router.push('/login'));
}, []);
return null;
diff --git a/pages/settings/index.js b/pages/settings/index.js
index 65eff46e..b4bb2248 100644
--- a/pages/settings/index.js
+++ b/pages/settings/index.js
@@ -1,6 +1,6 @@
import React from 'react';
import Layout from 'components/layout/Layout';
-import Settings from 'components/settings/Settings';
+import Settings from 'components/pages/Settings';
import useRequireLogin from 'hooks/useRequireLogin';
export default function SettingsPage() {
diff --git a/pages/share/[...id].js b/pages/share/[...id].js
index c4fa9a63..85455af4 100644
--- a/pages/share/[...id].js
+++ b/pages/share/[...id].js
@@ -1,7 +1,7 @@
import React from 'react';
import { useRouter } from 'next/router';
import Layout from 'components/layout/Layout';
-import WebsiteDetails from 'components/WebsiteDetails';
+import WebsiteDetails from 'components/pages/WebsiteDetails';
import useFetch from 'hooks/useFetch';
export default function SharePage() {
diff --git a/pages/test.js b/pages/test.js
index 820a3187..35b88ce3 100644
--- a/pages/test.js
+++ b/pages/test.js
@@ -1,56 +1,18 @@
-import Head from 'next/head';
-import Link from 'next/link';
-import { useRouter } from 'next/router';
+import React from 'react';
import Layout from 'components/layout/Layout';
+import TestConsole from 'components/pages/TestConsole';
+import useRequireLogin from 'hooks/useRequireLogin';
-export default function Test() {
- const router = useRouter();
- const { id } = router.query;
+export default function TestPage() {
+ const { loading } = useRequireLogin();
- if (!id) {
- return No id query specified. ;
- }
-
- function handleClick() {
- window.umami('Custom event');
- window.umami.pageView('/fake', 'https://www.google.com');
- window.umami.pageEvent('pageEvent', 'custom-type');
+ if (loading) {
+ return null;
}
return (
- <>
-
- {typeof window !== 'undefined' && (
-
- )}
-
-
-
- Here you can test if your umami installation works. Open the network tab in your browser
- developer console and watch for requests to the url collect . The links below should
- trigger page views. Clicking on the button should trigger an event.
-
- Page links
-
- Page One
-
-
-
- Page Two
-
- Events
-
- Button
-
- Manual trigger
-
- Button
-
-
- >
+
+
+
);
}
diff --git a/pages/website/[...id].js b/pages/website/[...id].js
index 0add10aa..90f4f492 100644
--- a/pages/website/[...id].js
+++ b/pages/website/[...id].js
@@ -1,7 +1,7 @@
import React from 'react';
import { useRouter } from 'next/router';
import Layout from 'components/layout/Layout';
-import WebsiteDetails from 'components/WebsiteDetails';
+import WebsiteDetails from 'components/pages/WebsiteDetails';
import useRequireLogin from 'hooks/useRequireLogin';
export default function DetailsPage() {
diff --git a/public/country/da-DK.json b/public/country/da-DK.json
new file mode 100644
index 00000000..e4fdd5c6
--- /dev/null
+++ b/public/country/da-DK.json
@@ -0,0 +1 @@
+{"AF":"Afghanistan","AL":"Albanien","DZ":"Algeriet","AS":"Amerikansk Samoa","UM":"Amerikanske overs\u00f8iske \u00f8er","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarktis","AG":"Antigua og Barbuda","AR":"Argentina","AM":"Armenien","AW":"Aruba","AZ":"Aserbajdsjan","AU":"Australien","BS":"Bahamas","BH":"Bahrain","BD":"Bangladesh","BB":"Barbados","BE":"Belgien","BZ":"Belize","BJ":"Benin","BM":"Bermuda","BT":"Bhutan","BO":"Bolivia","BA":"Bosnien-Hercegovina","BW":"Botswana","BV":"Bouvet\u00f8en","BR":"Brasilien","BN":"Brunei","BG":"Bulgarien","BF":"Burkina Faso","BI":"Burundi","KH":"Cambodja","CM":"Cameroun","CA":"Canada","KY":"Cayman\u00f8erne","CL":"Chile","CC":"Cocos\u00f8erne","CO":"Colombia","KM":"Comorerne","CG":"Congo-Brazzaville","CD":"Congo-Kinshasa","CK":"Cook\u00f8erne","CR":"Costa Rica","CU":"Cuba","CW":"Cura\u00e7ao","CY":"Cypern","DK":"Danmark","VI":"De Amerikanske Jomfru\u00f8er","VG":"De Britiske Jomfru\u00f8er","AE":"De Forenede Arabiske Emirater","TF":"De Franske Besiddelser i Det Sydlige Indiske Ocean og Antarktis","PS":"De pal\u00e6stinensiske omr\u00e5der","BQ":"De tidligere Nederlandske Antiller","CF":"Den Centralafrikanske Republik","DO":"Den Dominikanske Republik","IO":"Det Britiske Territorium i Det Indiske Ocean","DJ":"Djibouti","DM":"Dominica","EC":"Ecuador","EG":"Egypten","SV":"El Salvador","CI":"Elfenbenskysten","ER":"Eritrea","EE":"Estland","SZ":"Eswatini","ET":"Etiopien","FK":"Falklands\u00f8erne","FJ":"Fiji","PH":"Filippinerne","FI":"Finland","FR":"Frankrig","GF":"Fransk Guyana","PF":"Fransk Polynesien","FO":"F\u00e6r\u00f8erne","GA":"Gabon","GM":"Gambia","GE":"Georgien","GH":"Ghana","GI":"Gibraltar","GD":"Grenada","GR":"Gr\u00e6kenland","GL":"Gr\u00f8nland","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinea","GW":"Guinea-Bissau","GY":"Guyana","HT":"Haiti","HM":"Heard Island og McDonald Islands","NL":"Holland","HN":"Honduras","BY":"Hviderusland","IN":"Indien","ID":"Indonesien","IQ":"Irak","IR":"Iran","IE":"Irland","IS":"Island","IM":"Isle of Man","IL":"Israel","IT":"Italien","JM":"Jamaica","JP":"Japan","JE":"Jersey","JO":"Jordan","CX":"Jule\u00f8en","CV":"Kap Verde","KZ":"Kasakhstan","KE":"Kenya","CN":"Kina","KG":"Kirgisistan","KI":"Kiribati","HR":"Kroatien","KW":"Kuwait","LA":"Laos","LS":"Lesotho","LV":"Letland","LB":"Libanon","LR":"Liberia","LY":"Libyen","LI":"Liechtenstein","LT":"Litauen","LU":"Luxembourg","MG":"Madagaskar","MW":"Malawi","MY":"Malaysia","MV":"Maldiverne","ML":"Mali","MT":"Malta","MA":"Marokko","MH":"Marshall\u00f8erne","MQ":"Martinique","MR":"Mauretanien","MU":"Mauritius","YT":"Mayotte","MX":"Mexico","FM":"Mikronesien","MD":"Moldova","MC":"Monaco","MN":"Mongoliet","ME":"Montenegro","MS":"Montserrat","MZ":"Mozambique","MM":"Myanmar (Burma)","NA":"Namibia","NR":"Nauru","NP":"Nepal","NZ":"New Zealand","NI":"Nicaragua","NE":"Niger","NG":"Nigeria","NU":"Niue","KP":"Nordkorea","MK":"Nordmakedonien","MP":"Nordmarianerne","NF":"Norfolk Island","NO":"Norge","NC":"Ny Kaledonien","OM":"Oman","PK":"Pakistan","PW":"Palau","PA":"Panama","PG":"Papua Ny Guinea","PY":"Paraguay","PE":"Peru","PN":"Pitcairn","PL":"Polen","PT":"Portugal","PR":"Puerto Rico","QA":"Qatar","RE":"R\u00e9union","RO":"Rum\u00e6nien","RU":"Rusland","RW":"Rwanda","BL":"Saint Barth\u00e9lemy","KN":"Saint Kitts og Nevis","LC":"Saint Lucia","MF":"Saint Martin","PM":"Saint Pierre og Miquelon","VC":"Saint Vincent og Grenadinerne","SB":"Salomon\u00f8erne","WS":"Samoa","SM":"San Marino","ST":"S\u00e3o Tom\u00e9 og Pr\u00edncipe","HK":"SAR Hongkong","MO":"SAR Macao","SA":"Saudi-Arabien","CH":"Schweiz","SN":"Senegal","RS":"Serbien","SC":"Seychellerne","SL":"Sierra Leone","SG":"Singapore","SX":"Sint Maarten","SK":"Slovakiet","SI":"Slovenien","SO":"Somalia","GS":"South Georgia og De Sydlige Sandwich\u00f8er","ES":"Spanien","LK":"Sri Lanka","SH":"St. Helena","GB":"Storbritannien","SD":"Sudan","SR":"Surinam","SJ":"Svalbard og Jan Mayen","SE":"Sverige","ZA":"Sydafrika","KR":"Sydkorea","SS":"Sydsudan","SY":"Syrien","TJ":"Tadsjikistan","TW":"Taiwan","TZ":"Tanzania","TD":"Tchad","TH":"Thailand","TL":"Timor-Leste","CZ":"Tjekkiet","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad og Tobago","TN":"Tunesien","TM":"Turkmenistan","TC":"Turks- og Caicos\u00f8erne","TV":"Tuvalu","TR":"Tyrkiet","DE":"Tyskland","UG":"Uganda","UA":"Ukraine","HU":"Ungarn","UY":"Uruguay","US":"USA","UZ":"Usbekistan","VU":"Vanuatu","VA":"Vatikanstaten","VE":"Venezuela","EH":"Vestsahara","VN":"Vietnam","WF":"Wallis og Futuna","YE":"Yemen","ZM":"Zambia","ZW":"Zimbabwe","GQ":"\u00c6kvatorialguinea","AT":"\u00d8strig","AX":"\u00c5land"}
\ No newline at end of file
diff --git a/public/country/de-DE.json b/public/country/de-DE.json
new file mode 100644
index 00000000..e4d8c4bd
--- /dev/null
+++ b/public/country/de-DE.json
@@ -0,0 +1 @@
+{"AF":"Afghanistan","EG":"\u00c4gypten","AX":"\u00c5landinseln","AL":"Albanien","DZ":"Algerien","AS":"Amerikanisch-Samoa","VI":"Amerikanische Jungferninseln","UM":"Amerikanische \u00dcberseeinseln","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarktis","AG":"Antigua und Barbuda","GQ":"\u00c4quatorialguinea","AR":"Argentinien","AM":"Armenien","AW":"Aruba","AZ":"Aserbaidschan","ET":"\u00c4thiopien","AU":"Australien","BS":"Bahamas","BH":"Bahrain","BD":"Bangladesch","BB":"Barbados","BY":"Belarus","BE":"Belgien","BZ":"Belize","BJ":"Benin","BM":"Bermuda","BT":"Bhutan","BO":"Bolivien","BQ":"Bonaire, Sint Eustatius und Saba","BA":"Bosnien und Herzegowina","BW":"Botsuana","BV":"Bouvetinsel","BR":"Brasilien","VG":"Britische Jungferninseln","IO":"Britisches Territorium im Indischen Ozean","BN":"Brunei Darussalam","BG":"Bulgarien","BF":"Burkina Faso","BI":"Burundi","CV":"Cabo Verde","CL":"Chile","CN":"China","CK":"Cookinseln","CR":"Costa Rica","CI":"C\u00f4te d\u2019Ivoire","CW":"Cura\u00e7ao","DK":"D\u00e4nemark","DE":"Deutschland","DM":"Dominica","DO":"Dominikanische Republik","DJ":"Dschibuti","EC":"Ecuador","SV":"El Salvador","ER":"Eritrea","EE":"Estland","SZ":"Eswatini","FK":"Falklandinseln","FO":"F\u00e4r\u00f6er","FJ":"Fidschi","FI":"Finnland","FR":"Frankreich","GF":"Franz\u00f6sisch-Guayana","PF":"Franz\u00f6sisch-Polynesien","TF":"Franz\u00f6sische S\u00fcd- und Antarktisgebiete","GA":"Gabun","GM":"Gambia","GE":"Georgien","GH":"Ghana","GI":"Gibraltar","GD":"Grenada","GR":"Griechenland","GL":"Gr\u00f6nland","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinea","GW":"Guinea-Bissau","GY":"Guyana","HT":"Haiti","HM":"Heard und McDonaldinseln","HN":"Honduras","IN":"Indien","ID":"Indonesien","IQ":"Irak","IR":"Iran","IE":"Irland","IS":"Island","IM":"Isle of Man","IL":"Israel","IT":"Italien","JM":"Jamaika","JP":"Japan","YE":"Jemen","JE":"Jersey","JO":"Jordanien","KY":"Kaimaninseln","KH":"Kambodscha","CM":"Kamerun","CA":"Kanada","KZ":"Kasachstan","QA":"Katar","KE":"Kenia","KG":"Kirgisistan","KI":"Kiribati","CC":"Kokosinseln","CO":"Kolumbien","KM":"Komoren","CG":"Kongo-Brazzaville","CD":"Kongo-Kinshasa","HR":"Kroatien","CU":"Kuba","KW":"Kuwait","LA":"Laos","LS":"Lesotho","LV":"Lettland","LB":"Libanon","LR":"Liberia","LY":"Libyen","LI":"Liechtenstein","LT":"Litauen","LU":"Luxemburg","MG":"Madagaskar","MW":"Malawi","MY":"Malaysia","MV":"Malediven","ML":"Mali","MT":"Malta","MA":"Marokko","MH":"Marshallinseln","MQ":"Martinique","MR":"Mauretanien","MU":"Mauritius","YT":"Mayotte","MX":"Mexiko","FM":"Mikronesien","MC":"Monaco","MN":"Mongolei","ME":"Montenegro","MS":"Montserrat","MZ":"Mosambik","MM":"Myanmar","NA":"Namibia","NR":"Nauru","NP":"Nepal","NC":"Neukaledonien","NZ":"Neuseeland","NI":"Nicaragua","NL":"Niederlande","NE":"Niger","NG":"Nigeria","NU":"Niue","KP":"Nordkorea","MP":"N\u00f6rdliche Marianen","MK":"Nordmazedonien","NF":"Norfolkinsel","NO":"Norwegen","OM":"Oman","AT":"\u00d6sterreich","PK":"Pakistan","PS":"Pal\u00e4stinensische Autonomiegebiete","PW":"Palau","PA":"Panama","PG":"Papua-Neuguinea","PY":"Paraguay","PE":"Peru","PH":"Philippinen","PN":"Pitcairninseln","PL":"Polen","PT":"Portugal","PR":"Puerto Rico","MD":"Republik Moldau","RE":"R\u00e9union","RW":"Ruanda","RO":"Rum\u00e4nien","RU":"Russland","SB":"Salomonen","ZM":"Sambia","WS":"Samoa","SM":"San Marino","ST":"S\u00e3o Tom\u00e9 und Pr\u00edncipe","SA":"Saudi-Arabien","SE":"Schweden","CH":"Schweiz","SN":"Senegal","RS":"Serbien","SC":"Seychellen","SL":"Sierra Leone","ZW":"Simbabwe","SG":"Singapur","SX":"Sint Maarten","SK":"Slowakei","SI":"Slowenien","SO":"Somalia","HK":"Sonderverwaltungsregion Hongkong","MO":"Sonderverwaltungsregion Macau","ES":"Spanien","SJ":"Spitzbergen und Jan Mayen","LK":"Sri Lanka","BL":"St. Barth\u00e9lemy","SH":"St. Helena","KN":"St. Kitts und Nevis","LC":"St. Lucia","MF":"St. Martin","PM":"St. Pierre und Miquelon","VC":"St. Vincent und die Grenadinen","ZA":"S\u00fcdafrika","SD":"Sudan","GS":"S\u00fcdgeorgien und die S\u00fcdlichen Sandwichinseln","KR":"S\u00fcdkorea","SS":"S\u00fcdsudan","SR":"Suriname","SY":"Syrien","TJ":"Tadschikistan","TW":"Taiwan","TZ":"Tansania","TH":"Thailand","TL":"Timor-Leste","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad und Tobago","TD":"Tschad","CZ":"Tschechien","TN":"Tunesien","TR":"T\u00fcrkei","TM":"Turkmenistan","TC":"Turks- und Caicosinseln","TV":"Tuvalu","UG":"Uganda","UA":"Ukraine","HU":"Ungarn","UY":"Uruguay","UZ":"Usbekistan","VU":"Vanuatu","VA":"Vatikanstadt","VE":"Venezuela","AE":"Vereinigte Arabische Emirate","US":"Vereinigte Staaten","GB":"Vereinigtes K\u00f6nigreich","VN":"Vietnam","WF":"Wallis und Futuna","CX":"Weihnachtsinsel","EH":"Westsahara","CF":"Zentralafrikanische Republik","CY":"Zypern"}
\ No newline at end of file
diff --git a/public/country/el-GR.json b/public/country/el-GR.json
new file mode 100644
index 00000000..74bb6f7c
--- /dev/null
+++ b/public/country/el-GR.json
@@ -0,0 +1 @@
+{"SH":"\u0391\u03b3\u03af\u03b1 \u0395\u03bb\u03ad\u03bd\u03b7","LC":"\u0391\u03b3\u03af\u03b1 \u039b\u03bf\u03c5\u03ba\u03af\u03b1","BL":"\u0386\u03b3\u03b9\u03bf\u03c2 \u0392\u03b1\u03c1\u03b8\u03bf\u03bb\u03bf\u03bc\u03b1\u03af\u03bf\u03c2","VC":"\u0386\u03b3\u03b9\u03bf\u03c2 \u0392\u03b9\u03ba\u03ad\u03bd\u03c4\u03b9\u03bf\u03c2 \u03ba\u03b1\u03b9 \u0393\u03c1\u03b5\u03bd\u03b1\u03b4\u03af\u03bd\u03b5\u03c2","SM":"\u0386\u03b3\u03b9\u03bf\u03c2 \u039c\u03b1\u03c1\u03af\u03bd\u03bf\u03c2","MF":"\u0386\u03b3\u03b9\u03bf\u03c2 \u039c\u03b1\u03c1\u03c4\u03af\u03bd\u03bf\u03c2 (\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03cc \u03c4\u03bc\u03ae\u03bc\u03b1)","SX":"\u0386\u03b3\u03b9\u03bf\u03c2 \u039c\u03b1\u03c1\u03c4\u03af\u03bd\u03bf\u03c2 (\u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03b9\u03ba\u03cc \u03c4\u03bc\u03ae\u03bc\u03b1)","AO":"\u0391\u03b3\u03ba\u03cc\u03bb\u03b1","AZ":"\u0391\u03b6\u03b5\u03c1\u03bc\u03c0\u03b1\u03ca\u03c4\u03b6\u03ac\u03bd","EG":"\u0391\u03af\u03b3\u03c5\u03c0\u03c4\u03bf\u03c2","ET":"\u0391\u03b9\u03b8\u03b9\u03bf\u03c0\u03af\u03b1","HT":"\u0391\u03ca\u03c4\u03ae","CI":"\u0391\u03ba\u03c4\u03ae \u0395\u03bb\u03b5\u03c6\u03b1\u03bd\u03c4\u03bf\u03c3\u03c4\u03bf\u03cd","AL":"\u0391\u03bb\u03b2\u03b1\u03bd\u03af\u03b1","DZ":"\u0391\u03bb\u03b3\u03b5\u03c1\u03af\u03b1","VI":"\u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ad\u03c2 \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03b5\u03c2 \u039d\u03ae\u03c3\u03bf\u03b9","AS":"\u0391\u03bc\u03b5\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ae \u03a3\u03b1\u03bc\u03cc\u03b1","AI":"\u0391\u03bd\u03b3\u03ba\u03bf\u03c5\u03af\u03bb\u03b1","AD":"\u0391\u03bd\u03b4\u03cc\u03c1\u03b1","AQ":"\u0391\u03bd\u03c4\u03b1\u03c1\u03ba\u03c4\u03b9\u03ba\u03ae","AG":"\u0391\u03bd\u03c4\u03af\u03b3\u03ba\u03bf\u03c5\u03b1 \u03ba\u03b1\u03b9 \u039c\u03c0\u03b1\u03c1\u03bc\u03c0\u03bf\u03cd\u03bd\u03c4\u03b1","UM":"\u0391\u03c0\u03bf\u03bc\u03b1\u03ba\u03c1\u03c5\u03c3\u03bc\u03ad\u03bd\u03b5\u03c2 \u039d\u03b7\u03c3\u03af\u03b4\u03b5\u03c2 \u0397\u03a0\u0391","AR":"\u0391\u03c1\u03b3\u03b5\u03bd\u03c4\u03b9\u03bd\u03ae","AM":"\u0391\u03c1\u03bc\u03b5\u03bd\u03af\u03b1","AW":"\u0391\u03c1\u03bf\u03cd\u03bc\u03c0\u03b1","AU":"\u0391\u03c5\u03c3\u03c4\u03c1\u03b1\u03bb\u03af\u03b1","AT":"\u0391\u03c5\u03c3\u03c4\u03c1\u03af\u03b1","AF":"\u0391\u03c6\u03b3\u03b1\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd","VU":"\u0392\u03b1\u03bd\u03bf\u03c5\u03ac\u03c4\u03bf\u03c5","VA":"\u0392\u03b1\u03c4\u03b9\u03ba\u03b1\u03bd\u03cc","BE":"\u0392\u03ad\u03bb\u03b3\u03b9\u03bf","VE":"\u0392\u03b5\u03bd\u03b5\u03b6\u03bf\u03c5\u03ad\u03bb\u03b1","BM":"\u0392\u03b5\u03c1\u03bc\u03bf\u03cd\u03b4\u03b5\u03c2","VN":"\u0392\u03b9\u03b5\u03c4\u03bd\u03ac\u03bc","BO":"\u0392\u03bf\u03bb\u03b9\u03b2\u03af\u03b1","KP":"\u0392\u03cc\u03c1\u03b5\u03b9\u03b1 \u039a\u03bf\u03c1\u03ad\u03b1","MK":"\u0392\u03cc\u03c1\u03b5\u03b9\u03b1 \u039c\u03b1\u03ba\u03b5\u03b4\u03bf\u03bd\u03af\u03b1","BA":"\u0392\u03bf\u03c3\u03bd\u03af\u03b1 - \u0395\u03c1\u03b6\u03b5\u03b3\u03bf\u03b2\u03af\u03bd\u03b7","BG":"\u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03af\u03b1","BR":"\u0392\u03c1\u03b1\u03b6\u03b9\u03bb\u03af\u03b1","IO":"\u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ac \u0395\u03b4\u03ac\u03c6\u03b7 \u0399\u03bd\u03b4\u03b9\u03ba\u03bf\u03cd \u03a9\u03ba\u03b5\u03b1\u03bd\u03bf\u03cd","VG":"\u0392\u03c1\u03b5\u03c4\u03b1\u03bd\u03b9\u03ba\u03ad\u03c2 \u03a0\u03b1\u03c1\u03b8\u03ad\u03bd\u03b5\u03c2 \u039d\u03ae\u03c3\u03bf\u03b9","FR":"\u0393\u03b1\u03bb\u03bb\u03af\u03b1","TF":"\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac \u039d\u03cc\u03c4\u03b9\u03b1 \u0395\u03b4\u03ac\u03c6\u03b7","GF":"\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ae \u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1","PF":"\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ae \u03a0\u03bf\u03bb\u03c5\u03bd\u03b7\u03c3\u03af\u03b1","DE":"\u0393\u03b5\u03c1\u03bc\u03b1\u03bd\u03af\u03b1","GE":"\u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1","GI":"\u0393\u03b9\u03b2\u03c1\u03b1\u03bb\u03c4\u03ac\u03c1","GM":"\u0393\u03ba\u03ac\u03bc\u03c0\u03b9\u03b1","GA":"\u0393\u03ba\u03b1\u03bc\u03c0\u03cc\u03bd","GH":"\u0393\u03ba\u03ac\u03bd\u03b1","GG":"\u0393\u03ba\u03ad\u03c1\u03bd\u03b6\u03b9","GU":"\u0393\u03ba\u03bf\u03c5\u03ac\u03bc","GP":"\u0393\u03bf\u03c5\u03b1\u03b4\u03b5\u03bb\u03bf\u03cd\u03c0\u03b7","WF":"\u0393\u03bf\u03c5\u03ac\u03bb\u03b9\u03c2 \u03ba\u03b1\u03b9 \u03a6\u03bf\u03c5\u03c4\u03bf\u03cd\u03bd\u03b1","GT":"\u0393\u03bf\u03c5\u03b1\u03c4\u03b5\u03bc\u03ac\u03bb\u03b1","GY":"\u0393\u03bf\u03c5\u03b9\u03ac\u03bd\u03b1","GN":"\u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1","GW":"\u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1 \u039c\u03c0\u03b9\u03c3\u03ac\u03bf\u03c5","GD":"\u0393\u03c1\u03b5\u03bd\u03ac\u03b4\u03b1","GL":"\u0393\u03c1\u03bf\u03b9\u03bb\u03b1\u03bd\u03b4\u03af\u03b1","DK":"\u0394\u03b1\u03bd\u03af\u03b1","DO":"\u0394\u03bf\u03bc\u03b9\u03bd\u03b9\u03ba\u03b1\u03bd\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1","EH":"\u0394\u03c5\u03c4\u03b9\u03ba\u03ae \u03a3\u03b1\u03c7\u03ac\u03c1\u03b1","SV":"\u0395\u03bb \u03a3\u03b1\u03bb\u03b2\u03b1\u03b4\u03cc\u03c1","CH":"\u0395\u03bb\u03b2\u03b5\u03c4\u03af\u03b1","GR":"\u0395\u03bb\u03bb\u03ac\u03b4\u03b1","ER":"\u0395\u03c1\u03c5\u03b8\u03c1\u03b1\u03af\u03b1","EE":"\u0395\u03c3\u03b8\u03bf\u03bd\u03af\u03b1","ZM":"\u0396\u03ac\u03bc\u03c0\u03b9\u03b1","ZW":"\u0396\u03b9\u03bc\u03c0\u03ac\u03bc\u03c0\u03bf\u03c5\u03b5","AE":"\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b1 \u0391\u03c1\u03b1\u03b2\u03b9\u03ba\u03ac \u0395\u03bc\u03b9\u03c1\u03ac\u03c4\u03b1","US":"\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b5\u03c2 \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03af\u03b5\u03c2","GB":"\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03bf \u0392\u03b1\u03c3\u03af\u03bb\u03b5\u03b9\u03bf","JP":"\u0399\u03b1\u03c0\u03c9\u03bd\u03af\u03b1","IN":"\u0399\u03bd\u03b4\u03af\u03b1","ID":"\u0399\u03bd\u03b4\u03bf\u03bd\u03b7\u03c3\u03af\u03b1","JO":"\u0399\u03bf\u03c1\u03b4\u03b1\u03bd\u03af\u03b1","IQ":"\u0399\u03c1\u03ac\u03ba","IR":"\u0399\u03c1\u03ac\u03bd","IE":"\u0399\u03c1\u03bb\u03b1\u03bd\u03b4\u03af\u03b1","GQ":"\u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03ae \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1","EC":"\u0399\u03c3\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03cc\u03c2","IS":"\u0399\u03c3\u03bb\u03b1\u03bd\u03b4\u03af\u03b1","ES":"\u0399\u03c3\u03c0\u03b1\u03bd\u03af\u03b1","IL":"\u0399\u03c3\u03c1\u03b1\u03ae\u03bb","IT":"\u0399\u03c4\u03b1\u03bb\u03af\u03b1","KZ":"\u039a\u03b1\u03b6\u03b1\u03ba\u03c3\u03c4\u03ac\u03bd","CM":"\u039a\u03b1\u03bc\u03b5\u03c1\u03bf\u03cd\u03bd","KH":"\u039a\u03b1\u03bc\u03c0\u03cc\u03c4\u03b6\u03b7","CA":"\u039a\u03b1\u03bd\u03b1\u03b4\u03ac\u03c2","QA":"\u039a\u03b1\u03c4\u03ac\u03c1","CF":"\u039a\u03b5\u03bd\u03c4\u03c1\u03bf\u03b1\u03c6\u03c1\u03b9\u03ba\u03b1\u03bd\u03b9\u03ba\u03ae \u0394\u03b7\u03bc\u03bf\u03ba\u03c1\u03b1\u03c4\u03af\u03b1","KE":"\u039a\u03ad\u03bd\u03c5\u03b1","CN":"\u039a\u03af\u03bd\u03b1","KG":"\u039a\u03b9\u03c1\u03b3\u03b9\u03c3\u03c4\u03ac\u03bd","KI":"\u039a\u03b9\u03c1\u03b9\u03bc\u03c0\u03ac\u03c4\u03b9","CO":"\u039a\u03bf\u03bb\u03bf\u03bc\u03b2\u03af\u03b1","KM":"\u039a\u03bf\u03bc\u03cc\u03c1\u03b5\u03c2","CD":"\u039a\u03bf\u03bd\u03b3\u03ba\u03cc - \u039a\u03b9\u03bd\u03c3\u03ac\u03c3\u03b1","CG":"\u039a\u03bf\u03bd\u03b3\u03ba\u03cc - \u039c\u03c0\u03c1\u03b1\u03b6\u03b1\u03b2\u03af\u03bb","CR":"\u039a\u03cc\u03c3\u03c4\u03b1 \u03a1\u03af\u03ba\u03b1","CU":"\u039a\u03bf\u03cd\u03b2\u03b1","KW":"\u039a\u03bf\u03c5\u03b2\u03ad\u03b9\u03c4","CW":"\u039a\u03bf\u03c5\u03c1\u03b1\u03c3\u03ac\u03bf","HR":"\u039a\u03c1\u03bf\u03b1\u03c4\u03af\u03b1","CY":"\u039a\u03cd\u03c0\u03c1\u03bf\u03c2","LA":"\u039b\u03ac\u03bf\u03c2","LS":"\u039b\u03b5\u03c3\u03cc\u03c4\u03bf","LV":"\u039b\u03b5\u03c4\u03bf\u03bd\u03af\u03b1","BY":"\u039b\u03b5\u03c5\u03ba\u03bf\u03c1\u03c9\u03c3\u03af\u03b1","LB":"\u039b\u03af\u03b2\u03b1\u03bd\u03bf\u03c2","LR":"\u039b\u03b9\u03b2\u03b5\u03c1\u03af\u03b1","LY":"\u039b\u03b9\u03b2\u03cd\u03b7","LT":"\u039b\u03b9\u03b8\u03bf\u03c5\u03b1\u03bd\u03af\u03b1","LI":"\u039b\u03b9\u03c7\u03c4\u03b5\u03bd\u03c3\u03c4\u03ac\u03b9\u03bd","LU":"\u039b\u03bf\u03c5\u03be\u03b5\u03bc\u03b2\u03bf\u03cd\u03c1\u03b3\u03bf","YT":"\u039c\u03b1\u03b3\u03b9\u03cc\u03c4","MG":"\u039c\u03b1\u03b4\u03b1\u03b3\u03b1\u03c3\u03ba\u03ac\u03c1\u03b7","MO":"\u039c\u03b1\u03ba\u03ac\u03bf \u0395\u0394\u03a0 \u039a\u03af\u03bd\u03b1\u03c2","MY":"\u039c\u03b1\u03bb\u03b1\u03b9\u03c3\u03af\u03b1","MW":"\u039c\u03b1\u03bb\u03ac\u03bf\u03c5\u03b9","MV":"\u039c\u03b1\u03bb\u03b4\u03af\u03b2\u03b5\u03c2","ML":"\u039c\u03ac\u03bb\u03b9","MT":"\u039c\u03ac\u03bb\u03c4\u03b1","MA":"\u039c\u03b1\u03c1\u03cc\u03ba\u03bf","MQ":"\u039c\u03b1\u03c1\u03c4\u03b9\u03bd\u03af\u03ba\u03b1","MU":"\u039c\u03b1\u03c5\u03c1\u03af\u03ba\u03b9\u03bf\u03c2","MR":"\u039c\u03b1\u03c5\u03c1\u03b9\u03c4\u03b1\u03bd\u03af\u03b1","ME":"\u039c\u03b1\u03c5\u03c1\u03bf\u03b2\u03bf\u03cd\u03bd\u03b9\u03bf","MX":"\u039c\u03b5\u03be\u03b9\u03ba\u03cc","MM":"\u039c\u03b9\u03b1\u03bd\u03bc\u03ac\u03c1 (\u0392\u03b9\u03c1\u03bc\u03b1\u03bd\u03af\u03b1)","FM":"\u039c\u03b9\u03ba\u03c1\u03bf\u03bd\u03b7\u03c3\u03af\u03b1","MN":"\u039c\u03bf\u03b3\u03b3\u03bf\u03bb\u03af\u03b1","MZ":"\u039c\u03bf\u03b6\u03b1\u03bc\u03b2\u03af\u03ba\u03b7","MD":"\u039c\u03bf\u03bb\u03b4\u03b1\u03b2\u03af\u03b1","MC":"\u039c\u03bf\u03bd\u03b1\u03ba\u03cc","MS":"\u039c\u03bf\u03bd\u03c3\u03b5\u03c1\u03ac\u03c4","BD":"\u039c\u03c0\u03b1\u03bd\u03b3\u03ba\u03bb\u03b1\u03bd\u03c4\u03ad\u03c2","BB":"\u039c\u03c0\u03b1\u03c1\u03bc\u03c0\u03ad\u03b9\u03bd\u03c4\u03bf\u03c2","BS":"\u039c\u03c0\u03b1\u03c7\u03ac\u03bc\u03b5\u03c2","BH":"\u039c\u03c0\u03b1\u03c7\u03c1\u03ad\u03b9\u03bd","BZ":"\u039c\u03c0\u03b5\u03bb\u03af\u03b6","BJ":"\u039c\u03c0\u03b5\u03bd\u03af\u03bd","BW":"\u039c\u03c0\u03bf\u03c4\u03c3\u03bf\u03c5\u03ac\u03bd\u03b1","BF":"\u039c\u03c0\u03bf\u03c5\u03c1\u03ba\u03af\u03bd\u03b1 \u03a6\u03ac\u03c3\u03bf","BI":"\u039c\u03c0\u03bf\u03c5\u03c1\u03bf\u03cd\u03bd\u03c4\u03b9","BT":"\u039c\u03c0\u03bf\u03c5\u03c4\u03ac\u03bd","BN":"\u039c\u03c0\u03c1\u03bf\u03c5\u03bd\u03ad\u03b9","NA":"\u039d\u03b1\u03bc\u03af\u03bc\u03c0\u03b9\u03b1","NR":"\u039d\u03b1\u03bf\u03c5\u03c1\u03bf\u03cd","NZ":"\u039d\u03ad\u03b1 \u0396\u03b7\u03bb\u03b1\u03bd\u03b4\u03af\u03b1","NC":"\u039d\u03ad\u03b1 \u039a\u03b1\u03bb\u03b7\u03b4\u03bf\u03bd\u03af\u03b1","NP":"\u039d\u03b5\u03c0\u03ac\u03bb","MP":"\u039d\u03ae\u03c3\u03bf\u03b9 \u0392\u03cc\u03c1\u03b5\u03b9\u03b5\u03c2 \u039c\u03b1\u03c1\u03b9\u03ac\u03bd\u03b5\u03c2","KY":"\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03ad\u03b9\u03bc\u03b1\u03bd","CC":"\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03cc\u03ba\u03bf\u03c2 (\u039a\u03af\u03bb\u03b9\u03bd\u03b3\u03ba)","CK":"\u039d\u03ae\u03c3\u03bf\u03b9 \u039a\u03bf\u03c5\u03ba","MH":"\u039d\u03ae\u03c3\u03bf\u03b9 \u039c\u03ac\u03c1\u03c3\u03b1\u03bb","GS":"\u039d\u03ae\u03c3\u03bf\u03b9 \u039d\u03cc\u03c4\u03b9\u03b1 \u0393\u03b5\u03c9\u03c1\u03b3\u03af\u03b1 \u03ba\u03b1\u03b9 \u039d\u03cc\u03c4\u03b9\u03b5\u03c2 \u03a3\u03ac\u03bd\u03c4\u03bf\u03c5\u03b9\u03c4\u03c2","AX":"\u039d\u03ae\u03c3\u03bf\u03b9 \u038c\u03bb\u03b1\u03bd\u03c4","PN":"\u039d\u03ae\u03c3\u03bf\u03b9 \u03a0\u03af\u03c4\u03ba\u03b5\u03c1\u03bd","SB":"\u039d\u03ae\u03c3\u03bf\u03b9 \u03a3\u03bf\u03bb\u03bf\u03bc\u03ce\u03bd\u03c4\u03bf\u03c2","TC":"\u039d\u03ae\u03c3\u03bf\u03b9 \u03a4\u03b5\u03c1\u03ba\u03c2 \u03ba\u03b1\u03b9 \u039a\u03ac\u03b9\u03ba\u03bf\u03c2","FO":"\u039d\u03ae\u03c3\u03bf\u03b9 \u03a6\u03b5\u03c1\u03cc\u03b5\u03c2","FK":"\u039d\u03ae\u03c3\u03bf\u03b9 \u03a6\u03cc\u03ba\u03bb\u03b1\u03bd\u03c4","HM":"\u039d\u03ae\u03c3\u03bf\u03b9 \u03a7\u03b5\u03c1\u03bd\u03c4 \u03ba\u03b1\u03b9 \u039c\u03b1\u03ba\u03bd\u03c4\u03cc\u03bd\u03b1\u03bb\u03bd\u03c4","BV":"\u039d\u03ae\u03c3\u03bf\u03c2 \u039c\u03c0\u03bf\u03c5\u03b2\u03ad","NF":"\u039d\u03ae\u03c3\u03bf\u03c2 \u039d\u03cc\u03c1\u03c6\u03bf\u03bb\u03ba","IM":"\u039d\u03ae\u03c3\u03bf\u03c2 \u03c4\u03bf\u03c5 \u039c\u03b1\u03bd","CX":"\u039d\u03ae\u03c3\u03bf\u03c2 \u03c4\u03c9\u03bd \u03a7\u03c1\u03b9\u03c3\u03c4\u03bf\u03c5\u03b3\u03ad\u03bd\u03bd\u03c9\u03bd","NE":"\u039d\u03af\u03b3\u03b7\u03c1\u03b1\u03c2","NG":"\u039d\u03b9\u03b3\u03b7\u03c1\u03af\u03b1","NI":"\u039d\u03b9\u03ba\u03b1\u03c1\u03ac\u03b3\u03bf\u03c5\u03b1","NU":"\u039d\u03b9\u03bf\u03cd\u03b5","NO":"\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03af\u03b1","ZA":"\u039d\u03cc\u03c4\u03b9\u03b1 \u0391\u03c6\u03c1\u03b9\u03ba\u03ae","KR":"\u039d\u03cc\u03c4\u03b9\u03b1 \u039a\u03bf\u03c1\u03ad\u03b1","SS":"\u039d\u03cc\u03c4\u03b9\u03bf \u03a3\u03bf\u03c5\u03b4\u03ac\u03bd","DM":"\u039d\u03c4\u03bf\u03bc\u03af\u03bd\u03b9\u03ba\u03b1","NL":"\u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03af\u03b1","BQ":"\u039f\u03bb\u03bb\u03b1\u03bd\u03b4\u03af\u03b1 \u039a\u03b1\u03c1\u03b1\u03ca\u03b2\u03b9\u03ba\u03ae\u03c2","OM":"\u039f\u03bc\u03ac\u03bd","HN":"\u039f\u03bd\u03b4\u03bf\u03cd\u03c1\u03b1","HU":"\u039f\u03c5\u03b3\u03b3\u03b1\u03c1\u03af\u03b1","UG":"\u039f\u03c5\u03b3\u03ba\u03ac\u03bd\u03c4\u03b1","UZ":"\u039f\u03c5\u03b6\u03bc\u03c0\u03b5\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd","UA":"\u039f\u03c5\u03ba\u03c1\u03b1\u03bd\u03af\u03b1","UY":"\u039f\u03c5\u03c1\u03bf\u03c5\u03b3\u03bf\u03c5\u03ac\u03b7","PK":"\u03a0\u03b1\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd","PS":"\u03a0\u03b1\u03bb\u03b1\u03b9\u03c3\u03c4\u03b9\u03bd\u03b9\u03b1\u03ba\u03ac \u0395\u03b4\u03ac\u03c6\u03b7","PW":"\u03a0\u03b1\u03bb\u03ac\u03bf\u03c5","PA":"\u03a0\u03b1\u03bd\u03b1\u03bc\u03ac\u03c2","PG":"\u03a0\u03b1\u03c0\u03bf\u03cd\u03b1 \u039d\u03ad\u03b1 \u0393\u03bf\u03c5\u03b9\u03bd\u03ad\u03b1","PY":"\u03a0\u03b1\u03c1\u03b1\u03b3\u03bf\u03c5\u03ac\u03b7","PE":"\u03a0\u03b5\u03c1\u03bf\u03cd","PL":"\u03a0\u03bf\u03bb\u03c9\u03bd\u03af\u03b1","PT":"\u03a0\u03bf\u03c1\u03c4\u03bf\u03b3\u03b1\u03bb\u03af\u03b1","PR":"\u03a0\u03bf\u03c5\u03ad\u03c1\u03c4\u03bf \u03a1\u03af\u03ba\u03bf","CV":"\u03a0\u03c1\u03ac\u03c3\u03b9\u03bd\u03bf \u0391\u03ba\u03c1\u03c9\u03c4\u03ae\u03c1\u03b9\u03bf","RE":"\u03a1\u03b5\u03ca\u03bd\u03b9\u03cc\u03bd","RW":"\u03a1\u03bf\u03c5\u03ac\u03bd\u03c4\u03b1","RO":"\u03a1\u03bf\u03c5\u03bc\u03b1\u03bd\u03af\u03b1","RU":"\u03a1\u03c9\u03c3\u03af\u03b1","WS":"\u03a3\u03b1\u03bc\u03cc\u03b1","ST":"\u03a3\u03ac\u03bf \u03a4\u03bf\u03bc\u03ad \u03ba\u03b1\u03b9 \u03a0\u03c1\u03af\u03bd\u03c3\u03b9\u03c0\u03b5","SA":"\u03a3\u03b1\u03bf\u03c5\u03b4\u03b9\u03ba\u03ae \u0391\u03c1\u03b1\u03b2\u03af\u03b1","SJ":"\u03a3\u03b2\u03ac\u03bb\u03bc\u03c0\u03b1\u03c1\u03bd\u03c4 \u03ba\u03b1\u03b9 \u0393\u03b9\u03b1\u03bd \u039c\u03b1\u03b3\u03b9\u03ad\u03bd","KN":"\u03a3\u03b5\u03bd \u039a\u03b9\u03c4\u03c2 \u03ba\u03b1\u03b9 \u039d\u03ad\u03b2\u03b9\u03c2","PM":"\u03a3\u03b5\u03bd \u03a0\u03b9\u03b5\u03c1 \u03ba\u03b1\u03b9 \u039c\u03b9\u03ba\u03b5\u03bb\u03cc\u03bd","SN":"\u03a3\u03b5\u03bd\u03b5\u03b3\u03ac\u03bb\u03b7","RS":"\u03a3\u03b5\u03c1\u03b2\u03af\u03b1","SC":"\u03a3\u03b5\u03cb\u03c7\u03ad\u03bb\u03bb\u03b5\u03c2","SG":"\u03a3\u03b9\u03b3\u03ba\u03b1\u03c0\u03bf\u03cd\u03c1\u03b7","SL":"\u03a3\u03b9\u03ad\u03c1\u03b1 \u039b\u03b5\u03cc\u03bd\u03b5","SK":"\u03a3\u03bb\u03bf\u03b2\u03b1\u03ba\u03af\u03b1","SI":"\u03a3\u03bb\u03bf\u03b2\u03b5\u03bd\u03af\u03b1","SO":"\u03a3\u03bf\u03bc\u03b1\u03bb\u03af\u03b1","SZ":"\u03a3\u03bf\u03c5\u03b1\u03b6\u03b9\u03bb\u03ac\u03bd\u03b4\u03b7","SD":"\u03a3\u03bf\u03c5\u03b4\u03ac\u03bd","SE":"\u03a3\u03bf\u03c5\u03b7\u03b4\u03af\u03b1","SR":"\u03a3\u03bf\u03c5\u03c1\u03b9\u03bd\u03ac\u03bc","LK":"\u03a3\u03c1\u03b9 \u039b\u03ac\u03bd\u03ba\u03b1","SY":"\u03a3\u03c5\u03c1\u03af\u03b1","TW":"\u03a4\u03b1\u03ca\u03b2\u03ac\u03bd","TH":"\u03a4\u03b1\u03ca\u03bb\u03ac\u03bd\u03b4\u03b7","TZ":"\u03a4\u03b1\u03bd\u03b6\u03b1\u03bd\u03af\u03b1","TJ":"\u03a4\u03b1\u03c4\u03b6\u03b9\u03ba\u03b9\u03c3\u03c4\u03ac\u03bd","JM":"\u03a4\u03b6\u03b1\u03bc\u03ac\u03b9\u03ba\u03b1","JE":"\u03a4\u03b6\u03ad\u03c1\u03b6\u03b9","DJ":"\u03a4\u03b6\u03b9\u03bc\u03c0\u03bf\u03c5\u03c4\u03af","TL":"\u03a4\u03b9\u03bc\u03cc\u03c1-\u039b\u03ad\u03c3\u03c4\u03b5","TG":"\u03a4\u03cc\u03b3\u03ba\u03bf","TK":"\u03a4\u03bf\u03ba\u03b5\u03bb\u03ac\u03bf\u03c5","TO":"\u03a4\u03cc\u03bd\u03b3\u03ba\u03b1","TV":"\u03a4\u03bf\u03c5\u03b2\u03b1\u03bb\u03bf\u03cd","TR":"\u03a4\u03bf\u03c5\u03c1\u03ba\u03af\u03b1","TM":"\u03a4\u03bf\u03c5\u03c1\u03ba\u03bc\u03b5\u03bd\u03b9\u03c3\u03c4\u03ac\u03bd","TT":"\u03a4\u03c1\u03b9\u03bd\u03b9\u03bd\u03c4\u03ac\u03bd\u03c4 \u03ba\u03b1\u03b9 \u03a4\u03bf\u03bc\u03c0\u03ac\u03b3\u03ba\u03bf","TD":"\u03a4\u03c3\u03b1\u03bd\u03c4","CZ":"\u03a4\u03c3\u03b5\u03c7\u03af\u03b1","TN":"\u03a4\u03c5\u03bd\u03b7\u03c3\u03af\u03b1","YE":"\u03a5\u03b5\u03bc\u03ad\u03bd\u03b7","PH":"\u03a6\u03b9\u03bb\u03b9\u03c0\u03c0\u03af\u03bd\u03b5\u03c2","FI":"\u03a6\u03b9\u03bd\u03bb\u03b1\u03bd\u03b4\u03af\u03b1","FJ":"\u03a6\u03af\u03c4\u03b6\u03b9","CL":"\u03a7\u03b9\u03bb\u03ae","HK":"\u03a7\u03bf\u03bd\u03b3\u03ba \u039a\u03bf\u03bd\u03b3\u03ba \u0395\u0394\u03a0 \u039a\u03af\u03bd\u03b1\u03c2"}
\ No newline at end of file
diff --git a/public/country/en-US.json b/public/country/en-US.json
new file mode 100644
index 00000000..f316e338
--- /dev/null
+++ b/public/country/en-US.json
@@ -0,0 +1 @@
+{"AF":"Afghanistan","AX":"\u00c5land Islands","AL":"Albania","DZ":"Algeria","AS":"American Samoa","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarctica","AG":"Antigua & Barbuda","AR":"Argentina","AM":"Armenia","AW":"Aruba","AU":"Australia","AT":"Austria","AZ":"Azerbaijan","BS":"Bahamas","BH":"Bahrain","BD":"Bangladesh","BB":"Barbados","BY":"Belarus","BE":"Belgium","BZ":"Belize","BJ":"Benin","BM":"Bermuda","BT":"Bhutan","BO":"Bolivia","BA":"Bosnia & Herzegovina","BW":"Botswana","BV":"Bouvet Island","BR":"Brazil","IO":"British Indian Ocean Territory","VG":"British Virgin Islands","BN":"Brunei","BG":"Bulgaria","BF":"Burkina Faso","BI":"Burundi","KH":"Cambodia","CM":"Cameroon","CA":"Canada","CV":"Cape Verde","BQ":"Caribbean Netherlands","KY":"Cayman Islands","CF":"Central African Republic","TD":"Chad","CL":"Chile","CN":"China","CX":"Christmas Island","CC":"Cocos (Keeling) Islands","CO":"Colombia","KM":"Comoros","CG":"Congo - Brazzaville","CD":"Congo - Kinshasa","CK":"Cook Islands","CR":"Costa Rica","CI":"C\u00f4te d\u2019Ivoire","HR":"Croatia","CU":"Cuba","CW":"Cura\u00e7ao","CY":"Cyprus","CZ":"Czechia","DK":"Denmark","DJ":"Djibouti","DM":"Dominica","DO":"Dominican Republic","EC":"Ecuador","EG":"Egypt","SV":"El Salvador","GQ":"Equatorial Guinea","ER":"Eritrea","EE":"Estonia","SZ":"Eswatini","ET":"Ethiopia","FK":"Falkland Islands","FO":"Faroe Islands","FJ":"Fiji","FI":"Finland","FR":"France","GF":"French Guiana","PF":"French Polynesia","TF":"French Southern Territories","GA":"Gabon","GM":"Gambia","GE":"Georgia","DE":"Germany","GH":"Ghana","GI":"Gibraltar","GR":"Greece","GL":"Greenland","GD":"Grenada","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinea","GW":"Guinea-Bissau","GY":"Guyana","HT":"Haiti","HM":"Heard & McDonald Islands","HN":"Honduras","HK":"Hong Kong SAR China","HU":"Hungary","IS":"Iceland","IN":"India","ID":"Indonesia","IR":"Iran","IQ":"Iraq","IE":"Ireland","IM":"Isle of Man","IL":"Israel","IT":"Italy","JM":"Jamaica","JP":"Japan","JE":"Jersey","JO":"Jordan","KZ":"Kazakhstan","KE":"Kenya","KI":"Kiribati","KW":"Kuwait","KG":"Kyrgyzstan","LA":"Laos","LV":"Latvia","LB":"Lebanon","LS":"Lesotho","LR":"Liberia","LY":"Libya","LI":"Liechtenstein","LT":"Lithuania","LU":"Luxembourg","MO":"Macao SAR China","MG":"Madagascar","MW":"Malawi","MY":"Malaysia","MV":"Maldives","ML":"Mali","MT":"Malta","MH":"Marshall Islands","MQ":"Martinique","MR":"Mauritania","MU":"Mauritius","YT":"Mayotte","MX":"Mexico","FM":"Micronesia","MD":"Moldova","MC":"Monaco","MN":"Mongolia","ME":"Montenegro","MS":"Montserrat","MA":"Morocco","MZ":"Mozambique","MM":"Myanmar (Burma)","NA":"Namibia","NR":"Nauru","NP":"Nepal","NL":"Netherlands","NC":"New Caledonia","NZ":"New Zealand","NI":"Nicaragua","NE":"Niger","NG":"Nigeria","NU":"Niue","NF":"Norfolk Island","KP":"North Korea","MK":"North Macedonia","MP":"Northern Mariana Islands","NO":"Norway","OM":"Oman","PK":"Pakistan","PW":"Palau","PS":"Palestinian Territories","PA":"Panama","PG":"Papua New Guinea","PY":"Paraguay","PE":"Peru","PH":"Philippines","PN":"Pitcairn Islands","PL":"Poland","PT":"Portugal","PR":"Puerto Rico","QA":"Qatar","RE":"R\u00e9union","RO":"Romania","RU":"Russia","RW":"Rwanda","WS":"Samoa","SM":"San Marino","ST":"S\u00e3o Tom\u00e9 & Pr\u00edncipe","SA":"Saudi Arabia","SN":"Senegal","RS":"Serbia","SC":"Seychelles","SL":"Sierra Leone","SG":"Singapore","SX":"Sint Maarten","SK":"Slovakia","SI":"Slovenia","SB":"Solomon Islands","SO":"Somalia","ZA":"South Africa","GS":"South Georgia & South Sandwich Islands","KR":"South Korea","SS":"South Sudan","ES":"Spain","LK":"Sri Lanka","BL":"St. Barth\u00e9lemy","SH":"St. Helena","KN":"St. Kitts & Nevis","LC":"St. Lucia","MF":"St. Martin","PM":"St. Pierre & Miquelon","VC":"St. Vincent & Grenadines","SD":"Sudan","SR":"Suriname","SJ":"Svalbard & Jan Mayen","SE":"Sweden","CH":"Switzerland","SY":"Syria","TW":"Taiwan","TJ":"Tajikistan","TZ":"Tanzania","TH":"Thailand","TL":"Timor-Leste","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad & Tobago","TN":"Tunisia","TR":"Turkey","TM":"Turkmenistan","TC":"Turks & Caicos Islands","TV":"Tuvalu","UM":"U.S. Outlying Islands","VI":"U.S. Virgin Islands","UG":"Uganda","UA":"Ukraine","AE":"United Arab Emirates","GB":"United Kingdom","US":"United States","UY":"Uruguay","UZ":"Uzbekistan","VU":"Vanuatu","VA":"Vatican City","VE":"Venezuela","VN":"Vietnam","WF":"Wallis & Futuna","EH":"Western Sahara","YE":"Yemen","ZM":"Zambia","ZW":"Zimbabwe"}
\ No newline at end of file
diff --git a/public/country/es-MX.json b/public/country/es-MX.json
new file mode 100644
index 00000000..103a455e
--- /dev/null
+++ b/public/country/es-MX.json
@@ -0,0 +1 @@
+{"AF":"Afganist\u00e1n","AL":"Albania","DE":"Alemania","AD":"Andorra","AO":"Angola","AI":"Anguila","AQ":"Ant\u00e1rtida","AG":"Antigua y Barbuda","SA":"Arabia Saudita","DZ":"Argelia","AR":"Argentina","AM":"Armenia","AW":"Aruba","AU":"Australia","AT":"Austria","AZ":"Azerbaiy\u00e1n","BS":"Bahamas","BD":"Banglad\u00e9s","BB":"Barbados","BH":"Bar\u00e9in","BE":"B\u00e9lgica","BZ":"Belice","BJ":"Ben\u00edn","BM":"Bermudas","BY":"Bielorrusia","BO":"Bolivia","BA":"Bosnia y Herzegovina","BW":"Botsuana","BR":"Brasil","BN":"Brun\u00e9i","BG":"Bulgaria","BF":"Burkina Faso","BI":"Burundi","BT":"But\u00e1n","CV":"Cabo Verde","KH":"Camboya","CM":"Camer\u00fan","CA":"Canad\u00e1","BQ":"Caribe neerland\u00e9s","QA":"Catar","TD":"Chad","CZ":"Chequia","CL":"Chile","CN":"China","CY":"Chipre","VA":"Ciudad del Vaticano","CO":"Colombia","KM":"Comoras","CG":"Congo","KP":"Corea del Norte","KR":"Corea del Sur","CR":"Costa Rica","CI":"C\u00f4te d\u2019Ivoire","HR":"Croacia","CU":"Cuba","CW":"Curazao","DK":"Dinamarca","DM":"Dominica","EC":"Ecuador","EG":"Egipto","SV":"El Salvador","AE":"Emiratos \u00c1rabes Unidos","ER":"Eritrea","SK":"Eslovaquia","SI":"Eslovenia","ES":"Espa\u00f1a","US":"Estados Unidos","EE":"Estonia","SZ":"Eswatini","ET":"Etiop\u00eda","PH":"Filipinas","FI":"Finlandia","FJ":"Fiyi","FR":"Francia","GA":"Gab\u00f3n","GM":"Gambia","GE":"Georgia","GH":"Ghana","GI":"Gibraltar","GD":"Granada","GR":"Grecia","GL":"Groenlandia","GP":"Guadalupe","GU":"Guam","GT":"Guatemala","GF":"Guayana Francesa","GG":"Guernsey","GN":"Guinea","GQ":"Guinea Ecuatorial","GW":"Guinea-Bis\u00e1u","GY":"Guyana","HT":"Hait\u00ed","HN":"Honduras","HU":"Hungr\u00eda","IN":"India","ID":"Indonesia","IQ":"Irak","IR":"Ir\u00e1n","IE":"Irlanda","BV":"Isla Bouvet","IM":"Isla de Man","CX":"Isla de Navidad","NF":"Isla Norfolk","IS":"Islandia","AX":"Islas \u00c5land","KY":"Islas Caim\u00e1n","CC":"Islas Cocos","CK":"Islas Cook","FO":"Islas Feroe","GS":"Islas Georgia del Sur y Sandwich del Sur","HM":"Islas Heard y McDonald","FK":"Islas Malvinas","MP":"Islas Marianas del Norte","MH":"Islas Marshall","UM":"Islas menores alejadas de EE. UU.","PN":"Islas Pitcairn","SB":"Islas Salom\u00f3n","TC":"Islas Turcas y Caicos","VG":"Islas V\u00edrgenes Brit\u00e1nicas","VI":"Islas V\u00edrgenes de EE. UU.","IL":"Israel","IT":"Italia","JM":"Jamaica","JP":"Jap\u00f3n","JE":"Jersey","JO":"Jordania","KZ":"Kazajist\u00e1n","KE":"Kenia","KG":"Kirguist\u00e1n","KI":"Kiribati","KW":"Kuwait","LA":"Laos","LS":"Lesoto","LV":"Letonia","LB":"L\u00edbano","LR":"Liberia","LY":"Libia","LI":"Liechtenstein","LT":"Lituania","LU":"Luxemburgo","MK":"Macedonia del Norte","MG":"Madagascar","MY":"Malasia","MW":"Malaui","MV":"Maldivas","ML":"Mali","MT":"Malta","MA":"Marruecos","MQ":"Martinica","MU":"Mauricio","MR":"Mauritania","YT":"Mayotte","MX":"M\u00e9xico","FM":"Micronesia","MD":"Moldavia","MC":"M\u00f3naco","MN":"Mongolia","ME":"Montenegro","MS":"Montserrat","MZ":"Mozambique","MM":"Myanmar (Birmania)","NA":"Namibia","NR":"Nauru","NP":"Nepal","NI":"Nicaragua","NE":"N\u00edger","NG":"Nigeria","NU":"Niue","NO":"Noruega","NC":"Nueva Caledonia","NZ":"Nueva Zelanda","OM":"Om\u00e1n","NL":"Pa\u00edses Bajos","PK":"Pakist\u00e1n","PW":"Palaos","PA":"Panam\u00e1","PG":"Pap\u00faa Nueva Guinea","PY":"Paraguay","PE":"Per\u00fa","PF":"Polinesia Francesa","PL":"Polonia","PT":"Portugal","PR":"Puerto Rico","HK":"RAE de Hong Kong (China)","MO":"RAE de Macao (China)","GB":"Reino Unido","CF":"Rep\u00fablica Centroafricana","CD":"Rep\u00fablica Democr\u00e1tica del Congo","DO":"Rep\u00fablica Dominicana","RE":"Reuni\u00f3n","RW":"Ruanda","RO":"Rumania","RU":"Rusia","EH":"S\u00e1hara Occidental","WS":"Samoa","AS":"Samoa Americana","BL":"San Bartolom\u00e9","KN":"San Crist\u00f3bal y Nieves","SM":"San Marino","MF":"San Mart\u00edn","PM":"San Pedro y Miquel\u00f3n","VC":"San Vicente y las Granadinas","SH":"Santa Elena","LC":"Santa Luc\u00eda","ST":"Santo Tom\u00e9 y Pr\u00edncipe","SN":"Senegal","RS":"Serbia","SC":"Seychelles","SL":"Sierra Leona","SG":"Singapur","SX":"Sint Maarten","SY":"Siria","SO":"Somalia","LK":"Sri Lanka","ZA":"Sud\u00e1frica","SD":"Sud\u00e1n","SS":"Sud\u00e1n del Sur","SE":"Suecia","CH":"Suiza","SR":"Surinam","SJ":"Svalbard y Jan Mayen","TH":"Tailandia","TW":"Taiw\u00e1n","TZ":"Tanzania","TJ":"Tayikist\u00e1n","IO":"Territorio Brit\u00e1nico del Oc\u00e9ano \u00cdndico","TF":"Territorios Australes Franceses","PS":"Territorios Palestinos","TL":"Timor-Leste","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad y Tobago","TN":"T\u00fanez","TM":"Turkmenist\u00e1n","TR":"Turqu\u00eda","TV":"Tuvalu","UA":"Ucrania","UG":"Uganda","UY":"Uruguay","UZ":"Uzbekist\u00e1n","VU":"Vanuatu","VE":"Venezuela","VN":"Vietnam","WF":"Wallis y Futuna","YE":"Yemen","DJ":"Yibuti","ZM":"Zambia","ZW":"Zimbabue"}
\ No newline at end of file
diff --git a/public/country/fo-FO.json b/public/country/fo-FO.json
new file mode 100644
index 00000000..033605ec
--- /dev/null
+++ b/public/country/fo-FO.json
@@ -0,0 +1 @@
+{"AF":"Afganistan","AX":"\u00c1land","AL":"Albania","DZ":"Algeria","AS":"Amerikanska Samoa","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarktis","AG":"Antigua & Barbuda","AR":"Argentina","AM":"Armenia","AW":"Aruba","AZ":"Aserbadjan","AU":"Avstralia","BS":"Bahamaoyggjar","BD":"Bangladesj","BB":"Barbados","BH":"Barein","BE":"Belgia","BZ":"Belis","BJ":"Benin","BM":"Bermuda","BO":"Bolivia","BA":"Bosnia-Hersegovina","BW":"Botsvana","BV":"Bouvetoyggj","BR":"Brasil","BN":"Brunei","BG":"Bulgaria","BF":"Burkina Faso","BI":"Burundi","BT":"Butan","KY":"Caymanoyggjar","CK":"Cooksoyggjar","CW":"Cura\u00e7ao","DK":"Danmark","DJ":"Djibuti","DM":"Dominika","DO":"Dominikal\u00fd\u00f0veldi\u00f0","EG":"Egyptaland","EC":"Ekvador","GQ":"Ekvatorguinea","SV":"El Salvador","ER":"Eritrea","EE":"Estland","SZ":"Esvatini","ET":"Etiopia","AT":"Eysturr\u00edki","TL":"Eysturtimor","FK":"Falklandsoyggjar","FJ":"Fiji","CI":"F\u00edlabeinsstrondin","PH":"Filipsoyggjar","FI":"Finnland","FR":"Frakland","GF":"Franska Gujana","PF":"Franska Polynesia","TF":"Fronsku sunnaru landa\u00f8ki","FO":"F\u00f8royar","GA":"Gabon","GM":"Gambia","GH":"Gana","GE":"Georgia","GI":"Gibraltar","GD":"Grenada","GR":"Grikkaland","CV":"Gr\u00f8nh\u00f8vdaoyggjar","GL":"Gr\u00f8nland","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinea","GW":"Guinea-Bissau","GY":"Gujana","HT":"Haiti","HM":"Heard og McDonaldoyggjar","HN":"Honduras","HK":"Hong Kong SAR Kina","BY":"Hv\u00edtarussland","IN":"India","ID":"Indonesia","IQ":"Irak","IR":"Iran","IE":"\u00cdrland","IS":"\u00cdsland","IM":"Isle of Man","IL":"\u00cdsrael","IT":"Italia","JM":"Jamaika","JP":"Japan","YE":"Jemen","JE":"Jersey","CX":"J\u00f3laoyggjin","JO":"Jordan","KH":"Kambodja","CM":"Kamerun","CA":"Kanada","KZ":"Kasakstan","QA":"Katar","CZ":"Kekkia","KE":"Kenja","CL":"Kili","CN":"Kina","KG":"Kirgisia","KI":"Kiribati","TD":"Kjad","CC":"Kokosoyggjar","CO":"Kolombia","KM":"Komoroyggjar","CG":"Kongo","CD":"Kongo, Dem. L\u00fd\u00f0veldi\u00f0","CR":"Kosta Rika","HR":"Kroatia","CU":"Kuba","KW":"Kuvait","CY":"K\u00fdpros","LA":"Laos","LS":"Lesoto","LV":"Lettland","LB":"Libanon","LR":"Liberia","LY":"Libya","LI":"Liktinstein","LT":"Litava","LU":"Luksemborg","MG":"Madagaskar","MO":"Makao SAR Kina","MY":"Malaisia","MW":"Malavi","MV":"Maldivoyggjar","ML":"Mali","MT":"Malta","MA":"Marokko","MH":"Marshalloyggjar","MQ":"Martinique","YT":"Mayotte","MX":"Meksiko","CF":"Mi\u00f0afrikal\u00fd\u00f0veldi\u00f0","FM":"Mikronesiasamveldi\u00f0","MD":"Moldova","MC":"Monako","MN":"Mongolia","ME":"Montenegro","MS":"Montserrat","MR":"M\u00f3ritania","MU":"M\u00f3ritius","MZ":"Mosambik","MM":"Myanmar (Burma)","NA":"Namibia","NR":"Nauru","NP":"Nepal","NL":"Ni\u00f0urlond","BQ":"Ni\u00f0urlonds Karibia","NE":"Niger","NG":"Nigeria","NI":"Nikaragua","NU":"Niue","MP":"Nor\u00f0aru Mariuoyggjar","KP":"Nor\u00f0urkorea","NO":"Noreg","NF":"Norfolksoyggj","MK":"North Macedonia","NC":"N\u00fdkaled\u00f3nia","NZ":"N\u00fds\u00e6land","OM":"Oman","PK":"Pakistan","PW":"Palau","PS":"Palestinskt land\u00f8ki","PA":"Panama","PG":"Papua N\u00fdguinea","PY":"Paraguai","PE":"Peru","PN":"Pitcairnoyggjar","PL":"P\u00f3lland","PT":"Portugal","PR":"Puerto Riko","RE":"R\u00e9union","RW":"Ruanda","RO":"Rumenia","RU":"Russland","PM":"Saint Pierre & Miquelon","SB":"Salomonoyggjar","US":"Sambandsr\u00edki Amerika","UM":"Sambandsr\u00edki Amerikas fjarskotnu oyggjar","VI":"Sambandsr\u00edki Amerikas Jomfr\u00faoyggjar","ZM":"Sambia","AE":"Sameindu Emirr\u00edkini","WS":"Samoa","SM":"San Marino","ST":"Sao Tome & Prinsipi","SA":"Saudiarabia","SN":"Senegal","RS":"Serbia","SC":"Seyskelloyggjar","SL":"Sierra Leona","ZW":"Simbabvi","SG":"Singapor","SX":"Sint Maarten","SK":"Slovakia","SI":"Slovenia","SO":"Somalia","ES":"Spania","LK":"Sri Lanka","MF":"St-Martin","BL":"St. Barth\u00e9lemy","SH":"St. Helena","KN":"St. Kitts & Nevis","LC":"St. Lusia","VC":"St. Vinsent & Grenadinoyggjar","IO":"St\u00f3ra Bretlands Indiahavoyggjar","VG":"St\u00f3ra Bretlands Jomfr\u00faoyggjar","GB":"St\u00f3rabretland","SD":"Sudan","ZA":"Su\u00f0urafrika","GS":"Su\u00f0urgeorgia og Su\u00f0ursandwichoyggjar","KR":"Su\u00f0urkorea","SS":"Su\u00f0ursudan","SR":"Surinam","SJ":"Svalbard & Jan Mayen","CH":"Sveis","SE":"Sv\u00f8r\u00edki","SY":"S\u00fdria","TJ":"Tadsjikistan","TH":"Tailand","TW":"Taivan","TZ":"Tansania","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad & Tobago","TN":"Tunesia","TR":"Turkaland","TM":"Turkmenistan","TC":"Turks- og Caicosoyggjar","TV":"Tuvalu","DE":"T\u00fdskland","UG":"Uganda","UA":"Ukraina","HU":"Ungarn","UY":"Uruguai","UZ":"Usbekistan","VU":"Vanuatu","VA":"Vatikanb\u00fdur","VE":"Venesuela","EH":"Vestursahara","VN":"Vjetnam","WF":"Wallis- og Futunaoyggjar"}
\ No newline at end of file
diff --git a/public/country/fr-FR.json b/public/country/fr-FR.json
new file mode 100644
index 00000000..2353752a
--- /dev/null
+++ b/public/country/fr-FR.json
@@ -0,0 +1 @@
+{"AF":"Afghanistan","ZA":"Afrique du Sud","AL":"Albanie","DZ":"Alg\u00e9rie","DE":"Allemagne","AD":"Andorre","AO":"Angola","AI":"Anguilla","AQ":"Antarctique","AG":"Antigua-et-Barbuda","SA":"Arabie saoudite","AR":"Argentine","AM":"Arm\u00e9nie","AW":"Aruba","AU":"Australie","AT":"Autriche","AZ":"Azerba\u00efdjan","BS":"Bahamas","BH":"Bahre\u00efn","BD":"Bangladesh","BB":"Barbade","BE":"Belgique","BZ":"Belize","BJ":"B\u00e9nin","BM":"Bermudes","BT":"Bhoutan","BY":"Bi\u00e9lorussie","BO":"Bolivie","BA":"Bosnie-Herz\u00e9govine","BW":"Botswana","BR":"Br\u00e9sil","BN":"Brun\u00e9i Darussalam","BG":"Bulgarie","BF":"Burkina Faso","BI":"Burundi","KH":"Cambodge","CM":"Cameroun","CA":"Canada","CV":"Cap-Vert","CL":"Chili","CN":"Chine","CY":"Chypre","CO":"Colombie","KM":"Comores","CG":"Congo-Brazzaville","CD":"Congo-Kinshasa","KP":"Cor\u00e9e du Nord","KR":"Cor\u00e9e du Sud","CR":"Costa Rica","CI":"C\u00f4te d\u2019Ivoire","HR":"Croatie","CU":"Cuba","CW":"Cura\u00e7ao","DK":"Danemark","DJ":"Djibouti","DM":"Dominique","EG":"\u00c9gypte","AE":"\u00c9mirats arabes unis","EC":"\u00c9quateur","ER":"\u00c9rythr\u00e9e","ES":"Espagne","EE":"Estonie","SZ":"Eswatini","VA":"\u00c9tat de la Cit\u00e9 du Vatican","FM":"\u00c9tats f\u00e9d\u00e9r\u00e9s de Micron\u00e9sie","US":"\u00c9tats-Unis","ET":"\u00c9thiopie","FJ":"Fidji","FI":"Finlande","FR":"France","GA":"Gabon","GM":"Gambie","GE":"G\u00e9orgie","GS":"G\u00e9orgie du Sud et \u00eeles Sandwich du Sud","GH":"Ghana","GI":"Gibraltar","GR":"Gr\u00e8ce","GD":"Grenade","GL":"Groenland","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernesey","GN":"Guin\u00e9e","GQ":"Guin\u00e9e \u00e9quatoriale","GW":"Guin\u00e9e-Bissau","GY":"Guyana","GF":"Guyane fran\u00e7aise","HT":"Ha\u00efti","HN":"Honduras","HU":"Hongrie","BV":"\u00cele Bouvet","CX":"\u00cele Christmas","IM":"\u00cele de Man","NF":"\u00cele Norfolk","AX":"\u00celes \u00c5land","KY":"\u00celes Ca\u00efmans","CC":"\u00celes Cocos","CK":"\u00celes Cook","FO":"\u00celes F\u00e9ro\u00e9","HM":"\u00celes Heard et McDonald","FK":"\u00celes Malouines","MP":"\u00celes Mariannes du Nord","MH":"\u00celes Marshall","UM":"\u00celes mineures \u00e9loign\u00e9es des \u00c9tats-Unis","PN":"\u00celes Pitcairn","SB":"\u00celes Salomon","TC":"\u00celes Turques-et-Ca\u00efques","VG":"\u00celes Vierges britanniques","VI":"\u00celes Vierges des \u00c9tats-Unis","IN":"Inde","ID":"Indon\u00e9sie","IQ":"Irak","IR":"Iran","IE":"Irlande","IS":"Islande","IL":"Isra\u00ebl","IT":"Italie","JM":"Jama\u00efque","JP":"Japon","JE":"Jersey","JO":"Jordanie","KZ":"Kazakhstan","KE":"Kenya","KG":"Kirghizistan","KI":"Kiribati","KW":"Kowe\u00eft","RE":"La R\u00e9union","LA":"Laos","LS":"Lesotho","LV":"Lettonie","LB":"Liban","LR":"Lib\u00e9ria","LY":"Libye","LI":"Liechtenstein","LT":"Lituanie","LU":"Luxembourg","MK":"Mac\u00e9doine du Nord","MG":"Madagascar","MY":"Malaisie","MW":"Malawi","MV":"Maldives","ML":"Mali","MT":"Malte","MA":"Maroc","MQ":"Martinique","MU":"Maurice","MR":"Mauritanie","YT":"Mayotte","MX":"Mexique","MD":"Moldavie","MC":"Monaco","MN":"Mongolie","ME":"Mont\u00e9n\u00e9gro","MS":"Montserrat","MZ":"Mozambique","MM":"Myanmar (Birmanie)","NA":"Namibie","NR":"Nauru","NP":"N\u00e9pal","NI":"Nicaragua","NE":"Niger","NG":"Nig\u00e9ria","NU":"Niue","NO":"Norv\u00e8ge","NC":"Nouvelle-Cal\u00e9donie","NZ":"Nouvelle-Z\u00e9lande","OM":"Oman","UG":"Ouganda","UZ":"Ouzb\u00e9kistan","PK":"Pakistan","PW":"Palaos","PA":"Panama","PG":"Papouasie-Nouvelle-Guin\u00e9e","PY":"Paraguay","NL":"Pays-Bas","BQ":"Pays-Bas carib\u00e9ens","PE":"P\u00e9rou","PH":"Philippines","PL":"Pologne","PF":"Polyn\u00e9sie fran\u00e7aise","PR":"Porto Rico","PT":"Portugal","QA":"Qatar","HK":"R.A.S. chinoise de Hong Kong","MO":"R.A.S. chinoise de Macao","CF":"R\u00e9publique centrafricaine","DO":"R\u00e9publique dominicaine","RO":"Roumanie","GB":"Royaume-Uni","RU":"Russie","RW":"Rwanda","EH":"Sahara occidental","BL":"Saint-Barth\u00e9lemy","KN":"Saint-Christophe-et-Ni\u00e9v\u00e8s","SM":"Saint-Marin","MF":"Saint-Martin","SX":"Saint-Martin (partie n\u00e9erlandaise)","PM":"Saint-Pierre-et-Miquelon","VC":"Saint-Vincent-et-les-Grenadines","SH":"Sainte-H\u00e9l\u00e8ne","LC":"Sainte-Lucie","SV":"Salvador","WS":"Samoa","AS":"Samoa am\u00e9ricaines","ST":"Sao Tom\u00e9-et-Principe","SN":"S\u00e9n\u00e9gal","RS":"Serbie","SC":"Seychelles","SL":"Sierra Leone","SG":"Singapour","SK":"Slovaquie","SI":"Slov\u00e9nie","SO":"Somalie","SD":"Soudan","SS":"Soudan du Sud","LK":"Sri Lanka","SE":"Su\u00e8de","CH":"Suisse","SR":"Suriname","SJ":"Svalbard et Jan Mayen","SY":"Syrie","TJ":"Tadjikistan","TW":"Ta\u00efwan","TZ":"Tanzanie","TD":"Tchad","CZ":"Tch\u00e9quie","TF":"Terres australes fran\u00e7aises","IO":"Territoire britannique de l\u2019oc\u00e9an Indien","PS":"Territoires palestiniens","TH":"Tha\u00eflande","TL":"Timor oriental","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinit\u00e9-et-Tobago","TN":"Tunisie","TM":"Turkm\u00e9nistan","TR":"Turquie","TV":"Tuvalu","UA":"Ukraine","UY":"Uruguay","VU":"Vanuatu","VE":"Venezuela","VN":"Vietnam","WF":"Wallis-et-Futuna","YE":"Y\u00e9men","ZM":"Zambie","ZW":"Zimbabwe"}
\ No newline at end of file
diff --git a/public/country/ja-JP.json b/public/country/ja-JP.json
new file mode 100644
index 00000000..0b432dc7
--- /dev/null
+++ b/public/country/ja-JP.json
@@ -0,0 +1 @@
+{"IS":"\u30a2\u30a4\u30b9\u30e9\u30f3\u30c9","IE":"\u30a2\u30a4\u30eb\u30e9\u30f3\u30c9","AZ":"\u30a2\u30bc\u30eb\u30d0\u30a4\u30b8\u30e3\u30f3","AF":"\u30a2\u30d5\u30ac\u30cb\u30b9\u30bf\u30f3","US":"\u30a2\u30e1\u30ea\u30ab\u5408\u8846\u56fd","AE":"\u30a2\u30e9\u30d6\u9996\u9577\u56fd\u9023\u90a6","DZ":"\u30a2\u30eb\u30b8\u30a7\u30ea\u30a2","AR":"\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3","AW":"\u30a2\u30eb\u30d0","AL":"\u30a2\u30eb\u30d0\u30cb\u30a2","AM":"\u30a2\u30eb\u30e1\u30cb\u30a2","AI":"\u30a2\u30f3\u30ae\u30e9","AO":"\u30a2\u30f3\u30b4\u30e9","AG":"\u30a2\u30f3\u30c6\u30a3\u30b0\u30a2\u30fb\u30d0\u30fc\u30d6\u30fc\u30c0","AD":"\u30a2\u30f3\u30c9\u30e9","YE":"\u30a4\u30a8\u30e1\u30f3","GB":"\u30a4\u30ae\u30ea\u30b9","IL":"\u30a4\u30b9\u30e9\u30a8\u30eb","IT":"\u30a4\u30bf\u30ea\u30a2","IQ":"\u30a4\u30e9\u30af","IR":"\u30a4\u30e9\u30f3","IN":"\u30a4\u30f3\u30c9","ID":"\u30a4\u30f3\u30c9\u30cd\u30b7\u30a2","WF":"\u30a6\u30a9\u30ea\u30b9\u30fb\u30d5\u30c4\u30ca","UG":"\u30a6\u30ac\u30f3\u30c0","UA":"\u30a6\u30af\u30e9\u30a4\u30ca","UZ":"\u30a6\u30ba\u30d9\u30ad\u30b9\u30bf\u30f3","UY":"\u30a6\u30eb\u30b0\u30a2\u30a4","EC":"\u30a8\u30af\u30a2\u30c9\u30eb","EG":"\u30a8\u30b8\u30d7\u30c8","EE":"\u30a8\u30b9\u30c8\u30cb\u30a2","SZ":"\u30a8\u30b9\u30ef\u30c6\u30a3\u30cb","ET":"\u30a8\u30c1\u30aa\u30d4\u30a2","ER":"\u30a8\u30ea\u30c8\u30ea\u30a2","SV":"\u30a8\u30eb\u30b5\u30eb\u30d0\u30c9\u30eb","AU":"\u30aa\u30fc\u30b9\u30c8\u30e9\u30ea\u30a2","AT":"\u30aa\u30fc\u30b9\u30c8\u30ea\u30a2","AX":"\u30aa\u30fc\u30e9\u30f3\u30c9\u8af8\u5cf6","OM":"\u30aa\u30de\u30fc\u30f3","NL":"\u30aa\u30e9\u30f3\u30c0","BQ":"\u30aa\u30e9\u30f3\u30c0\u9818\u30ab\u30ea\u30d6","GH":"\u30ac\u30fc\u30ca","CV":"\u30ab\u30fc\u30dc\u30d9\u30eb\u30c7","GG":"\u30ac\u30fc\u30f3\u30b8\u30fc","GY":"\u30ac\u30a4\u30a2\u30ca","KZ":"\u30ab\u30b6\u30d5\u30b9\u30bf\u30f3","QA":"\u30ab\u30bf\u30fc\u30eb","CA":"\u30ab\u30ca\u30c0","GA":"\u30ac\u30dc\u30f3","CM":"\u30ab\u30e1\u30eb\u30fc\u30f3","GM":"\u30ac\u30f3\u30d3\u30a2","KH":"\u30ab\u30f3\u30dc\u30b8\u30a2","GN":"\u30ae\u30cb\u30a2","GW":"\u30ae\u30cb\u30a2\u30d3\u30b5\u30a6","CY":"\u30ad\u30d7\u30ed\u30b9","CU":"\u30ad\u30e5\u30fc\u30d0","CW":"\u30ad\u30e5\u30e9\u30bd\u30fc","GR":"\u30ae\u30ea\u30b7\u30e3","KI":"\u30ad\u30ea\u30d0\u30b9","KG":"\u30ad\u30eb\u30ae\u30b9","GT":"\u30b0\u30a2\u30c6\u30de\u30e9","GP":"\u30b0\u30a2\u30c9\u30eb\u30fc\u30d7","GU":"\u30b0\u30a2\u30e0","KW":"\u30af\u30a6\u30a7\u30fc\u30c8","CK":"\u30af\u30c3\u30af\u8af8\u5cf6","GL":"\u30b0\u30ea\u30fc\u30f3\u30e9\u30f3\u30c9","CX":"\u30af\u30ea\u30b9\u30de\u30b9\u5cf6","GD":"\u30b0\u30ec\u30ca\u30c0","HR":"\u30af\u30ed\u30a2\u30c1\u30a2","KY":"\u30b1\u30a4\u30de\u30f3\u8af8\u5cf6","KE":"\u30b1\u30cb\u30a2","CI":"\u30b3\u30fc\u30c8\u30b8\u30dc\u30ef\u30fc\u30eb","CC":"\u30b3\u30b3\u30b9(\u30ad\u30fc\u30ea\u30f3\u30b0)\u8af8\u5cf6","CR":"\u30b3\u30b9\u30bf\u30ea\u30ab","KM":"\u30b3\u30e2\u30ed","CO":"\u30b3\u30ed\u30f3\u30d3\u30a2","CG":"\u30b3\u30f3\u30b4\u5171\u548c\u56fd(\u30d6\u30e9\u30b6\u30d3\u30eb)","CD":"\u30b3\u30f3\u30b4\u6c11\u4e3b\u5171\u548c\u56fd(\u30ad\u30f3\u30b7\u30e3\u30b5)","SA":"\u30b5\u30a6\u30b8\u30a2\u30e9\u30d3\u30a2","GS":"\u30b5\u30a6\u30b9\u30b8\u30e7\u30fc\u30b8\u30a2\u30fb\u30b5\u30a6\u30b9\u30b5\u30f3\u30c9\u30a6\u30a3\u30c3\u30c1\u8af8\u5cf6","WS":"\u30b5\u30e2\u30a2","BL":"\u30b5\u30f3\u30fb\u30d0\u30eb\u30c6\u30eb\u30df\u30fc","MF":"\u30b5\u30f3\u30fb\u30de\u30eb\u30bf\u30f3","ST":"\u30b5\u30f3\u30c8\u30e1\u30fb\u30d7\u30ea\u30f3\u30b7\u30da","ZM":"\u30b6\u30f3\u30d3\u30a2","PM":"\u30b5\u30f3\u30d4\u30a8\u30fc\u30eb\u5cf6\u30fb\u30df\u30af\u30ed\u30f3\u5cf6","SM":"\u30b5\u30f3\u30de\u30ea\u30ce","SL":"\u30b7\u30a8\u30e9\u30ec\u30aa\u30cd","DJ":"\u30b8\u30d6\u30c1","GI":"\u30b8\u30d6\u30e9\u30eb\u30bf\u30eb","JE":"\u30b8\u30e3\u30fc\u30b8\u30fc","JM":"\u30b8\u30e3\u30de\u30a4\u30ab","GE":"\u30b8\u30e7\u30fc\u30b8\u30a2","SY":"\u30b7\u30ea\u30a2","SG":"\u30b7\u30f3\u30ac\u30dd\u30fc\u30eb","SX":"\u30b7\u30f3\u30c8\u30fb\u30de\u30fc\u30eb\u30c6\u30f3","ZW":"\u30b8\u30f3\u30d0\u30d6\u30a8","CH":"\u30b9\u30a4\u30b9","SE":"\u30b9\u30a6\u30a7\u30fc\u30c7\u30f3","SD":"\u30b9\u30fc\u30c0\u30f3","SJ":"\u30b9\u30d0\u30fc\u30eb\u30d0\u30eb\u8af8\u5cf6\u30fb\u30e4\u30f3\u30de\u30a4\u30a8\u30f3\u5cf6","ES":"\u30b9\u30da\u30a4\u30f3","SR":"\u30b9\u30ea\u30ca\u30e0","LK":"\u30b9\u30ea\u30e9\u30f3\u30ab","SK":"\u30b9\u30ed\u30d0\u30ad\u30a2","SI":"\u30b9\u30ed\u30d9\u30cb\u30a2","SC":"\u30bb\u30fc\u30b7\u30a7\u30eb","SN":"\u30bb\u30cd\u30ac\u30eb","RS":"\u30bb\u30eb\u30d3\u30a2","KN":"\u30bb\u30f3\u30c8\u30af\u30ea\u30b9\u30c8\u30d5\u30a1\u30fc\u30fb\u30cd\u30fc\u30f4\u30a3\u30b9","VC":"\u30bb\u30f3\u30c8\u30d3\u30f3\u30bb\u30f3\u30c8\u53ca\u3073\u30b0\u30ec\u30ca\u30c7\u30a3\u30fc\u30f3\u8af8\u5cf6","SH":"\u30bb\u30f3\u30c8\u30d8\u30ec\u30ca","LC":"\u30bb\u30f3\u30c8\u30eb\u30b7\u30a2","SO":"\u30bd\u30de\u30ea\u30a2","SB":"\u30bd\u30ed\u30e2\u30f3\u8af8\u5cf6","TC":"\u30bf\u30fc\u30af\u30b9\u30fb\u30ab\u30a4\u30b3\u30b9\u8af8\u5cf6","TH":"\u30bf\u30a4","TJ":"\u30bf\u30b8\u30ad\u30b9\u30bf\u30f3","TZ":"\u30bf\u30f3\u30b6\u30cb\u30a2","CZ":"\u30c1\u30a7\u30b3","TD":"\u30c1\u30e3\u30c9","TN":"\u30c1\u30e5\u30cb\u30b8\u30a2","CL":"\u30c1\u30ea","TV":"\u30c4\u30d0\u30eb","DK":"\u30c7\u30f3\u30de\u30fc\u30af","DE":"\u30c9\u30a4\u30c4","TG":"\u30c8\u30fc\u30b4","TK":"\u30c8\u30b1\u30e9\u30a6","DO":"\u30c9\u30df\u30cb\u30ab\u5171\u548c\u56fd","DM":"\u30c9\u30df\u30cb\u30ab\u56fd","TT":"\u30c8\u30ea\u30cb\u30c0\u30fc\u30c9\u30fb\u30c8\u30d0\u30b4","TM":"\u30c8\u30eb\u30af\u30e1\u30cb\u30b9\u30bf\u30f3","TR":"\u30c8\u30eb\u30b3","TO":"\u30c8\u30f3\u30ac","NG":"\u30ca\u30a4\u30b8\u30a7\u30ea\u30a2","NR":"\u30ca\u30a6\u30eb","NA":"\u30ca\u30df\u30d3\u30a2","NU":"\u30cb\u30a6\u30a8","NI":"\u30cb\u30ab\u30e9\u30b0\u30a2","NE":"\u30cb\u30b8\u30a7\u30fc\u30eb","NC":"\u30cb\u30e5\u30fc\u30ab\u30ec\u30c9\u30cb\u30a2","NZ":"\u30cb\u30e5\u30fc\u30b8\u30fc\u30e9\u30f3\u30c9","NP":"\u30cd\u30d1\u30fc\u30eb","NF":"\u30ce\u30fc\u30d5\u30a9\u30fc\u30af\u5cf6","NO":"\u30ce\u30eb\u30a6\u30a7\u30fc","HM":"\u30cf\u30fc\u30c9\u5cf6\u30fb\u30de\u30af\u30c9\u30ca\u30eb\u30c9\u8af8\u5cf6","BH":"\u30d0\u30fc\u30ec\u30fc\u30f3","HT":"\u30cf\u30a4\u30c1","PK":"\u30d1\u30ad\u30b9\u30bf\u30f3","VA":"\u30d0\u30c1\u30ab\u30f3\u5e02\u56fd","PA":"\u30d1\u30ca\u30de","VU":"\u30d0\u30cc\u30a2\u30c4","BS":"\u30d0\u30cf\u30de","PG":"\u30d1\u30d7\u30a2\u30cb\u30e5\u30fc\u30ae\u30cb\u30a2","BM":"\u30d0\u30df\u30e5\u30fc\u30c0","PW":"\u30d1\u30e9\u30aa","PY":"\u30d1\u30e9\u30b0\u30a2\u30a4","BB":"\u30d0\u30eb\u30d0\u30c9\u30b9","PS":"\u30d1\u30ec\u30b9\u30c1\u30ca\u81ea\u6cbb\u533a","HU":"\u30cf\u30f3\u30ac\u30ea\u30fc","BD":"\u30d0\u30f3\u30b0\u30e9\u30c7\u30b7\u30e5","PN":"\u30d4\u30c8\u30b1\u30a2\u30f3\u8af8\u5cf6","FJ":"\u30d5\u30a3\u30b8\u30fc","PH":"\u30d5\u30a3\u30ea\u30d4\u30f3","FI":"\u30d5\u30a3\u30f3\u30e9\u30f3\u30c9","BT":"\u30d6\u30fc\u30bf\u30f3","BV":"\u30d6\u30fc\u30d9\u5cf6","PR":"\u30d7\u30a8\u30eb\u30c8\u30ea\u30b3","FO":"\u30d5\u30a7\u30ed\u30fc\u8af8\u5cf6","FK":"\u30d5\u30a9\u30fc\u30af\u30e9\u30f3\u30c9\u8af8\u5cf6","BR":"\u30d6\u30e9\u30b8\u30eb","FR":"\u30d5\u30e9\u30f3\u30b9","BG":"\u30d6\u30eb\u30ac\u30ea\u30a2","BF":"\u30d6\u30eb\u30ad\u30ca\u30d5\u30a1\u30bd","BN":"\u30d6\u30eb\u30cd\u30a4","BI":"\u30d6\u30eb\u30f3\u30b8","VN":"\u30d9\u30c8\u30ca\u30e0","BJ":"\u30d9\u30ca\u30f3","VE":"\u30d9\u30cd\u30ba\u30a8\u30e9","BY":"\u30d9\u30e9\u30eb\u30fc\u30b7","BZ":"\u30d9\u30ea\u30fc\u30ba","PE":"\u30da\u30eb\u30fc","BE":"\u30d9\u30eb\u30ae\u30fc","PL":"\u30dd\u30fc\u30e9\u30f3\u30c9","BA":"\u30dc\u30b9\u30cb\u30a2\u30fb\u30d8\u30eb\u30c4\u30a7\u30b4\u30d3\u30ca","BW":"\u30dc\u30c4\u30ef\u30ca","BO":"\u30dc\u30ea\u30d3\u30a2","PT":"\u30dd\u30eb\u30c8\u30ac\u30eb","HN":"\u30db\u30f3\u30b8\u30e5\u30e9\u30b9","MH":"\u30de\u30fc\u30b7\u30e3\u30eb\u8af8\u5cf6","MG":"\u30de\u30c0\u30ac\u30b9\u30ab\u30eb","YT":"\u30de\u30e8\u30c3\u30c8","MW":"\u30de\u30e9\u30a6\u30a4","ML":"\u30de\u30ea","MT":"\u30de\u30eb\u30bf","MQ":"\u30de\u30eb\u30c6\u30a3\u30cb\u30fc\u30af","MY":"\u30de\u30ec\u30fc\u30b7\u30a2","IM":"\u30de\u30f3\u5cf6","FM":"\u30df\u30af\u30ed\u30cd\u30b7\u30a2\u9023\u90a6","MM":"\u30df\u30e3\u30f3\u30de\u30fc (\u30d3\u30eb\u30de)","MX":"\u30e1\u30ad\u30b7\u30b3","MU":"\u30e2\u30fc\u30ea\u30b7\u30e3\u30b9","MR":"\u30e2\u30fc\u30ea\u30bf\u30cb\u30a2","MZ":"\u30e2\u30b6\u30f3\u30d3\u30fc\u30af","MC":"\u30e2\u30ca\u30b3","MV":"\u30e2\u30eb\u30c7\u30a3\u30d6","MD":"\u30e2\u30eb\u30c9\u30d0","MA":"\u30e2\u30ed\u30c3\u30b3","MN":"\u30e2\u30f3\u30b4\u30eb","ME":"\u30e2\u30f3\u30c6\u30cd\u30b0\u30ed","MS":"\u30e2\u30f3\u30c8\u30bb\u30e9\u30c8","JO":"\u30e8\u30eb\u30c0\u30f3","LA":"\u30e9\u30aa\u30b9","LV":"\u30e9\u30c8\u30d3\u30a2","LT":"\u30ea\u30c8\u30a2\u30cb\u30a2","LY":"\u30ea\u30d3\u30a2","LI":"\u30ea\u30d2\u30c6\u30f3\u30b7\u30e5\u30bf\u30a4\u30f3","LR":"\u30ea\u30d9\u30ea\u30a2","RO":"\u30eb\u30fc\u30de\u30cb\u30a2","LU":"\u30eb\u30af\u30bb\u30f3\u30d6\u30eb\u30af","RW":"\u30eb\u30ef\u30f3\u30c0","LS":"\u30ec\u30bd\u30c8","LB":"\u30ec\u30d0\u30ce\u30f3","RE":"\u30ec\u30e6\u30cb\u30aa\u30f3","RU":"\u30ed\u30b7\u30a2","IO":"\u82f1\u9818\u30a4\u30f3\u30c9\u6d0b\u5730\u57df","VG":"\u82f1\u9818\u30f4\u30a1\u30fc\u30b8\u30f3\u8af8\u5cf6","KR":"\u97d3\u56fd","UM":"\u5408\u8846\u56fd\u9818\u6709\u5c0f\u96e2\u5cf6","EH":"\u897f\u30b5\u30cf\u30e9","GQ":"\u8d64\u9053\u30ae\u30cb\u30a2","TW":"\u53f0\u6e7e","CF":"\u4e2d\u592e\u30a2\u30d5\u30ea\u30ab\u5171\u548c\u56fd","MO":"\u4e2d\u83ef\u4eba\u6c11\u5171\u548c\u56fd\u30de\u30ab\u30aa\u7279\u5225\u884c\u653f\u533a","HK":"\u4e2d\u83ef\u4eba\u6c11\u5171\u548c\u56fd\u9999\u6e2f\u7279\u5225\u884c\u653f\u533a","CN":"\u4e2d\u56fd","TL":"\u6771\u30c6\u30a3\u30e2\u30fc\u30eb","ZA":"\u5357\u30a2\u30d5\u30ea\u30ab","SS":"\u5357\u30b9\u30fc\u30c0\u30f3","AQ":"\u5357\u6975","JP":"\u65e5\u672c","GF":"\u4ecf\u9818\u30ae\u30a2\u30ca","PF":"\u4ecf\u9818\u30dd\u30ea\u30cd\u30b7\u30a2","TF":"\u4ecf\u9818\u6975\u5357\u8af8\u5cf6","VI":"\u7c73\u9818\u30f4\u30a1\u30fc\u30b8\u30f3\u8af8\u5cf6","AS":"\u7c73\u9818\u30b5\u30e2\u30a2","MK":"\u5317\u30de\u30b1\u30c9\u30cb\u30a2","MP":"\u5317\u30de\u30ea\u30a2\u30ca\u8af8\u5cf6","KP":"\u5317\u671d\u9bae"}
\ No newline at end of file
diff --git a/public/country/mn-MN.json b/public/country/mn-MN.json
new file mode 100644
index 00000000..77be92aa
--- /dev/null
+++ b/public/country/mn-MN.json
@@ -0,0 +1 @@
+{"AU":"\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438","AT":"\u0410\u0432\u0441\u0442\u0440\u0438","AZ":"\u0410\u0437\u0435\u0440\u0431\u0430\u0439\u0436\u0430\u043d","AX":"\u0410\u043b\u0430\u043d\u0434\u044b\u043d \u0430\u0440\u043b\u0443\u0443\u0434","AL":"\u0410\u043b\u0431\u0430\u043d\u0438","DZ":"\u0410\u043b\u0436\u0438\u0440","US":"\u0410\u043c\u0435\u0440\u0438\u043a\u0438\u0439\u043d \u041d\u044d\u0433\u0434\u0441\u044d\u043d \u0423\u043b\u0441","UM":"\u0410\u043c\u0435\u0440\u0438\u043a\u0438\u0439\u043d \u041d\u044d\u0433\u0434\u0441\u044d\u043d \u0423\u043b\u0441\u044b\u043d \u0431\u0430\u0433\u0430 \u0430\u0440\u043b\u0443\u0443\u0434","AS":"\u0410\u043c\u0435\u0440\u0438\u043a\u0438\u0439\u043d \u0421\u0430\u043c\u043e\u0430","AI":"\u0410\u043d\u0433\u0438\u043b\u044c\u044f","AO":"\u0410\u043d\u0433\u043e\u043b","AD":"\u0410\u043d\u0434\u043e\u0440\u0440\u0430","AQ":"\u0410\u043d\u0442\u0430\u0440\u043a\u0442\u0438\u0434","AG":"\u0410\u043d\u0442\u0438\u0433\u0443\u0430 \u0431\u0430 \u0411\u0430\u0440\u0431\u0443\u0434\u0430","VI":"\u0410\u041d\u0423-\u044b\u043d \u0412\u0438\u0440\u0436\u0438\u043d\u0438\u0439 \u0430\u0440\u043b\u0443\u0443\u0434","AE":"\u0410\u0440\u0430\u0431\u044b\u043d \u041d\u044d\u0433\u0434\u0441\u044d\u043d \u042d\u043c\u0438\u0440\u0442 \u0423\u043b\u0441","AR":"\u0410\u0440\u0433\u0435\u043d\u0442\u0438\u043d","AM":"\u0410\u0440\u043c\u0435\u043d\u0438","AW":"\u0410\u0440\u0443\u0431\u0430","AF":"\u0410\u0444\u0433\u0430\u043d\u0438\u0441\u0442\u0430\u043d","BS":"\u0411\u0430\u0433\u0430\u043c\u044b\u043d \u0430\u0440\u043b\u0443\u0443\u0434","NP":"\u0411\u0430\u043b\u0431\u0430","BD":"\u0411\u0430\u043d\u0433\u043b\u0430\u0434\u0435\u0448","BB":"\u0411\u0430\u0440\u0431\u0430\u0434\u043e\u0441","EH":"\u0411\u0430\u0440\u0443\u0443\u043d \u0421\u0430\u0445\u0430\u0440","BH":"\u0411\u0430\u0445\u0440\u0435\u0439\u043d","BY":"\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u044c","BZ":"\u0411\u0435\u043b\u0438\u0437\u0435","BE":"\u0411\u0435\u043b\u044c\u0433\u0438","BJ":"\u0411\u0435\u043d\u0438\u043d","BM":"\u0411\u0435\u0440\u043c\u0443\u0434\u0430","MO":"\u0411\u041d\u0425\u0410\u0423-\u044b\u043d \u0422\u0443\u0441\u0433\u0430\u0439 \u0437\u0430\u0445\u0438\u0440\u0433\u0430\u0430\u043d\u044b \u0431\u04af\u0441 \u041c\u0430\u043a\u0430\u043e","HK":"\u0411\u041d\u0425\u0410\u0423-\u044b\u043d \u0422\u0443\u0441\u0433\u0430\u0439 \u0437\u0430\u0445\u0438\u0440\u0433\u0430\u0430\u043d\u044b \u0431\u04af\u0441 \u0425\u043e\u043d\u0433 \u041a\u043e\u043d\u0433","BG":"\u0411\u043e\u043b\u0433\u0430\u0440","BO":"\u0411\u043e\u043b\u0438\u0432\u0438","BA":"\u0411\u043e\u0441\u043d\u0438-\u0413\u0435\u0440\u0446\u0435\u0433\u043e\u0432\u0438\u043d","BW":"\u0411\u043e\u0442\u0441\u0432\u0430\u043d","BR":"\u0411\u0440\u0430\u0437\u0438\u043b","VG":"\u0411\u0440\u0438\u0442\u0430\u043d\u0438\u0439\u043d \u0412\u0438\u0440\u0436\u0438\u043d\u0438\u0439 \u0430\u0440\u043b\u0443\u0443\u0434","IO":"\u0411\u0440\u0438\u0442\u0430\u043d\u0438\u0439\u043d \u0445\u0430\u0440\u044c\u044f\u0430 \u042d\u043d\u044d\u0442\u0445\u044d\u0433\u0438\u0439\u043d \u0434\u0430\u043b\u0430\u0439 \u0434\u0430\u0445\u044c \u043d\u0443\u0442\u0430\u0433 \u0434\u044d\u0432\u0441\u0433\u044d\u0440","BN":"\u0411\u0440\u0443\u043d\u0435\u0439","BV":"\u0411\u0443\u0432\u0435 \u0430\u0440\u0430\u043b","BF":"\u0411\u0443\u0440\u043a\u0438\u043d\u0430 \u0424\u0430\u0441\u043e","BI":"\u0411\u0443\u0440\u0443\u043d\u0434\u0438","BT":"\u0411\u0443\u0442\u0430\u043d","DO":"\u0411\u04af\u0433\u0434 \u041d\u0430\u0439\u0440\u0430\u043c\u0434\u0430\u0445 \u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430\u043d \u0423\u043b\u0441","VU":"\u0412\u0430\u043d\u0443\u0430\u0442\u0443","VA":"\u0412\u0430\u0442\u0438\u043a\u0430\u043d \u0445\u043e\u0442 \u0443\u043b\u0441","VE":"\u0412\u0435\u043d\u0435\u0441\u0443\u044d\u043b","VN":"\u0412\u044c\u0435\u0442\u043d\u0430\u043c","GA":"\u0413\u0430\u0431\u043e\u043d","HT":"\u0413\u0430\u0438\u0442\u0438","GY":"\u0413\u0430\u0439\u0430\u043d\u0430","GM":"\u0413\u0430\u043c\u0431\u0438","GH":"\u0413\u0430\u043d\u0430","GP":"\u0413\u0432\u0430\u0434\u0435\u043b\u0443\u043f","GT":"\u0413\u0432\u0430\u0442\u0435\u043c\u0430\u043b","GN":"\u0413\u0432\u0438\u043d\u0435\u0439","GW":"\u0413\u0432\u0438\u043d\u0435\u0439-\u0411\u0438\u0441\u0430\u0443","DE":"\u0413\u0435\u0440\u043c\u0430\u043d","GG":"\u0413\u0435\u0440\u043d\u0441\u0438","GI":"\u0413\u0438\u0431\u0440\u0430\u043b\u0442\u0430\u0440","HN":"\u0413\u043e\u043d\u0434\u0443\u0440\u0430\u0441","GR":"\u0413\u0440\u0435\u043a","GD":"\u0413\u0440\u0435\u043d\u0430\u0434\u0430","GL":"\u0413\u0440\u0435\u043d\u043b\u0430\u043d\u0434","GU":"\u0413\u0443\u0430\u043c","GE":"\u0413\u04af\u0440\u0436","DK":"\u0414\u0430\u043d\u0438","DJ":"\u0414\u0436\u0438\u0431\u0443\u0442\u0438","DM":"\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430","EG":"\u0415\u0433\u0438\u043f\u0435\u0442","JE":"\u0416\u0435\u0440\u0441\u0438","ZM":"\u0417\u0430\u043c\u0431\u0438","ZW":"\u0417\u0438\u043c\u0431\u0430\u0431\u0432\u0435","CX":"\u0417\u0443\u043b \u0441\u0430\u0440\u044b\u043d \u0430\u0440\u0430\u043b","IL":"\u0418\u0437\u0440\u0430\u0438\u043b\u044c","ID":"\u0418\u043d\u0434\u043e\u043d\u0435\u0437","IQ":"\u0418\u0440\u0430\u043a","IR":"\u0418\u0440\u0430\u043d","IE":"\u0418\u0440\u043b\u0430\u043d\u0434","IS":"\u0418\u0441\u043b\u0430\u043d\u0434","ES":"\u0418\u0441\u043f\u0430\u043d\u0438","IT":"\u0418\u0442\u0430\u043b\u0438","GB":"\u0418\u0445 \u0411\u0440\u0438\u0442\u0430\u043d\u0438","YE":"\u0419\u0435\u043c\u0435\u043d","JO":"\u0419\u043e\u0440\u0434\u0430\u043d","CV":"\u041a\u0430\u0431\u043e-\u0412\u0435\u0440\u0434\u0435","KZ":"\u041a\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043d","KY":"\u041a\u0430\u0439\u043c\u0430\u043d\u044b \u0430\u0440\u043b\u0443\u0443\u0434","KH":"\u041a\u0430\u043c\u0431\u043e\u0436","CM":"\u041a\u0430\u043c\u0435\u0440\u0443\u043d","CA":"\u041a\u0430\u043d\u0430\u0434","BQ":"\u041a\u0430\u0440\u0438\u0431\u044b\u043d \u041d\u0438\u0434\u0435\u0440\u043b\u0430\u043d\u0434","QA":"\u041a\u0430\u0442\u0430\u0440","KE":"\u041a\u0435\u043d\u0438","CY":"\u041a\u0438\u043f\u0440","KI":"\u041a\u0438\u0440\u0438\u0431\u0430\u0442\u0438","CC":"\u041a\u043e\u043a\u043e\u0441 (\u041a\u0438\u0439\u043b\u0438\u043d\u0433) \u0430\u0440\u043b\u0443\u0443\u0434","CO":"\u041a\u043e\u043b\u0443\u043c\u0431\u0438","KM":"\u041a\u043e\u043c\u043e\u0440\u044b\u043d \u0430\u0440\u043b\u0443\u0443\u0434","CG":"\u041a\u043e\u043d\u0433\u043e-\u0411\u0440\u0430\u0437\u0437\u0430\u0432\u0438\u043b\u044c","CD":"\u041a\u043e\u043d\u0433\u043e-\u041a\u0438\u043d\u0448\u0430\u0441\u0430","CR":"\u041a\u043e\u0441\u0442\u0430-\u0420\u0438\u043a\u0430","CI":"\u041a\u043e\u0442-\u0434\u2019\u0418\u0432\u0443\u0430\u0440","CU":"\u041a\u0443\u0431\u0430","KW":"\u041a\u0443\u0432\u0435\u0439\u0442","CK":"\u041a\u04af\u04af\u043a\u0438\u0439\u043d \u0430\u0440\u043b\u0443\u0443\u0434","KG":"\u041a\u044b\u0440\u0433\u044b\u0437\u0441\u0442\u0430\u043d","CW":"\u041a\u044e\u0440\u0430\u0441\u0430\u043e","LA":"\u041b\u0430\u043e\u0441","LV":"\u041b\u0430\u0442\u0432\u0438","LS":"\u041b\u0435\u0441\u043e\u0442\u043e","LR":"\u041b\u0438\u0431\u0435\u0440\u0438","LB":"\u041b\u0438\u0432\u0430\u043d","LY":"\u041b\u0438\u0432\u0438","LT":"\u041b\u0438\u0442\u0432\u0430","LI":"\u041b\u0438\u0445\u0442\u0435\u043d\u0448\u0442\u0435\u0439\u043d","LU":"\u041b\u044e\u043a\u0441\u0435\u043c\u0431\u0443\u0440\u0433","MU":"\u041c\u0430\u0432\u0440\u0438\u043a\u0438\u0439","MR":"\u041c\u0430\u0432\u0440\u0438\u0442\u0430\u043d\u0438","MG":"\u041c\u0430\u0434\u0430\u0433\u0430\u0441\u043a\u0430\u0440","YT":"\u041c\u0430\u0439\u043e\u0442\u0442\u0430","MW":"\u041c\u0430\u043b\u0430\u0432\u0438","MY":"\u041c\u0430\u043b\u0430\u0439\u0437","ML":"\u041c\u0430\u043b\u0438","MV":"\u041c\u0430\u043b\u044c\u0434\u0438\u0432","MT":"\u041c\u0430\u043b\u044c\u0442\u0430","MQ":"\u041c\u0430\u0440\u0442\u0438\u043d\u0438\u043a","MH":"\u041c\u0430\u0440\u0448\u0430\u043b\u043b\u044b\u043d \u0430\u0440\u043b\u0443\u0443\u0434","MX":"\u041c\u0435\u043a\u0441\u0438\u043a","FM":"\u041c\u0438\u043a\u0440\u043e\u043d\u0435\u0437\u0438","MZ":"\u041c\u043e\u0437\u0430\u043c\u0431\u0438\u043a","MD":"\u041c\u043e\u043b\u0434\u043e\u0432\u0430","MC":"\u041c\u043e\u043d\u0430\u043a\u043e","MN":"\u041c\u043e\u043d\u0433\u043e\u043b","ME":"\u041c\u043e\u043d\u0442\u0435\u043d\u0435\u0433\u0440\u043e","MS":"\u041c\u043e\u043d\u0442\u0441\u0435\u0440\u0440\u0430\u0442","MA":"\u041c\u043e\u0440\u043e\u043a\u043a\u043e","MM":"\u041c\u044c\u044f\u043d\u043c\u0430\u0440","IM":"\u041c\u044d\u043d \u0410\u0440\u0430\u043b","NA":"\u041d\u0430\u043c\u0438\u0431\u0438","NR":"\u041d\u0430\u0443\u0440\u0443","NE":"\u041d\u0438\u0433\u0435\u0440","NG":"\u041d\u0438\u0433\u0435\u0440\u0438","NL":"\u041d\u0438\u0434\u0435\u0440\u043b\u0430\u043d\u0434","NI":"\u041d\u0438\u043a\u0430\u0440\u0430\u0433\u0443\u0430","NU":"\u041d\u0438\u0443\u044d","NO":"\u041d\u043e\u0440\u0432\u0435\u0433\u0438","NF":"\u041d\u043e\u0440\u0444\u043e\u043b\u043a \u0430\u0440\u0430\u043b","OM":"\u041e\u043c\u0430\u043d","RU":"\u041e\u0440\u043e\u0441","ZA":"\u04e8\u043c\u043d\u04e9\u0434 \u0410\u0444\u0440\u0438\u043a","GS":"\u04e8\u043c\u043d\u04e9\u0434 \u0416\u043e\u0440\u0436\u0438\u0430 \u0431\u0430 \u04e8\u043c\u043d\u04e9\u0434 \u0421\u044d\u043d\u0434\u0432\u0438\u0447\u0438\u0439\u043d \u0430\u0440\u043b\u0443\u0443\u0434","KR":"\u04e8\u043c\u043d\u04e9\u0434 \u0421\u043e\u043b\u043e\u043d\u0433\u043e\u0441","SS":"\u04e8\u043c\u043d\u04e9\u0434 \u0421\u0443\u0434\u0430\u043d","PK":"\u041f\u0430\u043a\u0438\u0441\u0442\u0430\u043d","PW":"\u041f\u0430\u043b\u0430\u0443","PS":"\u041f\u0430\u043b\u0435\u0441\u0442\u0438\u043d\u044b \u043d\u0443\u0442\u0430\u0433 \u0434\u044d\u0432\u0441\u0433\u044d\u0440","PA":"\u041f\u0430\u043d\u0430\u043c","PG":"\u041f\u0430\u043f\u0443\u0430 \u0428\u0438\u043d\u044d \u0413\u0432\u0438\u043d\u0435\u0439","PY":"\u041f\u0430\u0440\u0430\u0433\u0432\u0430\u0439","PE":"\u041f\u0435\u0440\u0443","PN":"\u041f\u0438\u0442\u043a\u044d\u0440\u043d \u0430\u0440\u043b\u0443\u0443\u0434","PL":"\u041f\u043e\u043b\u044c\u0448","PT":"\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b","PR":"\u041f\u0443\u044d\u0440\u0442\u043e-\u0420\u0438\u043a\u043e","RE":"\u0420\u0435\u044e\u043d\u0438\u043e\u043d","RW":"\u0420\u0443\u0430\u043d\u0434\u0430","RO":"\u0420\u0443\u043c\u044b\u043d","WS":"\u0421\u0430\u043c\u043e\u0430","SM":"\u0421\u0430\u043d-\u041c\u0430\u0440\u0438\u043d\u043e","ST":"\u0421\u0430\u043d-\u0422\u043e\u043c\u0435 \u0431\u0430 \u041f\u0440\u0438\u043d\u0441\u0438\u043f\u0438","SA":"\u0421\u0430\u0443\u0434\u044b\u043d \u0410\u0440\u0430\u0431","SJ":"\u0421\u0432\u0430\u043b\u0431\u0430\u0440\u0434 \u0431\u0430 \u042f\u043d \u041c\u0430\u0439\u0435\u043d","SC":"\u0421\u0435\u0439\u0448\u0435\u043b\u0438\u0439\u043d \u0430\u0440\u043b\u0443\u0443\u0434","SN":"\u0421\u0435\u043d\u0435\u0433\u0430\u043b","LC":"\u0421\u0435\u043d\u0442 \u041b\u044e\u0441\u0438\u0430","SH":"\u0421\u0435\u043d\u0442 \u0425\u0435\u043b\u0435\u043d\u0430","BL":"\u0421\u0435\u043d\u0442-\u0411\u0430\u0440\u0442\u0435\u043b\u044c\u043c\u0438","VC":"\u0421\u0435\u043d\u0442-\u0412\u0438\u043d\u0441\u0435\u043d\u0442 \u0431\u0430 \u0413\u0440\u0435\u043d\u0430\u0434\u0438\u043d","KN":"\u0421\u0435\u043d\u0442-\u041a\u0438\u0442\u0442\u0441 \u0431\u0430 \u041d\u0435\u0432\u0438\u0441","MF":"\u0421\u0435\u043d\u0442-\u041c\u0430\u0440\u0442\u0438\u043d","PM":"\u0421\u0435\u043d\u0442-\u041f\u044c\u0435\u0440 \u0431\u0430 \u041c\u0438\u043a\u0435\u043b\u043e","RS":"\u0421\u0435\u0440\u0431\u0438","SG":"\u0421\u0438\u043d\u0433\u0430\u043f\u0443\u0440","SX":"\u0421\u0438\u043d\u0442 \u041c\u0430\u0440\u0442\u0435\u043d","SY":"\u0421\u0438\u0440\u0438","SK":"\u0421\u043b\u043e\u0432\u0430\u043a","SI":"\u0421\u043b\u043e\u0432\u0435\u043d\u0438","SB":"\u0421\u043e\u043b\u043e\u043c\u043e\u043d\u044b \u0430\u0440\u043b\u0443\u0443\u0434","SO":"\u0421\u043e\u043c\u0430\u043b\u0438","SD":"\u0421\u0443\u0434\u0430\u043d","SR":"\u0421\u0443\u0440\u0438\u043d\u0430\u043c","SL":"\u0421\u044c\u0435\u0440\u0440\u0430-\u041b\u0435\u043e\u043d\u0435","TJ":"\u0422\u0430\u0436\u0438\u043a\u0438\u0441\u0442\u0430\u043d","TW":"\u0422\u0430\u0439\u0432\u0430\u043d\u044c","TH":"\u0422\u0430\u0439\u043b\u0430\u043d\u0434","TZ":"\u0422\u0430\u043d\u0437\u0430\u043d\u0438","TL":"\u0422\u0438\u043c\u043e\u0440-\u041b\u0435\u0441\u0442\u0435","TG":"\u0422\u043e\u0433\u043e","TK":"\u0422\u043e\u043a\u0435\u043b\u0430\u0443","TO":"\u0422\u043e\u043d\u0433\u0430","CF":"\u0422\u04e9\u0432 \u0410\u0444\u0440\u0438\u043a\u0438\u0439\u043d \u0411\u04af\u0433\u0434 \u041d\u0430\u0439\u0440\u0430\u043c\u0434\u0430\u0445 \u0423\u043b\u0441","TT":"\u0422\u0440\u0438\u043d\u0438\u0434\u0430\u0434 \u0431\u0430 \u0422\u043e\u0431\u0430\u0433\u043e","TV":"\u0422\u0443\u0432\u0430\u043b\u0443","TN":"\u0422\u0443\u043d\u0438\u0441","TR":"\u0422\u0443\u0440\u043a","TC":"\u0422\u0443\u0440\u043a \u0431\u0430 \u041a\u0430\u0439\u043a\u043e\u0441\u044b\u043d \u0410\u0440\u043b\u0443\u0443\u0434","TM":"\u0422\u0443\u0440\u043a\u043c\u0435\u043d\u0438\u0441\u0442\u0430\u043d","UG":"\u0423\u0433\u0430\u043d\u0434\u0430","UZ":"\u0423\u0437\u0431\u0435\u043a\u0438\u0441\u0442\u0430\u043d","UA":"\u0423\u043a\u0440\u0430\u0438\u043d","HU":"\u0423\u043d\u0433\u0430\u0440","WF":"\u0423\u043e\u043b\u043b\u0438\u0441 \u0431\u0430 \u0424\u0443\u0442\u0443\u043d\u0430","UY":"\u0423\u0440\u0443\u0433\u0432\u0430\u0439","FO":"\u0424\u0430\u0440\u0435\u0440\u044b\u043d \u0430\u0440\u043b\u0443\u0443\u0434","FJ":"\u0424\u0438\u0436\u0438","PH":"\u0424\u0438\u043b\u0438\u043f\u043f\u0438\u043d","FI":"\u0424\u0438\u043d\u043b\u044f\u043d\u0434","FK":"\u0424\u043e\u043b\u043a\u043b\u0435\u043d\u0434\u0438\u0439\u043d \u0430\u0440\u043b\u0443\u0443\u0434","FR":"\u0424\u0440\u0430\u043d\u0446","GF":"\u0424\u0440\u0430\u043d\u0446\u044b\u043d \u0413\u0432\u0438\u0430\u043d\u0430","TF":"\u0424\u0440\u0430\u043d\u0446\u044b\u043d \u04e9\u043c\u043d\u04e9\u0434 \u0433\u0430\u0437\u0430\u0440 \u043d\u0443\u0442\u0430\u0433","PF":"\u0424\u0440\u0430\u043d\u0446\u044b\u043d \u041f\u043e\u043b\u0438\u043d\u0435\u0437","HM":"\u0425\u0435\u0440\u0434 \u0431\u0430 \u041c\u0430\u043a\u0434\u043e\u043d\u0430\u043b\u044c\u0434\u0438\u0439\u043d \u0430\u0440\u043b\u0443\u0443\u0434","MK":"\u0425\u043e\u0439\u0434 \u041c\u0430\u043a\u0435\u0434\u043e\u043d","MP":"\u0425\u043e\u0439\u0434 \u041c\u0430\u0440\u0438\u0430\u043d\u044b \u0430\u0440\u043b\u0443\u0443\u0434","KP":"\u0425\u043e\u0439\u0434 \u0421\u043e\u043b\u043e\u043d\u0433\u043e\u0441","HR":"\u0425\u043e\u0440\u0432\u0430\u0442","CN":"\u0425\u044f\u0442\u0430\u0434","TD":"\u0427\u0430\u0434","CZ":"\u0427\u0435\u0445","CL":"\u0427\u0438\u043b\u0438","SE":"\u0428\u0432\u0435\u0434","CH":"\u0428\u0432\u0435\u0439\u0446\u0430\u0440\u044c","NZ":"\u0428\u0438\u043d\u044d \u0417\u0435\u043b\u0430\u043d\u0434","NC":"\u0428\u0438\u043d\u044d \u041a\u0430\u043b\u0435\u0434\u043e\u043d\u0438","LK":"\u0428\u0440\u0438-\u041b\u0430\u043d\u043a\u0430","EC":"\u042d\u043a\u0432\u0430\u0434\u043e\u0440","GQ":"\u042d\u043a\u0432\u0430\u0442\u043e\u0440\u044b\u043d \u0413\u0432\u0438\u043d\u0435\u0439","SV":"\u042d\u043b\u044c \u0421\u0430\u043b\u044c\u0432\u0430\u0434\u043e\u0440","IN":"\u042d\u043d\u044d\u0442\u0445\u044d\u0433","ER":"\u042d\u0440\u0438\u0442\u0440\u0435\u0439","SZ":"\u042d\u0441\u0432\u0430\u0442\u0438\u043d\u0438","EE":"\u042d\u0441\u0442\u043e\u043d\u0438","ET":"\u042d\u0442\u0438\u043e\u043f","JM":"\u042f\u043c\u0430\u0439\u043a\u0430","JP":"\u042f\u043f\u043e\u043d"}
\ No newline at end of file
diff --git a/public/country/nl-NL.json b/public/country/nl-NL.json
new file mode 100644
index 00000000..b8ba4222
--- /dev/null
+++ b/public/country/nl-NL.json
@@ -0,0 +1 @@
+{"AF":"Afghanistan","AX":"\u00c5land","AL":"Albani\u00eb","DZ":"Algerije","AS":"Amerikaans-Samoa","VI":"Amerikaanse Maagdeneilanden","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarctica","AG":"Antigua en Barbuda","AR":"Argentini\u00eb","AM":"Armeni\u00eb","AW":"Aruba","AU":"Australi\u00eb","AZ":"Azerbeidzjan","BS":"Bahama\u2019s","BH":"Bahrein","BD":"Bangladesh","BB":"Barbados","BY":"Belarus","BE":"Belgi\u00eb","BZ":"Belize","BJ":"Benin","BM":"Bermuda","BT":"Bhutan","BO":"Bolivia","BA":"Bosni\u00eb en Herzegovina","BW":"Botswana","BV":"Bouveteiland","BR":"Brazili\u00eb","IO":"Brits Indische Oceaanterritorium","VG":"Britse Maagdeneilanden","BN":"Brunei","BG":"Bulgarije","BF":"Burkina Faso","BI":"Burundi","KH":"Cambodja","CA":"Canada","BQ":"Caribisch Nederland","CF":"Centraal-Afrikaanse Republiek","CL":"Chili","CN":"China","CX":"Christmaseiland","CC":"Cocoseilanden","CO":"Colombia","KM":"Comoren","CG":"Congo-Brazzaville","CD":"Congo-Kinshasa","CK":"Cookeilanden","CR":"Costa Rica","CU":"Cuba","CW":"Cura\u00e7ao","CY":"Cyprus","DK":"Denemarken","DJ":"Djibouti","DM":"Dominica","DO":"Dominicaanse Republiek","DE":"Duitsland","EC":"Ecuador","EG":"Egypte","SV":"El Salvador","GQ":"Equatoriaal-Guinea","ER":"Eritrea","EE":"Estland","SZ":"eSwatini","ET":"Ethiopi\u00eb","FO":"Faer\u00f6er","FK":"Falklandeilanden","FJ":"Fiji","PH":"Filipijnen","FI":"Finland","FR":"Frankrijk","GF":"Frans-Guyana","PF":"Frans-Polynesi\u00eb","TF":"Franse Gebieden in de zuidelijke Indische Oceaan","GA":"Gabon","GM":"Gambia","GE":"Georgi\u00eb","GH":"Ghana","GI":"Gibraltar","GD":"Grenada","GR":"Griekenland","GL":"Groenland","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinee","GW":"Guinee-Bissau","GY":"Guyana","HT":"Ha\u00efti","HM":"Heard en McDonaldeilanden","HN":"Honduras","HU":"Hongarije","HK":"Hongkong SAR van China","IE":"Ierland","IS":"IJsland","IN":"India","ID":"Indonesi\u00eb","IQ":"Irak","IR":"Iran","IM":"Isle of Man","IL":"Isra\u00ebl","IT":"Itali\u00eb","CI":"Ivoorkust","JM":"Jamaica","JP":"Japan","YE":"Jemen","JE":"Jersey","JO":"Jordani\u00eb","KY":"Kaaimaneilanden","CV":"Kaapverdi\u00eb","CM":"Kameroen","KZ":"Kazachstan","KE":"Kenia","KG":"Kirgizi\u00eb","KI":"Kiribati","UM":"Kleine afgelegen eilanden van de Verenigde Staten","KW":"Koeweit","HR":"Kroati\u00eb","LA":"Laos","LS":"Lesotho","LV":"Letland","LB":"Libanon","LR":"Liberia","LY":"Libi\u00eb","LI":"Liechtenstein","LT":"Litouwen","LU":"Luxemburg","MO":"Macau SAR van China","MG":"Madagaskar","MW":"Malawi","MV":"Maldiven","MY":"Maleisi\u00eb","ML":"Mali","MT":"Malta","MA":"Marokko","MH":"Marshalleilanden","MQ":"Martinique","MR":"Mauritani\u00eb","MU":"Mauritius","YT":"Mayotte","MX":"Mexico","FM":"Micronesia","MD":"Moldavi\u00eb","MC":"Monaco","MN":"Mongoli\u00eb","ME":"Montenegro","MS":"Montserrat","MZ":"Mozambique","MM":"Myanmar (Birma)","NA":"Namibi\u00eb","NR":"Nauru","NL":"Nederland","NP":"Nepal","NI":"Nicaragua","NC":"Nieuw-Caledoni\u00eb","NZ":"Nieuw-Zeeland","NE":"Niger","NG":"Nigeria","NU":"Niue","KP":"Noord-Korea","MK":"Noord-Macedoni\u00eb","MP":"Noordelijke Marianen","NO":"Noorwegen","NF":"Norfolk","UG":"Oeganda","UA":"Oekra\u00efne","UZ":"Oezbekistan","OM":"Oman","TL":"Oost-Timor","AT":"Oostenrijk","PK":"Pakistan","PW":"Palau","PS":"Palestijnse gebieden","PA":"Panama","PG":"Papoea-Nieuw-Guinea","PY":"Paraguay","PE":"Peru","PN":"Pitcairneilanden","PL":"Polen","PT":"Portugal","PR":"Puerto Rico","QA":"Qatar","RE":"R\u00e9union","RO":"Roemeni\u00eb","RU":"Rusland","RW":"Rwanda","KN":"Saint Kitts en Nevis","LC":"Saint Lucia","VC":"Saint Vincent en de Grenadines","BL":"Saint-Barth\u00e9lemy","MF":"Saint-Martin","PM":"Saint-Pierre en Miquelon","SB":"Salomonseilanden","WS":"Samoa","SM":"San Marino","ST":"Sao Tom\u00e9 en Principe","SA":"Saoedi-Arabi\u00eb","SN":"Senegal","RS":"Servi\u00eb","SC":"Seychellen","SL":"Sierra Leone","SG":"Singapore","SH":"Sint-Helena","SX":"Sint-Maarten","SI":"Sloveni\u00eb","SK":"Slowakije","SD":"Soedan","SO":"Somali\u00eb","ES":"Spanje","SJ":"Spitsbergen en Jan Mayen","LK":"Sri Lanka","SR":"Suriname","SY":"Syri\u00eb","TJ":"Tadzjikistan","TW":"Taiwan","TZ":"Tanzania","TH":"Thailand","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad en Tobago","TD":"Tsjaad","CZ":"Tsjechi\u00eb","TN":"Tunesi\u00eb","TR":"Turkije","TM":"Turkmenistan","TC":"Turks- en Caicoseilanden","TV":"Tuvalu","UY":"Uruguay","VU":"Vanuatu","VA":"Vaticaanstad","VE":"Venezuela","GB":"Verenigd Koninkrijk","AE":"Verenigde Arabische Emiraten","US":"Verenigde Staten","VN":"Vietnam","WF":"Wallis en Futuna","EH":"Westelijke Sahara","ZM":"Zambia","ZW":"Zimbabwe","ZA":"Zuid-Afrika","GS":"Zuid-Georgia en Zuidelijke Sandwicheilanden","KR":"Zuid-Korea","SS":"Zuid-Soedan","SE":"Zweden","CH":"Zwitserland"}
\ No newline at end of file
diff --git a/public/country/ru-RU.json b/public/country/ru-RU.json
new file mode 100644
index 00000000..9926aa4e
--- /dev/null
+++ b/public/country/ru-RU.json
@@ -0,0 +1 @@
+{"AU":"\u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u044f","AT":"\u0410\u0432\u0441\u0442\u0440\u0438\u044f","AZ":"\u0410\u0437\u0435\u0440\u0431\u0430\u0439\u0434\u0436\u0430\u043d","AX":"\u0410\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0435 \u043e-\u0432\u0430","AL":"\u0410\u043b\u0431\u0430\u043d\u0438\u044f","DZ":"\u0410\u043b\u0436\u0438\u0440","AS":"\u0410\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u043e\u0435 \u0421\u0430\u043c\u043e\u0430","AI":"\u0410\u043d\u0433\u0438\u043b\u044c\u044f","AO":"\u0410\u043d\u0433\u043e\u043b\u0430","AD":"\u0410\u043d\u0434\u043e\u0440\u0440\u0430","AQ":"\u0410\u043d\u0442\u0430\u0440\u043a\u0442\u0438\u0434\u0430","AG":"\u0410\u043d\u0442\u0438\u0433\u0443\u0430 \u0438 \u0411\u0430\u0440\u0431\u0443\u0434\u0430","AR":"\u0410\u0440\u0433\u0435\u043d\u0442\u0438\u043d\u0430","AM":"\u0410\u0440\u043c\u0435\u043d\u0438\u044f","AW":"\u0410\u0440\u0443\u0431\u0430","AF":"\u0410\u0444\u0433\u0430\u043d\u0438\u0441\u0442\u0430\u043d","BS":"\u0411\u0430\u0433\u0430\u043c\u044b","BD":"\u0411\u0430\u043d\u0433\u043b\u0430\u0434\u0435\u0448","BB":"\u0411\u0430\u0440\u0431\u0430\u0434\u043e\u0441","BH":"\u0411\u0430\u0445\u0440\u0435\u0439\u043d","BY":"\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u044c","BZ":"\u0411\u0435\u043b\u0438\u0437","BE":"\u0411\u0435\u043b\u044c\u0433\u0438\u044f","BJ":"\u0411\u0435\u043d\u0438\u043d","BM":"\u0411\u0435\u0440\u043c\u0443\u0434\u0441\u043a\u0438\u0435 \u043e-\u0432\u0430","BG":"\u0411\u043e\u043b\u0433\u0430\u0440\u0438\u044f","BO":"\u0411\u043e\u043b\u0438\u0432\u0438\u044f","BQ":"\u0411\u043e\u043d\u044d\u0439\u0440, \u0421\u0438\u043d\u0442-\u042d\u0441\u0442\u0430\u0442\u0438\u0443\u0441 \u0438 \u0421\u0430\u0431\u0430","BA":"\u0411\u043e\u0441\u043d\u0438\u044f \u0438 \u0413\u0435\u0440\u0446\u0435\u0433\u043e\u0432\u0438\u043d\u0430","BW":"\u0411\u043e\u0442\u0441\u0432\u0430\u043d\u0430","BR":"\u0411\u0440\u0430\u0437\u0438\u043b\u0438\u044f","IO":"\u0411\u0440\u0438\u0442\u0430\u043d\u0441\u043a\u0430\u044f \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u044f \u0432 \u0418\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u043c \u043e\u043a\u0435\u0430\u043d\u0435","BN":"\u0411\u0440\u0443\u043d\u0435\u0439-\u0414\u0430\u0440\u0443\u0441\u0441\u0430\u043b\u0430\u043c","BF":"\u0411\u0443\u0440\u043a\u0438\u043d\u0430-\u0424\u0430\u0441\u043e","BI":"\u0411\u0443\u0440\u0443\u043d\u0434\u0438","BT":"\u0411\u0443\u0442\u0430\u043d","VU":"\u0412\u0430\u043d\u0443\u0430\u0442\u0443","VA":"\u0412\u0430\u0442\u0438\u043a\u0430\u043d","GB":"\u0412\u0435\u043b\u0438\u043a\u043e\u0431\u0440\u0438\u0442\u0430\u043d\u0438\u044f","HU":"\u0412\u0435\u043d\u0433\u0440\u0438\u044f","VE":"\u0412\u0435\u043d\u0435\u0441\u0443\u044d\u043b\u0430","VG":"\u0412\u0438\u0440\u0433\u0438\u043d\u0441\u043a\u0438\u0435 \u043e-\u0432\u0430 (\u0412\u0435\u043b\u0438\u043a\u043e\u0431\u0440\u0438\u0442\u0430\u043d\u0438\u044f)","VI":"\u0412\u0438\u0440\u0433\u0438\u043d\u0441\u043a\u0438\u0435 \u043e-\u0432\u0430 (\u0421\u0428\u0410)","UM":"\u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u043c\u0430\u043b\u044b\u0435 \u043e-\u0432\u0430 (\u0421\u0428\u0410)","TL":"\u0412\u043e\u0441\u0442\u043e\u0447\u043d\u044b\u0439 \u0422\u0438\u043c\u043e\u0440","VN":"\u0412\u044c\u0435\u0442\u043d\u0430\u043c","GA":"\u0413\u0430\u0431\u043e\u043d","HT":"\u0413\u0430\u0438\u0442\u0438","GY":"\u0413\u0430\u0439\u0430\u043d\u0430","GM":"\u0413\u0430\u043c\u0431\u0438\u044f","GH":"\u0413\u0430\u043d\u0430","GP":"\u0413\u0432\u0430\u0434\u0435\u043b\u0443\u043f\u0430","GT":"\u0413\u0432\u0430\u0442\u0435\u043c\u0430\u043b\u0430","GN":"\u0413\u0432\u0438\u043d\u0435\u044f","GW":"\u0413\u0432\u0438\u043d\u0435\u044f-\u0411\u0438\u0441\u0430\u0443","DE":"\u0413\u0435\u0440\u043c\u0430\u043d\u0438\u044f","GG":"\u0413\u0435\u0440\u043d\u0441\u0438","GI":"\u0413\u0438\u0431\u0440\u0430\u043b\u0442\u0430\u0440","HN":"\u0413\u043e\u043d\u0434\u0443\u0440\u0430\u0441","HK":"\u0413\u043e\u043d\u043a\u043e\u043d\u0433 (\u0421\u0410\u0420)","GD":"\u0413\u0440\u0435\u043d\u0430\u0434\u0430","GL":"\u0413\u0440\u0435\u043d\u043b\u0430\u043d\u0434\u0438\u044f","GR":"\u0413\u0440\u0435\u0446\u0438\u044f","GE":"\u0413\u0440\u0443\u0437\u0438\u044f","GU":"\u0413\u0443\u0430\u043c","DK":"\u0414\u0430\u043d\u0438\u044f","JE":"\u0414\u0436\u0435\u0440\u0441\u0438","DJ":"\u0414\u0436\u0438\u0431\u0443\u0442\u0438","DM":"\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430","DO":"\u0414\u043e\u043c\u0438\u043d\u0438\u043a\u0430\u043d\u0441\u043a\u0430\u044f \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430","EG":"\u0415\u0433\u0438\u043f\u0435\u0442","ZM":"\u0417\u0430\u043c\u0431\u0438\u044f","EH":"\u0417\u0430\u043f\u0430\u0434\u043d\u0430\u044f \u0421\u0430\u0445\u0430\u0440\u0430","ZW":"\u0417\u0438\u043c\u0431\u0430\u0431\u0432\u0435","IL":"\u0418\u0437\u0440\u0430\u0438\u043b\u044c","IN":"\u0418\u043d\u0434\u0438\u044f","ID":"\u0418\u043d\u0434\u043e\u043d\u0435\u0437\u0438\u044f","JO":"\u0418\u043e\u0440\u0434\u0430\u043d\u0438\u044f","IQ":"\u0418\u0440\u0430\u043a","IR":"\u0418\u0440\u0430\u043d","IE":"\u0418\u0440\u043b\u0430\u043d\u0434\u0438\u044f","IS":"\u0418\u0441\u043b\u0430\u043d\u0434\u0438\u044f","ES":"\u0418\u0441\u043f\u0430\u043d\u0438\u044f","IT":"\u0418\u0442\u0430\u043b\u0438\u044f","YE":"\u0419\u0435\u043c\u0435\u043d","CV":"\u041a\u0430\u0431\u043e-\u0412\u0435\u0440\u0434\u0435","KZ":"\u041a\u0430\u0437\u0430\u0445\u0441\u0442\u0430\u043d","KH":"\u041a\u0430\u043c\u0431\u043e\u0434\u0436\u0430","CM":"\u041a\u0430\u043c\u0435\u0440\u0443\u043d","CA":"\u041a\u0430\u043d\u0430\u0434\u0430","QA":"\u041a\u0430\u0442\u0430\u0440","KE":"\u041a\u0435\u043d\u0438\u044f","CY":"\u041a\u0438\u043f\u0440","KG":"\u041a\u0438\u0440\u0433\u0438\u0437\u0438\u044f","KI":"\u041a\u0438\u0440\u0438\u0431\u0430\u0442\u0438","CN":"\u041a\u0438\u0442\u0430\u0439","KP":"\u041a\u041d\u0414\u0420","CC":"\u041a\u043e\u043a\u043e\u0441\u043e\u0432\u044b\u0435 \u043e-\u0432\u0430","CO":"\u041a\u043e\u043b\u0443\u043c\u0431\u0438\u044f","KM":"\u041a\u043e\u043c\u043e\u0440\u044b","CG":"\u041a\u043e\u043d\u0433\u043e - \u0411\u0440\u0430\u0437\u0437\u0430\u0432\u0438\u043b\u044c","CD":"\u041a\u043e\u043d\u0433\u043e - \u041a\u0438\u043d\u0448\u0430\u0441\u0430","CR":"\u041a\u043e\u0441\u0442\u0430-\u0420\u0438\u043a\u0430","CI":"\u041a\u043e\u0442-\u0434\u2019\u0418\u0432\u0443\u0430\u0440","CU":"\u041a\u0443\u0431\u0430","KW":"\u041a\u0443\u0432\u0435\u0439\u0442","CW":"\u041a\u044e\u0440\u0430\u0441\u0430\u043e","LA":"\u041b\u0430\u043e\u0441","LV":"\u041b\u0430\u0442\u0432\u0438\u044f","LS":"\u041b\u0435\u0441\u043e\u0442\u043e","LR":"\u041b\u0438\u0431\u0435\u0440\u0438\u044f","LB":"\u041b\u0438\u0432\u0430\u043d","LY":"\u041b\u0438\u0432\u0438\u044f","LT":"\u041b\u0438\u0442\u0432\u0430","LI":"\u041b\u0438\u0445\u0442\u0435\u043d\u0448\u0442\u0435\u0439\u043d","LU":"\u041b\u044e\u043a\u0441\u0435\u043c\u0431\u0443\u0440\u0433","MU":"\u041c\u0430\u0432\u0440\u0438\u043a\u0438\u0439","MR":"\u041c\u0430\u0432\u0440\u0438\u0442\u0430\u043d\u0438\u044f","MG":"\u041c\u0430\u0434\u0430\u0433\u0430\u0441\u043a\u0430\u0440","YT":"\u041c\u0430\u0439\u043e\u0442\u0442\u0430","MO":"\u041c\u0430\u043a\u0430\u043e (\u0421\u0410\u0420)","MW":"\u041c\u0430\u043b\u0430\u0432\u0438","MY":"\u041c\u0430\u043b\u0430\u0439\u0437\u0438\u044f","ML":"\u041c\u0430\u043b\u0438","MV":"\u041c\u0430\u043b\u044c\u0434\u0438\u0432\u044b","MT":"\u041c\u0430\u043b\u044c\u0442\u0430","MA":"\u041c\u0430\u0440\u043e\u043a\u043a\u043e","MQ":"\u041c\u0430\u0440\u0442\u0438\u043d\u0438\u043a\u0430","MH":"\u041c\u0430\u0440\u0448\u0430\u043b\u043b\u043e\u0432\u044b \u041e\u0441\u0442\u0440\u043e\u0432\u0430","MX":"\u041c\u0435\u043a\u0441\u0438\u043a\u0430","MZ":"\u041c\u043e\u0437\u0430\u043c\u0431\u0438\u043a","MD":"\u041c\u043e\u043b\u0434\u043e\u0432\u0430","MC":"\u041c\u043e\u043d\u0430\u043a\u043e","MN":"\u041c\u043e\u043d\u0433\u043e\u043b\u0438\u044f","MS":"\u041c\u043e\u043d\u0442\u0441\u0435\u0440\u0440\u0430\u0442","MM":"\u041c\u044c\u044f\u043d\u043c\u0430 (\u0411\u0438\u0440\u043c\u0430)","NA":"\u041d\u0430\u043c\u0438\u0431\u0438\u044f","NR":"\u041d\u0430\u0443\u0440\u0443","NP":"\u041d\u0435\u043f\u0430\u043b","NE":"\u041d\u0438\u0433\u0435\u0440","NG":"\u041d\u0438\u0433\u0435\u0440\u0438\u044f","NL":"\u041d\u0438\u0434\u0435\u0440\u043b\u0430\u043d\u0434\u044b","NI":"\u041d\u0438\u043a\u0430\u0440\u0430\u0433\u0443\u0430","NU":"\u041d\u0438\u0443\u044d","NZ":"\u041d\u043e\u0432\u0430\u044f \u0417\u0435\u043b\u0430\u043d\u0434\u0438\u044f","NC":"\u041d\u043e\u0432\u0430\u044f \u041a\u0430\u043b\u0435\u0434\u043e\u043d\u0438\u044f","NO":"\u041d\u043e\u0440\u0432\u0435\u0433\u0438\u044f","BV":"\u043e-\u0432 \u0411\u0443\u0432\u0435","IM":"\u043e-\u0432 \u041c\u044d\u043d","NF":"\u043e-\u0432 \u041d\u043e\u0440\u0444\u043e\u043b\u043a","CX":"\u043e-\u0432 \u0420\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0430","SH":"\u043e-\u0432 \u0421\u0432. \u0415\u043b\u0435\u043d\u044b","PN":"\u043e-\u0432\u0430 \u041f\u0438\u0442\u043a\u044d\u0440\u043d","TC":"\u043e-\u0432\u0430 \u0422\u0451\u0440\u043a\u0441 \u0438 \u041a\u0430\u0439\u043a\u043e\u0441","HM":"\u043e-\u0432\u0430 \u0425\u0435\u0440\u0434 \u0438 \u041c\u0430\u043a\u0434\u043e\u043d\u0430\u043b\u044c\u0434","AE":"\u041e\u0410\u042d","OM":"\u041e\u043c\u0430\u043d","KY":"\u041e\u0441\u0442\u0440\u043e\u0432\u0430 \u041a\u0430\u0439\u043c\u0430\u043d","CK":"\u041e\u0441\u0442\u0440\u043e\u0432\u0430 \u041a\u0443\u043a\u0430","PK":"\u041f\u0430\u043a\u0438\u0441\u0442\u0430\u043d","PW":"\u041f\u0430\u043b\u0430\u0443","PS":"\u041f\u0430\u043b\u0435\u0441\u0442\u0438\u043d\u0441\u043a\u0438\u0435 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0438","PA":"\u041f\u0430\u043d\u0430\u043c\u0430","PG":"\u041f\u0430\u043f\u0443\u0430 \u2014 \u041d\u043e\u0432\u0430\u044f \u0413\u0432\u0438\u043d\u0435\u044f","PY":"\u041f\u0430\u0440\u0430\u0433\u0432\u0430\u0439","PE":"\u041f\u0435\u0440\u0443","PL":"\u041f\u043e\u043b\u044c\u0448\u0430","PT":"\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0438\u044f","PR":"\u041f\u0443\u044d\u0440\u0442\u043e-\u0420\u0438\u043a\u043e","KR":"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u041a\u043e\u0440\u0435\u044f","RE":"\u0420\u0435\u044e\u043d\u044c\u043e\u043d","RU":"\u0420\u043e\u0441\u0441\u0438\u044f","RW":"\u0420\u0443\u0430\u043d\u0434\u0430","RO":"\u0420\u0443\u043c\u044b\u043d\u0438\u044f","SV":"\u0421\u0430\u043b\u044c\u0432\u0430\u0434\u043e\u0440","WS":"\u0421\u0430\u043c\u043e\u0430","SM":"\u0421\u0430\u043d-\u041c\u0430\u0440\u0438\u043d\u043e","ST":"\u0421\u0430\u043d-\u0422\u043e\u043c\u0435 \u0438 \u041f\u0440\u0438\u043d\u0441\u0438\u043f\u0438","SA":"\u0421\u0430\u0443\u0434\u043e\u0432\u0441\u043a\u0430\u044f \u0410\u0440\u0430\u0432\u0438\u044f","MK":"\u0421\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0438\u044f","MP":"\u0421\u0435\u0432\u0435\u0440\u043d\u044b\u0435 \u041c\u0430\u0440\u0438\u0430\u043d\u0441\u043a\u0438\u0435 \u043e-\u0432\u0430","SC":"\u0421\u0435\u0439\u0448\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u041e\u0441\u0442\u0440\u043e\u0432\u0430","BL":"\u0421\u0435\u043d-\u0411\u0430\u0440\u0442\u0435\u043b\u0435\u043c\u0438","MF":"\u0421\u0435\u043d-\u041c\u0430\u0440\u0442\u0435\u043d","PM":"\u0421\u0435\u043d-\u041f\u044c\u0435\u0440 \u0438 \u041c\u0438\u043a\u0435\u043b\u043e\u043d","SN":"\u0421\u0435\u043d\u0435\u0433\u0430\u043b","VC":"\u0421\u0435\u043d\u0442-\u0412\u0438\u043d\u0441\u0435\u043d\u0442 \u0438 \u0413\u0440\u0435\u043d\u0430\u0434\u0438\u043d\u044b","KN":"\u0421\u0435\u043d\u0442-\u041a\u0438\u0442\u0441 \u0438 \u041d\u0435\u0432\u0438\u0441","LC":"\u0421\u0435\u043d\u0442-\u041b\u044e\u0441\u0438\u044f","RS":"\u0421\u0435\u0440\u0431\u0438\u044f","SG":"\u0421\u0438\u043d\u0433\u0430\u043f\u0443\u0440","SX":"\u0421\u0438\u043d\u0442-\u041c\u0430\u0440\u0442\u0435\u043d","SY":"\u0421\u0438\u0440\u0438\u044f","SK":"\u0421\u043b\u043e\u0432\u0430\u043a\u0438\u044f","SI":"\u0421\u043b\u043e\u0432\u0435\u043d\u0438\u044f","US":"\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0435 \u0428\u0442\u0430\u0442\u044b","SB":"\u0421\u043e\u043b\u043e\u043c\u043e\u043d\u043e\u0432\u044b \u041e\u0441\u0442\u0440\u043e\u0432\u0430","SO":"\u0421\u043e\u043c\u0430\u043b\u0438","SD":"\u0421\u0443\u0434\u0430\u043d","SR":"\u0421\u0443\u0440\u0438\u043d\u0430\u043c","SL":"\u0421\u044c\u0435\u0440\u0440\u0430-\u041b\u0435\u043e\u043d\u0435","TJ":"\u0422\u0430\u0434\u0436\u0438\u043a\u0438\u0441\u0442\u0430\u043d","TH":"\u0422\u0430\u0438\u043b\u0430\u043d\u0434","TW":"\u0422\u0430\u0439\u0432\u0430\u043d\u044c","TZ":"\u0422\u0430\u043d\u0437\u0430\u043d\u0438\u044f","TG":"\u0422\u043e\u0433\u043e","TK":"\u0422\u043e\u043a\u0435\u043b\u0430\u0443","TO":"\u0422\u043e\u043d\u0433\u0430","TT":"\u0422\u0440\u0438\u043d\u0438\u0434\u0430\u0434 \u0438 \u0422\u043e\u0431\u0430\u0433\u043e","TV":"\u0422\u0443\u0432\u0430\u043b\u0443","TN":"\u0422\u0443\u043d\u0438\u0441","TM":"\u0422\u0443\u0440\u043a\u043c\u0435\u043d\u0438\u0441\u0442\u0430\u043d","TR":"\u0422\u0443\u0440\u0446\u0438\u044f","UG":"\u0423\u0433\u0430\u043d\u0434\u0430","UZ":"\u0423\u0437\u0431\u0435\u043a\u0438\u0441\u0442\u0430\u043d","UA":"\u0423\u043a\u0440\u0430\u0438\u043d\u0430","WF":"\u0423\u043e\u043b\u043b\u0438\u0441 \u0438 \u0424\u0443\u0442\u0443\u043d\u0430","UY":"\u0423\u0440\u0443\u0433\u0432\u0430\u0439","FO":"\u0424\u0430\u0440\u0435\u0440\u0441\u043a\u0438\u0435 \u043e-\u0432\u0430","FM":"\u0424\u0435\u0434\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0428\u0442\u0430\u0442\u044b \u041c\u0438\u043a\u0440\u043e\u043d\u0435\u0437\u0438\u0438","FJ":"\u0424\u0438\u0434\u0436\u0438","PH":"\u0424\u0438\u043b\u0438\u043f\u043f\u0438\u043d\u044b","FI":"\u0424\u0438\u043d\u043b\u044f\u043d\u0434\u0438\u044f","FK":"\u0424\u043e\u043b\u043a\u043b\u0435\u043d\u0434\u0441\u043a\u0438\u0435 \u043e-\u0432\u0430","FR":"\u0424\u0440\u0430\u043d\u0446\u0438\u044f","GF":"\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0430\u044f \u0413\u0432\u0438\u0430\u043d\u0430","PF":"\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0430\u044f \u041f\u043e\u043b\u0438\u043d\u0435\u0437\u0438\u044f","TF":"\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0435 \u042e\u0436\u043d\u044b\u0435 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0438","HR":"\u0425\u043e\u0440\u0432\u0430\u0442\u0438\u044f","CF":"\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e-\u0410\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430\u044f \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430","TD":"\u0427\u0430\u0434","ME":"\u0427\u0435\u0440\u043d\u043e\u0433\u043e\u0440\u0438\u044f","CZ":"\u0427\u0435\u0445\u0438\u044f","CL":"\u0427\u0438\u043b\u0438","CH":"\u0428\u0432\u0435\u0439\u0446\u0430\u0440\u0438\u044f","SE":"\u0428\u0432\u0435\u0446\u0438\u044f","SJ":"\u0428\u043f\u0438\u0446\u0431\u0435\u0440\u0433\u0435\u043d \u0438 \u042f\u043d-\u041c\u0430\u0439\u0435\u043d","LK":"\u0428\u0440\u0438-\u041b\u0430\u043d\u043a\u0430","EC":"\u042d\u043a\u0432\u0430\u0434\u043e\u0440","GQ":"\u042d\u043a\u0432\u0430\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0413\u0432\u0438\u043d\u0435\u044f","ER":"\u042d\u0440\u0438\u0442\u0440\u0435\u044f","SZ":"\u042d\u0441\u0432\u0430\u0442\u0438\u043d\u0438","EE":"\u042d\u0441\u0442\u043e\u043d\u0438\u044f","ET":"\u042d\u0444\u0438\u043e\u043f\u0438\u044f","GS":"\u042e\u0436\u043d\u0430\u044f \u0413\u0435\u043e\u0440\u0433\u0438\u044f \u0438 \u042e\u0436\u043d\u044b\u0435 \u0421\u0430\u043d\u0434\u0432\u0438\u0447\u0435\u0432\u044b \u043e-\u0432\u0430","ZA":"\u042e\u0436\u043d\u043e-\u0410\u0444\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430\u044f \u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430","SS":"\u042e\u0436\u043d\u044b\u0439 \u0421\u0443\u0434\u0430\u043d","JM":"\u042f\u043c\u0430\u0439\u043a\u0430","JP":"\u042f\u043f\u043e\u043d\u0438\u044f"}
\ No newline at end of file
diff --git a/public/country/sv-SE.json b/public/country/sv-SE.json
new file mode 100644
index 00000000..8c8656c2
--- /dev/null
+++ b/public/country/sv-SE.json
@@ -0,0 +1 @@
+{"AF":"Afghanistan","AL":"Albanien","DZ":"Algeriet","VI":"Amerikanska Jungfru\u00f6arna","AS":"Amerikanska Samoa","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarktis","AG":"Antigua och Barbuda","AR":"Argentina","AM":"Armenien","AW":"Aruba","AU":"Australien","AZ":"Azerbajdzjan","BS":"Bahamas","BH":"Bahrain","BD":"Bangladesh","BB":"Barbados","BE":"Belgien","BZ":"Belize","BJ":"Benin","BM":"Bermuda","BT":"Bhutan","BO":"Bolivia","BA":"Bosnien och Hercegovina","BW":"Botswana","BV":"Bouvet\u00f6n","BR":"Brasilien","VG":"Brittiska Jungfru\u00f6arna","IO":"Brittiska territoriet i Indiska oceanen","BN":"Brunei","BG":"Bulgarien","BF":"Burkina Faso","BI":"Burundi","KY":"Cayman\u00f6arna","CF":"Centralafrikanska republiken","CL":"Chile","CO":"Colombia","CK":"Cook\u00f6arna","CR":"Costa Rica","CW":"Cura\u00e7ao","CY":"Cypern","CI":"C\u00f4te d\u2019Ivoire","DK":"Danmark","DJ":"Djibouti","DM":"Dominica","DO":"Dominikanska republiken","EC":"Ecuador","EG":"Egypten","GQ":"Ekvatorialguinea","SV":"El Salvador","ER":"Eritrea","EE":"Estland","ET":"Etiopien","FK":"Falklands\u00f6arna","FJ":"Fiji","PH":"Filippinerna","FI":"Finland","FR":"Frankrike","GF":"Franska Guyana","PF":"Franska Polynesien","TF":"Franska sydterritorierna","FO":"F\u00e4r\u00f6arna","AE":"F\u00f6renade Arabemiraten","GA":"Gabon","GM":"Gambia","GE":"Georgien","GH":"Ghana","GI":"Gibraltar","GR":"Grekland","GD":"Grenada","GL":"Gr\u00f6nland","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinea","GW":"Guinea-Bissau","GY":"Guyana","HT":"Haiti","HM":"Heard\u00f6n och McDonald\u00f6arna","HN":"Honduras","HK":"Hongkong","IN":"Indien","ID":"Indonesien","IQ":"Irak","IR":"Iran","IE":"Irland","IS":"Island","IM":"Isle of Man","IL":"Israel","IT":"Italien","JM":"Jamaica","JP":"Japan","YE":"Jemen","JE":"Jersey","JO":"Jordanien","CX":"Jul\u00f6n","KH":"Kambodja","CM":"Kamerun","CA":"Kanada","CV":"Kap Verde","BQ":"Karibiska Nederl\u00e4nderna","KZ":"Kazakstan","KE":"Kenya","CN":"Kina","KG":"Kirgizistan","KI":"Kiribati","CC":"Kokos\u00f6arna","KM":"Komorerna","CG":"Kongo-Brazzaville","CD":"Kongo-Kinshasa","HR":"Kroatien","CU":"Kuba","KW":"Kuwait","LA":"Laos","LS":"Lesotho","LV":"Lettland","LB":"Libanon","LR":"Liberia","LY":"Libyen","LI":"Liechtenstein","LT":"Litauen","LU":"Luxemburg","MO":"Macao","MG":"Madagaskar","MW":"Malawi","MY":"Malaysia","MV":"Maldiverna","ML":"Mali","MT":"Malta","MA":"Marocko","MH":"Marshall\u00f6arna","MQ":"Martinique","MR":"Mauretanien","MU":"Mauritius","YT":"Mayotte","MX":"Mexiko","FM":"Mikronesien","MZ":"Mo\u00e7ambique","MD":"Moldavien","MC":"Monaco","MN":"Mongoliet","ME":"Montenegro","MS":"Montserrat","MM":"Myanmar (Burma)","NA":"Namibia","NR":"Nauru","NL":"Nederl\u00e4nderna","NP":"Nepal","NI":"Nicaragua","NE":"Niger","NG":"Nigeria","NU":"Niue","KP":"Nordkorea","MK":"Nordmakedonien","MP":"Nordmarianerna","NF":"Norfolk\u00f6n","NO":"Norge","NC":"Nya Kaledonien","NZ":"Nya Zeeland","OM":"Oman","PK":"Pakistan","PW":"Palau","PS":"Palestinska territorierna","PA":"Panama","PG":"Papua Nya Guinea","PY":"Paraguay","PE":"Peru","PN":"Pitcairn\u00f6arna","PL":"Polen","PT":"Portugal","PR":"Puerto Rico","QA":"Qatar","RE":"R\u00e9union","RO":"Rum\u00e4nien","RW":"Rwanda","RU":"Ryssland","BL":"S:t Barth\u00e9lemy","SH":"S:t Helena","KN":"S:t Kitts och Nevis","LC":"S:t Lucia","PM":"S:t Pierre och Miquelon","VC":"S:t Vincent och Grenadinerna","MF":"Saint-Martin","SB":"Salomon\u00f6arna","WS":"Samoa","SM":"San Marino","ST":"S\u00e3o Tom\u00e9 och Pr\u00edncipe","SA":"Saudiarabien","CH":"Schweiz","SN":"Senegal","RS":"Serbien","SC":"Seychellerna","SL":"Sierra Leone","SG":"Singapore","SX":"Sint Maarten","SK":"Slovakien","SI":"Slovenien","SO":"Somalia","ES":"Spanien","LK":"Sri Lanka","GB":"Storbritannien","SD":"Sudan","SR":"Surinam","SJ":"Svalbard och Jan Mayen","SE":"Sverige","SZ":"Swaziland","ZA":"Sydafrika","GS":"Sydgeorgien och Sydsandwich\u00f6arna","KR":"Sydkorea","SS":"Sydsudan","SY":"Syrien","TJ":"Tadzjikistan","TW":"Taiwan","TZ":"Tanzania","TD":"Tchad","TH":"Thailand","CZ":"Tjeckien","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad och Tobago","TN":"Tunisien","TR":"Turkiet","TM":"Turkmenistan","TC":"Turks- och Caicos\u00f6arna","TV":"Tuvalu","DE":"Tyskland","UG":"Uganda","UA":"Ukraina","HU":"Ungern","UY":"Uruguay","US":"USA","UM":"USA:s yttre \u00f6ar","UZ":"Uzbekistan","VU":"Vanuatu","VA":"Vatikanstaten","VE":"Venezuela","VN":"Vietnam","BY":"Vitryssland","EH":"V\u00e4stsahara","WF":"Wallis- och Futuna\u00f6arna","ZM":"Zambia","ZW":"Zimbabwe","AX":"\u00c5land","AT":"\u00d6sterrike","TL":"\u00d6sttimor"}
\ No newline at end of file
diff --git a/public/country/tr-TR.json b/public/country/tr-TR.json
new file mode 100644
index 00000000..19de686b
--- /dev/null
+++ b/public/country/tr-TR.json
@@ -0,0 +1 @@
+{"UM":"ABD K\u00fc\u00e7\u00fck Harici Adalar\u0131","VI":"ABD Virjin Adalar\u0131","AF":"Afganistan","AX":"\u00c5land Adalar\u0131","DE":"Almanya","US":"Amerika Birle\u015fik Devletleri","AS":"Amerikan Samoas\u0131","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarktika","AG":"Antigua ve Barbuda","AR":"Arjantin","AL":"Arnavutluk","AW":"Aruba","AU":"Avustralya","AT":"Avusturya","AZ":"Azerbaycan","BS":"Bahamalar","BH":"Bahreyn","BD":"Banglade\u015f","BB":"Barbados","EH":"Bat\u0131 Sahra","BY":"Belarus","BE":"Bel\u00e7ika","BZ":"Belize","BJ":"Benin","BM":"Bermuda","AE":"Birle\u015fik Arap Emirlikleri","GB":"Birle\u015fik Krall\u0131k","BO":"Bolivya","BA":"Bosna-Hersek","BW":"Botsvana","BV":"Bouvet Adas\u0131","BR":"Brezilya","IO":"Britanya Hint Okyanusu Topraklar\u0131","VG":"Britanya Virjin Adalar\u0131","BN":"Brunei","BG":"Bulgaristan","BF":"Burkina Faso","BI":"Burundi","BT":"Butan","CV":"Cape Verde","KY":"Cayman Adalar\u0131","GI":"Cebelitar\u0131k","DZ":"Cezayir","CX":"Christmas Adas\u0131","DJ":"Cibuti","CC":"Cocos (Keeling) Adalar\u0131","CK":"Cook Adalar\u0131","CI":"C\u00f4te d\u2019Ivoire","CW":"Cura\u00e7ao","TD":"\u00c7ad","CZ":"\u00c7ekya","CN":"\u00c7in","HK":"\u00c7in Hong Kong \u00d6\u0130B","MO":"\u00c7in Makao \u00d6\u0130B","DK":"Danimarka","DO":"Dominik Cumhuriyeti","DM":"Dominika","EC":"Ekvador","GQ":"Ekvator Ginesi","SV":"El Salvador","ID":"Endonezya","ER":"Eritre","AM":"Ermenistan","EE":"Estonya","SZ":"Esvatini","ET":"Etiyopya","FK":"Falkland Adalar\u0131","FO":"Faroe Adalar\u0131","MA":"Fas","FJ":"Fiji","PH":"Filipinler","PS":"Filistin B\u00f6lgeleri","FI":"Finlandiya","FR":"Fransa","GF":"Frans\u0131z Guyanas\u0131","TF":"Frans\u0131z G\u00fcney Topraklar\u0131","PF":"Frans\u0131z Polinezyas\u0131","GA":"Gabon","GM":"Gambiya","GH":"Gana","GN":"Gine","GW":"Gine-Bissau","GD":"Grenada","GL":"Gr\u00f6nland","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GY":"Guyana","ZA":"G\u00fcney Afrika","GS":"G\u00fcney Georgia ve G\u00fcney Sandwich Adalar\u0131","KR":"G\u00fcney Kore","SS":"G\u00fcney Sudan","GE":"G\u00fcrcistan","HT":"Haiti","HM":"Heard Adas\u0131 ve McDonald Adalar\u0131","HR":"H\u0131rvatistan","IN":"Hindistan","NL":"Hollanda","HN":"Honduras","IQ":"Irak","IR":"\u0130ran","IE":"\u0130rlanda","ES":"\u0130spanya","IL":"\u0130srail","SE":"\u0130sve\u00e7","CH":"\u0130svi\u00e7re","IT":"\u0130talya","IS":"\u0130zlanda","JM":"Jamaika","JP":"Japonya","JE":"Jersey","KH":"Kambo\u00e7ya","CM":"Kamerun","CA":"Kanada","ME":"Karada\u011f","BQ":"Karayip Hollandas\u0131","QA":"Katar","KZ":"Kazakistan","KE":"Kenya","CY":"K\u0131br\u0131s","KG":"K\u0131rg\u0131zistan","KI":"Kiribati","CO":"Kolombiya","KM":"Komorlar","CG":"Kongo - Brazavil","CD":"Kongo - Kin\u015fasa","CR":"Kosta Rika","KW":"Kuveyt","KP":"Kuzey Kore","MK":"Kuzey Makedonya","MP":"Kuzey Mariana Adalar\u0131","CU":"K\u00fcba","LA":"Laos","LS":"Lesotho","LV":"Letonya","LR":"Liberya","LY":"Libya","LI":"Liechtenstein","LT":"Litvanya","LB":"L\u00fcbnan","LU":"L\u00fcksemburg","HU":"Macaristan","MG":"Madagaskar","MW":"Malavi","MV":"Maldivler","MY":"Malezya","ML":"Mali","MT":"Malta","IM":"Man Adas\u0131","MH":"Marshall Adalar\u0131","MQ":"Martinik","MU":"Mauritius","YT":"Mayotte","MX":"Meksika","EG":"M\u0131s\u0131r","FM":"Mikronezya","MN":"Mo\u011folistan","MD":"Moldova","MC":"Monako","MS":"Montserrat","MR":"Moritanya","MZ":"Mozambik","MM":"Myanmar (Burma)","NA":"Namibya","NR":"Nauru","NP":"Nepal","NE":"Nijer","NG":"Nijerya","NI":"Nikaragua","NU":"Niue","NF":"Norfolk Adas\u0131","NO":"Norve\u00e7","CF":"Orta Afrika Cumhuriyeti","UZ":"\u00d6zbekistan","PK":"Pakistan","PW":"Palau","PA":"Panama","PG":"Papua Yeni Gine","PY":"Paraguay","PE":"Peru","PN":"Pitcairn Adalar\u0131","PL":"Polonya","PT":"Portekiz","PR":"Porto Riko","RE":"Reunion","RO":"Romanya","RW":"Ruanda","RU":"Rusya","BL":"Saint Barthelemy","SH":"Saint Helena","KN":"Saint Kitts ve Nevis","LC":"Saint Lucia","MF":"Saint Martin","PM":"Saint Pierre ve Miquelon","VC":"Saint Vincent ve Grenadinler","WS":"Samoa","SM":"San Marino","ST":"Sao Tome ve Principe","SN":"Senegal","SC":"Sey\u015feller","RS":"S\u0131rbistan","SL":"Sierra Leone","SG":"Singapur","SX":"Sint Maarten","SK":"Slovakya","SI":"Slovenya","SB":"Solomon Adalar\u0131","SO":"Somali","LK":"Sri Lanka","SD":"Sudan","SR":"Surinam","SY":"Suriye","SA":"Suudi Arabistan","SJ":"Svalbard ve Jan Mayen","CL":"\u015eili","TJ":"Tacikistan","TZ":"Tanzanya","TH":"Tayland","TW":"Tayvan","TL":"Timor-Leste","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad ve Tobago","TN":"Tunus","TC":"Turks ve Caicos Adalar\u0131","TV":"Tuvalu","TR":"T\u00fcrkiye","TM":"T\u00fcrkmenistan","UG":"Uganda","UA":"Ukrayna","OM":"Umman","UY":"Uruguay","JO":"\u00dcrd\u00fcn","VU":"Vanuatu","VA":"Vatikan","VE":"Venezuela","VN":"Vietnam","WF":"Wallis ve Futuna","YE":"Yemen","NC":"Yeni Kaledonya","NZ":"Yeni Zelanda","GR":"Yunanistan","ZM":"Zambiya","ZW":"Zimbabve"}
\ No newline at end of file
diff --git a/public/country/zh-CN.json b/public/country/zh-CN.json
new file mode 100644
index 00000000..b6ad153c
--- /dev/null
+++ b/public/country/zh-CN.json
@@ -0,0 +1 @@
+{"AL":"\u963f\u5c14\u5df4\u5c3c\u4e9a","DZ":"\u963f\u5c14\u53ca\u5229\u4e9a","AF":"\u963f\u5bcc\u6c57","AR":"\u963f\u6839\u5ef7","AE":"\u963f\u62c9\u4f2f\u8054\u5408\u914b\u957f\u56fd","AW":"\u963f\u9c81\u5df4","OM":"\u963f\u66fc","AZ":"\u963f\u585e\u62dc\u7586","EG":"\u57c3\u53ca","ET":"\u57c3\u585e\u4fc4\u6bd4\u4e9a","IE":"\u7231\u5c14\u5170","EE":"\u7231\u6c99\u5c3c\u4e9a","AD":"\u5b89\u9053\u5c14","AO":"\u5b89\u54e5\u62c9","AI":"\u5b89\u572d\u62c9","AG":"\u5b89\u63d0\u74dc\u548c\u5df4\u5e03\u8fbe","AT":"\u5965\u5730\u5229","AX":"\u5965\u5170\u7fa4\u5c9b","AU":"\u6fb3\u5927\u5229\u4e9a","BB":"\u5df4\u5df4\u591a\u65af","PG":"\u5df4\u5e03\u4e9a\u65b0\u51e0\u5185\u4e9a","BS":"\u5df4\u54c8\u9a6c","PK":"\u5df4\u57fa\u65af\u5766","PY":"\u5df4\u62c9\u572d","PS":"\u5df4\u52d2\u65af\u5766\u9886\u571f","BH":"\u5df4\u6797","PA":"\u5df4\u62ff\u9a6c","BR":"\u5df4\u897f","BY":"\u767d\u4fc4\u7f57\u65af","BM":"\u767e\u6155\u5927","BG":"\u4fdd\u52a0\u5229\u4e9a","MP":"\u5317\u9a6c\u91cc\u4e9a\u7eb3\u7fa4\u5c9b","MK":"\u5317\u9a6c\u5176\u987f","BJ":"\u8d1d\u5b81","BE":"\u6bd4\u5229\u65f6","IS":"\u51b0\u5c9b","PR":"\u6ce2\u591a\u9ece\u5404","PL":"\u6ce2\u5170","BA":"\u6ce2\u65af\u5c3c\u4e9a\u548c\u9ed1\u585e\u54e5\u7ef4\u90a3","BO":"\u73bb\u5229\u7ef4\u4e9a","BZ":"\u4f2f\u5229\u5179","BW":"\u535a\u8328\u74e6\u7eb3","BT":"\u4e0d\u4e39","BF":"\u5e03\u57fa\u7eb3\u6cd5\u7d22","BI":"\u5e03\u9686\u8fea","BV":"\u5e03\u97e6\u5c9b","KP":"\u671d\u9c9c","GQ":"\u8d64\u9053\u51e0\u5185\u4e9a","DK":"\u4e39\u9ea6","DE":"\u5fb7\u56fd","TL":"\u4e1c\u5e1d\u6c76","TG":"\u591a\u54e5","DO":"\u591a\u7c73\u5c3c\u52a0\u5171\u548c\u56fd","DM":"\u591a\u7c73\u5c3c\u514b","RU":"\u4fc4\u7f57\u65af","EC":"\u5384\u74dc\u591a\u5c14","ER":"\u5384\u7acb\u7279\u91cc\u4e9a","FR":"\u6cd5\u56fd","FO":"\u6cd5\u7f57\u7fa4\u5c9b","PF":"\u6cd5\u5c5e\u6ce2\u5229\u5c3c\u897f\u4e9a","GF":"\u6cd5\u5c5e\u572d\u4e9a\u90a3","TF":"\u6cd5\u5c5e\u5357\u90e8\u9886\u5730","MF":"\u6cd5\u5c5e\u5723\u9a6c\u4e01","VA":"\u68b5\u8482\u5188","PH":"\u83f2\u5f8b\u5bbe","FJ":"\u6590\u6d4e","FI":"\u82ac\u5170","CV":"\u4f5b\u5f97\u89d2","FK":"\u798f\u514b\u5170\u7fa4\u5c9b","GM":"\u5188\u6bd4\u4e9a","CG":"\u521a\u679c\uff08\u5e03\uff09","CD":"\u521a\u679c\uff08\u91d1\uff09","CO":"\u54e5\u4f26\u6bd4\u4e9a","CR":"\u54e5\u65af\u8fbe\u9ece\u52a0","GD":"\u683c\u6797\u7eb3\u8fbe","GL":"\u683c\u9675\u5170","GE":"\u683c\u9c81\u5409\u4e9a","GG":"\u6839\u897f\u5c9b","CU":"\u53e4\u5df4","GP":"\u74dc\u5fb7\u7f57\u666e","GU":"\u5173\u5c9b","GY":"\u572d\u4e9a\u90a3","KZ":"\u54c8\u8428\u514b\u65af\u5766","HT":"\u6d77\u5730","KR":"\u97e9\u56fd","NL":"\u8377\u5170","BQ":"\u8377\u5c5e\u52a0\u52d2\u6bd4\u533a","SX":"\u8377\u5c5e\u5723\u9a6c\u4e01","HM":"\u8d6b\u5fb7\u5c9b\u548c\u9ea6\u514b\u5510\u7eb3\u7fa4\u5c9b","ME":"\u9ed1\u5c71","HN":"\u6d2a\u90fd\u62c9\u65af","KI":"\u57fa\u91cc\u5df4\u65af","DJ":"\u5409\u5e03\u63d0","KG":"\u5409\u5c14\u5409\u65af\u65af\u5766","GN":"\u51e0\u5185\u4e9a","GW":"\u51e0\u5185\u4e9a\u6bd4\u7ecd","CA":"\u52a0\u62ff\u5927","GH":"\u52a0\u7eb3","GA":"\u52a0\u84ec","KH":"\u67ec\u57d4\u5be8","CZ":"\u6377\u514b","ZW":"\u6d25\u5df4\u5e03\u97e6","CM":"\u5580\u9ea6\u9686","QA":"\u5361\u5854\u5c14","KY":"\u5f00\u66fc\u7fa4\u5c9b","CC":"\u79d1\u79d1\u65af\uff08\u57fa\u6797\uff09\u7fa4\u5c9b","KM":"\u79d1\u6469\u7f57","CI":"\u79d1\u7279\u8fea\u74e6","KW":"\u79d1\u5a01\u7279","HR":"\u514b\u7f57\u5730\u4e9a","KE":"\u80af\u5c3c\u4e9a","CK":"\u5e93\u514b\u7fa4\u5c9b","CW":"\u5e93\u62c9\u7d22","LV":"\u62c9\u8131\u7ef4\u4e9a","LS":"\u83b1\u7d22\u6258","LA":"\u8001\u631d","LB":"\u9ece\u5df4\u5ae9","LT":"\u7acb\u9676\u5b9b","LR":"\u5229\u6bd4\u91cc\u4e9a","LY":"\u5229\u6bd4\u4e9a","LI":"\u5217\u652f\u6566\u58eb\u767b","RE":"\u7559\u5c3c\u6c6a","LU":"\u5362\u68ee\u5821","RW":"\u5362\u65fa\u8fbe","RO":"\u7f57\u9a6c\u5c3c\u4e9a","MG":"\u9a6c\u8fbe\u52a0\u65af\u52a0","IM":"\u9a6c\u6069\u5c9b","MV":"\u9a6c\u5c14\u4ee3\u592b","MT":"\u9a6c\u8033\u4ed6","MW":"\u9a6c\u62c9\u7ef4","MY":"\u9a6c\u6765\u897f\u4e9a","ML":"\u9a6c\u91cc","MH":"\u9a6c\u7ecd\u5c14\u7fa4\u5c9b","MQ":"\u9a6c\u63d0\u5c3c\u514b","YT":"\u9a6c\u7ea6\u7279","MU":"\u6bdb\u91cc\u6c42\u65af","MR":"\u6bdb\u91cc\u5854\u5c3c\u4e9a","US":"\u7f8e\u56fd","UM":"\u7f8e\u56fd\u672c\u571f\u5916\u5c0f\u5c9b\u5c7f","AS":"\u7f8e\u5c5e\u8428\u6469\u4e9a","VI":"\u7f8e\u5c5e\u7ef4\u5c14\u4eac\u7fa4\u5c9b","MN":"\u8499\u53e4","MS":"\u8499\u7279\u585e\u62c9\u7279","BD":"\u5b5f\u52a0\u62c9\u56fd","PE":"\u79d8\u9c81","FM":"\u5bc6\u514b\u7f57\u5c3c\u897f\u4e9a","MM":"\u7f05\u7538","MD":"\u6469\u5c14\u591a\u74e6","MA":"\u6469\u6d1b\u54e5","MC":"\u6469\u7eb3\u54e5","MZ":"\u83ab\u6851\u6bd4\u514b","MX":"\u58a8\u897f\u54e5","NA":"\u7eb3\u7c73\u6bd4\u4e9a","ZA":"\u5357\u975e","AQ":"\u5357\u6781\u6d32","GS":"\u5357\u4e54\u6cbb\u4e9a\u548c\u5357\u6851\u5a01\u5947\u7fa4\u5c9b","SS":"\u5357\u82cf\u4e39","NR":"\u7459\u9c81","NI":"\u5c3c\u52a0\u62c9\u74dc","NP":"\u5c3c\u6cca\u5c14","NE":"\u5c3c\u65e5\u5c14","NG":"\u5c3c\u65e5\u5229\u4e9a","NU":"\u7ebd\u57c3","NO":"\u632a\u5a01","NF":"\u8bfa\u798f\u514b\u5c9b","PW":"\u5e15\u52b3","PN":"\u76ae\u7279\u51ef\u6069\u7fa4\u5c9b","PT":"\u8461\u8404\u7259","JP":"\u65e5\u672c","SE":"\u745e\u5178","CH":"\u745e\u58eb","SV":"\u8428\u5c14\u74e6\u591a","WS":"\u8428\u6469\u4e9a","RS":"\u585e\u5c14\u7ef4\u4e9a","SL":"\u585e\u62c9\u5229\u6602","SN":"\u585e\u5185\u52a0\u5c14","CY":"\u585e\u6d66\u8def\u65af","SC":"\u585e\u820c\u5c14","SA":"\u6c99\u7279\u963f\u62c9\u4f2f","BL":"\u5723\u5df4\u6cf0\u52d2\u7c73","CX":"\u5723\u8bde\u5c9b","ST":"\u5723\u591a\u7f8e\u548c\u666e\u6797\u897f\u6bd4","SH":"\u5723\u8d6b\u52d2\u62ff","KN":"\u5723\u57fa\u8328\u548c\u5c3c\u7ef4\u65af","LC":"\u5723\u5362\u897f\u4e9a","SM":"\u5723\u9a6c\u529b\u8bfa","PM":"\u5723\u76ae\u57c3\u5c14\u548c\u5bc6\u514b\u9686\u7fa4\u5c9b","VC":"\u5723\u6587\u68ee\u7279\u548c\u683c\u6797\u7eb3\u4e01\u65af","LK":"\u65af\u91cc\u5170\u5361","SK":"\u65af\u6d1b\u4f10\u514b","SI":"\u65af\u6d1b\u6587\u5c3c\u4e9a","SJ":"\u65af\u74e6\u5c14\u5df4\u548c\u626c\u9a6c\u5ef6","SZ":"\u65af\u5a01\u58eb\u5170","SD":"\u82cf\u4e39","SR":"\u82cf\u91cc\u5357","SB":"\u6240\u7f57\u95e8\u7fa4\u5c9b","SO":"\u7d22\u9a6c\u91cc","TJ":"\u5854\u5409\u514b\u65af\u5766","TW":"\u53f0\u6e7e","TH":"\u6cf0\u56fd","TZ":"\u5766\u6851\u5c3c\u4e9a","TO":"\u6c64\u52a0","TC":"\u7279\u514b\u65af\u548c\u51ef\u79d1\u65af\u7fa4\u5c9b","TT":"\u7279\u7acb\u5c3c\u8fbe\u548c\u591a\u5df4\u54e5","TN":"\u7a81\u5c3c\u65af","TV":"\u56fe\u74e6\u5362","TR":"\u571f\u8033\u5176","TM":"\u571f\u5e93\u66fc\u65af\u5766","TK":"\u6258\u514b\u52b3","WF":"\u74e6\u5229\u65af\u548c\u5bcc\u56fe\u7eb3","VU":"\u74e6\u52aa\u963f\u56fe","GT":"\u5371\u5730\u9a6c\u62c9","VE":"\u59d4\u5185\u745e\u62c9","BN":"\u6587\u83b1","UG":"\u4e4c\u5e72\u8fbe","UA":"\u4e4c\u514b\u5170","UY":"\u4e4c\u62c9\u572d","UZ":"\u4e4c\u5179\u522b\u514b\u65af\u5766","ES":"\u897f\u73ed\u7259","EH":"\u897f\u6492\u54c8\u62c9","GR":"\u5e0c\u814a","SG":"\u65b0\u52a0\u5761","NC":"\u65b0\u5580\u91cc\u591a\u5c3c\u4e9a","NZ":"\u65b0\u897f\u5170","HU":"\u5308\u7259\u5229","SY":"\u53d9\u5229\u4e9a","JM":"\u7259\u4e70\u52a0","AM":"\u4e9a\u7f8e\u5c3c\u4e9a","YE":"\u4e5f\u95e8","IQ":"\u4f0a\u62c9\u514b","IR":"\u4f0a\u6717","IL":"\u4ee5\u8272\u5217","IT":"\u610f\u5927\u5229","IN":"\u5370\u5ea6","ID":"\u5370\u5ea6\u5c3c\u897f\u4e9a","GB":"\u82f1\u56fd","VG":"\u82f1\u5c5e\u7ef4\u5c14\u4eac\u7fa4\u5c9b","IO":"\u82f1\u5c5e\u5370\u5ea6\u6d0b\u9886\u5730","JO":"\u7ea6\u65e6","VN":"\u8d8a\u5357","ZM":"\u8d5e\u6bd4\u4e9a","JE":"\u6cfd\u897f\u5c9b","TD":"\u4e4d\u5f97","GI":"\u76f4\u5e03\u7f57\u9640","CL":"\u667a\u5229","CF":"\u4e2d\u975e\u5171\u548c\u56fd","CN":"\u4e2d\u56fd","MO":"\u4e2d\u56fd\u6fb3\u95e8\u7279\u522b\u884c\u653f\u533a","HK":"\u4e2d\u56fd\u9999\u6e2f\u7279\u522b\u884c\u653f\u533a"}
\ No newline at end of file
diff --git a/redux/actions/app.js b/redux/actions/app.js
index 6bcba2f0..490bd7f1 100644
--- a/redux/actions/app.js
+++ b/redux/actions/app.js
@@ -7,6 +7,10 @@ const app = createSlice({
initialState: {
locale: getItem(LOCALE_CONFIG) || 'en-US',
theme: getItem(THEME_CONFIG) || 'light',
+ versions: {
+ current: process.env.VERSION,
+ latest: null,
+ },
},
reducers: {
setLocale(state, action) {
@@ -17,9 +21,51 @@ const app = createSlice({
state.theme = action.payload;
return state;
},
+ setVersions(state, action) {
+ state.versions = action.payload;
+ return state;
+ },
},
});
-export const { setLocale, setTheme } = app.actions;
+export const { setLocale, setTheme, setVersions } = app.actions;
export default app.reducer;
+
+export function checkVersion() {
+ return async (dispatch, getState) => {
+ const {
+ app: {
+ versions: { current },
+ },
+ } = getState();
+
+ const data = await fetch('https://api.github.com/repos/mikecao/umami/releases/latest', {
+ method: 'get',
+ headers: {
+ Accept: 'application/vnd.github.v3+json',
+ },
+ }).then(res => {
+ if (res.ok) {
+ return res.json();
+ }
+
+ return null;
+ });
+
+ if (!data) {
+ return;
+ }
+
+ const { tag_name } = data;
+
+ const latest = tag_name.startsWith('v') ? tag_name.slice(1) : tag_name;
+
+ return dispatch(
+ setVersions({
+ current,
+ latest,
+ }),
+ );
+ };
+}
diff --git a/rollup.tracker.config.js b/rollup.tracker.config.js
index e836955f..5d2938ee 100644
--- a/rollup.tracker.config.js
+++ b/rollup.tracker.config.js
@@ -9,5 +9,5 @@ export default {
file: 'public/umami.js',
format: 'iife',
},
- plugins: [resolve(), buble(), terser({ compress: { evaluate: false } })],
+ plugins: [resolve(), buble({ objectAssign: true }), terser({ compress: { evaluate: false } })],
};
diff --git a/scripts/check-lang.js b/scripts/check-lang.js
new file mode 100644
index 00000000..96522879
--- /dev/null
+++ b/scripts/check-lang.js
@@ -0,0 +1,24 @@
+const fs = require('fs');
+const path = require('path');
+const chalk = require('chalk');
+const messages = require('../lang/en-US.json');
+
+const dir = path.resolve(__dirname, '../lang');
+const files = fs.readdirSync(dir);
+const keys = Object.keys(messages).sort();
+
+files.forEach(file => {
+ if (file !== 'en-US.json') {
+ const lang = require(`../lang/${file}`);
+
+ console.log(chalk.yellowBright(`\n## ${file}`));
+ keys.forEach(key => {
+ const orig = messages[key];
+ const check = lang[key];
+
+ if (!check || check === orig) {
+ console.log(chalk.redBright('*'), chalk.greenBright(`${key}:`), orig);
+ }
+ });
+ }
+});
diff --git a/scripts/start-env.js b/scripts/start-env.js
new file mode 100644
index 00000000..bfaf1330
--- /dev/null
+++ b/scripts/start-env.js
@@ -0,0 +1,4 @@
+require('dotenv').config();
+const cli = require('next/dist/cli/next-start');
+
+cli.nextStart(['-p', process.env.PORT || 3000, '-H', process.env.HOSTNAME || '0.0.0.0']);
diff --git a/yarn.lock b/yarn.lock
index caed31d8..00d976eb 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1193,15 +1193,15 @@
resolved "https://registry.yarnpkg.com/@panva/asn1.js/-/asn1.js-1.0.0.tgz#dd55ae7b8129e02049f009408b97c61ccf9032f6"
integrity sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==
-"@prisma/cli@2.7.1":
- version "2.7.1"
- resolved "https://registry.yarnpkg.com/@prisma/cli/-/cli-2.7.1.tgz#98f2cb434bb931341e6c6292c7bab601e5f842f8"
- integrity sha512-0uA+gWkNQ35DveVHDPltiTCTr4wcXtEhnPs463IEM+Xn8dTv9x0gtZiYHSuQM3t7uwlOxj1rurBsqSbiljynfQ==
+"@prisma/cli@2.8.0":
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/@prisma/cli/-/cli-2.8.0.tgz#919d7f66023affa76d14823212b62a8512cfd37d"
+ integrity sha512-Kg1C47d75jdEIMmJif8TMlv/2Ihx08E1qWp0euwoZhjd807HGnjgC9tJYjTfkdf+NMJSAUbvoPXKInEX0HoOMw==
-"@prisma/client@2.7.1":
- version "2.7.1"
- resolved "https://registry.yarnpkg.com/@prisma/client/-/client-2.7.1.tgz#0a37ddff7fe80ae3a86dfa620c1141c8607be6c2"
- integrity sha512-IEWDCuvIaQTira8/jAyf+uY+AuPPUFDIXMSN4zEA/gvoJv2woq7RmkaubS+NQVgDbbyOR6F3UcXLiFTYQDzZkQ==
+"@prisma/client@2.8.0":
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/@prisma/client/-/client-2.8.0.tgz#a0f7247786c9b6ee804437acf8215854c5eb3946"
+ integrity sha512-5+GzRTkPnmv4OEV2tB8kwQt/xLLxBR/daJBcMt6pnnonJvrREsu0tSTdz2LJNPaj3kTT0fSS/OaeGMMdfVYSpw==
dependencies:
pkg-up "^3.1.0"
@@ -4145,10 +4145,10 @@ for-own@^0.1.3:
dependencies:
for-in "^1.0.1"
-formik@^2.1.5:
- version "2.1.5"
- resolved "https://registry.yarnpkg.com/formik/-/formik-2.1.5.tgz#de5bbbe35543fa6d049fe96b8ee329d6cd6892b8"
- integrity sha512-bWpo3PiqVDYslvrRjTq0Isrm0mFXHiO33D8MS6t6dWcqSFGeYF52nlpCM2xwOJ6tRVRznDkL+zz/iHPL4LDuvQ==
+formik@^2.1.6:
+ version "2.1.6"
+ resolved "https://registry.yarnpkg.com/formik/-/formik-2.1.6.tgz#f723bfccb2c7abec886aa6a4930b360d20f1a0b3"
+ integrity sha512-m9DcxlZw/58p4xuhH3dzUzQWaC4dig0RKX7yNQOJt4VRhXn7p+YRrs3o17r3YwzvOLua3zC53VMbfupLsDwO5w==
dependencies:
deepmerge "^2.1.1"
hoist-non-react-statics "^3.3.0"
@@ -5493,10 +5493,10 @@ mathml-tag-names@^2.1.3:
resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3"
integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==
-maxmind@^4.1.4:
- version "4.1.4"
- resolved "https://registry.yarnpkg.com/maxmind/-/maxmind-4.1.4.tgz#14fa0cf9a88f15b708edfd1378c5e49e0f0105c1"
- integrity sha512-DfcZPpc0XJVF1yypRpVqMs9JiSYYShVkfexSjwTbfqZMCEoQlCU83ooX9cRmWMUaLqm4zffi7HtZg7XqcJaL1A==
+maxmind@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/maxmind/-/maxmind-4.2.0.tgz#912e5ec4a961807d20d7fb541160aeb5ea802c1c"
+ integrity sha512-TADiE11Q10IjvLtlo05tTD52xLqfCJMhE3eYJHmpYIKg668STi/fQZGH9X3FpqpIP/2WPgKFxf899awFvfMtQA==
dependencies:
tiny-lru "7.0.6"
@@ -8347,10 +8347,10 @@ stylelint-config-recommended@^3.0.0:
resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz#e0e547434016c5539fe2650afd58049a2fd1d657"
integrity sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==
-stylelint@^13.7.1:
- version "13.7.1"
- resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.7.1.tgz#bee97ee78d778a3f1dbe3f7397b76414973e263e"
- integrity sha512-qzqazcyRxrSRdmFuO0/SZOJ+LyCxYy0pwcvaOBBnl8/2VfHSMrtNIE+AnyJoyq6uKb+mt+hlgmVrvVi6G6XHfQ==
+stylelint@^13.7.2:
+ version "13.7.2"
+ resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.7.2.tgz#6f3c58eea4077680ed0ceb0d064b22b100970486"
+ integrity sha512-mmieorkfmO+ZA6CNDu1ic9qpt4tFvH2QUB7vqXgrMVHe5ENU69q7YDq0YUg/UHLuCsZOWhUAvcMcLzLDIERzSg==
dependencies:
"@stylelint/postcss-css-in-js" "^0.37.2"
"@stylelint/postcss-markdown" "^0.36.1"