feat(i18n): full RTL/CJK support — fonts, Japanese locale, directional fixes
Bundle Noto Sans Arabic + Noto Sans JP (SIL OFL 1.1) as per-glyph fallbacks for both the UI text theme and every generated PDF, so RTL (Arabic) and CJK render on all platforms — including desktop, where the system font may lack them — instead of tofu. A shared pdf_fonts.dart centralizes the PDF theme and the three label/catalog/recovery services reuse it. Add Japanese (ja) as the CJK reference locale — fittingly, the app's own name is Japanese (種, tane, 'seed'). Core strings translated; the rest fall back to English via slang. Wired into supportedLocales (automatic) and the settings picker. Fix three physical Alignment.centerLeft -> AlignmentDirectional.centerStart in variety_detail_screen, and make month-abbreviation and avatar-initial truncation grapheme-safe (.characters) so CJK text is never cut mid-character. Tests: CJK/Arabic PDF glyph render, ja locale resolution + English fallback. The chat-bubble mirroring flagged by the audit was verified correct (already respects Directionality) and left unchanged.
This commit is contained in:
parent
fe4591d747
commit
7ae6becd8f
31 changed files with 686 additions and 104 deletions
|
|
@ -97,6 +97,7 @@
|
|||
"langAst": "Asturianu",
|
||||
"langFr": "Français",
|
||||
"langDe": "Deutsch",
|
||||
"langJa": "日本語",
|
||||
"about": "Tocante a",
|
||||
"aboutText": "Inventariu llocal y cifráu pa simiente tradicional. AGPL-3.0.",
|
||||
"aboutOpen": "Tocante a Tane"
|
||||
|
|
|
|||
|
|
@ -100,7 +100,8 @@
|
|||
"aboutText": "Lokale, verschlüsselte Saatgutbank für traditionelle Samen. AGPL-3.0.",
|
||||
"aboutOpen": "Über Tane",
|
||||
"langDe": "Deutsch",
|
||||
"langFr": "Français"
|
||||
"langFr": "Français",
|
||||
"langJa": "日本語"
|
||||
},
|
||||
"backup": {
|
||||
"title": "Sicherung und Wiederherstellung",
|
||||
|
|
|
|||
|
|
@ -98,6 +98,7 @@
|
|||
"langAst": "Asturianu",
|
||||
"langFr": "Français",
|
||||
"langDe": "Deutsch",
|
||||
"langJa": "日本語",
|
||||
"about": "About",
|
||||
"aboutText": "Local-first, encrypted inventory for traditional seeds. AGPL-3.0.",
|
||||
"aboutOpen": "About Tane"
|
||||
|
|
|
|||
|
|
@ -97,6 +97,7 @@
|
|||
"langPt": "Português",
|
||||
"langFr": "Français",
|
||||
"langDe": "Deutsch",
|
||||
"langJa": "日本語",
|
||||
"about": "Acerca de",
|
||||
"aboutText": "Inventario local y cifrado para semillas tradicionales. AGPL-3.0.",
|
||||
"aboutOpen": "Acerca de Tane"
|
||||
|
|
|
|||
|
|
@ -98,6 +98,7 @@
|
|||
"langAst": "Asturianu",
|
||||
"langFr": "Français",
|
||||
"langDe": "Deutsch",
|
||||
"langJa": "日本語",
|
||||
"about": "À propos",
|
||||
"aboutText": "Inventaire local-first et chiffré pour les semences traditionnelles. AGPL-3.0.",
|
||||
"aboutOpen": "À propos de Tane"
|
||||
|
|
|
|||
46
apps/app_seeds/lib/i18n/ja.i18n.json
Normal file
46
apps/app_seeds/lib/i18n/ja.i18n.json
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
{
|
||||
"app": {
|
||||
"title": "Tane"
|
||||
},
|
||||
"common": {
|
||||
"save": "保存",
|
||||
"cancel": "キャンセル",
|
||||
"delete": "削除",
|
||||
"edit": "編集",
|
||||
"type": "種類",
|
||||
"comingSoon": "近日公開",
|
||||
"offline": "オフラインです — 共有を一時停止しています"
|
||||
},
|
||||
"menu": {
|
||||
"tagline": "あなたの種子バンク",
|
||||
"inventory": "在庫",
|
||||
"market": "マーケット",
|
||||
"profile": "プロフィール",
|
||||
"chat": "チャット",
|
||||
"wishlist": "お気に入り",
|
||||
"following": "フォロー中",
|
||||
"calendar": "カレンダー",
|
||||
"settings": "設定"
|
||||
},
|
||||
"settings": {
|
||||
"language": "言語",
|
||||
"systemLanguage": "システムの言語",
|
||||
"langEs": "Español",
|
||||
"langEn": "English",
|
||||
"langPt": "Português",
|
||||
"langAst": "Asturianu",
|
||||
"langFr": "Français",
|
||||
"langDe": "Deutsch",
|
||||
"langJa": "日本語",
|
||||
"about": "このアプリについて",
|
||||
"aboutText": "在来種のためのローカルファースト・暗号化在庫管理。AGPL-3.0。",
|
||||
"aboutOpen": "Tane について"
|
||||
},
|
||||
"home": {
|
||||
"tagline": "地域の種を分かち合い、育てよう",
|
||||
"openMarket": "マーケット",
|
||||
"openMarketSubtitle": "近くの種を見つけて分かち合う",
|
||||
"yourInventory": "あなたの在庫",
|
||||
"yourInventorySubtitle": "種を管理する"
|
||||
}
|
||||
}
|
||||
|
|
@ -98,6 +98,7 @@
|
|||
"langAst": "Asturianu",
|
||||
"langFr": "Français",
|
||||
"langDe": "Deutsch",
|
||||
"langJa": "日本語",
|
||||
"about": "Acerca de",
|
||||
"aboutText": "Inventário local e cifrado para sementes tradicionais. AGPL-3.0.",
|
||||
"aboutOpen": "Acerca do Tane"
|
||||
|
|
|
|||
|
|
@ -3,10 +3,10 @@
|
|||
/// Source: lib/i18n
|
||||
/// To regenerate, run: `dart run slang`
|
||||
///
|
||||
/// Locales: 6
|
||||
/// Strings: 3356 (559 per locale)
|
||||
/// Locales: 7
|
||||
/// Strings: 3396 (485 per locale)
|
||||
///
|
||||
/// Built on 2026-07-13 at 16:11 UTC
|
||||
/// Built on 2026-07-14 at 09:00 UTC
|
||||
|
||||
// coverage:ignore-file
|
||||
// ignore_for_file: type=lint, unused_import
|
||||
|
|
@ -22,6 +22,7 @@ import 'strings_ast.g.dart' as l_ast;
|
|||
import 'strings_de.g.dart' as l_de;
|
||||
import 'strings_es.g.dart' as l_es;
|
||||
import 'strings_fr.g.dart' as l_fr;
|
||||
import 'strings_ja.g.dart' as l_ja;
|
||||
import 'strings_pt.g.dart' as l_pt;
|
||||
part 'strings_en.g.dart';
|
||||
|
||||
|
|
@ -37,6 +38,7 @@ enum AppLocale with BaseAppLocale<AppLocale, Translations> {
|
|||
de(languageCode: 'de'),
|
||||
es(languageCode: 'es'),
|
||||
fr(languageCode: 'fr'),
|
||||
ja(languageCode: 'ja'),
|
||||
pt(languageCode: 'pt');
|
||||
|
||||
const AppLocale({
|
||||
|
|
@ -99,6 +101,12 @@ enum AppLocale with BaseAppLocale<AppLocale, Translations> {
|
|||
cardinalResolver: cardinalResolver,
|
||||
ordinalResolver: ordinalResolver,
|
||||
);
|
||||
case AppLocale.ja:
|
||||
return l_ja.TranslationsJa(
|
||||
overrides: overrides,
|
||||
cardinalResolver: cardinalResolver,
|
||||
ordinalResolver: ordinalResolver,
|
||||
);
|
||||
case AppLocale.pt:
|
||||
return l_pt.TranslationsPt(
|
||||
overrides: overrides,
|
||||
|
|
|
|||
|
|
@ -265,6 +265,7 @@ class _Translations$settings$ast extends Translations$settings$en {
|
|||
@override String get langAst => 'Asturianu';
|
||||
@override String get langFr => 'Français';
|
||||
@override String get langDe => 'Deutsch';
|
||||
@override String get langJa => '日本語';
|
||||
@override String get about => 'Tocante a';
|
||||
@override String get aboutText => 'Inventariu llocal y cifráu pa simiente tradicional. AGPL-3.0.';
|
||||
@override String get aboutOpen => 'Tocante a Tane';
|
||||
|
|
@ -1488,6 +1489,7 @@ extension on TranslationsAst {
|
|||
'settings.langAst' => 'Asturianu',
|
||||
'settings.langFr' => 'Français',
|
||||
'settings.langDe' => 'Deutsch',
|
||||
'settings.langJa' => '日本語',
|
||||
'settings.about' => 'Tocante a',
|
||||
'settings.aboutText' => 'Inventariu llocal y cifráu pa simiente tradicional. AGPL-3.0.',
|
||||
'settings.aboutOpen' => 'Tocante a Tane',
|
||||
|
|
@ -1922,9 +1924,9 @@ extension on TranslationsAst {
|
|||
'sale.iSold' => 'Vendí',
|
||||
'sale.iBought' => 'Mercué',
|
||||
'sale.direction' => '¿Vendes o merques?',
|
||||
'sale.counterparty' => '¿Con quién?',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'sale.counterparty' => '¿Con quién?',
|
||||
'sale.counterpartyHint' => 'Una persona o un coleutivu (opcional)',
|
||||
'sale.amount' => 'Importe',
|
||||
'sale.currency' => 'Moneda',
|
||||
|
|
|
|||
|
|
@ -269,6 +269,7 @@ class _Translations$settings$de extends Translations$settings$en {
|
|||
@override String get aboutOpen => 'Über Tane';
|
||||
@override String get langDe => 'Deutsch';
|
||||
@override String get langFr => 'Français';
|
||||
@override String get langJa => '日本語';
|
||||
}
|
||||
|
||||
// Path: backup
|
||||
|
|
@ -1488,6 +1489,7 @@ extension on TranslationsDe {
|
|||
'settings.aboutOpen' => 'Über Tane',
|
||||
'settings.langDe' => 'Deutsch',
|
||||
'settings.langFr' => 'Français',
|
||||
'settings.langJa' => '日本語',
|
||||
'backup.title' => 'Sicherung und Wiederherstellung',
|
||||
'backup.autoBackupTitle' => 'Automatische Sicherungen',
|
||||
'backup.autoBackupLast' => ({required Object date}) => 'Letzte Sicherung ${date}',
|
||||
|
|
@ -1918,9 +1920,9 @@ extension on TranslationsDe {
|
|||
'sale.counterpartyHint' => 'Eine Person oder ein Kollektiv (optional)',
|
||||
'sale.amount' => 'Betrag',
|
||||
'sale.currency' => 'Währung',
|
||||
'sale.currencyHint' => '€, Ğ1, Stunden… (optional)',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'sale.currencyHint' => '€, Ğ1, Stunden… (optional)',
|
||||
'sale.hours' => 'Stunden',
|
||||
'sale.note' => 'Notiz (optional)',
|
||||
'sale.save' => 'Speichern',
|
||||
|
|
|
|||
|
|
@ -424,6 +424,9 @@ class Translations$settings$en {
|
|||
/// en: 'Deutsch'
|
||||
String get langDe => 'Deutsch';
|
||||
|
||||
/// en: '日本語'
|
||||
String get langJa => '日本語';
|
||||
|
||||
/// en: 'About'
|
||||
String get about => 'About';
|
||||
|
||||
|
|
@ -2598,6 +2601,7 @@ extension on Translations {
|
|||
'settings.langAst' => 'Asturianu',
|
||||
'settings.langFr' => 'Français',
|
||||
'settings.langDe' => 'Deutsch',
|
||||
'settings.langJa' => '日本語',
|
||||
'settings.about' => 'About',
|
||||
'settings.aboutText' => 'Local-first, encrypted inventory for traditional seeds. AGPL-3.0.',
|
||||
'settings.aboutOpen' => 'About Tane',
|
||||
|
|
@ -3031,9 +3035,9 @@ extension on Translations {
|
|||
'sale.help' => 'Record seed you sold or bought — money, Ğ1, or any currency. A separate model from a gift or a Plantare. No commission is ever taken on seeds.',
|
||||
'sale.add' => 'Record a sale',
|
||||
'sale.empty' => 'No sales yet. Note here what you sell or buy.',
|
||||
'sale.iSold' => 'I sold',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'sale.iSold' => 'I sold',
|
||||
'sale.iBought' => 'I bought',
|
||||
'sale.direction' => 'Sold or bought?',
|
||||
'sale.counterparty' => 'With whom?',
|
||||
|
|
|
|||
|
|
@ -265,6 +265,7 @@ class _Translations$settings$es extends Translations$settings$en {
|
|||
@override String get langPt => 'Português';
|
||||
@override String get langFr => 'Français';
|
||||
@override String get langDe => 'Deutsch';
|
||||
@override String get langJa => '日本語';
|
||||
@override String get about => 'Acerca de';
|
||||
@override String get aboutText => 'Inventario local y cifrado para semillas tradicionales. AGPL-3.0.';
|
||||
@override String get aboutOpen => 'Acerca de Tane';
|
||||
|
|
@ -1490,6 +1491,7 @@ extension on TranslationsEs {
|
|||
'settings.langPt' => 'Português',
|
||||
'settings.langFr' => 'Français',
|
||||
'settings.langDe' => 'Deutsch',
|
||||
'settings.langJa' => '日本語',
|
||||
'settings.about' => 'Acerca de',
|
||||
'settings.aboutText' => 'Inventario local y cifrado para semillas tradicionales. AGPL-3.0.',
|
||||
'settings.aboutOpen' => 'Acerca de Tane',
|
||||
|
|
@ -1924,9 +1926,9 @@ extension on TranslationsEs {
|
|||
'sale.add' => 'Registrar venta',
|
||||
'sale.empty' => 'Aún no hay ventas. Anota aquí lo que vendes o compras.',
|
||||
'sale.iSold' => 'Vendí',
|
||||
'sale.iBought' => 'Compré',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'sale.iBought' => 'Compré',
|
||||
'sale.direction' => '¿Vendes o compras?',
|
||||
'sale.counterparty' => '¿Con quién?',
|
||||
'sale.counterpartyHint' => 'Una persona o un colectivo (opcional)',
|
||||
|
|
|
|||
|
|
@ -266,6 +266,7 @@ class _Translations$settings$fr extends Translations$settings$en {
|
|||
@override String get langAst => 'Asturianu';
|
||||
@override String get langFr => 'Français';
|
||||
@override String get langDe => 'Deutsch';
|
||||
@override String get langJa => '日本語';
|
||||
@override String get about => 'À propos';
|
||||
@override String get aboutText => 'Inventaire local-first et chiffré pour les semences traditionnelles. AGPL-3.0.';
|
||||
@override String get aboutOpen => 'À propos de Tane';
|
||||
|
|
@ -1485,6 +1486,7 @@ extension on TranslationsFr {
|
|||
'settings.langAst' => 'Asturianu',
|
||||
'settings.langFr' => 'Français',
|
||||
'settings.langDe' => 'Deutsch',
|
||||
'settings.langJa' => '日本語',
|
||||
'settings.about' => 'À propos',
|
||||
'settings.aboutText' => 'Inventaire local-first et chiffré pour les semences traditionnelles. AGPL-3.0.',
|
||||
'settings.aboutOpen' => 'À propos de Tane',
|
||||
|
|
@ -1918,9 +1920,9 @@ extension on TranslationsFr {
|
|||
'sale.counterpartyHint' => 'Une personne ou un collectif (optionnel)',
|
||||
'sale.amount' => 'Montant',
|
||||
'sale.currency' => 'Monnaie',
|
||||
'sale.currencyHint' => '€, Ğ1, heures… (optionnel)',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'sale.currencyHint' => '€, Ğ1, heures… (optionnel)',
|
||||
'sale.hours' => 'heures',
|
||||
'sale.note' => 'Note (optionnel)',
|
||||
'sale.save' => 'Enregistrer',
|
||||
|
|
|
|||
173
apps/app_seeds/lib/i18n/strings_ja.g.dart
Normal file
173
apps/app_seeds/lib/i18n/strings_ja.g.dart
Normal file
|
|
@ -0,0 +1,173 @@
|
|||
///
|
||||
/// Generated file. Do not edit.
|
||||
///
|
||||
// coverage:ignore-file
|
||||
// ignore_for_file: type=lint, unused_import
|
||||
// dart format off
|
||||
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:slang/generated.dart';
|
||||
import 'strings.g.dart';
|
||||
|
||||
// Path: <root>
|
||||
class TranslationsJa extends Translations with BaseTranslations<AppLocale, Translations> {
|
||||
/// You can call this constructor and build your own translation instance of this locale.
|
||||
/// Constructing via the enum [AppLocale.build] is preferred.
|
||||
TranslationsJa({Map<String, Node>? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver, TranslationMetadata<AppLocale, Translations>? meta})
|
||||
: assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'),
|
||||
$meta = meta ?? TranslationMetadata(
|
||||
locale: AppLocale.ja,
|
||||
overrides: overrides ?? {},
|
||||
cardinalResolver: cardinalResolver,
|
||||
ordinalResolver: ordinalResolver,
|
||||
),
|
||||
super(cardinalResolver: cardinalResolver, ordinalResolver: ordinalResolver) {
|
||||
super.$meta.setFlatMapFunction($meta.getTranslation); // copy base translations to super.$meta
|
||||
$meta.setFlatMapFunction(_flatMapFunction);
|
||||
}
|
||||
|
||||
/// Metadata for the translations of <ja>.
|
||||
@override final TranslationMetadata<AppLocale, Translations> $meta;
|
||||
|
||||
/// Access flat map
|
||||
@override dynamic operator[](String key) => $meta.getTranslation(key) ?? super.$meta.getTranslation(key);
|
||||
|
||||
late final TranslationsJa _root = this; // ignore: unused_field
|
||||
|
||||
@override
|
||||
TranslationsJa $copyWith({TranslationMetadata<AppLocale, Translations>? meta}) => TranslationsJa(meta: meta ?? this.$meta);
|
||||
|
||||
// Translations
|
||||
@override late final _Translations$app$ja app = _Translations$app$ja._(_root);
|
||||
@override late final _Translations$common$ja common = _Translations$common$ja._(_root);
|
||||
@override late final _Translations$menu$ja menu = _Translations$menu$ja._(_root);
|
||||
@override late final _Translations$settings$ja settings = _Translations$settings$ja._(_root);
|
||||
@override late final _Translations$home$ja home = _Translations$home$ja._(_root);
|
||||
}
|
||||
|
||||
// Path: app
|
||||
class _Translations$app$ja extends Translations$app$en {
|
||||
_Translations$app$ja._(TranslationsJa root) : this._root = root, super.internal(root);
|
||||
|
||||
final TranslationsJa _root; // ignore: unused_field
|
||||
|
||||
// Translations
|
||||
@override String get title => 'Tane';
|
||||
}
|
||||
|
||||
// Path: common
|
||||
class _Translations$common$ja extends Translations$common$en {
|
||||
_Translations$common$ja._(TranslationsJa root) : this._root = root, super.internal(root);
|
||||
|
||||
final TranslationsJa _root; // ignore: unused_field
|
||||
|
||||
// Translations
|
||||
@override String get save => '保存';
|
||||
@override String get cancel => 'キャンセル';
|
||||
@override String get delete => '削除';
|
||||
@override String get edit => '編集';
|
||||
@override String get type => '種類';
|
||||
@override String get comingSoon => '近日公開';
|
||||
@override String get offline => 'オフラインです — 共有を一時停止しています';
|
||||
}
|
||||
|
||||
// Path: menu
|
||||
class _Translations$menu$ja extends Translations$menu$en {
|
||||
_Translations$menu$ja._(TranslationsJa root) : this._root = root, super.internal(root);
|
||||
|
||||
final TranslationsJa _root; // ignore: unused_field
|
||||
|
||||
// Translations
|
||||
@override String get tagline => 'あなたの種子バンク';
|
||||
@override String get inventory => '在庫';
|
||||
@override String get market => 'マーケット';
|
||||
@override String get profile => 'プロフィール';
|
||||
@override String get chat => 'チャット';
|
||||
@override String get wishlist => 'お気に入り';
|
||||
@override String get following => 'フォロー中';
|
||||
@override String get calendar => 'カレンダー';
|
||||
@override String get settings => '設定';
|
||||
}
|
||||
|
||||
// Path: settings
|
||||
class _Translations$settings$ja extends Translations$settings$en {
|
||||
_Translations$settings$ja._(TranslationsJa root) : this._root = root, super.internal(root);
|
||||
|
||||
final TranslationsJa _root; // ignore: unused_field
|
||||
|
||||
// Translations
|
||||
@override String get language => '言語';
|
||||
@override String get systemLanguage => 'システムの言語';
|
||||
@override String get langEs => 'Español';
|
||||
@override String get langEn => 'English';
|
||||
@override String get langPt => 'Português';
|
||||
@override String get langAst => 'Asturianu';
|
||||
@override String get langFr => 'Français';
|
||||
@override String get langDe => 'Deutsch';
|
||||
@override String get langJa => '日本語';
|
||||
@override String get about => 'このアプリについて';
|
||||
@override String get aboutText => '在来種のためのローカルファースト・暗号化在庫管理。AGPL-3.0。';
|
||||
@override String get aboutOpen => 'Tane について';
|
||||
}
|
||||
|
||||
// Path: home
|
||||
class _Translations$home$ja extends Translations$home$en {
|
||||
_Translations$home$ja._(TranslationsJa root) : this._root = root, super.internal(root);
|
||||
|
||||
final TranslationsJa _root; // ignore: unused_field
|
||||
|
||||
// Translations
|
||||
@override String get tagline => '地域の種を分かち合い、育てよう';
|
||||
@override String get openMarket => 'マーケット';
|
||||
@override String get openMarketSubtitle => '近くの種を見つけて分かち合う';
|
||||
@override String get yourInventory => 'あなたの在庫';
|
||||
@override String get yourInventorySubtitle => '種を管理する';
|
||||
}
|
||||
|
||||
/// The flat map containing all translations for locale <ja>.
|
||||
/// Only for edge cases! For simple maps, use the map function of this library.
|
||||
///
|
||||
/// The Dart AOT compiler has issues with very large switch statements,
|
||||
/// so the map is split into smaller functions (512 entries each).
|
||||
extension on TranslationsJa {
|
||||
dynamic _flatMapFunction(String path) {
|
||||
return switch (path) {
|
||||
'app.title' => 'Tane',
|
||||
'common.save' => '保存',
|
||||
'common.cancel' => 'キャンセル',
|
||||
'common.delete' => '削除',
|
||||
'common.edit' => '編集',
|
||||
'common.type' => '種類',
|
||||
'common.comingSoon' => '近日公開',
|
||||
'common.offline' => 'オフラインです — 共有を一時停止しています',
|
||||
'menu.tagline' => 'あなたの種子バンク',
|
||||
'menu.inventory' => '在庫',
|
||||
'menu.market' => 'マーケット',
|
||||
'menu.profile' => 'プロフィール',
|
||||
'menu.chat' => 'チャット',
|
||||
'menu.wishlist' => 'お気に入り',
|
||||
'menu.following' => 'フォロー中',
|
||||
'menu.calendar' => 'カレンダー',
|
||||
'menu.settings' => '設定',
|
||||
'settings.language' => '言語',
|
||||
'settings.systemLanguage' => 'システムの言語',
|
||||
'settings.langEs' => 'Español',
|
||||
'settings.langEn' => 'English',
|
||||
'settings.langPt' => 'Português',
|
||||
'settings.langAst' => 'Asturianu',
|
||||
'settings.langFr' => 'Français',
|
||||
'settings.langDe' => 'Deutsch',
|
||||
'settings.langJa' => '日本語',
|
||||
'settings.about' => 'このアプリについて',
|
||||
'settings.aboutText' => '在来種のためのローカルファースト・暗号化在庫管理。AGPL-3.0。',
|
||||
'settings.aboutOpen' => 'Tane について',
|
||||
'home.tagline' => '地域の種を分かち合い、育てよう',
|
||||
'home.openMarket' => 'マーケット',
|
||||
'home.openMarketSubtitle' => '近くの種を見つけて分かち合う',
|
||||
'home.yourInventory' => 'あなたの在庫',
|
||||
'home.yourInventorySubtitle' => '種を管理する',
|
||||
_ => null,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
@ -266,6 +266,7 @@ class _Translations$settings$pt extends Translations$settings$en {
|
|||
@override String get langAst => 'Asturianu';
|
||||
@override String get langFr => 'Français';
|
||||
@override String get langDe => 'Deutsch';
|
||||
@override String get langJa => '日本語';
|
||||
@override String get about => 'Acerca de';
|
||||
@override String get aboutText => 'Inventário local e cifrado para sementes tradicionais. AGPL-3.0.';
|
||||
@override String get aboutOpen => 'Acerca do Tane';
|
||||
|
|
@ -1488,6 +1489,7 @@ extension on TranslationsPt {
|
|||
'settings.langAst' => 'Asturianu',
|
||||
'settings.langFr' => 'Français',
|
||||
'settings.langDe' => 'Deutsch',
|
||||
'settings.langJa' => '日本語',
|
||||
'settings.about' => 'Acerca de',
|
||||
'settings.aboutText' => 'Inventário local e cifrado para sementes tradicionais. AGPL-3.0.',
|
||||
'settings.aboutOpen' => 'Acerca do Tane',
|
||||
|
|
@ -1921,9 +1923,9 @@ extension on TranslationsPt {
|
|||
'sale.iBought' => 'Comprei',
|
||||
'sale.direction' => 'Vendes ou compras?',
|
||||
'sale.counterparty' => 'Com quem?',
|
||||
'sale.counterpartyHint' => 'Uma pessoa ou um coletivo (opcional)',
|
||||
_ => null,
|
||||
} ?? switch (path) {
|
||||
'sale.counterpartyHint' => 'Uma pessoa ou um coletivo (opcional)',
|
||||
'sale.amount' => 'Montante',
|
||||
'sale.currency' => 'Moeda',
|
||||
'sale.currencyHint' => '€, Ğ1, horas… (opcional)',
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue