fix: Add Portugese, Brazil to language options (#2164)

* Add Portugese, Brazil to language options

* Upgrade date-fns package

Co-authored-by: Tom Moor <tom.moor@gmail.com>
This commit is contained in:
Saumya Pandey
2021-06-10 06:12:14 +05:30
committed by GitHub
parent a99f6bed42
commit a6d4d4ea36
27 changed files with 85 additions and 70 deletions

View File

@ -1,5 +1,5 @@
// @flow // @flow
import format from "date-fns/format"; import { format } from "date-fns";
import * as React from "react"; import * as React from "react";
import { NavLink } from "react-router-dom"; import { NavLink } from "react-router-dom";
import styled, { withTheme } from "styled-components"; import styled, { withTheme } from "styled-components";
@ -37,7 +37,7 @@ class RevisionListItem extends React.Component<Props> {
</Author> </Author>
<Meta> <Meta>
<Time dateTime={revision.createdAt} tooltipDelay={250}> <Time dateTime={revision.createdAt} tooltipDelay={250}>
{format(revision.createdAt, "MMMM Do, YYYY h:mm a")} {format(Date.parse(revision.createdAt), "MMMM do, yyyy h:mm a")}
</Time> </Time>
</Meta> </Meta>
{showMenu && ( {showMenu && (

View File

@ -1,5 +1,5 @@
// @flow // @flow
import distanceInWordsToNow from "date-fns/distance_in_words_to_now"; import { formatDistanceToNow } from "date-fns";
import { sortBy } from "lodash"; import { sortBy } from "lodash";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import * as React from "react"; import * as React from "react";
@ -55,7 +55,7 @@ function DocumentViews({ document, isOpen }: Props) {
? t("Currently editing") ? t("Currently editing")
: t("Currently viewing") : t("Currently viewing")
: t("Viewed {{ timeAgo }} ago", { : t("Viewed {{ timeAgo }} ago", {
timeAgo: distanceInWordsToNow( timeAgo: formatDistanceToNow(
view ? new Date(view.lastViewedAt) : new Date() view ? new Date(view.lastViewedAt) : new Date()
), ),
}); });

View File

@ -1,20 +1,21 @@
// @flow // @flow
import distanceInWordsToNow from "date-fns/distance_in_words_to_now"; import { format, formatDistanceToNow } from "date-fns";
import format from "date-fns/format"; import { enUS, de, fr, es, it, ko, ptBR, pt, zhCN, ru } from "date-fns/locale";
import * as React from "react"; import * as React from "react";
import Tooltip from "components/Tooltip"; import Tooltip from "components/Tooltip";
import useUserLocale from "hooks/useUserLocale"; import useUserLocale from "hooks/useUserLocale";
const locales = { const locales = {
en: require(`date-fns/locale/en`), en_US: enUS,
de: require(`date-fns/locale/de`), de_DE: de,
es: require(`date-fns/locale/es`), es_ES: es,
fr: require(`date-fns/locale/fr`), fr_FR: fr,
it: require(`date-fns/locale/it`), it_IT: it,
ko: require(`date-fns/locale/ko`), ko_KR: ko,
pt: require(`date-fns/locale/pt`), pt_BR: ptBR,
zh: require(`date-fns/locale/zh_cn`), pt_PT: pt,
ru: require(`date-fns/locale/ru`), zh_CN: zhCN,
ru_RU: ru,
}; };
let callbacks = []; let callbacks = [];
@ -64,7 +65,7 @@ function LocaleTime({
}; };
}, []); }, []);
let content = distanceInWordsToNow(dateTime, { let content = formatDistanceToNow(Date.parse(dateTime), {
addSuffix, addSuffix,
locale: userLocale ? locales[userLocale] : undefined, locale: userLocale ? locales[userLocale] : undefined,
}); });
@ -78,7 +79,7 @@ function LocaleTime({
return ( return (
<Tooltip <Tooltip
tooltip={format(dateTime, "MMMM Do, YYYY h:mm a")} tooltip={format(Date.parse(dateTime), "MMMM do, yyyy h:mm a")}
delay={tooltipDelay} delay={tooltipDelay}
placement="bottom" placement="bottom"
> >

View File

@ -1,5 +1,5 @@
// @flow // @flow
import distanceInWordsToNow from "date-fns/distance_in_words_to_now"; import { formatDistanceToNow } from "date-fns";
import * as React from "react"; import * as React from "react";
const LocaleTime = React.lazy(() => const LocaleTime = React.lazy(() =>
@ -15,7 +15,7 @@ type Props = {
}; };
function Time(props: Props) { function Time(props: Props) {
let content = distanceInWordsToNow(props.dateTime, { let content = formatDistanceToNow(Date.parse(props.dateTime), {
addSuffix: props.addSuffix, addSuffix: props.addSuffix,
}); });

View File

@ -8,5 +8,5 @@ export default function useUserLocale() {
return undefined; return undefined;
} }
return auth.user.language.split("_")[0]; return auth.user.language;
} }

View File

@ -1,6 +1,5 @@
// @flow // @flow
import addDays from "date-fns/add_days"; import { addDays, differenceInDays } from "date-fns";
import differenceInDays from "date-fns/difference_in_days";
import invariant from "invariant"; import invariant from "invariant";
import { action, computed, observable, set } from "mobx"; import { action, computed, observable, set } from "mobx";
import parseTitle from "shared/utils/parseTitle"; import parseTitle from "shared/utils/parseTitle";

View File

@ -3,7 +3,6 @@ import * as React from "react";
import { Switch, Redirect, type Match } from "react-router-dom"; import { Switch, Redirect, type Match } from "react-router-dom";
import Archive from "scenes/Archive"; import Archive from "scenes/Archive";
import Collection from "scenes/Collection"; import Collection from "scenes/Collection";
import KeyedDocument from "scenes/Document/KeyedDocument";
import DocumentNew from "scenes/DocumentNew"; import DocumentNew from "scenes/DocumentNew";
import Drafts from "scenes/Drafts"; import Drafts from "scenes/Drafts";
import Error404 from "scenes/Error404"; import Error404 from "scenes/Error404";
@ -23,7 +22,11 @@ import { matchDocumentSlug as slug } from "utils/routeHelpers";
const SettingsRoutes = React.lazy(() => const SettingsRoutes = React.lazy(() =>
import(/* webpackChunkName: "settings" */ "./settings") import(/* webpackChunkName: "settings" */ "./settings")
); );
const KeyedDocument = React.lazy(() =>
import(
/* webpackChunkName: "keyed-document" */ "scenes/Document/KeyedDocument"
)
);
const NotFound = () => <Search notFound />; const NotFound = () => <Search notFound />;
const RedirectDocument = ({ match }: { match: Match }) => ( const RedirectDocument = ({ match }: { match: Match }) => (
<Redirect <Redirect

View File

@ -1,5 +1,5 @@
// @flow // @flow
import distanceInWordsToNow from "date-fns/distance_in_words_to_now"; import { formatDistanceToNow } from "date-fns";
import invariant from "invariant"; import invariant from "invariant";
import { deburr, sortBy } from "lodash"; import { deburr, sortBy } from "lodash";
import { observable } from "mobx"; import { observable } from "mobx";
@ -94,8 +94,11 @@ class DataLoader extends React.Component<Props> {
// search for exact internal document // search for exact internal document
const slug = parseDocumentSlug(term); const slug = parseDocumentSlug(term);
try { try {
const { document } = await this.props.documents.fetch(slug); const {
const time = distanceInWordsToNow(document.updatedAt, { document,
}: { document: Document } = await this.props.documents.fetch(slug);
const time = formatDistanceToNow(Date.parse(document.updatedAt), {
addSuffix: true, addSuffix: true,
}); });
return [ return [
@ -118,7 +121,7 @@ class DataLoader extends React.Component<Props> {
return sortBy( return sortBy(
results.map((document) => { results.map((document) => {
const time = distanceInWordsToNow(document.updatedAt, { const time = formatDistanceToNow(document.updatedAt, {
addSuffix: true, addSuffix: true,
}); });
return { return {

View File

@ -1,5 +1,5 @@
// @flow // @flow
import distanceInWordsToNow from "date-fns/distance_in_words_to_now"; import { formatDistanceToNow } from "date-fns";
import invariant from "invariant"; import invariant from "invariant";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { GlobeIcon, PadlockIcon } from "outline-icons"; import { GlobeIcon, PadlockIcon } from "outline-icons";
@ -118,9 +118,12 @@ function SharePopover({ document, share, sharedParent, onSubmit }: Props) {
<> <>
.{" "} .{" "}
{t("The shared link was last accessed {{ timeAgo }}.", { {t("The shared link was last accessed {{ timeAgo }}.", {
timeAgo: distanceInWordsToNow(share.lastAccessedAt, { timeAgo: formatDistanceToNow(
addSuffix: true, Date.parse(share.lastAccessedAt),
}), {
addSuffix: true,
}
),
})} })}
</> </>
)} )}

View File

@ -1,5 +1,5 @@
// @flow // @flow
import distanceInWordsToNow from "date-fns/distance_in_words_to_now"; import { formatDistanceToNow } from "date-fns";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { EditIcon } from "outline-icons"; import { EditIcon } from "outline-icons";
import * as React from "react"; import * as React from "react";
@ -52,7 +52,7 @@ function UserProfile(props: Props) {
? t("Joined") ? t("Joined")
: t("Invited")}{" "} : t("Invited")}{" "}
{t("{{ time }} ago.", { {t("{{ time }} ago.", {
time: distanceInWordsToNow(new Date(user.createdAt)), time: formatDistanceToNow(new Date(user.createdAt)),
})} })}
{user.isAdmin && ( {user.isAdmin && (
<StyledBadge primary={user.isAdmin}>{t("Admin")}</StyledBadge> <StyledBadge primary={user.isAdmin}>{t("Admin")}</StyledBadge>

View File

@ -92,7 +92,7 @@
"compressorjs": "^1.0.7", "compressorjs": "^1.0.7",
"copy-to-clipboard": "^3.0.6", "copy-to-clipboard": "^3.0.6",
"core-js": "^3.10.2", "core-js": "^3.10.2",
"date-fns": "1.29.0", "date-fns": "2.22.1",
"dd-trace": "^0.32.2", "dd-trace": "^0.32.2",
"debug": "^4.1.1", "debug": "^4.1.1",
"dotenv": "^4.0.0", "dotenv": "^4.0.0",

View File

@ -1,5 +1,5 @@
// @flow // @flow
import format from "date-fns/format"; import { format } from "date-fns";
import Router from "koa-router"; import Router from "koa-router";
import { v4 as uuidv4 } from "uuid"; import { v4 as uuidv4 } from "uuid";
import { NotFoundError } from "../errors"; import { NotFoundError } from "../errors";
@ -39,7 +39,7 @@ router.post("attachments.create", auth(), async (ctx) => {
const bucket = acl === "public-read" ? "public" : "uploads"; const bucket = acl === "public-read" ? "public" : "uploads";
const key = `${bucket}/${user.id}/${s3Key}/${name}`; const key = `${bucket}/${user.id}/${s3Key}/${name}`;
const credential = makeCredential(); const credential = makeCredential();
const longDate = format(new Date(), "YYYYMMDDTHHmmss\\Z"); const longDate = format(new Date(), "yyyyMMdd'T'HHmmss'Z'");
const policy = makePolicy(credential, longDate, acl, contentType); const policy = makePolicy(credential, longDate, acl, contentType);
const endpoint = publicS3Endpoint(); const endpoint = publicS3Endpoint();
const url = `${endpoint}/${key}`; const url = `${endpoint}/${key}`;

View File

@ -1,5 +1,5 @@
// @flow // @flow
import subDays from "date-fns/sub_days"; import { subDays } from "date-fns";
import debug from "debug"; import debug from "debug";
import Router from "koa-router"; import Router from "koa-router";
import { AuthenticationError } from "../errors"; import { AuthenticationError } from "../errors";

View File

@ -1,5 +1,5 @@
/* eslint-disable flowtype/require-valid-file-annotation */ /* eslint-disable flowtype/require-valid-file-annotation */
import subDays from "date-fns/sub_days"; import { subDays } from "date-fns";
import TestServer from "fetch-test-server"; import TestServer from "fetch-test-server";
import app from "../app"; import app from "../app";
import { Attachment, Document } from "../models"; import { Attachment, Document } from "../models";

View File

@ -1,6 +1,6 @@
// @flow // @flow
import passport from "@outlinewiki/koa-passport"; import passport from "@outlinewiki/koa-passport";
import addMonths from "date-fns/add_months"; import { addMonths } from "date-fns";
import debug from "debug"; import debug from "debug";
import Koa from "koa"; import Koa from "koa";
import bodyParser from "koa-body"; import bodyParser from "koa-body";

View File

@ -1,5 +1,5 @@
// @flow // @flow
import subMinutes from "date-fns/sub_minutes"; import { subMinutes } from "date-fns";
import Router from "koa-router"; import Router from "koa-router";
import { find } from "lodash"; import { find } from "lodash";
import { AuthorizationError } from "../../errors"; import { AuthorizationError } from "../../errors";

View File

@ -1,7 +1,6 @@
// @flow // @flow
import crypto from "crypto"; import crypto from "crypto";
import addMinutes from "date-fns/add_minutes"; import { addMinutes, subMinutes } from "date-fns";
import subMinutes from "date-fns/sub_minutes";
import JWT from "jsonwebtoken"; import JWT from "jsonwebtoken";
import { v4 as uuidv4 } from "uuid"; import { v4 as uuidv4 } from "uuid";
import { languages } from "../../shared/i18n"; import { languages } from "../../shared/i18n";

View File

@ -1,5 +1,5 @@
// @flow // @flow
import subMilliseconds from "date-fns/sub_milliseconds"; import { subMilliseconds } from "date-fns";
import { USER_PRESENCE_INTERVAL } from "../../shared/constants"; import { USER_PRESENCE_INTERVAL } from "../../shared/constants";
import { User } from "../models"; import { User } from "../models";
import { DataTypes, Op, sequelize } from "../sequelize"; import { DataTypes, Op, sequelize } from "../sequelize";

View File

@ -1,5 +1,5 @@
// @flow // @flow
import subHours from "date-fns/sub_hours"; import { subHours } from "date-fns";
import type { Event } from "../events"; import type { Event } from "../events";
import { socketio } from "../main"; import { socketio } from "../main";
import { import {

View File

@ -1,7 +1,7 @@
// @flow // @flow
import querystring from "querystring"; import querystring from "querystring";
import * as Sentry from "@sentry/node"; import * as Sentry from "@sentry/node";
import addMonths from "date-fns/add_months"; import { addMonths } from "date-fns";
import { type Context } from "koa"; import { type Context } from "koa";
import { pick } from "lodash"; import { pick } from "lodash";
import { User, Event, Team } from "../models"; import { User, Event, Team } from "../models";

View File

@ -1,5 +1,5 @@
// @flow // @flow
import subMinutes from "date-fns/sub_minutes"; import { subMinutes } from "date-fns";
import JWT from "jsonwebtoken"; import JWT from "jsonwebtoken";
import { AuthenticationError } from "../errors"; import { AuthenticationError } from "../errors";
import { Team, User } from "../models"; import { Team, User } from "../models";

View File

@ -1,6 +1,5 @@
// @flow // @flow
import addMinutes from "date-fns/add_minutes"; import { addMinutes, subMinutes } from "date-fns";
import subMinutes from "date-fns/sub_minutes";
import { type Request } from "koa"; import { type Request } from "koa";
import { OAuthStateMismatchError } from "../errors"; import { OAuthStateMismatchError } from "../errors";
import { getCookieDomain } from "./domains"; import { getCookieDomain } from "./domains";

View File

@ -2,8 +2,7 @@
import crypto from "crypto"; import crypto from "crypto";
import * as Sentry from "@sentry/node"; import * as Sentry from "@sentry/node";
import AWS from "aws-sdk"; import AWS from "aws-sdk";
import addHours from "date-fns/add_hours"; import { addHours, format } from "date-fns";
import format from "date-fns/format";
import fetch from "fetch-with-proxy"; import fetch from "fetch-with-proxy";
const AWS_SECRET_ACCESS_KEY = process.env.AWS_SECRET_ACCESS_KEY; const AWS_SECRET_ACCESS_KEY = process.env.AWS_SECRET_ACCESS_KEY;
@ -36,7 +35,7 @@ export const makeCredential = () => {
const credential = const credential =
AWS_ACCESS_KEY_ID + AWS_ACCESS_KEY_ID +
"/" + "/" +
format(new Date(), "YYYYMMDD") + format(new Date(), "yyyyMMdd") +
"/" + "/" +
AWS_REGION + AWS_REGION +
"/s3/aws4_request"; "/s3/aws4_request";
@ -62,7 +61,7 @@ export const makePolicy = (
{ "x-amz-credential": credential }, { "x-amz-credential": credential },
{ "x-amz-date": longDate }, { "x-amz-date": longDate },
], ],
expiration: format(tomorrow, "YYYY-MM-DDTHH:mm:ss\\Z"), expiration: format(tomorrow, "yyyy-MM-dd'T'HH:mm:ss'Z'"),
}; };
return Buffer.from(JSON.stringify(policy)).toString("base64"); return Buffer.from(JSON.stringify(policy)).toString("base64");
@ -71,7 +70,7 @@ export const makePolicy = (
export const getSignature = (policy: any) => { export const getSignature = (policy: any) => {
const kDate = hmac( const kDate = hmac(
"AWS4" + AWS_SECRET_ACCESS_KEY, "AWS4" + AWS_SECRET_ACCESS_KEY,
format(new Date(), "YYYYMMDD") format(new Date(), "yyyyMMdd")
); );
const kRegion = hmac(kDate, AWS_REGION); const kRegion = hmac(kDate, AWS_REGION);
const kService = hmac(kRegion, "s3"); const kService = hmac(kRegion, "s3");

View File

@ -13,6 +13,7 @@ export const languageOptions = [
{ label: "Français (France)", value: "fr_FR" }, { label: "Français (France)", value: "fr_FR" },
{ label: "Italiano (Italia)", value: "it_IT" }, { label: "Italiano (Italia)", value: "it_IT" },
{ label: "한국어 (Korean)", value: "ko_KR" }, { label: "한국어 (Korean)", value: "ko_KR" },
{ label: "Português (Brazil)", value: "pt_BR" },
{ label: "Português (Portugal)", value: "pt_PT" }, { label: "Português (Portugal)", value: "pt_PT" },
{ label: "Pусский (Россия)", value: "ru_RU" }, { label: "Pусский (Россия)", value: "ru_RU" },
]; ];

View File

@ -1,8 +1,5 @@
// @flow // @flow
import subDays from "date-fns/sub_days"; import { subDays, subMonths, subWeeks, subYears } from "date-fns";
import subMonth from "date-fns/sub_months";
import subWeek from "date-fns/sub_weeks";
import subYear from "date-fns/sub_years";
export function subtractDate( export function subtractDate(
date: Date, date: Date,
@ -12,11 +9,11 @@ export function subtractDate(
case "day": case "day":
return subDays(date, 1); return subDays(date, 1);
case "week": case "week":
return subWeek(date, 1); return subWeeks(date, 1);
case "month": case "month":
return subMonth(date, 1); return subMonths(date, 1);
case "year": case "year":
return subYear(date, 1); return subYears(date, 1);
default: default:
return date; return date;
} }

View File

@ -99,13 +99,24 @@ module.exports = {
moduleIds: 'hashed', moduleIds: 'hashed',
chunkIds: 'named', chunkIds: 'named',
splitChunks: { splitChunks: {
chunks: 'async',
minSize: 20000,
minChunks: 1,
maxAsyncRequests: 30,
maxInitialRequests: 30,
enforceSizeThreshold: 50000,
cacheGroups: { cacheGroups: {
vendor: { defaultVendors: {
test: /[\\/]node_modules[\\/]/, test: /[\\/]node_modules[\\/]/,
name: 'vendors', priority: -10,
chunks: 'initial', reuseExistingChunk: true,
}, },
}, default: {
}, minChunks: 2,
priority: -20,
reuseExistingChunk: true,
}
}
}
} }
}; };

View File

@ -4381,10 +4381,10 @@ data-urls@^2.0.0:
whatwg-mimetype "^2.3.0" whatwg-mimetype "^2.3.0"
whatwg-url "^8.0.0" whatwg-url "^8.0.0"
date-fns@1.29.0: date-fns@2.22.1:
version "1.29.0" version "2.22.1"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.22.1.tgz#1e5af959831ebb1d82992bf67b765052d8f0efc4"
integrity sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw== integrity sha512-yUFPQjrxEmIsMqlHhAhmxkuH769baF21Kk+nZwZGyrMoyLA+LugaQtC0+Tqf9CBUUULWwUJt6Q5ySI3LJDDCGg==
dd-trace@^0.32.2: dd-trace@^0.32.2:
version "0.32.2" version "0.32.2"