Localize rest of intl (#301)
* Localize rest of intl * Add changelog entry
This commit is contained in:
parent
95d8ee7fa7
commit
d87a8a83c3
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- "Time ago" strings are now localized
|
- "Time ago" strings, dates, and compact numbers are now localized
|
||||||
|
|
||||||
## v0.7.0 - 2021-11-04
|
## v0.7.0 - 2021-11-04
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
import 'package:json_annotation/json_annotation.dart';
|
import 'package:json_annotation/json_annotation.dart';
|
||||||
|
import 'package:timeago/timeago.dart';
|
||||||
|
|
||||||
export 'gen/l10n.dart';
|
export 'gen/l10n.dart';
|
||||||
export 'l10n_api.dart';
|
export 'l10n_api.dart';
|
||||||
|
@ -76,3 +78,22 @@ extension LanguageName on Locale {
|
||||||
/// returns the name of the language in the given language
|
/// returns the name of the language in the given language
|
||||||
String get languageName => _languageNames[toLanguageTag()] ?? toLanguageTag();
|
String get languageName => _languageNames[toLanguageTag()] ?? toLanguageTag();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -5,7 +5,6 @@ import '../../l10n/l10n.dart';
|
||||||
import '../../stores/accounts_store.dart';
|
import '../../stores/accounts_store.dart';
|
||||||
import '../../util/extensions/spaced.dart';
|
import '../../util/extensions/spaced.dart';
|
||||||
import '../../util/goto.dart';
|
import '../../util/goto.dart';
|
||||||
import '../../util/intl.dart';
|
|
||||||
import '../../util/observer_consumers.dart';
|
import '../../util/observer_consumers.dart';
|
||||||
import '../../widgets/bottom_safe.dart';
|
import '../../widgets/bottom_safe.dart';
|
||||||
import '../../widgets/markdown_text.dart';
|
import '../../widgets/markdown_text.dart';
|
||||||
|
@ -72,10 +71,10 @@ class CommmunityAboutTab extends StatelessWidget {
|
||||||
.number_of_subscribers(community.counts.subscribers))),
|
.number_of_subscribers(community.counts.subscribers))),
|
||||||
Chip(
|
Chip(
|
||||||
label: Text(
|
label: Text(
|
||||||
'${community.counts.posts} post${pluralS(community.counts.posts)}')),
|
'${community.counts.posts} post${community.counts.posts == 1 ? '' : 's'}')),
|
||||||
Chip(
|
Chip(
|
||||||
label: Text(
|
label: Text(
|
||||||
'${community.counts.comments} comment${pluralS(community.counts.comments)}')),
|
'${community.counts.comments} comment${community.counts.comments == 1 ? '' : 's'}')),
|
||||||
].spaced(8),
|
].spaced(8),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -2,9 +2,9 @@ import 'package:flutter/gestures.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lemmy_api_client/v3.dart';
|
import 'package:lemmy_api_client/v3.dart';
|
||||||
|
|
||||||
|
import '../../l10n/l10n.dart';
|
||||||
import '../../util/extensions/api.dart';
|
import '../../util/extensions/api.dart';
|
||||||
import '../../util/goto.dart';
|
import '../../util/goto.dart';
|
||||||
import '../../util/intl.dart';
|
|
||||||
import '../../widgets/avatar.dart';
|
import '../../widgets/avatar.dart';
|
||||||
import '../../widgets/cached_network_image.dart';
|
import '../../widgets/cached_network_image.dart';
|
||||||
import '../../widgets/fullscreenable_image.dart';
|
import '../../widgets/fullscreenable_image.dart';
|
||||||
|
@ -124,11 +124,11 @@ class CommunityOverview extends StatelessWidget {
|
||||||
const Spacer(),
|
const Spacer(),
|
||||||
const Icon(Icons.people, size: 20),
|
const Icon(Icons.people, size: 20),
|
||||||
const SizedBox(width: 3),
|
const SizedBox(width: 3),
|
||||||
Text(compactNumber(community.counts.subscribers)),
|
Text(community.counts.subscribers.compact(context)),
|
||||||
const Spacer(flex: 4),
|
const Spacer(flex: 4),
|
||||||
const Icon(Icons.record_voice_over, size: 20),
|
const Icon(Icons.record_voice_over, size: 20),
|
||||||
const SizedBox(width: 3),
|
const SizedBox(width: 3),
|
||||||
Text(compactNumber(fullCommunityView.online)),
|
Text(fullCommunityView.online.compact(context)),
|
||||||
const Spacer(),
|
const Spacer(),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
@ -11,7 +11,6 @@ import '../hooks/stores.dart';
|
||||||
import '../l10n/l10n.dart';
|
import '../l10n/l10n.dart';
|
||||||
import '../util/delayed_action.dart';
|
import '../util/delayed_action.dart';
|
||||||
import '../util/extensions/api.dart';
|
import '../util/extensions/api.dart';
|
||||||
import '../util/extensions/datetime.dart';
|
|
||||||
import '../util/goto.dart';
|
import '../util/goto.dart';
|
||||||
import '../util/icons.dart';
|
import '../util/icons.dart';
|
||||||
import '../widgets/bottom_modal.dart';
|
import '../widgets/bottom_modal.dart';
|
||||||
|
|
|
@ -3,8 +3,8 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||||
import 'package:lemmy_api_client/v3.dart';
|
import 'package:lemmy_api_client/v3.dart';
|
||||||
|
|
||||||
|
import '../l10n/l10n.dart';
|
||||||
import '../util/extensions/api.dart';
|
import '../util/extensions/api.dart';
|
||||||
import '../util/extensions/datetime.dart';
|
|
||||||
import '../util/goto.dart';
|
import '../util/goto.dart';
|
||||||
import '../widgets/avatar.dart';
|
import '../widgets/avatar.dart';
|
||||||
import '../widgets/bottom_safe.dart';
|
import '../widgets/bottom_safe.dart';
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:timeago/timeago.dart';
|
|
||||||
|
|
||||||
extension FancyTime 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());
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
import 'package:intl/intl.dart';
|
|
||||||
|
|
||||||
String pluralS(int howMany) => howMany == 1 ? '' : 's';
|
|
||||||
|
|
||||||
String compactNumber(int number) => NumberFormat.compact().format(number);
|
|
|
@ -10,9 +10,7 @@ import '../../stores/config_store.dart';
|
||||||
import '../../util/async_store_listener.dart';
|
import '../../util/async_store_listener.dart';
|
||||||
import '../../util/extensions/api.dart';
|
import '../../util/extensions/api.dart';
|
||||||
import '../../util/extensions/cake_day.dart';
|
import '../../util/extensions/cake_day.dart';
|
||||||
import '../../util/extensions/datetime.dart';
|
|
||||||
import '../../util/goto.dart';
|
import '../../util/goto.dart';
|
||||||
import '../../util/intl.dart';
|
|
||||||
import '../../util/observer_consumers.dart';
|
import '../../util/observer_consumers.dart';
|
||||||
import '../../util/text_color.dart';
|
import '../../util/text_color.dart';
|
||||||
import '../avatar.dart';
|
import '../avatar.dart';
|
||||||
|
@ -266,9 +264,8 @@ class _CommentWidget extends StatelessWidget {
|
||||||
)
|
)
|
||||||
else if (configStore.showScores)
|
else if (configStore.showScores)
|
||||||
Text(
|
Text(
|
||||||
compactNumber(
|
store.comment.counts.score
|
||||||
store.comment.counts.score,
|
.compact(context),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
if (configStore.showScores)
|
if (configStore.showScores)
|
||||||
const Text(' · ')
|
const Text(' · ')
|
||||||
|
|
|
@ -5,7 +5,6 @@ import 'package:flutter/material.dart';
|
||||||
import '../../l10n/l10n.dart';
|
import '../../l10n/l10n.dart';
|
||||||
import '../../pages/community/community.dart';
|
import '../../pages/community/community.dart';
|
||||||
import '../../util/extensions/api.dart';
|
import '../../util/extensions/api.dart';
|
||||||
import '../../util/extensions/datetime.dart';
|
|
||||||
import '../../util/goto.dart';
|
import '../../util/goto.dart';
|
||||||
import '../../util/observer_consumers.dart';
|
import '../../util/observer_consumers.dart';
|
||||||
import '../avatar.dart';
|
import '../avatar.dart';
|
||||||
|
|
|
@ -4,8 +4,8 @@ import 'package:lemmy_api_client/v3.dart';
|
||||||
|
|
||||||
import '../../hooks/logged_in_action.dart';
|
import '../../hooks/logged_in_action.dart';
|
||||||
import '../../hooks/stores.dart';
|
import '../../hooks/stores.dart';
|
||||||
|
import '../../l10n/l10n.dart';
|
||||||
import '../../stores/config_store.dart';
|
import '../../stores/config_store.dart';
|
||||||
import '../../util/intl.dart';
|
|
||||||
import '../../util/observer_consumers.dart';
|
import '../../util/observer_consumers.dart';
|
||||||
import 'post_store.dart';
|
import 'post_store.dart';
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ class PostVoting extends HookWidget {
|
||||||
child: CircularProgressIndicator.adaptive(),
|
child: CircularProgressIndicator.adaptive(),
|
||||||
)
|
)
|
||||||
else if (showScores)
|
else if (showScores)
|
||||||
Text(compactNumber(store.postView.counts.score)),
|
Text(store.postView.counts.score.compact(context)),
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(
|
icon: Icon(
|
||||||
Icons.arrow_downward,
|
Icons.arrow_downward,
|
||||||
|
|
|
@ -9,7 +9,6 @@ import '../l10n/l10n.dart';
|
||||||
import '../pages/manage_account.dart';
|
import '../pages/manage_account.dart';
|
||||||
import '../util/extensions/api.dart';
|
import '../util/extensions/api.dart';
|
||||||
import '../util/extensions/cake_day.dart';
|
import '../util/extensions/cake_day.dart';
|
||||||
import '../util/extensions/datetime.dart';
|
|
||||||
import '../util/goto.dart';
|
import '../util/goto.dart';
|
||||||
import '../util/text_color.dart';
|
import '../util/text_color.dart';
|
||||||
import 'avatar.dart';
|
import 'avatar.dart';
|
||||||
|
@ -290,8 +289,9 @@ class _UserOverview extends HookWidget {
|
||||||
),
|
),
|
||||||
const SizedBox(width: 4),
|
const SizedBox(width: 4),
|
||||||
Text(
|
Text(
|
||||||
DateFormat('MMM dd, yyyy')
|
DateFormat.yMMMMd(
|
||||||
.format(userView.person.published),
|
Localizations.localeOf(context).toLanguageTag(),
|
||||||
|
).format(userView.person.published),
|
||||||
style: theme.textTheme.bodyText1,
|
style: theme.textTheme.bodyText1,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
Loading…
Reference in New Issue