- i18next + react-i18next + expo-localization: device-locale detection, an MMKV-persisted DE/EN/Automatisch override (mirrors web's cookie-only locale, no backend field needed), and a language switcher on the Pets tab next to the theme toggle - every screen and shared component converted from hardcoded German strings to translation keys; de.json/en.json kept in exact key-parity (218 keys each, verified programmatically) - backend: src/trpc/init.ts now accepts an x-locale header as a fallback locale source (cookie still wins, web unaffected) since mobile has no cookie jar to set NEXT_LOCALE in; mobile's tRPC client sends the current language on every request - fixes a latent bug: species/breed pickers were hardcoded to locale "de" while every other pet query resolved names via ctx.locale's default (English, since mobile never sent a locale cookie) — both now use the same current-language value - expo-localization is a new native module (config plugin) and needs a native rebuild to actually link; deviceLocale() falls back to English instead of crashing when it isn't linked yet, so the app stays usable before that rebuild happens Needs a NAS deploy (src/trpc/init.ts is shared backend code) before the x-locale fallback and the species/breed locale fix take effect for mobile.
52 lines
1.5 KiB
JSON
52 lines
1.5 KiB
JSON
{
|
|
"name": "pawfeed-mobile",
|
|
"version": "1.0.0",
|
|
"main": "expo-router/entry",
|
|
"dependencies": {
|
|
"@clerk/expo": "^4.6.1",
|
|
"@expo-google-fonts/inter": "^0.4.2",
|
|
"@tanstack/query-sync-storage-persister": "^5.102.8",
|
|
"@tanstack/react-query": "5.102.8",
|
|
"@tanstack/react-query-persist-client": "^5.102.8",
|
|
"@trpc/client": "11.17.0",
|
|
"@trpc/tanstack-react-query": "11.17.0",
|
|
"expo": "~57.0.18",
|
|
"expo-constants": "~57.0.16",
|
|
"expo-dev-client": "~57.0.18",
|
|
"expo-file-system": "~57.0.6",
|
|
"expo-font": "~57.0.3",
|
|
"expo-image": "~57.0.4",
|
|
"expo-image-picker": "~57.0.16",
|
|
"expo-linking": "~57.0.8",
|
|
"expo-localization": "~57.0.1",
|
|
"expo-notifications": "~57.0.17",
|
|
"expo-router": "^5.1.11",
|
|
"expo-secure-store": "~57.0.2",
|
|
"expo-status-bar": "~57.0.1",
|
|
"expo-system-ui": "~57.0.3",
|
|
"expo-video": "~57.0.3",
|
|
"i18next": "^26.4.2",
|
|
"lucide-react-native": "^1.41.0",
|
|
"react": "19.2.3",
|
|
"react-dom": "19.2.3",
|
|
"react-i18next": "^17.0.13",
|
|
"react-native": "0.86.3",
|
|
"react-native-mmkv": "^4.3.2",
|
|
"react-native-nitro-modules": "^0.37.1",
|
|
"react-native-safe-area-context": "~5.7.0",
|
|
"react-native-screens": "~4.26.0",
|
|
"react-native-svg": "15.15.4"
|
|
},
|
|
"devDependencies": {
|
|
"@types/react": "~19.2.2",
|
|
"typescript": "~6.0.3"
|
|
},
|
|
"scripts": {
|
|
"start": "expo start --dev-client",
|
|
"android": "expo run:android",
|
|
"ios": "expo run:ios",
|
|
"web": "expo start --web"
|
|
},
|
|
"private": true
|
|
}
|