2025-01-21 14:24:31 +03:00
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
|
import 'package:provider/provider.dart';
|
|
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// Тип функции для построения виджета с учетом локализации
|
2025-01-21 14:24:31 +03:00
|
|
|
|
typedef LocalizationBuilder = Widget Function();
|
|
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// {@template localization_consumer}
|
|
|
|
|
|
/// Виджет для подписки на изменения локализации приложения.
|
|
|
|
|
|
///
|
|
|
|
|
|
/// Автоматически перестраивает дочерние виджеты при изменении языка,
|
|
|
|
|
|
/// обеспечивая реактивность интерфейса к изменениям настроек локализации.
|
|
|
|
|
|
/// {@endtemplate}
|
2025-01-21 14:24:31 +03:00
|
|
|
|
class LocalizationConsumer extends StatelessWidget {
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// {@macro localization_consumer}
|
2025-05-28 16:38:56 +03:00
|
|
|
|
const LocalizationConsumer({required this.builder, super.key});
|
2025-01-21 14:24:31 +03:00
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// Функция для построения виджета с учетом текущей локализации
|
2025-01-21 14:24:31 +03:00
|
|
|
|
final LocalizationBuilder builder;
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
|
return Consumer<LocalizationNotifier>(
|
2025-05-28 16:38:56 +03:00
|
|
|
|
builder: (_, _, _) {
|
2025-01-21 14:24:31 +03:00
|
|
|
|
return builder();
|
|
|
|
|
|
},
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// {@template localization_notifier}
|
|
|
|
|
|
/// Класс для управления локализацией приложения.
|
|
|
|
|
|
///
|
|
|
|
|
|
/// Отвечает за:
|
|
|
|
|
|
/// - Хранение текущей локали приложения
|
|
|
|
|
|
/// - Уведомление подписчиков об изменениях языка
|
|
|
|
|
|
/// - Переключение между поддерживаемыми языками
|
|
|
|
|
|
/// {@endtemplate}
|
2025-01-21 14:24:31 +03:00
|
|
|
|
final class LocalizationNotifier extends ChangeNotifier {
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// {@macro localization_notifier}
|
|
|
|
|
|
LocalizationNotifier();
|
2025-01-21 14:24:31 +03:00
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// Текущая локаль приложения
|
|
|
|
|
|
/// По умолчанию используется русский язык
|
|
|
|
|
|
Locale _locale = const Locale('ru', 'RU');
|
|
|
|
|
|
|
|
|
|
|
|
/// Получение текущей локали
|
2025-01-21 14:24:31 +03:00
|
|
|
|
Locale get locale => _locale;
|
|
|
|
|
|
|
2025-06-20 16:50:48 +03:00
|
|
|
|
/// Получение текущего языка в виде кода языка
|
|
|
|
|
|
String get language => _locale.languageCode;
|
|
|
|
|
|
|
|
|
|
|
|
/// Метод для изменения локали приложения.
|
|
|
|
|
|
///
|
|
|
|
|
|
/// Принимает:
|
|
|
|
|
|
/// - [locale] - новая локаль для установки
|
|
|
|
|
|
///
|
|
|
|
|
|
/// Уведомляет всех подписчиков об изменении локали.
|
2025-01-21 14:24:31 +03:00
|
|
|
|
void changeLocal(Locale locale) {
|
|
|
|
|
|
_locale = locale;
|
|
|
|
|
|
notifyListeners();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|