├── .prettierignore
├── .eslintignore
├── static
├── map.jpg
├── favicon.ico
├── favicon.png
├── avatars
│ ├── kay.jpg
│ ├── koji.jpg
│ ├── mark.jpg
│ ├── mert.jpg
│ ├── gilles.png
│ ├── hinano.jpg
│ ├── leonard.jpg
│ ├── shane.jpg
│ ├── vlumi.jpg
│ └── alastair.jpg
├── japan-static.png
└── icons
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── mstile-150x150.png
│ ├── apple-touch-icon.png
│ ├── android-chrome-192x192.png
│ ├── android-chrome-512x512.png
│ ├── browserconfig.xml
│ ├── site.webmanifest
│ └── safari-pinned-tab.svg
├── .github
└── PULL_REQUEST_TEMPLATE.md
├── src
├── _type.scss
├── components
│ ├── LanguagePicker
│ │ ├── index.js
│ │ └── LanguagePicker.js
│ ├── DailyIncreaseChart
│ │ ├── index.js
│ │ └── DailyIncrease.js
│ ├── OutbreakMap
│ │ ├── ApiKey.js
│ │ ├── index.js
│ │ ├── DrawMap.js
│ │ ├── drawLegend.js
│ │ ├── _map.scss
│ │ └── DrawMapPrefectures.js
│ ├── PrefectureTable
│ │ ├── index.js
│ │ ├── _prefectureTable.scss
│ │ └── PrefectureTable.js
│ ├── Header
│ │ ├── UpdatePageDirectionClass.js
│ │ ├── index.js
│ │ ├── DrawPageTitleCount.js
│ │ ├── UpdateTooltipLang.js
│ │ └── DrawLastUpdated.js
│ ├── Loader
│ │ └── index.js
│ ├── KpiReact
│ │ ├── linearGradient.js
│ │ ├── Kpi.js
│ │ └── index.js
│ └── RegionalCharts
│ │ └── _regional.scss
├── _loader.scss
├── embed.js
├── _layout.scss
├── data
│ ├── scaling.js
│ ├── helper.js
│ └── constants.js
├── _colors.scss
├── i18n
│ ├── index.js
│ ├── de.json
│ ├── zh.json
│ ├── ja.json
│ ├── hi.json
│ ├── bn.json
│ ├── cs.json
│ ├── pt.json
│ ├── tr.json
│ ├── pl.json
│ ├── fr.json
│ ├── fa.json
│ ├── th.json
│ ├── en.json
│ ├── uk.json
│ ├── it.json
│ ├── id.json
│ ├── ru.json
│ ├── es.json
│ ├── np.json
│ ├── ph.json
│ ├── fi.json
│ └── ar.json
├── index.scss
└── _kpi.scss
├── .gitignore
├── postcss.config.js
├── webpack.dev.js
├── webpack.prod.js
├── server.js
├── babel.config.js
├── .eslintrc.json
├── server.webpack.js
├── LICENSE
├── webpack.common.js
├── package.json
└── README.md
/.prettierignore:
--------------------------------------------------------------------------------
1 | docs/
2 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | /docs/**
2 |
3 |
--------------------------------------------------------------------------------
/static/map.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/map.jpg
--------------------------------------------------------------------------------
/static/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/favicon.ico
--------------------------------------------------------------------------------
/static/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/favicon.png
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | // Please include a screenshot of any visual changes you've made
2 |
--------------------------------------------------------------------------------
/src/_type.scss:
--------------------------------------------------------------------------------
1 | $font-weight-extra-bold: 800;
2 | $font-weight-bold: 700;
3 | $font-weight-normal: 400;
--------------------------------------------------------------------------------
/static/avatars/kay.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/avatars/kay.jpg
--------------------------------------------------------------------------------
/static/avatars/koji.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/avatars/koji.jpg
--------------------------------------------------------------------------------
/static/avatars/mark.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/avatars/mark.jpg
--------------------------------------------------------------------------------
/static/avatars/mert.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/avatars/mert.jpg
--------------------------------------------------------------------------------
/static/japan-static.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/japan-static.png
--------------------------------------------------------------------------------
/static/avatars/gilles.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/avatars/gilles.png
--------------------------------------------------------------------------------
/static/avatars/hinano.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/avatars/hinano.jpg
--------------------------------------------------------------------------------
/static/avatars/leonard.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/avatars/leonard.jpg
--------------------------------------------------------------------------------
/static/avatars/shane.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/avatars/shane.jpg
--------------------------------------------------------------------------------
/static/avatars/vlumi.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/avatars/vlumi.jpg
--------------------------------------------------------------------------------
/static/avatars/alastair.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/avatars/alastair.jpg
--------------------------------------------------------------------------------
/static/icons/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/icons/favicon-16x16.png
--------------------------------------------------------------------------------
/static/icons/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/icons/favicon-32x32.png
--------------------------------------------------------------------------------
/static/icons/mstile-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/icons/mstile-150x150.png
--------------------------------------------------------------------------------
/static/icons/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/icons/apple-touch-icon.png
--------------------------------------------------------------------------------
/src/components/LanguagePicker/index.js:
--------------------------------------------------------------------------------
1 | import LanguagePicker from "./LanguagePicker";
2 |
3 | export default LanguagePicker;
4 |
--------------------------------------------------------------------------------
/static/icons/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/icons/android-chrome-192x192.png
--------------------------------------------------------------------------------
/static/icons/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/reustle/covid19japan/HEAD/static/icons/android-chrome-512x512.png
--------------------------------------------------------------------------------
/src/components/DailyIncreaseChart/index.js:
--------------------------------------------------------------------------------
1 | import drawDailyIncreaseChart from "./DailyIncrease";
2 |
3 | export default drawDailyIncreaseChart;
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | _site/
3 | *.sqlite3
4 | docs/
5 |
6 | .idea
7 | .vscode
8 | node_modules
9 | .jekyll-cache/
10 |
11 | .eslintcache
12 |
--------------------------------------------------------------------------------
/src/components/OutbreakMap/ApiKey.js:
--------------------------------------------------------------------------------
1 | export const MAPBOX_API_KEY =
2 | "pk.eyJ1IjoicmV1c3RsZSIsImEiOiJjazZtaHE4ZnkwMG9iM3BxYnFmaDgxbzQ0In0.nOiHGcSCRNa9MD9WxLIm7g";
3 |
--------------------------------------------------------------------------------
/src/components/PrefectureTable/index.js:
--------------------------------------------------------------------------------
1 | import {
2 | drawAllPrefectureTable,
3 | drawTopPrefectureTable,
4 | } from "./PrefectureTable";
5 |
6 | export default { drawAllPrefectureTable, drawTopPrefectureTable };
7 |
--------------------------------------------------------------------------------
/src/components/Header/UpdatePageDirectionClass.js:
--------------------------------------------------------------------------------
1 | const updatePageDirectionClass = (direction) => {
2 | const bodyEl = document.querySelector("body");
3 |
4 | bodyEl.dataset.direction = direction;
5 | };
6 |
7 | export default updatePageDirectionClass;
8 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | if (process.env.NODE_ENV === 'production') {
2 | module.exports = {
3 | plugins: [
4 | require('autoprefixer'),
5 | require('cssnano'),
6 | // More postCSS modules here if needed
7 | ]
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/components/OutbreakMap/index.js:
--------------------------------------------------------------------------------
1 | import drawMap from "./DrawMap";
2 | import drawMapPrefectures from "./DrawMapPrefectures";
3 | import { drawLegend } from "./drawLegend";
4 |
5 | export default {
6 | drawMap,
7 | drawMapPrefectures,
8 | drawLegend,
9 | };
10 |
--------------------------------------------------------------------------------
/webpack.dev.js:
--------------------------------------------------------------------------------
1 | const merge = require("webpack-merge");
2 | const common = require("./webpack.common.js");
3 |
4 | module.exports = merge(common, {
5 | mode: "development",
6 | devtool: "source-map",
7 | devServer: {
8 | contentBase: "./docs",
9 | },
10 | });
11 |
--------------------------------------------------------------------------------
/static/icons/browserconfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | #8ecafb
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/webpack.prod.js:
--------------------------------------------------------------------------------
1 | const merge = require("webpack-merge");
2 | const TerserPlugin = require("terser-webpack-plugin");
3 |
4 | const common = require("./webpack.common.js");
5 |
6 | module.exports = merge(common, {
7 | mode: "production",
8 | devtool: "source-map",
9 | optimization: {
10 | minimize: true,
11 | minimizer: [new TerserPlugin()],
12 | },
13 | });
14 |
--------------------------------------------------------------------------------
/server.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable no-console */
2 | const express = require('express')
3 |
4 | const app = express()
5 | app.use(express.static('docs'))
6 |
7 | let port = process.env.PORT || 4000
8 |
9 | var listener = app.listen(port, function () {
10 | console.log('listening on port ' + listener.address().port);
11 | console.log('http://localhost:' + listener.address().port);
12 | });
13 |
--------------------------------------------------------------------------------
/src/components/Header/index.js:
--------------------------------------------------------------------------------
1 | import updateTooltipLang from "./UpdateTooltipLang";
2 | import drawPageTitleCount from "./DrawPageTitleCount";
3 | import drawLastUpdated from "./DrawLastUpdated";
4 | import updatePageDirectionClass from "./UpdatePageDirectionClass";
5 |
6 | export default {
7 | updateTooltipLang,
8 | drawPageTitleCount,
9 | drawLastUpdated,
10 | updatePageDirectionClass,
11 | };
12 |
--------------------------------------------------------------------------------
/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = function (api) {
2 | api.cache(false);
3 | return {
4 | plugins: ["date-fns", "@babel/plugin-transform-runtime"],
5 | presets: [
6 | [
7 | "@babel/preset-env",
8 | {
9 | useBuiltIns: "usage",
10 | targets: { chrome: "58", ie: "11" },
11 | },
12 | ],
13 | ["@babel/preset-react"],
14 | ],
15 | };
16 | };
17 |
--------------------------------------------------------------------------------
/src/components/Loader/index.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { bool } from "prop-types";
3 |
4 | const Loader = ({ isLoaded }) => {
5 | if (!isLoaded) return null;
6 |
7 | return (
8 |
11 | );
12 | };
13 |
14 | Loader.propTypes = {
15 | isLoaded: bool.isRequired,
16 | };
17 |
18 | export default Loader;
19 |
--------------------------------------------------------------------------------
/src/components/Header/DrawPageTitleCount.js:
--------------------------------------------------------------------------------
1 | import { PAGE_TITLE } from "../../data/constants";
2 | import { maybeIntlNumberFormat } from "../../i18n";
3 |
4 | const drawPageTitleCount = (confirmed, lang) => {
5 | // Update the number of confirmed cases in the title
6 | const formatNumber = maybeIntlNumberFormat(lang);
7 | document.title = `(${formatNumber(confirmed)}) ${PAGE_TITLE}`;
8 | };
9 |
10 | export default drawPageTitleCount;
11 |
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "browser": true,
4 | "es6": true,
5 | "node": true
6 | },
7 | "extends": ["plugin:prettier/recommended", "plugin:react/recommended"],
8 | "globals": {
9 | "Atomics": "readonly",
10 | "SharedArrayBuffer": "readonly"
11 | },
12 | "parserOptions": {
13 | "ecmaVersion": 2018,
14 | "sourceType": "module"
15 | },
16 | "plugins": ["react", "react-hooks"],
17 | "rules": {
18 | "react-hooks/rules-of-hooks": "error",
19 | "react-hooks/exhaustive-deps": "warn"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/static/icons/site.webmanifest:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Japan COVID-19",
3 | "short_name": "Japan COVID-19",
4 | "icons": [
5 | {
6 | "src": "/static/icons/android-chrome-192x192.png?v=1586005472",
7 | "sizes": "192x192",
8 | "type": "image/png"
9 | },
10 | {
11 | "src": "/static/icons/android-chrome-512x512.png?v=1586005472",
12 | "sizes": "512x512",
13 | "type": "image/png"
14 | }
15 | ],
16 | "theme_color": "#8ecafb",
17 | "background_color": "#8ecafb",
18 | "display": "standalone"
19 | }
20 |
--------------------------------------------------------------------------------
/src/_loader.scss:
--------------------------------------------------------------------------------
1 |
2 | // Loading Icon
3 | .loader {
4 | padding: 20px;
5 | text-align: center;
6 | }
7 |
8 | .lds-dual-ring {
9 | display: inline-block;
10 | width: 24px;
11 | height: 24px;
12 | }
13 | .lds-dual-ring:after {
14 | content: " ";
15 | display: block;
16 | width: 16px;
17 | height: 16px;
18 | border-radius: 50%;
19 | border: 4px solid #f44336;
20 | border-color: #f44336 transparent #f44336 transparent;
21 | animation: lds-dual-ring 1.6s linear infinite;
22 | }
23 | @keyframes lds-dual-ring {
24 | 0% {
25 | transform: rotate(0deg);
26 | }
27 | 100% {
28 | transform: rotate(360deg);
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/server.webpack.js:
--------------------------------------------------------------------------------
1 | const express = require('express')
2 | const webpack = require('webpack')
3 | const webpackDevMiddleware = require('webpack-dev-middleware');
4 | const config = require('./webpack.dev.js')
5 |
6 | const app = express();
7 | const compiler = webpack(config);
8 |
9 | app.use(webpackDevMiddleware(compiler, {
10 | publicPath: config.output.publicPath
11 | }));
12 |
13 | app.use(express.static('docs'));
14 |
15 | var listener = app.listen(4000, function () {
16 | console.log("****************************************");
17 | console.log('**** http://localhost:' + listener.address().port + "/");
18 | console.log("****************************************");
19 | console.log("\n");
20 | });
21 |
--------------------------------------------------------------------------------
/src/embed.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Embed covid19japan.com into your web app
3 | */
4 |
5 | // configure embed
6 | const element = document.getElementById("covid19japan-embed");
7 | const style = `
8 | border: 0;
9 | width: 100%;
10 | height: 100%;
11 | `;
12 | const src = "https://covid19japan.com/embed";
13 |
14 | // populate embed html
15 | element.innerHTML = ``;
16 |
17 | // listen for resize
18 | window.addEventListener(
19 | "message",
20 | function (e) {
21 | const frame = document.getElementById("covid19japan-iframe");
22 | const message = e.data;
23 | switch (message.name) {
24 | case "setHeight":
25 | frame.style.height = message.payload;
26 | break;
27 | }
28 | },
29 | false
30 | );
31 |
--------------------------------------------------------------------------------
/src/components/Header/UpdateTooltipLang.js:
--------------------------------------------------------------------------------
1 | import i18next from "i18next";
2 | import tippy from "tippy.js";
3 |
4 | // Keep track of tippy instances in order to destroy them.
5 | let tippyInstances = null;
6 |
7 | const updateTooltipLang = () => {
8 | // Destroy current tooltips
9 | if (Array.isArray(tippyInstances)) {
10 | tippyInstances.forEach((instance) => instance.destroy());
11 | }
12 |
13 | // Set tooltip content to current language
14 | document.querySelectorAll(`[data-tippy-i18n]`).forEach((node) => {
15 | const i18nKey = node.getAttribute("data-tippy-i18n");
16 | const dataTippyContent = i18next.t(i18nKey);
17 | node.setAttribute("data-tippy-content", dataTippyContent);
18 | });
19 |
20 | // Activate tooltips
21 | tippyInstances = tippy("[data-tippy-content]");
22 | };
23 |
24 | export default updateTooltipLang;
25 |
--------------------------------------------------------------------------------
/src/_layout.scss:
--------------------------------------------------------------------------------
1 | // Breakpoints definitions.
2 |
3 | $min-page-margins: 20px;
4 |
5 | $breakpoint-1200: 1200px;
6 | $breakpoint-1200-less-than: 1199px;
7 | $breakpoint-1200-page-width: $breakpoint-1200 - $min-page-margins;
8 |
9 | $breakpoint-960: 960px;
10 | $breakpoint-960-less-than: 959px;
11 | $breakpoint-960-page-width: $breakpoint-960 - $min-page-margins;
12 |
13 | $breakpoint-600: 600px;
14 | $breakpoint-600-less-than: 599px;
15 | $breakpoint-600-page-width: $breakpoint-600 - $min-page-margins;
16 |
17 | $breakpoint-500: 500px;
18 | $breakpoint-500-page-width: $breakpoint-500 - $min-page-margins;
19 |
20 | $breakpoint-375: 375px;
21 | $breakpoint-375-less-than: 374px;
22 | $breakpoint-375-page-width: $breakpoint-375 - $min-page-margins;
23 |
24 | $breakpoint-425: 425px;
25 | $breakpoint-425-less-than: 424px;
26 | $breakpoint-425-page-width: $breakpoint-425 - $min-page-margins;
27 |
28 | $box-border-radius: 10px;
--------------------------------------------------------------------------------
/src/data/scaling.js:
--------------------------------------------------------------------------------
1 | // Returns a nicely rounded scale based on the number of ticks.
2 |
3 | // Polyfill for log10.
4 | Math.log10 =
5 | Math.log10 ||
6 | function (x) {
7 | return Math.log(x) * Math.LOG10E;
8 | };
9 |
10 | export const niceScale = (values, tickCount) => {
11 | let max = Math.max(...values);
12 | let ticks = [];
13 |
14 | let tickIncrement = max / tickCount;
15 | // Take the tickIncrement and find the nearest power of 10 smaller than tickIncrement.
16 | // e.g. 45 -> 10, 455 -> 100
17 | let magnitude10 = Math.pow(10, Math.ceil(Math.log10(tickIncrement)) - 1);
18 | // Round up tickIncrement to the nearest power of 10.
19 | // e.g. 45 -> 50, 455 -> 500
20 | tickIncrement = Math.ceil(tickIncrement / magnitude10) * magnitude10;
21 |
22 | max = tickIncrement * tickCount;
23 | for (let i = 1; i <= tickCount; i++) {
24 | ticks.push(i * tickIncrement);
25 | }
26 |
27 | return {
28 | max: max,
29 | ticks: ticks,
30 | };
31 | };
32 |
--------------------------------------------------------------------------------
/src/components/OutbreakMap/DrawMap.js:
--------------------------------------------------------------------------------
1 | import { MAPBOX_API_KEY } from "./ApiKey";
2 |
3 | const MAP_CONFIG = {
4 | container: "map-container",
5 | style: "mapbox://styles/mapbox/light-v10?optimize=true",
6 | zoom: 4,
7 | minZoom: 3.5,
8 | maxZoom: 7,
9 | center: {
10 | lng: 139.11792973051274,
11 | lat: 38.52245616545571,
12 | },
13 | maxBounds: [
14 | { lat: 12.118318014416644, lng: 100.01240618330542 }, // SW
15 | { lat: 59.34721256263214, lng: 175.3273570446982 }, // NE
16 | ],
17 | };
18 |
19 | // Create and initializes the map.
20 | const drawMap = () => {
21 | mapboxgl.accessToken = MAPBOX_API_KEY;
22 | let map = new mapboxgl.Map(MAP_CONFIG);
23 | map.dragRotate.disable();
24 | map.touchZoomRotate.disableRotation();
25 | map.scrollZoom.disable();
26 | map.addControl(
27 | new mapboxgl.NavigationControl({
28 | showCompass: false,
29 | showZoom: true,
30 | })
31 | );
32 | return map;
33 | };
34 |
35 | export default drawMap;
36 |
--------------------------------------------------------------------------------
/src/components/LanguagePicker/LanguagePicker.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect, memo } from "react";
2 | import Select from "react-select";
3 | import { string } from "prop-types";
4 |
5 | import { setLang } from "../../index";
6 | import { languageOptions } from "../../data/constants";
7 |
8 | const LanguagePicker = ({ lang }) => {
9 | const [currentLang, setCurrentLang] = useState(
10 | languageOptions.find((language) => language.value === lang)
11 | );
12 |
13 | const customStyles = {
14 | control: (styles) => ({ ...styles, width: "200px", cursor: "pointer" }),
15 | option: (styles) => ({ ...styles, cursor: "pointer" }),
16 | };
17 |
18 | useEffect(() => {
19 | setLang(currentLang.value);
20 | }, [currentLang]);
21 |
22 | return (
23 |
29 | );
30 | };
31 |
32 | LanguagePicker.propTypes = {
33 | lang: string,
34 | };
35 |
36 | LanguagePicker.defaultProps = {
37 | lang: "en",
38 | };
39 |
40 | export default memo(LanguagePicker);
41 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 covid19japan.com
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/src/components/OutbreakMap/drawLegend.js:
--------------------------------------------------------------------------------
1 | import i18next from "i18next";
2 | import { LEGEND_CLASSES, MAP_COLOR_BOUNDARIES } from "../../data/constants";
3 | import { maybeIntlNumberFormat } from "../../i18n";
4 |
5 | const getLegendLabel = (boundary, previousBoundary, formatNumber) => {
6 | if (previousBoundary === 0) {
7 | return i18next.t("cases-none");
8 | }
9 | if (!isFinite(boundary)) {
10 | return i18next.t("cases-last", { from: formatNumber(previousBoundary) });
11 | }
12 | return i18next.t("cases-range", {
13 | from: formatNumber(previousBoundary),
14 | to: formatNumber(boundary - 1),
15 | });
16 | };
17 |
18 | export const drawLegend = (lang) => {
19 | const formatNumber = maybeIntlNumberFormat(lang);
20 | let classIndex = 0;
21 | let previousBoundary = 0;
22 | let html = "";
23 | for (let boundary of Object.keys(MAP_COLOR_BOUNDARIES).sort(
24 | (a, b) => a - b
25 | )) {
26 | let label = getLegendLabel(boundary, previousBoundary, formatNumber);
27 | html += `▉ ${label}
`;
28 |
29 | classIndex = (classIndex + 1) % LEGEND_CLASSES.length;
30 | previousBoundary = boundary;
31 | }
32 | return html;
33 | };
34 |
--------------------------------------------------------------------------------
/src/_colors.scss:
--------------------------------------------------------------------------------
1 |
2 | $primary-black: rgb(0, 10, 18);
3 | $color-confirmed: rgba(244, 67, 52, 1);
4 | $color-confirmed-caption: rgba(244, 67, 52, 0.8);
5 | $color-confirmed-light: rgba(244, 67, 52, 0.4);
6 | $color-active: rgba(223, 14, 31, 1);
7 | $color-active-caption: rgba(223, 14, 31, 0.8);
8 | $color-active-light: rgba(223, 14, 31, 0.4);
9 | $color-recovered: rgba(24, 118, 211, 1);
10 | $color-recovered-caption: rgba(24, 118, 211, 0.8);
11 | $color-recovered-light: rgba(24,118,211, 0.4);
12 | $color-deceased: rgba(54, 72, 79, 1);
13 | $color-deceased-caption: rgba(54, 72, 79, 0.8);
14 | $color-deceased-light: rgba(54,72,79, 0.4);
15 | $color-tested: rgba(6, 67, 128, 1);
16 | $color-tested-caption: rgba(6, 67, 128, 1);
17 | $color-tested-light: rgba(6, 67, 128, 0.4);
18 | $color-critical: rgb(114, 4, 5);
19 | $color-critical-caption: rgba(114, 4, 5, 0.8);
20 | $color-critical-light: rgba(114, 4, 5, 0.4);
21 |
22 | $color-increment-today: $color-active;
23 | $color-increment-yesterday: rgb(128, 122, 122);
24 |
25 | $color-background: rgb(248, 250, 251);
26 | $color-light-caption: rgb(128, 122, 122);
27 |
28 | $color-box-background: rgb(255, 255, 255);
29 | $color-box-border: 1px solid rgba(164, 173, 192, 0.5);
30 | $color-box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.2);
31 |
32 | $color-embed-background: rgb(255, 255, 255);
33 | $color-value-label: rgb(190, 190, 190);
34 |
35 | $color-inactive: rgb(48, 129, 48);
36 |
37 | $color-title-light: rgb(128, 128, 128);
38 | $color-title-dark: rgb(0, 10, 18);
39 |
--------------------------------------------------------------------------------
/src/components/OutbreakMap/_map.scss:
--------------------------------------------------------------------------------
1 | @import 'src/colors';
2 | @import 'src/layout';
3 |
4 | $map-color-background: #cad2d3;
5 |
6 | #prefecture-map-contents img {
7 | width: 100%;
8 | border-radius: 10px;
9 | cursor: zoom-in;
10 | }
11 |
12 | #map-container {
13 | display: none;
14 | width: 100%;
15 | height: 500px;
16 | background: $map-color-background;
17 | border-radius: $box-border-radius;
18 | }
19 |
20 | #map-legend {
21 | padding: 20px 10px;
22 | font-size: 0.9em;
23 | display: flex;
24 | flex-wrap: wrap;
25 | justify-content: flex-start;
26 |
27 | > div {
28 | display: block;
29 | height: 2em;
30 | padding: 0 1rem;
31 | white-space: nowrap;
32 | width: 30%;
33 | }
34 |
35 | span.none {
36 | color: #f6f6f4;
37 | }
38 |
39 | span.one {
40 | color: #fdeacb;
41 | }
42 |
43 | span.two {
44 | color: #fb9b7f;
45 | }
46 |
47 | span.three {
48 | color: #f44336;
49 | }
50 |
51 | span.four {
52 | color: #ba000d;
53 | }
54 |
55 | span.five {
56 | color: #720405;
57 | }
58 | }
59 |
60 | @media (min-width: $breakpoint-960) and (max-width: $breakpoint-1200-less-than) {
61 | #map-legend {
62 | > div {
63 | width: 45%;
64 | }
65 | }
66 | }
67 |
68 | @media (max-width: $breakpoint-500) {
69 | #map-legend {
70 | > div {
71 | width: 45%;
72 | }
73 | }
74 | }
75 |
76 | .map-popup {
77 | font-size: 0.8rem;
78 | margin-bottom: -5px;
79 |
80 | h3 {
81 | margin: 0;
82 | }
83 |
84 | span.popup-increment {
85 | color: rgb(244,67,54);
86 | font-size: 0.7rem;
87 | }
88 | }
89 |
90 | .popup-content:hover {
91 | visibility: hidden;
92 | }
93 |
--------------------------------------------------------------------------------
/src/data/helper.js:
--------------------------------------------------------------------------------
1 | import {
2 | COLOR_NONE,
3 | MAP_COLOR_BOUNDARIES,
4 | PREFECTURE_PAINT,
5 | } from "./constants";
6 |
7 | export const calculateTotals = (daily) => {
8 | // Calculate the totals
9 | const totals = {
10 | confirmed: 0,
11 | recovered: 0,
12 | deceased: 0,
13 | critical: 0,
14 | active: 0,
15 | tested: 0,
16 | };
17 | const totalsDiff = {
18 | confirmed: 1,
19 | recovered: 1,
20 | deceased: 1,
21 | critical: 1,
22 | active: 1,
23 | tested: 1,
24 | };
25 |
26 | let latest = daily[daily.length - 1];
27 | totals.tested = latest.testedCumulative;
28 | totals.critical = latest.criticalCumulative;
29 | totals.confirmed = latest.confirmedCumulative;
30 | totals.recovered = latest.recoveredCumulative;
31 | totals.deceased = latest.deceasedCumulative;
32 | totals.active = latest.activeCumulative;
33 |
34 | totalsDiff.tested = latest.tested;
35 | totalsDiff.critical = latest.critical;
36 | totalsDiff.confirmed = latest.confirmed;
37 | totalsDiff.recovered = latest.recovered;
38 | totalsDiff.deceased = latest.deceased;
39 | totalsDiff.active = latest.active;
40 |
41 | return [totals, totalsDiff];
42 | };
43 |
44 | export const getPrefecturePaint = (prefectures = []) => {
45 | const prefecturePaint = [...PREFECTURE_PAINT];
46 | prefectures.map((prefecture) => {
47 | let cases = parseInt(prefecture.active);
48 | if (cases > 0) {
49 | prefecturePaint.push(prefecture.name);
50 | let matchingBoundary = Object.keys(MAP_COLOR_BOUNDARIES).find(
51 | (boundary) => cases < boundary
52 | );
53 | let color = MAP_COLOR_BOUNDARIES[matchingBoundary];
54 | prefecturePaint.push(color);
55 | }
56 | });
57 |
58 | // Add a final value to the list for the default color
59 | prefecturePaint.push(COLOR_NONE);
60 | return prefecturePaint;
61 | };
62 |
--------------------------------------------------------------------------------
/webpack.common.js:
--------------------------------------------------------------------------------
1 | const path = require("path");
2 | const HtmlWebpackPlugin = require("html-webpack-plugin");
3 | const { CleanWebpackPlugin } = require("clean-webpack-plugin");
4 | const MiniCssExtractPlugin = require("mini-css-extract-plugin");
5 | const CopyPlugin = require("copy-webpack-plugin");
6 |
7 | module.exports = {
8 | mode: "development",
9 | entry: {
10 | index: ["./src/index.js", "./src/index.scss"],
11 | embed: ["./src/embed.js"],
12 | },
13 | output: {
14 | path: path.resolve(__dirname, "docs"),
15 | filename: "[name].js",
16 | publicPath: "/",
17 | },
18 |
19 | devServer: {
20 | contentBase: "./docs",
21 | },
22 |
23 | plugins: [
24 | new CleanWebpackPlugin({ cleanStaleWebpackAssets: false }),
25 | new HtmlWebpackPlugin({
26 | filename: "index.html",
27 | template: "src/index.html",
28 | chunks: ["index"],
29 | }),
30 | new HtmlWebpackPlugin({
31 | bodyClass: "embed",
32 | filename: "embed.html",
33 | template: "src/index.html",
34 | chunks: ["index"],
35 | }),
36 | new CopyPlugin({
37 | patterns: [{ from: "static/**", to: ".", flatten: false }],
38 | }),
39 | new MiniCssExtractPlugin({
40 | filename: "[name].css",
41 | }),
42 | ],
43 | module: {
44 | rules: [
45 | {
46 | test: /\.(png|svg|jpg|gif|ico|geojson)$/,
47 | use: ["file-loader"],
48 | },
49 | {
50 | test: /\.m?js$/,
51 | exclude: /node_modules/,
52 | use: {
53 | loader: "babel-loader",
54 | options: {
55 | presets: ["@babel/preset-env"],
56 | },
57 | },
58 | },
59 | {
60 | test: /\.scss$/,
61 | use: [
62 | { loader: MiniCssExtractPlugin.loader },
63 | { loader: "css-loader" },
64 | { loader: "postcss-loader" },
65 | {
66 | loader: "sass-loader",
67 | options: { implementation: require("sass") },
68 | },
69 | ],
70 | },
71 | ],
72 | },
73 | };
74 |
--------------------------------------------------------------------------------
/src/components/Header/DrawLastUpdated.js:
--------------------------------------------------------------------------------
1 | import i18next from "i18next";
2 | import { formatDistanceToNow, parse, parseISO } from "date-fns";
3 |
4 | import { LANGUAGES, LOCALES } from "../../i18n";
5 | import { TIME_FORMAT } from "../../data/constants";
6 |
7 | const addRelativeTimeLocalization = (lastUpdated, language) => {
8 | const relativeTime = getLocalizedRelativeTime(lastUpdated, language);
9 | i18next.addResource(
10 | language,
11 | "translation",
12 | "last-updated-time",
13 | relativeTime
14 | );
15 | };
16 |
17 | const getLocalizedRelativeTime = (lastUpdated, language) => {
18 | const locale = LOCALES[language];
19 | return formatDistanceToNow(lastUpdated, {
20 | locale,
21 | addSuffix: true,
22 | });
23 | };
24 |
25 | /**
26 | * @param {string} lastUpdatedString - MMM DD YYYY, HH:mm JST (e.g. Mar 29 2020, 15:53 JST)
27 | */
28 | const drawLastUpdated = (lastUpdatedString, currentLanguage) => {
29 | // Draw the last updated time
30 | // If this is called before data is loaded, lastUpdated can be null.
31 | if (!lastUpdatedString) {
32 | return;
33 | }
34 |
35 | const display = document.getElementById("last-updated-time");
36 | if (!display) {
37 | return;
38 | }
39 |
40 | let lastUpdated;
41 | try {
42 | lastUpdated = parseISO(lastUpdatedString);
43 | // If the timestamp is not ISO, fall back on the old date format
44 | // TODO: remove after ISO time format is fully deployed
45 | if (lastUpdated === "Invalid Date") {
46 | lastUpdated = parse(
47 | lastUpdatedString.slice(0, -4),
48 | TIME_FORMAT,
49 | new Date()
50 | );
51 | }
52 | } catch (e) {
53 | // Fall back to raw value on failed parse
54 | display.textContent = lastUpdatedString;
55 | return;
56 | }
57 |
58 | for (const language of LANGUAGES) {
59 | addRelativeTimeLocalization(lastUpdated, language);
60 | }
61 |
62 | display.setAttribute("title", lastUpdatedString);
63 | display.setAttribute("data-i18n", "last-updated-time");
64 | display.textContent = i18next.getResource(
65 | currentLanguage,
66 | "translation",
67 | "last-updated-time"
68 | );
69 | };
70 |
71 | export default drawLastUpdated;
72 |
--------------------------------------------------------------------------------
/src/components/KpiReact/linearGradient.js:
--------------------------------------------------------------------------------
1 | const gradient = {
2 | confirmed:
3 | '',
4 | recovered:
5 | '',
6 | critical:
7 | '',
8 | deceased:
9 | '',
10 | active:
11 | '',
12 | tested:
13 | '',
14 | };
15 |
16 | export default gradient;
17 |
--------------------------------------------------------------------------------
/src/i18n/index.js:
--------------------------------------------------------------------------------
1 | import {
2 | enUS,
3 | ja,
4 | es,
5 | de,
6 | ptBR,
7 | fr,
8 | id,
9 | fil,
10 | pl,
11 | fi,
12 | it,
13 | cs,
14 | bn,
15 | hi,
16 | uk,
17 | zhTW,
18 | ar,
19 | ru,
20 | th,
21 | faIR,
22 | tr,
23 | np,
24 | } from "date-fns/locale";
25 |
26 | // Add new languages and their emoji flag here. Make sure the array indices line up.
27 | export const LANGUAGES = [
28 | "en",
29 | "ja",
30 | "id",
31 | "cs",
32 | "de",
33 | "es",
34 | "fr",
35 | "it",
36 | "ph",
37 | "pl",
38 | "pt",
39 | "fi",
40 | "tr",
41 | "bn",
42 | "hi",
43 | "uk",
44 | "zh",
45 | "ar",
46 | "ru",
47 | "th",
48 | "fa",
49 | "np",
50 | ];
51 | export const LANGUAGE_NAMES = [
52 | "English",
53 | "日本語",
54 | "Bahasa Indonesia",
55 | "Čeština",
56 | "Deutsch",
57 | "Español",
58 | "Français",
59 | "Italiano",
60 | "Filipino",
61 | "Polski",
62 | "Português",
63 | "Suomi",
64 | "Türkçe",
65 | "বাংলা",
66 | "हिंदी",
67 | "Українська",
68 | "中文 (繁體)",
69 | "العربية",
70 | "Русский",
71 | "ภาษาไทย",
72 | "فارسی",
73 | "नेपाली",
74 | ];
75 |
76 | // Add locales for date-fns here. Make sure the keys match the languages in LANGUAGES.
77 | export const LOCALES = {
78 | en: enUS,
79 | ja: ja,
80 | es: es,
81 | de: de,
82 | pt: ptBR,
83 | fr: fr,
84 | id: id,
85 | ph: fil,
86 | pl: pl,
87 | it: it,
88 | fi: fi,
89 | cs: cs,
90 | bn: bn,
91 | hi: hi,
92 | uk: uk,
93 | zh: zhTW,
94 | ar: ar,
95 | ru: ru,
96 | th: th,
97 | fa: faIR,
98 | tr: tr,
99 | np: np,
100 | };
101 |
102 | const generateExport = () => {
103 | const resources = {};
104 | for (const language of LANGUAGES) {
105 | resources[language] = {
106 | translation: require(`./${language}.json`),
107 | };
108 | }
109 | return resources;
110 | };
111 |
112 | export const maybeIntlNumberFormat = (lang) => {
113 | if (window.Intl && window.Intl.NumberFormat) {
114 | return window.Intl.NumberFormat(lang).format;
115 | }
116 | return (o) => {
117 | return "" + o;
118 | };
119 | };
120 |
121 | export default generateExport();
122 |
--------------------------------------------------------------------------------
/src/components/KpiReact/Kpi.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState, memo } from "react";
2 | import { string, bool } from "prop-types";
3 |
4 | import gradient from "./linearGradient";
5 | import Loader from "../Loader";
6 |
7 | import updateTooltipLang from "../Header/UpdateTooltipLang";
8 |
9 | const Kpi = ({
10 | id,
11 | label,
12 | value,
13 | diff,
14 | caption,
15 | chartName,
16 | percent,
17 | isActive,
18 | }) => {
19 | const [graph, setGraph] = useState(null);
20 | const [isLoading, setIsLoading] = useState(true);
21 |
22 | useEffect(() => {
23 | if (chartName) {
24 | let svgURL = `https://data.covid19japan.com/charts/${chartName}`;
25 | fetch(svgURL).then((response) => {
26 | if (response.status === 200) {
27 | response.text().then((data) => {
28 | setIsLoading(false);
29 | setGraph(data);
30 | });
31 | }
32 | });
33 |
34 | isActive && updateTooltipLang();
35 | }
36 | }, [chartName, isActive]);
37 |
38 | return (
39 | <>
40 |
54 |
55 |
56 | {graph && (
57 |
64 | )}
65 | {!isLoading &&
{caption}
}
66 |
67 | >
68 | );
69 | };
70 |
71 | Kpi.propTypes = {
72 | id: string,
73 | label: string,
74 | value: string,
75 | diff: string,
76 | caption: string,
77 | chartName: string,
78 | percent: string,
79 | isActive: bool,
80 | };
81 |
82 | Kpi.defaultProps = {
83 | id: "",
84 | label: "",
85 | value: "",
86 | diff: "",
87 | caption: "",
88 | chartName: "",
89 | percent: "",
90 | isActive: false,
91 | };
92 |
93 | export default memo(Kpi);
94 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "covid2019-japan",
3 | "version": "1.0.0",
4 | "main": "server.js",
5 | "scripts": {
6 | "build": "npx webpack --config webpack.dev.js",
7 | "build-prod": "npx webpack --config webpack.prod.js",
8 | "watch": "npx webpack --watch --config webpack.dev.js --progress --display minimal",
9 | "start": "node server.js",
10 | "start-webpack": "node server.webpack.js",
11 | "deploy-firebase": "npx webpack --config webpack.prod.js && firebase deploy"
12 | },
13 | "dependencies": {
14 | "@babel/core": "^7.7.7",
15 | "c3": "^0.7.15",
16 | "classlist-polyfill": "^1.2.0",
17 | "core-js": "^3.6.4",
18 | "custom-event-polyfill": "^1.0.7",
19 | "d3": "^5.15.0",
20 | "date-fns": "^2.11.1",
21 | "express": "^4.17.1",
22 | "i18n-iso-countries": "^5.5.0",
23 | "i18next": "^19.3.4",
24 | "i18next-browser-languagedetector": "^4.0.2",
25 | "loc-i18next": "^0.1.4",
26 | "prop-types": "^15.7.2",
27 | "quickelement": "^1.1.1",
28 | "react": "^16.13.1",
29 | "react-dom": "^16.13.1",
30 | "react-i18next": "^11.7.0",
31 | "react-select": "^4.3.0",
32 | "tippy.js": "^6.1.0",
33 | "twemoji": "^12.1.5",
34 | "whatwg-fetch": "^3.0.0"
35 | },
36 | "devDependencies": {
37 | "@babel/cli": "^7.8.4",
38 | "@babel/plugin-transform-runtime": "^7.13.15",
39 | "@babel/preset-env": "^7.9.0",
40 | "@babel/preset-react": "^7.10.4",
41 | "babel-loader": "^8.0.5",
42 | "babel-plugin-date-fns": "^2.0.0",
43 | "clean-webpack-plugin": "^3.0.0",
44 | "copy-webpack-plugin": "^6.0.3",
45 | "css-loader": "^3.4.1",
46 | "eslint": "^6.8.0",
47 | "eslint-config-prettier": "^6.10.1",
48 | "eslint-config-react-app": "^5.2.1",
49 | "eslint-plugin-prettier": "^3.1.2",
50 | "eslint-plugin-react": "^7.20.3",
51 | "eslint-plugin-react-hooks": "^4.0.8",
52 | "file-loader": "^5.0.2",
53 | "html-webpack-plugin": "^3.2.0",
54 | "husky": "^4.2.3",
55 | "lint-staged": "^10.0.9",
56 | "mini-css-extract-plugin": "^0.9.0",
57 | "postcss-loader": "^3.0.0",
58 | "prettier": "^2.0.2",
59 | "sass": "^1.34.0",
60 | "sass-loader": "^8.0.0",
61 | "simplify-geojson": "^1.0.3",
62 | "source-map-explorer": "^2.4.2",
63 | "style-loader": "^1.1.2",
64 | "terser-webpack-plugin": "^4.1.0",
65 | "webpack": "^4.41.5",
66 | "webpack-bundle-analyzer": "^3.7.0",
67 | "webpack-cli": "^3.3.12",
68 | "webpack-dev-middleware": "^3.7.1",
69 | "webpack-merge": "^4.2.2"
70 | },
71 | "husky": {
72 | "hooks": {
73 | "pre-commit": "lint-staged"
74 | }
75 | },
76 | "lint-staged": {
77 | "*.js": "eslint --cache --fix",
78 | "*.{js,css,md,json}": "prettier --write"
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/src/data/constants.js:
--------------------------------------------------------------------------------
1 | import languageResources, { LANGUAGES } from "../i18n";
2 |
3 | export const TIME_FORMAT = "MMMM d yyyy, HH:mm";
4 |
5 | export const TIME_PERIOD_ALL_TIME = 0;
6 | export const TIME_PERIOD_THREE_MONTHS = 90;
7 |
8 | export const COLOR_ACTIVE = "rgb(223,14,31)";
9 | export const COLOR_ACTIVE_LIGHT = " rgb(223, 144, 144)";
10 | export const COLOR_CONFIRMED = "rgb(244,67,54)";
11 | export const COLOR_RECOVERED = "rgb(25,118,210)";
12 | export const COLOR_DECEASED = "rgb(55,71,79)";
13 | export const COLOR_DECEASED_LIGHT = "rgb(155,155,159)";
14 | export const COLOR_CHART_BAR = "rgb(164,173,192)";
15 | export const COLOR_TESTED_DAILY = "rgb(209,214,223)";
16 | export const COLOR_TESTED = "rgba(6, 67, 128, 1)";
17 | export const COLOR_TESTED_LIGHT = "rgb(210, 210, 220)";
18 | export const SUPPORTED_LANGS = LANGUAGES;
19 | export const COLOR_YELLOW = "rgb(254,234,203)";
20 | export const COLOR_ORANGE = "rgb(251,155,127)";
21 | export const COLOR_RED = "rgb(245,67,54)";
22 | export const COLOR_DARK_RED = "rgb(176,1,13)";
23 | export const COLOR_BURGUNDY = "rgb(186,0,13)";
24 | export const COLOR_DARK_BURGUNDY = "rgb(114,4,5)";
25 | export const COLOR_BLACK = "rgba(0,0,0,1)";
26 | export const COLOR_NONE = "rgba(235, 243, 244, 1)";
27 | export const JSON_PATH = "https://data.covid19japan.com/summary/latest.json";
28 | export const PAGE_TITLE = "Coronavirus Disease (COVID-19) Japan Tracker";
29 | export const PREFECTURE_PAINT = ["match", ["get", "name"]];
30 |
31 | export const MAP_COLOR_BOUNDARIES = {
32 | 1: COLOR_NONE,
33 | 50: COLOR_YELLOW,
34 | 100: COLOR_ORANGE,
35 | 500: COLOR_RED,
36 | 1000: COLOR_DARK_RED,
37 | Infinity: COLOR_DARK_BURGUNDY,
38 | };
39 | export const LEGEND_CLASSES = ["none", "one", "two", "three", "four", "five"];
40 |
41 | export const LANG_CONFIG = {
42 | fallbackLng: "en",
43 | lowerCaseLng: true,
44 | detection: {
45 | order: ["querystring", "cookie", "navigator"],
46 | caches: ["cookie"],
47 | cookieMinutes: 60 * 24 * 365,
48 | },
49 | resources: languageResources,
50 | };
51 |
52 | export const DDB_COMMON = {
53 | prefectures: undefined,
54 | trend: undefined,
55 | totals: {
56 | confirmed: 0,
57 | recovered: 0,
58 | deceased: 0,
59 | tested: 0,
60 | critical: 0,
61 | },
62 | totalsDiff: {
63 | confirmed: 0,
64 | recovered: 0,
65 | deceased: 0,
66 | tested: 0,
67 | critical: 0,
68 | },
69 | };
70 |
71 | export const kpiTypes = [
72 | "confirmed",
73 | "recovered",
74 | "critical",
75 | "deceased",
76 | "active",
77 | "tested",
78 | ];
79 |
80 | export const languageOptions = [
81 | { value: "en", label: "🇺🇸 \xa0 English" },
82 | { value: "ja", label: "🇯🇵 \xa0 日本語" },
83 | { value: "id", label: "🇮🇩 \xa0 Bahasa Indonesia" },
84 | { value: "cs", label: "🇨🇿 \xa0 Čeština" },
85 | { value: "de", label: "🇩🇪 \xa0 Deutsch" },
86 | { value: "es", label: "🇪🇸 \xa0 Español" },
87 | { value: "fr", label: "🇫🇷 \xa0 Français" },
88 | { value: "it", label: "🇮🇹 \xa0 Italiano" },
89 | { value: "ph", label: "🇵🇭 \xa0 Filipino" },
90 | { value: "pl", label: "🇵🇱 \xa0 Polski" },
91 | { value: "pt", label: "🇵🇹 \xa0 Português" },
92 | { value: "fi", label: "🇫🇮 \xa0 Suomi" },
93 | { value: "tr", label: "🇹🇷 \xa0 Türkçe" },
94 | { value: "bn", label: "🇧🇩 \xa0 বাংলা" },
95 | { value: "hi", label: "🇮🇳 \xa0 हिंदी" },
96 | { value: "uk", label: "🇺🇦 \xa0 Українська" },
97 | { value: "zh", label: "🇨🇳 \xa0 中文 (繁體)" },
98 | { value: "ar", label: "🇸🇦 \xa0 العربية" },
99 | { value: "ru", label: "🇷🇺 \xa0 Русский" },
100 | { value: "th", label: "🇹🇭 \xa0 ภาษาไทย" },
101 | { value: "fa", label: "🇮🇷 \xa0 فارسی" },
102 | { value: "np", label: "🇳🇵 \xa0 नेपाली" },
103 | ];
104 |
--------------------------------------------------------------------------------
/src/i18n/de.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "Japan COVID-19 Coronavirus Tracker",
3 | "languages": "Sprachen:",
4 | "last-updated": "Zuletzt aktualisiert:",
5 | "kpi-active": "Aktiv",
6 | "kpi-active-tooltip": "Bestätigte Fälle minus Genesene minus Verstorbene",
7 | "kpi-critical": "Kritisch",
8 | "kpi-deceased": "Verstorben",
9 | "kpi-tested": "Getestet",
10 | "kpi-confirmed": "Bestätigt",
11 | "kpi-recovered": "Genesen",
12 | "covid-19": "COVID-19",
13 | "outbreak-map": "Ausbreitungskarte",
14 | "cases-none": "Keine Fälle",
15 | "cases-range": "{{from}}-{{to}} Fälle",
16 | "cases-last": "{{from}}+ Fälle",
17 | "outbreak-spread-trend": "Infektionstrend",
18 | "new-cases-by-day": "Neue Fälle (pro Tag)",
19 | "top-prefectures": "Top 10 Präfekturen",
20 | "active-regions": "Aktivste Regionen",
21 | "prefecture-data": "Präfekturdaten",
22 | "prefecture": "Präfektur",
23 | "confirmed": "Bestätigt",
24 | "recovered": "Genesen",
25 | "deaths": "Verstorben",
26 | "active": "Aktiv",
27 | "helpful-links": "Hilfreiche Links",
28 | "primary-data-sources": "Primäre Datenquellen",
29 | "confirmed-case-trajectories-by-region": "Verlauf bestätigter Fälle pro Region",
30 | "trajectory-description": "Tage seit dem {{minimumConfirmed}}. Fall",
31 | "traveling-into-japan": "Einreise nach Japan",
32 | "about-travel-restriction": "Nachfolgend sind bestehende Einreisebeschränkungen nach Japan aufgelistet. Mehr Informationen sind nach einem Klick auf die jeweilige Beschränkung verfügbar.",
33 | "banned-from-entering-japan": "Dürfen nicht nach Japan einreisen:",
34 | "existing-visa-required": "Bestehendes Visum erforderlich:",
35 | "14-day-self-quarantine-required": "14-tägige Selbstquarantäne erforderlich:",
36 | "other-limitations": "Andere Einschränkungen:",
37 | "provisional": "Provisorisch",
38 | "total": "Gesamt",
39 | "increment-today": "(Heute)",
40 | "increment-yesterday": "(Gestern)",
41 | "daily": "Täglich",
42 | "7-day-average": "Sieben-Tages-Durchschnitt",
43 | "daily-trend": "Täglicher Trend",
44 | "see-all-prefectures": "Alle Präfekturen anzeigen",
45 | "cruise-passengers-explanation": "Besatzung und Passagiere von Kreuzfahrtschiffen werden nicht in die Gesamtstatistik einbezogen.",
46 | "confirmed-chart-caption": "Tägliche neue Infektionsfälle",
47 | "active-chart-caption": "Summe aktiver Infektionsfälle",
48 | "recovered-chart-caption": "Tägliche neue Genesungen",
49 | "deceased-chart-caption": "Tägliche neue Todesfälle",
50 | "tested-chart-caption": "Tägliche Tests",
51 | "active-critical-percentage": "{{percent}}% sind in kritischem Zustand.",
52 | "recovered-percentage": "{{percent}}% aller Fälle",
53 | "deceased-percentage": "{{percent}}% aller Fälle",
54 | "tested-percentage": "{{percent}}% aller Tests sind positiv.",
55 | "active-cases": "Aktive Fälle",
56 | "no-active-cases": "Keine aktiven Fälle 🎉",
57 | "time-period": "Zeitraum",
58 | "all-time": "Gesamt",
59 | "three-months": "3 Monate",
60 | "active-cases-description": "Gesamtzahl der aktuell noch positiv getesteten COVID-19-Patienten (Gesamtzahl aller Fälle minus Gesamtzahl Genesener).",
61 | "restrictions-link": "Informationen zu aktuellen Reisebeschränkungen für ausländische Staatsbürger:",
62 | "non-resident-restrictions": "Ausländische Touristen dürfen nicht einreisen. Geschäftsreisende aus bestimmten Ländern sind möglicherweise von der Beschränkung ausgenommen.",
63 | "pseudo-prefectures": {
64 | "port-of-entry": "Einreisehafen",
65 | "unspecified": "Unbestimmt",
66 | "diamond-princess": "Kreuzfahrtschiff \"Diamond Princess\"",
67 | "nagasaki-cruise": "Kreuzfahrtschiff \"Nagasaki\""
68 | },
69 | "prefectures": {
70 | "Tokyo": "Tokio"
71 | },
72 | "regions": {
73 | "Other": "Andere"
74 | },
75 | "countries": {
76 | "westerdam": "Westerdam (Kreuzfahrtschiff)"
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # COVID19Japan.com
2 |
3 | A community powered COVID-19 coronavirus tracker for Japan.
4 |
5 | The project is a single page JavaScript application running in the browser, pulling data in via a JSON file, and hosted on GitHub Pages.
6 |
7 | ## Data Sources
8 |
9 | For all information regarding the data powering this site, please visit the [covid19japan-data repo](https://github.com/reustle/covid19japan-data/).
10 |
11 | Our data is sourced from a variety of sources, primarily Japanese news outlets like NHK, prefectural governments, and the Ministry of Health, Labour and Welfare.
12 |
13 | ## Embed
14 |
15 | To embed an [abridged version](https://covid19japan.com/embed) of the app, add the following to your HTML:
16 |
17 | ```HTML
18 |
19 |
20 | ```
21 |
22 | ## Contributing Code
23 |
24 | If you would like to contribute features, refactor code, etc., please create or comment on an issue on this repo, and one of the core contributors listed below.
25 |
26 | ## Running Dev Locally
27 |
28 | ### Build Instructions
29 |
30 | Requirements: NodeJS
31 |
32 | Set up the environment:
33 |
34 | ```
35 | npm install
36 | ```
37 |
38 | Build the code continuously & serve it:
39 |
40 | ```
41 | npm run start-webpack
42 | ```
43 |
44 | You will now be able to access the site at http://localhost:4000/
45 |
46 | ### More Commands
47 |
48 | Build once:
49 |
50 | ```
51 | npm run build
52 | ```
53 |
54 | Build continuously:
55 |
56 | ```
57 | npm run watch
58 | ```
59 |
60 | Start Server:
61 |
62 | ```
63 | npm run start
64 | ```
65 |
66 | ### Testing
67 |
68 | When testing your changes locally, be sure to verify both the `/` and `/embed` pages are working properly.
69 |
70 | ### Localization
71 |
72 | #### Localizing content
73 |
74 | All strings in the `src/` files should be localized like this:
75 |
76 | 1. Add a key-value pair in `src/i18n/en.json` for your string/text
77 | 2. For HTML: add the `data-i18n="your-new-key"` attribute to the HTML element to be localized (replace "your-new-key" in the example)
78 | 3. For JavaScript: call the `i18next.t("your-new-key")` function to retrieve the localized string (replace "your-new-key" in the example)
79 | 4. Add any additional translations with the same key to other files in `src/i18n/`
80 |
81 | #### Adding new languages
82 |
83 | To add a new language
84 |
85 | 1. Make a copy of an existing localization file (recommended: `src/i18n/en.json`), name it to match the new language (e.g. `ja.json`).
86 | 2. Replace the translations in the file you just created.
87 | 3. Add the new language to the array of `LANGUAGES` and `LANGUAGE_NAMES` of `src/i18n/index.js`.
88 | 4. Add the appropriate `date-fns` locale to the imports of `src/i18n/index.js`, and append that locale to the LOCALES export.
89 |
90 | ## License & Code Re-use
91 |
92 | The code for this project is released under the [MIT License](LICENSE). You are free to re-use it but we ask that you please include a link back to the [COVID-19 Japan website](https://covid19japan.com/) or [this GitHub repository](https://github.com/reustle/covid19japan). We'd also be happy to include your site in the list of forked projects below – just create an issue to request it.
93 |
94 | ### Forked Projects
95 |
96 | - [Sri Lanka COVID-19 Coronavirus Tracker](https://covidsl.com)
97 | - [Kerala COVID-19 Coronavirus Tracker](https://covid19kerala.info)
98 |
99 | ## Core Contributors
100 |
101 | - [Shane Reustle](https://reustle.org)
102 | - [Alastair Tse](https://github.com/liquidx)
103 | - [Leonard Chin](https://github.com/l15n)
104 | - [Jiahui Zhou](https://jiahuizhou.design/) _(concept and design)_
105 | - and [these wonderful developers](https://github.com/reustle/covid19japan/graphs/contributors)
106 |
--------------------------------------------------------------------------------
/src/i18n/zh.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "日本COVID-19冠狀病毒追踪器",
3 | "languages": "語言:",
4 | "last-updated": "最近更新時間:",
5 | "kpi-active": "活性",
6 | "kpi-active-tooltip": "確診病例減去康復病例",
7 | "kpi-critical": "危急",
8 | "kpi-deceased": "死亡人數",
9 | "kpi-tested": "經過測試",
10 | "kpi-confirmed": "已確認",
11 | "kpi-recovered": "已恢復",
12 | "covid-19": "新冠肺炎",
13 | "outbreak-map": "爆發圖",
14 | "cases": "案件",
15 | "outbreak-spread-trend": "案件總數",
16 | "new-cases-by-day": "每日確診病例",
17 | "top-prefectures": "十大地區",
18 | "prefecture-data": "地域案例",
19 | "prefecture": "州",
20 | "confirmed": "已確認",
21 | "recovered": "已恢復",
22 | "deaths": "死亡人數",
23 | "active": "活性",
24 | "helpful-links": "有用的網址",
25 | "primary-data-sources": "主要數據源",
26 | "confirmed-case-trajectories-by-region": "Confirmed Case Trajectories by Region",
27 | "trajectory-description": "自第{{minimumConfirmed}}起案件以來的天數",
28 | "traveling-into-japan": "前往日本",
29 | "about-travel-restriction": "以下是對赴日旅行的限制。 單擊鏈接以獲取有關限制的更多詳細信息。",
30 | "banned-from-entering-japan": "禁止進入日本:",
31 | "existing-visa-required": "現有簽證:",
32 | "14-day-self-quarantine-required": "需要14天的自我隔離:",
33 | "other-limitations": "其他限制:",
34 | "provisional": "臨時",
35 | "total": "總",
36 | "increment-today": "(今天)",
37 | "increment-yesterday": "(昨天)",
38 | "daily": "日常",
39 | "7-day-average": "7天平均值",
40 | "daily-trend": "每日趨勢",
41 | "see-all-prefectures": "查看所有縣",
42 | "cruise-passengers-explanation": "郵輪乘員和乘客不包括在總數內。",
43 | "confirmed-chart-caption": "每日新病例",
44 | "active-chart-caption": "活躍案件總數",
45 | "recovered-chart-caption": "每日新回收量",
46 | "deceased-chart-caption": "每日新死亡",
47 | "tested-chart-caption": "每日測試",
48 | "active-critical-percentage": "{{percent}}%處於嚴重 b>狀態。",
49 | "recovered-percentage": "佔案件總數的{{percent}}%",
50 | "deceased-percentage": "佔案件總數的{{percent}}%",
51 | "tested-percentage": "{{percent}}%的結果為肯定。",
52 | "time-period": "Time period",
53 | "all-time": "All time",
54 | "three-months": "3 months",
55 | "active-cases-description": "Total patients that are still currently testing positive for COVID-19. (Total confirmed cases minus total recovered cases).",
56 | "restrictions-link": "Find out about the most current travel restrictions for Foreign Nationals from the following:",
57 | "non-resident-restrictions": "All foreign tourists are barred from entering the country. Some business travel is allowed from select countries.",
58 | "pseudo-prefectures": {
59 | "port-of-entry": "進口港",
60 | "unspecified": "未指定",
61 | "diamond-princess": "鑽石公主遊輪",
62 | "nagasaki-cruise": "長崎郵輪"
63 | },
64 | "prefectures": {
65 | "Aichi": "愛知",
66 | "Akita": "秋田",
67 | "Aomori": "青森",
68 | "Chiba": "千葉",
69 | "Ehime": "愛媛",
70 | "Fukui": "福井",
71 | "Fukuoka": "福岡",
72 | "Fukushima": "福島",
73 | "Gifu": "岐阜",
74 | "Gunma": "群馬",
75 | "Hiroshima": "廣島",
76 | "Hokkaido": "北海道",
77 | "Hyogo": "兵庫",
78 | "Ibaraki": "茨城",
79 | "Ishikawa": "石川",
80 | "Iwate": "岩手",
81 | "Kagawa": "香川",
82 | "Kagoshima": "鹿兒島",
83 | "Kanagawa": "神奈川",
84 | "Kochi": "高知",
85 | "Kumamoto": "熊本",
86 | "Kyoto": "京都",
87 | "Mie": "三重",
88 | "Miyagi": "宮城",
89 | "Miyazaki": "宮崎",
90 | "Nagano": "長野",
91 | "Nagasaki": "長崎",
92 | "Nara": "奈良",
93 | "Niigata": "新潟",
94 | "Oita": "大分",
95 | "Okayama": "岡山",
96 | "Okinawa": "沖繩",
97 | "Osaka": "大阪",
98 | "Saga": "佐賀",
99 | "Saitama": "埼玉",
100 | "Shiga": "滋賀",
101 | "Shimane": "島根",
102 | "Shizuoka": "靜岡",
103 | "Tochigi": "栃木",
104 | "Tokushima": "德島",
105 | "Tokyo": "東京",
106 | "Tottori": "鳥取",
107 | "Toyama": "富山",
108 | "Wakayama": "和歌山",
109 | "Yamagata": "山形",
110 | "Yamaguchi": "山口",
111 | "Yamanashi": "山梨"
112 | },
113 | "countries": {
114 | "westerdam": "韋斯特丹(遊輪)"
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/src/components/KpiReact/index.js:
--------------------------------------------------------------------------------
1 | import React, { useMemo, useCallback, memo } from "react";
2 | import { object, string } from "prop-types";
3 | import { useTranslation } from "react-i18next";
4 |
5 | import { maybeIntlNumberFormat } from "../../i18n";
6 |
7 | import Kpi from "./Kpi";
8 |
9 | const KpiContainer = ({ data, type }) => {
10 | const { t, i18n } = useTranslation();
11 | const { language } = i18n;
12 |
13 | const { totals, totalsDiff } = data;
14 |
15 | const formatNumber = maybeIntlNumberFormat(language);
16 |
17 | const getPercentage = useCallback(
18 | (type, chart) => {
19 | switch (type) {
20 | case "confirmed":
21 | break;
22 | case "recovered":
23 | if (totals.confirmed > 0) {
24 | let recoveredPercent = parseInt(
25 | (totals.recovered / totals.confirmed) * 100
26 | );
27 | chart.percentage = t("recovered-percentage", {
28 | percent: formatNumber(recoveredPercent),
29 | });
30 | }
31 | break;
32 | case "active":
33 | if (totals.active > 0) {
34 | let criticalPercentage = parseInt(
35 | (totals.critical / totals.active) * 100
36 | );
37 | if (criticalPercentage < 1) {
38 | criticalPercentage =
39 | parseInt((totals.critical / totals.active) * 1000) / 10;
40 | }
41 | chart.percentage = t("active-critical-percentage", {
42 | percent: formatNumber(criticalPercentage),
43 | });
44 | }
45 | break;
46 | case "deceased":
47 | if (totals.confirmed > 0) {
48 | let deceasedPercent = parseInt(
49 | (totals.deceased / totals.confirmed) * 100
50 | );
51 | if (deceasedPercent < 1) {
52 | deceasedPercent =
53 | parseInt((totals.deceased / totals.confirmed) * 1000) / 10;
54 | }
55 | chart.percentage = t("deceased-percentage", {
56 | percent: formatNumber(deceasedPercent),
57 | });
58 | }
59 | break;
60 | case "tested":
61 | if (totals.tested > 0) {
62 | let testedPercentage = parseInt(
63 | (totals.confirmed / totals.tested) * 100
64 | );
65 | if (testedPercentage < 1) {
66 | testedPercentage =
67 | parseInt((totals.confirmed / totals.tested) * 1000) / 10;
68 | }
69 | chart.percentage = t("tested-percentage", {
70 | percent: formatNumber(testedPercentage),
71 | });
72 | }
73 | break;
74 | default:
75 | return;
76 | }
77 | },
78 | [formatNumber, t, totals]
79 | );
80 |
81 | const chart = useMemo(() => {
82 | const chartData = {
83 | id: type,
84 | label: t(`kpi-${type}`),
85 | value: formatNumber(totals[type]),
86 | diff:
87 | totalsDiff[type] >= 0
88 | ? `+${formatNumber(totalsDiff[type])}`
89 | : formatNumber(totalsDiff[type]),
90 | chartName:
91 | type === "active"
92 | ? "active_cumulative_avg.svg"
93 | : `${type}_daily_avg.svg`,
94 | caption: t(`${type}-chart-caption`),
95 | };
96 |
97 | getPercentage(type, chartData);
98 | return chartData;
99 | }, [formatNumber, getPercentage, t, totals, totalsDiff, type]);
100 |
101 | return (
102 |
113 | );
114 | };
115 |
116 | KpiContainer.propTypes = {
117 | data: object,
118 | type: string,
119 | };
120 |
121 | KpiContainer.defaultProps = {
122 | data: {},
123 | type: "",
124 | };
125 |
126 | export default memo(KpiContainer);
127 |
--------------------------------------------------------------------------------
/src/components/DailyIncreaseChart/DailyIncrease.js:
--------------------------------------------------------------------------------
1 | import * as c3 from "c3";
2 | import i18next from "i18next";
3 | import format from "date-fns/format";
4 |
5 | import { LOCALES, maybeIntlNumberFormat } from "../../i18n";
6 | import { niceScale } from "../../data/scaling";
7 |
8 | const drawDailyIncreaseChart = (
9 | trends,
10 | chart,
11 | lang,
12 | dailyValueKey,
13 | dailyAverageKey,
14 | dailyValueColor,
15 | dailyAverageColor,
16 | elementSelector,
17 | timePeriod
18 | ) => {
19 | const dateLocale = LOCALES[lang];
20 | const formatNumber = maybeIntlNumberFormat(lang);
21 |
22 | const cols = {
23 | Date: ["Date"],
24 | };
25 | if (dailyValueKey) {
26 | cols.Daily = ["Daily"];
27 | }
28 | if (dailyAverageKey) {
29 | cols.DailyAvg = ["DailyAvg"];
30 | }
31 |
32 | const startIndex = timePeriod > 0 ? trends.length - timePeriod : 0;
33 | for (let i = startIndex; i < trends.length; i++) {
34 | // added next line for throttling, because chart lagging for all period of time
35 | if (startIndex === 0 && i % 2 === 0) continue;
36 |
37 | const row = trends[i];
38 |
39 | cols.Date.push(row.date);
40 | if (dailyValueKey && dailyValueKey.length > 0) {
41 | let val = Math.max(0, row[dailyValueKey]);
42 | cols.Daily.push(val);
43 | }
44 | if (i < trends.length - 1) {
45 | // Omit the last data point since it's provisional
46 | // and will always point downwards for the average.
47 | if (dailyAverageKey && dailyAverageKey.length > 0) {
48 | let val = Math.max(0, row[dailyAverageKey]);
49 | cols.DailyAvg.push(val);
50 | }
51 | }
52 | }
53 |
54 | let allCols = [cols.Date];
55 | let allValues = [];
56 | if (dailyValueKey) {
57 | allCols.push(cols.Daily);
58 | allValues = allValues.concat(cols.Daily.slice(1));
59 | }
60 | if (dailyAverageKey) {
61 | allCols.push(cols.DailyAvg);
62 | allValues = allValues.concat(cols.DailyAvg.slice(1));
63 | }
64 |
65 | const scale = niceScale(allValues, 5);
66 |
67 | if (chart) {
68 | chart.destroy();
69 | }
70 |
71 | chart = c3.generate({
72 | bindto: elementSelector,
73 | data: {
74 | x: "Date",
75 | colors: {
76 | Daily: (color, d) => {
77 | return dailyValueColor;
78 | },
79 | DailyAvg: (color, d) => {
80 | return dailyAverageColor;
81 | },
82 | },
83 | columns: allCols,
84 | names: {
85 | Daily: i18next.t("daily"),
86 | DailyAvg: i18next.t("7-day-average"),
87 | },
88 | type: "bar",
89 | types: {
90 | Daily: "bar",
91 | DailyAvg: "spline",
92 | },
93 | regions: {
94 | Daily: [{ start: cols.Date[cols.Date.length - 2], style: "dashed" }],
95 | },
96 | },
97 | point: {
98 | r: 0,
99 | },
100 | bar: {
101 | width: {
102 | ratio: 0.8,
103 | },
104 | },
105 | axis: {
106 | x: {
107 | type: "timeseries",
108 | tick: {
109 | culling: { max: 6 },
110 | format: (x) => {
111 | if (isNaN(x)) {
112 | return "";
113 | }
114 | const xDate = Date.parse(x);
115 | return format(xDate, "MMM d yyyy", {
116 | locale: dateLocale,
117 | addSuffix: true,
118 | });
119 | },
120 | },
121 | },
122 | y: {
123 | padding: 0,
124 | max: scale.max,
125 | tick: {
126 | values: scale.ticks,
127 | format: formatNumber,
128 | },
129 | },
130 | },
131 | tooltip: {
132 | format: {
133 | value: (value, ratio, id, index) => {
134 | return `${formatNumber(value)} ${
135 | index === cols.Date.length - 2 ? i18next.t("provisional") : ""
136 | }`;
137 | },
138 | },
139 | },
140 | grid: {
141 | x: {
142 | show: true,
143 | },
144 | y: {
145 | show: true,
146 | },
147 | },
148 | padding: {
149 | left: 55,
150 | right: 10,
151 | top: 0,
152 | bottom: 0,
153 | },
154 | });
155 | return chart;
156 | };
157 |
158 | export default drawDailyIncreaseChart;
159 |
--------------------------------------------------------------------------------
/src/i18n/ja.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "日本国内の新型コロナウイルス (COVID-19) 感染状況追跡",
3 | "languages": "言語:",
4 | "last-updated": "最終更新:",
5 | "kpi-active": "現在感染者数",
6 | "kpi-active-tooltip": "累計感染者数から回復者数と死亡者数を引いた数",
7 | "kpi-critical": "重症者数",
8 | "kpi-deceased": "死亡者数",
9 | "kpi-tested": "検査実施人数",
10 | "kpi-confirmed": "累計感染者数",
11 | "kpi-recovered": "回復者数",
12 | "covid-19": "ウイルス",
13 | "outbreak-map": "感染マップ",
14 | "cases-none": "0件",
15 | "cases-range": "{{from}}〜{{to}}件",
16 | "cases-last": "{{from}}〜件",
17 | "outbreak-spread-trend": "累計",
18 | "new-cases-by-day": "日別新規感染者数",
19 | "top-prefectures": "感染者の多い上位10都道府県",
20 | "active-regions": "感染が拡大している地方",
21 | "prefecture-data": "都道府県ごとのデータ",
22 | "prefecture": "都道府県",
23 | "confirmed": "累計感染者数",
24 | "recovered": "回復者数",
25 | "deaths": "死亡者数",
26 | "active": "現在感染者数",
27 | "helpful-links": "有益な情報源",
28 | "primary-data-sources": "一次情報源",
29 | "confirmed-case-trajectories-by-region": "Confirmed Case Trajectories by Region",
30 | "trajectory-description": "Number of days since {{minimumConfirmed}}th case",
31 | "traveling-into-japan": "入国制限について",
32 | "about-travel-restriction": "下記に各国の入国制限に関する一覧がございます。詳細をご覧いただくには、国名をクリックしてください。",
33 | "banned-from-entering-japan": "入国拒否",
34 | "existing-visa-required": "ビザの必須",
35 | "14-day-self-quarantine-required": "14日間の隔離",
36 | "other-limitations": "その他",
37 | "provisional": "暫定",
38 | "total": "計",
39 | "increment-today": "(今日)",
40 | "increment-yesterday": "(昨日)",
41 | "daily": "日ごと",
42 | "7-day-average": "7日間の平均",
43 | "daily-trend": "",
44 | "see-all-prefectures": "See all prefectures",
45 | "cruise-passengers-explanation": "クルーズ船の乗員と乗客は合計に含まれません。",
46 | "confirmed-chart-caption": "日別感染者数",
47 | "active-chart-caption": "累計現在感染者数",
48 | "recovered-chart-caption": "日別回復者数",
49 | "deceased-chart-caption": "日別死亡者数",
50 | "tested-chart-caption": "日別検査実施人数",
51 | "active-critical-percentage": "{{percent}}%は重症患者",
52 | "recovered-percentage": "累計感染者数の{{percent}}%",
53 | "deceased-percentage": "累計感染者数の{{percent}}%",
54 | "tested-percentage": "検査結果の{{percent}}%が陽性",
55 | "active-cases": "現在感染者数",
56 | "no-active-cases": "現在感染者なし 🎉",
57 | "time-period": "Time period",
58 | "all-time": "All time",
59 | "three-months": "3 months",
60 | "active-cases-description": "現在COVID-19の検査で陽性になっている患者数の合計。(累計感染者数から回復者数を引いたもの)。",
61 | "restrictions-link": "最新の外国への旅行制限については、以下のページを確認してください。",
62 | "non-resident-restrictions": "外国からのすべての旅行者は入国を禁止されています。特定の国からの一部のビジネス旅行は許可されています。",
63 | "pseudo-prefectures": {
64 | "port-of-entry": "入国港",
65 | "unspecified": "不明",
66 | "diamond-princess": "ダイヤモンド・プリンセス",
67 | "nagasaki-cruise": "長崎のクルーズ船"
68 | },
69 | "prefectures": {
70 | "Aichi": "愛知県",
71 | "Akita": "秋田県",
72 | "Aomori": "青森県",
73 | "Chiba": "千葉県",
74 | "Ehime": "愛媛県",
75 | "Fukui": "福井県",
76 | "Fukuoka": "福岡県",
77 | "Fukushima": "福島県",
78 | "Gifu": "岐阜県",
79 | "Gunma": "群馬県",
80 | "Hiroshima": "広島県",
81 | "Hokkaido": "北海道",
82 | "Hyogo": "兵庫県",
83 | "Ibaraki": "茨城県",
84 | "Ishikawa": "石川県",
85 | "Iwate": "岩手県",
86 | "Kagawa": "香川県",
87 | "Kagoshima": "鹿児島県",
88 | "Kanagawa": "神奈川県",
89 | "Kochi": "高知県",
90 | "Kumamoto": "熊本県",
91 | "Kyoto": "京都府",
92 | "Mie": "三重県",
93 | "Miyagi": "宮城県",
94 | "Miyazaki": "宮崎県",
95 | "Nagano": "長野県",
96 | "Nagasaki": "長崎県",
97 | "Nara": "奈良県",
98 | "Niigata": "新潟県",
99 | "Oita": "大分県",
100 | "Okayama": "岡山県",
101 | "Okinawa": "沖縄県",
102 | "Osaka": "大阪府",
103 | "Saga": "佐賀県",
104 | "Saitama": "埼玉県",
105 | "Shiga": "滋賀県",
106 | "Shimane": "島根県",
107 | "Shizuoka": "静岡県",
108 | "Tochigi": "栃木県",
109 | "Tokushima": "徳島県",
110 | "Tokyo": "東京都",
111 | "Tottori": "鳥取県",
112 | "Toyama": "富山県",
113 | "Wakayama": "和歌山県",
114 | "Yamagata": "山形県",
115 | "Yamaguchi": "山口県",
116 | "Yamanashi": "山梨県"
117 | },
118 | "regions": {
119 | "Kanto": "関東",
120 | "Kansai": "関西",
121 | "Kyushu": "九州",
122 | "Chubu": "中部",
123 | "Chugoku": "中国",
124 | "Hokkaido": "北海道",
125 | "Tohoku": "東北",
126 | "Shikoku": "四国",
127 | "Other": "都道府県以外"
128 | },
129 | "countries": {
130 | "westerdam": "ウェスターダム(船)"
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/src/i18n/hi.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "जापान कोविड-१९ कोरोना विषाणु अभिलेख",
3 | "languages": "भाषा:",
4 | "last-updated": "अंतिम नवीकरण:",
5 | "kpi-active": "सक्रिय",
6 | "kpi-active-tooltip": "पुष्ट विषय घटा आरोग्य विषय घटा मृत",
7 | "kpi-critical": "विकट",
8 | "kpi-deceased": "मृत",
9 | "kpi-tested": "परीक्षण",
10 | "kpi-confirmed": "पुष्ट",
11 | "kpi-recovered": "आरोग्य",
12 | "covid-19": "कोविड-१९",
13 | "outbreak-map": "प्रकोप मानचित्र",
14 | "cases-none": "0 विषय",
15 | "cases-range": "{{from}}-{{to}} विषय",
16 | "cases-last": "{{from}}+ विषय",
17 | "outbreak-spread-trend": "विषाणु प्रकोप विस्तार प्रवृति",
18 | "new-cases-by-day": "दैनिक नव विषय",
19 | "top-prefectures": "शीर्ष १० प्रांत",
20 | "prefecture-data": "प्रांत अनुसार आँकड़े",
21 | "prefecture": "प्रांत",
22 | "confirmed": "पुष्ट",
23 | "recovered": "आरोग्य",
24 | "deaths": "मृत",
25 | "active": "सक्रिय",
26 | "helpful-links": "सहायक सूचना",
27 | "primary-data-sources": "प्राथमिक सूचना स्रोत",
28 | "confirmed-case-trajectories-by-region": "Confirmed Case Trajectories by Region",
29 | "trajectory-description": "{{minimumConfirmed}}वे विषय से अब तक व्यतीत दिन",
30 | "traveling-into-japan": "जापान में यात्रा",
31 | "about-travel-restriction": "विभिन्न देशों द्वारा जारी प्रवेशवर्जित सूची निम्न है। विस्तार से जानने के लिए देश के नाम पर दबाएँ 。",
32 | "banned-from-entering-japan": "जापान में प्रवेशवर्जित",
33 | "existing-visa-required": "वीज़ा आवश्यक",
34 | "14-day-self-quarantine-required": "१४ दिन का एकांत",
35 | "other-limitations": "अन्य नियम",
36 | "provisional": "सामयिक",
37 | "total": "कुल",
38 | "increment-today": "(आज)",
39 | "increment-yesterday": "(कल)",
40 | "daily": "प्रतिदिन",
41 | "7-day-average": "साप्ताहिक औसत",
42 | "daily-trend": "प्रतिदिन की प्रवृति",
43 | "see-all-prefectures": "सभी प्रांत देखें",
44 | "cruise-passengers-explanation": "जलयान और यात्रीगण कुल योग में सम्मिलित नहीं है।",
45 | "confirmed-chart-caption": "प्रतिदिन पुष्ट संख्या",
46 | "active-chart-caption": "सक्रिय संख्या",
47 | "recovered-chart-caption": "आरोग्य संख्या",
48 | "deceased-chart-caption": "मृत संख्या",
49 | "tested-chart-caption": "परीक्षित संख्या",
50 | "active-critical-percentage": "{{percent}}%प्रतिशतविकटरोगी",
51 | "recovered-percentage": "कुल विषयों का {{percent}}%",
52 | "deceased-percentage": "कुल विषयों का {{percent}}%",
53 | "tested-percentage": "परीक्षित परिणाम का {{percent}}% सकारात्मक",
54 | "active-cases": "Active cases",
55 | "no-active-cases": "No active cases 🎉",
56 | "time-period": "Time period",
57 | "all-time": "All time",
58 | "three-months": "3 months",
59 | "active-cases-description": "Total patients that are still currently testing positive for COVID-19. (Total confirmed cases minus total recovered cases).",
60 | "restrictions-link": "Find out about the most current travel restrictions for Foreign Nationals from the following:",
61 | "non-resident-restrictions": "All foreign tourists are barred from entering the country. Some business travel is allowed from select countries.",
62 | "pseudo-prefectures": {
63 | "port-of-entry": "प्रवेश पत्तन",
64 | "unspecified": "अनिर्दिष्ट",
65 | "diamond-princess": "डाईमंड・प्रिंसेस",
66 | "nagasaki-cruise": "नागासाकी जलयान"
67 | },
68 | "prefectures": {
69 | "Aichi": "आइची",
70 | "Akita": "आकिता",
71 | "Aomori": "आओमोरि",
72 | "Chiba": "चीबा",
73 | "Ehime": "एहिमे",
74 | "Fukui": "फुकुई",
75 | "Fukuoka": "फुकुओका",
76 | "Fukushima": "फुकुशिमा",
77 | "Gifu": "गिफु",
78 | "Gunma": "गुनमा",
79 | "Hiroshima": "हिरोशिमा",
80 | "Hokkaido": "होक्काइदो",
81 | "Hyogo": "ह्योगो",
82 | "Ibaraki": "ईबाराकी",
83 | "Ishikawa": "इशिकावा",
84 | "Iwate": "इवाते",
85 | "Kagawa": "कागावा",
86 | "Kagoshima": "कागोशिमा",
87 | "Kanagawa": "कानागावा",
88 | "Kochi": "कोचि",
89 | "Kumamoto": "कुमामोटो",
90 | "Kyoto": "क्योतो",
91 | "Mie": "मेइ",
92 | "Miyagi": "मियागि",
93 | "Miyazaki": "मियाजाकी",
94 | "Nagano": "नागानो",
95 | "Nagasaki": "नागासाकी",
96 | "Nara": "नारा",
97 | "Niigata": "निगाता",
98 | "Oita": "ओईता",
99 | "Okayama": "ओकायामा",
100 | "Okinawa": "ओकिनावा",
101 | "Osaka": "ओसाका",
102 | "Saga": "सागा",
103 | "Saitama": "साईतामा",
104 | "Shiga": "शिगा",
105 | "Shimane": "शिमाने",
106 | "Shizuoka": "शिजुओका",
107 | "Tochigi": "टोचिगी",
108 | "Tokushima": "तोकुशिमा",
109 | "Tokyo": "टोक्यो",
110 | "Tottori": "तोत्तोरि",
111 | "Toyama": "तोयामा",
112 | "Wakayama": "वाकायामा",
113 | "Yamagata": "यामागाता",
114 | "Yamaguchi": "यामागुची",
115 | "Yamanashi": "यामानाशी"
116 | },
117 | "countries": {
118 | "westerdam": "वेस्टरडैम"
119 | }
120 | }
121 |
--------------------------------------------------------------------------------
/src/components/PrefectureTable/_prefectureTable.scss:
--------------------------------------------------------------------------------
1 | @import "src/type";
2 |
3 | .table-wrapper {
4 | overflow-x: auto;
5 | width: 100%;
6 | border-radius: 10px;
7 | background: $color-box-background;
8 | box-shadow: $color-box-shadow;
9 | }
10 |
11 | table#prefectures-table, table#top-prefectures-table {
12 | width: 100%;
13 | border-collapse: separate;
14 | border-spacing: 0px;
15 | border-radius: 10px;
16 | background: $color-box-background;
17 | box-shadow: $color-box-shadow;
18 |
19 | th, td {
20 | font-size: 0.85rem;
21 | line-height: 1.2rem;
22 | padding: 0.5rem 1rem;
23 | text-align: left;
24 | vertical-align: middle;
25 | height: 3rem;
26 | }
27 |
28 | th, tbody.total-rows td {
29 | font-weight: $font-weight-bold;
30 | }
31 |
32 | th {
33 | word-wrap: break-word;
34 | }
35 |
36 | tbody.prefecture-rows,
37 | tbody.pseudo-prefecture-rows,
38 | tbody.cruise-rows {
39 | tr:nth-child(odd) {
40 | background-color: rgb(244,247,248);
41 | }
42 | }
43 |
44 | tbody.cruise-header {
45 | color: rgba(200, 200, 200, 1);
46 | }
47 |
48 | .today {
49 | color: $color-increment-today;
50 | }
51 |
52 | .yesterday {
53 | color: $color-increment-yesterday;
54 | }
55 |
56 | .prefecture {
57 | text-align: right;
58 | }
59 | }
60 |
61 | // Column layouts
62 | table#prefectures-table {
63 | .prefecture {
64 | width: 20%;
65 | }
66 |
67 | .trend {
68 | width: 20%;
69 |
70 | // Not setting the width helps it properly horizontally
71 | // layout within the cell. Otherwise it tries to center the image.
72 | .trend-svg {
73 | height: 40px;
74 | }
75 | }
76 |
77 | .delta, .confirmed, .deceased, .recovered {
78 | width: 15%;
79 | }
80 | }
81 |
82 | table#top-prefectures-table {
83 | .prefecture { width: 30% }
84 | .trend { width: 30%; }
85 | .delta, .confirmed { width: 20%; }
86 | .recovered, .deceased {
87 | display: none;
88 | width: 0;
89 | }
90 |
91 | // Not setting the width helps it properly horizontally
92 | // layout within the cell. Otherwise it tries to center the image.
93 | .trend-svg { height: 30px; }
94 |
95 | tbody.prefecture-rows {
96 | // Only display the first 10 rows by default
97 | tr:nth-child(n+11) {
98 | display: none;
99 | }
100 | }
101 |
102 | tbody.more-rows {
103 | td a#show-more-rows {
104 | text-align: right;
105 | }
106 | }
107 | }
108 |
109 | // Hide top prefecture table when it gets below this breakpoint.
110 | @media (max-width: $breakpoint-960) {
111 | #prefecture-top-table-container {
112 | display: none;
113 | }
114 | }
115 |
116 | @media (max-width: $breakpoint-960) {
117 | #all-prefectures-table-container {
118 | #prefectures-table {
119 | th {
120 | font-size: 0.8rem;
121 | }
122 | th.delta {
123 | font-size: 0.7rem;
124 | }
125 | th, td {
126 | line-height: 1.1rem;
127 | padding: 0.5rem 0.5rem;
128 | }
129 | .trend .trend-svg {
130 | height: 30px;
131 | }
132 |
133 | }
134 | }
135 | }
136 |
137 | @media (max-width: $breakpoint-600) {
138 | #all-prefectures-table-container {
139 | #prefectures-table {
140 | th, th.delta {
141 | font-size: 0.7rem;
142 | }
143 | td {
144 | font-size: 0.9rem;
145 | }
146 | .trend {
147 | // min-width: 80px;
148 | // max-width: 80px;
149 | .trend-svg {
150 | height: 25px;
151 | }
152 | }
153 | .deceased {
154 | display: none;
155 | }
156 |
157 | }
158 | }
159 | }
160 |
161 | @media (max-width: $breakpoint-500) {
162 | #all-prefectures-table-container {
163 | #prefectures-table {
164 | th, th.delta {
165 | font-size: 0.6rem;
166 | line-height: 1.05em;
167 | }
168 | td {
169 | font-size: 0.8rem;
170 | }
171 |
172 | .trend .trend-svg {
173 | height: 25px;
174 | }
175 | .deceased {
176 | display: none;
177 | }
178 |
179 | }
180 | }
181 |
182 | }
183 |
184 |
185 | // Table loading state
186 |
187 | table#prefectures-table,
188 | table#top-prefectures-table {
189 | // Loading state (loaded)
190 | tbody.loading-rows {
191 | display: none;
192 | tr {
193 | td { padding: 20px;}
194 | }
195 | }
196 |
197 | thead,
198 | tbody.cruise-header,
199 | tbody.more-rows,
200 | tbody.total-rows {
201 | display: table-row-group;
202 | }
203 | }
204 |
205 |
206 | table#prefectures-table.loading,
207 | table#top-prefectures-table.loading {
208 | tbody.loading-rows {
209 | display: table-row-group;
210 | }
211 |
212 | thead,
213 | tbody.cruise-header,
214 | tbody.more-rows,
215 | tbody.total-rows {
216 | display: none;
217 | }
218 | }
219 |
--------------------------------------------------------------------------------
/src/i18n/bn.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "জাপান কোভিড-১৯ করোনাভাইরাস ট্র্যাকার",
3 | "languages": "ভাষা:",
4 | "last-updated": "সর্বশেষ সংষ্করণ:",
5 | "kpi-active": "সক্রিয়",
6 | "kpi-active-tooltip": "সনাক্তের সংখ্যা বিয়োগ সুস্থের সংখ্যা বিয়োগ মৃতের সংখ্যা",
7 | "kpi-critical": "আশঙ্কাজনক",
8 | "kpi-deceased": "মৃত্যু",
9 | "kpi-tested": "পরীক্ষা",
10 | "kpi-confirmed": "সনাক্ত",
11 | "kpi-recovered": "সুস্থ",
12 | "covid-19": "কোভিড-১৯",
13 | "outbreak-map": "প্রাদুর্ভাব মানচিত্র",
14 | "cases-none": "0 সনাক্ত",
15 | "cases-range": "{{from}}-{{to}} সনাক্ত",
16 | "cases-last": "{{from}}+ সনাক্ত",
17 | "outbreak-spread-trend": "মোট সনাক্ত",
18 | "new-cases-by-day": "দৈনিক সনাক্তের সংখ্যা",
19 | "top-prefectures": "শীর্ষ ১০ প্রিফেকচার",
20 | "prefecture-data": "প্রিফেকচার অনুযায়ী সংখ্যা",
21 | "prefecture": "প্রিফেকচার",
22 | "confirmed": "সনাক্ত",
23 | "recovered": "সুস্থ",
24 | "deaths": "মৃত্যু",
25 | "active": "সক্রিয়",
26 | "helpful-links": "প্রয়োজনীয় লিঙ্কসমূহ",
27 | "primary-data-sources": "প্রাথমিক তথ্য সূত্রসমূহ",
28 | "confirmed-case-trajectories-by-region": "অঞ্চল অনুযায়ী আক্রান্তের ট্র্যাজেক্টরি",
29 | "trajectory-description": "{{minimumConfirmed}}তম সনাক্তের পর থেকে দিনের সংখ্যা",
30 | "traveling-into-japan": "জাপানে ভ্রমণ",
31 | "about-travel-restriction": "জাপানে ভ্রমণবিষয়ক নিষেধাজ্ঞাগুলো নিচে দেওয়া হল। বিধিনিষেধ সম্পর্কে আরও তথ্যের জন্য লিঙ্কে ক্লিক করুন।",
32 | "banned-from-entering-japan": "জাপানে প্রবেশ নিষিদ্ধ:",
33 | "existing-visa-required": "বিদ্যমান ভিসা প্রয়োজন:",
34 | "14-day-self-quarantine-required": "১৪ দিনের নিজ-কোয়ারেন্টাইন প্রয়োজন:",
35 | "other-limitations": "অন্যান্য সীমাবদ্ধতা:",
36 | "provisional": "অস্থায়ী",
37 | "total": "মোট",
38 | "increment-today": "(আজ)",
39 | "increment-yesterday": "(গতদিন)",
40 | "daily": "দৈনিক",
41 | "7-day-average": "৭ দিনের গড়",
42 | "daily-trend": "প্রতিদিনের প্রবণতা",
43 | "see-all-prefectures": "সব প্রিফেকচার দেখুন",
44 | "cruise-passengers-explanation": "জাহাজের নাবিকদল এবং যাত্রীরা মোটের অন্তর্ভুক্ত নয়।",
45 | "confirmed-chart-caption": "দৈনিক নতুন সনাক্তের সংখ্যা",
46 | "active-chart-caption": "মোট সক্রিয়",
47 | "recovered-chart-caption": "দৈনিক নতুন সুস্থের সংখ্যা",
48 | "deceased-chart-caption": "দৈনিক নতুন মৃত্যু",
49 | "tested-chart-caption": "দৈনিক পরীক্ষা",
50 | "active-critical-percentage": "{{percent}}% আশঙ্কাজনক অবস্থায় রয়েছেন.",
51 | "recovered-percentage": "মোট সনাক্তের {{percent}}%",
52 | "deceased-percentage": "মোট সনাক্তের {{percent}}%",
53 | "tested-percentage": "পরীক্ষার {{percent}}% আক্রান্ত হয়েছেন.",
54 | "active-cases": "সক্রিয়",
55 | "no-active-cases": "কোন আক্রান্ত ব্যক্তি নেই 🎉",
56 | "time-period": "সময়কাল",
57 | "all-time": "সর্বকালীন",
58 | "three-months": "৩ মাস",
59 | "active-cases-description": "বর্তমানে মোট কোভিড-১৯ এর জন্য পূর্বে আক্রান্ত হওয়া সুস্থ রোগী। (মোট নিশ্চিত কেস বিয়োগ মোট পুনরুদ্ধার কেস)।",
60 | "restrictions-link": "নিম্নলিখিত সকল বিদেশী নাগরিকদের জন্য সর্বাধিকতম ভ্রমণ বিধিনিষেধ সম্পর্কে সন্ধান করুন:",
61 | "non-resident-restrictions": "সকল বিদেশী পর্যটকদের দেশে প্রবেশে নিষেধাজ্ঞা রয়েছে। নির্বাচিত দেশগুলি থেকে কিছু ব্যবসায়ের ভ্রমণের অনুমতি রয়েছে।",
62 | "pseudo-prefectures": {
63 | "port-of-entry": "বন্দরের প্রবেশ পথ",
64 | "unspecified": "অনির্ধারিত",
65 | "diamond-princess": "ডায়মন্ড প্রিন্সেস ক্রুজ জাহাজ",
66 | "nagasaki-cruise": "নাগাসাকি ক্রুজ জাহাজ"
67 | },
68 | "prefectures": {
69 | "Aichi": "আইচি",
70 | "Akita": "আকিতা",
71 | "Aomori": "আওমোরি",
72 | "Chiba": "চিবা",
73 | "Ehime": "এহিমে",
74 | "Fukui": "ফুকুই",
75 | "Fukuoka": "ফুকুওকা",
76 | "Fukushima": "ফুকুশিমা",
77 | "Gifu": "গিফু",
78 | "Gunma": "গুন্মা",
79 | "Hiroshima": "হিরোশিমা",
80 | "Hokkaido": "হোক্কাইদো",
81 | "Hyogo": "হায়োগো",
82 | "Ibaraki": "ইবারাকি",
83 | "Ishikawa": "ইশিকাওয়া",
84 | "Iwate": "আইওয়াতে",
85 | "Kagawa": "কাগাওয়া",
86 | "Kagoshima": "কাগোশিমা",
87 | "Kanagawa": "কানাগাওয়া",
88 | "Kochi": "কচি",
89 | "Kumamoto": "কুমামোতো",
90 | "Kyoto": "কিয়োতো",
91 | "Mie": "মিয়ে",
92 | "Miyagi": "মিয়াগি",
93 | "Miyazaki": "মিয়াযাকি",
94 | "Nagano": "নাগানো",
95 | "Nagasaki": "নাগাসাকি",
96 | "Nara": "নারা",
97 | "Niigata": "নিগাতা",
98 | "Oita": "ওইতা",
99 | "Okayama": "ওকায়ামা",
100 | "Okinawa": "ওকিনাওয়া",
101 | "Osaka": "ওসাকা",
102 | "Saga": "সাগা",
103 | "Saitama": "সায়তামা",
104 | "Shiga": "শিগা",
105 | "Shimane": "শিমানে",
106 | "Shizuoka": "শিযুওকা",
107 | "Tochigi": "টোচিগী",
108 | "Tokushima": "টোকুশিমা",
109 | "Tokyo": "টোকিও",
110 | "Tottori": "টোটোরি",
111 | "Toyama": "টোয়ামা",
112 | "Wakayama": "ওয়াকায়ামা",
113 | "Yamagata": "ইয়ামাগাতা",
114 | "Yamaguchi": "ইয়ামাগুচি",
115 | "Yamanashi": "ইয়ামানাশি"
116 | },
117 | "countries": {
118 | "westerdam": "ওয়েস্টারডাম (ক্রুজ জাহাজ)"
119 | }
120 | }
121 |
--------------------------------------------------------------------------------
/src/i18n/cs.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "Japonské Statistiky ohledně COVID-19 Koronaviru",
3 | "last-updated": "Čas poslední aktualizace:",
4 | "kpi-active": "Aktivních",
5 | "kpi-active-tooltip": "Potvrzené případy mínus uzdravené mínus umrtí",
6 | "kpi-critical": "Kritických",
7 | "kpi-deceased": "Umrtí",
8 | "kpi-tested": "Testovaných",
9 | "kpi-confirmed": "Potvrzených",
10 | "kpi-recovered": "Uzdravených",
11 | "covid-19": "COVID-19",
12 | "outbreak-map": "Mapa rozšíření",
13 | "cases-none": "0 případů",
14 | "cases-range": "{{from}}-{{to}} případů",
15 | "cases-last": "{{from}}+ případů",
16 | "outbreak-spread-trend": "Celkový Počet Případů",
17 | "new-cases-by-day": "Denní Potvrzené případy",
18 | "top-prefectures": "Top 10 Prefektůry",
19 | "prefecture-data": "Případy rozdělené podle Prefektur",
20 | "prefecture": "Prefektůra",
21 | "confirmed": "Potvrzených",
22 | "recovered": "Uzdravených",
23 | "deaths": "Umrtí",
24 | "active": "Aktivních",
25 | "helpful-links": "Informativní Odkazy",
26 | "primary-data-sources": "Hlavní Zdroj Dat",
27 | "confirmed-case-trajectories-by-region": "Confirmed Case Trajectories by Region",
28 | "trajectory-description": "Počet dní od {{minimumConfirmed}}ho případu",
29 | "traveling-into-japan": "Cestování do Japonska",
30 | "about-travel-restriction": "Níže jsou platné opatření týkající se cestování do Japonska. Pro více informací klikněte na odkaz.",
31 | "banned-from-entering-japan": "Zakazaný vstup do Japonska:",
32 | "existing-visa-required": "Požadováno platné vízum:",
33 | "14-day-self-quarantine-required": "Vyžadována 14-denní karanténa:",
34 | "other-limitations": "Ostatní omezení:",
35 | "provisional": "Prozatimních",
36 | "total": "Celkový počet",
37 | "increment-today": "(Dnes)",
38 | "increment-yesterday": "(Včera)",
39 | "daily": "Denně",
40 | "7-day-average": "7-denní průměr",
41 | "daily-trend": "Denní trend",
42 | "see-all-prefectures": "Zobrazit všechny prefektůry",
43 | "cruise-passengers-explanation": "Posádka výletní lodi a pasažeři nejsou zahrnuti v celkovém počtu.",
44 | "confirmed-chart-caption": "Nové denní případy",
45 | "active-chart-caption": "Celkový počet aktivních případů",
46 | "recovered-chart-caption": "Nové denní uzdravení",
47 | "deceased-chart-caption": "Nové denní úmrtí",
48 | "tested-chart-caption": "Denní počet provedených testů",
49 | "active-critical-percentage": "{{percent}}% případů je v kritickém stavu.",
50 | "recovered-percentage": "{{percent}}% z celkového počtu případů",
51 | "deceased-percentage": "{{percent}}% z celkového počtu případů",
52 | "tested-percentage": "{{percent}}% výsledků je pozitivní.",
53 | "active-cases": "Active cases",
54 | "no-active-cases": "No active cases 🎉",
55 | "time-period": "Time period",
56 | "all-time": "All time",
57 | "three-months": "3 months",
58 | "active-cases-description": "Total patients that are still currently testing positive for COVID-19. (Total confirmed cases minus total recovered cases).",
59 | "restrictions-link": "Find out about the most current travel restrictions for Foreign Nationals from the following:",
60 | "non-resident-restrictions": "All foreign tourists are barred from entering the country. Some business travel is allowed from select countries.",
61 | "pseudo-prefectures": {
62 | "port-of-entry": "Hraniční přechod",
63 | "unspecified": "Nespecifikovánp",
64 | "diamond-princess": "Výletní loď Diamond Princess",
65 | "nagasaki-cruise": "Výletní loď Nagasaki"
66 | },
67 | "prefectures": {
68 | "Aichi": "Aichi",
69 | "Akita": "Akita",
70 | "Aomori": "Aomori",
71 | "Chiba": "Chiba",
72 | "Ehime": "Ehime",
73 | "Fukui": "Fukui",
74 | "Fukuoka": "Fukuoka",
75 | "Fukushima": "Fukushima",
76 | "Gifu": "Gifu",
77 | "Gunma": "Gunma",
78 | "Hiroshima": "Hiroshima",
79 | "Hokkaido": "Hokkaido",
80 | "Hyogo": "Hyogo",
81 | "Ibaraki": "Ibaraki",
82 | "Ishikawa": "Ishikawa",
83 | "Iwate": "Iwate",
84 | "Kagawa": "Kagawa",
85 | "Kagoshima": "Kagoshima",
86 | "Kanagawa": "Kanagawa",
87 | "Kochi": "Kochi",
88 | "Kumamoto": "Kumamoto",
89 | "Kyoto": "Kyoto",
90 | "Mie": "Mie",
91 | "Miyagi": "Miyagi",
92 | "Miyazaki": "Miyazaki",
93 | "Nagano": "Nagano",
94 | "Nagasaki": "Nagasaki",
95 | "Nara": "Nara",
96 | "Niigata": "Niigata",
97 | "Oita": "Oita",
98 | "Okayama": "Okayama",
99 | "Okinawa": "Okinawa",
100 | "Osaka": "Osaka",
101 | "Saga": "Saga",
102 | "Saitama": "Saitama",
103 | "Shiga": "Shiga",
104 | "Shimane": "Shimane",
105 | "Shizuoka": "Shizuoka",
106 | "Tochigi": "Tochigi",
107 | "Tokushima": "Tokushima",
108 | "Tokyo": "Tokyo",
109 | "Tottori": "Tottori",
110 | "Toyama": "Toyama",
111 | "Wakayama": "Wakayama",
112 | "Yamagata": "Yamagata",
113 | "Yamaguchi": "Yamaguchi",
114 | "Yamanashi": "Yamanashi"
115 | },
116 | "countries": {
117 | "westerdam": "Westerdam (Výletní loď)"
118 | }
119 | }
120 |
--------------------------------------------------------------------------------
/src/i18n/pt.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "Radar de COVID-19 no Japão",
3 | "last-updated": "Última atualização:",
4 | "kpi-active": "Ativos",
5 | "kpi-active-tooltip": "Casos confirmados menos recuperados e óbitos",
6 | "kpi-critical": "Em condição crítica",
7 | "kpi-deceased": "Óbitos",
8 | "kpi-tested": "Testados",
9 | "kpi-confirmed": "Confirmados",
10 | "kpi-recovered": "Recuperados",
11 | "covid-19": "COVID-19",
12 | "outbreak-map": "Mapa de Contaminação",
13 | "cases-none": "0 casos",
14 | "cases-range": "{{from}}-{{to}} casos",
15 | "cases-last": "{{from}}+ casos",
16 | "outbreak-spread-trend": "Total de Casos",
17 | "new-cases-by-day": "Casos Confirmados por Dia",
18 | "top-prefectures": "Top 10 Províncias",
19 | "prefecture-data": "Casos por Província",
20 | "prefecture": "Província",
21 | "confirmed": "Confirmados",
22 | "recovered": "Recuperados",
23 | "deaths": "Óbitos",
24 | "active": "Ativos",
25 | "helpful-links": "Links Úteis",
26 | "primary-data-sources": "Fontes Primárias de Dados",
27 | "confirmed-case-trajectories-by-region": "Confirmed Case Trajectories by Region",
28 | "trajectory-description": "Número de dias desde o {{minimumConfirmed}}º caso",
29 | "traveling-into-japan": "Viajando ao Japão",
30 | "about-travel-restriction": "Abaixo constam as retrições colocadas em prática com relação a viagens ao Japão. Clique nos links para mais detalhes sobre as restrições.",
31 | "banned-from-entering-japan": "Proibidos de entrar no Japão:",
32 | "existing-visa-required": "Visto previamente existente obrigatório:",
33 | "14-day-self-quarantine-required": "14 dias de auto-quarentena obrigatórios:",
34 | "other-limitations": "Outras limitações:",
35 | "provisional": "Provisório",
36 | "total": "Total",
37 | "increment-today": "(Hoje)",
38 | "increment-yesterday": "(Ontem)",
39 | "daily": "Em um dia",
40 | "7-day-average": "Média de 7 dias",
41 | "daily-trend": "Tendência por dia",
42 | "see-all-prefectures": "Ver todas províncias",
43 | "cruise-passengers-explanation": "Tripulação e passageiros de cruzeiros não estão inclusos nos totais.",
44 | "confirmed-chart-caption": "Novos casos por dia",
45 | "active-chart-caption": "Total de casos ativos",
46 | "recovered-chart-caption": "Recuperações por dia",
47 | "deceased-chart-caption": "Óbitos por dia",
48 | "tested-chart-caption": "Testes por dia",
49 | "active-critical-percentage": "{{percent}}% estão em condição crítica.",
50 | "recovered-percentage": "{{percent}}% do total de casos",
51 | "deceased-percentage": "{{percent}}% do total de casos",
52 | "tested-percentage": "{{percent}}% dos casos são positivos.",
53 | "active-cases": "Active cases",
54 | "no-active-cases": "No active cases 🎉",
55 | "time-period": "Time period",
56 | "all-time": "All time",
57 | "three-months": "3 months",
58 | "active-cases-description": "Total patients that are still currently testing positive for COVID-19. (Total confirmed cases minus total recovered cases).",
59 | "restrictions-link": "Find out about the most current travel restrictions for Foreign Nationals from the following:",
60 | "non-resident-restrictions": "All foreign tourists are barred from entering the country. Some business travel is allowed from select countries.",
61 | "pseudo-prefectures": {
62 | "port-of-entry": "Porto de Entrada",
63 | "unspecified": "Não especificado",
64 | "diamond-princess": "Navio de cruzeiro Diamond Princess",
65 | "nagasaki-cruise": "Navio de cruzeiro Nagasaki"
66 | },
67 | "prefectures": {
68 | "Aichi": "Aichi",
69 | "Akita": "Akita",
70 | "Aomori": "Aomori",
71 | "Chiba": "Chiba",
72 | "Ehime": "Ehime",
73 | "Fukui": "Fukui",
74 | "Fukuoka": "Fukuoka",
75 | "Fukushima": "Fukushima",
76 | "Gifu": "Gifu",
77 | "Gunma": "Gunma",
78 | "Hiroshima": "Hiroshima",
79 | "Hokkaido": "Hokkaido",
80 | "Hyogo": "Hyogo",
81 | "Ibaraki": "Ibaraki",
82 | "Ishikawa": "Ishikawa",
83 | "Iwate": "Iwate",
84 | "Kagawa": "Kagawa",
85 | "Kagoshima": "Kagoshima",
86 | "Kanagawa": "Kanagawa",
87 | "Kochi": "Kochi",
88 | "Kumamoto": "Kumamoto",
89 | "Kyoto": "Kyoto",
90 | "Mie": "Mie",
91 | "Miyagi": "Miyagi",
92 | "Miyazaki": "Miyazaki",
93 | "Nagano": "Nagano",
94 | "Nagasaki": "Nagasaki",
95 | "Nara": "Nara",
96 | "Niigata": "Niigata",
97 | "Oita": "Oita",
98 | "Okayama": "Okayama",
99 | "Okinawa": "Okinawa",
100 | "Osaka": "Osaka",
101 | "Saga": "Saga",
102 | "Saitama": "Saitama",
103 | "Shiga": "Shiga",
104 | "Shimane": "Shimane",
105 | "Shizuoka": "Shizuoka",
106 | "Tochigi": "Tochigi",
107 | "Tokushima": "Tokushima",
108 | "Tokyo": "Tóquio",
109 | "Tottori": "Tottori",
110 | "Toyama": "Toyama",
111 | "Wakayama": "Wakayama",
112 | "Yamagata": "Yamagata",
113 | "Yamaguchi": "Yamaguchi",
114 | "Yamanashi": "Yamanashi"
115 | },
116 | "countries": {
117 | "westerdam": "Westerdam (navio de cruzeiro)"
118 | }
119 | }
120 |
--------------------------------------------------------------------------------
/src/i18n/tr.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "Japonya KOVID-19 Koronavirüs Takipçisi",
3 | "languages": "Diller:",
4 | "last-updated": "Son Güncelleme:",
5 | "kpi-active": "Aktif",
6 | "kpi-active-tooltip": "Teyitli vaka sayısı - iyileşen sayısı - vefat sayısı",
7 | "kpi-critical": "Durumu kritik",
8 | "kpi-deceased": "Ölümler",
9 | "kpi-tested": "Yapılan test sayısı",
10 | "kpi-confirmed": "Teyitli vaka sayısı",
11 | "kpi-recovered": "İyileşen sayısı",
12 | "covid-19": "KOVID-19",
13 | "outbreak-map": "Salgın haritası",
14 | "cases-none": "Vaka yok",
15 | "cases-range": "{{from}}-{{to}} vaka arası",
16 | "cases-last": "{{from}}+ vaka",
17 | "outbreak-spread-trend": "Toplam vakalar",
18 | "new-cases-by-day": "Günlük teyitlenen vaka sayısı",
19 | "top-prefectures": "İlk 10 Bölge",
20 | "active-regions": "En aktif bölgeler",
21 | "prefecture-data": "Bölge başına vaka",
22 | "prefecture": "Bölge",
23 | "confirmed": "Teyitli",
24 | "recovered": "İyileşen",
25 | "deaths": "Ölümler",
26 | "active": "Aktif",
27 | "helpful-links": "Bağlantılar",
28 | "primary-data-sources": "Birincil veri kaynakları",
29 | "confirmed-case-trajectories-by-region": "Bölge Başına Teyitli Vaka Eğrileri",
30 | "trajectory-description": "{{minimumConfirmed}}. vakadan beri geçen gün",
31 | "traveling-into-japan": "Japonya'ya seyahat",
32 | "about-travel-restriction": "Aşağıda Japonya'ya seyahat ile ilgili kısıtlamalar mevcuttur. Detaylı bilgi için lütfen bağlantılara tıklayınız.",
33 | "banned-from-entering-japan": "Japonya'ya girişi yasaklı ülkeler:",
34 | "existing-visa-required": "Önceden alınmış vize gerektiren ülkeler:",
35 | "14-day-self-quarantine-required": "14 gün karantina gerektiren ülkeler:",
36 | "other-limitations": "Diğer kısıtlamalar:",
37 | "provisional": "Teyit bekleniyor",
38 | "total": "Toplam",
39 | "increment-today": "(Bugün)",
40 | "increment-yesterday": "(Dün)",
41 | "daily": "Günlük",
42 | "7-day-average": "7 gün ortalama",
43 | "daily-trend": "Günlük eğilim",
44 | "see-all-prefectures": "Bütün bölgeleri gör",
45 | "cruise-passengers-explanation": "Yolcu gemisi yolcuları toplam hesaplamaya katılmamıştır.",
46 | "confirmed-chart-caption": "Günlük yeni vaka sayısı",
47 | "active-chart-caption": "Toplam aktif vakalar",
48 | "recovered-chart-caption": "Günlük yeni iyileşen",
49 | "deceased-chart-caption": "Günlük yeni ölüm",
50 | "tested-chart-caption": "Günlük test",
51 | "active-critical-percentage": "%{{percent}} durumu kritik.",
52 | "recovered-percentage": "tüm vakaların %{{percent}}i",
53 | "deceased-percentage": "tüm vakaların %{{percent}}i",
54 | "tested-percentage": "sonuçların %{{percent}}i pozitif.",
55 | "active-cases": "Aktif vakalar",
56 | "no-active-cases": "Aktif vaka yok 🎉",
57 | "time-period": "Zaman aralığı",
58 | "all-time": "Tüm zamanlar",
59 | "three-months": "Üç aylık",
60 | "active-cases-description": "Total patients that are still currently testing positive for COVID-19. (Total confirmed cases minus total recovered cases).",
61 | "pseudo-prefectures": {
62 | "port-of-entry": "Giriş limanı",
63 | "unspecified": "Belirtilmemiş",
64 | "diamond-princess": "Diamond Princess Yolcu Gemisi",
65 | "nagasaki-cruise": "Nagasaki Yolcu Gemisi"
66 | },
67 | "prefectures": {
68 | "Aichi": "Aichi",
69 | "Akita": "Akita",
70 | "Aomori": "Aomori",
71 | "Chiba": "Chiba",
72 | "Ehime": "Ehime",
73 | "Fukui": "Fukui",
74 | "Fukuoka": "Fukuoka",
75 | "Fukushima": "Fukushima",
76 | "Gifu": "Gifu",
77 | "Gunma": "Gunma",
78 | "Hiroshima": "Hiroshima",
79 | "Hokkaido": "Hokkaido",
80 | "Hyogo": "Hyogo",
81 | "Ibaraki": "Ibaraki",
82 | "Ishikawa": "Ishikawa",
83 | "Iwate": "Iwate",
84 | "Kagawa": "Kagawa",
85 | "Kagoshima": "Kagoshima",
86 | "Kanagawa": "Kanagawa",
87 | "Kochi": "Kochi",
88 | "Kumamoto": "Kumamoto",
89 | "Kyoto": "Kyoto",
90 | "Mie": "Mie",
91 | "Miyagi": "Miyagi",
92 | "Miyazaki": "Miyazaki",
93 | "Nagano": "Nagano",
94 | "Nagasaki": "Nagasaki",
95 | "Nara": "Nara",
96 | "Niigata": "Niigata",
97 | "Oita": "Oita",
98 | "Okayama": "Okayama",
99 | "Okinawa": "Okinawa",
100 | "Osaka": "Osaka",
101 | "Saga": "Saga",
102 | "Saitama": "Saitama",
103 | "Shiga": "Shiga",
104 | "Shimane": "Shimane",
105 | "Shizuoka": "Shizuoka",
106 | "Tochigi": "Tochigi",
107 | "Tokushima": "Tokushima",
108 | "Tokyo": "Tokyo",
109 | "Tottori": "Tottori",
110 | "Toyama": "Toyama",
111 | "Wakayama": "Wakayama",
112 | "Yamagata": "Yamagata",
113 | "Yamaguchi": "Yamaguchi",
114 | "Yamanashi": "Yamanashi"
115 | },
116 | "regions": {
117 | "Kanto": "Kanto",
118 | "Kansai": "Kansai",
119 | "Kyushu": "Kyushu",
120 | "Chubu": "Chubu",
121 | "Chugoku": "Chugoku",
122 | "Hokkaido": "Hokkaido",
123 | "Tohoku": "Tohoku",
124 | "Shikoku": "Shikoku",
125 | "Other": "Other"
126 | },
127 | "countries": {
128 | "westerdam": "Westerdam (Yolcu Gemisi)"
129 | }
130 | }
131 |
--------------------------------------------------------------------------------
/src/i18n/pl.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "Japan COVID-19 Coronavirus Tracker",
3 | "last-updated": "Ostatnia akutalizacja:",
4 | "kpi-active": "Aktywne",
5 | "kpi-active-tooltip": "Potwierdzone aktywne przypadki minus przypadki wyleczone minus przypadki śmiertelne",
6 | "kpi-critical": "Krytyczne",
7 | "kpi-deceased": "Śmiertelne",
8 | "kpi-tested": "Przetestowane",
9 | "kpi-confirmed": "Potwierdzone",
10 | "kpi-recovered": "Wyleczone",
11 | "covid-19": "COVID-19",
12 | "outbreak-map": "Mapa zachorowań",
13 | "cases-none": "0 przypadków",
14 | "cases-range": "{{from}}-{{to}} przypadków",
15 | "cases-last": "{{from}}+ przypadków",
16 | "outbreak-spread-trend": "Wszystkie Przypadki",
17 | "new-cases-by-day": "Dzienna Potwierdzana Liczba Przypadków",
18 | "top-prefectures": "Top 10 Prefektur",
19 | "prefecture-data": "Przypadki według prefektury",
20 | "prefecture": "Prefektura",
21 | "confirmed": "Potwierdzone",
22 | "recovered": "Wyleczone",
23 | "deaths": "Śmiertelne",
24 | "active": "Aktywne",
25 | "helpful-links": "Przydatne Linki",
26 | "primary-data-sources": "Główne Źródła Danych",
27 | "confirmed-case-trajectories-by-region": "Confirmed Case Trajectories by Region",
28 | "trajectory-description": "Liczba dni od przypadku numer: {{minimumConfirmed}}",
29 | "traveling-into-japan": "Podróżowanie do Japonii",
30 | "about-travel-restriction": "Poniżej znajdują się informacje o ograniczeniach w podróżowaniu do Japonii. Kliknij w link, aby uzyskać więcej szczegółów.",
31 | "banned-from-entering-japan": "Zakaz wjazdu do Japonii:",
32 | "existing-visa-required": "Istniejąca wiza wymagana:",
33 | "14-day-self-quarantine-required": "Wymagana 14-dniowa samokwarantanna:",
34 | "other-limitations": "Inne ograniczenia:",
35 | "provisional": "Tymczasowo",
36 | "total": "Razem",
37 | "increment-today": "(Dziś)",
38 | "increment-yesterday": "(Wczoraj)",
39 | "daily": "Dzienna",
40 | "7-day-average": "Średnia 7-dniowa",
41 | "daily-trend": "Dzienny trend",
42 | "see-all-prefectures": "Zobacz Wszystkie prefektury",
43 | "cruise-passengers-explanation": "Załoga i pasażerowie rejsu nie są wliczani do sumy.",
44 | "confirmed-chart-caption": "Dzienna liczba nowych przypadków",
45 | "active-chart-caption": "Wszystkie aktywne przypadki",
46 | "recovered-chart-caption": "Dzienna liczba przypadków wyleczonych",
47 | "deceased-chart-caption": "Dzienna liczba zgonów",
48 | "tested-chart-caption": "Dzienna liczba testów",
49 | "active-critical-percentage": "{{percent}}% jest w krytycznym stanie.",
50 | "recovered-percentage": "{{percent}}% wszystkich przypadków",
51 | "deceased-percentage": "{{percent}}% wszystkich przypadków",
52 | "tested-percentage": "{{percent}}% wyników jest pozytywnych.",
53 | "active-cases": "Active cases",
54 | "no-active-cases": "No active cases 🎉",
55 | "time-period": "Time period",
56 | "all-time": "All time",
57 | "three-months": "3 months",
58 | "active-cases-description": "Total patients that are still currently testing positive for COVID-19. (Total confirmed cases minus total recovered cases).",
59 | "restrictions-link": "Find out about the most current travel restrictions for Foreign Nationals from the following:",
60 | "non-resident-restrictions": "All foreign tourists are barred from entering the country. Some business travel is allowed from select countries.",
61 | "pseudo-prefectures": {
62 | "port-of-entry": "Przejście Graniczne",
63 | "unspecified": "Nieokreślony",
64 | "diamond-princess": "Diamond Princess Cruise Ship",
65 | "nagasaki-cruise": "Nagasaki Cruise Ship"
66 | },
67 | "prefectures": {
68 | "Aichi": "Aichi",
69 | "Akita": "Akita",
70 | "Aomori": "Aomori",
71 | "Chiba": "Chiba",
72 | "Ehime": "Ehime",
73 | "Fukui": "Fukui",
74 | "Fukuoka": "Fukuoka",
75 | "Fukushima": "Fukushima",
76 | "Gifu": "Gifu",
77 | "Gunma": "Gunma",
78 | "Hiroshima": "Hiroshima",
79 | "Hokkaido": "Hokkaido",
80 | "Hyogo": "Hyogo",
81 | "Ibaraki": "Ibaraki",
82 | "Ishikawa": "Ishikawa",
83 | "Iwate": "Iwate",
84 | "Kagawa": "Kagawa",
85 | "Kagoshima": "Kagoshima",
86 | "Kanagawa": "Kanagawa",
87 | "Kochi": "Kochi",
88 | "Kumamoto": "Kumamoto",
89 | "Kyoto": "Kyoto",
90 | "Mie": "Mie",
91 | "Miyagi": "Miyagi",
92 | "Miyazaki": "Miyazaki",
93 | "Nagano": "Nagano",
94 | "Nagasaki": "Nagasaki",
95 | "Nara": "Nara",
96 | "Niigata": "Niigata",
97 | "Oita": "Oita",
98 | "Okayama": "Okayama",
99 | "Okinawa": "Okinawa",
100 | "Osaka": "Osaka",
101 | "Saga": "Saga",
102 | "Saitama": "Saitama",
103 | "Shiga": "Shiga",
104 | "Shimane": "Shimane",
105 | "Shizuoka": "Shizuoka",
106 | "Tochigi": "Tochigi",
107 | "Tokushima": "Tokushima",
108 | "Tokyo": "Tokyo",
109 | "Tottori": "Tottori",
110 | "Toyama": "Toyama",
111 | "Wakayama": "Wakayama",
112 | "Yamagata": "Yamagata",
113 | "Yamaguchi": "Yamaguchi",
114 | "Yamanashi": "Yamanashi"
115 | },
116 | "countries": {
117 | "westerdam": "Westerdam (Wycieczkowiec)"
118 | }
119 | }
120 |
--------------------------------------------------------------------------------
/src/i18n/fr.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "Japan COVID-19 Coronavirus Tracker",
3 | "last-updated": "Dernière mise à jour:",
4 | "kpi-active": "Actifs",
5 | "kpi-active-tooltip": "Patients confirmés moins guérisons et décès",
6 | "kpi-critical": "Critiques",
7 | "kpi-deceased": "Décès",
8 | "kpi-tested": "Testés",
9 | "kpi-confirmed": "Confirmés",
10 | "kpi-recovered": "Guérisons",
11 | "covid-19": "COVID-19",
12 | "outbreak-map": "Carte de l'épidémie",
13 | "cases-none": "0 cas",
14 | "cases-range": "{{from}}-{{to}} cas",
15 | "cases-last": "{{from}}+ cas",
16 | "outbreak-spread-trend": "Nombre total de cas",
17 | "new-cases-by-day": "Cas confirmés quotidiennement",
18 | "top-prefectures": "Top des 10 Préfectures",
19 | "prefecture-data": "Cas par préfecture",
20 | "prefecture": "Préfecture",
21 | "confirmed": "Confirmés",
22 | "recovered": "Guéris",
23 | "deaths": "Décédés",
24 | "active": "Actifs",
25 | "helpful-links": "Liens utiles",
26 | "primary-data-sources": "Source d'information principale",
27 | "confirmed-case-trajectories-by-region": "Trajectoire de Cas Confirmés par Région",
28 | "trajectory-description": "Nombre de jours depuis le {{minimumConfirmed}}ème cas confirmé",
29 | "traveling-into-japan": "Voyageant au Japon",
30 | "about-travel-restriction": "Ci-dessous sont listés les restrictions qui ont été mises en place concernant les voyages au Japon. Cliquez sour le lien pour plus de détails concernant ces restrictions.",
31 | "banned-from-entering-japan": "Interdiction d'entrée au Japon:",
32 | "existing-visa-required": "Visa déjà existant requis:",
33 | "14-day-self-quarantine-required": "Quatorzaine requise:",
34 | "other-limitations": "Autres restrictions:",
35 | "provisional": "Provisionnel",
36 | "total": "Total",
37 | "increment-today": "(Aujourd'hui)",
38 | "increment-yesterday": "(Hier)",
39 | "daily": "Quotidien",
40 | "7-day-average": "Moyenne sur 7 jours glissants",
41 | "daily-trend": "Tendance journalière",
42 | "see-all-prefectures": "Voir toutes les préfectures",
43 | "cruise-passengers-explanation": "Les équipage et passagers des bateaux ne sont pas inclus dans les totaux.",
44 | "confirmed-chart-caption": "Nouveaux cas journaliers",
45 | "active-chart-caption": "Total des cas actifs",
46 | "recovered-chart-caption": "Guérisons journalières",
47 | "deceased-chart-caption": "Nouveaux décés journaliers",
48 | "tested-chart-caption": "Tests journaliers",
49 | "active-critical-percentage": "{{percent}}% sont dans un état critique.",
50 | "recovered-percentage": "{{percent}}% du nombre de cas total",
51 | "deceased-percentage": "{{percent}}% du nombre de cas total",
52 | "tested-percentage": "{{percent}}% des résultats sont positif.",
53 | "active-cases": "Cas actifs",
54 | "no-active-cases": "Pas de cas actifs 🎉",
55 | "time-period": "Time period",
56 | "all-time": "All time",
57 | "three-months": "3 months",
58 | "active-cases-description": "Total patients that are still currently testing positive for COVID-19. (Total confirmed cases minus total recovered cases).",
59 | "restrictions-link": "Find out about the most current travel restrictions for Foreign Nationals from the following:",
60 | "non-resident-restrictions": "All foreign tourists are barred from entering the country. Some business travel is allowed from select countries.",
61 | "pseudo-prefectures": {
62 | "port-of-entry": "Controle aux frontières",
63 | "unspecified": "Non renseigné",
64 | "diamond-princess": "Diamond Princess - bateau de croisière",
65 | "nagasaki-cruise": "Nagasaki - bateau de croisière"
66 | },
67 | "prefectures": {
68 | "Aichi": "Aichi",
69 | "Akita": "Akita",
70 | "Aomori": "Aomori",
71 | "Chiba": "Chiba",
72 | "Ehime": "Ehime",
73 | "Fukui": "Fukui",
74 | "Fukuoka": "Fukuoka",
75 | "Fukushima": "Fukushima",
76 | "Gifu": "Gifu",
77 | "Gunma": "Gunma",
78 | "Hiroshima": "Hiroshima",
79 | "Hokkaido": "Hokkaido",
80 | "Hyogo": "Hyogo",
81 | "Ibaraki": "Ibaraki",
82 | "Ishikawa": "Ishikawa",
83 | "Iwate": "Iwate",
84 | "Kagawa": "Kagawa",
85 | "Kagoshima": "Kagoshima",
86 | "Kanagawa": "Kanagawa",
87 | "Kochi": "Kochi",
88 | "Kumamoto": "Kumamoto",
89 | "Kyoto": "Kyoto",
90 | "Mie": "Mie",
91 | "Miyagi": "Miyagi",
92 | "Miyazaki": "Miyazaki",
93 | "Nagano": "Nagano",
94 | "Nagasaki": "Nagasaki",
95 | "Nara": "Nara",
96 | "Niigata": "Niigata",
97 | "Oita": "Oita",
98 | "Okayama": "Okayama",
99 | "Okinawa": "Okinawa",
100 | "Osaka": "Osaka",
101 | "Saga": "Saga",
102 | "Saitama": "Saitama",
103 | "Shiga": "Shiga",
104 | "Shimane": "Shimane",
105 | "Shizuoka": "Shizuoka",
106 | "Tochigi": "Tochigi",
107 | "Tokushima": "Tokushima",
108 | "Tokyo": "Tokyo",
109 | "Tottori": "Tottori",
110 | "Toyama": "Toyama",
111 | "Wakayama": "Wakayama",
112 | "Yamagata": "Yamagata",
113 | "Yamaguchi": "Yamaguchi",
114 | "Yamanashi": "Yamanashi"
115 | },
116 | "countries": {
117 | "westerdam": "Westerdam (Bateau de croisière)"
118 | }
119 | }
120 |
--------------------------------------------------------------------------------
/src/i18n/fa.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "ردیاب ویروس کرونا (کووید-۱۹) ژاپن",
3 | "languages": "زبانها:",
4 | "last-updated": "آخرین بهروزرسانی:",
5 | "kpi-active": "فعال",
6 | "kpi-active-tooltip": "موارد تایید شده، منهای بهبود یافتهها و مرگها",
7 | "kpi-critical": "خطرناک",
8 | "kpi-deceased": "مرگها",
9 | "kpi-tested": "تست شدهها",
10 | "kpi-confirmed": "تایید شدهها",
11 | "kpi-recovered": "بهبود یافتهها",
12 | "covid-19": "کووید-۱۹",
13 | "outbreak-map": "نقشه شیوع",
14 | "cases-none": "بدون مورد",
15 | "cases-range": "{{from}}-{{to}} مورد",
16 | "cases-last": "{{from}}+ مورد",
17 | "outbreak-spread-trend": "جمع موارد",
18 | "new-cases-by-day": "موارد تایید شده روزانه",
19 | "top-prefectures": "۱۰ استان برتر",
20 | "active-regions": "بیشترین مناطق فعال",
21 | "prefecture-data": "موارد بر اساس استان",
22 | "prefecture": "استان",
23 | "confirmed": "تایید شدهها",
24 | "recovered": "بهبود یافتهها",
25 | "deaths": "مرگها",
26 | "active": "فعال",
27 | "helpful-links": "لینکهای کمکی",
28 | "primary-data-sources": "منابع داده اصلی",
29 | "confirmed-case-trajectories-by-region": "خطوط سیر موارد تایید شده بر اساس منطقه",
30 | "trajectory-description": "تعداد روز از مورد {{minimumConfirmed}}",
31 | "traveling-into-japan": "سفر به ژاپن",
32 | "about-travel-restriction": "در زیر موارد ممنوعیت ورود به ژاپن درج شده است. برای اطلاع بیشتر در مورد ممنوعیت، روی لینک زیر کلیک کنید.",
33 | "banned-from-entering-japan": "ممنوع از ورود به ژاپن:",
34 | "existing-visa-required": "نیاز به ویزای موجود:",
35 | "14-day-self-quarantine-required": "۱۴ روز قرنطینه شخصی ضروری:",
36 | "other-limitations": "محدودیتهای دیگر:",
37 | "provisional": "موقت",
38 | "total": "جمع",
39 | "increment-today": "(امروز)",
40 | "increment-yesterday": "(دیروز)",
41 | "daily": "روزانه",
42 | "7-day-average": "متوسط ۷ روز",
43 | "daily-trend": "ترند روزانه",
44 | "see-all-prefectures": "همه استانها را ببینید",
45 | "cruise-passengers-explanation": "کارکنان و مسافران کشتی طفریحی در شماش کل گنجانده نشدهاند.",
46 | "confirmed-chart-caption": "موارد جدید روزانه",
47 | "active-chart-caption": "جمع موارد فعال",
48 | "recovered-chart-caption": "بهبود یافتههای جدید روزانه",
49 | "deceased-chart-caption": "مرگهای جدید روزانه",
50 | "tested-chart-caption": "تستهای روزانه",
51 | "active-critical-percentage": "{{percent}}% در شرایط خطرناک به سر میبرند.",
52 | "recovered-percentage": "{{percent}}% از جمع موارد",
53 | "deceased-percentage": "{{percent}}% از جمع وارد",
54 | "tested-percentage": "{{percent}}% از نتایج مثبت هستند.",
55 | "active-cases": "موارد فعال",
56 | "no-active-cases": "بدون مورد فعال 🎉",
57 | "time-period": "Time period",
58 | "all-time": "All time",
59 | "three-months": "3 months",
60 | "active-cases-description": "Total patients that are still currently testing positive for COVID-19. (Total confirmed cases minus total recovered cases).",
61 | "restrictions-link": "Find out about the most current travel restrictions for Foreign Nationals from the following:",
62 | "non-resident-restrictions": "All foreign tourists are barred from entering the country. Some business travel is allowed from select countries.",
63 | "pseudo-prefectures": {
64 | "port-of-entry": "محل ورود",
65 | "unspecified": "نامشخص",
66 | "diamond-princess": "کشتی طفریحی دایاموند پرینسس",
67 | "nagasaki-cruise": "کشتی طفریحی ناگاساکی"
68 | },
69 | "prefectures": {
70 | "Aichi": "آیچی",
71 | "Akita": "آکیتا",
72 | "Aomori": "آوموری",
73 | "Chiba": "چیبا",
74 | "Ehime": "اهیمه",
75 | "Fukui": "فوکوری",
76 | "Fukuoka": "فوکووکا",
77 | "Fukushima": "فوکوشیما",
78 | "Gifu": "گیفو",
79 | "Gunma": "گونما",
80 | "Hiroshima": "هیروشیما",
81 | "Hokkaido": "هوکایدو",
82 | "Hyogo": "هیوگو",
83 | "Ibaraki": "ایباراکی",
84 | "Ishikawa": "ایشیکاوا",
85 | "Iwate": "ایواته",
86 | "Kagawa": "کاگاوا",
87 | "Kagoshima": "کاگوشیما",
88 | "Kanagawa": "کاناگاوا",
89 | "Kochi": "کوچی",
90 | "Kumamoto": "کوماموتو",
91 | "Kyoto": "کیوتو",
92 | "Mie": "میه",
93 | "Miyagi": "میاگی",
94 | "Miyazaki": "میازاکی",
95 | "Nagano": "ناگانو",
96 | "Nagasaki": "ناگاساکی",
97 | "Nara": "نارا",
98 | "Niigata": "نییگاتا",
99 | "Oita": "اویتا",
100 | "Okayama": "اوکایاما",
101 | "Okinawa": "اوکیناوا",
102 | "Osaka": "اوساکا",
103 | "Saga": "ساگا",
104 | "Saitama": "سایتاما",
105 | "Shiga": "شیگا",
106 | "Shimane": "شیمانه",
107 | "Shizuoka": "شیزوکا",
108 | "Tochigi": "توچیگی",
109 | "Tokushima": "توکوشیما",
110 | "Tokyo": "توکیو",
111 | "Tottori": "توتوری",
112 | "Toyama": "تویاما",
113 | "Wakayama": "واکایاما",
114 | "Yamagata": "یاماگاتا",
115 | "Yamaguchi": "یاماگوچی",
116 | "Yamanashi": "یاماناشی"
117 | },
118 | "regions": {
119 | "Kanto": "کانتو",
120 | "Kansai": "کانسای",
121 | "Kyushu": "کیوشو",
122 | "Chubu": "چوبو",
123 | "Chugoku": "چوگوکو",
124 | "Hokkaido": "هوکایدو",
125 | "Tohoku": "توهوکو",
126 | "Shikoku": "شیکوکو",
127 | "Other": "سایر"
128 | },
129 | "countries": {
130 | "westerdam": "وستردام (کشتی طفریحی)"
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/src/i18n/th.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "สถานการณ์โควิด-19 ประเทศญี่ปุ่น",
3 | "languages": "ภาษา:",
4 | "last-updated": "อัพเดตล่าสุด:",
5 | "kpi-active": "ผู้ป่วย ณ ปัจจุบัน",
6 | "kpi-active-tooltip": "จำนวนผู้ป่วย ณ ปัจจุบันคิดจากผู้ติดเชื้อสะสมหักลบจำนวนผู้ที่รักษาหายแล้วหักลบจำนวนผู้เสียชีวิต",
7 | "kpi-critical": "อาการสาหัส",
8 | "kpi-deceased": "เสียชีวิต",
9 | "kpi-tested": "ตรวจแล้ว",
10 | "kpi-confirmed": "สะสม",
11 | "kpi-recovered": "รักษาหายแล้ว",
12 | "covid-19": "โควิด-19",
13 | "outbreak-map": "แผนผังการพบผู้ติดเชื้อ",
14 | "cases-none": "ไม่พบผู้ติดเชื้อ",
15 | "cases-range": "{{from}}-{{to}} ราย",
16 | "cases-last": "{{from}}+ ราย",
17 | "outbreak-spread-trend": "ผู้ติดเชื้อทั้งหมด",
18 | "new-cases-by-day": "ผู้ติดเชื้อรายวัน",
19 | "top-prefectures": "10 จังหวัดสูงสุด",
20 | "active-regions": "ลำดับตามภูมิภาค",
21 | "prefecture-data": "ผู้ติดเชื้อตามจังหวัด",
22 | "prefecture": "จังหวัด",
23 | "confirmed": "สะสม",
24 | "recovered": "หายแล้ว",
25 | "deaths": "เสียชีวิต",
26 | "active": "ผู้ป่วย ณ ปัจจุบัน",
27 | "helpful-links": "ข้อมูลที่เป็นประโยชน์",
28 | "primary-data-sources": "แหล่งข้อมูลหลัก",
29 | "confirmed-case-trajectories-by-region": "จำนวนผู้ติดเชื้อสะสมตามภูมิภาค",
30 | "trajectory-description": "จำนวนวันหลังจากผู้ติดเชื่อรายที่ {{minimumConfirmed}}",
31 | "traveling-into-japan": "การเดินทางเข้าประเทศญี่ปุ่น",
32 | "about-travel-restriction": "ด้านล่างเป็นข้อมูลเกี่ยวกับการจำกัดการเดินทางเข้าประเทศญี่ปุ่น คลิกที่ลิงก์เพื่ออ่านข้อมูลเพิ่มเติม",
33 | "banned-from-entering-japan": "ประเทศที่ห้ามเดินทางเข้าประเทศญี่ปุ่น:",
34 | "existing-visa-required": "ประเทศที่จำเป็นต้องมีวีซ่า:",
35 | "14-day-self-quarantine-required": "ประเทศจำเป็นต้องกักตัว 14 วัน:",
36 | "other-limitations": "ประเทศที่มีข้อจำกัดอื่นๆ:",
37 | "provisional": "ชั่วคราว",
38 | "total": "รวม",
39 | "increment-today": "(วันนี้)",
40 | "increment-yesterday": "(เมื่อวาน)",
41 | "daily": "รายวัน",
42 | "7-day-average": "เฉลี่ย 7 วัน",
43 | "daily-trend": "เทรนด์ประจำวัน",
44 | "see-all-prefectures": "ดูทุกจังหวัด",
45 | "cruise-passengers-explanation": "ไม่นับลูกเรือและผู้โดยสาร",
46 | "confirmed-chart-caption": "ยอดรายวัน",
47 | "active-chart-caption": "ผู้ติดเชื้อใหม่รายวัน",
48 | "recovered-chart-caption": "ผู้ที่รักษาหายแล้วรายวัน",
49 | "deceased-chart-caption": "ผู้เสียชีวิตรายวัน",
50 | "tested-chart-caption": "จำนวนที่ตรวจรายวัน",
51 | "active-critical-percentage": "{{percent}}% อยู่ในอาการสาหัส",
52 | "recovered-percentage": "{{percent}}% จากทั้งหมด",
53 | "deceased-percentage": "{{percent}}% จากทั้งหมด",
54 | "tested-percentage": "ตรวจพบเชื้อ {{percent}}%",
55 | "active-cases": "ผู้ป่วย ณ ปัจจุบัน",
56 | "no-active-cases": "ไม่พบผู้ติดเชื้อ 🎉",
57 | "time-period": "ช่วงเวลา",
58 | "all-time": "รวมทั้งหมด",
59 | "three-months": "3 เดือน",
60 | "active-cases-description": "จำนวนผู้ป่วยที่ยังคงให้การทดสอบเป็นบวกสำหรับเชื้อไวรัสโควิด-19 (จำนวนผู้ติดเชื้อสะสมลบด้วยจำนวนผู้ที่รักษาหายแล้ว)",
61 | "restrictions-link": "ข้อมูลล่าสุดเกี่ยวกับข้อจำกัดในการเดินทางของชาวต่างประเทศ",
62 | "non-resident-restrictions": "นักท่องเที่ยวชาวต่างชาติถูกจำกัดไม่ให้เข้าประเทศ ยกเว้นการเดินทางเพื่อธุรกิจจากบางประเทศ",
63 | "pseudo-prefectures": {
64 | "port-of-entry": "ตรวจคนเข้าเมือง",
65 | "unspecified": "ไม่ระบุ",
66 | "diamond-princess": "เรือสำราญไดมอนด์ ปรินเซส",
67 | "nagasaki-cruise": "เรือสำราญนางาซากิ"
68 | },
69 | "prefectures": {
70 | "Aichi": "ไอจิ",
71 | "Akita": "อากิตะ",
72 | "Aomori": "อาโอโมริ",
73 | "Chiba": "ชิบะ",
74 | "Ehime": "เอฮิเมะ",
75 | "Fukui": "ฟูกูอิ",
76 | "Fukuoka": "ฟูกูโอกะ",
77 | "Fukushima": "ฟูกูชิมะ",
78 | "Gifu": "กิฟุ",
79 | "Gunma": "กุมมะ",
80 | "Hiroshima": "ฮิโรชิมะ",
81 | "Hokkaido": "ฮอกไกโด",
82 | "Hyogo": "เฮียวโงะ",
83 | "Ibaraki": "อิบารากิ",
84 | "Ishikawa": "อิชิกาวะ",
85 | "Iwate": "อิวาเตะ",
86 | "Kagawa": "คางาวะ",
87 | "Kagoshima": "คาโงชิมะ",
88 | "Kanagawa": "คานางาวะ",
89 | "Kochi": "โคจิ",
90 | "Kumamoto": "คูมาโมโตะ",
91 | "Kyoto": "เกียวโต",
92 | "Mie": "มิเอะ",
93 | "Miyagi": "มิยางิ",
94 | "Miyazaki": "มิยาซากิ",
95 | "Nagano": "นางาโนะ",
96 | "Nagasaki": "นางาซากิ",
97 | "Nara": "นาระ",
98 | "Niigata": "นีงาตะ",
99 | "Oita": "โออิตะ",
100 | "Okayama": "โอกายามะ",
101 | "Okinawa": "โอกินาวะ",
102 | "Osaka": "โอซาก้า",
103 | "Saga": "ซางะ",
104 | "Saitama": "ไซตามะ",
105 | "Shiga": "ชิงะ",
106 | "Shimane": "ชิมาเนะ",
107 | "Shizuoka": "ชิซูโอกะ",
108 | "Tochigi": "โทจิงิ",
109 | "Tokushima": "โทกูชิมะ",
110 | "Tokyo": "โตเกียว",
111 | "Tottori": "ทตโตริ",
112 | "Toyama": "โทยามะ",
113 | "Wakayama": "วากายามะ",
114 | "Yamagata": "ยามางาตะ",
115 | "Yamaguchi": "ยามางูจิ",
116 | "Yamanashi": "ยามานาชิ"
117 | },
118 | "regions": {
119 | "Kanto": "คันโต",
120 | "Kansai": "คันไซ",
121 | "Kyushu": "คีวชู",
122 | "Chubu": "ชูบุ",
123 | "Chugoku": "ชูโงกุ",
124 | "Hokkaido": "ฮอกไกโด",
125 | "Tohoku": "โทโฮกุ",
126 | "Shikoku": "ชิโกกุ",
127 | "Other": "อื่นๆ"
128 | },
129 | "countries": {
130 | "westerdam": "เวสเตอร์ดัม (เรือสำราญ)"
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/src/i18n/en.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "Japan COVID-19 Coronavirus Tracker",
3 | "languages": "Language:",
4 | "last-updated": "Last Updated:",
5 | "kpi-active": "Active",
6 | "kpi-active-tooltip": "Confirmed cases minus recovered minus deceased",
7 | "kpi-critical": "Critical",
8 | "kpi-deceased": "Deaths",
9 | "kpi-tested": "Tested",
10 | "kpi-confirmed": "Confirmed",
11 | "kpi-recovered": "Recovered",
12 | "covid-19": "COVID-19",
13 | "outbreak-map": "Outbreak Map",
14 | "cases-none": "No cases",
15 | "cases-range": "{{from}}-{{to}} cases",
16 | "cases-last": "{{from}}+ cases",
17 | "outbreak-spread-trend": "Total Cases",
18 | "new-cases-by-day": "Daily Confirmed Cases",
19 | "top-prefectures": "Top 10 Prefectures",
20 | "active-regions": "Most Active Regions",
21 | "prefecture-data": "Cases by Prefecture",
22 | "prefecture": "Prefecture",
23 | "confirmed": "Confirmed",
24 | "recovered": "Recovered",
25 | "deaths": "Deaths",
26 | "active": "Active",
27 | "helpful-links": "Helpful Links",
28 | "primary-data-sources": "Primary Data Sources",
29 | "confirmed-case-trajectories-by-region": "Confirmed Case Trajectories by Region",
30 | "trajectory-description": "Number of days since {{minimumConfirmed}}th case",
31 | "traveling-into-japan": "Traveling into Japan",
32 | "about-travel-restriction": "Below are the travel restrictions that have been put in place regarding traveling into Japan. Click on the link for more details on the restrictions.",
33 | "banned-from-entering-japan": "Banned from entering Japan:",
34 | "existing-visa-required": "Existing visa required:",
35 | "14-day-self-quarantine-required": "14-day Self-Quarantine required:",
36 | "other-limitations": "Other limitations:",
37 | "provisional": "Provisional",
38 | "total": "Total",
39 | "increment-today": "(Today)",
40 | "increment-yesterday": "(Yesterday)",
41 | "daily": "Daily",
42 | "7-day-average": "7-day average",
43 | "daily-trend": "Daily trend",
44 | "see-all-prefectures": "See all prefectures",
45 | "cruise-passengers-explanation": "Cruise crew and passengers are not included in totals.",
46 | "confirmed-chart-caption": "Daily new cases",
47 | "active-chart-caption": "Total active cases",
48 | "recovered-chart-caption": "Daily new recoveries",
49 | "deceased-chart-caption": "Daily new deaths",
50 | "tested-chart-caption": "Daily tests",
51 | "active-critical-percentage": "{{percent}}% are in critical condition.",
52 | "recovered-percentage": "{{percent}}% of total cases",
53 | "deceased-percentage": "{{percent}}% of total cases",
54 | "tested-percentage": "{{percent}}% of results are positive.",
55 | "active-cases": "Active cases",
56 | "no-active-cases": "No active cases 🎉",
57 | "time-period": "Time period",
58 | "all-time": "All time",
59 | "three-months": "3 months",
60 | "active-cases-description": "Total patients that are still currently testing positive for COVID-19. (Total confirmed cases minus total recovered cases).",
61 | "restrictions-link": "Find out about the most current travel restrictions for Foreign Nationals from the following:",
62 | "non-resident-restrictions": "All foreign tourists are barred from entering the country. Some business travel is allowed from select countries.",
63 | "pseudo-prefectures": {
64 | "port-of-entry": "Port of Entry",
65 | "unspecified": "Unspecified",
66 | "diamond-princess": "Diamond Princess Cruise Ship",
67 | "nagasaki-cruise": "Nagasaki Cruise Ship"
68 | },
69 | "prefectures": {
70 | "Aichi": "Aichi",
71 | "Akita": "Akita",
72 | "Aomori": "Aomori",
73 | "Chiba": "Chiba",
74 | "Ehime": "Ehime",
75 | "Fukui": "Fukui",
76 | "Fukuoka": "Fukuoka",
77 | "Fukushima": "Fukushima",
78 | "Gifu": "Gifu",
79 | "Gunma": "Gunma",
80 | "Hiroshima": "Hiroshima",
81 | "Hokkaido": "Hokkaido",
82 | "Hyogo": "Hyogo",
83 | "Ibaraki": "Ibaraki",
84 | "Ishikawa": "Ishikawa",
85 | "Iwate": "Iwate",
86 | "Kagawa": "Kagawa",
87 | "Kagoshima": "Kagoshima",
88 | "Kanagawa": "Kanagawa",
89 | "Kochi": "Kochi",
90 | "Kumamoto": "Kumamoto",
91 | "Kyoto": "Kyoto",
92 | "Mie": "Mie",
93 | "Miyagi": "Miyagi",
94 | "Miyazaki": "Miyazaki",
95 | "Nagano": "Nagano",
96 | "Nagasaki": "Nagasaki",
97 | "Nara": "Nara",
98 | "Niigata": "Niigata",
99 | "Oita": "Oita",
100 | "Okayama": "Okayama",
101 | "Okinawa": "Okinawa",
102 | "Osaka": "Osaka",
103 | "Saga": "Saga",
104 | "Saitama": "Saitama",
105 | "Shiga": "Shiga",
106 | "Shimane": "Shimane",
107 | "Shizuoka": "Shizuoka",
108 | "Tochigi": "Tochigi",
109 | "Tokushima": "Tokushima",
110 | "Tokyo": "Tokyo",
111 | "Tottori": "Tottori",
112 | "Toyama": "Toyama",
113 | "Wakayama": "Wakayama",
114 | "Yamagata": "Yamagata",
115 | "Yamaguchi": "Yamaguchi",
116 | "Yamanashi": "Yamanashi"
117 | },
118 | "regions": {
119 | "Kanto": "Kanto",
120 | "Kansai": "Kansai",
121 | "Kyushu": "Kyushu",
122 | "Chubu": "Chubu",
123 | "Chugoku": "Chugoku",
124 | "Hokkaido": "Hokkaido",
125 | "Tohoku": "Tohoku",
126 | "Shikoku": "Shikoku",
127 | "Other": "Other"
128 | },
129 | "countries": {
130 | "westerdam": "Westerdam (Cruise Ship)"
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/src/i18n/uk.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "Трекер Коронавірусу COVID-19 в Японії",
3 | "languages": "Мови:",
4 | "last-updated": "Останнє оновлення:",
5 | "kpi-active": "Активні",
6 | "kpi-active-tooltip": "Підтверджені випадки мінус одужали мінус померли",
7 | "kpi-critical": "Критичні",
8 | "kpi-deceased": "Померли",
9 | "kpi-tested": "Протестовано",
10 | "kpi-confirmed": "Підтверджені",
11 | "kpi-recovered": "Одужали",
12 | "covid-19": "COVID-19",
13 | "outbreak-map": "Мапа Осередків Інфекції",
14 | "cases-none": "0 випадків",
15 | "cases-range": "{{from}}-{{to}} випадків",
16 | "cases-last": "{{from}}+ випадків",
17 | "outbreak-spread-trend": "Всі Випадки",
18 | "new-cases-by-day": "Підтверджені Випадки за Добу",
19 | "top-prefectures": "Топ 10 Префектур",
20 | "active-regions": "Найбільш Активні Регіони",
21 | "prefecture-data": "Випадки по Префектурі",
22 | "prefecture": "Префектура",
23 | "confirmed": "Підтверджені",
24 | "recovered": "Одужали",
25 | "deaths": "Померли",
26 | "active": "Активні",
27 | "helpful-links": "Корисні Посилання",
28 | "primary-data-sources": "Основні Джерела Даних",
29 | "confirmed-case-trajectories-by-region": "Траєкторії Підтверджених Випадків по Регіону",
30 | "trajectory-description": "Кількість днів з {{minimumConfirmed}}-го випадку",
31 | "traveling-into-japan": "В'їзд в Японію",
32 | "about-travel-restriction": "Нижче наведено діючі обмеження на в'їзд в Японію. Клацніть на посилання, щоб отримати докладнішу інформацію про обмеження.",
33 | "banned-from-entering-japan": "Заборона на в'їзд в Японію:",
34 | "existing-visa-required": "Потрібна віза:",
35 | "14-day-self-quarantine-required": "Потрібна 14-денна самоізоляція:",
36 | "other-limitations": "Інші обмеження:",
37 | "provisional": "Тимчасові",
38 | "total": "Всього",
39 | "increment-today": "(Сьогодні)",
40 | "increment-yesterday": "(Вчора)",
41 | "daily": "За добу",
42 | "7-day-average": "Середня кількість за 7 днів",
43 | "daily-trend": "Добовий тренд",
44 | "see-all-prefectures": "Дивитись всі префектури",
45 | "cruise-passengers-explanation": "Екіпаж та пасажири круїзних лайнерів не включені в загальну статистику.",
46 | "confirmed-chart-caption": "Нові випадки за добу",
47 | "active-chart-caption": "Всього активних випадків",
48 | "recovered-chart-caption": "Нові одужання за добу",
49 | "deceased-chart-caption": "Нові смерті за добу",
50 | "tested-chart-caption": "Протестовано за добу",
51 | "active-critical-percentage": "{{percent}}% у критичному стані.",
52 | "recovered-percentage": "{{percent}}% від усіх випадків",
53 | "deceased-percentage": "{{percent}}% від усіх випадків",
54 | "tested-percentage": "{{percent}}% результатів позитивні.",
55 | "active-cases": "Активні випадки",
56 | "no-active-cases": "Немає акт. випадків 🎉",
57 | "time-period": "Період",
58 | "all-time": "Весь час",
59 | "three-months": "3 місяці",
60 | "active-cases-description": "Кількість COVID-19 - позитивних пацієнтів на даний момент. (Кількість підтверджених випадків мінус кількість одужань).",
61 | "restrictions-link": "Дізнайтесь про діючі обмеження на подорожі для іноземних громадян з наступних джерел:",
62 | "non-resident-restrictions": "Наразі діє заборона на в'їзд для всіх іноземних туристів. Бізнес-поїздки з деяких країн дозволяються.",
63 | "pseudo-prefectures": {
64 | "port-of-entry": "Прикордонний контроль",
65 | "unspecified": "Невизначено",
66 | "diamond-princess": "Круїзне Судно Diamond Princess",
67 | "nagasaki-cruise": "Круїзне Судно Nagasaki"
68 | },
69 | "prefectures": {
70 | "Aichi": "Айчі",
71 | "Akita": "Акіта",
72 | "Aomori": "Аоморі",
73 | "Chiba": "Чіба",
74 | "Ehime": "Ехіме",
75 | "Fukui": "Фукуй",
76 | "Fukuoka": "Фукуока",
77 | "Fukushima": "Фукушіма",
78 | "Gifu": "Ґіфу",
79 | "Gunma": "Ґунма",
80 | "Hiroshima": "Хірошіма",
81 | "Hokkaido": "Хоккайдо",
82 | "Hyogo": "Хьоґо",
83 | "Ibaraki": "Ібаракі",
84 | "Ishikawa": "Ішікава",
85 | "Iwate": "Івате",
86 | "Kagawa": "Каґава",
87 | "Kagoshima": "Каґошіма",
88 | "Kanagawa": "Канаґава",
89 | "Kochi": "Кочі",
90 | "Kumamoto": "Кумамото",
91 | "Kyoto": "Кіото",
92 | "Mie": "Міє",
93 | "Miyagi": "Міяґі",
94 | "Miyazaki": "Міядзакі",
95 | "Nagano": "Наґано",
96 | "Nagasaki": "Наґасакі",
97 | "Nara": "Нара",
98 | "Niigata": "Нііґата",
99 | "Oita": "Ойта",
100 | "Okayama": "Окаяма",
101 | "Okinawa": "Окінава",
102 | "Osaka": "Осака",
103 | "Saga": "Саґа",
104 | "Saitama": "Сайтама",
105 | "Shiga": "Шіґа",
106 | "Shimane": "Шімане",
107 | "Shizuoka": "Шідзуока",
108 | "Tochigi": "Точіґі",
109 | "Tokushima": "Токушіма",
110 | "Tokyo": "Токіо",
111 | "Tottori": "Тотторі",
112 | "Toyama": "Тояма",
113 | "Wakayama": "Вакаяма",
114 | "Yamagata": "Ямаґата",
115 | "Yamaguchi": "Ямаґучі",
116 | "Yamanashi": "Яманаші"
117 | },
118 | "regions": {
119 | "Kanto": "Канто",
120 | "Kansai": "Кансай",
121 | "Kyushu": "Кюшю",
122 | "Chubu": "Чубу",
123 | "Chugoku": "Чуґоку",
124 | "Hokkaido": "Хоккайдо",
125 | "Tohoku": "Тохоку",
126 | "Shikoku": "Шікоку",
127 | "Other": "Інші"
128 | },
129 | "countries": {
130 | "westerdam": "Westerdam (Круїзне Судно)"
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/src/i18n/it.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "Japan COVID-19 Coronavirus Tracker",
3 | "languages": "Lingue:",
4 | "last-updated": "Ultimo aggiornamento:",
5 | "kpi-active": "Attivi",
6 | "kpi-active-tooltip": "Casi confermati meno i guarti e i morti",
7 | "kpi-critical": "in stato Critico",
8 | "kpi-deceased": "Morti",
9 | "kpi-tested": "Testati",
10 | "kpi-confirmed": "Confermati",
11 | "kpi-recovered": "Guariti",
12 | "covid-19": "COVID-19",
13 | "outbreak-map": "Mappa della pandemia",
14 | "cases-none": "0 casi",
15 | "cases-range": "{{from}}-{{to}} casi",
16 | "cases-last": "{{from}}+ casi",
17 | "outbreak-spread-trend": "Casi totali",
18 | "new-cases-by-day": "Casi confermati giornalieri",
19 | "top-prefectures": "Classifica delle 10 Prefetture",
20 | "prefecture-data": "Casi per Prefettura",
21 | "prefecture": "Prefettura",
22 | "active-regions": "Regioni con più casi attivi",
23 | "confirmed": "Confermati",
24 | "recovered": "Guariti",
25 | "deaths": "Decessi",
26 | "active": "Attivi",
27 | "helpful-links": "Collegamenti utili",
28 | "primary-data-sources": "Fonti Principali dei dati",
29 | "confirmed-case-trajectories-by-region": "Curva dei casi confermati per Regione",
30 | "trajectory-description": "Numero dei giorni dal {{minimumConfirmed}}esimo caso",
31 | "traveling-into-japan": "Viaggiare in Giappone",
32 | "about-travel-restriction": "Seguono le restrizioni messe in atto riguardante il viaggiare in Giappone. Clicca sui link per saperne di più.",
33 | "banned-from-entering-japan": "Ingresso bannato in Giappone:",
34 | "existing-visa-required": "Visto attualmente attivo ed esistente:",
35 | "14-day-self-quarantine-required": "14-giorni di Auto Quarantena necessari:",
36 | "other-limitations": "Altre limitazioni:",
37 | "provisional": "Provvisionale",
38 | "total": "Totale",
39 | "increment-today": "(Oggi)",
40 | "increment-yesterday": "(Ieri)",
41 | "daily": "Giornalmente",
42 | "7-day-average": "Media di 7 giorni",
43 | "daily-trend": "Trend giornaliero",
44 | "see-all-prefectures": "Mostra tutte le prefetture",
45 | "cruise-passengers-explanation": "Equipaggio della nave e passeggieri non sono inclusi nel totale.",
46 | "confirmed-chart-caption": "Nuovi casi giornalieri",
47 | "active-chart-caption": "Totale dei casi attivi",
48 | "recovered-chart-caption": "Nuove guarigioni giornaliere",
49 | "deceased-chart-caption": "Nuovi decessi giornalieri",
50 | "tested-chart-caption": "Test giornalieri",
51 | "active-critical-percentage": "{{percent}}% in condizioni critiche.",
52 | "recovered-percentage": "{{percent}}% dei casi totali",
53 | "deceased-percentage": "{{percent}}% dei casi totali",
54 | "tested-percentage": "{{percent}}% dei testati sono positivi.",
55 | "active-cases": "Casi attivi",
56 | "no-active-cases": "Nessun caso attivo 🎉",
57 | "time-period": "Periodo",
58 | "all-time": "Complessivo",
59 | "three-months": "3 mesi",
60 | "active-cases-description": "Totale dei pazienti attualmente positivi al COVID-19. (Totale dei casi confermati meno il totale di quelli guariti).",
61 | "restrictions-link": "Find out about the most current travel restrictions for Foreign Nationals from the following:",
62 | "non-resident-restrictions": "All foreign tourists are barred from entering the country. Some business travel is allowed from select countries.",
63 | "pseudo-prefectures": {
64 | "port-of-entry": "Porto di entrata",
65 | "unspecified": "Non specificato",
66 | "diamond-princess": "Diamond Princess - nave da crociera",
67 | "nagasaki-cruise": "Nagasaki - nave da crociera"
68 | },
69 | "prefectures": {
70 | "Aichi": "Aichi",
71 | "Akita": "Akita",
72 | "Aomori": "Aomori",
73 | "Chiba": "Chiba",
74 | "Ehime": "Ehime",
75 | "Fukui": "Fukui",
76 | "Fukuoka": "Fukuoka",
77 | "Fukushima": "Fukushima",
78 | "Gifu": "Gifu",
79 | "Gunma": "Gunma",
80 | "Hiroshima": "Hiroshima",
81 | "Hokkaido": "Hokkaido",
82 | "Hyogo": "Hyogo",
83 | "Ibaraki": "Ibaraki",
84 | "Ishikawa": "Ishikawa",
85 | "Iwate": "Iwate",
86 | "Kagawa": "Kagawa",
87 | "Kagoshima": "Kagoshima",
88 | "Kanagawa": "Kanagawa",
89 | "Kochi": "Kochi",
90 | "Kumamoto": "Kumamoto",
91 | "Kyoto": "Kyoto",
92 | "Mie": "Mie",
93 | "Miyagi": "Miyagi",
94 | "Miyazaki": "Miyazaki",
95 | "Nagano": "Nagano",
96 | "Nagasaki": "Nagasaki",
97 | "Nara": "Nara",
98 | "Niigata": "Niigata",
99 | "Oita": "Oita",
100 | "Okayama": "Okayama",
101 | "Okinawa": "Okinawa",
102 | "Osaka": "Osaka",
103 | "Saga": "Saga",
104 | "Saitama": "Saitama",
105 | "Shiga": "Shiga",
106 | "Shimane": "Shimane",
107 | "Shizuoka": "Shizuoka",
108 | "Tochigi": "Tochigi",
109 | "Tokushima": "Tokushima",
110 | "Tokyo": "Tokyo",
111 | "Tottori": "Tottori",
112 | "Toyama": "Toyama",
113 | "Wakayama": "Wakayama",
114 | "Yamagata": "Yamagata",
115 | "Yamaguchi": "Yamaguchi",
116 | "Yamanashi": "Yamanashi"
117 | },
118 | "regions": {
119 | "Kanto": "Kanto",
120 | "Kansai": "Kansai",
121 | "Kyushu": "Kyushu",
122 | "Chubu": "Chubu",
123 | "Chugoku": "Chugoku",
124 | "Hokkaido": "Hokkaido",
125 | "Tohoku": "Tohoku",
126 | "Shikoku": "Shikoku",
127 | "Other": "Altro"
128 | },
129 | "countries": {
130 | "westerdam": "Westerdam (nave da crociera)"
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/src/i18n/id.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "Pelacak Virus Corona COVID-19 di Jepang",
3 | "languages": "Bahasa:",
4 | "last-updated": "Terakhir Diperbarui:",
5 | "kpi-active": "Aktif",
6 | "kpi-active-tooltip": "Kasus terkonfirmasi di luar kasus sembuh dan meninggal",
7 | "kpi-critical": "Kritis",
8 | "kpi-deceased": "Kematian",
9 | "kpi-tested": "Dites",
10 | "kpi-confirmed": "Terkonfirmasi",
11 | "kpi-recovered": "Sembuh",
12 | "covid-19": "COVID-19",
13 | "outbreak-map": "Peta Sebaran Wabah",
14 | "cases-none": "0 kasus",
15 | "cases-range": "{{from}}-{{to}} kasus",
16 | "cases-last": "{{from}}+ kasus",
17 | "cases": "kasus",
18 | "outbreak-spread-trend": "Total Kasus",
19 | "new-cases-by-day": "Kasus Terkonfirmasi Harian",
20 | "top-prefectures": "10 Prefektur Teratas",
21 | "active-regions": "Wilayah Paling Aktif",
22 | "prefecture-data": "Kasus per Prefektur",
23 | "prefecture": "Prefektur",
24 | "confirmed": "Terkonfirmasi",
25 | "recovered": "Sembuh",
26 | "deaths": "Kematian",
27 | "active": "Aktif",
28 | "helpful-links": "Tautan Berguna",
29 | "primary-data-sources": "Sumber Data Utama",
30 | "confirmed-case-trajectories-by-region": "Kurva Kasus Terkonfirmasi Per Wilayah",
31 | "trajectory-description": "Jumlah hari sejak kasus ke-{{minimumConfirmed}}",
32 | "traveling-into-japan": "Bepergian ke Jepang",
33 | "about-travel-restriction": "Di bawah ini adalah daftar negara yang dikenakan pembatasan perjalanan ke Jepang. Klik tautan untuk rincian lebih lanjut tentang pembatasan.",
34 | "banned-from-entering-japan": "Dilarang masuk ke Jepang:",
35 | "existing-visa-required": "Visa eksisting dibutuhkan:",
36 | "14-day-self-quarantine-required": "Harus karantina mandiri delama 14 hari:",
37 | "other-limitations": "Pembatasan lainnya:",
38 | "provisional": "Sementara",
39 | "total": "Total",
40 | "increment-today": "(Hari Ini)",
41 | "increment-yesterday": "(Kemarin)",
42 | "daily": "Harian",
43 | "7-day-average": "Rata-rata dalam 7 hari",
44 | "daily-trend": "Tren harian",
45 | "see-all-prefectures": "Lihat semua prefektur",
46 | "cruise-passengers-explanation": "Awak dan penumpang kapal pesiar tidak termasuk dalam angka total.",
47 | "confirmed-chart-caption": "Kasus baru harian",
48 | "active-chart-caption": "Total kasus aktif",
49 | "recovered-chart-caption": "Kasus sembuh harian",
50 | "deceased-chart-caption": "Kasus kematian harian",
51 | "tested-chart-caption": "Jumlah tes harian",
52 | "active-critical-percentage": "{{percent}}% kasus dalam kondisi kritis.",
53 | "recovered-percentage": "{{percent}}% dari total kasus",
54 | "deceased-percentage": "{{percent}}% dari total kasus",
55 | "tested-percentage": "{{percent}}% dari hasil tes adalah positif",
56 | "active-cases": "Kasus aktif",
57 | "no-active-cases": "Tidak ada kasus aktif 🎉",
58 | "time-period": "Periode waktu",
59 | "all-time": "Sepanjang waktu",
60 | "three-months": "3 bulan",
61 | "active-cases-description": "Total pasien saat ini dengan hasil tes COVID-19 positif. (Jumlah kasus terkonfirmasi dikurangi total kasus sembuh).",
62 | "restrictions-link": "Cari tahu tentang pembatasan perjalanan paling terkini untuk Warga Negara Asing dari sumber berikut:",
63 | "non-resident-restrictions": "Seluruh turis asing dilarang masuk ke Jepang. Hanya beberapa macam perjalanan bisnis dari negara pilihan yang diperbolehkan.",
64 | "pseudo-prefectures": {
65 | "port-of-entry": "Titik Masuk Pelabuhan",
66 | "unspecified": "Tidak dispesifikasi",
67 | "diamond-princess": "Kapal Pesiar Diamond Princess",
68 | "nagasaki-cruise": "Kapan Pesiar Nagasaki"
69 | },
70 | "prefectures": {
71 | "Aichi": "Aichi",
72 | "Akita": "Akita",
73 | "Aomori": "Aomori",
74 | "Chiba": "Chiba",
75 | "Ehime": "Ehime",
76 | "Fukui": "Fukui",
77 | "Fukuoka": "Fukuoka",
78 | "Fukushima": "Fukushima",
79 | "Gifu": "Gifu",
80 | "Gunma": "Gunma",
81 | "Hiroshima": "Hiroshima",
82 | "Hokkaido": "Hokkaido",
83 | "Hyogo": "Hyogo",
84 | "Ibaraki": "Ibaraki",
85 | "Ishikawa": "Ishikawa",
86 | "Iwate": "Iwate",
87 | "Kagawa": "Kagawa",
88 | "Kagoshima": "Kagoshima",
89 | "Kanagawa": "Kanagawa",
90 | "Kochi": "Kochi",
91 | "Kumamoto": "Kumamoto",
92 | "Kyoto": "Kyoto",
93 | "Mie": "Mie",
94 | "Miyagi": "Miyagi",
95 | "Miyazaki": "Miyazaki",
96 | "Nagano": "Nagano",
97 | "Nagasaki": "Nagasaki",
98 | "Nara": "Nara",
99 | "Niigata": "Niigata",
100 | "Oita": "Oita",
101 | "Okayama": "Okayama",
102 | "Okinawa": "Okinawa",
103 | "Osaka": "Osaka",
104 | "Saga": "Saga",
105 | "Saitama": "Saitama",
106 | "Shiga": "Shiga",
107 | "Shimane": "Shimane",
108 | "Shizuoka": "Shizuoka",
109 | "Tochigi": "Tochigi",
110 | "Tokushima": "Tokushima",
111 | "Tokyo": "Tokyo",
112 | "Tottori": "Tottori",
113 | "Toyama": "Toyama",
114 | "Wakayama": "Wakayama",
115 | "Yamagata": "Yamagata",
116 | "Yamaguchi": "Yamaguchi",
117 | "Yamanashi": "Yamanashi"
118 | },
119 | "regions": {
120 | "Kanto": "Kanto",
121 | "Kansai": "Kansai",
122 | "Kyushu": "Kyushu",
123 | "Chubu": "Chubu",
124 | "Chugoku": "Chugoku",
125 | "Hokkaido": "Hokkaido",
126 | "Tohoku": "Tohoku",
127 | "Shikoku": "Shikoku",
128 | "Other": "Lainnya"
129 | },
130 | "countries": {
131 | "westerdam": "Westerdam (Kapal Pesiar)"
132 | }
133 | }
134 |
--------------------------------------------------------------------------------
/src/i18n/ru.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "График распространения коронавируса COVID-19 в Японии",
3 | "languages": "Языки:",
4 | "last-updated": "Последнее обновление:",
5 | "kpi-active": "Активных",
6 | "kpi-active-tooltip": "Кол-во подтверждённых случаев минус кол-во выздоровевшие и скончавшиеся",
7 | "kpi-critical": "Критичных",
8 | "kpi-deceased": "Скончалось",
9 | "kpi-tested": "Протестировано",
10 | "kpi-confirmed": "Подтверждено",
11 | "kpi-recovered": "Выздоровело",
12 | "covid-19": "COVID-19",
13 | "outbreak-map": "Карта распространения",
14 | "cases-none": "Нет случаев",
15 | "cases-range": "{{from}}-{{to}} случаев",
16 | "cases-last": "{{from}}+ случаев",
17 | "outbreak-spread-trend": "Всего случаев",
18 | "new-cases-by-day": "Число ежедневно подтвержденных случаев",
19 | "top-prefectures": "Топ 10 префектур",
20 | "active-regions": "Наиболее активные регионы",
21 | "prefecture-data": "Случаев по префектурам",
22 | "prefecture": "Префектура",
23 | "confirmed": "Подтверждено",
24 | "recovered": "Выздоровело",
25 | "deaths": "Скончалось",
26 | "active": "Активных",
27 | "helpful-links": "Полезные ссылки",
28 | "primary-data-sources": "Основые источники данных",
29 | "confirmed-case-trajectories-by-region": "Подтвержденные случаи по регионам",
30 | "trajectory-description": "Кол-во дней после {{minimumConfirmed}}-го случая",
31 | "traveling-into-japan": "Поездки в Японию",
32 | "about-travel-restriction": "Ниже приведены ограничения на поездки в Японию. Перейдите по ссылке чтобы, получить больше информации об ограничениях.",
33 | "banned-from-entering-japan": "Запрещен въезд в Японию:",
34 | "existing-visa-required": "Необходима существующая виза:",
35 | "14-day-self-quarantine-required": "Необходима 14-дневная самоизоляция:",
36 | "other-limitations": "Другие ограничения:",
37 | "provisional": "На данный момент",
38 | "total": "Всего",
39 | "increment-today": "(Сегодня)",
40 | "increment-yesterday": "(Вчера)",
41 | "daily": "За день",
42 | "7-day-average": "Среднее кол-во за 7 дней",
43 | "daily-trend": "Дневная динамика",
44 | "see-all-prefectures": "Смотреть все префектуры",
45 | "cruise-passengers-explanation": "Члены экипажа и пассажиры круизных лайнеров не включены в общую статистику.",
46 | "confirmed-chart-caption": "Новых случаев за сутки",
47 | "active-chart-caption": "Всего активных случаев",
48 | "recovered-chart-caption": "Новые выздоровления за сутки",
49 | "deceased-chart-caption": "Новые смерти за сутки",
50 | "tested-chart-caption": "Протестировано за сутки",
51 | "active-critical-percentage": "{{percent}}% в крит. состоянии.",
52 | "recovered-percentage": "{{percent}}% от всех случаев",
53 | "deceased-percentage": "{{percent}}% от всех случаев",
54 | "tested-percentage": "{{percent}}% от всех тестов положительные.",
55 | "active-cases": "Активных случаев",
56 | "no-active-cases": "Нет актив. случаев 🎉",
57 | "time-period": "Time period",
58 | "all-time": "All time",
59 | "three-months": "3 months",
60 | "active-cases-description": "Total patients that are still currently testing positive for COVID-19. (Total confirmed cases minus total recovered cases).",
61 | "restrictions-link": "Find out about the most current travel restrictions for Foreign Nationals from the following:",
62 | "non-resident-restrictions": "All foreign tourists are barred from entering the country. Some business travel is allowed from select countries.",
63 | "pseudo-prefectures": {
64 | "port-of-entry": "Пограничный контроль",
65 | "unspecified": "Не указано",
66 | "diamond-princess": "Круизное судно Diamond Princess",
67 | "nagasaki-cruise": "Круизное судно Nagasaki"
68 | },
69 | "prefectures": {
70 | "Aichi": "Айти",
71 | "Akita": "Акита",
72 | "Aomori": "Аомори",
73 | "Chiba": "Тиба",
74 | "Ehime": "Эхимэ",
75 | "Fukui": "Фукуи",
76 | "Fukuoka": "Фукуока",
77 | "Fukushima": "Фукусима",
78 | "Gifu": "Гифу",
79 | "Gunma": "Гумма",
80 | "Hiroshima": "Хиросима",
81 | "Hokkaido": "Хоккайдо",
82 | "Hyogo": "Хёго",
83 | "Ibaraki": "Ибараки",
84 | "Ishikawa": "Исикава",
85 | "Iwate": "Иватэ",
86 | "Kagawa": "Кагава",
87 | "Kagoshima": "Кагосима",
88 | "Kanagawa": "Канагава",
89 | "Kochi": "Коти",
90 | "Kumamoto": "Кумамото",
91 | "Kyoto": "Киото",
92 | "Mie": "Миэ",
93 | "Miyagi": "Мияги",
94 | "Miyazaki": "Миядзаки",
95 | "Nagano": "Нагано",
96 | "Nagasaki": "Нагасаки",
97 | "Nara": "Нара",
98 | "Niigata": "Ниигата",
99 | "Oita": "Оита",
100 | "Okayama": "Окаяма",
101 | "Okinawa": "Окинава",
102 | "Osaka": "Осака",
103 | "Saga": "Сага",
104 | "Saitama": "Сайтама",
105 | "Shiga": "Сига",
106 | "Shimane": "Симанэ",
107 | "Shizuoka": "Сидзуока",
108 | "Tochigi": "Тотиги",
109 | "Tokushima": "Токусима",
110 | "Tokyo": "Токио",
111 | "Tottori": "Тоттори",
112 | "Toyama": "Тояма",
113 | "Wakayama": "Вакаяма",
114 | "Yamagata": "Ямагата",
115 | "Yamaguchi": "Ямагути",
116 | "Yamanashi": "Яманаси"
117 | },
118 | "regions": {
119 | "Kanto": "Канто",
120 | "Kansai": "Кансай",
121 | "Kyushu": "Кюсю",
122 | "Chubu": "Тюбу",
123 | "Chugoku": "Тюгоку",
124 | "Hokkaido": "Хоккайдо",
125 | "Tohoku": "Тохоку",
126 | "Shikoku": "Сикоку",
127 | "Other": "Другие"
128 | },
129 | "countries": {
130 | "westerdam": "Вестердам (Круизное судно)"
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/src/i18n/es.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "Seguimiento del coronavirus (COVID-19) en Japón",
3 | "languages": "Idiomas:",
4 | "last-updated": "Última actualización:",
5 | "kpi-active": "Activos",
6 | "kpi-active-tooltip": "Casos confirmados menos recuperados y fallecidos",
7 | "kpi-critical": "En condición crítica",
8 | "kpi-deceased": "Defunciones",
9 | "kpi-tested": "Analizados",
10 | "kpi-confirmed": "Confirmados",
11 | "kpi-recovered": "Recuperados",
12 | "covid-19": "COVID-19",
13 | "outbreak-map": "Mapa de brotes",
14 | "cases-none": "0 casos",
15 | "cases-range": "{{from}}-{{to}} casos",
16 | "cases-last": "{{from}}+ casos",
17 | "outbreak-spread-trend": "Total de casos",
18 | "new-cases-by-day": "Nuevos casos diarios",
19 | "top-prefectures": "Top 10 prefecturas",
20 | "active-regions": "Regiones más afectadas",
21 | "prefecture-data": "Datos por prefectura",
22 | "prefecture": "Prefectura",
23 | "confirmed": "Confirmados",
24 | "recovered": "Recuperados",
25 | "deaths": "Defunciones",
26 | "active": "Activos",
27 | "helpful-links": "Enlaces útiles",
28 | "primary-data-sources": "Fuentes de datos primarios",
29 | "confirmed-case-trajectories-by-region": "Trayectoria de casos confirmados por región",
30 | "trajectory-description": "Número de días desde el caso {{minimumConfirmed}}",
31 | "traveling-into-japan": "Viajar a Japón",
32 | "about-travel-restriction": "A continuación se detallan las restricciones de viaje que se han establecido para viajar a Japón. Haga clic en el enlace para obtener más detalles sobre las restricciones.",
33 | "banned-from-entering-japan": "Prohibido ingresar a Japón:",
34 | "existing-visa-required": "Se necesita visa:",
35 | "14-day-self-quarantine-required": "Es obligatoria la autocuarentena de 14 días:",
36 | "other-limitations": "Otras limitaciones:",
37 | "provisional": "Provisional",
38 | "total": "Total",
39 | "increment-today": "Hoy",
40 | "increment-yesterday": "Ayer",
41 | "daily": "Diarios",
42 | "7-day-average": "Media semanal",
43 | "daily-trend": "Tendencia diaria",
44 | "see-all-prefectures": "Ver todas las prefecturas",
45 | "cruise-passengers-explanation": "La tripulación de crucero y los pasajeros no están incluidos en los totales.",
46 | "confirmed-chart-caption": "Nuevos casos diarios",
47 | "active-chart-caption": "Total de casos activos",
48 | "recovered-chart-caption": "Nuevas recuperaciones diarias",
49 | "deceased-chart-caption": "Nuevas muertes diarias",
50 | "tested-chart-caption": "Pruebas diarias",
51 | "active-critical-percentage": "{{percent}}% en condición crítica",
52 | "recovered-percentage": "{{percent}}% del total de casos",
53 | "deceased-percentage": "{{percent}}% del total de casos",
54 | "tested-percentage": "{{percent}}% de resultados positivos",
55 | "active-cases": "Casos activos",
56 | "no-active-cases": "No hay casos activos 🎉",
57 | "time-period": "Período",
58 | "all-time": "completo",
59 | "three-months": "3 meses",
60 | "active-cases-description": "Total de pacientes que aún dan positivo por COVID-19 (total de casos confirmados menos recuperados y fallecidos).",
61 | "restrictions-link": "A continuación, la información más reciente sobre las restricciones de viaje que se aplican a los ciudadanos extranjeros:",
62 | "non-resident-restrictions": "A todos los turistas extranjeros se les prohíbe entrar al país. Se permiten algunos viajes de negocios desde ciertos países.",
63 | "pseudo-prefectures": {
64 | "port-of-entry": "Puerto de entrada",
65 | "unspecified": "No especificado",
66 | "diamond-princess": "Crucero Diamond Princess",
67 | "nagasaki-cruise": "Crucero Nagasaki"
68 | },
69 | "prefectures": {
70 | "Aichi": "Aichi",
71 | "Akita": "Akita",
72 | "Aomori": "Aomori",
73 | "Chiba": "Chiba",
74 | "Ehime": "Ehime",
75 | "Fukui": "Fukui",
76 | "Fukuoka": "Fukuoka",
77 | "Fukushima": "Fukushima",
78 | "Gifu": "Gifu",
79 | "Gunma": "Gunma",
80 | "Hiroshima": "Hiroshima",
81 | "Hokkaido": "Hokkaido",
82 | "Hyogo": "Hyogo",
83 | "Ibaraki": "Ibaraki",
84 | "Ishikawa": "Ishikawa",
85 | "Iwate": "Iwate",
86 | "Kagawa": "Kagawa",
87 | "Kagoshima": "Kagoshima",
88 | "Kanagawa": "Kanagawa",
89 | "Kochi": "Kochi",
90 | "Kumamoto": "Kumamoto",
91 | "Kyoto": "Kioto",
92 | "Mie": "Mie",
93 | "Miyagi": "Miyagi",
94 | "Miyazaki": "Miyazaki",
95 | "Nagano": "Nagano",
96 | "Nagasaki": "Nagasaki",
97 | "Nara": "Nara",
98 | "Niigata": "Niigata",
99 | "Oita": "Oita",
100 | "Okayama": "Okayama",
101 | "Okinawa": "Okinawa",
102 | "Osaka": "Osaka",
103 | "Saga": "Saga",
104 | "Saitama": "Saitama",
105 | "Shiga": "Shiga",
106 | "Shimane": "Shimane",
107 | "Shizuoka": "Shizuoka",
108 | "Tochigi": "Tochigi",
109 | "Tokushima": "Tokushima",
110 | "Tokyo": "Tokio",
111 | "Tottori": "Tottori",
112 | "Toyama": "Toyama",
113 | "Wakayama": "Wakayama",
114 | "Yamagata": "Yamagata",
115 | "Yamaguchi": "Yamaguchi",
116 | "Yamanashi": "Yamanashi"
117 | },
118 | "regions": {
119 | "Kanto": "Kanto",
120 | "Kansai": "Kansai",
121 | "Kyushu": "Kyushu",
122 | "Chubu": "Chubu",
123 | "Chugoku": "Chugoku",
124 | "Hokkaido": "Hokkaido",
125 | "Tohoku": "Tohoku",
126 | "Shikoku": "Shikoku",
127 | "Other": "Otras"
128 | },
129 | "countries": {
130 | "westerdam": "Westerdam (crucero)"
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/src/i18n/np.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "जापान कोभिड-१९ कोरोनाभाइरस अभिलेख",
3 | "languages": "भाषाहरू :",
4 | "last-updated": "पछिल्लो अपडेट :",
5 | "kpi-active": "सक्रिय",
6 | "kpi-active-tooltip": "निको भएको र मृत बाहेक सक्रिय संक्रमित",
7 | "kpi-critical": "गम्भीर",
8 | "kpi-deceased": "मृत्यु",
9 | "kpi-tested": "परीक्षण गरिएको",
10 | "kpi-confirmed": "पुष्टि भएको",
11 | "kpi-recovered": "निको भएको",
12 | "covid-19": "कोभिड-१९",
13 | "outbreak-map": "प्रकोप मानचित्र",
14 | "cases-none": "शुन्य संक्रमित",
15 | "cases-range": "{{from}}-{{to}} संक्रमित",
16 | "cases-last": "{{from}}+ संक्रमित",
17 | "outbreak-spread-trend": "कुल संक्रमित",
18 | "new-cases-by-day": "दैनिक पुष्टि भएको",
19 | "top-prefectures": "शीर्ष १० प्रान्तहरू",
20 | "active-regions": "अधिक संक्रमित क्षेत्रहरू",
21 | "prefecture-data": "प्रान्त अनुसार",
22 | "prefecture": "प्रान्त",
23 | "confirmed": "पुष्टि भएको",
24 | "recovered": "निको भएको",
25 | "deaths": "मृत्यु",
26 | "active": "सक्रिय",
27 | "helpful-links": "उपयोगी लिङ्कहरू",
28 | "primary-data-sources": "प्राथमिक तथ्याङ्क स्रोतहरू",
29 | "confirmed-case-trajectories-by-region": "क्षेत्र अनुसार पुष्टि भएका प्रक्षेप-पथहरू",
30 | "trajectory-description": "{{minimumConfirmed}}औं संक्रमण देखिएपछि आजसम्मको दिन",
31 | "traveling-into-japan": "जापान यात्रा सम्बन्धि",
32 | "about-travel-restriction": "तल यात्रा प्रतिबन्धहरू दिइएको छ, जुन जापान यात्राको सम्बन्धमा राखिएको छ। प्रतिबन्धहरूको थप विवरणहरूको लागि लिङ्कमा क्लिक गर्नुहोस्।",
33 | "banned-from-entering-japan": "जापान प्रवेश गर्न प्रतिबन्धित :",
34 | "existing-visa-required": "अवस्थित भिसा आवश्यक :",
35 | "14-day-self-quarantine-required": "१४ दिन क्वारेन्टाइन आवश्यक:",
36 | "other-limitations": "अन्य सीमितता :",
37 | "provisional": "अस्थायी",
38 | "total": "कुल",
39 | "increment-today": "(आज)",
40 | "increment-yesterday": "(हिजो)",
41 | "daily": "दैनिक",
42 | "7-day-average": "साप्ताहिक औसत",
43 | "daily-trend": "दैनिक प्रवृति",
44 | "see-all-prefectures": "सबै प्रान्तहरू हेर्नुहोस्",
45 | "cruise-passengers-explanation": "क्रूज चालकदल र यात्रुहरू कुलसंख्यामा समावेश गरिएको छैन।",
46 | "confirmed-chart-caption": "दैनिक नयाँ संख्या",
47 | "active-chart-caption": "कुल सक्रिय संख्या",
48 | "recovered-chart-caption": "दैनिक निको भएको संख्या",
49 | "deceased-chart-caption": "दैनिक मृत्यु संख्या",
50 | "tested-chart-caption": "परिक्षण गरिएको संख्या",
51 | "active-critical-percentage": "{{percent}}% गम्भीर स्थीतीका बिरामीहरु.",
52 | "recovered-percentage": "कुल संक्रमित बाट {{percent}}%",
53 | "deceased-percentage": "कुल संक्रमित बाट {{percent}}%",
54 | "tested-percentage": "संक्रमण देखिएको{{percent}}%.",
55 | "active-cases": "संक्रमित संख्या",
56 | "no-active-cases": "शुन्य संक्रमित 🎉",
57 | "time-period": "समय अवधि",
58 | "all-time": "अहिले सम्मकै",
59 | "three-months": "३ महिना",
60 | "active-cases-description": "कुल बिरामीहरू जो अहिले कोभिड-१९ संक्रमित छन । (निको भएको बाहेक कुल पुष्टि भएको)",
61 | "restrictions-link": "विदेशी नागरिकहरूको लागि सबैभन्दा पछिल्लो यात्रा प्रतिबन्धहरूको बारेमा तल हेर्नुहोस् :",
62 | "non-resident-restrictions": "सबै विदेशी पर्यटक देश प्रवेश गर्न प्रतिबन्धित छन्। केहि देशहरु बाट व्यापार यात्राका लागि अनुमति छ।",
63 | "pseudo-prefectures": {
64 | "port-of-entry": "प्रवेश स्थाल",
65 | "unspecified": "अनिर्दिष्ट",
66 | "diamond-princess": "डाईमंड प्रिंसेस",
67 | "nagasaki-cruise": "नागासाकी पानीजहाज"
68 | },
69 | "prefectures": {
70 | "Aichi": "आइची",
71 | "Akita": "आकिता",
72 | "Aomori": "आओमोरि",
73 | "Chiba": "चीबा",
74 | "Ehime": "एहिमे",
75 | "Fukui": "फुकुई",
76 | "Fukuoka": "फुकुओका",
77 | "Fukushima": "फुकुशिमा",
78 | "Gifu": "गिफु",
79 | "Gunma": "गुनमा",
80 | "Hiroshima": "हिरोशिमा",
81 | "Hokkaido": "होक्काइदो",
82 | "Hyogo": "ह्योगो",
83 | "Ibaraki": "ईबाराकी",
84 | "Ishikawa": "इशिखावा",
85 | "Iwate": "इवाते",
86 | "Kagawa": "कागावा",
87 | "Kagoshima": "कागोशिमा",
88 | "Kanagawa": "खानागावा",
89 | "Kochi": "कोचि",
90 | "Kumamoto": "कुमामोतो",
91 | "Kyoto": "क्योतो",
92 | "Mie": "मेइ",
93 | "Miyagi": "मियागि",
94 | "Miyazaki": "मियाजाकी",
95 | "Nagano": "नागानो",
96 | "Nagasaki": "नागासाकी",
97 | "Nara": "नारा",
98 | "Niigata": "निगाता",
99 | "Oita": "ओईता",
100 | "Okayama": "ओकायामा",
101 | "Okinawa": "ओकिनावा",
102 | "Osaka": "ओसाका",
103 | "Saga": "सागा",
104 | "Saitama": "साईतामा",
105 | "Shiga": "शिगा",
106 | "Shimane": "शिमाने",
107 | "Shizuoka": "शिजुओका",
108 | "Tochigi": "टोचिगी",
109 | "Tokushima": "तोकुशिमा",
110 | "Tokyo": "टोकियो",
111 | "Tottori": "तोत्तोरि",
112 | "Toyama": "तोयामा",
113 | "Wakayama": "वाकायामा",
114 | "Yamagata": "यामागाता",
115 | "Yamaguchi": "यामागुची",
116 | "Yamanashi": "यामानाशी"
117 | },
118 | "regions": {
119 | "Kanto": "कन्तो",
120 | "Kansai": "कान्साई",
121 | "Kyushu": "क्यूशु",
122 | "Chubu": "च्यूबु",
123 | "Chugoku": "चुगोकु",
124 | "Hokkaido": "होक्काइदो",
125 | "Tohoku": "तोहोकु",
126 | "Shikoku": "सिकोकु",
127 | "Other": "अन्य"
128 | },
129 | "countries": {
130 | "westerdam": "वेस्टरडम (यात्रुबाहक पानीजहाज)"
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/src/i18n/ph.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "Tagasubaybay ng Japan COVID-19 Coronavirus",
3 | "languages": "Mga wika:",
4 | "last-updated": "Huling pagbabago:",
5 | "kpi-active": "Aktibo",
6 | "kpi-active-tooltip": "Kumpirmadong kaso bawas sa mga gumaling at namatay",
7 | "kpi-critical": "Malala",
8 | "kpi-deceased": "Patay",
9 | "kpi-tested": "Mga naiksamin",
10 | "kpi-confirmed": "Kumpirmado",
11 | "kpi-recovered": "Mga gumaling",
12 | "covid-19": "COVID-19",
13 | "outbreak-map": "Mapa ng pagsiklab ng kaso",
14 | "cases-none": "Walang mga kaso",
15 | "cases-range": "{{from}}-{{to}} kaso",
16 | "cases-last": "{{from}}+ kaso",
17 | "outbreak-spread-trend": "Mga Kabuuan kaso",
18 | "new-cases-by-day": "Kumpirmadong kaso",
19 | "top-prefectures": "10 Lalawigan na nasa tuktok",
20 | "active-regions": "Lugar na may maraming kaso",
21 | "prefecture-data": "Kaso ayon sa lalawigan",
22 | "prefecture": "Lalawigan",
23 | "confirmed": "Kumpirmado",
24 | "recovered": "Mga gumaling",
25 | "deaths": "Mga namatay",
26 | "active": "Aktibo",
27 | "helpful-links": "Mga nakakatulong na site",
28 | "primary-data-sources": "Pangunahing pinagkukunan ng datos",
29 | "confirmed-case-trajectories-by-region": "Kumpirmadong direksyon ng mga kaso ayon sa lugar",
30 | "trajectory-description": "Bilang ng araw na may {{minimumConfirmed}}th kaso",
31 | "traveling-into-japan": "Bumabiyahe sa Japan",
32 | "about-travel-restriction": "Nasa ibaba ang mga pinaghihigpit na paglalakbay sa Japan. Pumunta sa website para sa mas maraming detalye tungkol sa paghihigpit.",
33 | "banned-from-entering-japan": "Pinagbabawal na pumasok sa Japan:",
34 | "existing-visa-required": "Kailangan ng Bisa:",
35 | "14-day-self-quarantine-required": "Kailangan ng 14 na araw para sa Self-Quarantine:",
36 | "other-limitations": "Mga ibang limitasyon:",
37 | "provisional": "Pansamantala",
38 | "total": "Kabuuan",
39 | "increment-today": "(Ngayong araw)",
40 | "increment-yesterday": "(Kahapon)",
41 | "daily": "Pang araw-araw",
42 | "7-day-average": "Average sa 7 na araw",
43 | "daily-trend": "Pang araw-araw na trend",
44 | "see-all-prefectures": "Tingnan lahat ng lalawigan",
45 | "cruise-passengers-explanation": "Mga tripulante at sakay ng mga barkong panliwalil ay hindi kasali.",
46 | "confirmed-chart-caption": "Mga bagong pang araw-araw na kaso",
47 | "active-chart-caption": "Kabuuang aktibong kaso",
48 | "recovered-chart-caption": "Mga bagong pang araw-araw na gumaling",
49 | "deceased-chart-caption": "Mga bagong pang araw-araw na namatay",
50 | "tested-chart-caption": "Mga bagong pang araw-araw na na-iksamin",
51 | "active-critical-percentage": "{{percent}}% ay nasa malalang kondisyon.",
52 | "recovered-percentage": "{{percent}}% ng kabuuang kaso",
53 | "deceased-percentage": "{{percent}}% ng kabuuang kaso",
54 | "tested-percentage": "{{percent}}% ng resulta na positibo",
55 | "active-cases": "Aktibong kaso",
56 | "no-active-cases": "Walang aktibong kaso 🎉",
57 | "time-period": "Tagal ng panahon",
58 | "all-time": "Kabuuan",
59 | "three-months": "3 buwan",
60 | "active-cases-description": "Kabuuan pasyente na positibo sa COVID-19. (Kabuuan konpirmadong kaso bawas sa kabuuan kaso na gumaling).",
61 | "restrictions-link": "Hanapin sa baba ang may mga kasulukuyang may pinagbabawal na biyahe para sa mga dayuhan:",
62 | "non-resident-restrictions": "Bawal pumasok lahat ng mga dayuhang turista. Mga biyahe para sa negosyo ay pwede para sa mga ilang bansa lamang.",
63 | "pseudo-prefectures": {
64 | "port-of-entry": "Port ng Pagpasok",
65 | "unspecified": "Hindi tukoy",
66 | "diamond-princess": "Barkong panliwalil - Diamond Princess",
67 | "nagasaki-cruise": "Barkong panliwalil - Nagasaki"
68 | },
69 | "prefectures": {
70 | "Aichi": "Aichi",
71 | "Akita": "Akita",
72 | "Aomori": "Aomori",
73 | "Chiba": "Chiba",
74 | "Ehime": "Ehime",
75 | "Fukui": "Fukui",
76 | "Fukuoka": "Fukuoka",
77 | "Fukushima": "Fukushima",
78 | "Gifu": "Gifu",
79 | "Gunma": "Gunma",
80 | "Hiroshima": "Hiroshima",
81 | "Hokkaido": "Hokkaido",
82 | "Hyogo": "Hyogo",
83 | "Ibaraki": "Ibaraki",
84 | "Ishikawa": "Ishikawa",
85 | "Iwate": "Iwate",
86 | "Kagawa": "Kagawa",
87 | "Kagoshima": "Kagoshima",
88 | "Kanagawa": "Kanagawa",
89 | "Kochi": "Kochi",
90 | "Kumamoto": "Kumamoto",
91 | "Kyoto": "Kyoto",
92 | "Mie": "Mie",
93 | "Miyagi": "Miyagi",
94 | "Miyazaki": "Miyazaki",
95 | "Nagano": "Nagano",
96 | "Nagasaki": "Nagasaki",
97 | "Nara": "Nara",
98 | "Niigata": "Niigata",
99 | "Oita": "Oita",
100 | "Okayama": "Okayama",
101 | "Okinawa": "Okinawa",
102 | "Osaka": "Osaka",
103 | "Saga": "Saga",
104 | "Saitama": "Saitama",
105 | "Shiga": "Shiga",
106 | "Shimane": "Shimane",
107 | "Shizuoka": "Shizuoka",
108 | "Tochigi": "Tochigi",
109 | "Tokushima": "Tokushima",
110 | "Tokyo": "Tokyo",
111 | "Tottori": "Tottori",
112 | "Toyama": "Toyama",
113 | "Wakayama": "Wakayama",
114 | "Yamagata": "Yamagata",
115 | "Yamaguchi": "Yamaguchi",
116 | "Yamanashi": "Yamanashi"
117 | },
118 | "regions": {
119 | "Kanto": "Kanto",
120 | "Kansai": "Kansai",
121 | "Kyushu": "Kyushu",
122 | "Chubu": "Chubu",
123 | "Chugoku": "Chugoku",
124 | "Hokkaido": "Hokkaido",
125 | "Tohoku": "Tohoku",
126 | "Shikoku": "Shikoku",
127 | "Other": "Mga iba"
128 | },
129 | "countries": {
130 | "westerdam": "Westerdam (Barkong panliwalil)"
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/src/i18n/fi.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "Japanin COVID-19 koronavirus-seuranta",
3 | "languages": "Kielet:",
4 | "last-updated": "Päivitetty viimeksi:",
5 | "kpi-active": "Aktiivisia",
6 | "kpi-active-tooltip": "Varmistetut tapaukset pois lukien toipuneet ja kuolleet",
7 | "kpi-critical": "Kriittisiä",
8 | "kpi-deceased": "Kuolleita",
9 | "kpi-tested": "Testattuja",
10 | "kpi-confirmed": "Varmistettuja",
11 | "kpi-recovered": "Toipuneita",
12 | "covid-19": "COVID-19",
13 | "outbreak-map": "Levinneisyyskartta",
14 | "cases-none": "Ei tapauksia",
15 | "cases-range": "{{from}}-{{to}} tapausta",
16 | "cases-last": "Yli {{from}} tapausta",
17 | "outbreak-spread-trend": "Tapauksia yhteensä",
18 | "new-cases-by-day": "Päivän varmistetut tapaukset",
19 | "top-prefectures": "Prefektuurien kymmenen kärki",
20 | "active-regions": "Aktiivisimmat alueet",
21 | "prefecture-data": "Tapauksia prefektuureittain",
22 | "prefecture": "Prefektuuri",
23 | "confirmed": "Varmistettuja",
24 | "recovered": "Toipuneita",
25 | "deaths": "Kuolleita",
26 | "active": "Aktiivisia",
27 | "helpful-links": "Hyödyllisiä linkkejä",
28 | "primary-data-sources": "Pääasialliset tietolähteet",
29 | "confirmed-case-trajectories-by-region": "Varmistettujen tapauksien kehitys alueittain",
30 | "trajectory-description": "Päivää {{minimumConfirmed}}. tapauksesta",
31 | "traveling-into-japan": "Matkustaminen Japaniin",
32 | "about-travel-restriction": "Alla on listattu Japaniin matkustamista kohtevia rajoituksia. Klikkaa linkkiä saadaksesi lisätietoa rajoituksista.",
33 | "banned-from-entering-japan": "Pääsy Japaniin kielletty:",
34 | "existing-visa-required": "Vaatii olemassaolevan viisumin:",
35 | "14-day-self-quarantine-required": "Pakollinen 14 päivän omaehtoinen karanteeni:",
36 | "other-limitations": "Muita rajoituksia:",
37 | "provisional": "Alustava",
38 | "total": "Yhteensä",
39 | "increment-today": "(Tänään)",
40 | "increment-yesterday": "(Eilen)",
41 | "daily": "Päiväkohtainen",
42 | "7-day-average": "7 päivän keskiarvo",
43 | "daily-trend": "Päivittäinen kehityssuunta",
44 | "see-all-prefectures": "Näytä kaikki prefektuurit",
45 | "cruise-passengers-explanation": "Risteilyalusten matkustajia ole laskettu mukaan kokonaisuuteen.",
46 | "confirmed-chart-caption": "Päivän uudet tapaukset",
47 | "active-chart-caption": "Aktiivisia tapauksia yhteensä",
48 | "recovered-chart-caption": "Päivän uudet toipumiset",
49 | "deceased-chart-caption": "Päivän uudet kuolemat",
50 | "tested-chart-caption": "Päivän testit",
51 | "active-critical-percentage": "{{percent}}% on kriittisessä tilassa.",
52 | "recovered-percentage": "{{percent}}% kaikista tapauksista",
53 | "deceased-percentage": "{{percent}}% kaikista tapauksista",
54 | "tested-percentage": "{{percent}}% positiivisia.",
55 | "active-cases": "Aktiivisia tapauksia",
56 | "no-active-cases": "Ei aktiivisia tapauksia 🎉",
57 | "time-period": "Aikaväli",
58 | "all-time": "Alusta alkaen",
59 | "three-months": "Viimeiset 3 kk",
60 | "active-cases-description": "COVID-19 -positiiviseksi testattuja tapauksia. (Varmistetut tapaukset pois lukien toipuneet ja kuolleet).",
61 | "active-cases-description": "Total patients that are still currently testing positive for COVID-19. (Total confirmed cases minus total recovered cases).",
62 | "restrictions-link": "Find out about the most current travel restrictions for Foreign Nationals from the following:",
63 | "non-resident-restrictions": "All foreign tourists are barred from entering the country. Some business travel is allowed from select countries.",
64 | "pseudo-prefectures": {
65 | "port-of-entry": "Tulosatama",
66 | "unspecified": "Määrittelemätön",
67 | "diamond-princess": "Diamond Princess risteilyalus",
68 | "nagasaki-cruise": "Nagasaki risteilyalus"
69 | },
70 | "prefectures": {
71 | "Aichi": "Aichi",
72 | "Akita": "Akita",
73 | "Aomori": "Aomori",
74 | "Chiba": "Chiba",
75 | "Ehime": "Ehime",
76 | "Fukui": "Fukui",
77 | "Fukuoka": "Fukuoka",
78 | "Fukushima": "Fukushima",
79 | "Gifu": "Gifu",
80 | "Gunma": "Gunma",
81 | "Hiroshima": "Hiroshima",
82 | "Hokkaido": "Hokkaidō",
83 | "Hyogo": "Hyōgo",
84 | "Ibaraki": "Ibaraki",
85 | "Ishikawa": "Ishikawa",
86 | "Iwate": "Iwate",
87 | "Kagawa": "Kagawa",
88 | "Kagoshima": "Kagoshima",
89 | "Kanagawa": "Kanagawa",
90 | "Kochi": "Kochi",
91 | "Kumamoto": "Kumamoto",
92 | "Kyoto": "Kioto",
93 | "Mie": "Mie",
94 | "Miyagi": "Miyagi",
95 | "Miyazaki": "Miyazaki",
96 | "Nagano": "Nagano",
97 | "Nagasaki": "Nagasaki",
98 | "Nara": "Nara",
99 | "Niigata": "Niigata",
100 | "Oita": "Ōita",
101 | "Okayama": "Okayama",
102 | "Okinawa": "Okinawa",
103 | "Osaka": "Osaka",
104 | "Saga": "Saga",
105 | "Saitama": "Saitama",
106 | "Shiga": "Shiga",
107 | "Shimane": "Shimane",
108 | "Shizuoka": "Shizuoka",
109 | "Tochigi": "Tochigi",
110 | "Tokushima": "Tokushima",
111 | "Tokyo": "Tokio",
112 | "Tottori": "Tottori",
113 | "Toyama": "Toyama",
114 | "Wakayama": "Wakayama",
115 | "Yamagata": "Yamagata",
116 | "Yamaguchi": "Yamaguchi",
117 | "Yamanashi": "Yamanashi"
118 | },
119 | "regions": {
120 | "Hokkaido": "Hokkaidō",
121 | "Tohoku": "Tōhoku",
122 | "Kanto": "Kantō",
123 | "Chubu": "Chūbu",
124 | "Kansai": "Kansai",
125 | "Chugoku": "Chūgoku",
126 | "Shikoku": "Shikoku",
127 | "Other": "Muut"
128 | },
129 | "countries": {
130 | "westerdam": "Westerdam (risteilyalus)"
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/src/components/OutbreakMap/DrawMapPrefectures.js:
--------------------------------------------------------------------------------
1 | import i18next from "i18next";
2 | import { maybeIntlNumberFormat } from "../../i18n";
3 | import { getPrefecturePaint } from "../../data/helper";
4 |
5 | const PREFECTURE_JSON_PATH = "static/prefectures-smooth.geojson";
6 | let pageDrawCount = 0;
7 |
8 | /**
9 | * drawMapPrefectures
10 | * @param {*} pageDraws - number of redraws to screen
11 | */
12 | const drawMapPrefectures = (ddb, map, lang) => {
13 | const formatNumber = maybeIntlNumberFormat(lang);
14 |
15 | // Find the index of the first symbol layer
16 | // in the map style so we can draw the
17 | // prefecture colors behind it
18 |
19 | let firstSymbolId;
20 | const { layers = [] } = map.getStyle();
21 | if (!layers) {
22 | return;
23 | }
24 |
25 | for (let i = 0; i < layers.length; i++) {
26 | if (layers[i].type === "symbol") {
27 | firstSymbolId = layers[i].id;
28 | break;
29 | }
30 | }
31 |
32 | // Start the Mapbox search expression
33 |
34 | const prefecturePaint = getPrefecturePaint(ddb.prefectures);
35 |
36 | if (pageDrawCount === 0) {
37 | pageDrawCount++;
38 | // If it is the first time drawing the map
39 | map.addSource("prefectures", {
40 | type: "geojson",
41 | data: PREFECTURE_JSON_PATH,
42 | generateId: true,
43 | });
44 |
45 | // Add the prefecture color layer to the map
46 | map.addLayer(
47 | {
48 | id: "prefecture-layer",
49 | type: "fill",
50 | source: "prefectures",
51 | layout: {},
52 | paint: {
53 | "fill-color": prefecturePaint,
54 | "fill-opacity": 0.8,
55 | },
56 | },
57 | firstSymbolId
58 | );
59 |
60 | // HIGHLIGHT PREFECTURE BOUNDARY
61 | map.addLayer({
62 | id: "prefecture-outline-layer",
63 | type: "line",
64 | source: "prefectures",
65 | layout: {},
66 | paint: {
67 | "line-width": [
68 | "interpolate",
69 | ["exponential", 2],
70 | ["zoom"],
71 | 3,
72 | 0.5,
73 | 7.5,
74 | 1.5,
75 | ],
76 | "line-dasharray": [2, 1],
77 | "line-color": "rgb(25,25,25)",
78 | "line-opacity": [
79 | "case",
80 | ["boolean", ["feature-state", "hover"], false],
81 | 1,
82 | 0.2,
83 | ],
84 | },
85 | });
86 | } else {
87 | // Update prefecture paint properties
88 | map.setPaintProperty("prefecture-layer", "fill-color", prefecturePaint);
89 | }
90 |
91 | // Map popup for prefectures
92 | const popup = new mapboxgl.Popup({
93 | closeButton: false,
94 | closeOnClick: false,
95 | offset: 25,
96 | className: "popup-content",
97 | });
98 |
99 | map.on("mousemove", function (e) {
100 | const feature = map.queryRenderedFeatures(e.point, {
101 | layers: ["prefecture-layer"],
102 | })[0];
103 | if (feature) {
104 | const matchingPrefectures = ddb.prefectures.filter((p) => {
105 | return p.name === feature.properties.name;
106 | });
107 |
108 | if (!matchingPrefectures || matchingPrefectures.length < 1) {
109 | return;
110 | }
111 |
112 | const thisPrefecture = matchingPrefectures[0];
113 | if (typeof thisPrefecture === "undefined") {
114 | return; // This happens if prefecture doesn't have any stats (e.g. Iwate)
115 | }
116 |
117 | let increment = thisPrefecture.newlyConfirmed;
118 | let popupIncrementSpan = "";
119 | if (increment > 0) {
120 | popupIncrementSpan = ``;
121 | }
122 |
123 | const prefectureStringId = `prefectures.${thisPrefecture.name}`;
124 | const prefectureName = i18next.t(prefectureStringId);
125 | const confirmed = formatNumber(thisPrefecture.confirmed);
126 | const deaths = formatNumber(thisPrefecture.deaths);
127 | const recovered = formatNumber(thisPrefecture.recovered);
128 | const active = formatNumber(thisPrefecture.active);
129 | const deathsLabel = i18next.t("deaths");
130 | const recoveredLabel = i18next.t("recovered");
131 | const confirmedLabel = i18next.t("confirmed");
132 | const activeLabel = i18next.t("active");
133 |
134 | const html = `
135 | `;
142 | popup.setLngLat(e.lngLat).setHTML(html).addTo(map);
143 | } else {
144 | popup.remove();
145 | }
146 | });
147 |
148 | var hoveredStateId = null;
149 |
150 | map.on("mousemove", "prefecture-layer", (e) => {
151 | map.setFeatureState(
152 | { source: "prefectures", id: hoveredStateId },
153 | { hover: false }
154 | );
155 | if (e.features.length > 0) {
156 | if (hoveredStateId) {
157 | map.setFeatureState(
158 | { source: "prefectures", id: hoveredStateId },
159 | { hover: false }
160 | );
161 | }
162 | hoveredStateId = e.features[0].id;
163 | map.setFeatureState(
164 | { source: "prefectures", id: hoveredStateId },
165 | { hover: true }
166 | );
167 | }
168 | });
169 |
170 | map.on("mouseleave", "prefecture-layer", (e) => {
171 | if (e) {
172 | map.setFeatureState(
173 | { source: "prefectures", id: hoveredStateId },
174 | { hover: false }
175 | );
176 | }
177 | hoveredStateId = null;
178 | });
179 |
180 | return { map, ddb };
181 | };
182 |
183 | export default drawMapPrefectures;
184 |
--------------------------------------------------------------------------------
/src/components/PrefectureTable/PrefectureTable.js:
--------------------------------------------------------------------------------
1 | import i18next from "i18next";
2 | import { maybeIntlNumberFormat } from "../../i18n";
3 |
4 | const prefectureId = (prefectureName) => {
5 | return prefectureName.toLowerCase().replace(/[\s]+/g, "_");
6 | };
7 |
8 | const prefectureTrendChartURL = (prefectureName) => {
9 | let filename = prefectureId(prefectureName);
10 | return `https://data.covid19japan.com/charts/${filename}.svg`;
11 | };
12 |
13 | const prefectureTableRow = (id) => {
14 | let row = document.createElement("tr");
15 | row.classList.add("prefecture-row");
16 | row.classList.add(id);
17 |
18 | for (let cellClass of [
19 | "prefecture",
20 | "trend",
21 | "confirmed",
22 | "delta",
23 | "recovered",
24 | "deceased",
25 | ]) {
26 | let cell = document.createElement("td");
27 | cell.classList.add(cellClass);
28 | row.appendChild(cell);
29 | }
30 |
31 | let deltaCell = row.querySelector(".delta");
32 | if (deltaCell) {
33 | deltaCell.innerHTML =
34 | '';
35 | }
36 | return row;
37 | };
38 |
39 | export const drawPrefectureTable = (
40 | prefectureTable,
41 | prefectures,
42 | totals,
43 | lang
44 | ) => {
45 | // Abort if prefectureTable is not accessible.
46 | if (!prefectureTable) {
47 | return;
48 | }
49 |
50 | const formatNumber = new Intl.NumberFormat(lang).format;
51 |
52 | // Check if prefectureTable needs any pseudo prefecture rows.
53 | const existingPrefectureRows = prefectureTable.querySelector(
54 | ".prefecture-rows"
55 | );
56 | const existingPseudoPrefectureRows = prefectureTable.querySelector(
57 | ".pseudo-prefecture-rows"
58 | );
59 | const existingCruiseRows = prefectureTable.querySelector(".cruise-rows");
60 | const existingTotalRows = prefectureTable.querySelector(".total-rows");
61 |
62 | // Special prefectures to handle when we iterate through them.
63 | const pseudoPrefectures = {
64 | Unspecified: {
65 | stringId: "pseudo-prefectures.unspecified",
66 | className: "Unspecified",
67 | rowGroup: "pseudo-prefecture",
68 | },
69 | "Port Quarantine": {
70 | stringId: "pseudo-prefectures.port-of-entry",
71 | className: "PortOfEntry",
72 | rowGroup: "pseudo-prefecture",
73 | },
74 | "Diamond Princess Cruise Ship": {
75 | stringId: "pseudo-prefectures.diamond-princess",
76 | className: "DiamondPrincess",
77 | rowGroup: "cruise",
78 | },
79 | "Nagasaki Cruise Ship": {
80 | stringId: "pseudo-prefectures.nagasaki-cruise",
81 | className: "NagasakiCruise",
82 | rowGroup: "cruise",
83 | },
84 | Total: {}, // Left blank so we can ignore it.
85 | };
86 |
87 | // Ensure data is present.
88 | prefectures.map((pref) => {
89 | pref.confirmed = pref.confirmed ? parseInt(pref.confirmed) : 0;
90 | pref.recovered = pref.recovered ? parseInt(pref.recovered) : 0;
91 | pref.deceased = pref.deceased ? parseInt(pref.deceased) : 0;
92 | });
93 |
94 | const prefectureRows = document.createElement("tbody");
95 | prefectureRows.classList.add("prefecture-rows");
96 |
97 | const pseudoPrefectureRows = document.createElement("tbody");
98 | pseudoPrefectureRows.classList.add("pseudo-prefecture-rows");
99 |
100 | const cruiseRows = document.createElement("tbody");
101 | cruiseRows.classList.add("cruise-rows");
102 |
103 | const rowGroups = {
104 | cruise: cruiseRows,
105 | "pseudo-prefecture": pseudoPrefectureRows,
106 | };
107 |
108 | let totalNewlyConfirmed = 0;
109 | let totalYesterdayConfirmed = 0;
110 |
111 | prefectures.map((pref, i) => {
112 | let rowId = `row${i}`;
113 | let row = prefectureTable.querySelector(`.${rowId}`);
114 | if (!row) {
115 | row = prefectureTableRow(rowId);
116 | }
117 |
118 | let stringId = `prefectures.${pref.name}`;
119 | let isPseudoPrefecture = pseudoPrefectures[pref.name];
120 | let trendURL = prefectureTrendChartURL(pref.name);
121 |
122 | let todayConfirmedString = "";
123 | let yesterdayConfirmedString = "";
124 | if (pref.newlyConfirmed > 0) {
125 | totalNewlyConfirmed += pref.newlyConfirmed;
126 | todayConfirmedString = `( +${formatNumber(
127 | pref.newlyConfirmed
128 | )} )`;
129 | }
130 | if (pref.yesterdayConfirmed > 0) {
131 | totalYesterdayConfirmed += pref.yesterdayConfirmed;
132 | yesterdayConfirmedString = `( +${formatNumber(
133 | pref.yesterdayConfirmed
134 | )} )`;
135 | }
136 |
137 | if (isPseudoPrefecture && !existingPseudoPrefectureRows) {
138 | return;
139 | }
140 |
141 | if (isPseudoPrefecture) {
142 | stringId = isPseudoPrefecture.stringId;
143 | }
144 |
145 | row.querySelector("td.prefecture").innerHTML = i18next.t(stringId);
146 | row.querySelector("td.prefecture").setAttribute("data-i18n", stringId);
147 | row.querySelector("td.confirmed").innerHTML = formatNumber(pref.confirmed);
148 | row.querySelector(".today").innerHTML = todayConfirmedString;
149 | row.querySelector(".yesterday").innerHTML = yesterdayConfirmedString;
150 | row.querySelector("td.recovered").innerHTML = formatNumber(pref.recovered);
151 | row.querySelector("td.deceased").innerHTML = formatNumber(pref.deceased);
152 |
153 | let trendCell = row.querySelector("td.trend");
154 | trendCell.innerHTML = `
`;
155 |
156 | if (isPseudoPrefecture) {
157 | rowGroups[isPseudoPrefecture.rowGroup].appendChild(row);
158 | } else {
159 | prefectureRows.appendChild(row);
160 | }
161 | });
162 |
163 | if (existingPrefectureRows) {
164 | prefectureTable.replaceChild(prefectureRows, existingPrefectureRows);
165 | }
166 |
167 | if (existingPseudoPrefectureRows) {
168 | prefectureTable.replaceChild(
169 | pseudoPrefectureRows,
170 | existingPseudoPrefectureRows
171 | );
172 | }
173 |
174 | if (existingCruiseRows) {
175 | prefectureTable.replaceChild(cruiseRows, existingCruiseRows);
176 | }
177 |
178 | if (existingTotalRows) {
179 | existingTotalRows.querySelector(".prefecture").innerHTML = i18next.t(
180 | "total"
181 | );
182 | existingTotalRows.querySelector(".confirmed").innerHTML = formatNumber(
183 | totals.confirmed
184 | );
185 | existingTotalRows.querySelector(".recovered").innerHTML = formatNumber(
186 | totals.recovered
187 | );
188 | existingTotalRows.querySelector(".deceased").innerHTML = formatNumber(
189 | totals.deceased
190 | );
191 | let todayConfirmedString = "";
192 | let yesterdayConfirmedString = "";
193 | if (totalNewlyConfirmed > 0) {
194 | todayConfirmedString = `( +${formatNumber(
195 | totalNewlyConfirmed
196 | )} )`;
197 | }
198 | if (totalYesterdayConfirmed > 0) {
199 | yesterdayConfirmedString = `( +${formatNumber(
200 | totalYesterdayConfirmed
201 | )} )`;
202 | }
203 | existingTotalRows.querySelector(".today").innerHTML = todayConfirmedString;
204 | existingTotalRows.querySelector(
205 | ".yesterday"
206 | ).innerHTML = yesterdayConfirmedString;
207 | }
208 |
209 | // Remove any loaders
210 | prefectureTable.classList.remove("loading");
211 | };
212 |
213 | export const drawAllPrefectureTable = (prefectures, totals, lang) => {
214 | let allPrefectureTable = document.querySelector("#prefectures-table");
215 | drawPrefectureTable(allPrefectureTable, prefectures, totals, lang);
216 | };
217 |
218 | export const drawTopPrefectureTable = (prefectures, totals, lang) => {
219 | let topPrefectureTable = document.querySelector("#top-prefectures-table");
220 | drawPrefectureTable(topPrefectureTable, prefectures, totals, lang);
221 | };
222 |
--------------------------------------------------------------------------------
/src/index.scss:
--------------------------------------------------------------------------------
1 | @import '../node_modules/tippy.js/dist/tippy.css';
2 | @import '../node_modules/c3/c3.min.css';
3 |
4 | @import 'src/colors';
5 | @import 'src/type';
6 | @import 'src/layout';
7 | @import 'src/loader';
8 |
9 | // Use border-box override for more simple box-sizing.
10 | * {
11 | box-sizing: border-box;
12 | }
13 |
14 | body {
15 | margin: 0px;
16 | font-family: 'Open Sans', helvetica, sans-serif;
17 | font-size: 16px;
18 | line-height: 1.4rem;
19 | color: $primary-black;
20 | background: $color-background;
21 | }
22 |
23 | body[data-direction=rtl] #page {
24 | direction: rtl;
25 | }
26 |
27 | #page, footer {
28 | max-width: $breakpoint-1200-page-width;
29 | margin: 0 auto;
30 | }
31 | @media (min-width: $breakpoint-960) and (max-width: $breakpoint-1200-less-than) {
32 | #page, footer { max-width: $breakpoint-960-page-width; }
33 | }
34 | @media (min-width: $breakpoint-600) and (max-width: $breakpoint-960-less-than) {
35 | #page, footer { max-width: $breakpoint-600-page-width; }
36 | }
37 | @media (min-width: $breakpoint-500) and (max-width: $breakpoint-600-less-than) {
38 | #page, footer { max-width: $breakpoint-500-page-width; }
39 | }
40 | @media (max-width: $breakpoint-500) {
41 | #page, footer { max-width: 90%; }
42 | }
43 |
44 | // Title styles
45 |
46 | h1 {
47 | font-size: 1.8rem;
48 | line-height: 1.2em;
49 | font-weight: $font-weight-extra-bold;
50 | }
51 |
52 | h4 {
53 | font-size: 1.4rem;
54 | line-height: 1.2em;
55 | margin-block-start: 2rem;
56 | margin-block-end: 1rem;
57 | font-weight: $font-weight-bold;
58 | }
59 |
60 | h5 {
61 | font-size: 1.1rem;
62 | font-weight: $font-weight-bold;
63 | margin-block-end: 1rem;
64 | }
65 |
66 | .footnote {
67 | display: block;
68 | font-size: 0.9em;
69 | font-style: italic;
70 | text-align: end;
71 | margin-block-start: 5px;
72 | margin-inline-end: 10px;
73 | margin-block-end: 0;
74 | margin-inline-start: 10px;
75 | }
76 |
77 |
78 | header {
79 | padding: 10px 0;
80 |
81 | .toolbar {
82 | display: flex;
83 | flex-wrap: wrap;
84 | justify-content: space-between;
85 | align-items: center;
86 | font-size: 0.8rem;
87 |
88 | .lang-picker-title {
89 | font-style: italic;
90 | margin-inline-end: 0.5rem;
91 | }
92 |
93 | .lang-picker {
94 | padding-block-start: 0.5em;
95 | padding-inline-end: 1em;
96 | padding-block-end: 0.5em;
97 | padding-inline-start: 0;
98 | display: flex;
99 | align-items: center;
100 | }
101 |
102 | #last-updated {
103 | padding-block-start: 0.5em;
104 | padding-inline-end: 0;
105 | padding-block-end: 0.5em;
106 | padding-inline-start: 1em;
107 | flex-grow: 1;
108 | font-style: italic;
109 | text-align: end;
110 | }
111 |
112 | }
113 | }
114 |
115 | a, a:hover, a:visited {
116 | color: #000a12;
117 | }
118 |
119 | a.inline, a.inline:visited, a.inline:hover {
120 | color: inherit;
121 | text-decoration: none;
122 | }
123 |
124 | .text-center {
125 | text-align: center;
126 | }
127 |
128 | // KPI Numbers.
129 | @import 'src/kpi';
130 |
131 | // National charts
132 | .national-charts { width: 100%; }
133 |
134 | .chart-control {
135 | font-size: 0.8rem;
136 |
137 | margin-block-start: 2rem;
138 | margin-block-end: 0;
139 | padding-block-start: 0.5rem;
140 | padding-block-end: 0;
141 |
142 | .time-period-caption {
143 | font-weight: bold;
144 | }
145 |
146 | a {
147 | text-decoration: underline;
148 | }
149 |
150 | a.selected {
151 | font-weight: bold;
152 | text-decoration: none;
153 | }
154 | }
155 |
156 | @media (min-width: $breakpoint-960) {
157 | .national-charts {
158 | display: flex;
159 | flex-direction: row;
160 | flex-wrap: nowrap;
161 | //align-items: stretch;
162 | }
163 | .daily-increase-container {
164 | margin: 10px;
165 | flex: 1;
166 | width: 50%;
167 | }
168 | .chart-control {
169 | margin-inline-start: 10px;
170 | margin-inline-end: 10px;
171 | }
172 | }
173 |
174 | .daily-increase-chart {
175 | min-height: 320px;
176 | }
177 |
178 | .daily-increase-chart-short {
179 | min-height: 180px;
180 | }
181 |
182 | .daily-increase-chart-box {
183 | padding-block-start: 20px;
184 | padding-inline-end: 10px;
185 | padding-block-end: 5px;
186 | padding-inline-start: 10px;
187 | border-radius: $box-border-radius;
188 | background: $color-box-background;
189 | box-shadow: $color-box-shadow;
190 | }
191 |
192 | .chart-description {
193 | font-size: 0.8rem;
194 | }
195 |
196 | // Regional section
197 | @import 'src/components/RegionalCharts/regional';
198 |
199 |
200 | // Prefectural section
201 |
202 | #prefecture-sections { width: 100%; }
203 | @media (min-width: $breakpoint-960) {
204 | #prefecture-sections {
205 | display: flex;
206 | flex-direction: row;
207 | flex-wrap: nowrap;
208 | //align-items: stretch;
209 |
210 | #prefecture-map-container {
211 | margin: 10px;
212 | flex: 1;
213 | width: 50%;
214 | }
215 |
216 | #prefecture-top-table-container {
217 | margin: 10px;
218 | flex: 1;
219 | width: 50%;
220 | }
221 | }
222 | }
223 |
224 | // National charts
225 |
226 | #prefecture-map-contents {
227 | width: 100%;
228 | border-radius: $box-border-radius;
229 | background: $color-box-background;
230 | box-shadow: $color-box-shadow;
231 | }
232 |
233 |
234 | #all-prefectures-table-container {
235 | max-width: 800px;
236 | margin: 0 auto;
237 | }
238 |
239 |
240 | @import 'src/components/OutbreakMap/map';
241 | @import 'src/components/PrefectureTable/prefectureTable';
242 |
243 | #helpful-links,
244 | #travel-restrictions {
245 | max-width: 800px;
246 | margin: 0 auto;
247 | li {
248 | margin-block-end: 20px;
249 | word-wrap: break-word;
250 | }
251 | }
252 |
253 | #footer-container {
254 | background: white;
255 | margin: 0;
256 | }
257 |
258 | footer {
259 | margin: 0 auto;
260 | padding: 1rem;
261 |
262 | p {
263 | font-size: 0.9rem;
264 | line-height: 1.2rem;
265 | margin: 0 0 1rem;
266 | }
267 |
268 | a, a:active {
269 | color: #1976d2 !important;
270 | }
271 | .avatar {
272 | text-decoration: none;
273 | img {
274 | height: 50px;
275 | width: 50px;
276 | margin: 5px;
277 | border-radius: 50%;
278 | }
279 | }
280 | }
281 |
282 | body {
283 | &.embed {
284 | .embed-hide {
285 | display: none;
286 | }
287 | }
288 | &:not(.embed) {
289 | .embed-show {
290 | display: none;
291 | }
292 | }
293 |
294 | // Disable box shadow and grey background for embeds.
295 | &.embed {
296 | background: $color-embed-background;
297 |
298 | #prefecture-map-contents,
299 | #kpi .kpi-box
300 | {
301 | box-shadow: none;
302 | border: $color-box-border;
303 | }
304 |
305 | // Smaller avatars for embedded mode.
306 | .avatar img {
307 | width: 30px;
308 | height: 30px;
309 | }
310 | }
311 | }
312 |
313 | img.emoji {
314 | height: 1em;
315 | width: 1em;
316 | margin-block-start: 0;
317 | margin-inline-end: .1em;
318 | margin-block-end: 0;
319 | margin-inline-start: .1em;
320 | vertical-align: -0.1em;
321 | }
322 |
323 | // c3 chart styling
324 | .daily-increase-container {
325 | path.c3-line {
326 | stroke-width: 2px;
327 | }
328 | line.c3-xgrid, line.c3-ygrid {
329 | stroke-dasharray: 0 0;
330 | stroke: #f0f0f0 !important;
331 | }
332 | }
333 |
334 | .daily-increase-chart {
335 | .c3-axis-x .tick line {
336 | display: none;
337 | }
338 |
339 | .c3-bar {
340 | // Forces drawing of stroke so it doesn't have anti-aliasing patterns.
341 | stroke-width: 1px !important;
342 | }
343 | }
344 |
345 | .hidden {
346 | display: none;
347 | }
348 |
349 | .warning {
350 | margin: 1rem;
351 | padding: 1rem 1.5rem;
352 | border-radius: 1rem;
353 | background: #f8d7da;
354 | color: #721c24;
355 | }
--------------------------------------------------------------------------------
/src/_kpi.scss:
--------------------------------------------------------------------------------
1 | @import 'src/colors';
2 | @import 'src/type';
3 | @import 'src/layout';
4 |
5 | $box-margin: 5px;
6 |
7 | // KPI 5-up layout
8 | $breakpoint-1200-box-width: ($breakpoint-1200-page-width - $box-margin * 2 * 5) / 5;
9 |
10 | // KPI 4-up layout
11 | $breakpoint-960-box-width: ($breakpoint-960-page-width - $box-margin * 2 * 4) / 4;
12 | $breakpoint-960-box-width-double: $breakpoint-960-box-width * 2 + $box-margin * 2;
13 |
14 | // KPI 3-up layout
15 | $breakpoint-600-box-width: ($breakpoint-600-page-width - $box-margin * 2 * 3) / 3;
16 |
17 | // KPI 2-up layout for below $breakpoint-500 (box-width is not fixed, but
18 | // relative to screen width.)
19 |
20 | #kpi {
21 | padding: 10px 0;
22 | display: flex;
23 | flex-wrap: wrap;
24 | }
25 |
26 | #kpi.loading {
27 | .chart-caption {
28 | display: none;
29 | }
30 | }
31 |
32 |
33 | .kpi-box {
34 | background: $color-box-background;
35 | box-shadow: $color-box-shadow;
36 | border-radius: $box-border-radius;
37 | margin: 5px 5px;
38 |
39 | .label {
40 | color: $primary-black;
41 | font-size: 0.9rem;
42 | font-weight: $font-weight-extra-bold;
43 | margin-bottom: 0.5rem;
44 | }
45 |
46 | .diff {
47 | font-size: 1rem;
48 | line-height: 1em;
49 | font-weight: $font-weight-bold;
50 | display: inline;
51 | word-wrap: none;
52 | white-space: nowrap;
53 | }
54 | .value {
55 | font-size: 1.4rem;
56 | font-weight: $font-weight-extra-bold;
57 | display: inline;
58 | }
59 |
60 | .chart {
61 | padding-bottom: 0;
62 |
63 | svg {
64 | width: 100%; // Width needed for Chrome, Firefox.
65 |
66 | // Height only needed for IE11, but breaks Chrome/Firefox (so sad to need to use this hack)
67 | @media screen and (-ms-high-contrast: active), screen and (-ms-high-contrast: none) {
68 | height: 3em;
69 | }
70 | }
71 | }
72 |
73 | .description {
74 | font-size: 0.8rem;
75 | margin-top: 0.2rem;
76 | line-height: 1.2em;
77 | min-height: 1.2rem;
78 | }
79 |
80 | .chart-caption {
81 | font-size: 0.6rem;
82 | line-height: 1em;
83 | margin: 0;
84 | }
85 |
86 | }
87 |
88 | // Box layouts.
89 |
90 | .kpi-box {
91 | padding: 0.8rem;
92 | width: $breakpoint-1200-box-width;
93 | line-height: 1.3rem;
94 | /* height uses rem to ensure it scales to text height sizes */
95 | height: 11rem;
96 | }
97 |
98 | .kpi-box#kpi-critical-short {
99 | display: none;
100 | height: 6rem;
101 | }
102 |
103 | .kpi-box#kpi-critical {
104 | display: none;
105 | }
106 |
107 |
108 | @media (min-width: $breakpoint-1200) {
109 | .kpi-box {
110 | .chart-caption {
111 | margin-top: 0.2rem;
112 | }
113 | }
114 | }
115 |
116 | @media (min-width: $breakpoint-960) and (max-width: $breakpoint-1200-less-than) {
117 | .kpi-box {
118 | width: $breakpoint-960-box-width;
119 | height: 11rem;
120 | .chart-caption {
121 | margin-top: 0.2rem;
122 | }
123 | }
124 |
125 | .kpi-box#kpi-tested {
126 | height: 7rem;
127 | width: $breakpoint-960-box-width-double;
128 | display: flex;
129 | flex-direction: row;
130 | .vitals {
131 | width: $breakpoint-960-box-width-double / 2;
132 | }
133 | .chart-container {
134 | width: 200px;
135 | }
136 | }
137 | }
138 |
139 | @media (min-width: $breakpoint-600) and (max-width: $breakpoint-960-less-than) {
140 | .kpi-box {
141 | width: $breakpoint-600-box-width;
142 | height: 10rem;
143 | .label {
144 | font-size: 0.8rem;
145 | margin-bottom: 0.2rem;
146 | }
147 | .diff {
148 | font-size: 0.7rem;
149 | }
150 | .description {
151 | font-size: 0.7em;
152 | }
153 | }
154 | }
155 |
156 | @media (min-width: $breakpoint-500) and (max-width: $breakpoint-600-less-than) {
157 | .kpi-box {
158 | width: 30%; /* 3 in a row */
159 | height: 11rem;
160 | .label {
161 | font-size: 0.8rem;
162 | margin-bottom: 0.2rem;
163 | }
164 | .diff {
165 | font-size: 0.7rem;
166 | line-height: 1.2em;
167 | margin-top: 0.2rem;
168 | margin-bottom: 0.4rem;
169 | display: block;
170 | }
171 | .description {
172 | font-size: 0.7rem;
173 | }
174 | }
175 | }
176 |
177 | @media (max-width: $breakpoint-500) {
178 | .kpi-box {
179 | padding: 10px;
180 | width: 45%; /* 2 in a row */
181 | height: 11rem;
182 | .label {
183 | font-size: 0.8rem;
184 | margin-bottom: 0.1rem;
185 | }
186 | .value {
187 | font-size: 1.3rem;
188 | display: block;
189 | }
190 | .diff {
191 | font-size: 0.7rem;
192 | line-height: 0.9rem;
193 | margin-bottom: 0.4rem;
194 | display: block;
195 | }
196 | .description {
197 | font-size: 0.7rem;
198 | min-height: 2.2em; /* reserve space for two lines */
199 | }
200 | }
201 | }
202 |
203 | #kpi-confirmed {
204 | color: $color-confirmed;
205 | .chart-caption {
206 | color: $color-confirmed-caption;
207 | }
208 | }
209 |
210 | #kpi-recovered {
211 | color: $color-recovered;
212 | .chart-caption {
213 | color: $color-recovered-caption;
214 | }
215 | }
216 |
217 | #kpi-deceased {
218 | color: $color-deceased;
219 | .chart-caption {
220 | color: $color-deceased-caption;
221 | }
222 | }
223 |
224 | #kpi-critical, #kpi-critical-short {
225 | color: $color-critical;
226 | .chart-caption {
227 | color: $color-critical-caption;
228 | }
229 | b {
230 | font-weight: $font-weight-bold;
231 | }
232 | }
233 |
234 | #kpi-tested {
235 | color: $color-tested;
236 | .chart-caption {
237 | color: $color-tested-caption;
238 | }
239 | }
240 |
241 | #kpi-active {
242 | color: $color-active;
243 | .chart-caption {
244 | color: $color-active-caption;
245 | }
246 | }
247 |
248 | #kpi-active-chart {
249 | path.line {
250 | stroke: $color-active;
251 | stroke-width: 2px;
252 | }
253 |
254 | path.axis-ceiling {
255 | stroke: $color-active;
256 | }
257 |
258 | text, circle { fill: $color-active; }
259 |
260 | path.area {
261 | fill: url(#kpi-active-chart-gradient) $color-active-light !important;
262 | }
263 | }
264 |
265 |
266 | #kpi-confirmed-chart {
267 | path.line {
268 | stroke: $color-confirmed;
269 | stroke-width: 2px;
270 | }
271 |
272 | path.axis-ceiling {
273 | stroke: $color-confirmed;
274 | }
275 |
276 | text, circle { fill: $color-confirmed; }
277 |
278 | path.area {
279 | fill: url(#kpi-confirmed-chart-gradient) $color-confirmed-light !important;
280 | }
281 | }
282 |
283 | #kpi-recovered-chart {
284 | path.line {
285 | stroke: $color-recovered;
286 | stroke-width: 2px;
287 | }
288 |
289 | path.axis-ceiling {
290 | stroke: $color-recovered;
291 | }
292 |
293 | text, circle { fill: $color-recovered; }
294 |
295 | path.area {
296 | fill: url(#kpi-recovered-chart-gradient) $color-recovered-light !important;
297 | }
298 | }
299 |
300 | #kpi-critical-chart {
301 | path.line {
302 | stroke: $color-critical;
303 | stroke-width: 2px;
304 | }
305 |
306 | path.axis-ceiling {
307 | stroke: $color-critical;
308 | }
309 |
310 | text, circle { fill: $color-critical; }
311 |
312 | path.area {
313 | fill: url(#kpi-critical-chart-gradient) $color-critical-light !important;
314 | }
315 | }
316 |
317 |
318 | #kpi-deceased-chart {
319 | path.line {
320 | stroke: $color-deceased;
321 | stroke-width: 2px;
322 | }
323 |
324 | path.axis-ceiling {
325 | stroke: $color-deceased;
326 | }
327 |
328 | text, circle { fill: $color-deceased; }
329 |
330 | path.area {
331 | fill: url(#kpi-deceased-chart-gradient) $color-deceased-light !important;
332 | }
333 | }
334 |
335 | #kpi-tested-chart {
336 | path.line {
337 | stroke: $color-tested;
338 | stroke-width: 2px;
339 | }
340 |
341 | path.axis-ceiling {
342 | stroke: $color-tested;
343 | }
344 |
345 | text, circle { fill: $color-tested; }
346 |
347 | path.area {
348 | fill: url(#kpi-tested-chart-gradient) $color-tested-light !important;
349 | }
350 | }
--------------------------------------------------------------------------------
/src/i18n/ar.json:
--------------------------------------------------------------------------------
1 | {
2 | "covid-19-tracker": "متعقب حالات كوفيد-19 في اليابان",
3 | "languages": "اللغات:",
4 | "last-updated": "اخر تحديث:",
5 | "kpi-active": "حالات نشطة حاليا",
6 | "kpi-active-tooltip": "الحالات المؤكدة مطروحاَ منها الافراد المتعافون",
7 | "kpi-critical": "حالات حرجة",
8 | "kpi-deceased": "الوفيات",
9 | "kpi-tested": "الاختبارات",
10 | "kpi-confirmed": "الحالات المؤكدة",
11 | "kpi-recovered": "المتعافون",
12 | "covid-19": "كوفيد-19",
13 | "outbreak-map": "خريطة الانتشار",
14 | "cases-none": "لا توجد حالات",
15 | "cases-range": "{{from}}-{{to}} حالة",
16 | "cases-last": "{{from}}+ حالة",
17 | "outbreak-spread-trend": "اجمالي الحالات المسجلة",
18 | "new-cases-by-day": "الحالات اليومية الجديدة",
19 | "top-prefectures": "اعلى عشرة محافظات",
20 | "active-regions": "أكثر المناطق إصابة",
21 | "prefecture-data": "عدد الاصابات في كل محافظة",
22 | "prefecture": "المحافظة",
23 | "confirmed": "حالات مؤكدة",
24 | "recovered": "المتعافون",
25 | "deaths": "الوفيات",
26 | "active": "حالات نشطة حاليا",
27 | "helpful-links": "روابط مساعدة",
28 | "primary-data-sources": "المصادر المرجعية للبيانات",
29 | "confirmed-case-trajectories-by-region": "مسارات الاصابات المؤكدة لكل منطقة",
30 | "trajectory-description": " عدد الايام منذ تخطي {{minimumConfirmed}} اصابة ",
31 | "traveling-into-japan": "السفر الي اليابان",
32 | "about-travel-restriction": "هذه معلومات عن حظر السفر الي اليابان. برجاء الضعط على الروابط في الاسفل للحصول على معلومات تفصيلية",
33 | "banned-from-entering-japan": "دول ممنوعة من دخول اليابان",
34 | "existing-visa-required": "دول تحتاج الي تصريح دخول الي اليابان",
35 | "14-day-self-quarantine-required": "دول تحتاج الي حجر صحي لمد 14 يوم",
36 | "other-limitations": "قيود اخرى",
37 | "provisional": "حاليا",
38 | "total": "كلي",
39 | "increment-today": "الزيادة اليوم",
40 | "increment-yesterday": "الزيادة بالامس",
41 | "daily": "يومي",
42 | "7-day-average": "متوسط اسبوعي",
43 | "daily-trend": "تسجيل يومي",
44 | "see-all-prefectures": "جميع المحافطات",
45 | "cruise-passengers-explanation": "طاقم الرحلة البحرية والركاب غير مدرجة ضمن المجموع",
46 | "confirmed-chart-caption": "الحالات اليومية الجديدة",
47 | "active-chart-caption": "اجمالي الحالات النشطة",
48 | "recovered-chart-caption": "المتعافون يوميا",
49 | "deceased-chart-caption": "الوفيات اليومية",
50 | "tested-chart-caption": "الاختبارات اليومية",
51 | "active-critical-percentage": "{{percent}}% حالات حرجة",
52 | "recovered-percentage": "{{percent}}% من اجمالي الاصابات",
53 | "deceased-percentage": "{{percent}}% من اجمالي الاصابات",
54 | "tested-percentage": "{{percent}}% من النائج تكون ايجابية",
55 | "active-cases": "الحالات النشطة",
56 | "no-active-cases": "🎉 لا يوجد حالات نشطة",
57 | "time-period": "Time period",
58 | "all-time": "All time",
59 | "three-months": "3 months",
60 | "active-cases-description": "Total patients that are still currently testing positive for COVID-19. (Total confirmed cases minus total recovered cases).",
61 | "restrictions-link": "Find out about the most current travel restrictions for Foreign Nationals from the following:",
62 | "non-resident-restrictions": "All foreign tourists are barred from entering the country. Some business travel is allowed from select countries.",
63 | "pseudo-prefectures": {
64 | "port-of-entry": "منفذ الدخول",
65 | "unspecified": "غير محدد",
66 | "diamond-princess": "رحلة دايمود برنسيس",
67 | "nagasaki-cruise": "رحلة ناجازاكي"
68 | },
69 | "prefectures": {
70 | "Aichi": "ايتشي",
71 | "Akita": "اكيتا",
72 | "Aomori": "اوموري",
73 | "Chiba": "تشيبا",
74 | "Ehime": "أهيمى",
75 | "Fukui": "فوكوي",
76 | "Fukuoka": "فوكوكا",
77 | "Fukushima": "فوكوشيما",
78 | "Gifu": "جيفو",
79 | "Gunma": "جينما",
80 | "Hiroshima": "هيروشيما",
81 | "Hokkaido": "هوكايدو",
82 | "Hyogo": "هيوجو",
83 | "Ibaraki": "إباراكي",
84 | "Ishikawa": "إشوكاوا",
85 | "Iwate": "إواتى",
86 | "Kagawa": "كاجاوا",
87 | "Kagoshima": "كاجوشيما",
88 | "Kanagawa": "كاناجاوا",
89 | "Kochi": "كوتشي",
90 | "Kumamoto": "كوماموتو",
91 | "Kyoto": "كيوتو",
92 | "Mie": "ميا",
93 | "Miyagi": "مياجي",
94 | "Miyazaki": "ميازاكي",
95 | "Nagano": "ناجانو",
96 | "Nagasaki": "ناجازاكي",
97 | "Nara": "نارا",
98 | "Niigata": "نيجاتا",
99 | "Oita": "أوتا",
100 | "Okayama": "أوكاياما",
101 | "Okinawa": "أوكيناوا",
102 | "Osaka": "أوساكا",
103 | "Saga": "ساجا",
104 | "Saitama": "سايتاما",
105 | "Shiga": "شيجا",
106 | "Shimane": "شيمانى",
107 | "Shizuoka": "شيزووكا",
108 | "Tochigi": "طوتشيجي",
109 | "Tokushima": "طوكوشيما",
110 | "Tokyo": "طوكيو",
111 | "Tottori": "طوتوري",
112 | "Toyama": "طوياما",
113 | "Wakayama": "واكاياما",
114 | "Yamagata": "ياماجاتا",
115 | "Yamaguchi": "ياماجوتشي",
116 | "Yamanashi": "ياماناشي"
117 | },
118 | "regions": {
119 | "Kanto": " كانتو ",
120 | "Kansai": " كانساي ",
121 | "Kyushu": " كيوشو ",
122 | "Chubu": " تشوبو ",
123 | "Chugoku": " تشوجوكو ",
124 | "Hokkaido": " هوكايدو ",
125 | "Tohoku": " توهوكو ",
126 | "Shikoku": " شيكوكو ",
127 | "Other": " غير ذلك "
128 | },
129 | "countries": {
130 | "albania": "ألبانيا",
131 | "andorra": "أندورا",
132 | "antiguaandbarbuda": "أنتيغوا وبربودا",
133 | "australia": "أستراليا",
134 | "austria": "النمسا",
135 | "bahrain": "البحرين",
136 | "barbados": "بربادوس",
137 | "belarus": "بيلاروس",
138 | "belgium": "بلجيكا",
139 | "bolivia": "بوليفيا",
140 | "bosniaherzegovina": "البوسنة والهرسك",
141 | "brazil": "البرازيل",
142 | "brunei": "بروناي",
143 | "bulgaria": "بلغاريا",
144 | "canada": "كندا",
145 | "chile": "شيلي",
146 | "china": "الصين (بما في ذلك هونغ كونغ وماكاو)",
147 | "congo-kinshasa": "جمهورية الكونغو الديموقراطية",
148 | "cotedivoire": "ساحل العاج",
149 | "croatia": "كرواتيا",
150 | "cyprus": "قبرص",
151 | "czechrepublic": "جمهورية التشيك",
152 | "denmark": "الدنمارك",
153 | "djibouti": "جيبوتي",
154 | "dominica": "دومينيكا",
155 | "dominicanrepublic": "جمهورية الدومنيكان",
156 | "ecuador": "إكوادور",
157 | "egypt": "مصر",
158 | "estonia": "إستونيا",
159 | "finland": "فنلندا",
160 | "france": "فرنسا",
161 | "germany": "ألمانيا",
162 | "greece": "اليونان",
163 | "hungary": "هنغاريا",
164 | "iceland": "أيسلندا",
165 | "indonesia": "إندونيسيا",
166 | "iran": "إيران",
167 | "ireland": "أيرلندا",
168 | "israel": "إسرائيل",
169 | "italy": "إيطاليا",
170 | "korea": "كوريا",
171 | "kosovo": "كوسوفو",
172 | "kuwait": "الكويت",
173 | "latvia": "لاتفيا",
174 | "liechtenstein": "ليختنشتاين",
175 | "lithuania": "ليتوانيا",
176 | "luxembourg": "لوكسمبورج",
177 | "malaysia": "ماليزيا",
178 | "malta": "مالطا",
179 | "mauritius": "موريشيوس",
180 | "moldova": "مولدوفا",
181 | "monaco": "موناكو",
182 | "montenegro": "الجبل الأسود",
183 | "morocco": "المغرب",
184 | "netherlands": "هولندا",
185 | "newzealand": "نيوزيلندا",
186 | "northmacedonia": "مقدونيا الشمالية",
187 | "norway": "النرويج",
188 | "oman": "سلطنة عمان",
189 | "panama": "بنما",
190 | "peru": "بيرو",
191 | "philippines": "الفلبين",
192 | "poland": "بولندا",
193 | "portugal": "البرتغال",
194 | "qatar": "قطر",
195 | "romania": "رومانيا",
196 | "russia": "روسيا",
197 | "saintkittsandnevis": "سانت كيتس ونيفيس",
198 | "sanmarino": "سان مارينو",
199 | "saudiarabia": "المملكة العربية السعودية",
200 | "serbia": "صربيا",
201 | "singapore": "سنغافورة",
202 | "slovakia": "سلوفاكيا",
203 | "slovenia": "سلوفينيا",
204 | "spain": "إسبانيا",
205 | "sweden": "السويد",
206 | "switzerland": "سويسرا",
207 | "taiwan": "تايوان",
208 | "thailand": "تايلاند",
209 | "turkey": "تركيا",
210 | "uk": "المملكة المتحدة",
211 | "ukraine": "أوكرانيا",
212 | "unitedarabemirates": "الإمارات العربية المتحدة",
213 | "usa": "الولايات المتحدة الامريكية",
214 | "vatican": "الفاتيكان",
215 | "vietnam": "فيتنام",
216 | "westerdam": "ويسترام (سفينة سياحية)"
217 | }
218 | }
219 |
--------------------------------------------------------------------------------
/static/icons/safari-pinned-tab.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/components/RegionalCharts/_regional.scss:
--------------------------------------------------------------------------------
1 |
2 | @import 'src/colors';
3 | @import 'src/type';
4 | @import 'src/layout';
5 |
6 |
7 | $box-margin: 5px;
8 |
9 |
10 | $breakpoint-1200-box-width: ($breakpoint-1200-page-width - $box-margin * 2 * 5) / 5;
11 | $breakpoint-1200-full-box-width: $breakpoint-1200-page-width - $box-margin * 2;
12 |
13 | $breakpoint-960-box-width: ($breakpoint-960-page-width - $box-margin * 2 * 4) / 4;
14 | $breakpoint-960-box-width-double: $breakpoint-960-box-width * 2 + $box-margin * 2;
15 |
16 | $breakpoint-960-full-box-width: $breakpoint-960-page-width - $box-margin * 2;
17 |
18 |
19 | // KPI 3-up layout
20 | $breakpoint-600-box-width: ($breakpoint-600-page-width - $box-margin * 2 * 3) / 3;
21 |
22 | $breakpoint-600-full-box-width: $breakpoint-600-page-width - $box-margin * 2;
23 |
24 | // KPI 2-up layout for below $breakpoint-500 (box-width is not fixed, but
25 | // relative to screen width.)
26 |
27 | #regional-charts-container {
28 | margin-top: 20px;
29 | }
30 |
31 | .regional-charts {
32 | padding: 10px 0;
33 | display: flex;
34 | flex-wrap: wrap;
35 | }
36 |
37 | // Layouts
38 |
39 |
40 | // Layout 1: Max screen size >1200px
41 |
42 | .region-area {
43 | height: 14rem;
44 | width: $breakpoint-1200-full-box-width;
45 | display: flex;
46 | flex-direction: row;
47 | flex-wrap: nowrap;
48 |
49 | .vitals {
50 | width: 11rem;
51 | padding-left: 0.5rem;
52 | }
53 |
54 | .region-box-prefectures {
55 | display: flex;
56 | flex-direction: row;
57 | flex-grow: 2;
58 | flex-wrap: nowrap;
59 | overflow-x: scroll;
60 | width: 100%;
61 | }
62 | }
63 |
64 | .region-prefecture {
65 | width: 11rem;
66 | min-width: 11rem;
67 |
68 | .metric.deceased {
69 | display: none;
70 | }
71 | .metric.confirmed {
72 | display: none;
73 | }
74 | }
75 |
76 |
77 | .region-top {
78 | min-height: 10rem;
79 | width: 100%;
80 |
81 | .vitals {
82 | display: flex;
83 | flex-direction: row;
84 | }
85 | .vitals-left {
86 | width: 50%;
87 | }
88 | .vitals-right {
89 | width: 50%;
90 | align-self: flex-end;
91 | }
92 |
93 | .metrics {
94 | display: flex;
95 | flex-direction: row;
96 | }
97 | .metric {
98 | margin-right: 1rem;
99 | min-width: 4rem;
100 | .diff {
101 | display: block;
102 | }
103 | }
104 |
105 | .title {
106 | margin-bottom: 0;
107 | }
108 | }
109 |
110 | // Layout if screensize at 375px or higher
111 |
112 | @media (min-width: $breakpoint-375) {
113 | .region-box .value {
114 | font-size: 1.125rem !important;
115 | }
116 |
117 | .region-box .diff {
118 | display: inline-block !important;
119 | }
120 | }
121 |
122 | // Layout 2: Between 1200px and 960px
123 |
124 | @media (min-width: $breakpoint-960) and (max-width: $breakpoint-1200-less-than) {
125 | .region-area {
126 | width: $breakpoint-960-full-box-width;
127 | }
128 | }
129 |
130 | // Layout 3: Between 960px and 600px
131 |
132 | @media (min-width: $breakpoint-600) and (max-width: $breakpoint-960-less-than) {
133 | .region-area {
134 | width: $breakpoint-600-full-box-width;
135 | }
136 | }
137 |
138 | // Layout 4: Under 600px
139 | // Switched from a horizontal scroll to a vertical layout.
140 |
141 | @media (max-width: $breakpoint-600) {
142 | .region-area {
143 | width: 100%;
144 |
145 | height: auto;
146 | flex-direction: column;
147 |
148 | .metrics {
149 | display: flex;
150 | flex-direction: row;
151 | width: 90%;
152 | .metric {
153 | min-width: 5rem;
154 | width: 5rem;
155 | }
156 | }
157 |
158 | .region-box-prefectures {
159 | display: block;
160 | flex-direction: column;
161 |
162 | .region-prefecture {
163 | align-self: auto;
164 | margin: 0;
165 | width: 100%;
166 | padding: 0.1rem 0.5rem;
167 | border: none;
168 |
169 | .title {
170 | color: $color-title-dark;
171 | margin-top: 0.5rem;
172 | font-size: 0.8rem;
173 | font-weight: $font-weight-bold;
174 | }
175 |
176 | .metrics-and-chart {
177 | display: block;
178 |
179 | .metric {
180 | align-self: flex-start;
181 | .value-label {
182 | display: none;
183 | }
184 | .value {
185 | font-size: 1.0rem;
186 | font-weight: $font-weight-bold;
187 | }
188 | }
189 |
190 | .metric.deceased {
191 | display: block;
192 | }
193 | .metric.confirmed {
194 | display: block;
195 | }
196 | .metric.active .diff {
197 | display: none;
198 | }
199 |
200 | .chart-and-caption {
201 | //display: flex;
202 | display: none;
203 | flex-direction: row-reverse;
204 | }
205 |
206 | .chart {
207 | width: 170px;
208 | }
209 |
210 | .chart-caption {
211 | display: none;
212 | }
213 | }
214 | }
215 | }
216 | }
217 | }
218 |
219 | a.region-top-link {
220 | text-decoration: none;
221 | }
222 |
223 | .region-box {
224 | background: $color-box-background;
225 | box-shadow: $color-box-shadow;
226 | border-radius: $box-border-radius;
227 | margin: 5px 5px;
228 | padding: 0.8rem;
229 |
230 | .value, .diff {
231 | color: $color-confirmed;
232 | }
233 | .value-label {
234 | color: $color-confirmed-caption;
235 | }
236 |
237 | .yesterday {
238 | color: $color-increment-yesterday;
239 | }
240 |
241 | .active {
242 | .diff, .value {
243 | color: $color-active;
244 | }
245 | .value-label {
246 | color: $color-active-caption;
247 | }
248 | }
249 |
250 | .deceased {
251 | .diff, .value {
252 | color: $color-deceased;
253 | }
254 | .value-label {
255 | color: $color-deceased-caption;
256 | }
257 | }
258 |
259 | .title {
260 | color: $primary-black;
261 | font-size: 1rem;
262 | font-weight: $font-weight-extra-bold;
263 | margin-bottom: 0.3rem;
264 | white-space: nowrap;
265 | overflow-x: hidden;
266 | }
267 |
268 | .message {
269 | font-size: 0.8rem;
270 | }
271 |
272 | .metric {
273 | display: block;
274 | margin-bottom: 0.5rem;
275 | }
276 |
277 | .value-label {
278 | font-size: 0.8rem;
279 | }
280 |
281 | .value {
282 | font-size: 1.4rem;
283 | font-weight: $font-weight-extra-bold;
284 | display: inline;
285 | }
286 |
287 | .diff {
288 | font-size: 1rem;
289 | line-height: 1em;
290 | font-weight: $font-weight-bold;
291 | display: inline;
292 | word-wrap: none;
293 | }
294 |
295 | .chart {
296 | padding-bottom: 0;
297 |
298 | svg {
299 | width: 100%; // Width needed for Chrome, Firefox.
300 |
301 | // Height only needed for IE11, but breaks Chrome/Firefox (so sad to need to use this hack)
302 | @media screen and (-ms-high-contrast: active), screen and (-ms-high-contrast: none) {
303 | height: 3em;
304 | }
305 | }
306 | }
307 |
308 | .description {
309 | font-size: 0.8rem;
310 | margin-top: 0.2rem;
311 | line-height: 1.2em;
312 | min-height: 1.2rem;
313 | }
314 |
315 | .chart-caption {
316 | font-size: 0.6rem;
317 | line-height: 0.8em;
318 | color: $color-increment-yesterday;
319 | }
320 | }
321 |
322 | .region-prefecture {
323 | box-shadow: none;
324 | border: 1px solid rgb(230, 230, 230);
325 | margin: 1rem 0 0.5rem 0.5rem;
326 | align-self: flex-end;
327 |
328 | .metric {
329 | margin-bottom: 0;
330 | }
331 | }
332 |
333 | .region-top {
334 | .prefecture-sum {
335 | font-weight: $font-weight-normal;
336 | font-size: 0.9rem;
337 | margin-left: 1rem;
338 | color: $color-light-caption;
339 |
340 | &::after {
341 | content: "...";
342 | }
343 | }
344 |
345 | .chart {
346 | margin: 0.5rem 0.5rem 0 0.5rem;
347 | }
348 | }
349 |
350 | .region-prefecture.inactive {
351 | .value, .message {
352 | color: $color-inactive;
353 | }
354 | .value, .diff {
355 | color: $color-inactive;
356 | }
357 | .value-label {
358 | color: $color-inactive;
359 | }
360 | }
361 |
362 |
363 |
364 | .region-area .chart svg {
365 | path.line {
366 | stroke: $color-increment-yesterday;
367 | stroke-width: 2px;
368 | }
369 |
370 | path.axis-ceiling {
371 | stroke: $color-increment-yesterday;
372 | }
373 |
374 | text, circle { fill: $color-increment-yesterday; }
375 |
376 | path.area {
377 | fill: url(#regional-chart-gradient) $color-increment-yesterday !important;
378 | }
379 | }
380 |
381 | .region-top .chart svg {
382 | path.line {
383 | stroke: $color-increment-yesterday;
384 | stroke-width: 1px;
385 | }
386 |
387 | path.axis-ceiling {
388 | stroke: $color-increment-yesterday;
389 | }
390 |
391 | text, circle { fill: $color-increment-yesterday; }
392 |
393 | // path.area {
394 | // fill: url(#regional-chart-gradient) $primary-black !important;
395 | // }
396 | }
--------------------------------------------------------------------------------