auto-commit for 4b34bc9d-cd30-4d24-924a-46c6cece2da1

This commit is contained in:
emergent-agent-e1
2025-11-08 22:59:54 +00:00
parent c3ac39c0f6
commit d3e4277c0d
2 changed files with 207 additions and 0 deletions
+124
View File
@@ -0,0 +1,124 @@
import { I18n } from 'i18n-js';
import * as Localization from 'expo-localization';
import AsyncStorage from '@react-native-async-storage/async-storage';
const i18n = new I18n({
en: {
welcome: 'Welcome',
home: 'Home',
wallet: 'Wallet',
citizens: 'Citizens',
referral: 'Referral',
profile: 'Profile',
settings: 'Settings',
notifications: 'Notifications',
editProfile: 'Edit Profile',
changePassword: 'Change Password',
signOut: 'Sign Out',
language: 'Language',
darkMode: 'Dark Mode',
// Add more translations
},
'ku-sorani': {
welcome: 'بەخێربێیت',
home: 'سەرەکی',
wallet: 'جزدان',
citizens: 'هاوڵاتیان',
referral: 'ئاماژە',
profile: 'پرۆفایل',
settings: 'ڕێکخستنەکان',
notifications: 'ئاگادارکردنەوەکان',
editProfile: 'دەستکاری پرۆفایل',
changePassword: 'گۆڕینی وشەی نهێنی',
signOut: 'چوونەدەرەوە',
language: 'زمان',
darkMode: 'دۆخی تاریک',
},
'ku-kurmanji': {
welcome: 'Bi xêr hatî',
home: 'Malper',
wallet: 'Berîk',
citizens: 'Hemwelatî',
referral: 'Referans',
profile: 'Profîl',
settings: 'Mîhengên',
notifications: 'Agahdarî',
editProfile: 'Profîlê Biguherîne',
changePassword: 'Şîfreyê Biguherîne',
signOut: 'Derkeve',
language: 'Ziman',
darkMode: 'Moda Tarî',
},
ar: {
welcome: 'مرحبا',
home: 'الرئيسية',
wallet: 'المحفظة',
citizens: 'المواطنون',
referral: 'الإحالة',
profile: 'الملف الشخصي',
settings: 'الإعدادات',
notifications: 'الإشعارات',
editProfile: 'تعديل الملف الشخصي',
changePassword: 'تغيير كلمة المرور',
signOut: 'تسجيل الخروج',
language: 'اللغة',
darkMode: 'الوضع الداكن',
},
tr: {
welcome: 'Hoş geldiniz',
home: 'Ana Sayfa',
wallet: 'Cüzdan',
citizens: 'Vatandaşlar',
referral: 'Yönlendirme',
profile: 'Profil',
settings: 'Ayarlar',
notifications: 'Bildirimler',
editProfile: 'Profili Düzenle',
changePassword: 'Şifre Değiştir',
signOut: 'Çıkış Yap',
language: 'Dil',
darkMode: 'Karanlık Mod',
},
fa: {
welcome: 'خوش آمدید',
home: 'خانه',
wallet: 'کیف پول',
citizens: 'شهروندان',
referral: 'ارجاع',
profile: 'پروفایل',
settings: 'تنظیمات',
notifications: 'اطلاعیه‌ها',
editProfile: 'ویرایش پروفایل',
changePassword: 'تغییر رمز عبور',
signOut: 'خروج',
language: 'زبان',
darkMode: 'حالت تاریک',
},
});
// Set default locale
i18n.locale = Localization.locale;
i18n.enableFallback = true;
i18n.defaultLocale = 'en';
export const loadSavedLanguage = async () => {
try {
const savedLang = await AsyncStorage.getItem('appLanguage');
if (savedLang) {
i18n.locale = savedLang;
}
} catch (error) {
console.error('Error loading language:', error);
}
};
export const saveLanguage = async (languageCode: string) => {
try {
await AsyncStorage.setItem('appLanguage', languageCode);
i18n.locale = languageCode;
} catch (error) {
console.error('Error saving language:', error);
}
};
export default i18n;
+83
View File
@@ -0,0 +1,83 @@
import React, { createContext, useState, useContext, useEffect } from 'react';
import AsyncStorage from '@react-native-async-storage/async-storage';
interface ThemeContextType {
isDarkMode: boolean;
toggleTheme: () => void;
colors: {
background: string;
card: string;
text: string;
textSecondary: string;
primary: string;
border: string;
error: string;
};
}
const lightColors = {
background: '#F8F9FA',
card: '#FFFFFF',
text: '#1F2937',
textSecondary: '#6B7280',
primary: '#EE2A35',
border: '#E5E7EB',
error: '#EF4444',
};
const darkColors = {
background: '#111827',
card: '#1F2937',
text: '#F9FAFB',
textSecondary: '#9CA3AF',
primary: '#EE2A35',
border: '#374151',
error: '#F87171',
};
const ThemeContext = createContext<ThemeContextType | undefined>(undefined);
export function ThemeProvider({ children }: { children: React.ReactNode }) {
const [isDarkMode, setIsDarkMode] = useState(false);
useEffect(() => {
loadTheme();
}, []);
const loadTheme = async () => {
try {
const savedTheme = await AsyncStorage.getItem('appTheme');
if (savedTheme === 'dark') {
setIsDarkMode(true);
}
} catch (error) {
console.error('Error loading theme:', error);
}
};
const toggleTheme = async () => {
const newMode = !isDarkMode;
setIsDarkMode(newMode);
try {
await AsyncStorage.setItem('appTheme', newMode ? 'dark' : 'light');
} catch (error) {
console.error('Error saving theme:', error);
}
};
const colors = isDarkMode ? darkColors : lightColors;
return (
<ThemeContext.Provider value={{ isDarkMode, toggleTheme, colors }}>
{children}
</ThemeContext.Provider>
);
}
export function useTheme() {
const context = useContext(ThemeContext);
if (context === undefined) {
throw new Error('useTheme must be used within a ThemeProvider');
}
return context;
}