Skip to content

Commit

Permalink
Merge pull request #614 from ademar111190/add-locale-aware-currency-f…
Browse files Browse the repository at this point in the history
…ormat

Add locale support for currency format
  • Loading branch information
roeierez committed Oct 31, 2021
2 parents 4e274fc + b913656 commit 35d9845
Show file tree
Hide file tree
Showing 5 changed files with 132 additions and 30 deletions.
15 changes: 8 additions & 7 deletions lib/bloc/account/fiat_conversion.dart
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,15 @@ class FiatConversion {
bool removeTrailingZeros = false,
bool allowBelowMin = false,
}) {
int fractionSize = this.currencyData.fractionSize;
final currencyData = this.currencyData.localeAware();
int fractionSize = currencyData.fractionSize;
double minimumAmount = 1 / (pow(10, fractionSize));

String formattedAmount = "";
String spacing = " " * this.currencyData.spacing;
String symbol = (this.currencyData.position == 1)
? spacing + '${this.currencyData.symbol}'
: '${this.currencyData.symbol}' + spacing;
String spacing = " " * currencyData.spacing;
String symbol = (currencyData.position == 1)
? spacing + '${currencyData.symbol}'
: '${currencyData.symbol}' + spacing;
// if conversion result is less than the minimum it doesn't make sense to display
// it.
if (!allowBelowMin && fiatAmount < minimumAmount) {
Expand All @@ -69,11 +70,11 @@ class FiatConversion {
formattedAmount = formatter.format(fiatAmount);
}
if (addCurrencySymbol) {
formattedAmount = (this.currencyData.position == 1)
formattedAmount = (currencyData.position == 1)
? formattedAmount + symbol
: symbol + formattedAmount;
} else if (includeDisplayName) {
formattedAmount += this.currencyData.shortName;
formattedAmount += currencyData.shortName;
}
if (removeTrailingZeros) {
RegExp removeTrailingZeros = RegExp(r"([.]0*)(?!.*\d)");
Expand Down
1 change: 0 additions & 1 deletion lib/l10n/locales.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ Iterable<LocalizationsDelegate<dynamic>> localizationsDelegates() {
Iterable<Locale> supportedLocales() {
return [
const Locale('en', ''),
const Locale('de', ''),
const Locale('pt', ''),
];
}
99 changes: 80 additions & 19 deletions lib/services/currency_data.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,22 @@
import 'dart:convert';

import 'package:breez/utils/locale.dart';

Map<String, CurrencyData> currencyDataFromJson(String str) =>
Map.from(json.decode(str)).map((k, v) =>
MapEntry<String, CurrencyData>(k, CurrencyData.fromJson(k, v)));

Map<String, CurrencyDataOverride> currencyDataOverrideFromJson(
CurrencyData base,
Map<String, dynamic> src,
) {
if (src == null || src.isEmpty) return {};
return src.map((locale, json) => MapEntry<String, CurrencyDataOverride>(
locale,
CurrencyDataOverride.fromJson(base, json),
));
}

class CurrencyData {
String name;
String shortName;
Expand All @@ -12,24 +25,72 @@ class CurrencyData {
bool rtl;
int position;
int spacing;
Map<String, CurrencyDataOverride> localeOverrides = {};

CurrencyData({
this.name,
this.shortName,
this.fractionSize,
this.symbol,
this.rtl,
this.position,
this.spacing,
});

CurrencyData localeAware() {
if (localeOverrides.isEmpty) return this;
final locale = getSystemLocale();
if (localeOverrides.containsKey(locale.toLanguageTag())) {
return localeOverrides[locale.toLanguageTag()];
}
if (localeOverrides.containsKey(locale.languageCode)) {
return localeOverrides[locale.languageCode];
}
return this;
}

factory CurrencyData.fromJson(String shortName, Map<String, dynamic> json) {
final currencyData = CurrencyData(
name: json["name"],
shortName: shortName,
fractionSize: json["fractionSize"] ?? 0,
symbol: json["symbol"] != null ? json["symbol"]["grapheme"] : shortName,
rtl: json["symbol"] != null ? json["symbol"]["rtl"] : false,
position: json["symbol"] != null ? json["symbol"]["position"] ?? 0 : 0,
spacing: json["spacing"] ?? 1,
);
final localeOverrides = currencyDataOverrideFromJson(
currencyData,
json["localeOverrides"],
);
currencyData.localeOverrides = localeOverrides;
return currencyData;
}
}

class CurrencyDataOverride extends CurrencyData {
CurrencyDataOverride({
CurrencyData base,
int position,
int spacing,
}) : super(
name: base.name,
shortName: base.shortName,
fractionSize: base.fractionSize,
symbol: base.symbol,
rtl: base.rtl,
position: position ?? base.position,
spacing: spacing ?? base.spacing,
);

CurrencyData(
{this.name,
this.shortName,
this.fractionSize,
this.symbol,
this.rtl,
this.position,
this.spacing});

factory CurrencyData.fromJson(String shortName, Map<String, dynamic> json) =>
CurrencyData(
name: json["name"],
shortName: shortName,
fractionSize: json["fractionSize"] ?? 0,
symbol: json["symbol"] != null ? json["symbol"]["grapheme"] : shortName,
rtl: json["symbol"] != null ? json["symbol"]["rtl"] : false,
position: json["symbol"] != null ? json["symbol"]["position"] ?? 0 : 0,
spacing: json["spacing"] ?? 1,
);
factory CurrencyDataOverride.fromJson(
CurrencyData base,
Map<String, dynamic> json,
) {
return CurrencyDataOverride(
base: base,
position: json["symbol"] != null ? json["symbol"]["position"] : null,
spacing: json["spacing"],
);
}
}
12 changes: 12 additions & 0 deletions lib/utils/locale.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'dart:io';
import 'dart:ui';

Locale getSystemLocale() {
final localeName = Platform.localeName;
if (localeName.contains("_")) {
final pieces = localeName.split("_");
return Locale(pieces[0], pieces[1]);
} else {
return Locale(localeName);
}
}
35 changes: 32 additions & 3 deletions src/json/currencies.json
Original file line number Diff line number Diff line change
Expand Up @@ -539,16 +539,45 @@
"EUR": {
"name": "Euro",
"fractionSize": 2,
"spacing": 0,
"spacing": 1,
"symbol": {
"grapheme": "",
"template": "$1",
"position": 1,
"rtl": false
},
"uniqSymbol": {
"grapheme": "",
"template": "$1",
"rtl": false
},
"localeOverrides": {
"de-AT": {
"symbol": {
"position": 0
}
},
"el-CY": {
"spacing": 0,
"symbol": {
"position": 0
}
},
"en": {
"spacing": 0,
"symbol": {
"position": 0
}
},
"nl": {
"symbol": {
"position": 0
}
},
"tr": {
"spacing": 0,
"symbol": {
"position": 0
}
}
}
},
"FJD": {
Expand Down

0 comments on commit 35d9845

Please sign in to comment.