feat: add expo mobile application source code
This commit is contained in:
@@ -0,0 +1,328 @@
|
||||
import React, { createContext, useContext, useState, useEffect } from 'react';
|
||||
import { Platform } from 'react-native';
|
||||
import { storage } from '../utils/storage';
|
||||
import { useAppConfig } from './ConfigContext';
|
||||
|
||||
export type LanguageType = 'English' | 'Indonesian';
|
||||
|
||||
interface Translations {
|
||||
[key: string]: {
|
||||
[key: string]: string;
|
||||
};
|
||||
}
|
||||
|
||||
export const translations: Translations = {
|
||||
English: {
|
||||
// Auth
|
||||
login: 'Login Now',
|
||||
register: 'Register Now',
|
||||
createAccount: 'Create New Account',
|
||||
registerSubtitle: 'Join us to start managing your workspace efficiently.',
|
||||
email: 'Email Address',
|
||||
password: 'Password',
|
||||
fullName: 'Full Name',
|
||||
forgotPass: 'Forgot Password?',
|
||||
rememberMe: 'Remember Me',
|
||||
noAccount: "Don't have an account? ",
|
||||
haveAccount: 'Already have an account? ',
|
||||
loginJust: 'Login Now',
|
||||
termsText: 'By registering, you agree to our ',
|
||||
termsLink: 'Terms of Service',
|
||||
privacyLink: 'Privacy Policy',
|
||||
and: ' and ',
|
||||
|
||||
// Auth Extra
|
||||
signIn: 'Sign In',
|
||||
emailPlaceholder: 'email@example.com',
|
||||
passwordPlaceholder: '••••••••',
|
||||
signInNow: 'Sign In Now',
|
||||
orContinueWith: 'OR CONTINUE WITH',
|
||||
signUp: 'Sign Up',
|
||||
google: 'Google',
|
||||
apple: 'Apple',
|
||||
welcomeBack: 'Welcome back!',
|
||||
invalidEmail: 'Invalid email address',
|
||||
loginFailed: 'Login failed. Please try again.',
|
||||
bioConfirm: 'Confirm Identity',
|
||||
bioFailed: 'Biometric authentication failed',
|
||||
bioSuccess: 'Biometric Login Successful!',
|
||||
|
||||
// Auth Extra 2
|
||||
fillAll: 'Please fill all required fields',
|
||||
passMismatch: 'Passwords do not match',
|
||||
accountCreated: 'Account created successfully!',
|
||||
confirmPassword: 'Confirm Password',
|
||||
namePlaceholder: 'John Doe',
|
||||
registering: 'Creating account...',
|
||||
|
||||
// Profile Extra
|
||||
uploadingAvatar: 'Uploading avatar...',
|
||||
avatarUpdated: 'Profile picture updated!',
|
||||
profileUpdated: 'Profile updated successfully!',
|
||||
logoutSafe: 'Signing out safely...',
|
||||
confirmLogout: 'Are you sure you want to log out?',
|
||||
cancel: 'Cancel',
|
||||
logout: 'Logout',
|
||||
accCreated: 'Account created successfully!',
|
||||
regFailed: 'Registration failed',
|
||||
join: 'Join',
|
||||
confirmPass: 'Confirm Password',
|
||||
|
||||
// Dashboard
|
||||
halo: 'Hello',
|
||||
role: 'Your Role: ',
|
||||
lastStatus: 'Last Status: ',
|
||||
history: 'Recent Activity',
|
||||
searchPlaceholder: 'Search items or locations...',
|
||||
loadMore: 'Load More',
|
||||
all: 'All',
|
||||
pending: 'Pending',
|
||||
completed: 'Success',
|
||||
high: 'Urgent',
|
||||
searching: 'Searching server...',
|
||||
|
||||
// Dashboard Extra
|
||||
systemSupport: 'System Support',
|
||||
instantHelp: 'Instant Help 24/7',
|
||||
getHelp: 'Get Help',
|
||||
quickActions: 'Quick Actions',
|
||||
categories: 'Categories',
|
||||
latestDiscoveries: 'Latest Discoveries',
|
||||
account: 'Account',
|
||||
subscription: 'Subscription',
|
||||
system: 'System',
|
||||
explore: 'Explore',
|
||||
|
||||
// Profile
|
||||
personalData: 'PERSONAL DATA',
|
||||
fullNameLabel: 'Full Name',
|
||||
editProfile: 'Edit Profile Information',
|
||||
confirmChanges: 'Confirm Changes',
|
||||
syncing: 'Syncing...',
|
||||
preferences: 'PREFERENCES & SECURITY',
|
||||
darkTheme: 'Dark Mode',
|
||||
changePass: 'Change Password',
|
||||
biometrics: 'Biometrics',
|
||||
language: 'Language',
|
||||
logout: 'Logout Account',
|
||||
updateSecurity: 'Update Security',
|
||||
oldPass: 'Old Password',
|
||||
newPass: 'New Password',
|
||||
confirmNew: 'Confirm New',
|
||||
update: 'Update',
|
||||
cancel: 'Cancel',
|
||||
chooseLang: 'Choose Language',
|
||||
close: 'Close',
|
||||
confirmLogout: 'Confirm Logout',
|
||||
areYouSureLogout: 'Are you sure you want to logout from your account?',
|
||||
|
||||
// Notifications
|
||||
notifications: 'Notifications',
|
||||
markAllRead: 'Mark all as read',
|
||||
noNotifications: 'No new notifications',
|
||||
|
||||
// Help
|
||||
helpCenter: 'Help Center',
|
||||
helpSubtitle: 'We are ready to help you with any questions or technical issues.',
|
||||
emergencyTitle: 'Direct Support',
|
||||
emergencySubtitle: 'Contact us for urgent assistance',
|
||||
contactSupport: 'Contact Us',
|
||||
faqTitle: 'Frequently Asked Questions (FAQ)',
|
||||
|
||||
// Help Extra
|
||||
supportCenter: 'Support Center',
|
||||
searchDoc: 'Search documentation...',
|
||||
browseTopics: 'Browse Topics',
|
||||
popularFaq: 'Popular FAQs',
|
||||
whatsapp: 'WhatsApp',
|
||||
emailSupport: 'Email Support',
|
||||
web: 'Web',
|
||||
billing: 'Billing',
|
||||
// Notifications Extra
|
||||
recentNotifications: 'recent notifications',
|
||||
},
|
||||
Indonesian: {
|
||||
// Auth
|
||||
login: 'Masuk Sekarang',
|
||||
register: 'Daftar Sekarang',
|
||||
createAccount: 'Buat Akun Baru',
|
||||
registerSubtitle: 'Bergabunglah dengan kami untuk mulai mengelola ruang kerja Anda.',
|
||||
email: 'Alamat Email',
|
||||
password: 'Kata Sandi',
|
||||
fullName: 'Nama Lengkap',
|
||||
forgotPass: 'Lupa Kata Sandi?',
|
||||
rememberMe: 'Ingat Saya',
|
||||
noAccount: 'Belum punya akun? ',
|
||||
haveAccount: 'Sudah punya akun? ',
|
||||
loginJust: 'Masuk Saja',
|
||||
termsText: 'Dengan mendaftar, Anda menyetujui ',
|
||||
termsLink: 'Ketentuan Layanan',
|
||||
privacyLink: 'Kebijakan Privasi',
|
||||
and: ' dan ',
|
||||
|
||||
// Auth Extra
|
||||
signIn: 'Masuk',
|
||||
emailPlaceholder: 'email@contoh.com',
|
||||
passwordPlaceholder: '••••••••',
|
||||
signInNow: 'Masuk Sekarang',
|
||||
orContinueWith: 'ATAU LANJUTKAN DENGAN',
|
||||
signUp: 'Daftar',
|
||||
google: 'Google',
|
||||
apple: 'Apple',
|
||||
welcomeBack: 'Selamat datang kembali!',
|
||||
invalidEmail: 'Alamat email tidak valid',
|
||||
loginFailed: 'Login gagal. Silakan coba lagi.',
|
||||
bioConfirm: 'Konfirmasi Identitas',
|
||||
bioFailed: 'Autentikasi biometrik gagal',
|
||||
bioSuccess: 'Login Biometrik Berhasil!',
|
||||
|
||||
// Auth Extra 2
|
||||
fillAll: 'Silakan isi semua bidang yang diperlukan',
|
||||
passMismatch: 'Kata sandi tidak cocok',
|
||||
accountCreated: 'Akun berhasil dibuat!',
|
||||
confirmPassword: 'Konfirmasi Kata Sandi',
|
||||
namePlaceholder: 'John Doe',
|
||||
registering: 'Membuat akun...',
|
||||
|
||||
// Profile Extra
|
||||
uploadingAvatar: 'Mengunggah foto...',
|
||||
avatarUpdated: 'Foto profil diperbarui!',
|
||||
profileUpdated: 'Profil berhasil diperbarui!',
|
||||
logoutSafe: 'Keluar dengan aman...',
|
||||
confirmLogout: 'Apakah Anda yakin ingin keluar?',
|
||||
cancel: 'Batal',
|
||||
logout: 'Keluar',
|
||||
accCreated: 'Akun berhasil dibuat!',
|
||||
regFailed: 'Pendaftaran gagal',
|
||||
join: 'Bergabunglah dengan',
|
||||
confirmPass: 'Konfirmasi Kata Sandi',
|
||||
namePlaceholder: 'Budi Santoso',
|
||||
|
||||
// Dashboard
|
||||
halo: 'Halo',
|
||||
role: 'Peran Anda: ',
|
||||
lastStatus: 'Status Terakhir: ',
|
||||
history: 'Aktivitas Terbaru',
|
||||
searchPlaceholder: 'Cari item atau lokasi...',
|
||||
updateNow: 'Perbarui Sekarang',
|
||||
all: 'Semua',
|
||||
pending: 'Tertunda',
|
||||
completed: 'Selesai',
|
||||
high: 'Penting',
|
||||
searching: 'Mencari di server...',
|
||||
|
||||
// Dashboard Extra
|
||||
systemSupport: 'Dukungan Sistem',
|
||||
instantHelp: 'Bantuan Instan 24/7',
|
||||
getHelp: 'Dapatkan Bantuan',
|
||||
quickActions: 'Aksi Cepat',
|
||||
categories: 'Kategori',
|
||||
latestDiscoveries: 'Penemuan Terbaru',
|
||||
account: 'Akun',
|
||||
subscription: 'Langganan',
|
||||
system: 'Sistem',
|
||||
explore: 'Jelajahi',
|
||||
|
||||
// Profile
|
||||
personalData: 'DATA PRIBADI',
|
||||
fullNameLabel: 'Nama Lengkap',
|
||||
editProfile: 'Ubah Informasi Profil',
|
||||
confirmChanges: 'Simpan Perubahan',
|
||||
syncing: 'Menyinkronkan...',
|
||||
preferences: 'PREFERENSI & KEAMANAN',
|
||||
darkTheme: 'Mode Gelap',
|
||||
changePass: 'Ubah Kata Sandi',
|
||||
biometrics: 'Biometrik',
|
||||
language: 'Bahasa',
|
||||
logout: 'Keluar Akun',
|
||||
updateSecurity: 'Perbarui Keamanan',
|
||||
oldPass: 'Sandi Lama',
|
||||
newPass: 'Sandi Baru',
|
||||
confirmNew: 'Konfirmasi Sandi Baru',
|
||||
update: 'Perbarui',
|
||||
cancel: 'Batal',
|
||||
chooseLang: 'Pilih Bahasa',
|
||||
close: 'Tutup',
|
||||
confirmLogout: 'Konfirmasi Keluar',
|
||||
areYouSureLogout: 'Apakah Anda yakin ingin keluar dari akun Anda?',
|
||||
|
||||
// Notifications
|
||||
notifications: 'Pemberitahuan',
|
||||
markAllRead: 'Tandai semua dibaca',
|
||||
noNotifications: 'Tidak ada pemberitahuan baru',
|
||||
|
||||
// Notifications Extra
|
||||
recentNotifications: 'pemberitahuan terbaru',
|
||||
|
||||
// Help
|
||||
helpCenter: 'Pusat Bantuan',
|
||||
helpSubtitle: 'Kami siap membantu Anda dengan pertanyaan atau kendala teknis.',
|
||||
emergencyTitle: 'Dukungan Langsung',
|
||||
emergencySubtitle: 'Hubungi kami untuk bantuan mendesak',
|
||||
contactSupport: 'Hubungi Kami',
|
||||
faqTitle: 'Pertanyaan Umum (FAQ)',
|
||||
|
||||
// Help Extra
|
||||
supportCenter: 'Pusat Dukungan',
|
||||
searchDoc: 'Cari dokumentasi...',
|
||||
browseTopics: 'Telusuri Topik',
|
||||
popularFaq: 'FAQ Populer',
|
||||
whatsapp: 'WhatsApp',
|
||||
emailSupport: 'Dukungan Email',
|
||||
web: 'Web',
|
||||
billing: 'Tagihan',
|
||||
}
|
||||
};
|
||||
|
||||
interface LanguageContextType {
|
||||
language: LanguageType;
|
||||
setLanguage: (lang: LanguageType) => void;
|
||||
t: any;
|
||||
}
|
||||
|
||||
const LanguageContext = createContext<LanguageContextType | undefined>(undefined);
|
||||
|
||||
export function LanguageProvider({ children }: { children: React.ReactNode }) {
|
||||
const [language, setRawLanguage] = useState<LanguageType>('English');
|
||||
const { config } = useAppConfig();
|
||||
|
||||
useEffect(() => {
|
||||
loadLanguage();
|
||||
}, []);
|
||||
|
||||
const loadLanguage = async () => {
|
||||
const saved = await storage.get('pref_language');
|
||||
if (saved === 'English' || saved === 'Indonesian') {
|
||||
setRawLanguage(saved);
|
||||
}
|
||||
};
|
||||
|
||||
const setLanguage = async (newLang: LanguageType) => {
|
||||
setRawLanguage(newLang);
|
||||
await storage.save('pref_language', newLang);
|
||||
};
|
||||
|
||||
// Merge static translations with dynamic ones from Laravel
|
||||
const t = {
|
||||
...translations[language],
|
||||
...(config?.localization?.[language] || {})
|
||||
};
|
||||
|
||||
return (
|
||||
<LanguageContext.Provider value={{ language, setLanguage, t }}>
|
||||
{children}
|
||||
</LanguageContext.Provider>
|
||||
);
|
||||
}
|
||||
|
||||
export function useTranslation() {
|
||||
const context = useContext(LanguageContext);
|
||||
if (context === undefined) {
|
||||
return {
|
||||
language: 'English',
|
||||
setLanguage: () => {},
|
||||
t: translations.English
|
||||
};
|
||||
}
|
||||
return context;
|
||||
}
|
||||
Reference in New Issue
Block a user