mirror of
				https://gitlab.com/famedly/fluffychat.git
				synced 2025-11-04 06:17:26 +01:00 
			
		
		
		
	Merge branch 'soru/translate-emoji' into 'main'
feat: Implement official emoji translations for emoji verification See merge request famedly/fluffychat!484
This commit is contained in:
		
						commit
						91b29f7b70
					
				@ -177,3 +177,5 @@ location /_matrix/push/v1/notify {
 | 
			
		||||
* Also thanks to all translators and testers! With your help, fluffychat is now available in more than 12 languages.
 | 
			
		||||
 | 
			
		||||
* <a href="https://github.com/googlefonts/noto-emoji/">Noto Emoji Font</a> for the awesome emojis.
 | 
			
		||||
 | 
			
		||||
* The Matrix Foundation for making and maintaining the [emoji translations](https://github.com/matrix-org/matrix-doc/blob/master/data-definitions/sas-emoji.json) used for emoji verification, licensed Apache 2.0
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2178
									
								
								assets/sas-emoji.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2178
									
								
								assets/sas-emoji.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -1,9 +1,13 @@
 | 
			
		||||
import 'dart:ui';
 | 
			
		||||
import 'dart:convert';
 | 
			
		||||
 | 
			
		||||
import 'package:adaptive_dialog/adaptive_dialog.dart';
 | 
			
		||||
import 'package:matrix/encryption.dart';
 | 
			
		||||
import 'package:matrix/matrix.dart';
 | 
			
		||||
import 'package:fluffychat/utils/platform_infos.dart';
 | 
			
		||||
import 'package:flutter/cupertino.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:flutter/services.dart';
 | 
			
		||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
 | 
			
		||||
import '../widgets/adaptive_flat_button.dart';
 | 
			
		||||
import 'package:future_loading_dialog/future_loading_dialog.dart';
 | 
			
		||||
@ -37,6 +41,7 @@ class KeyVerificationDialog extends StatefulWidget {
 | 
			
		||||
 | 
			
		||||
class _KeyVerificationPageState extends State<KeyVerificationDialog> {
 | 
			
		||||
  void Function() originalOnUpdate;
 | 
			
		||||
  List<dynamic> sasEmoji;
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  void initState() {
 | 
			
		||||
@ -51,6 +56,10 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
 | 
			
		||||
      profile = p;
 | 
			
		||||
      setState(() => null);
 | 
			
		||||
    });
 | 
			
		||||
    rootBundle.loadString('assets/sas-emoji.json').then((e) {
 | 
			
		||||
      sasEmoji = json.decode(e);
 | 
			
		||||
      setState(() => null);
 | 
			
		||||
    });
 | 
			
		||||
    super.initState();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -208,7 +217,7 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
 | 
			
		||||
          compareText = L10n.of(context).compareEmojiMatch;
 | 
			
		||||
          compareWidget = TextSpan(
 | 
			
		||||
            children: widget.request.sasEmojis
 | 
			
		||||
                .map((e) => WidgetSpan(child: _Emoji(e)))
 | 
			
		||||
                .map((e) => WidgetSpan(child: _Emoji(e, sasEmoji)))
 | 
			
		||||
                .toList(),
 | 
			
		||||
          );
 | 
			
		||||
        } else {
 | 
			
		||||
@ -371,8 +380,33 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
 | 
			
		||||
 | 
			
		||||
class _Emoji extends StatelessWidget {
 | 
			
		||||
  final KeyVerificationEmoji emoji;
 | 
			
		||||
  final List<dynamic> sasEmoji;
 | 
			
		||||
 | 
			
		||||
  _Emoji(this.emoji);
 | 
			
		||||
  _Emoji(this.emoji, this.sasEmoji);
 | 
			
		||||
 | 
			
		||||
  String getLocalizedName() {
 | 
			
		||||
    if (sasEmoji == null) {
 | 
			
		||||
      // asset is still being loaded
 | 
			
		||||
      return emoji.name;
 | 
			
		||||
    }
 | 
			
		||||
    final translations = Map<String, String>.from(
 | 
			
		||||
        sasEmoji[emoji.number]['translated_descriptions']);
 | 
			
		||||
    translations['en'] = emoji.name;
 | 
			
		||||
    for (final locale in window.locales) {
 | 
			
		||||
      final wantLocaleParts = locale.toString().split('_');
 | 
			
		||||
      final wantLanguage = wantLocaleParts.removeAt(0);
 | 
			
		||||
      for (final haveLocale in translations.keys) {
 | 
			
		||||
        final haveLocaleParts = haveLocale.split('_');
 | 
			
		||||
        final haveLanguage = haveLocaleParts.removeAt(0);
 | 
			
		||||
        if (haveLanguage == wantLanguage &&
 | 
			
		||||
            (Set.from(haveLocaleParts)..removeAll(wantLocaleParts)).isEmpty &&
 | 
			
		||||
            (translations[haveLocale]?.isNotEmpty ?? false)) {
 | 
			
		||||
          return translations[haveLocale];
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return emoji.name;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  Widget build(BuildContext context) {
 | 
			
		||||
@ -380,7 +414,7 @@ class _Emoji extends StatelessWidget {
 | 
			
		||||
      mainAxisSize: MainAxisSize.min,
 | 
			
		||||
      children: <Widget>[
 | 
			
		||||
        Text(emoji.emoji, style: TextStyle(fontSize: 50)),
 | 
			
		||||
        Text(emoji.name),
 | 
			
		||||
        Text(getLocalizedName()),
 | 
			
		||||
        Container(height: 10, width: 5),
 | 
			
		||||
      ],
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user