adding multilingual support

This commit is contained in:
Azmat-7860
2026-10-03 15:04:48 +05:30
parent 3785ea1e45
commit 0d7785b242
51 changed files with 3007 additions and 250 deletions
@@ -1,5 +1,6 @@
import 'dart:io';
import 'dart:typed_data';
import 'package:base_project/l10n/app_localizations.dart';
import 'package:flutter/material.dart';
import '../../../core/constants/ui_constants.dart';
import '../buttons/modern_button.dart';
@@ -208,7 +209,7 @@ class _ModernImagePickerState extends State<ModernImagePicker>
if (hasImage && widget.onRemoveImage != null) ...[
const SizedBox(width: UIConstants.spacing12),
ModernButton(
text: 'Remove',
text: AppLocalizations.of(context)!.removeBtn,
type: ModernButtonType.danger,
size: ModernButtonSize.medium,
icon: Icon(Icons.delete_outline),
@@ -0,0 +1,28 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../core/providers/locale_provider.dart';
import '../../l10n/app_localizations.dart';
class LanguageSwitcher extends StatelessWidget {
const LanguageSwitcher({super.key});
@override
Widget build(BuildContext context) {
final locale = context.watch<LocaleProvider>().locale.languageCode;
final strings = AppLocalizations.of(context)!;
return DropdownButtonHideUnderline(
child: DropdownButton<String>(
value: locale,
icon: const Icon(Icons.language),
onChanged: (code) {
if (code != null) context.read<LocaleProvider>().setLocale(code);
},
items: [
DropdownMenuItem(value: 'en', child: Text(strings.english)),
DropdownMenuItem(value: 'hi', child: Text(strings.hindi)),
],
),
);
}
}
@@ -1,9 +1,11 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../../core/constants/ui_constants.dart';
import '../../../l10n/app_localizations.dart';
import '../../../utils/managers/user_manager.dart';
import '../../../view_model/profile/profile_view_model.dart';
import '../buttons/modern_button.dart';
import '../language_switcher.dart';
class ModernDrawer extends StatelessWidget {
final List<DrawerItem> items;
@@ -52,6 +54,17 @@ class ModernDrawer extends StatelessWidget {
// Footer
if (footer != null) footer!,
Padding(
padding: const EdgeInsets.symmetric(horizontal: UIConstants.spacing24),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(AppLocalizations.of(context)!.language),
const LanguageSwitcher(),
],
),
),
// Logout Section
_buildLogoutSection(context, theme, colorScheme),
],
@@ -122,7 +135,8 @@ class ModernDrawer extends StatelessWidget {
// User Name
Text(
"Hello, ${userName ?? 'User'}",
AppLocalizations.of(context)!
.helloUser(userName ?? AppLocalizations.of(context)!.user),
style: theme.textTheme.titleLarge?.copyWith(
color: Colors.white,
fontWeight: FontWeight.w600,
@@ -216,7 +230,7 @@ class ModernDrawer extends StatelessWidget {
return Container(
padding: const EdgeInsets.all(UIConstants.spacing24),
child: ModernButton(
text: 'Logout',
text: AppLocalizations.of(context)!.logout,
type: ModernButtonType.danger,
size: ModernButtonSize.medium,
icon: Icon(Icons.logout),
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../core/constants/ui_constants.dart';
import '../../core/providers/dynamic_theme_provider.dart';
import '../../l10n/app_localizations.dart';
class ThemePreview extends StatelessWidget {
const ThemePreview({super.key});
@@ -56,7 +57,7 @@ class ThemePreview extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Dynamic Theme Generated',
AppLocalizations.of(context)!.themeGenerated,
style:
Theme.of(context).textTheme.titleLarge?.copyWith(
color: colorScheme.onSurface,
@@ -79,7 +80,8 @@ class ThemePreview extends StatelessWidget {
Icons.refresh,
color: colorScheme.primary,
),
tooltip: 'Reset to Default Theme',
tooltip: AppLocalizations.of(context)!
.resetThemeTooltip,
),
],
),
@@ -88,7 +90,7 @@ class ThemePreview extends StatelessWidget {
// Color Palette
Text(
'Color Palette',
AppLocalizations.of(context)!.colorPalette,
style: Theme.of(context).textTheme.titleMedium?.copyWith(
color: colorScheme.onSurface,
fontWeight: FontWeight.w600,
@@ -103,11 +105,11 @@ class ThemePreview extends StatelessWidget {
children: logoColors.take(5).map((color) {
final index = logoColors.indexOf(color);
final labels = [
'Primary',
'Secondary',
'Tertiary',
'Accent 1',
'Accent 2'
AppLocalizations.of(context)!.colorPrimary,
AppLocalizations.of(context)!.colorSecondary,
AppLocalizations.of(context)!.colorTertiary,
AppLocalizations.of(context)!.colorAccent1,
AppLocalizations.of(context)!.colorAccent2
];
return Column(
@@ -142,7 +144,8 @@ class ThemePreview extends StatelessWidget {
Text(
index < labels.length
? labels[index]
: 'Color ${index + 1}',
: AppLocalizations.of(context)!
.colorN((index + 1).toString()),
style: Theme.of(context).textTheme.bodySmall?.copyWith(
color: colorScheme.onSurfaceVariant,
fontWeight: FontWeight.w500,
@@ -169,7 +172,7 @@ class ThemePreview extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Theme Information',
AppLocalizations.of(context)!.themeInfo,
style: Theme.of(context).textTheme.titleSmall?.copyWith(
color: colorScheme.onSurface,
fontWeight: FontWeight.w600,
@@ -177,24 +180,27 @@ class ThemePreview extends StatelessWidget {
),
const SizedBox(height: UIConstants.spacing8),
_buildInfoRow(
'Total Colors', '${paletteInfo['totalColors']}'),
_buildInfoRow('Description', paletteInfo['description']),
AppLocalizations.of(context)!.totalColors,
'${paletteInfo['totalColors']}'),
_buildInfoRow(
AppLocalizations.of(context)!.themeDescription,
paletteInfo['description']),
if (paletteInfo['characteristics'] != null) ...[
_buildInfoRow(
'Warm Colors',
AppLocalizations.of(context)!.warmColors,
paletteInfo['characteristics']['warm']
? 'Yes'
: 'No'),
? AppLocalizations.of(context)!.yes
: AppLocalizations.of(context)!.no),
_buildInfoRow(
'Cool Colors',
AppLocalizations.of(context)!.coolColors,
paletteInfo['characteristics']['cool']
? 'Yes'
: 'No'),
? AppLocalizations.of(context)!.yes
: AppLocalizations.of(context)!.no),
_buildInfoRow(
'Neutral Colors',
AppLocalizations.of(context)!.neutralColors,
paletteInfo['characteristics']['neutral']
? 'Yes'
: 'No'),
? AppLocalizations.of(context)!.yes
: AppLocalizations.of(context)!.no),
],
],
),
@@ -216,7 +222,8 @@ class ThemePreview extends StatelessWidget {
BorderRadius.circular(UIConstants.radius12),
),
),
child: const Text('Primary Button'),
child: Text(AppLocalizations.of(context)!
.primaryButton),
),
),
const SizedBox(width: UIConstants.spacing12),
@@ -231,7 +238,8 @@ class ThemePreview extends StatelessWidget {
BorderRadius.circular(UIConstants.radius12),
),
),
child: const Text('Secondary Button'),
child: Text(AppLocalizations.of(context)!
.secondaryButton),
),
),
],