diff --git a/lib/i18n/misskeyIO/misskeyIO_en-US.i18n.yaml b/lib/i18n/misskeyIO/misskeyIO_en-US.i18n.yaml new file mode 100644 index 000000000..093a7d65b --- /dev/null +++ b/lib/i18n/misskeyIO/misskeyIO_en-US.i18n.yaml @@ -0,0 +1,17 @@ +# Source: https://github.com/MisskeyIO/misskey/blob/io/locales/en-US.yml + +skebStatus_: + genres_: + art: "Artwork" + comic: "Comic" + voice: "Voice" + novel: "Text" + video: "Movie" + music: "Music" + correction: "Advice" + seeking: "Seeking" + stopped: "Stopped" + client: "Client" + yenX: "JPY {x}" + nWorks: "Delivered {n} works" + nRequests: "Requested {n} times" diff --git a/lib/i18n/misskeyIO/misskeyIO_ja-JP.i18n.yaml b/lib/i18n/misskeyIO/misskeyIO_ja-JP.i18n.yaml new file mode 100644 index 000000000..8de3bc2c9 --- /dev/null +++ b/lib/i18n/misskeyIO/misskeyIO_ja-JP.i18n.yaml @@ -0,0 +1,17 @@ +# Source: https://github.com/MisskeyIO/misskey/blob/io/locales/ja-JP.yml + +skebStatus_: + genres_: + art: "イラスト" + comic: "コミック" + voice: "ボイス" + novel: "テキスト" + video: "ムービー" + music: "ミュージック" + correction: "アドバイス" + seeking: "募集中" + stopped: "停止中" + client: "クライアント" + yenX: "{x}円" + nWorks: "納品実績 {n}件" + nRequests: "取引実績 {n}件" diff --git a/lib/i18n/misskeyIO/misskeyIO_ja-KS.i18n.yaml b/lib/i18n/misskeyIO/misskeyIO_ja-KS.i18n.yaml new file mode 120000 index 000000000..b66555015 --- /dev/null +++ b/lib/i18n/misskeyIO/misskeyIO_ja-KS.i18n.yaml @@ -0,0 +1 @@ +misskeyIO_ja-JP.i18n.yaml \ No newline at end of file diff --git a/lib/i18n/misskeyIO/misskeyIO_ko-GS.i18n.yaml b/lib/i18n/misskeyIO/misskeyIO_ko-GS.i18n.yaml new file mode 120000 index 000000000..6cd76d391 --- /dev/null +++ b/lib/i18n/misskeyIO/misskeyIO_ko-GS.i18n.yaml @@ -0,0 +1 @@ +misskeyIO_ko-KR.i18n.yaml \ No newline at end of file diff --git a/lib/i18n/misskeyIO/misskeyIO_ko-KR.i18n.yaml b/lib/i18n/misskeyIO/misskeyIO_ko-KR.i18n.yaml new file mode 100644 index 000000000..4a560d163 --- /dev/null +++ b/lib/i18n/misskeyIO/misskeyIO_ko-KR.i18n.yaml @@ -0,0 +1,17 @@ +# Source: https://github.com/MisskeyIO/misskey/blob/io/locales/ko-KR.yml + +skebStatus_: + genres_: + art: "작품" + comic: "만화" + voice: "음성" + novel: "텍스트" + video: "동영상" + music: "음악" + correction: "조언" + seeking: "모집 중" + stopped: "정지 중" + client: "클라이언트" + yenX: "JPY {x}" + nWorks: "납품 실적 {n}건" + nRequests: "거래 실적 {n}건" diff --git a/lib/i18n/strings.g.dart b/lib/i18n/strings.g.dart index 5888063c3..aa9ced0de 100644 --- a/lib/i18n/strings.g.dart +++ b/lib/i18n/strings.g.dart @@ -4,7 +4,7 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 31 -/// Strings: 50594 (1632 per locale) +/// Strings: 50659 (1634 per locale) // coverage:ignore-file // ignore_for_file: type=lint diff --git a/lib/i18n/strings_en_US.g.dart b/lib/i18n/strings_en_US.g.dart index 3ceac1e5d..4b577fef3 100644 --- a/lib/i18n/strings_en_US.g.dart +++ b/lib/i18n/strings_en_US.g.dart @@ -38,6 +38,7 @@ class Translations implements BaseTranslations { // Translations late final _StringsAriaEnUs aria = _StringsAriaEnUs._(_root); late final _StringsMisskeyEnUs misskey = _StringsMisskeyEnUs._(_root); + late final _StringsMisskeyIOEnUs misskeyIO = _StringsMisskeyIOEnUs._(_root); } // Path: aria @@ -1481,6 +1482,16 @@ class _StringsMisskeyEnUs { late final _StringsMisskeyOfflineScreenEnUs offlineScreen_ = _StringsMisskeyOfflineScreenEnUs._(_root); } +// Path: misskeyIO +class _StringsMisskeyIOEnUs { + _StringsMisskeyIOEnUs._(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + late final _StringsMisskeyIOSkebStatusEnUs skebStatus_ = _StringsMisskeyIOSkebStatusEnUs._(_root); +} + // Path: misskey.bubbleGame_ class _StringsMisskeyBubbleGameEnUs { _StringsMisskeyBubbleGameEnUs._(this._root); @@ -2832,6 +2843,22 @@ class _StringsMisskeyOfflineScreenEnUs { String get header => 'Unable to connect to the server'; } +// Path: misskeyIO.skebStatus_ +class _StringsMisskeyIOSkebStatusEnUs { + _StringsMisskeyIOSkebStatusEnUs._(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + late final _StringsMisskeyIOSkebStatusGenresEnUs genres_ = _StringsMisskeyIOSkebStatusGenresEnUs._(_root); + String get seeking => 'Seeking'; + String get stopped => 'Stopped'; + String get client => 'Client'; + String yenX({required Object x}) => 'JPY ${x}'; + String nWorks({required Object n}) => 'Delivered ${n} works'; + String nRequests({required Object n}) => 'Requested ${n} times'; +} + // Path: misskey.bubbleGame_.score_ class _StringsMisskeyBubbleGameScoreEnUs { _StringsMisskeyBubbleGameScoreEnUs._(this._root); @@ -3400,6 +3427,22 @@ class _StringsMisskeyDataSaverCodeEnUs { String get description => 'If code highlighting notations are used in MFM, etc., they will not load until tapped. Syntax highlighting requires downloading the highlight definition files for each programming language. Therefore, disabling the automatic loading of these files is expected to reduce the amount of communication data.'; } +// Path: misskeyIO.skebStatus_.genres_ +class _StringsMisskeyIOSkebStatusGenresEnUs { + _StringsMisskeyIOSkebStatusGenresEnUs._(this._root); + + final Translations _root; // ignore: unused_field + + // Translations + String get art => 'Artwork'; + String get comic => 'Comic'; + String get voice => 'Voice'; + String get novel => 'Text'; + String get video => 'Movie'; + String get music => 'Music'; + String get correction => 'Advice'; +} + // Path: misskey.initialTutorial_.postNote_.visibility_ class _StringsMisskeyInitialTutorialPostNoteVisibilityEnUs { _StringsMisskeyInitialTutorialPostNoteVisibilityEnUs._(this._root); diff --git a/lib/i18n/strings_ja_JP.g.dart b/lib/i18n/strings_ja_JP.g.dart index 14acd673b..acf57ad98 100644 --- a/lib/i18n/strings_ja_JP.g.dart +++ b/lib/i18n/strings_ja_JP.g.dart @@ -34,6 +34,7 @@ class _StringsJaJp extends Translations { // Translations @override late final _StringsAriaJaJp aria = _StringsAriaJaJp._(_root); @override late final _StringsMisskeyJaJp misskey = _StringsMisskeyJaJp._(_root); + @override late final _StringsMisskeyIOJaJp misskeyIO = _StringsMisskeyIOJaJp._(_root); } // Path: aria @@ -1468,6 +1469,16 @@ class _StringsMisskeyJaJp extends _StringsMisskeyEnUs { @override late final _StringsMisskeyOfflineScreenJaJp offlineScreen_ = _StringsMisskeyOfflineScreenJaJp._(_root); } +// Path: misskeyIO +class _StringsMisskeyIOJaJp extends _StringsMisskeyIOEnUs { + _StringsMisskeyIOJaJp._(_StringsJaJp root) : this._root = root, super._(root); + + @override final _StringsJaJp _root; // ignore: unused_field + + // Translations + @override late final _StringsMisskeyIOSkebStatusJaJp skebStatus_ = _StringsMisskeyIOSkebStatusJaJp._(_root); +} + // Path: misskey.bubbleGame_ class _StringsMisskeyBubbleGameJaJp extends _StringsMisskeyBubbleGameEnUs { _StringsMisskeyBubbleGameJaJp._(_StringsJaJp root) : this._root = root, super._(root); @@ -2819,6 +2830,22 @@ class _StringsMisskeyOfflineScreenJaJp extends _StringsMisskeyOfflineScreenEnUs @override String get header => 'サーバーに接続できません'; } +// Path: misskeyIO.skebStatus_ +class _StringsMisskeyIOSkebStatusJaJp extends _StringsMisskeyIOSkebStatusEnUs { + _StringsMisskeyIOSkebStatusJaJp._(_StringsJaJp root) : this._root = root, super._(root); + + @override final _StringsJaJp _root; // ignore: unused_field + + // Translations + @override late final _StringsMisskeyIOSkebStatusGenresJaJp genres_ = _StringsMisskeyIOSkebStatusGenresJaJp._(_root); + @override String get seeking => '募集中'; + @override String get stopped => '停止中'; + @override String get client => 'クライアント'; + @override String yenX({required Object x}) => '${x}円'; + @override String nWorks({required Object n}) => '納品実績 ${n}件'; + @override String nRequests({required Object n}) => '取引実績 ${n}件'; +} + // Path: misskey.bubbleGame_.score_ class _StringsMisskeyBubbleGameScoreJaJp extends _StringsMisskeyBubbleGameScoreEnUs { _StringsMisskeyBubbleGameScoreJaJp._(_StringsJaJp root) : this._root = root, super._(root); @@ -3387,6 +3414,22 @@ class _StringsMisskeyDataSaverCodeJaJp extends _StringsMisskeyDataSaverCodeEnUs @override String get description => 'MFMなどでコードハイライト記法が使われている場合、タップするまで読み込まれなくなります。コードハイライトではハイライトする言語ごとにその定義ファイルを読み込む必要がありますが、それらが自動で読み込まれなくなるため、通信量の削減が見込めます。'; } +// Path: misskeyIO.skebStatus_.genres_ +class _StringsMisskeyIOSkebStatusGenresJaJp extends _StringsMisskeyIOSkebStatusGenresEnUs { + _StringsMisskeyIOSkebStatusGenresJaJp._(_StringsJaJp root) : this._root = root, super._(root); + + @override final _StringsJaJp _root; // ignore: unused_field + + // Translations + @override String get art => 'イラスト'; + @override String get comic => 'コミック'; + @override String get voice => 'ボイス'; + @override String get novel => 'テキスト'; + @override String get video => 'ムービー'; + @override String get music => 'ミュージック'; + @override String get correction => 'アドバイス'; +} + // Path: misskey.initialTutorial_.postNote_.visibility_ class _StringsMisskeyInitialTutorialPostNoteVisibilityJaJp extends _StringsMisskeyInitialTutorialPostNoteVisibilityEnUs { _StringsMisskeyInitialTutorialPostNoteVisibilityJaJp._(_StringsJaJp root) : this._root = root, super._(root); diff --git a/lib/i18n/strings_ja_KS.g.dart b/lib/i18n/strings_ja_KS.g.dart index 3b4467a1c..14d536f86 100644 --- a/lib/i18n/strings_ja_KS.g.dart +++ b/lib/i18n/strings_ja_KS.g.dart @@ -34,6 +34,7 @@ class _StringsJaKs extends Translations { // Translations @override late final _StringsAriaJaKs aria = _StringsAriaJaKs._(_root); @override late final _StringsMisskeyJaKs misskey = _StringsMisskeyJaKs._(_root); + @override late final _StringsMisskeyIOJaKs misskeyIO = _StringsMisskeyIOJaKs._(_root); } // Path: aria @@ -1468,6 +1469,16 @@ class _StringsMisskeyJaKs extends _StringsMisskeyEnUs { @override late final _StringsMisskeyOfflineScreenJaKs offlineScreen_ = _StringsMisskeyOfflineScreenJaKs._(_root); } +// Path: misskeyIO +class _StringsMisskeyIOJaKs extends _StringsMisskeyIOEnUs { + _StringsMisskeyIOJaKs._(_StringsJaKs root) : this._root = root, super._(root); + + @override final _StringsJaKs _root; // ignore: unused_field + + // Translations + @override late final _StringsMisskeyIOSkebStatusJaKs skebStatus_ = _StringsMisskeyIOSkebStatusJaKs._(_root); +} + // Path: misskey.bubbleGame_ class _StringsMisskeyBubbleGameJaKs extends _StringsMisskeyBubbleGameEnUs { _StringsMisskeyBubbleGameJaKs._(_StringsJaKs root) : this._root = root, super._(root); @@ -2819,6 +2830,22 @@ class _StringsMisskeyOfflineScreenJaKs extends _StringsMisskeyOfflineScreenEnUs @override String get header => 'サーバーに接続できへんわ'; } +// Path: misskeyIO.skebStatus_ +class _StringsMisskeyIOSkebStatusJaKs extends _StringsMisskeyIOSkebStatusEnUs { + _StringsMisskeyIOSkebStatusJaKs._(_StringsJaKs root) : this._root = root, super._(root); + + @override final _StringsJaKs _root; // ignore: unused_field + + // Translations + @override late final _StringsMisskeyIOSkebStatusGenresJaKs genres_ = _StringsMisskeyIOSkebStatusGenresJaKs._(_root); + @override String get seeking => '募集中'; + @override String get stopped => '停止中'; + @override String get client => 'クライアント'; + @override String yenX({required Object x}) => '${x}円'; + @override String nWorks({required Object n}) => '納品実績 ${n}件'; + @override String nRequests({required Object n}) => '取引実績 ${n}件'; +} + // Path: misskey.bubbleGame_.score_ class _StringsMisskeyBubbleGameScoreJaKs extends _StringsMisskeyBubbleGameScoreEnUs { _StringsMisskeyBubbleGameScoreJaKs._(_StringsJaKs root) : this._root = root, super._(root); @@ -3387,6 +3414,22 @@ class _StringsMisskeyDataSaverCodeJaKs extends _StringsMisskeyDataSaverCodeEnUs @override String get description => 'MFMとかでコードハイライト記法が使われてるとき、タップするまで読み込まれへんくなるで。コードハイライトではハイライトする言語ごとにその決めてるファイルを読む必要はあんねんな。けどな、それは自動で読み込まれなくなるから、通信量を少なくできることができるねん。'; } +// Path: misskeyIO.skebStatus_.genres_ +class _StringsMisskeyIOSkebStatusGenresJaKs extends _StringsMisskeyIOSkebStatusGenresEnUs { + _StringsMisskeyIOSkebStatusGenresJaKs._(_StringsJaKs root) : this._root = root, super._(root); + + @override final _StringsJaKs _root; // ignore: unused_field + + // Translations + @override String get art => 'イラスト'; + @override String get comic => 'コミック'; + @override String get voice => 'ボイス'; + @override String get novel => 'テキスト'; + @override String get video => 'ムービー'; + @override String get music => 'ミュージック'; + @override String get correction => 'アドバイス'; +} + // Path: misskey.initialTutorial_.postNote_.visibility_ class _StringsMisskeyInitialTutorialPostNoteVisibilityJaKs extends _StringsMisskeyInitialTutorialPostNoteVisibilityEnUs { _StringsMisskeyInitialTutorialPostNoteVisibilityJaKs._(_StringsJaKs root) : this._root = root, super._(root); diff --git a/lib/i18n/strings_ko_GS.g.dart b/lib/i18n/strings_ko_GS.g.dart index 1fbc58801..539a475d3 100644 --- a/lib/i18n/strings_ko_GS.g.dart +++ b/lib/i18n/strings_ko_GS.g.dart @@ -34,6 +34,7 @@ class _StringsKoGs extends Translations { // Translations @override late final _StringsAriaKoGs aria = _StringsAriaKoGs._(_root); @override late final _StringsMisskeyKoGs misskey = _StringsMisskeyKoGs._(_root); + @override late final _StringsMisskeyIOKoGs misskeyIO = _StringsMisskeyIOKoGs._(_root); } // Path: aria @@ -1369,6 +1370,16 @@ class _StringsMisskeyKoGs extends _StringsMisskeyEnUs { @override late final _StringsMisskeyOfflineScreenKoGs offlineScreen_ = _StringsMisskeyOfflineScreenKoGs._(_root); } +// Path: misskeyIO +class _StringsMisskeyIOKoGs extends _StringsMisskeyIOEnUs { + _StringsMisskeyIOKoGs._(_StringsKoGs root) : this._root = root, super._(root); + + @override final _StringsKoGs _root; // ignore: unused_field + + // Translations + @override late final _StringsMisskeyIOSkebStatusKoGs skebStatus_ = _StringsMisskeyIOSkebStatusKoGs._(_root); +} + // Path: misskey.bubbleGame_ class _StringsMisskeyBubbleGameKoGs extends _StringsMisskeyBubbleGameEnUs { _StringsMisskeyBubbleGameKoGs._(_StringsKoGs root) : this._root = root, super._(root); @@ -2715,6 +2726,22 @@ class _StringsMisskeyOfflineScreenKoGs extends _StringsMisskeyOfflineScreenEnUs @override String get header => '서버에 접속할 수 없습니다'; } +// Path: misskeyIO.skebStatus_ +class _StringsMisskeyIOSkebStatusKoGs extends _StringsMisskeyIOSkebStatusEnUs { + _StringsMisskeyIOSkebStatusKoGs._(_StringsKoGs root) : this._root = root, super._(root); + + @override final _StringsKoGs _root; // ignore: unused_field + + // Translations + @override late final _StringsMisskeyIOSkebStatusGenresKoGs genres_ = _StringsMisskeyIOSkebStatusGenresKoGs._(_root); + @override String get seeking => '모집 중'; + @override String get stopped => '정지 중'; + @override String get client => '클라이언트'; + @override String yenX({required Object x}) => 'JPY ${x}'; + @override String nWorks({required Object n}) => '납품 실적 ${n}건'; + @override String nRequests({required Object n}) => '거래 실적 ${n}건'; +} + // Path: misskey.bubbleGame_.howToPlay_ class _StringsMisskeyBubbleGameHowToPlayKoGs extends _StringsMisskeyBubbleGameHowToPlayEnUs { _StringsMisskeyBubbleGameHowToPlayKoGs._(_StringsKoGs root) : this._root = root, super._(root); @@ -3265,6 +3292,22 @@ class _StringsMisskeyDataSaverCodeKoGs extends _StringsMisskeyDataSaverCodeEnUs @override String get description => 'MFM 등으로 문자열 강조 기법을 사용할 때 누르기 전에는 불러오지 않습니다. 문자열 강조에서는 강조할 언어마다 그 정의 파일을 불러와야 하지만 이를 자동으로 불러오지 않으므로 데이터 사용량을 줄일 수 있습니다.'; } +// Path: misskeyIO.skebStatus_.genres_ +class _StringsMisskeyIOSkebStatusGenresKoGs extends _StringsMisskeyIOSkebStatusGenresEnUs { + _StringsMisskeyIOSkebStatusGenresKoGs._(_StringsKoGs root) : this._root = root, super._(root); + + @override final _StringsKoGs _root; // ignore: unused_field + + // Translations + @override String get art => '작품'; + @override String get comic => '만화'; + @override String get voice => '음성'; + @override String get novel => '텍스트'; + @override String get video => '동영상'; + @override String get music => '음악'; + @override String get correction => '조언'; +} + // Path: misskey.initialTutorial_.postNote_.visibility_ class _StringsMisskeyInitialTutorialPostNoteVisibilityKoGs extends _StringsMisskeyInitialTutorialPostNoteVisibilityEnUs { _StringsMisskeyInitialTutorialPostNoteVisibilityKoGs._(_StringsKoGs root) : this._root = root, super._(root); diff --git a/lib/i18n/strings_ko_KR.g.dart b/lib/i18n/strings_ko_KR.g.dart index 5b3d9772d..df43edeb4 100644 --- a/lib/i18n/strings_ko_KR.g.dart +++ b/lib/i18n/strings_ko_KR.g.dart @@ -34,6 +34,7 @@ class _StringsKoKr extends Translations { // Translations @override late final _StringsAriaKoKr aria = _StringsAriaKoKr._(_root); @override late final _StringsMisskeyKoKr misskey = _StringsMisskeyKoKr._(_root); + @override late final _StringsMisskeyIOKoKr misskeyIO = _StringsMisskeyIOKoKr._(_root); } // Path: aria @@ -1369,6 +1370,16 @@ class _StringsMisskeyKoKr extends _StringsMisskeyEnUs { @override late final _StringsMisskeyOfflineScreenKoKr offlineScreen_ = _StringsMisskeyOfflineScreenKoKr._(_root); } +// Path: misskeyIO +class _StringsMisskeyIOKoKr extends _StringsMisskeyIOEnUs { + _StringsMisskeyIOKoKr._(_StringsKoKr root) : this._root = root, super._(root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override late final _StringsMisskeyIOSkebStatusKoKr skebStatus_ = _StringsMisskeyIOSkebStatusKoKr._(_root); +} + // Path: misskey.bubbleGame_ class _StringsMisskeyBubbleGameKoKr extends _StringsMisskeyBubbleGameEnUs { _StringsMisskeyBubbleGameKoKr._(_StringsKoKr root) : this._root = root, super._(root); @@ -2715,6 +2726,22 @@ class _StringsMisskeyOfflineScreenKoKr extends _StringsMisskeyOfflineScreenEnUs @override String get header => '서버에 접속할 수 없습니다'; } +// Path: misskeyIO.skebStatus_ +class _StringsMisskeyIOSkebStatusKoKr extends _StringsMisskeyIOSkebStatusEnUs { + _StringsMisskeyIOSkebStatusKoKr._(_StringsKoKr root) : this._root = root, super._(root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override late final _StringsMisskeyIOSkebStatusGenresKoKr genres_ = _StringsMisskeyIOSkebStatusGenresKoKr._(_root); + @override String get seeking => '모집 중'; + @override String get stopped => '정지 중'; + @override String get client => '클라이언트'; + @override String yenX({required Object x}) => 'JPY ${x}'; + @override String nWorks({required Object n}) => '납품 실적 ${n}건'; + @override String nRequests({required Object n}) => '거래 실적 ${n}건'; +} + // Path: misskey.bubbleGame_.howToPlay_ class _StringsMisskeyBubbleGameHowToPlayKoKr extends _StringsMisskeyBubbleGameHowToPlayEnUs { _StringsMisskeyBubbleGameHowToPlayKoKr._(_StringsKoKr root) : this._root = root, super._(root); @@ -3265,6 +3292,22 @@ class _StringsMisskeyDataSaverCodeKoKr extends _StringsMisskeyDataSaverCodeEnUs @override String get description => 'MFM 등으로 문자열 강조 기법을 사용할 때 누르기 전에는 불러오지 않습니다. 문자열 강조에서는 강조할 언어마다 그 정의 파일을 불러와야 하지만 이를 자동으로 불러오지 않으므로 데이터 사용량을 줄일 수 있습니다.'; } +// Path: misskeyIO.skebStatus_.genres_ +class _StringsMisskeyIOSkebStatusGenresKoKr extends _StringsMisskeyIOSkebStatusGenresEnUs { + _StringsMisskeyIOSkebStatusGenresKoKr._(_StringsKoKr root) : this._root = root, super._(root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get art => '작품'; + @override String get comic => '만화'; + @override String get voice => '음성'; + @override String get novel => '텍스트'; + @override String get video => '동영상'; + @override String get music => '음악'; + @override String get correction => '조언'; +} + // Path: misskey.initialTutorial_.postNote_.visibility_ class _StringsMisskeyInitialTutorialPostNoteVisibilityKoKr extends _StringsMisskeyInitialTutorialPostNoteVisibilityEnUs { _StringsMisskeyInitialTutorialPostNoteVisibilityKoKr._(_StringsKoKr root) : this._root = root, super._(root); diff --git a/lib/i18n/strings_map.g.dart b/lib/i18n/strings_map.g.dart index 278502901..c543ad520 100644 --- a/lib/i18n/strings_map.g.dart +++ b/lib/i18n/strings_map.g.dart @@ -2479,6 +2479,19 @@ extension on Translations { case 'misskey.reversi_.useAvatarAsStone': return 'Turn stones into user avatars'; case 'misskey.offlineScreen_.title': return 'Offline - cannot connect to the server'; case 'misskey.offlineScreen_.header': return 'Unable to connect to the server'; + case 'misskeyIO.skebStatus_.genres_.art': return 'Artwork'; + case 'misskeyIO.skebStatus_.genres_.comic': return 'Comic'; + case 'misskeyIO.skebStatus_.genres_.voice': return 'Voice'; + case 'misskeyIO.skebStatus_.genres_.novel': return 'Text'; + case 'misskeyIO.skebStatus_.genres_.video': return 'Movie'; + case 'misskeyIO.skebStatus_.genres_.music': return 'Music'; + case 'misskeyIO.skebStatus_.genres_.correction': return 'Advice'; + case 'misskeyIO.skebStatus_.seeking': return 'Seeking'; + case 'misskeyIO.skebStatus_.stopped': return 'Stopped'; + case 'misskeyIO.skebStatus_.client': return 'Client'; + case 'misskeyIO.skebStatus_.yenX': return ({required Object x}) => 'JPY ${x}'; + case 'misskeyIO.skebStatus_.nWorks': return ({required Object n}) => 'Delivered ${n} works'; + case 'misskeyIO.skebStatus_.nRequests': return ({required Object n}) => 'Requested ${n} times'; default: return null; } } @@ -23343,6 +23356,19 @@ extension on _StringsJaJp { case 'misskey.reversi_.useAvatarAsStone': return '石をアイコンにする'; case 'misskey.offlineScreen_.title': return 'オフライン - サーバーに接続できません'; case 'misskey.offlineScreen_.header': return 'サーバーに接続できません'; + case 'misskeyIO.skebStatus_.genres_.art': return 'イラスト'; + case 'misskeyIO.skebStatus_.genres_.comic': return 'コミック'; + case 'misskeyIO.skebStatus_.genres_.voice': return 'ボイス'; + case 'misskeyIO.skebStatus_.genres_.novel': return 'テキスト'; + case 'misskeyIO.skebStatus_.genres_.video': return 'ムービー'; + case 'misskeyIO.skebStatus_.genres_.music': return 'ミュージック'; + case 'misskeyIO.skebStatus_.genres_.correction': return 'アドバイス'; + case 'misskeyIO.skebStatus_.seeking': return '募集中'; + case 'misskeyIO.skebStatus_.stopped': return '停止中'; + case 'misskeyIO.skebStatus_.client': return 'クライアント'; + case 'misskeyIO.skebStatus_.yenX': return ({required Object x}) => '${x}円'; + case 'misskeyIO.skebStatus_.nWorks': return ({required Object n}) => '納品実績 ${n}件'; + case 'misskeyIO.skebStatus_.nRequests': return ({required Object n}) => '取引実績 ${n}件'; default: return null; } } @@ -25809,6 +25835,19 @@ extension on _StringsJaKs { case 'misskey.reversi_.useAvatarAsStone': return '石をアイコンにする'; case 'misskey.offlineScreen_.title': return 'オフライン - サーバーに接続できひんで'; case 'misskey.offlineScreen_.header': return 'サーバーに接続できへんわ'; + case 'misskeyIO.skebStatus_.genres_.art': return 'イラスト'; + case 'misskeyIO.skebStatus_.genres_.comic': return 'コミック'; + case 'misskeyIO.skebStatus_.genres_.voice': return 'ボイス'; + case 'misskeyIO.skebStatus_.genres_.novel': return 'テキスト'; + case 'misskeyIO.skebStatus_.genres_.video': return 'ムービー'; + case 'misskeyIO.skebStatus_.genres_.music': return 'ミュージック'; + case 'misskeyIO.skebStatus_.genres_.correction': return 'アドバイス'; + case 'misskeyIO.skebStatus_.seeking': return '募集中'; + case 'misskeyIO.skebStatus_.stopped': return '停止中'; + case 'misskeyIO.skebStatus_.client': return 'クライアント'; + case 'misskeyIO.skebStatus_.yenX': return ({required Object x}) => '${x}円'; + case 'misskeyIO.skebStatus_.nWorks': return ({required Object n}) => '納品実績 ${n}件'; + case 'misskeyIO.skebStatus_.nRequests': return ({required Object n}) => '取引実績 ${n}件'; default: return null; } } @@ -28163,6 +28202,19 @@ extension on _StringsKoGs { case 'misskey.reversi_.disallowIrregularRules': return '규칙변경 없음'; case 'misskey.offlineScreen_.title': return '오프라인 - 서버에 접속할 수 없습니다'; case 'misskey.offlineScreen_.header': return '서버에 접속할 수 없습니다'; + case 'misskeyIO.skebStatus_.genres_.art': return '작품'; + case 'misskeyIO.skebStatus_.genres_.comic': return '만화'; + case 'misskeyIO.skebStatus_.genres_.voice': return '음성'; + case 'misskeyIO.skebStatus_.genres_.novel': return '텍스트'; + case 'misskeyIO.skebStatus_.genres_.video': return '동영상'; + case 'misskeyIO.skebStatus_.genres_.music': return '음악'; + case 'misskeyIO.skebStatus_.genres_.correction': return '조언'; + case 'misskeyIO.skebStatus_.seeking': return '모집 중'; + case 'misskeyIO.skebStatus_.stopped': return '정지 중'; + case 'misskeyIO.skebStatus_.client': return '클라이언트'; + case 'misskeyIO.skebStatus_.yenX': return ({required Object x}) => 'JPY ${x}'; + case 'misskeyIO.skebStatus_.nWorks': return ({required Object n}) => '납품 실적 ${n}건'; + case 'misskeyIO.skebStatus_.nRequests': return ({required Object n}) => '거래 실적 ${n}건'; default: return null; } } @@ -30517,6 +30569,19 @@ extension on _StringsKoKr { case 'misskey.reversi_.disallowIrregularRules': return '규칙변경 없음'; case 'misskey.offlineScreen_.title': return '오프라인 - 서버에 접속할 수 없습니다'; case 'misskey.offlineScreen_.header': return '서버에 접속할 수 없습니다'; + case 'misskeyIO.skebStatus_.genres_.art': return '작품'; + case 'misskeyIO.skebStatus_.genres_.comic': return '만화'; + case 'misskeyIO.skebStatus_.genres_.voice': return '음성'; + case 'misskeyIO.skebStatus_.genres_.novel': return '텍스트'; + case 'misskeyIO.skebStatus_.genres_.video': return '동영상'; + case 'misskeyIO.skebStatus_.genres_.music': return '음악'; + case 'misskeyIO.skebStatus_.genres_.correction': return '조언'; + case 'misskeyIO.skebStatus_.seeking': return '모집 중'; + case 'misskeyIO.skebStatus_.stopped': return '정지 중'; + case 'misskeyIO.skebStatus_.client': return '클라이언트'; + case 'misskeyIO.skebStatus_.yenX': return ({required Object x}) => 'JPY ${x}'; + case 'misskeyIO.skebStatus_.nWorks': return ({required Object n}) => '납품 실적 ${n}건'; + case 'misskeyIO.skebStatus_.nRequests': return ({required Object n}) => '거래 실적 ${n}건'; default: return null; } } diff --git a/lib/provider/api/skeb_status_provider.dart b/lib/provider/api/skeb_status_provider.dart new file mode 100644 index 000000000..7ff4c705c --- /dev/null +++ b/lib/provider/api/skeb_status_provider.dart @@ -0,0 +1,19 @@ +import 'package:misskey_dart/misskey_dart.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +import '../../model/account.dart'; +import 'misskey_provider.dart'; + +part 'skeb_status_provider.g.dart'; + +@riverpod +FutureOr skebStatus( + SkebStatusRef ref, + Account account, + String userId, +) { + return ref + .watch(misskeyProvider(account)) + .users + .getSkebStatus(UsersGetSkebStatusRequest(userId: userId)); +} diff --git a/lib/provider/api/skeb_status_provider.g.dart b/lib/provider/api/skeb_status_provider.g.dart new file mode 100644 index 000000000..490d847cf --- /dev/null +++ b/lib/provider/api/skeb_status_provider.g.dart @@ -0,0 +1,179 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'skeb_status_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$skebStatusHash() => r'4c2d861e767bf903cbc71981a9d5a7650d450fb0'; + +/// Copied from Dart SDK +class _SystemHash { + _SystemHash._(); + + static int combine(int hash, int value) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + value); + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); + return hash ^ (hash >> 6); + } + + static int finish(int hash) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); + // ignore: parameter_assignments + hash = hash ^ (hash >> 11); + return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); + } +} + +/// See also [skebStatus]. +@ProviderFor(skebStatus) +const skebStatusProvider = SkebStatusFamily(); + +/// See also [skebStatus]. +class SkebStatusFamily extends Family> { + /// See also [skebStatus]. + const SkebStatusFamily(); + + /// See also [skebStatus]. + SkebStatusProvider call( + Account account, + String userId, + ) { + return SkebStatusProvider( + account, + userId, + ); + } + + @override + SkebStatusProvider getProviderOverride( + covariant SkebStatusProvider provider, + ) { + return call( + provider.account, + provider.userId, + ); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'skebStatusProvider'; +} + +/// See also [skebStatus]. +class SkebStatusProvider + extends AutoDisposeFutureProvider { + /// See also [skebStatus]. + SkebStatusProvider( + Account account, + String userId, + ) : this._internal( + (ref) => skebStatus( + ref as SkebStatusRef, + account, + userId, + ), + from: skebStatusProvider, + name: r'skebStatusProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$skebStatusHash, + dependencies: SkebStatusFamily._dependencies, + allTransitiveDependencies: + SkebStatusFamily._allTransitiveDependencies, + account: account, + userId: userId, + ); + + SkebStatusProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.account, + required this.userId, + }) : super.internal(); + + final Account account; + final String userId; + + @override + Override overrideWith( + FutureOr Function(SkebStatusRef provider) + create, + ) { + return ProviderOverride( + origin: this, + override: SkebStatusProvider._internal( + (ref) => create(ref as SkebStatusRef), + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + account: account, + userId: userId, + ), + ); + } + + @override + AutoDisposeFutureProviderElement createElement() { + return _SkebStatusProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is SkebStatusProvider && + other.account == account && + other.userId == userId; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, account.hashCode); + hash = _SystemHash.combine(hash, userId.hashCode); + + return _SystemHash.finish(hash); + } +} + +mixin SkebStatusRef + on AutoDisposeFutureProviderRef { + /// The parameter `account` of this provider. + Account get account; + + /// The parameter `userId` of this provider. + String get userId; +} + +class _SkebStatusProviderElement + extends AutoDisposeFutureProviderElement + with SkebStatusRef { + _SkebStatusProviderElement(super.provider); + + @override + Account get account => (origin as SkebStatusProvider).account; + @override + String get userId => (origin as SkebStatusProvider).userId; +} +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/view/page/user/user_home.dart b/lib/view/page/user/user_home.dart index 913b604eb..ebbc3e4e7 100644 --- a/lib/view/page/user/user_home.dart +++ b/lib/view/page/user/user_home.dart @@ -10,6 +10,8 @@ import '../../../constant/colors.dart'; import '../../../extension/user_detailed_extension.dart'; import '../../../i18n/strings.g.dart'; import '../../../model/account.dart'; +import '../../../provider/api/meta_provider.dart'; +import '../../../provider/api/skeb_status_provider.dart'; import '../../../provider/api/user_notifier_provider.dart'; import '../../../provider/general_settings_notifier_provider.dart'; import '../../../provider/misskey_colors_provider.dart'; @@ -100,6 +102,10 @@ class _UserHome extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final meta = ref.watch(metaProvider(account)).valueOrNull; + final skebStatus = meta?.enableSkebStatus ?? false + ? ref.watch(skebStatusProvider(account, user.id)).valueOrNull + : null; final squareAvatars = ref.watch( generalSettingsNotifierProvider .select((settings) => settings.squareAvatars), @@ -436,7 +442,7 @@ class _UserHome extends ConsumerWidget { ), ), ), - if (user.fields?.isNotEmpty ?? false) ...[ + if (user.fields?.isNotEmpty ?? skebStatus != null) ...[ const Divider(), Table( columnWidths: const { @@ -444,71 +450,200 @@ class _UserHome extends ConsumerWidget { 1: FlexColumnWidth(7.0), }, defaultVerticalAlignment: TableCellVerticalAlignment.middle, - children: user.fields! - .map( - (field) => TableRow( - children: [ - Padding( - padding: const EdgeInsets.all(4.0), - child: Center( + children: [ + ...?user.fields?.map( + (field) => TableRow( + children: [ + Padding( + padding: const EdgeInsets.all(4.0), + child: Center( + child: DefaultTextStyle.merge( + style: const TextStyle( + fontWeight: FontWeight.bold, + ), + child: Mfm( + account: account, + text: field.name, + simple: true, + emojis: user.emojis, + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.all(4.0), + child: user.verifiedLinks.contains(field.value) + ? Text.rich( + TextSpan( + children: [ + WidgetSpan( + child: UrlWidget( + url: field.value, + onTap: () => navigate( + ref, + account, + field.value, + ), + style: TextStyle(color: colors.link), + ), + ), + ], + ), + ) + : Mfm( + account: account, + text: field.value, + emojis: user.emojis, + author: user, + ), + ), + ], + ), + ), + if (skebStatus != null) + TableRow( + children: [ + Padding( + padding: const EdgeInsets.all(4.0), + child: Align( + child: InkWell( + onTap: () => launchUrl( + Uri.https('skeb.jp'), + mode: LaunchMode.externalApplication, + ), child: DefaultTextStyle.merge( style: const TextStyle( fontWeight: FontWeight.bold, ), child: Mfm( account: account, - text: field.name, + text: ':skeb: Skeb', simple: true, - emojis: user.emojis, ), ), ), ), - Padding( - padding: const EdgeInsets.all(4.0), - child: user.verifiedLinks.contains(field.value) - ? Text.rich( - TextSpan( - children: [ - WidgetSpan( - child: UrlWidget( - url: field.value, - onTap: () => navigate( - ref, - account, - field.value, - ), - style: - TextStyle(color: colors.link), - ), + ), + Padding( + padding: const EdgeInsets.all(4.0), + child: Align( + alignment: Alignment.centerLeft, + child: InkWell( + onTap: () => launchUrl( + Uri.https( + 'skeb.jp', + '@${skebStatus.screenName}', + ), + mode: LaunchMode.externalApplication, + ), + child: Text.rich( + TextSpan( + children: [ + WidgetSpan( + alignment: PlaceholderAlignment.baseline, + baseline: TextBaseline.alphabetic, + child: Container( + decoration: BoxDecoration( + color: skebStatus.isAcceptable + ? const Color(0xFFF14668) + : const Color(0xFF363636), + borderRadius: + BorderRadius.circular(6.0), + ), + padding: const EdgeInsets.symmetric( + vertical: 2.0, + horizontal: 6.0, ), - const WidgetSpan( - child: SizedBox(width: 2.0), + child: Text( + skebStatus.isAcceptable + ? t.misskeyIO.skebStatus_.seeking + : skebStatus.isCreator + ? t.misskeyIO.skebStatus_ + .stopped + : t.misskeyIO.skebStatus_ + .client, + style: style.apply( + color: Colors.white, + fontSizeFactor: 0.85, + ), ), - WidgetSpan( - child: Tooltip( - message: t.misskey.verifiedLink, - child: Icon( - Icons.check_circle_outline, - color: colors.success, - size: style.fontSize, + ), + ), + const WidgetSpan( + child: SizedBox(width: 2.0), + ), + ...buildMfm( + ref, + account: account, + text: [ + if (skebStatus.isAcceptable) + if (skebStatus.skills.firstOrNull + case final skill?) ...[ + switch (skill.genre) { + SkebStatusSkillGenre.art => t + .misskeyIO + .skebStatus_ + .genres_ + .art, + SkebStatusSkillGenre.comic => t + .misskeyIO + .skebStatus_ + .genres_ + .comic, + SkebStatusSkillGenre.voice => t + .misskeyIO + .skebStatus_ + .genres_ + .voice, + SkebStatusSkillGenre.novel => t + .misskeyIO + .skebStatus_ + .genres_ + .novel, + SkebStatusSkillGenre.video => t + .misskeyIO + .skebStatus_ + .genres_ + .video, + SkebStatusSkillGenre.music => t + .misskeyIO + .skebStatus_ + .genres_ + .music, + SkebStatusSkillGenre.correction => + t.misskeyIO.skebStatus_.genres_ + .correction, + null => t.misskey.unknown, + }, + t.misskeyIO.skebStatus_.yenX( + x: NumberFormat() + .format(skill.amount), ), + ], + if (skebStatus.creatorRequestCount > 0) + if (skebStatus.isAcceptable) '|', + t.misskeyIO.skebStatus_.nWorks( + n: NumberFormat().format( + skebStatus.creatorRequestCount, ), ), - ], + ].join(' '), ), - ) - : Mfm( - account: account, - text: field.value, - emojis: user.emojis, - author: user, - ), + WidgetSpan( + child: Icon( + Icons.open_in_new, + size: style.fontSize, + ), + ), + ], + ), + ), + ), ), - ], - ), - ) - .toList(), + ), + ], + ), + ], ), ], const Divider(), diff --git a/pubspec.lock b/pubspec.lock index a43f99b18..d397cfed0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1218,8 +1218,8 @@ packages: dependency: "direct main" description: path: "." - ref: dc4fc85e7f8dfb4adb0aff6d4baebfdb33fcdd4b - resolved-ref: dc4fc85e7f8dfb4adb0aff6d4baebfdb33fcdd4b + ref: d25ddfb398cae2bf230758c6f5b7a7648acaedd5 + resolved-ref: d25ddfb398cae2bf230758c6f5b7a7648acaedd5 url: "https://github.com/poppingmoon/misskey_dart" source: git version: "1.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 4fb7e1043..d9ab0f9f8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -65,7 +65,7 @@ dependencies: misskey_dart: git: url: https://github.com/poppingmoon/misskey_dart - ref: dc4fc85e7f8dfb4adb0aff6d4baebfdb33fcdd4b + ref: d25ddfb398cae2bf230758c6f5b7a7648acaedd5 package_info_plus: ^4.2.0 photo_view: ^0.14.0 punycode: ^1.0.0 diff --git a/test_util/dummy_me_detailed.dart b/test_util/dummy_me_detailed.dart index 81dabc30c..3ad54ecb6 100644 --- a/test_util/dummy_me_detailed.dart +++ b/test_util/dummy_me_detailed.dart @@ -19,7 +19,4 @@ final dummyMeDetailed = MeDetailed( alwaysMarkNsfw: false, carefulBot: false, autoAcceptFollowed: false, - hasUnreadSpecifiedNotes: false, - hasUnreadMentions: false, - hasUnreadNotification: false, );