diff --git a/packages/common-components/src/MenuDropdown/MenuDropdown.tsx b/packages/common-components/src/MenuDropdown/MenuDropdown.tsx index 7c73d2c959..e64a71ae86 100644 --- a/packages/common-components/src/MenuDropdown/MenuDropdown.tsx +++ b/packages/common-components/src/MenuDropdown/MenuDropdown.tsx @@ -218,7 +218,7 @@ const MenuDropdown: React.FC = ({ {title && ( {title} diff --git a/packages/files-ui/.linguirc b/packages/files-ui/.linguirc index 1b7ae61f54..2c705d1e0d 100644 --- a/packages/files-ui/.linguirc +++ b/packages/files-ui/.linguirc @@ -9,6 +9,6 @@ "formatOptions": { "origins": false }, - "locales": ["en"], + "locales": ["en", "fr"], "sourceLocale": "en" } \ No newline at end of file diff --git a/packages/files-ui/src/App.tsx b/packages/files-ui/src/App.tsx index d95f81cfe1..73f8394c4d 100644 --- a/packages/files-ui/src/App.tsx +++ b/packages/files-ui/src/App.tsx @@ -1,4 +1,4 @@ -import React, { useEffect } from "react" +import React, { useCallback, useEffect } from "react" import { init as initSentry, ErrorBoundary, showReportDialog } from "@sentry/react" import { Web3Provider } from "@chainsafe/web3-context" import { ImployApiProvider, UserProvider, BillingProvider } from "@chainsafe/common-contexts" @@ -25,13 +25,42 @@ if ( environment: process.env.REACT_APP_SENTRY_ENV }) } + +const availableLanguages = [ + { id: "en", label: "English" }, + { id: "fr", label: "Français" } +] + +const onboardConfig = { + dappId: process.env.REACT_APP_BLOCKNATIVE_ID || "", + walletSelect: { + wallets: [ + { walletName: "coinbase" }, + { + walletName: "trust", + rpcUrl: + "https://mainnet.infura.io/v3/a7e16429d2254d488d396710084e2cd3" + }, + { walletName: "metamask", preferred: true }, + { walletName: "authereum" }, + { walletName: "opera" }, + { walletName: "operaTouch" }, + { walletName: "torus" }, + { walletName: "status" }, + { + walletName: "walletConnect", + infuraKey: "a7e16429d2254d488d396710084e2cd3", + preferred: true + } + ] + } +} + const App: React.FC<{}> = () => { const { initHotjar } = useHotjar() const { canUseLocalStorage } = useLocalStorage() const hotjarId = process.env.REACT_APP_HOTJAR_ID - const apiUrl = - process.env.REACT_APP_API_URL || "https://stage.imploy.site/api/v1" - + const apiUrl = process.env.REACT_APP_API_URL || "https://stage.imploy.site/api/v1" // This will default to testnet unless mainnet is specifically set in the ENV const directAuthNetwork = (process.env.REACT_APP_DIRECT_AUTH_NETWORK === "mainnet") ? "mainnet" : "testnet" @@ -41,64 +70,43 @@ const App: React.FC<{}> = () => { } }, [hotjarId, initHotjar]) + const fallBack = useCallback(({ error, componentStack, eventId, resetError }) => ( + + + An error occurred and has been logged. If you would like to + provide additional info to help us debug and resolve the issue, + click the `"`Provide Additional Details`"` button + + {error?.message.toString()} + {componentStack} + {eventId} + + + + ), []) + return ( ( - - - An error occurred and has been logged. If you would like to - provide additional info to help us debug and resolve the issue, - click the `"`Provide Additional Details`"` button - - {error?.message.toString()} - {componentStack} - {eventId} - - - - )} + fallback={fallBack} onReset={() => window.location.reload()} > - - + + diff --git a/packages/files-ui/src/Components/Elements/MnemonicForm.tsx b/packages/files-ui/src/Components/Elements/MnemonicForm.tsx index 9f2714ed90..2c50eb4c70 100644 --- a/packages/files-ui/src/Components/Elements/MnemonicForm.tsx +++ b/packages/files-ui/src/Components/Elements/MnemonicForm.tsx @@ -78,7 +78,7 @@ const useStyles = makeStyles(({ animation, constants, palette, zIndex }: CSFThem width: 35, marginLeft: constants.generalUnit * 3, "&.active": { - fill: palette.success.main + fill: palette.primary.main } }, loader: { @@ -160,7 +160,7 @@ const MnemonicForm = ({ buttonLabel, onComplete }: Props) => {
- Copied! + Copied!
diff --git a/packages/files-ui/src/Components/FilesRoutes.tsx b/packages/files-ui/src/Components/FilesRoutes.tsx index b1bad41dce..3589c19f7d 100644 --- a/packages/files-ui/src/Components/FilesRoutes.tsx +++ b/packages/files-ui/src/Components/FilesRoutes.tsx @@ -16,7 +16,7 @@ export const ROUTE_LINKS = { Terms: "https://files.chainsafe.io/terms-of-service", ChainSafe: "https://chainsafe.io/", // TODO: update link - ApplyCryptography: "https://chainsafe.io/", + ApplyCryptography: "https://medium.com/chainsafe-systems/major-improvement-to-chainsafe-files-ab489d3e52a2", Home: (path?: string) => `/home${path ? `?path=${path}` : ""}`, Search: (search?: string) => `/search${search ? `?search=${search}` : ""}`, Bin: "/bin", diff --git a/packages/files-ui/src/Components/Modules/FileBrowsers/FileInfoModal.tsx b/packages/files-ui/src/Components/Modules/FileBrowsers/FileInfoModal.tsx index 2d3a293401..86f6fd8e20 100644 --- a/packages/files-ui/src/Components/Modules/FileBrowsers/FileInfoModal.tsx +++ b/packages/files-ui/src/Components/Modules/FileBrowsers/FileInfoModal.tsx @@ -206,7 +206,7 @@ const FileInfoModal: React.FC = ({ > General
- {fullFileInfo.persistent?.uploaded ? ( + {fullFileInfo.persistent?.uploaded && (
= ({ {fullFileInfo.persistent?.uploaded}
- ) : null} - {fullFileInfo.content?.size !== undefined ? ( + )} + {fullFileInfo.content?.size !== undefined && (
= ({ {formatBytes(fullFileInfo.content?.size)}
- ) : null} + )}
= ({ > Technical - {fullFileInfo.persistent?.stored_cid !== undefined ? ( + {fullFileInfo.persistent?.stored_cid !== undefined && (
= ({ {fullFileInfo.persistent?.stored_cid}
- ) : null} - {fullFileInfo.persistent?.stored_cid !== undefined ? ( + )} + {fullFileInfo.persistent?.stored_cid !== undefined && (
= ({ {fullFileInfo.persistent?.stored_cid}
- ) : null} + )}
= ({ > CID (Content Identifier) - {copied ? ( + {copied && ( = ({ classes.copiedContainer )} > - copied ! + copied! - ) : null} + )} {uploadInProgress.noOfFiles > 1 - ? `Uploading ${uploadInProgress.noOfFiles} files` + ? t`Uploading ${uploadInProgress.noOfFiles} files` : uploadInProgress.fileName} diff --git a/packages/files-ui/src/Components/Modules/FilePreviewModal.tsx b/packages/files-ui/src/Components/Modules/FilePreviewModal.tsx index 02b1010d78..fe11dfa372 100644 --- a/packages/files-ui/src/Components/Modules/FilePreviewModal.tsx +++ b/packages/files-ui/src/Components/Modules/FilePreviewModal.tsx @@ -303,37 +303,37 @@ const FilePreviewModal = ({ file, nextFile, previousFile, closePreview, path }: menuItems={[ // { // contents: ( - // + // <> // // Move - // + // // ), // onClick: () => console.log, // }, // { // contents: ( - // + // <> // // Share - // + // // ), // onClick: () => console.log, // }, // { // contents: ( - // + // <> // // Rename - // + // // ), // onClick: () => console.log, // }, // { // contents: ( - // + // <> // // Delete - // + // // ), // onClick: () => console.log, // }, diff --git a/packages/files-ui/src/Components/Modules/LoginModule/AuthenticationFactors.tsx b/packages/files-ui/src/Components/Modules/LoginModule/AuthenticationFactors.tsx index cd8ef73174..70ff337984 100644 --- a/packages/files-ui/src/Components/Modules/LoginModule/AuthenticationFactors.tsx +++ b/packages/files-ui/src/Components/Modules/LoginModule/AuthenticationFactors.tsx @@ -89,6 +89,13 @@ const useStyles = makeStyles(({ breakpoints, constants, typography, palette, zIn [breakpoints.down("md")]: { marginTop: constants.generalUnit * 3 } + }, + title: { + fontWeight: 400, + marginBottom: constants.generalUnit * 2.5, + [breakpoints.down("md")]: { + ...typography.h4 + } } }) ) @@ -109,8 +116,9 @@ const AuthenticationFactors = ({ goToComplete, goToMnemonic, goToPassword, goToS return (
Your Authentication Factors diff --git a/packages/files-ui/src/Components/Modules/LoginModule/Complete.tsx b/packages/files-ui/src/Components/Modules/LoginModule/Complete.tsx index e718159513..b9e6633d32 100644 --- a/packages/files-ui/src/Components/Modules/LoginModule/Complete.tsx +++ b/packages/files-ui/src/Components/Modules/LoginModule/Complete.tsx @@ -67,8 +67,8 @@ const useStyles = makeStyles(({ breakpoints, constants, palette, zIndex }: CSFTh color: constants.loginModule.completeBg, backgroundColor: constants.loginModule.completeText, "&:hover": { - backgroundColor: palette.success.main, - color: constants.loginModule.completeBg + backgroundColor: palette.primary.main, + color: palette.common.white.main } } }) @@ -99,7 +99,7 @@ const Complete = ({ className }: IComplete) => { Thanks for taking care of that. You can
adjust these anytime in security settings. diff --git a/packages/files-ui/src/Components/Modules/LoginModule/ConciseExplainer.tsx b/packages/files-ui/src/Components/Modules/LoginModule/ConciseExplainer.tsx index f5dfd11dc9..fcee471483 100644 --- a/packages/files-ui/src/Components/Modules/LoginModule/ConciseExplainer.tsx +++ b/packages/files-ui/src/Components/Modules/LoginModule/ConciseExplainer.tsx @@ -129,7 +129,7 @@ const ConciseExplainer: React.FC = ({ className, onConti className={classes.subtitle} > - For security reasons, upon signing in we’ll ask you for one of the following to confirm your identity. + For security reasons, each time you sign in we’ll ask you for one of the following to confirm your identity.   = ({ className, onConti alt="password and keys" /> - Enter a password + Enter password
diff --git a/packages/files-ui/src/Components/Modules/LoginModule/ConfirmSkip.tsx b/packages/files-ui/src/Components/Modules/LoginModule/ConfirmSkip.tsx index 1dd8904160..547230a9f7 100644 --- a/packages/files-ui/src/Components/Modules/LoginModule/ConfirmSkip.tsx +++ b/packages/files-ui/src/Components/Modules/LoginModule/ConfirmSkip.tsx @@ -24,6 +24,8 @@ const useStyles = makeStyles(({ breakpoints, constants, typography }: CSFTheme) } }, warning: { + fontSize: 16, + lineHeight: "24px", [breakpoints.up("md")]: { marginTop: constants.generalUnit * 2.5, marginBottom: constants.generalUnit * 14.5 @@ -50,6 +52,9 @@ const useStyles = makeStyles(({ breakpoints, constants, typography }: CSFTheme) position: "relative", left: -constants.generalUnit } + }, + importantText:{ + textDecorationLine: "underline" } }) ) @@ -72,7 +77,7 @@ const ConfirmSkip = ({ cancel, confirm, className }: IConfirmSkip) => { component="p" > - Are you sure? + Setup incomplete @@ -81,10 +86,8 @@ const ConfirmSkip = ({ cancel, confirm, className }: IConfirmSkip) => { component="p" > - Without setting up at least three authentication factors, - you risk getting locked out of your account. -

Remember, you need a minimum of two factors to sign in. - If you only have one, you’ll lose access to your account forever. + You’re at risk of getting locked out of your account + because you only have two auth factors set up. Add at least one more to ensure account recovery.
@@ -96,7 +99,7 @@ const ConfirmSkip = ({ cancel, confirm, className }: IConfirmSkip) => { variant="outline" > - Yes I understand + I understand the risk diff --git a/packages/files-ui/src/Components/Modules/LoginModule/InitialScreen.tsx b/packages/files-ui/src/Components/Modules/LoginModule/InitialScreen.tsx index 1956cf261e..ca4bf9a65c 100644 --- a/packages/files-ui/src/Components/Modules/LoginModule/InitialScreen.tsx +++ b/packages/files-ui/src/Components/Modules/LoginModule/InitialScreen.tsx @@ -12,7 +12,7 @@ import clsx from "clsx" import { IdentityProvider } from "@chainsafe/files-api-client" const useStyles = makeStyles( - ({ constants, palette, breakpoints }: CSFTheme) => + ({ constants, palette, breakpoints, typography }: CSFTheme) => createStyles({ root: { backgroundColor: constants.loginModule.background, @@ -64,7 +64,11 @@ const useStyles = makeStyles( }, button: { width: 240, + fontWeight: typography.fontWeight.medium, marginBottom: constants.generalUnit * 2, + "& .icon" : { + fontSize: 25 + }, "&:last-child": { marginBottom: 0 } @@ -122,6 +126,9 @@ const useStyles = makeStyles( textDecoration: "underline", cursor: "pointer", textAlign: "center" + }, + web3Button: { + minHeight: 41 } }) ) @@ -251,7 +258,7 @@ const InitialScreen = ({ className }: IInitialScreen) => { setLoginMode("web3") handleSelectWalletAndConnect() }} - className={classes.button} + className={clsx(classes.button, classes.web3Button)} variant="primary" size="large" disabled={maintenanceMode || isConnecting || status !== "initialized"} @@ -260,35 +267,35 @@ const InitialScreen = ({ className }: IInitialScreen) => { diff --git a/packages/files-ui/src/Components/Modules/LoginModule/MissingShares.tsx b/packages/files-ui/src/Components/Modules/LoginModule/MissingShares.tsx index 6130ad13f1..72501688cf 100644 --- a/packages/files-ui/src/Components/Modules/LoginModule/MissingShares.tsx +++ b/packages/files-ui/src/Components/Modules/LoginModule/MissingShares.tsx @@ -190,7 +190,7 @@ const MissingShares = ({ className }: IMissingShares) => { size="large" onClick={() => setWithPassword(true)} > - Enter a password + Enter password )}
diff --git a/packages/files-ui/src/Components/Modules/Settings/Security/index.tsx b/packages/files-ui/src/Components/Modules/Settings/Security/index.tsx index c53756e9cf..a4714772cf 100644 --- a/packages/files-ui/src/Components/Modules/Settings/Security/index.tsx +++ b/packages/files-ui/src/Components/Modules/Settings/Security/index.tsx @@ -325,8 +325,8 @@ const Security = ({ className }: SecurityProps) => {
- A backup phrase will be generated for your account.
- We do not store it and it can only be displayed once. Please save it somewhere safe! + A backup phrase will be generated and used for your account.
+ We do not store it and it can only be displayed once. Save it somewhere safe!
{
- Backup Phrase + Backup phrase diff --git a/packages/files-ui/src/Contexts/LanguageContext.tsx b/packages/files-ui/src/Contexts/LanguageContext.tsx index 26d6812af8..b9fcd1d17b 100644 --- a/packages/files-ui/src/Contexts/LanguageContext.tsx +++ b/packages/files-ui/src/Contexts/LanguageContext.tsx @@ -1,15 +1,15 @@ -import React, { useState, useEffect } from "react" +import React, { useState, useEffect, useCallback } from "react" import { i18n } from "@lingui/core" -import { messages as catalogEn } from "../locales/en/messages" import { I18nProvider } from "@lingui/react" import * as plurals from "make-plural/plurals" +import { useLocalStorage } from "@chainsafe/browser-storage-hooks" +import dayjs from "dayjs" export type LanguageContext = { availableLanguages: Language[] selectedLanguage: string selectedLocale: string setActiveLanguage(newLanguage: string): void | Promise - formatLocaleDate(date: Date): string } type Language = { @@ -22,29 +22,38 @@ type LanguageProviderProps = { availableLanguages: Language[] } -const LanguageContext = React.createContext( - undefined -) +const DEFAULT_LANGUAGE = "en" +const DEFAULT_LOCALE = "en-GB" +const PREFERED_LANGUAGE_KEY = "csf.preferedLanguage" -const getLanguages = (): string[] => { - // eslint-disable-next-line @typescript-eslint/ban-ts-ignore - // @ts-ignore - const { languages, language, userLanguage } = window.navigator +const defaultContext: LanguageContext = { + availableLanguages: [], + selectedLanguage: DEFAULT_LANGUAGE, + selectedLocale: DEFAULT_LOCALE, + setActiveLanguage: () => {console.error("setActiveLanguage not implemented")} +} + +const LanguageContext = React.createContext(defaultContext) + +const getLanguages = (preferred = ""): string[] => { + const { languages, language } = window.navigator if (Array.isArray(languages)) { // Dedupe array of languages - return [...new Set(languages.map((l) => l.split("-")[0]))] + const deduped = [...new Set(languages.map((l) => l.split("-")[0]))] + const preferredFirst = preferred + ? [preferred, ...deduped.filter((lang) => preferred !== lang)] + : deduped + + return preferredFirst } if (language) { - return [language.split("-")[0]] + return [preferred, language.split("-")[0]] } - if (userLanguage) { - return [userLanguage.split("-")[0]] - } // If language not detected use english - return ["en"] + return [preferred, DEFAULT_LANGUAGE] } const getLocales = (): string[] => { @@ -65,66 +74,54 @@ const getLocales = (): string[] => { return [userLanguage] } // If language not detected use english - return ["en-GB"] + return [DEFAULT_LOCALE] } -const LanguageProvider = ({ - children, - availableLanguages -}: LanguageProviderProps) => { - const [selectedLanguage, setSelectedLanguage] = useState("") +const LanguageProvider = ({ children, availableLanguages }: LanguageProviderProps) => { + const [selectedLanguage, setSelectedLanguage] = useState("") + const { localStorageGet, localStorageSet } = useLocalStorage() const userLocales = getLocales() - useEffect(() => { - const userLanguages = getLanguages() + const setLanguage = useCallback((newLanguage: string, setPrefered = true) => { + if (!availableLanguages.find((l) => l.id === newLanguage)) { + console.error("Locale is not available, evalutaing:", newLanguage) + return + } + + import(`../locales/${newLanguage}/messages.js`) + .then((newCatalog) => { + i18n.load(newLanguage, newCatalog.default.messages) + i18n.loadLocaleData(newLanguage, { plurals: (plurals as Record)[newLanguage] }) + i18n.activate(newLanguage) + setSelectedLanguage(newLanguage) + setPrefered && localStorageSet(PREFERED_LANGUAGE_KEY, newLanguage) + dayjs.locale(newLanguage) + }) + .catch(console.error) + }, [availableLanguages, localStorageSet]) + + useEffect(() => { + const prefered = localStorageGet(PREFERED_LANGUAGE_KEY) + const userLanguages = getLanguages(prefered || "") const matchingLanguages = [...new Set(userLanguages)].filter((x) => new Set(availableLanguages.map((l) => l.id)).has(x) ) - const defaultLanguage = matchingLanguages[0] || "en" - // eslint-disable-next-line @typescript-eslint/ban-ts-ignore - //@ts-ignore - i18n.loadLocaleData(defaultLanguage, { plurals: plurals[defaultLanguage] }) - i18n.load(defaultLanguage, catalogEn) - i18n.activate(defaultLanguage) - setSelectedLanguage(defaultLanguage) - }, [availableLanguages]) - - const formatLocaleDate = (date: Date) => { - const result = new Intl.DateTimeFormat(userLocales[0], { - timeZone: "UTC", - timeZoneName: "short", - hour: "numeric", - minute: "numeric", - hour12: false, - month: "numeric", - day: "numeric", - year: "numeric" - }).format(date) - - return result - } - const setLanguage = async (newLanguage: string) => { - if (!availableLanguages.map((l) => l.id).includes(newLanguage)) { - console.log("This locale is not available") - return - } + const defaultLanguage = matchingLanguages[0] || DEFAULT_LANGUAGE - // const newCatalog = await import(`../locales/${newLanguage}/messages.js`) - // i18n.load(newLanguage, neimport { messagesascatalogEn } from "locales/en/messages.mjs"; - // i18n.activate(newLanguage) - setSelectedLanguage(newLanguage) - } + // passing false because this language wasn't + // set explicitely by the user + setLanguage(defaultLanguage, false) + }, [availableLanguages, localStorageGet, setLanguage]) return ( {children} diff --git a/packages/files-ui/src/Media/landing/layers/desktop-mobile.png b/packages/files-ui/src/Media/landing/layers/desktop-mobile.png index 67796a6f79..251a0b9b51 100644 Binary files a/packages/files-ui/src/Media/landing/layers/desktop-mobile.png and b/packages/files-ui/src/Media/landing/layers/desktop-mobile.png differ diff --git a/packages/files-ui/src/Media/landing/layers/password-key.png b/packages/files-ui/src/Media/landing/layers/password-key.png index 9820a7c8e3..dfe52b2803 100644 Binary files a/packages/files-ui/src/Media/landing/layers/password-key.png and b/packages/files-ui/src/Media/landing/layers/password-key.png differ diff --git a/packages/files-ui/src/Media/landing/layers/peaceful-succotash.png b/packages/files-ui/src/Media/landing/layers/peaceful-succotash.png index 6ff364e343..ff00b5a14b 100644 Binary files a/packages/files-ui/src/Media/landing/layers/peaceful-succotash.png and b/packages/files-ui/src/Media/landing/layers/peaceful-succotash.png differ diff --git a/packages/files-ui/src/locales/en/messages.po b/packages/files-ui/src/locales/en/messages.po index 3195b78d51..f4162332f5 100644 --- a/packages/files-ui/src/locales/en/messages.po +++ b/packages/files-ui/src/locales/en/messages.po @@ -16,12 +16,12 @@ msgstr "" msgid "(Change)" msgstr "(Change)" +msgid "<0>You’re at risk of getting locked out of your account because you only have two auth factors set up. Add at least one more to ensure account recovery." +msgstr "<0>You’re at risk of getting locked out of your account because you only have two auth factors set up. Add at least one more to ensure account recovery." + msgid "A backup phrase will be generated and used for your account.<0/>We do not store it and <1>it can only be displayed once. Save it somewhere safe!" msgstr "A backup phrase will be generated and used for your account.<0/>We do not store it and <1>it can only be displayed once. Save it somewhere safe!" -msgid "A backup phrase will be generated for your account.<0/>We do not store it and <1>it can only be displayed once. Please save it somewhere safe!" -msgstr "A backup phrase will be generated for your account.<0/>We do not store it and <1>it can only be displayed once. Please save it somewhere safe!" - msgid "A file with the same name already exists" msgstr "A file with the same name already exists" @@ -37,12 +37,6 @@ msgstr "Add more files" msgid "Approve" msgstr "Approve" -msgid "Are you sure?" -msgstr "Are you sure?" - -msgid "Backup Phrase" -msgstr "Backup Phrase" - msgid "Backup phrase" msgstr "Backup phrase" @@ -160,12 +154,12 @@ msgstr "Download recovery key" msgid "Drop to upload files" msgstr "Drop to upload files" -msgid "Enter a password" -msgstr "Enter a password" - msgid "Enter backup phrase:" msgstr "Enter backup phrase:" +msgid "Enter password" +msgstr "Enter password" + msgid "Enter password:" msgstr "Enter password:" @@ -211,6 +205,9 @@ msgstr "Files" msgid "Files uses device backups to save your browser." msgstr "Files uses device backups to save your browser." +msgid "First name" +msgstr "First name" + msgid "Folder" msgstr "Folder" @@ -220,8 +217,8 @@ msgstr "Folder created successfully" msgid "Folders" msgstr "Folders" -msgid "For security reasons, upon signing in we’ll ask you for one of the following to confirm your identity." -msgstr "For security reasons, upon signing in we’ll ask you for one of the following to confirm your identity." +msgid "For security reasons, each time you sign in we’ll ask you for one of the following to confirm your identity." +msgstr "For security reasons, each time you sign in we’ll ask you for one of the following to confirm your identity." msgid "Forget this browser" msgstr "Forget this browser" @@ -259,12 +256,21 @@ msgstr "Hold on, we are logging you in..." msgid "Home" msgstr "Home" +msgid "I understand the risk" +msgstr "I understand the risk" + msgid "Info" msgstr "Info" msgid "I’m done saving my backup phrase" msgstr "I’m done saving my backup phrase" +msgid "Language" +msgstr "Language" + +msgid "Last name" +msgstr "Last name" + msgid "Learn more" msgstr "Learn more" @@ -283,6 +289,9 @@ msgstr "Loading preview" msgid "Looks like you’re signing in from a new browser. Please choose one of the following to continue:" msgstr "Looks like you’re signing in from a new browser. Please choose one of the following to continue:" +msgid "Lorem ipsum aenean et rutrum magna. Morbi nec placerat erat. Nunc elementum sed libero sit amet convallis. Quisque non arcu vitae ex fringilla molestie." +msgstr "Lorem ipsum aenean et rutrum magna. Morbi nec placerat erat. Nunc elementum sed libero sit amet convallis. Quisque non arcu vitae ex fringilla molestie." + msgid "Move" msgstr "Move" @@ -451,15 +460,18 @@ msgstr "Set up" msgid "Set up a password" msgstr "Set up a password" +msgid "Set up auth factors" +msgstr "Set up auth factors" + msgid "Set up password" msgstr "Set up password" -msgid "Set up sign in methods" -msgstr "Set up sign in methods" - msgid "Settings" msgstr "Settings" +msgid "Setup incomplete" +msgstr "Setup incomplete" + msgid "Share" msgstr "Share" @@ -568,6 +580,9 @@ msgstr "Upload" msgid "Upload complete" msgstr "Upload complete" +msgid "Uploading {0} files" +msgstr "Uploading {0} files" + msgid "Use a different login method" msgstr "Use a different login method" @@ -592,12 +607,6 @@ msgstr "What a fine day it is." msgid "What a fine night it is." msgstr "What a fine night it is." -msgid "Without setting up at least three authentication factors, you risk getting locked out of your account.<0/><1/>Remember, you need a minimum of two factors to sign in. If you only have one, you’ll lose access to your account forever." -msgstr "Without setting up at least three authentication factors, you risk getting locked out of your account.<0/><1/>Remember, you need a minimum of two factors to sign in. If you only have one, you’ll lose access to your account forever." - -msgid "Yes I understand" -msgstr "Yes I understand" - msgid "Yes, save it" msgstr "Yes, save it" @@ -616,8 +625,8 @@ msgstr "Your Authentication Factors" msgid "Your recovery key can be used to restore your account in place of your backup phrase." msgstr "Your recovery key can be used to restore your account in place of your backup phrase." -msgid "copied !" -msgstr "copied !" +msgid "copied!" +msgstr "copied!" msgid "deleted successfully" msgstr "deleted successfully" @@ -633,6 +642,3 @@ msgstr "on" msgid "recovered successfully" msgstr "recovered successfully" - -msgid "storage-plan-desc" -msgstr "Lorem ipsum aenean et rutrum magna. Morbi nec placerat erat. Nunc elementum sed libero sit amet convallis. Quisque non arcu vitae ex fringilla molestie." diff --git a/packages/files-ui/src/locales/fr/messages.mo b/packages/files-ui/src/locales/fr/messages.mo new file mode 100644 index 0000000000..57df0909dc Binary files /dev/null and b/packages/files-ui/src/locales/fr/messages.mo differ diff --git a/packages/files-ui/src/locales/fr/messages.po b/packages/files-ui/src/locales/fr/messages.po new file mode 100644 index 0000000000..e7b4969fa8 --- /dev/null +++ b/packages/files-ui/src/locales/fr/messages.po @@ -0,0 +1,645 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2021-04-23 11:05+0200\n" +"Mime-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.3\n" +"Language: fr\n" +"Project-Id-Version: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Report-Msgid-Bugs-To: \n" +"Plural-Forms: \n" + +msgid "(Change)" +msgstr "(Changer)" + +msgid "<0>You’re at risk of getting locked out of your account because you only have two auth factors set up. Add at least one more to ensure account recovery." +msgstr "<0> Vous risquez d'être bloqué sur votre compte car vous n'avez configuré que deux facteurs d'authentification. Ajoutez-en au moins un autre pour garantir la récupération du compte." + +msgid "A backup phrase will be generated and used for your account.<0/>We do not store it and <1>it can only be displayed once. Save it somewhere safe!" +msgstr "Une phrase de backup sera générée et utilisé pour ce comte.<0/>Nous ne la sauvergardons pas <1>elle ne peut être montrée qu'une seule fois. Garde la dans un endroit sûr!" + +msgid "A file with the same name already exists" +msgstr "Un fichier avec ce nom existe déjà" + +msgid "Account" +msgstr "Compte" + +msgid "Add at least one more authentication method to protect your account. You’d only need any two to sign in to Files from any device." +msgstr "Ajoute au moins une méthode d’authentification pour protéger ce compte. Tu as besoin de 2 méthode pour accéder à Files depuis n'importe quel appareil." + +msgid "Add more files" +msgstr "Ajoute d'autres fichiers" + +msgid "Approve" +msgstr "Accepter" + +msgid "Backup phrase" +msgstr "Phrase de secours" + +msgid "Backup phrase does not match user account, please double-check and try again." +msgstr "La phrase de secours est incorrecte, merci de vérifier et réessayer." + +msgid "Bin" +msgstr "Corbeille" + +msgid "Browser:" +msgstr "Explorateur:" + +msgid "By connecting your wallet, you agree to our <0>Terms of Service and <1>Privacy Policy" +msgstr "En connectant ton portefeuille, tu acceptes nos <0>Terms of Service et <1>Privacy Policy" + +msgid "By forgetting this browser, you will not be able to use its associated recovery key to sign-in." +msgstr "Supprimer ce navigateur implique que la clé de sécurité qui lui est associée ne pourra plus être utilisé pour accéder à Files." + +msgid "CID (Content Identifier)" +msgstr "CID (Identifiant de contenu)" + +msgid "Cancel" +msgstr "Annuler" + +msgid "Change Password" +msgstr "Modifier" + +msgid "Change password" +msgstr "Modifier" + +msgid "Click or drag to upload files" +msgstr "Cliquer ou faire glisser un ficher pour uploader" + +msgid "Close" +msgstr "Fermer" + +msgid "Complete" +msgstr "Terminé" + +msgid "Confirm" +msgstr "Confirmer" + +msgid "Confirm Password:" +msgstr "Confirmer le mot de passe:" + +msgid "Connect Wallet to Files" +msgstr "Connecter un wallet à Files" + +msgid "Connect a new wallet" +msgstr "Connecter un nouveau wallet" + +msgid "Connection failed" +msgstr "La connexion a échouée" + +msgid "Continue" +msgstr "Continuer" + +msgid "Continue with Facebook" +msgstr "Continuer avec Facebook" + +msgid "Continue with Github" +msgstr "Continuer avec GitHub" + +msgid "Continue with Google" +msgstr "Continuer avec Google" + +msgid "Continue with Web3 Wallet" +msgstr "Continuer avec un wallet Web3" + +msgid "Copied!" +msgstr "Copié!" + +msgid "Copy CID" +msgstr "Copier le CID" + +msgid "Create" +msgstr "Créer" + +msgid "Create Folder" +msgstr "Créer un dossier" + +msgid "Create folder" +msgstr "Créer un dossier" + +msgid "Dark Theme" +msgstr "Thème sombre" + +msgid "Date uploaded" +msgstr "Ajouté le" + +msgid "Decryption failed" +msgstr "Le déchiffrage a échoué" + +msgid "Delete" +msgstr "Supprimer" + +msgid "Delete selected" +msgstr "Supprimer selection" + +msgid "Device awaiting confirmation" +msgstr "Appareil en attente de confirmation" + +msgid "Display Settings" +msgstr "Paramètres d'affichage" + +msgid "Download" +msgstr "Télécharger" + +msgid "Download complete" +msgstr "Téléchargement terminé" + +msgid "Download recovery key" +msgstr "Télécharger la clé de sauvegarde" + +msgid "Drop to upload files" +msgstr "Faire glisser pour uploader un fichier" + +msgid "Enter backup phrase:" +msgstr "Phrase de sauvegarder:" + +msgid "Enter password" +msgstr "Mot de passe" + +msgid "Enter password:" +msgstr "Mot de passe:" + +msgid "Essentials - Free" +msgstr "Essentials - Gratuit" + +msgid "Failed to get signature" +msgstr "Échec de l'obtention de la signature" + +msgid "Failed to migrate account, please try again." +msgstr "Échec de la migration du compte, veuillez réessayer." + +msgid "" +"Failed to validate signature.\n" +"If you are using a contract wallet, please make \n" +"sure you have activated your wallet." +msgstr "" +"Échec de la validation de la signature.\n" +"Si vous utilisez un contract wallet, veuillez\n" +"vérifier que vous avez activé votre wallet." + +msgid "File" +msgstr "Fichier" + +msgid "File Info" +msgstr "Info du fichier" + +msgid "File format not supported." +msgstr "Format de fichier non supporté." + +msgid "File moved successfully" +msgstr "Fichier déplacé avec succès" + +msgid "File renamed successfully" +msgstr "Fichier renommé avec succès" + +msgid "File size" +msgstr "Taille" + +msgid "Files" +msgstr "Fichiers" + +msgid "Files uses device backups to save your browser." +msgstr "Files enregistre ce navigateur." + +msgid "First name" +msgstr "Prénom" + +msgid "Folder" +msgstr "Dossier" + +msgid "Folder created successfully" +msgstr "Dossier créé avec succès" + +msgid "Folders" +msgstr "Dossiers" + +msgid "For security reasons, each time you sign in we’ll ask you for one of the following to confirm your identity." +msgstr "Pour des raisons de sécurité, chaque fois que vous vous connectez, nous vous demanderons l'une des informations suivantes pour confirmer votre identité." + +msgid "Forget this browser" +msgstr "Oublier ce navigateur" + +msgid "General" +msgstr "Info" + +msgid "Generate backup phrase" +msgstr "Créer une phrase de sauvegarde" + +msgid "Generate phrase" +msgstr "Créer une phrase de sauvegarde" + +msgid "Generating..." +msgstr "Création..." + +msgid "Get Started" +msgstr "Commencer" + +msgid "Go back" +msgstr "Retour" + +msgid "Great! You’re all done." +msgstr "Génial! Vous avez terminé." + +msgid "Hello again!" +msgstr "Ravis de vous revoir!" + +msgid "Hey! You only have two sign-in methods. If you lose that and have only one left, you will be locked out of your account forever." +msgstr "Hey! Tu ne disposes que de deux méthodes d'authentification. Si tu en perds une, tu seras bloqué pour toujours et ne pourras plus te connecter à ton compte Files." + +msgid "Hold on, we are logging you in..." +msgstr "Un instant, nous te connectons ..." + +msgid "Home" +msgstr "Accueil" + +msgid "I understand the risk" +msgstr "Je prends le risque" + +msgid "Info" +msgstr "Info" + +msgid "I’m done saving my backup phrase" +msgstr "Phrase de sauvegarde enregistrée" + +msgid "Language" +msgstr "Langue de l'interface" + +msgid "Last name" +msgstr "Nom" + +msgid "Learn more" +msgstr "En apprendre plus" + +msgid "Learn more about ChainSafe" +msgstr "En apprendre plus sur ChainSafe" + +msgid "Let's get you set up." +msgstr "C'est parti." + +msgid "Light Theme" +msgstr "Thème clair" + +msgid "Loading preview" +msgstr "Chargement de l’aperçu" + +msgid "Looks like you’re signing in from a new browser. Please choose one of the following to continue:" +msgstr "Connectez à partir d'un nouveau navigateur. Choisis une des options suivantes pour continuer:" + +msgid "Lorem ipsum aenean et rutrum magna. Morbi nec placerat erat. Nunc elementum sed libero sit amet convallis. Quisque non arcu vitae ex fringilla molestie." +msgstr "Lorem ipsum aenean et rutrum magna. Morbi nec placerat erat. Nunc elementum sed libero sit amet convallis. Quisque non arcu vitae ex fringilla molestie." + +msgid "Move" +msgstr "Déplacer" + +msgid "Move selected" +msgstr "Déplacer sélection" + +msgid "Move to..." +msgstr "Déplacer vers..." + +msgid "My Files" +msgstr "Mes Fichiers" + +msgid "Name" +msgstr "Nom" + +msgid "New folder" +msgstr "Nouveau dossier" + +msgid "Next" +msgstr "Suivant" + +msgid "Nice to see you again!" +msgstr "Ravi de te revoir!" + +msgid "No files to show" +msgstr "Aucun fichier à afficher" + +msgid "No folders" +msgstr "Aucun dossier" + +msgid "No search results for" +msgstr "Aucun fichier à afficher" + +msgid "No thanks" +msgstr "Non merci" + +msgid "Number of copies (Replication Factor)" +msgstr "Nombre de copies (facteur de réplication)" + +msgid "OK" +msgstr "OK" + +msgid "One sec, getting files ready..." +msgstr "Un instant, nous préparons vos fichiers..." + +msgid "Operating system:" +msgstr "Système d'exploitation:" + +msgid "Or confirm by signing into your Files on any browser you’ve used before." +msgstr "Ou accepte la requête de connexion depuis n'importe quel appareil ou navigateur utilisé auparavant." + +msgid "Password" +msgstr "Mot de passe" + +msgid "Password confirmation is required" +msgstr "La confirmation du mot de passe est requise" + +msgid "Password does not match user account, please double-check and try again." +msgstr "Le mot de passe ne correspond pas au compte, merci de vérifier et réessayer." + +msgid "Password needs to be more complex" +msgstr "Le mot de passe n'est pas assez sûr" + +msgid "Password setup" +msgstr "Configuration du mot de passe" + +msgid "Password:" +msgstr "Mot de Passe:" + +msgid "Passwords must match" +msgstr "Les mots de passes de correspondent pas" + +msgid "Please provide a password" +msgstr "Merci de donner un mot de passe" + +msgid "Preview" +msgstr "Aperçu" + +msgid "Previous" +msgstr "Précédent" + +msgid "Privacy Policy" +msgstr "Politique de Confidentialité" + +msgid "Profile and Display" +msgstr "Profil et Affichage" + +msgid "Profile updated" +msgstr "Profile mis à jour" + +msgid "Recover" +msgstr "Récupérer" + +msgid "Recover with passphrase" +msgstr "Récupérer avec un mot de passe" + +msgid "Reject" +msgstr "Refuser" + +msgid "Reject all" +msgstr "Refuser tous" + +msgid "Remind me later" +msgstr "Plus tard" + +msgid "Rename" +msgstr "Renommer" + +msgid "Rename File/Folder" +msgstr "Renommer Ficher/Dossier" + +msgid "Requested from" +msgstr "Envoyé par" + +msgid "Resources" +msgstr "Ressources" + +msgid "Restore with backup phrase" +msgstr "Récupérer avec la phrase de sauvegarde" + +msgid "Save changes" +msgstr "Enregistrer" + +msgid "Save this browser for next time?" +msgstr "Enregistrer ce navigateur?" + +msgid "Saved" +msgstr "Enregistré" + +msgid "Saved Browser" +msgstr "Navigateur enregistré" + +msgid "Saved Browsers" +msgstr "Navigateurs enregistrés" + +msgid "Saved browser" +msgstr "Navigateur enregistré" + +msgid "Saved on:" +msgstr "Enregistré sur:" + +msgid "Search results" +msgstr "Résultats de recherche" + +msgid "Search..." +msgstr "Rechercher..." + +msgid "Security" +msgstr "Sécurité" + +msgid "Select a wallet" +msgstr "Sélectionner un wallet" + +msgid "Send Feedback" +msgstr "Donner son avis" + +msgid "Set Password" +msgstr "Définir un mot de passe" + +msgid "Set it up now" +msgstr "Définir" + +msgid "Set up" +msgstr "Définir" + +msgid "Set up a password" +msgstr "Définir un mot de passe" + +msgid "Set up auth factors" +msgstr "Configurer" + +msgid "Set up password" +msgstr "Définir un mot de passe" + +msgid "Settings" +msgstr "Paramètres" + +msgid "Setup incomplete" +msgstr "Configuration incomplète" + +msgid "Share" +msgstr "Partager" + +msgid "Sign Out" +msgstr "Se Déconnecter" + +msgid "Sign in" +msgstr "Se connecter" + +msgid "Sign in with a different account" +msgstr "Se connecter avec un autre compte" + +msgid "Sign-in methods" +msgstr "Méthodes de connections" + +msgid "Sign-in with {0}" +msgstr "Se connecter avec {0}" + +msgid "Size" +msgstr "Taille" + +msgid "Social Sign-in Wallet" +msgstr "Connecté avec un réseau social ou wallet" + +msgid "Social Sign-in or Wallet" +msgstr "Connecté avec un réseau social ou wallet" + +msgid "Social sign in or wallet" +msgstr "Connecté avec un réseau social ou wallet" + +msgid "Something went wrong. We couldn't upload your file" +msgstr "Un problème est survenu. Nous n'avons pas pu uploader votre fichier" + +msgid "Start Upload" +msgstr "Démarrer l'upload" + +msgid "Storage Plan" +msgstr "Plan de stockage" + +msgid "Stored by miner" +msgstr "Sauvegardé par le mineur" + +msgid "Technical" +msgstr "Technique" + +msgid "Terms and Conditions" +msgstr "Termes et conditions" + +msgid "Thanks for taking care of that. You can <0/> adjust these anytime in security settings." +msgstr "Vous pouvez <0/> les ajuster à tout moment dans les paramètres de sécurité." + +msgid "The authentication popup was closed" +msgstr "Le popup d'authentification a été fermé" + +msgid "The system is undergoing maintenance, thank you for being patient." +msgstr "Le système est en cours de maintenance, merci d'être patient." + +msgid "Theme" +msgstr "Thème" + +msgid "There was an error authenticating" +msgstr "Une erreur s'est produite lors de l'authentification" + +msgid "There was an error connecting your wallet" +msgstr "Une erreur s'est produite lors de la connexion de votre wallet" + +msgid "There was an error creating this folder" +msgstr "Une erreur s'est produite lors de la création de ce dossier" + +msgid "There was an error deleting this" +msgstr "Une erreur s'est produite lors de la suppression" + +msgid "There was an error getting file info" +msgstr "Une erreur s'est produite lors de l'obtention des informations sur le fichier" + +msgid "There was an error getting folder info" +msgstr "Une erreur s'est produite lors de l'obtention des informations sur le dossier" + +msgid "There was an error getting search results" +msgstr "Une erreur s'est produite lors de l'obtention des résultats de recherche" + +msgid "There was an error getting the preview." +msgstr "Une erreur s'est produite lors de la génération de l’aperçu." + +msgid "There was an error moving this file" +msgstr "Une erreur s'est produite lors du déplacement de ce fichier" + +msgid "There was an error recovering this" +msgstr "Une erreur s'est produite lors de la récupération" + +msgid "There was an error renaming this file" +msgstr "Une erreur s'est produite lors de renommage de ce fichier" + +msgid "Try again" +msgstr "Essayer de nouveau" + +msgid "Try another method" +msgstr "Essayer une autre méthode" + +msgid "Update" +msgstr "Mettre à jour" + +msgid "Upload" +msgstr "Uploader" + +msgid "Upload complete" +msgstr "Upload terminé" + +msgid "Uploading {0} files" +msgstr "Upload de {0} fichiers" + +msgid "Use a different login method" +msgstr "Utilisez une méthode de connexion différente" + +msgid "Use a saved browser" +msgstr "Utiliser un navigateur enregistré" + +msgid "View folder" +msgstr "Voir le dossier" + +msgid "Wallet address" +msgstr "Addresse du wallet" + +msgid "Web3: {0}" +msgstr "Web3: {0}" + +msgid "We’ve got a new authentication system in place. All you need to do is enter your password again to migrate your credentials over to the new system." +msgstr "Nous avons mis en place un nouveau système d’authentification. Tout ce que vous avez à faire est de saisir à nouveau votre mot de passe pour migrer vos informations d'identification vers le nouveau système." + +msgid "What a fine day it is." +msgstr "Une belle journée." + +msgid "What a fine night it is." +msgstr "Une belle nuit." + +msgid "Yes, save it" +msgstr "Oui, l'enregistrer" + +msgid "You are about to delete {0} file(s)." +msgstr "Suppression de {0} fichier(s)." + +msgid "You can change this later." +msgstr "Vous pouvez en changer plus tard." + +msgid "You will need to sign a message in your wallet to complete sign in." +msgstr "Vous devrez signer un message avec votre wallet pour terminer la procédure connexion." + +msgid "Your Authentication Factors" +msgstr "Vos Facteurs d'Authentification" + +msgid "Your recovery key can be used to restore your account in place of your backup phrase." +msgstr "Votre clé de récupération peut être utilisée pour restaurer votre compte à la place de votre phrase de sauvegarde." + +msgid "copied!" +msgstr "copié !" + +msgid "deleted successfully" +msgstr "supprimé avec succès" + +msgid "file" +msgstr "fichier" + +msgid "folder" +msgstr "dossier" + +msgid "on" +msgstr "le" + +msgid "recovered successfully" +msgstr "récupéré avec succès"