adding multilingual support
This commit is contained in:
@@ -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),
|
||||
),
|
||||
),
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user