import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart' as intl;

import 'app_localizations_en.dart';
import 'app_localizations_ru.dart';

// ignore_for_file: type=lint

/// Callers can lookup localized strings with an instance of AppLocalizations
/// returned by `AppLocalizations.of(context)`.
///
/// Applications need to include `AppLocalizations.delegate()` in their app's
/// `localizationDelegates` list, and the locales they support in the app's
/// `supportedLocales` list. For example:
///
/// ```dart
/// import 'l10n/app_localizations.dart';
///
/// return MaterialApp(
///   localizationsDelegates: AppLocalizations.localizationsDelegates,
///   supportedLocales: AppLocalizations.supportedLocales,
///   home: MyApplicationHome(),
/// );
/// ```
///
/// ## Update pubspec.yaml
///
/// Please make sure to update your pubspec.yaml to include the following
/// packages:
///
/// ```yaml
/// dependencies:
///   # Internationalization support.
///   flutter_localizations:
///     sdk: flutter
///   intl: any # Use the pinned version from flutter_localizations
///
///   # Rest of dependencies
/// ```
///
/// ## iOS Applications
///
/// iOS applications define key application metadata, including supported
/// locales, in an Info.plist file that is built into the application bundle.
/// To configure the locales supported by your app, you’ll need to edit this
/// file.
///
/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file.
/// Then, in the Project Navigator, open the Info.plist file under the Runner
/// project’s Runner folder.
///
/// Next, select the Information Property List item, select Add Item from the
/// Editor menu, then select Localizations from the pop-up menu.
///
/// Select and expand the newly-created Localizations item then, for each
/// locale your application supports, add a new item and select the locale
/// you wish to add from the pop-up menu in the Value field. This list should
/// be consistent with the languages listed in the AppLocalizations.supportedLocales
/// property.
abstract class AppLocalizations {
  AppLocalizations(String locale)
      : localeName = intl.Intl.canonicalizedLocale(locale.toString());

  final String localeName;

  static AppLocalizations? of(BuildContext context) {
    return Localizations.of<AppLocalizations>(context, AppLocalizations);
  }

  static const LocalizationsDelegate<AppLocalizations> delegate =
      _AppLocalizationsDelegate();

  /// A list of this localizations delegate along with the default localizations
  /// delegates.
  ///
  /// Returns a list of localizations delegates containing this delegate along with
  /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
  /// and GlobalWidgetsLocalizations.delegate.
  ///
  /// Additional delegates can be added by appending to this list in
  /// MaterialApp. This list does not have to be used at all if a custom list
  /// of delegates is preferred or required.
  static const List<LocalizationsDelegate<dynamic>> localizationsDelegates =
      <LocalizationsDelegate<dynamic>>[
    delegate,
    GlobalMaterialLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
  ];

  /// A list of this localizations delegate's supported locales.
  static const List<Locale> supportedLocales = <Locale>[
    Locale('en'),
    Locale('ru')
  ];

  /// No description provided for @appTitle.
  ///
  /// In ru, this message translates to:
  /// **'Мессенджер'**
  String get appTitle;

  /// No description provided for @chats.
  ///
  /// In ru, this message translates to:
  /// **'Чаты'**
  String get chats;

  /// No description provided for @favorites.
  ///
  /// In ru, this message translates to:
  /// **'Избранное'**
  String get favorites;

  /// No description provided for @contacts.
  ///
  /// In ru, this message translates to:
  /// **'Контакты'**
  String get contacts;

  /// No description provided for @settings.
  ///
  /// In ru, this message translates to:
  /// **'Настройки'**
  String get settings;

  /// No description provided for @login.
  ///
  /// In ru, this message translates to:
  /// **'Вход'**
  String get login;

  /// No description provided for @username.
  ///
  /// In ru, this message translates to:
  /// **'Логин'**
  String get username;

  /// No description provided for @password.
  ///
  /// In ru, this message translates to:
  /// **'Пароль'**
  String get password;

  /// No description provided for @name.
  ///
  /// In ru, this message translates to:
  /// **'Имя'**
  String get name;

  /// No description provided for @loginButton.
  ///
  /// In ru, this message translates to:
  /// **'Войти'**
  String get loginButton;

  /// No description provided for @register.
  ///
  /// In ru, this message translates to:
  /// **'Зарегистрироваться'**
  String get register;

  /// No description provided for @noAccount.
  ///
  /// In ru, this message translates to:
  /// **'Нет аккаунта? Зарегистрироваться'**
  String get noAccount;

  /// No description provided for @logout.
  ///
  /// In ru, this message translates to:
  /// **'Выйти из аккаунта'**
  String get logout;

  /// No description provided for @serverSettings.
  ///
  /// In ru, this message translates to:
  /// **'Настройки сервера'**
  String get serverSettings;

  /// No description provided for @apiUrl.
  ///
  /// In ru, this message translates to:
  /// **'Адрес API'**
  String get apiUrl;

  /// No description provided for @apiUrlHint.
  ///
  /// In ru, this message translates to:
  /// **'https://api.example.com'**
  String get apiUrlHint;

  /// No description provided for @save.
  ///
  /// In ru, this message translates to:
  /// **'Сохранить'**
  String get save;

  /// No description provided for @serverConfig.
  ///
  /// In ru, this message translates to:
  /// **'Конфигурация сервера'**
  String get serverConfig;

  /// No description provided for @system.
  ///
  /// In ru, this message translates to:
  /// **'Система'**
  String get system;

  /// No description provided for @stories.
  ///
  /// In ru, this message translates to:
  /// **'Истории'**
  String get stories;

  /// No description provided for @chatsModule.
  ///
  /// In ru, this message translates to:
  /// **'Чаты'**
  String get chatsModule;

  /// No description provided for @messages.
  ///
  /// In ru, this message translates to:
  /// **'Сообщения'**
  String get messages;

  /// No description provided for @calls.
  ///
  /// In ru, this message translates to:
  /// **'Звонки'**
  String get calls;

  /// No description provided for @klipy.
  ///
  /// In ru, this message translates to:
  /// **'Клипы'**
  String get klipy;

  /// No description provided for @import.
  ///
  /// In ru, this message translates to:
  /// **'Импорт'**
  String get import;

  /// No description provided for @federation.
  ///
  /// In ru, this message translates to:
  /// **'Федерация'**
  String get federation;

  /// No description provided for @domainUrl.
  ///
  /// In ru, this message translates to:
  /// **'Домен'**
  String get domainUrl;

  /// No description provided for @registrationStatus.
  ///
  /// In ru, this message translates to:
  /// **'Регистрация'**
  String get registrationStatus;

  /// No description provided for @enabled.
  ///
  /// In ru, this message translates to:
  /// **'Включено'**
  String get enabled;

  /// No description provided for @disabled.
  ///
  /// In ru, this message translates to:
  /// **'Отключено'**
  String get disabled;

  /// No description provided for @language.
  ///
  /// In ru, this message translates to:
  /// **'Язык'**
  String get language;

  /// No description provided for @russian.
  ///
  /// In ru, this message translates to:
  /// **'Русский'**
  String get russian;

  /// No description provided for @english.
  ///
  /// In ru, this message translates to:
  /// **'English'**
  String get english;

  /// No description provided for @notifications.
  ///
  /// In ru, this message translates to:
  /// **'Уведомления'**
  String get notifications;

  /// No description provided for @privacy.
  ///
  /// In ru, this message translates to:
  /// **'Конфиденциальность'**
  String get privacy;

  /// No description provided for @soundsAndVibration.
  ///
  /// In ru, this message translates to:
  /// **'Звуки и вибрация'**
  String get soundsAndVibration;

  /// No description provided for @dataAndStorage.
  ///
  /// In ru, this message translates to:
  /// **'Данные и память'**
  String get dataAndStorage;

  /// No description provided for @aboutApp.
  ///
  /// In ru, this message translates to:
  /// **'О приложении'**
  String get aboutApp;

  /// No description provided for @help.
  ///
  /// In ru, this message translates to:
  /// **'Помощь'**
  String get help;

  /// No description provided for @version.
  ///
  /// In ru, this message translates to:
  /// **'Версия'**
  String get version;

  /// No description provided for @loading.
  ///
  /// In ru, this message translates to:
  /// **'Загрузка...'**
  String get loading;

  /// No description provided for @error.
  ///
  /// In ru, this message translates to:
  /// **'Ошибка'**
  String get error;

  /// No description provided for @retry.
  ///
  /// In ru, this message translates to:
  /// **'Повторить'**
  String get retry;

  /// No description provided for @noChats.
  ///
  /// In ru, this message translates to:
  /// **'У вас пока нет чатов'**
  String get noChats;

  /// No description provided for @inDevelopment.
  ///
  /// In ru, this message translates to:
  /// **'Функция в разработке'**
  String get inDevelopment;

  /// No description provided for @user.
  ///
  /// In ru, this message translates to:
  /// **'Пользователь'**
  String get user;

  /// No description provided for @edit.
  ///
  /// In ru, this message translates to:
  /// **'Редактировать'**
  String get edit;

  /// No description provided for @serverConnectionError.
  ///
  /// In ru, this message translates to:
  /// **'Ошибка подключения к серверу'**
  String get serverConnectionError;

  /// No description provided for @connected.
  ///
  /// In ru, this message translates to:
  /// **'Подключено'**
  String get connected;

  /// No description provided for @unknownError.
  ///
  /// In ru, this message translates to:
  /// **'Неизвестная ошибка'**
  String get unknownError;

  /// No description provided for @networkError.
  ///
  /// In ru, this message translates to:
  /// **'Ошибка сети'**
  String get networkError;

  /// No description provided for @serverError.
  ///
  /// In ru, this message translates to:
  /// **'Ошибка сервера'**
  String get serverError;

  /// No description provided for @parsingError.
  ///
  /// In ru, this message translates to:
  /// **'Ошибка обработки данных'**
  String get parsingError;

  /// No description provided for @voice.
  ///
  /// In ru, this message translates to:
  /// **'Голосовые вызовы'**
  String get voice;

  /// No description provided for @video.
  ///
  /// In ru, this message translates to:
  /// **'Видеовызовы'**
  String get video;

  /// No description provided for @lifetime.
  ///
  /// In ru, this message translates to:
  /// **'Время жизни'**
  String get lifetime;

  /// No description provided for @groups.
  ///
  /// In ru, this message translates to:
  /// **'Группы'**
  String get groups;

  /// No description provided for @maxParticipants.
  ///
  /// In ru, this message translates to:
  /// **'Макс. участников'**
  String get maxParticipants;

  /// No description provided for @hours.
  ///
  /// In ru, this message translates to:
  /// **'ч.'**
  String get hours;

  /// No description provided for @dailyLimit.
  ///
  /// In ru, this message translates to:
  /// **'Дневной лимит'**
  String get dailyLimit;

  /// No description provided for @historyLimit.
  ///
  /// In ru, this message translates to:
  /// **'Лимит истории'**
  String get historyLimit;

  /// No description provided for @maxFileSize.
  ///
  /// In ru, this message translates to:
  /// **'Макс. файл'**
  String get maxFileSize;

  /// No description provided for @noLimit.
  ///
  /// In ru, this message translates to:
  /// **'Без лимита'**
  String get noLimit;

  /// No description provided for @allowForwarding.
  ///
  /// In ru, this message translates to:
  /// **'Пересылка'**
  String get allowForwarding;

  /// No description provided for @allowReactions.
  ///
  /// In ru, this message translates to:
  /// **'Реакции'**
  String get allowReactions;

  /// No description provided for @allowReplies.
  ///
  /// In ru, this message translates to:
  /// **'Ответы'**
  String get allowReplies;

  /// No description provided for @allowQuoting.
  ///
  /// In ru, this message translates to:
  /// **'Цитирование'**
  String get allowQuoting;

  /// No description provided for @allowMessageDeletion.
  ///
  /// In ru, this message translates to:
  /// **'Удаление'**
  String get allowMessageDeletion;

  /// No description provided for @forbidCopying.
  ///
  /// In ru, this message translates to:
  /// **'Запрет копирования'**
  String get forbidCopying;

  /// No description provided for @allowLinks.
  ///
  /// In ru, this message translates to:
  /// **'Ссылки'**
  String get allowLinks;

  /// No description provided for @allowPolls.
  ///
  /// In ru, this message translates to:
  /// **'Опросы'**
  String get allowPolls;

  /// No description provided for @allowPinning.
  ///
  /// In ru, this message translates to:
  /// **'Закрепы'**
  String get allowPinning;

  /// No description provided for @allowMedia.
  ///
  /// In ru, this message translates to:
  /// **'Медиа'**
  String get allowMedia;

  /// No description provided for @description.
  ///
  /// In ru, this message translates to:
  /// **'Описание'**
  String get description;

  /// No description provided for @server.
  ///
  /// In ru, this message translates to:
  /// **'Сервер'**
  String get server;

  /// No description provided for @notSpecified.
  ///
  /// In ru, this message translates to:
  /// **'не указан'**
  String get notSpecified;

  /// No description provided for @settingsSaved.
  ///
  /// In ru, this message translates to:
  /// **'Настройки сохранены'**
  String get settingsSaved;

  /// No description provided for @enterUsername.
  ///
  /// In ru, this message translates to:
  /// **'Введите логин'**
  String get enterUsername;

  /// No description provided for @invalidUsername.
  ///
  /// In ru, this message translates to:
  /// **'Логин должен быть от 3 символов и без кириллицы'**
  String get invalidUsername;

  /// No description provided for @loginFailed.
  ///
  /// In ru, this message translates to:
  /// **'Ошибка входа. Проверьте логин и пароль'**
  String get loginFailed;

  /// No description provided for @registrationFailed.
  ///
  /// In ru, this message translates to:
  /// **'Ошибка регистрации'**
  String get registrationFailed;

  /// No description provided for @online.
  ///
  /// In ru, this message translates to:
  /// **'в сети'**
  String get online;

  /// No description provided for @lastSeen.
  ///
  /// In ru, this message translates to:
  /// **'был(а) в сети {date} в {time}'**
  String lastSeen(Object date, Object time);

  /// No description provided for @lastSeenRelative.
  ///
  /// In ru, this message translates to:
  /// **'был(а) {hours} ч. {minutes} мин. назад'**
  String lastSeenRelative(Object hours, Object minutes);

  /// No description provided for @lastSeenRelativeMinutes.
  ///
  /// In ru, this message translates to:
  /// **'был(а) {minutes} мин. назад'**
  String lastSeenRelativeMinutes(Object minutes);

  /// No description provided for @lastSeenJustNow.
  ///
  /// In ru, this message translates to:
  /// **'был(а) только что'**
  String get lastSeenJustNow;

  /// No description provided for @lastSeenYesterday.
  ///
  /// In ru, this message translates to:
  /// **'был(а) вчера в {time}'**
  String lastSeenYesterday(Object time);

  /// No description provided for @lastSeenDayBeforeYesterday.
  ///
  /// In ru, this message translates to:
  /// **'был(а) позавчера в {time}'**
  String lastSeenDayBeforeYesterday(Object time);

  /// No description provided for @noMessages.
  ///
  /// In ru, this message translates to:
  /// **'Сообщений пока нет'**
  String get noMessages;

  /// No description provided for @messageHint.
  ///
  /// In ru, this message translates to:
  /// **'Сообщение'**
  String get messageHint;
}

class _AppLocalizationsDelegate
    extends LocalizationsDelegate<AppLocalizations> {
  const _AppLocalizationsDelegate();

  @override
  Future<AppLocalizations> load(Locale locale) {
    return SynchronousFuture<AppLocalizations>(lookupAppLocalizations(locale));
  }

  @override
  bool isSupported(Locale locale) =>
      <String>['en', 'ru'].contains(locale.languageCode);

  @override
  bool shouldReload(_AppLocalizationsDelegate old) => false;
}

AppLocalizations lookupAppLocalizations(Locale locale) {
  // Lookup logic when only language code is specified.
  switch (locale.languageCode) {
    case 'en':
      return AppLocalizationsEn();
    case 'ru':
      return AppLocalizationsRu();
  }

  throw FlutterError(
      'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely '
      'an issue with the localizations generation tool. Please file an issue '
      'on GitHub with a reproducible sample app and the gen-l10n configuration '
      'that was used.');
}
