- 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.
65 lines
1.7 KiB
JSON
65 lines
1.7 KiB
JSON
{
|
|
"expo": {
|
|
"name": "PawFeed",
|
|
"slug": "pawfeed-mobile",
|
|
"scheme": "pawfeed",
|
|
"version": "1.0.0",
|
|
"orientation": "portrait",
|
|
"icon": "./assets/icon.png",
|
|
"userInterfaceStyle": "light",
|
|
"newArchEnabled": true,
|
|
"ios": {
|
|
"supportsTablet": true,
|
|
"bundleIdentifier": "org.pawfeed.app"
|
|
},
|
|
"android": {
|
|
"package": "org.pawfeed.app",
|
|
"googleServicesFile": "./google-services.json",
|
|
"adaptiveIcon": {
|
|
"backgroundColor": "#fafafa",
|
|
"foregroundImage": "./assets/android-icon-foreground.png",
|
|
"backgroundImage": "./assets/android-icon-background.png",
|
|
"monochromeImage": "./assets/android-icon-monochrome.png"
|
|
},
|
|
"predictiveBackGestureEnabled": false,
|
|
"permissions": [
|
|
"android.permission.RECORD_AUDIO"
|
|
]
|
|
},
|
|
"web": {
|
|
"favicon": "./assets/favicon.png"
|
|
},
|
|
"plugins": [
|
|
"expo-router",
|
|
"expo-secure-store",
|
|
"expo-font",
|
|
"expo-dev-client",
|
|
"expo-image",
|
|
"expo-system-ui",
|
|
[
|
|
"expo-image-picker",
|
|
{
|
|
"photosPermission": "Erlaube PawFeed den Zugriff auf deine Fotos, um sie in einem Beitrag zu teilen.",
|
|
"cameraPermission": "Erlaube PawFeed den Zugriff auf die Kamera, um ein Foto für deinen Beitrag aufzunehmen."
|
|
}
|
|
],
|
|
"expo-video",
|
|
[
|
|
"expo-notifications",
|
|
{
|
|
"icon": "./assets/android-icon-monochrome.png",
|
|
"color": "#f97316"
|
|
}
|
|
],
|
|
"expo-localization"
|
|
],
|
|
"extra": {
|
|
"router": {},
|
|
"eas": {
|
|
"projectId": "e56a076a-08a2-4e4e-afa0-dfc611fba536"
|
|
}
|
|
},
|
|
"owner": "pawfeed"
|
|
}
|
|
}
|