Jonny Borges

fix internationalization and add tests to tr

import 'dart:ui';
import '../../../get_core/get_core.dart';
class _IntlHost {
Locale? locale;
Locale? fallbackLocale;
Map<String, Map<String, String>> translations = {};
}
extension FirstWhereExt<T> on List<T> {
/// The first element satisfying [test], or `null` if there are none.
T? firstWhereOrNull(bool Function(T element) test) {
for (var element in this) {
if (test(element)) return element;
}
return null;
}
}
extension LocalesIntl on GetInterface {
static final _intlHost = _IntlHost();
Locale? get locale => _intlHost.locale;
Locale? get fallbackLocale => _intlHost.fallbackLocale;
set locale(Locale? newLocale) => _intlHost.locale = newLocale;
set fallbackLocale(Locale? newLocale) => _intlHost.fallbackLocale = newLocale;
Map<String, Map<String, String>> get translations => _intlHost.translations;
void addTranslations(Map<String, Map<String, String>> tr) {
translations.addAll(tr);
}
void clearTranslations() {
translations.clear();
}
void appendTranslations(Map<String, Map<String, String>> tr) {
tr.forEach((key, map) {
if (translations.containsKey(key)) {
translations[key]!.addAll(map);
} else {
translations[key] = map;
}
});
}
}
extension Trans on String {
// Checks whether the language code and country code are present, and
// whether the key is also present.
bool get _fullLocaleAndKey {
return Get.translations.containsKey(
"${Get.locale!.languageCode}_${Get.locale!.countryCode}") &&
Get.translations[
"${Get.locale!.languageCode}_${Get.locale!.countryCode}"]!
.containsKey(this);
}
// Checks if there is a callback language in the absence of the specific
// country, and if it contains that key.
Map<String, String>? get _getSimilarLanguageTranslation {
final translationsWithNoCountry = Get.translations
.map((key, value) => MapEntry(key.split("_").first, value));
final containsKey =
translationsWithNoCountry.containsKey(Get.locale!.languageCode);
if (!containsKey) {
return null;
}
return translationsWithNoCountry[Get.locale!.languageCode];
}
String get tr {
// print('language');
// print(Get.locale!.languageCode);
// print('contains');
// print(Get.translations.containsKey(Get.locale!.languageCode));
// print(Get.translations.keys);
// Returns the key if locale is null.
if (Get.locale?.languageCode == null) return this;
// Checks whether the language code and country code are present, and
// whether the key is also present.
if (Get.translations.containsKey(
"${Get.locale!.languageCode}_${Get.locale!.countryCode}") &&
Get.translations[
"${Get.locale!.languageCode}_${Get.locale!.countryCode}"]!
.containsKey(this)) {
if (_fullLocaleAndKey) {
return Get.translations[
"${Get.locale!.languageCode}_${Get.locale!.countryCode}"]![this]!;
// Checks if there is a callback language in the absence of the specific
// country, and if it contains that key.
} else if (Get.translations.containsKey(Get.locale!.languageCode) &&
Get.translations[Get.locale!.languageCode]!.containsKey(this)) {
return Get.translations[Get.locale!.languageCode]![this]!;
}
final similarTranslation = _getSimilarLanguageTranslation;
if (similarTranslation != null && similarTranslation.containsKey(this)) {
return similarTranslation[this]!;
// If there is no corresponding language or corresponding key, return
// the key.
} else if (Get.fallbackLocale != null) {
... ... @@ -70,43 +143,3 @@ extension Trans on String {
return i == 1 ? trParams(params) : pluralKey!.trParams(params);
}
}
class _IntlHost {
Locale? locale;
Locale? fallbackLocale;
Map<String, Map<String, String>> translations = {};
}
extension LocalesIntl on GetInterface {
static final _intlHost = _IntlHost();
Locale? get locale => _intlHost.locale;
Locale? get fallbackLocale => _intlHost.fallbackLocale;
set locale(Locale? newLocale) => _intlHost.locale = newLocale;
set fallbackLocale(Locale? newLocale) => _intlHost.fallbackLocale = newLocale;
Map<String, Map<String, String>> get translations => _intlHost.translations;
void addTranslations(Map<String, Map<String, String>> tr) {
translations.addAll(tr);
}
void clearTranslations() {
translations.clear();
}
void appendTranslations(Map<String, Map<String, String>> tr) {
tr.forEach((key, map) {
if (translations.containsKey(key)) {
translations[key]!.addAll(map);
} else {
translations[key] = map;
}
});
}
}
... ...
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:get/get.dart';
import '../navigation/utils/wrapper.dart';
void main() {
testWidgets("Get.defaultDialog smoke test", (tester) async {
await tester.pumpWidget(
Wrapper(child: Container()),
);
await tester.pumpAndSettle();
expect('covid'.tr, 'Corona Virus');
expect('total_confirmed'.tr, 'Total Confirmed');
expect('total_deaths'.tr, 'Total Deaths');
Get.updateLocale(Locale('pt', 'BR'));
await tester.pumpAndSettle();
expect('covid'.tr, 'Corona Vírus');
expect('total_confirmed'.tr, 'Total confirmado');
expect('total_deaths'.tr, 'Total de mortes');
Get.updateLocale(Locale('en', 'EN'));
await tester.pumpAndSettle();
expect('covid'.tr, 'Corona Virus');
expect('total_confirmed'.tr, 'Total Confirmed');
expect('total_deaths'.tr, 'Total Deaths');
});
}
... ...
... ... @@ -20,6 +20,8 @@ class Wrapper extends StatelessWidget {
return GetMaterialApp(
defaultTransition: defaultTransition,
initialRoute: initialRoute,
translations: WrapperTranslations(),
locale: WrapperTranslations.locale,
getPages: namedRoutes,
home: Scaffold(
body: child,
... ... @@ -51,3 +53,21 @@ class WrapperNamed extends StatelessWidget {
);
}
}
class WrapperTranslations extends Translations {
static final fallbackLocale = Locale('en', 'US');
static Locale? get locale => Locale('en', 'US');
@override
Map<String, Map<String, String>> get keys => {
'en_US': {
'covid': 'Corona Virus',
'total_confirmed': 'Total Confirmed',
'total_deaths': 'Total Deaths',
},
'pt_BR': {
'covid': 'Corona Vírus',
'total_confirmed': 'Total confirmado',
'total_deaths': 'Total de mortes',
},
};
}
... ...
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:get/get.dart';
import '../../navigation/utils/wrapper.dart';
void main() {
test('', () {});
testWidgets("Get.defaultDialog smoke test", (tester) async {
await tester.pumpWidget(Wrapper(child: Container()));
final BuildContext context = tester.element(find.byType(Container));
var mediaQuery = MediaQuery.of(context);
expect(mediaQuery, context.mediaQuery);
var mediaQuerySize = mediaQuery.size;
expect(mediaQuerySize, context.mediaQuerySize);
var theme = Theme.of(context);
expect(theme, context.theme);
var textTheme = theme.textTheme;
expect(textTheme, context.textTheme);
var devicePixelRatio = mediaQuery.devicePixelRatio;
expect(devicePixelRatio, context.devicePixelRatio);
var height = mediaQuerySize.height;
expect(height, context.height);
final heightTransformer =
(mediaQuerySize.height - ((mediaQuerySize.height / 100) * 0)) / 1;
expect(heightTransformer, context.heightTransformer());
var iconColor = theme.iconTheme.color;
expect(iconColor, context.iconColor);
var isDarkMode = (theme.brightness == Brightness.dark);
expect(isDarkMode, context.isDarkMode);
var orientation = mediaQuery.orientation;
expect(orientation, context.orientation);
var isLandscape = orientation == Orientation.landscape;
expect(isLandscape, context.isLandscape);
var mediaQueryShortestSide = mediaQuerySize.shortestSide;
expect(mediaQueryShortestSide, context.mediaQueryShortestSide);
var isLargeTablet = (mediaQueryShortestSide >= 720);
expect(isLargeTablet, context.isLargeTablet);
var isPhone = (mediaQueryShortestSide < 600);
expect(isPhone, context.isPhone);
var isPortrait = orientation == Orientation.portrait;
expect(isPortrait, context.isPortrait);
var isSmallTablet = (mediaQueryShortestSide >= 600);
expect(isSmallTablet, context.isSmallTablet);
var isTablet = isSmallTablet || isLargeTablet;
expect(isTablet, context.isTablet);
var mediaQueryPadding = mediaQuery.padding;
expect(mediaQueryPadding, context.mediaQueryPadding);
var mediaQueryViewInsets = mediaQuery.viewInsets;
expect(mediaQueryViewInsets, context.mediaQueryViewInsets);
var mediaQueryViewPadding = mediaQuery.viewPadding;
expect(mediaQueryViewPadding, context.mediaQueryViewPadding);
var widthTransformer =
(mediaQuerySize.width - ((mediaQuerySize.width / 100) * 0)) / 1;
expect(widthTransformer, context.widthTransformer());
var ratio = heightTransformer / widthTransformer;
expect(ratio, context.ratio());
var width = mediaQuerySize.width;
expect(width, context.width);
var showNavbar = (width > 800);
expect(showNavbar, context.showNavbar);
var textScaleFactor = mediaQuery.textScaleFactor;
expect(textScaleFactor, context.textScaleFactor);
});
}
... ...