2021-02-27 17:02:55 +01:00
|
|
|
|
import 'package:flutter/material.dart';
|
2021-11-25 18:49:43 +01:00
|
|
|
|
import 'package:intl/intl.dart';
|
2021-10-31 12:52:58 +01:00
|
|
|
|
import 'package:json_annotation/json_annotation.dart';
|
2021-11-25 18:49:43 +01:00
|
|
|
|
import 'package:timeago/timeago.dart';
|
2021-02-27 17:02:55 +01:00
|
|
|
|
|
2021-11-05 21:37:27 +01:00
|
|
|
|
export 'gen/l10n.dart';
|
2021-03-09 08:51:08 +01:00
|
|
|
|
export 'l10n_api.dart';
|
2021-03-01 00:02:32 +01:00
|
|
|
|
export 'l10n_from_string.dart';
|
2021-02-27 17:02:55 +01:00
|
|
|
|
|
2021-10-31 12:52:58 +01:00
|
|
|
|
class LocaleConverter implements JsonConverter<Locale, String?> {
|
|
|
|
|
const LocaleConverter();
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Locale fromJson(String? json) {
|
2021-04-11 00:55:04 +02:00
|
|
|
|
if (json == null) return const Locale('en');
|
2021-02-27 17:02:55 +01:00
|
|
|
|
|
|
|
|
|
final lang = json.split('-');
|
|
|
|
|
|
|
|
|
|
return Locale(lang[0], lang.length > 1 ? lang[1] : null);
|
|
|
|
|
}
|
|
|
|
|
|
2021-10-31 12:52:58 +01:00
|
|
|
|
@override
|
|
|
|
|
String? toJson(Locale locale) => locale.toLanguageTag();
|
2021-02-27 17:02:55 +01:00
|
|
|
|
}
|
2021-03-04 09:46:08 +01:00
|
|
|
|
|
|
|
|
|
const _languageNames = {
|
|
|
|
|
'ca': 'Català',
|
|
|
|
|
'ar': 'عربي',
|
|
|
|
|
'en': 'English',
|
|
|
|
|
'el': 'Ελληνικά',
|
|
|
|
|
'eu': 'Euskara',
|
|
|
|
|
'eo': 'Esperanto',
|
|
|
|
|
'es': 'Español',
|
|
|
|
|
'da': 'Dansk',
|
|
|
|
|
'de': 'Deutsch',
|
|
|
|
|
'ga': 'Gaeilge',
|
|
|
|
|
'gl': 'Galego',
|
|
|
|
|
'hr': 'hrvatski',
|
|
|
|
|
'hu': 'Magyar Nyelv',
|
|
|
|
|
'ka': 'ქართული ენა',
|
|
|
|
|
'ko': '한국어',
|
|
|
|
|
'km': 'ភាសាខ្មែរ',
|
|
|
|
|
'hi': 'मानक हिन्दी',
|
|
|
|
|
'fa': 'فارسی',
|
|
|
|
|
'ja': '日本語',
|
|
|
|
|
'oc': 'Occitan',
|
|
|
|
|
'pl': 'Polski',
|
|
|
|
|
'pt': 'Português',
|
2021-11-16 17:06:07 +01:00
|
|
|
|
'pt-BR': 'Português Brasileiro',
|
2021-03-04 09:46:08 +01:00
|
|
|
|
'zh': '中文',
|
|
|
|
|
'fi': 'Suomi',
|
|
|
|
|
'fr': 'Français',
|
|
|
|
|
'sv': 'Svenska',
|
|
|
|
|
'sq': 'Shqip',
|
2021-11-16 17:06:07 +01:00
|
|
|
|
'sr-Latn': 'srpski',
|
2021-03-04 09:46:08 +01:00
|
|
|
|
'th': 'ภาษาไทย',
|
|
|
|
|
'tr': 'Türkçe',
|
|
|
|
|
'uk': 'Українська Mова',
|
|
|
|
|
'ru': 'Русский',
|
|
|
|
|
'nl': 'Nederlands',
|
|
|
|
|
'it': 'Italiano',
|
2021-04-27 22:42:52 +02:00
|
|
|
|
'sr': 'Српски',
|
2021-11-16 17:06:07 +01:00
|
|
|
|
'zh-Hant': '繁體中文',
|
2021-04-27 22:42:52 +02:00
|
|
|
|
'nb': 'Norwegian',
|
2021-11-16 17:06:07 +01:00
|
|
|
|
'nb-NO': 'Norwegian Bokmål',
|
2021-04-27 22:42:52 +02:00
|
|
|
|
'bg': 'български',
|
2021-11-16 17:06:07 +01:00
|
|
|
|
'cs': 'čeština',
|
|
|
|
|
'cy': 'Cymraeg',
|
|
|
|
|
'id': 'Bahasa Indonesia',
|
|
|
|
|
'ml': 'മലയാളം',
|
|
|
|
|
'sk': 'slovenčina',
|
|
|
|
|
'vi': 'Tiếng Việt',
|
|
|
|
|
'bn': 'বাংলা',
|
|
|
|
|
'mnc': 'Manchu',
|
2021-03-04 09:46:08 +01:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
extension LanguageName on Locale {
|
|
|
|
|
/// returns the name of the language in the given language
|
2021-11-16 17:06:07 +01:00
|
|
|
|
String get languageName => _languageNames[toLanguageTag()] ?? toLanguageTag();
|
2021-03-04 09:46:08 +01:00
|
|
|
|
}
|
2021-11-25 18:49:43 +01:00
|
|
|
|
|
|
|
|
|
extension TimeagoTime on DateTime {
|
|
|
|
|
/// returns `this` time as a relative, human-readable string. In short format
|
|
|
|
|
String timeagoShort(BuildContext context) => format(
|
|
|
|
|
this,
|
|
|
|
|
locale: '${Localizations.localeOf(context).toLanguageTag()}_short',
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
/// returns `this` time as a relative, human-readable string
|
|
|
|
|
String timeago(BuildContext context) =>
|
|
|
|
|
format(this, locale: Localizations.localeOf(context).toLanguageTag());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
extension NumberFormatExtensions on num {
|
|
|
|
|
/// returns `this` as a formatted compact number
|
|
|
|
|
String compact(BuildContext context) => NumberFormat.compact(
|
|
|
|
|
locale: Localizations.localeOf(context).toLanguageTag(),
|
|
|
|
|
).format(this);
|
|
|
|
|
}
|