Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/brave-foxes-rush.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

💬 consolidate camera and location permission text
5 changes: 5 additions & 0 deletions .changeset/calm-owls-greet.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

🌐 add argentinian spanish with regional normalization
5 changes: 5 additions & 0 deletions .changeset/clean-ducks-swim.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

🌐 translate camera and location permissions to spanish
5 changes: 5 additions & 0 deletions .changeset/curvy-insects-sin.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": minor
---

🌐 setup native locales
5 changes: 5 additions & 0 deletions .changeset/fine-papayas-worry.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

💬 use typographic apostrophes and quotes
5 changes: 5 additions & 0 deletions .changeset/free-meals-sip.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

🌐 add missing weekly qualifier in spanish spending limit
5 changes: 5 additions & 0 deletions .changeset/gold-mice-spend.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

🌐 add missing spanish help translation
5 changes: 5 additions & 0 deletions .changeset/heavy-lilies-stand.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

🌐 extend locale support for dates, ramps, benefits
5 changes: 5 additions & 0 deletions .changeset/long-rocks-rhyme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

🌐 add portuguese translations
5 changes: 5 additions & 0 deletions .changeset/sixty-bottles-burn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

🌐 add missing spanish payment unavailable translation
3 changes: 3 additions & 0 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,6 @@ f20fc4dc66513808640dbef6c39fd0a2caf5bd5b

# global: apply new style
95bde7cbcc8c5ff67ecc439cdbda2c755b6237ab

# app: sort i18n keys alphabetically
909a0b19fccc5c14562f14f12f07c7f15d9d3d18
4 changes: 2 additions & 2 deletions .maestro/subflows/activateCard.yaml
Comment thread
cruzdanilo marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,10 @@ appId: ${APP_ID ?? "app.exactly"}
- tapOn: Home
- runFlow: { file: scrollTo.yaml, env: { element: Credit limit } }
- tapOn: Credit limit
- assertVisible: It's based on the value of your collateral assets and updates as their value changes.
- assertVisible: Its based on the value of your collateral assets and updates as their value changes.
- tapOn: Close
- tapOn: Now
- tapOn: Spending limit
- assertVisible: It's based on the USDC available in your balance.
- assertVisible: Its based on the USDC available in your balance.
- tapOn: Close
- tapOn: Home
19 changes: 9 additions & 10 deletions app.config.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import type { PluginConfigType as BuildPropertiesConfig } from "expo-build-properties/build/pluginConfig";
import type withCamera from "expo-camera/plugin/build/withCamera";
import type { FontProps } from "expo-font/plugin/build/withFonts";

import { AndroidConfig, withAndroidManifest, withAppBuildGradle, type ConfigPlugin } from "expo/config-plugins";
Expand Down Expand Up @@ -43,8 +42,9 @@ export default {
buildNumber: String(versionCode),
infoPlist: {
ITSAppUsesNonExemptEncryption: false,
NSCameraUsageDescription: "This app uses the camera to verify your identity.",
NSLocationWhenInUseUsageDescription: "This app uses your location to verify your identity.",
CFBundleAllowMixedLocalizations: true,
NSCameraUsageDescription: "Exa uses the camera to scan QR codes and verify your identity.",
NSLocationWhenInUseUsageDescription: "Exa uses your location to verify your identity.",
},
userInterfaceStyle: "automatic",
splash: {
Expand All @@ -66,12 +66,7 @@ export default {
},
} satisfies BuildPropertiesConfig,
],
[
"expo-camera",
{
cameraPermission: "Exactly needs your permission to scan QR codes.",
} satisfies Parameters<typeof withCamera>[1],
],
"expo-camera",
Comment thread
cruzdanilo marked this conversation as resolved.
Comment thread
cruzdanilo marked this conversation as resolved.
[
"expo-font",
{
Expand All @@ -83,7 +78,10 @@ export default {
} satisfies FontProps,
],
Comment thread
cruzdanilo marked this conversation as resolved.
"expo-asset",
"expo-localization",
[
"expo-localization",
{ supportedLocales: ["en", "es", "es-AR", "es-CR", "es-GT", "es-HN", "es-NI", "es-PY", "es-SV", "es-UY", "pt"] },
],
"expo-router",
[
"@intercom/intercom-react-native",
Expand Down Expand Up @@ -151,4 +149,5 @@ export default {
updates: { url: "https://u.expo.dev/06bc0158-d23b-430b-a7e8-802df03c450b" },
runtimeVersion: { policy: "fingerprint" },
owner: "exactly",
locales: { es: "src/i18n/native/es.json", pt: "src/i18n/native/pt.json" },
Comment thread
cruzdanilo marked this conversation as resolved.
} satisfies ExpoConfig;
Comment thread
sentry[bot] marked this conversation as resolved.
77 changes: 76 additions & 1 deletion cspell.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
{
"language": "en",
"import": [
"@cspell/dict-es-es/cspell-ext.json"
"@cspell/dict-es-es/cspell-ext.json",
"@cspell/dict-pt-br/cspell-ext.json"
],
"ignorePaths": [
"*.svg",
Expand Down Expand Up @@ -209,6 +210,80 @@
"refinanciamiento",
"refinanciar"
]
},
{
"filename": "**/i18n/**/es-AR.json",
"language": "en,es",
"words": [
"accedé",
"aceptás",
"activá",
"actualizá",
"agregá",
"ahorrá",
"ajustá",
"aprendé",
"asegurate",
"biometría",
"cambiá",
"conectate",
"conectá",
"conectás",
"configurá",
"conocé",
"conservá",
"copiá",
"creá",
"cripto",
"debés",
"depositá",
"desbloqueá",
"empezá",
"enviá",
"enviás",
"esperá",
"evitá",
"habilitá",
"hacé",
"hacés",
"ingresá",
"iniciá",
"intentalo",
"intentá",
"introducí",
"mantenete",
"maximizá",
"mejorá",
"montos",
"obtené",
"pagá",
"pasá",
"podés",
"ponete",
"presioná",
"probá",
"querés",
"recargá",
"refinanciar",
"refinanciá",
"registrate",
"renová",
"reportá",
"revisá",
"seleccioná",
"simulá",
"tocá",
"usalo",
"usás",
"verificá"
]
},
{
"filename": "**/i18n/**/pt.json",
"language": "en,pt",
"words": [
"autocustódia"
]
}
],
"ignoreRegExpList": [
Expand Down
7 changes: 7 additions & 0 deletions metro.config.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,13 @@ module.exports = {
],
resolveRequest: (context, moduleName, platform) => {
if (moduleName === "tslib") return context.resolveRequest(context, "tslib/tslib.es6.js", platform);
if (
/date-fns\/locale\.(?:js|cjs|mjs)$/.test(context.originModulePath) &&
moduleName.startsWith("./locale/") &&
!/^(?:en|es|pt)(?:-|$)/.test(moduleName.slice("./locale/".length).replace(/\.js$/, ""))
) {
return { type: "empty" };
}
try {
return context.resolveRequest(context, moduleName, platform);
} catch (error) {
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@
"@changesets/cli": "^2.30.0",
"@changesets/types": "^6.1.0",
"@cspell/dict-es-es": "^3.0.8",
"@cspell/dict-pt-br": "^2.4.2",
"@eslint/mcp": "^0.3.2",
"@expo/fingerprint": "^0.16.6",
"@nx/esbuild": "22.6.2",
Expand Down
8 changes: 8 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 18 additions & 9 deletions src/app/_layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@ import ThemeProvider from "../components/context/ThemeProvider";
import Error from "../components/shared/Error";
import release from "../generated/release";
import en from "../i18n/en.json";
import esAR from "../i18n/es-AR.json";
import es from "../i18n/es.json";
import pt from "../i18n/pt.json";
import e2e from "../utils/e2e";
import queryClient, { persistOptions } from "../utils/queryClient";
import reportError, { classifyError } from "../utils/reportError";
Expand All @@ -49,18 +51,25 @@ import ownerConfig from "../utils/wagmi/owner";
SplashScreen.preventAutoHideAsync().catch(reportError);

configI18n(initReactI18next)
.use({
type: "languageDetector",
detect: () =>
getLocales()[0].languageCode ??
(typeof navigator === "undefined" ? undefined : navigator.language.split("-")[0]) ??
"en",
})
.use({ type: "languageDetector", detect: () => getLocales()[0].languageTag })
Comment thread
cruzdanilo marked this conversation as resolved.
.init({
fallbackLng: "en",
load: "currentOnly",
fallbackLng: (code) => {
const [language, region] = code.split("-");
if (language === "es" && region && ["AR", "CR", "GT", "HN", "NI", "PY", "SV", "UY"].includes(region))
return ["es-AR", "es", "en"];
if (language === "es") return ["es", "en"];
if (language === "pt") return ["pt", "en"];
return ["en"];
},
keySeparator: false,
nsSeparator: false,
resources: { en: { translation: en }, es: { translation: es } },
resources: {
en: { translation: en },
es: { translation: es },
pt: { translation: pt },
"es-AR": { translation: esAR },
},
})
.catch(reportError);

Expand Down
2 changes: 1 addition & 1 deletion src/components/add-funds/KYC.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ export default function KYC() {
<Text color="$uiNeutralPlaceholder" footnote textAlign="center">
{invalidLegalId
? t("There was an issue with your tax ID. Please update your information to continue.")
: t("You'll be able to add funds soon.")}
: t("Youll be able to add funds soon.")}
</Text>
</YStack>
</YStack>
Expand Down
7 changes: 5 additions & 2 deletions src/components/add-funds/MantecaDisclaimer.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from "react";
import { Trans } from "react-i18next";
import { Trans, useTranslation } from "react-i18next";

import { Info } from "@tamagui/lucide-icons";
import { XStack, YStack } from "tamagui";
Expand All @@ -9,6 +9,9 @@ import reportError from "../../utils/reportError";
import Text from "../shared/Text";

export default function MantecaDisclaimer({ primary }: { primary?: boolean }) {
const {
i18n: { language },
} = useTranslation();
return (
<XStack alignItems="center" gap="$s3">
<Info size={24} color={primary ? "$uiNeutralPrimary" : "$uiInfoSecondary"} />
Expand All @@ -34,7 +37,7 @@ export default function MantecaDisclaimer({ primary }: { primary?: boolean }) {
cursor="pointer"
onPress={() => {
openBrowser(
"https://help.exactly.app/en/articles/13616694-fiat-on-ramp-terms-and-conditions",
`https://help.exactly.app/${language.split("-")[0] ?? "en"}/articles/13616694-fiat-on-ramp-terms-and-conditions`,
Comment thread
cruzdanilo marked this conversation as resolved.
Comment thread
cruzdanilo marked this conversation as resolved.
).catch(reportError);
}}
/>
Expand Down
2 changes: 1 addition & 1 deletion src/components/add-funds/Status.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export default function Status() {
</Text>
<Text color="$uiNeutralPlaceholder" footnote textAlign="center">
{isOnboarding
? t("We're verifying your information. You'll be able to add funds soon.")
? t("Were verifying your information. Youll be able to add funds soon.")
: t("There was an error verifying your information.")}
</Text>
</YStack>
Expand Down
2 changes: 1 addition & 1 deletion src/components/auth/PasskeysAbout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ export default function PasskeysAbout() {
}

const advantages = [
{ title: "Strong credentials.", body: "Every passkey is strong. They're never guessable, reused, or weak." },
{ title: "Strong credentials.", body: "Every passkey is strong. Theyre never guessable, reused, or weak." },
{
title: "Safe from server leaks.",
body: "Because servers only keep public keys, servers are less valuable targets for hackers.",
Expand Down
13 changes: 6 additions & 7 deletions src/components/benefits/BenefitSheet.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,6 @@ import View from "../shared/View";
import type { Benefit } from "./BenefitsSection";
import type { PaxId } from "../../utils/server";

const PAX_LOCALE: Record<string, string> = {
es: "ar",
pt: "br",
en: "us",
};

type BenefitSheetProperties = {
benefit: Benefit | undefined;
onClose: () => void;
Expand Down Expand Up @@ -161,7 +155,12 @@ export default function BenefitSheet({ benefit, open, onClose }: BenefitSheetPro
padding="$s4"
onPress={() => {
const isPax = benefit.id === "pax";
let url = isPax ? benefit.url.replace("{locale}", PAX_LOCALE[language] ?? "us") : benefit.url;
let url = isPax
? benefit.url.replace(
"{locale}",
language.split("-")[1]?.toLowerCase() ?? { es: "ar", pt: "br" }[language] ?? "us",
)
: benefit.url;
Comment thread
cruzdanilo marked this conversation as resolved.
Comment thread
cruzdanilo marked this conversation as resolved.
Comment thread
cruzdanilo marked this conversation as resolved.
if (isPax && paxData?.associateId) url += `?cid=${paxData.associateId}`;
openBrowser(url).catch(reportError);
}}
Expand Down
Loading