From d703a9636f1aa20b64e5217a0eb6171f2507633a Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Mon, 13 Jun 2022 09:30:42 -0700 Subject: [PATCH 1/7] Fix Contact Message Date not displaying date for day old messages --- lib/widgets/contactrow.dart | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/widgets/contactrow.dart b/lib/widgets/contactrow.dart index a1769f19..1f5b6e74 100644 --- a/lib/widgets/contactrow.dart +++ b/lib/widgets/contactrow.dart @@ -3,11 +3,8 @@ import 'dart:io'; import 'package:cwtch/models/appstate.dart'; import 'package:cwtch/models/contact.dart'; import 'package:cwtch/models/profile.dart'; -import 'package:cwtch/models/profileservers.dart'; import 'package:cwtch/views/contactsview.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/painting.dart'; -import 'package:cwtch/views/messageview.dart'; import 'package:cwtch/widgets/profileimage.dart'; import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -156,7 +153,7 @@ class _ContactRowState extends State { return AppLocalizations.of(context)!.conversationNotificationPolicyNever; } // If the last message was over a day ago, just state the date - if (DateTime.now().difference(date).inDays > 1) { + if (DateTime.now().difference(date).inDays > 0) { return DateFormat.yMd(Platform.localeName).format(date.toLocal()); } // Otherwise just state the time. -- 2.25.1 From 3961692817a713dbb0b95da4984931da790e9b96 Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Mon, 13 Jun 2022 10:06:06 -0700 Subject: [PATCH 2/7] Nicer Quoted Messages --- lib/models/messages/filemessage.dart | 3 ++ lib/models/messages/quotedmessage.dart | 11 +++++-- lib/models/messages/textmessage.dart | 5 +++- lib/widgets/filebubble.dart | 41 ++++++++++++++++---------- lib/widgets/quotedmessage.dart | 15 ++++++++-- 5 files changed, 52 insertions(+), 23 deletions(-) diff --git a/lib/models/messages/filemessage.dart b/lib/models/messages/filemessage.dart index 3ba18fad..7c139822 100644 --- a/lib/models/messages/filemessage.dart +++ b/lib/models/messages/filemessage.dart @@ -64,6 +64,8 @@ class FileMessage extends Message { } return Container( alignment: Alignment.center, + width: 50, + height: 50, child: FileBubble( nameSuggestion, rootHash, @@ -71,6 +73,7 @@ class FileMessage extends Message { fileSize, isAuto: metadata.isAuto, interactive: false, + isPreview: true, )); }); } diff --git a/lib/models/messages/quotedmessage.dart b/lib/models/messages/quotedmessage.dart index 3fefee0b..084953eb 100644 --- a/lib/models/messages/quotedmessage.dart +++ b/lib/models/messages/quotedmessage.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'package:cwtch/models/message.dart'; -import 'package:cwtch/models/messages/malformedmessage.dart'; import 'package:cwtch/widgets/malformedbubble.dart'; import 'package:cwtch/widgets/messagerow.dart'; import 'package:cwtch/widgets/quotedmessage.dart'; @@ -30,8 +29,14 @@ class QuotedMessage extends Message { value: this.metadata, builder: (bcontext, child) { try { - dynamic message = jsonDecode(this.content); - return Text(message["body"]); + dynamic message = jsonDecode( + this.content, + ); + var content = message["body"]; + return Text( + content, + overflow: TextOverflow.ellipsis, + ); } catch (e) { return MalformedBubble(); } diff --git a/lib/models/messages/textmessage.dart b/lib/models/messages/textmessage.dart index 01a51048..b2496f19 100644 --- a/lib/models/messages/textmessage.dart +++ b/lib/models/messages/textmessage.dart @@ -21,7 +21,10 @@ class TextMessage extends Message { return ChangeNotifierProvider.value( value: this.metadata, builder: (bcontext, child) { - return Text(this.content.substring(0, min(this.content.length, 50))); + return Text( + this.content, + overflow: TextOverflow.ellipsis, + ); }); } diff --git a/lib/widgets/filebubble.dart b/lib/widgets/filebubble.dart index d3e1e7b2..e533eee8 100644 --- a/lib/widgets/filebubble.dart +++ b/lib/widgets/filebubble.dart @@ -25,8 +25,9 @@ class FileBubble extends StatefulWidget { final int fileSize; final bool interactive; final bool isAuto; + final bool isPreview; - FileBubble(this.nameSuggestion, this.rootHash, this.nonce, this.fileSize, {this.isAuto = false, this.interactive = true}); + FileBubble(this.nameSuggestion, this.rootHash, this.nonce, this.fileSize, {this.isAuto = false, this.interactive = true, this.isPreview = false}); @override FileBubbleState createState() => FileBubbleState(); @@ -44,6 +45,22 @@ class FileBubbleState extends State { super.initState(); } + Widget getPreview(context) { + return Image.file( + myFile!, + cacheWidth: (MediaQuery.of(context).size.width * 0.6).floor(), + // limit the amount of space the image can decode too, we keep this high-ish to allow quality previews... + filterQuality: FilterQuality.medium, + fit: BoxFit.scaleDown, + alignment: Alignment.center, + height: MediaQuery.of(context).size.height * 0.30, + isAntiAlias: false, + errorBuilder: (context, error, stackTrace) { + return MalformedBubble(); + }, + ); + } + @override Widget build(BuildContext context) { var fromMe = Provider.of(context).senderHandle == Provider.of(context).onion; @@ -109,6 +126,12 @@ class FileBubbleState extends State { senderDisplayStr = Provider.of(context).senderHandle; } } + + // we don't preview a non downloaded file... + if (widget.isPreview && myFile != null) { + return getPreview(context); + } + return LayoutBuilder(builder: (bcontext, constraints) { var wdgSender = Visibility( visible: widget.interactive, @@ -133,21 +156,7 @@ class FileBubbleState extends State { child: MouseRegion( cursor: SystemMouseCursors.click, child: GestureDetector( - child: Padding( - padding: EdgeInsets.all(1.0), - child: Image.file( - myFile!, - cacheWidth: (MediaQuery.of(bcontext).size.width * 0.6).floor(), - // limit the amount of space the image can decode too, we keep this high-ish to allow quality previews... - filterQuality: FilterQuality.medium, - fit: BoxFit.scaleDown, - alignment: Alignment.center, - height: MediaQuery.of(bcontext).size.height * 0.30, - isAntiAlias: false, - errorBuilder: (context, error, stackTrace) { - return MalformedBubble(); - }, - )), + child: Padding(padding: EdgeInsets.all(1.0), child: getPreview(context)), onTap: () { pop(bcontext, myFile!, wdgMessage); }, diff --git a/lib/widgets/quotedmessage.dart b/lib/widgets/quotedmessage.dart index 0195d3cb..220a915d 100644 --- a/lib/widgets/quotedmessage.dart +++ b/lib/widgets/quotedmessage.dart @@ -7,6 +7,7 @@ import 'package:cwtch/third_party/linkify/flutter_linkify.dart'; import 'package:cwtch/views/contactsview.dart'; import 'package:cwtch/widgets/malformedbubble.dart'; import 'package:cwtch/widgets/messageloadingbubble.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:intl/intl.dart'; @@ -94,10 +95,18 @@ class QuotedMessageBubbleState extends State { child: Container( margin: EdgeInsets.all(5), padding: EdgeInsets.all(5), + clipBehavior: Clip.antiAlias, + decoration: BoxDecoration(), + height: 75, color: fromMe ? Provider.of(context).theme.messageFromOtherBackgroundColor : Provider.of(context).theme.messageFromMeBackgroundColor, - child: Wrap(runAlignment: WrapAlignment.spaceEvenly, alignment: WrapAlignment.spaceEvenly, runSpacing: 1.0, crossAxisAlignment: WrapCrossAlignment.center, children: [ - Center(widthFactor: 1, child: Padding(padding: EdgeInsets.all(10.0), child: Icon(Icons.reply, size: 32, color: qTextColor))), - Center(widthFactor: 1.0, child: DefaultTextStyle(child: qMessage.getPreviewWidget(context), style: TextStyle(color: qTextColor))) + child: Row(mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.start, children: [ + Padding(padding: EdgeInsets.symmetric(vertical: 5.0, horizontal: 10.0), child: Icon(Icons.reply, size: 32, color: qTextColor)), + DefaultTextStyle( + textWidthBasis: TextWidthBasis.parent, + child: qMessage.getPreviewWidget(context), + style: TextStyle(color: qTextColor), + overflow: TextOverflow.fade, + ) ])))); } catch (e) { print(e); -- 2.25.1 From 04c335e7a4bdc4113d5b57c0e93a4f39c3f2ec5b Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Tue, 14 Jun 2022 18:25:13 -0700 Subject: [PATCH 3/7] formatting toolbar --- lib/views/messageview.dart | 260 +++++++++++++++++++++++++++++-------- 1 file changed, 208 insertions(+), 52 deletions(-) diff --git a/lib/views/messageview.dart b/lib/views/messageview.dart index b69066f2..6030c79c 100644 --- a/lib/views/messageview.dart +++ b/lib/views/messageview.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'dart:io'; +import 'dart:ui'; import 'package:crypto/crypto.dart'; import 'package:cwtch/cwtch/cwtch.dart'; import 'package:cwtch/cwtch_icons_icons.dart'; @@ -10,6 +11,7 @@ import 'package:cwtch/models/message.dart'; import 'package:cwtch/models/messagecache.dart'; import 'package:cwtch/models/messages/quotedmessage.dart'; import 'package:cwtch/models/profile.dart'; +import 'package:cwtch/third_party/linkify/flutter_linkify.dart'; import 'package:cwtch/widgets/malformedbubble.dart'; import 'package:cwtch/widgets/messageloadingbubble.dart'; import 'package:cwtch/widgets/profileimage.dart'; @@ -44,6 +46,7 @@ class _MessageViewState extends State { ItemPositionsListener scrollListener = ItemPositionsListener.create(); File? imagePreview; bool showDown = false; + bool showPreview = false; @override void initState() { @@ -91,6 +94,7 @@ class _MessageViewState extends State { return Card(child: Center(child: Text(AppLocalizations.of(context)!.addContactFirst))); } + var showMessageFormattingPreview = Provider.of(context).isExperimentEnabled(FormattingExperiment); var showFileSharing = Provider.of(context).isExperimentEnabled(FileSharingExperiment); var appBarButtons = []; if (Provider.of(context).isOnline()) { @@ -176,11 +180,11 @@ class _MessageViewState extends State { actions: appBarButtons, ), body: Padding( - padding: EdgeInsets.fromLTRB(8.0, 8.0, 8.0, 108.0), + padding: EdgeInsets.fromLTRB(8.0, 8.0, 8.0, 182.0), child: MessageList( scrollListener, )), - bottomSheet: _buildComposeBox(), + bottomSheet: showPreview && showMessageFormattingPreview ? _buildPreviewBox() : _buildComposeBox(), )); } @@ -313,64 +317,216 @@ class _MessageViewState extends State { Provider.of(context, listen: false).cwtch.SetConversationAttribute(profileOnion, identifier, LastMessageSeenTimeKey, DateTime.now().toIso8601String()); } - Widget _buildComposeBox() { - bool isOffline = Provider.of(context).isOnline() == false; - bool isGroup = Provider.of(context).isGroup; + Widget _buildPreviewBox() { + var showClickableLinks = Provider.of(context).isExperimentEnabled(ClickableLinksExperiment); - var charLength = ctrlrCompose.value.text.characters.length; - var expectedLength = ctrlrCompose.value.text.length; - var numberOfBytesMoreThanChar = (expectedLength - charLength); + var wdgMessage = Padding( + padding: EdgeInsets.all(8), + child: SelectableLinkify( + text: ctrlrCompose.text + '\n', + // TODO: onOpen breaks the "selectable" functionality. Maybe something to do with gesture handler? + options: LinkifyOptions(messageFormatting: true, parseLinks: showClickableLinks, looseUrl: true, defaultToHttps: true), + linkifiers: [UrlLinkifier()], + onOpen: showClickableLinks ? null : null, + //key: Key(myKey), + style: TextStyle( + color: Provider.of(context).theme.messageFromMeTextColor, + fontSize: 16, + ), + linkStyle: TextStyle( + color: Provider.of(context).theme.messageFromMeTextColor, + fontSize: 16, + ), + codeStyle: TextStyle( + // note: these colors are flipped + fontSize: 16, + color: Provider.of(context).theme.messageFromOtherTextColor, + backgroundColor: Provider.of(context).theme.messageFromOtherBackgroundColor), + textAlign: TextAlign.left, + textWidthBasis: TextWidthBasis.longestLine, + )); + + var showMessageFormattingPreview = Provider.of(context).isExperimentEnabled(FormattingExperiment); + var preview = showMessageFormattingPreview + ? IconButton( + icon: Icon(Icons.text_fields), + onPressed: () { + setState(() { + showPreview = false; + }); + }) + : Container(); var composeBox = Container( color: Provider.of(context).theme.backgroundMainColor, padding: EdgeInsets.all(2), margin: EdgeInsets.all(2), - height: 100, - child: Row( - children: [ - Expanded( - child: Container( - decoration: BoxDecoration(border: Border(top: BorderSide(color: Provider.of(context).theme.defaultButtonActiveColor))), - child: RawKeyboardListener( - focusNode: FocusNode(), - onKey: handleKeyPress, - child: Padding( - padding: EdgeInsets.all(8), - child: TextFormField( - key: Key('txtCompose'), - controller: ctrlrCompose, - focusNode: focusNode, - autofocus: !Platform.isAndroid, - textInputAction: TextInputAction.newline, - keyboardType: TextInputType.multiline, - enableIMEPersonalizedLearning: false, - minLines: 1, - maxLength: (isGroup ? GroupMessageLengthMax : P2PMessageLengthMax) - numberOfBytesMoreThanChar, - maxLengthEnforcement: MaxLengthEnforcement.enforced, - maxLines: null, - onFieldSubmitted: _sendMessage, - enabled: true, // always allow editing... - onChanged: (String x) { - setState(() { - // we need to force a rerender here to update the max length count - }); - }, - decoration: InputDecoration( - hintText: isOffline ? "" : AppLocalizations.of(context)!.placeholderEnterMessage, - hintStyle: TextStyle(color: Provider.of(context).theme.sendHintTextColor), - enabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - enabled: true, - suffixIcon: ElevatedButton( - key: Key("btnSend"), - style: ElevatedButton.styleFrom(padding: EdgeInsets.all(0.0), shape: new RoundedRectangleBorder(borderRadius: new BorderRadius.circular(45.0))), - child: Icon(CwtchIcons.send_24px, size: 24, color: Provider.of(context).theme.defaultButtonTextColor), - onPressed: isOffline ? null : _sendMessage, - ))), - )))), + height: 164 + ((ctrlrCompose.text.split("\n").length - 1) * 16), + child: Column( + children: [ + Row(mainAxisAlignment: MainAxisAlignment.start, children: [preview]), + Container( + decoration: BoxDecoration(border: Border(top: BorderSide(color: Provider.of(context).theme.defaultButtonActiveColor))), + child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [wdgMessage])), ], ), ); + return Container( + color: Provider.of(context).theme.backgroundMainColor, child: Column(mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [composeBox])); + } + + Widget _buildComposeBox() { + bool isOffline = Provider.of(context).isOnline() == false; + bool isGroup = Provider.of(context).isGroup; + var showToolbar = Provider.of(context).isExperimentEnabled(FormattingExperiment); + var charLength = ctrlrCompose.value.text.characters.length; + var expectedLength = ctrlrCompose.value.text.length; + var numberOfBytesMoreThanChar = (expectedLength - charLength); + + var bold = IconButton( + icon: Icon(Icons.format_bold), + onPressed: () { + setState(() { + var selected = ctrlrCompose.selection.textInside(ctrlrCompose.text); + var selection = ctrlrCompose.selection; + var start = ctrlrCompose.selection.start; + var end = ctrlrCompose.selection.end; + ctrlrCompose.text = ctrlrCompose.text.replaceRange(start, end, "**" + selected + "**"); + ctrlrCompose.selection = selection.copyWith(baseOffset: selection.start + 2, extentOffset: selection.start + 2); + }); + }); + + var italic = IconButton( + icon: Icon(Icons.format_italic), + onPressed: () { + setState(() { + var selected = ctrlrCompose.selection.textInside(ctrlrCompose.text); + var selection = ctrlrCompose.selection; + var start = ctrlrCompose.selection.start; + var end = ctrlrCompose.selection.end; + ctrlrCompose.text = ctrlrCompose.text.replaceRange(start, end, "*" + selected + "*"); + ctrlrCompose.selection = selection.copyWith(baseOffset: selection.start + 1, extentOffset: selection.start + 1); + }); + }); + + var code = IconButton( + icon: Icon(Icons.code), + onPressed: () { + setState(() { + var selected = ctrlrCompose.selection.textInside(ctrlrCompose.text); + var selection = ctrlrCompose.selection; + var start = ctrlrCompose.selection.start; + var end = ctrlrCompose.selection.end; + ctrlrCompose.text = ctrlrCompose.text.replaceRange(start, end, "`" + selected + "`"); + ctrlrCompose.selection = selection.copyWith(baseOffset: selection.start + 1, extentOffset: selection.start + 1); + }); + }); + + var superscript = IconButton( + icon: Icon(Icons.superscript), + onPressed: () { + setState(() { + var selected = ctrlrCompose.selection.textInside(ctrlrCompose.text); + var selection = ctrlrCompose.selection; + var start = ctrlrCompose.selection.start; + var end = ctrlrCompose.selection.end; + ctrlrCompose.text = ctrlrCompose.text.replaceRange(start, end, "^" + selected + "^"); + ctrlrCompose.selection = selection.copyWith(baseOffset: selection.start + 1, extentOffset: selection.start + 1); + }); + }); + + var subscript = IconButton( + icon: Icon(Icons.subscript), + onPressed: () { + setState(() { + var selected = ctrlrCompose.selection.textInside(ctrlrCompose.text); + var selection = ctrlrCompose.selection; + var start = ctrlrCompose.selection.start; + var end = ctrlrCompose.selection.end; + ctrlrCompose.text = ctrlrCompose.text.replaceRange(start, end, "_" + selected + "_"); + ctrlrCompose.selection = selection.copyWith(baseOffset: selection.start + 1, extentOffset: selection.start + 1); + }); + }); + + var strikethrough = IconButton( + icon: Icon(Icons.format_strikethrough), + onPressed: () { + setState(() { + var selected = ctrlrCompose.selection.textInside(ctrlrCompose.text); + var selection = ctrlrCompose.selection; + var start = ctrlrCompose.selection.start; + var end = ctrlrCompose.selection.end; + ctrlrCompose.text = ctrlrCompose.text.replaceRange(start, end, "~~" + selected + "~~"); + ctrlrCompose.selection = selection.copyWith(baseOffset: selection.start + 2, extentOffset: selection.start + 2); + }); + }); + + var preview = IconButton( + icon: Icon(Icons.text_format), + onPressed: () { + setState(() { + showPreview = true; + }); + }); + + var vline = Padding( + padding: EdgeInsets.symmetric(vertical: 1, horizontal: 2), + child: Container(height: 16, width: 1, decoration: BoxDecoration(color: Provider.of(context).theme.messageFromMeTextColor))); + + var formattingToolbar = Container( + decoration: BoxDecoration(color: Provider.of(context).theme.defaultButtonActiveColor), + child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [bold, italic, code, superscript, subscript, strikethrough, vline, preview])); + + var textField = Container( + decoration: BoxDecoration(border: Border(top: BorderSide(color: Provider.of(context).theme.defaultButtonActiveColor))), + child: RawKeyboardListener( + focusNode: FocusNode(), + onKey: handleKeyPress, + child: Padding( + padding: EdgeInsets.all(8), + child: TextFormField( + key: Key('txtCompose'), + controller: ctrlrCompose, + focusNode: focusNode, + autofocus: !Platform.isAndroid, + textInputAction: TextInputAction.newline, + keyboardType: TextInputType.multiline, + enableIMEPersonalizedLearning: false, + minLines: 1, + maxLength: (isGroup ? GroupMessageLengthMax : P2PMessageLengthMax) - numberOfBytesMoreThanChar, + maxLengthEnforcement: MaxLengthEnforcement.enforced, + maxLines: 3, + onFieldSubmitted: _sendMessage, + enabled: true, // always allow editing... + + onChanged: (String x) { + setState(() { + // we need to force a rerender here to update the max length count + }); + }, + decoration: InputDecoration( + hintText: isOffline ? "" : AppLocalizations.of(context)!.placeholderEnterMessage, + hintStyle: TextStyle(color: Provider.of(context).theme.sendHintTextColor), + enabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabled: true, + suffixIcon: ElevatedButton( + key: Key("btnSend"), + style: ElevatedButton.styleFrom(padding: EdgeInsets.all(0.0), shape: new RoundedRectangleBorder(borderRadius: new BorderRadius.circular(45.0))), + child: Icon(CwtchIcons.send_24px, size: 24, color: Provider.of(context).theme.defaultButtonTextColor), + onPressed: isOffline ? null : _sendMessage, + ))), + ))); + + var textEditChildren; + if (showToolbar) { + textEditChildren = [formattingToolbar, textField]; + } else { + textEditChildren = [textField]; + } + + var composeBox = + Container(color: Provider.of(context).theme.backgroundMainColor, padding: EdgeInsets.all(2), margin: EdgeInsets.all(2), height: 164, child: Column(children: textEditChildren)); var children; if (Provider.of(context).selectedConversation != null && Provider.of(context).selectedIndex != null) { @@ -419,7 +575,7 @@ class _MessageViewState extends State { children = [composeBox]; } - return Container(color: Provider.of(context).theme.backgroundMainColor, child: Column(mainAxisSize: MainAxisSize.min, children: children)); + return Container(color: Provider.of(context).theme.backgroundMainColor, child: Column(mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: children)); } // Send the message if enter is pressed without the shift key... -- 2.25.1 From 7bae6485f790e8c1a8a086492e6be2e43abe8839 Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Tue, 14 Jun 2022 18:44:24 -0700 Subject: [PATCH 4/7] Fixup Formatting PR (Dans Comments) --- lib/views/messageview.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/views/messageview.dart b/lib/views/messageview.dart index 6030c79c..81b2da6e 100644 --- a/lib/views/messageview.dart +++ b/lib/views/messageview.dart @@ -324,11 +324,9 @@ class _MessageViewState extends State { padding: EdgeInsets.all(8), child: SelectableLinkify( text: ctrlrCompose.text + '\n', - // TODO: onOpen breaks the "selectable" functionality. Maybe something to do with gesture handler? options: LinkifyOptions(messageFormatting: true, parseLinks: showClickableLinks, looseUrl: true, defaultToHttps: true), linkifiers: [UrlLinkifier()], onOpen: showClickableLinks ? null : null, - //key: Key(myKey), style: TextStyle( color: Provider.of(context).theme.messageFromMeTextColor, fontSize: 16, @@ -361,10 +359,12 @@ class _MessageViewState extends State { color: Provider.of(context).theme.backgroundMainColor, padding: EdgeInsets.all(2), margin: EdgeInsets.all(2), + + // 164 minimum height + 16px for every line of text so the entire message is displayed when previewed. height: 164 + ((ctrlrCompose.text.split("\n").length - 1) * 16), child: Column( children: [ - Row(mainAxisAlignment: MainAxisAlignment.start, children: [preview]), + Row(mainAxisAlignment: MainAxisAlignment.start, mainAxisSize: MainAxisSize.max, children: [preview]), Container( decoration: BoxDecoration(border: Border(top: BorderSide(color: Provider.of(context).theme.defaultButtonActiveColor))), child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [wdgMessage])), -- 2.25.1 From 106b45c7588fe28bd4e86832b916dae0c182180a Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Wed, 15 Jun 2022 10:46:05 -0700 Subject: [PATCH 5/7] Update Translations (including RU from @RuLang) --- lib/l10n/intl_cy.arb | 2 +- lib/l10n/intl_da.arb | 2 +- lib/l10n/intl_de.arb | 2 +- lib/l10n/intl_el.arb | 2 +- lib/l10n/intl_en.arb | 2 +- lib/l10n/intl_es.arb | 2 +- lib/l10n/intl_fr.arb | 4 +- lib/l10n/intl_it.arb | 2 +- lib/l10n/intl_lb.arb | 2 +- lib/l10n/intl_no.arb | 2 +- lib/l10n/intl_pl.arb | 42 ++++++------- lib/l10n/intl_pt.arb | 2 +- lib/l10n/intl_ro.arb | 2 +- lib/l10n/intl_ru.arb | 140 +++++++++++++++++++++---------------------- 14 files changed, 104 insertions(+), 104 deletions(-) diff --git a/lib/l10n/intl_cy.arb b/lib/l10n/intl_cy.arb index f3f18074..49bef166 100644 --- a/lib/l10n/intl_cy.arb +++ b/lib/l10n/intl_cy.arb @@ -1,6 +1,6 @@ { "@@locale": "cy", - "@@last_modified": "2022-04-21T21:35:58+02:00", + "@@last_modified": "2022-06-15T19:44:34+02:00", "formattingExperiment": "Fformatio Neges", "clickableLinkOpen": "Agor URL", "clickableLinksCopy": "Copïo URL", diff --git a/lib/l10n/intl_da.arb b/lib/l10n/intl_da.arb index 93b4aeeb..2977a08b 100644 --- a/lib/l10n/intl_da.arb +++ b/lib/l10n/intl_da.arb @@ -1,6 +1,6 @@ { "@@locale": "da", - "@@last_modified": "2022-04-21T21:35:58+02:00", + "@@last_modified": "2022-06-15T19:44:34+02:00", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'", "settingAndroidPowerExemptionDescription": "Optional: Request Android to exempt Cwtch from optimized power management. This will result in better stability at the cost of greater battery use.", diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index f3e68d7f..e3576801 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -1,6 +1,6 @@ { "@@locale": "de", - "@@last_modified": "2022-04-21T21:35:58+02:00", + "@@last_modified": "2022-06-15T19:44:34+02:00", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Die Akku Optimierungen können nicht innerhalb von Cwtch wieder aktiviert werden. Bitte gehe zu Android \/ Einstellungen \/ Apps \/ Cwtch \/ Akku und setze die Akku Nutzung auf 'Optimiert'", "settingAndroidPowerExemptionDescription": "Optional: Fordere Android auf, Cwtch von der optimierten Energieverwaltung auszunehmen. Dies wird zu einer besseren Stabilität auf Kosten eines höheren Batterieverbrauchs führen.", diff --git a/lib/l10n/intl_el.arb b/lib/l10n/intl_el.arb index cec84066..e69d9d74 100644 --- a/lib/l10n/intl_el.arb +++ b/lib/l10n/intl_el.arb @@ -1,6 +1,6 @@ { "@@locale": "el", - "@@last_modified": "2022-04-21T21:35:58+02:00", + "@@last_modified": "2022-06-15T19:44:34+02:00", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'", "settingAndroidPowerExemptionDescription": "Optional: Request Android to exempt Cwtch from optimized power management. This will result in better stability at the cost of greater battery use.", diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 9495b8ca..b07a32dc 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -1,6 +1,6 @@ { "@@locale": "en", - "@@last_modified": "2022-04-21T21:35:58+02:00", + "@@last_modified": "2022-06-15T19:44:34+02:00", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'", "settingAndroidPowerExemptionDescription": "Optional: Request Android to exempt Cwtch from optimized power management. This will result in better stability at the cost of greater battery use.", diff --git a/lib/l10n/intl_es.arb b/lib/l10n/intl_es.arb index ace908fd..caa8d16e 100644 --- a/lib/l10n/intl_es.arb +++ b/lib/l10n/intl_es.arb @@ -1,6 +1,6 @@ { "@@locale": "es", - "@@last_modified": "2022-04-21T21:35:58+02:00", + "@@last_modified": "2022-06-15T19:44:34+02:00", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'", "settingAndroidPowerExemptionDescription": "Optional: Request Android to exempt Cwtch from optimized power management. This will result in better stability at the cost of greater battery use.", diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index f10ba26f..5381a9b3 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -1,6 +1,7 @@ { "@@locale": "fr", - "@@last_modified": "2022-04-21T21:35:58+02:00", + "@@last_modified": "2022-06-15T19:44:34+02:00", + "acceptGroupBtn": "Accepter", "settingAndroidPowerExemptionDescription": "Android applique par défaut un profil de gestion de l'énergie \"optimisé\" aux applications, ce qui peut entraîner leur arrêt ou leur suppression. Demandez à Android d'exempter Cwtch de ce profil pour une meilleure stabilité mais une plus grande consommation d'énergie.", "settingsAndroidPowerReenablePopup": "Impossible de réactiver l'optimisation de la batterie à partir de Cwtch. Veuillez aller dans Android \/ Paramètres \/ Apps \/ Cwtch \/ Batterie et régler l'utilisation sur 'Optimisé'.", "okButton": "OK", @@ -12,7 +13,6 @@ "clickableLinksCopy": "Copier l'URL", "clickableLinkOpen": "Ouvrir l'URL", "clickableLinkError": "Erreur rencontrée lors de la tentative d'ouverture de l'URL", - "acceptGroupBtn": "Accepter", "successfullyImportedProfile": "Profil importé avec succès : %profile", "shuttingDownApp": "Fermeture...", "importProfileTooltip": "Utilisez une sauvegarde Cwtch chiffrée pour importer un profil créé dans une autre instance de Cwtch.", diff --git a/lib/l10n/intl_it.arb b/lib/l10n/intl_it.arb index 234f8e0f..60417df3 100644 --- a/lib/l10n/intl_it.arb +++ b/lib/l10n/intl_it.arb @@ -1,6 +1,6 @@ { "@@locale": "it", - "@@last_modified": "2022-04-21T21:35:58+02:00", + "@@last_modified": "2022-06-15T19:44:34+02:00", "settingsAndroidPowerReenablePopup": "Impossibile riattivare l'ottimizzazione della batteria dall'interno di Cwtch. Vai su Android \/ Impostazioni \/ Apps \/ Cwtch \/ Informazioni App \/ (Utilizzo) Batteria e imposta su 'Ottimizzato'.", "puzzleGameBtn": "Gioco di puzzle", "editProfileTitle": "Modifica il profilo", diff --git a/lib/l10n/intl_lb.arb b/lib/l10n/intl_lb.arb index cc893850..e93dbcd8 100644 --- a/lib/l10n/intl_lb.arb +++ b/lib/l10n/intl_lb.arb @@ -1,6 +1,6 @@ { "@@locale": "lb", - "@@last_modified": "2022-04-21T21:35:58+02:00", + "@@last_modified": "2022-06-15T19:44:34+02:00", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'", "settingAndroidPowerExemptionDescription": "Optional: Request Android to exempt Cwtch from optimized power management. This will result in better stability at the cost of greater battery use.", diff --git a/lib/l10n/intl_no.arb b/lib/l10n/intl_no.arb index 372f2978..0351363e 100644 --- a/lib/l10n/intl_no.arb +++ b/lib/l10n/intl_no.arb @@ -1,6 +1,6 @@ { "@@locale": "no", - "@@last_modified": "2022-04-21T21:35:58+02:00", + "@@last_modified": "2022-06-15T19:44:34+02:00", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'", "settingAndroidPowerExemptionDescription": "Optional: Request Android to exempt Cwtch from optimized power management. This will result in better stability at the cost of greater battery use.", diff --git a/lib/l10n/intl_pl.arb b/lib/l10n/intl_pl.arb index d33d912c..cb974395 100644 --- a/lib/l10n/intl_pl.arb +++ b/lib/l10n/intl_pl.arb @@ -1,6 +1,6 @@ { "@@locale": "pl", - "@@last_modified": "2022-04-21T21:35:58+02:00", + "@@last_modified": "2022-06-15T19:44:34+02:00", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Nie udało się ponownie włączyć optymalizacji użycia baterii dla Cwtch. Przejdź do Android \/ Ustawienia \/ Aplikacje \/ Cwtch \/ Bateria i ustaw Zużycie na 'Optymalizacja'", "settingAndroidPowerExemptionDescription": "Opcjonalne: wyłącz optymalizację użycia baterii przez Cwtch w systemie Android. Będzie to skutkować lepszą stabilnością w zamian za wyższy pobór energii", @@ -19,12 +19,6 @@ "importProfile": "Importuj profil", "exportProfileTooltip": "Utwórz zaszyfrowany plik z kopią zapasową tego profilu. Zaszyfrowany plik można zaimportować do Cwtch na innym urządzeniu.", "exportProfile": "Eksportuj profil", - "deleteConfirmLabel": "Wpisz USUŃ aby potwierdzić", - "localeLb": "Luksemburski", - "localeNo": "Norweski", - "localeEl": "Grecki", - "localeCy": "Walijski", - "localeDa": "Duński", "localeRo": "Romanian", "newMessageNotificationConversationInfo": "Nowa wiadomość od %1", "newMessageNotificationSimple": "Nowa wiadomość", @@ -62,6 +56,23 @@ "torSettingsCustomSocksPort": "Port SOCKS", "torSettingsEnabledAdvancedDescription": "Użyj obecnego na twoim systemie serwisu Tor lub zmień parametry serwisu Tor w Cwtch", "torSettingsEnabledAdvanced": "Włącz zaawansowaną konfigurację Tor", + "archiveConversation": "Zarchiwizuj tę konwersację", + "groupInviteSettingsWarning": "Zaproszono Cię do grupy! Aby wyświetlić to zaproszenie, włącz Grupy (eksperymentalne) w Ustawieniach", + "descriptionExperimentsGroups": "Grupy (eksperymentalne) łączą się z niezaufanymi serwerami, aby umożliwić komunikację grupową.", + "descriptionExperiments": "Funkcje eksperymentalne są opcjonalne. Dodają one funkcjonalności, które mogą być mniej prywatne niż domyślne konwersacje 1:1, np. Grupy, integracja z botami, itp.", + "invalidImportString": "Niepoprawny ciąg importu", + "enableGroups": "Włącz Grupy", + "todoPlaceholder": "Do zrobienia...", + "profileOnionLabel": "Send this address to contacts you want to connect with", + "copiedToClipboardNotification": "Skopiowano do schowka", + "searchList": "Lista wyszukiwania", + "serverLabel": "Server", + "deleteConfirmLabel": "Wpisz USUŃ aby potwierdzić", + "localeLb": "Luksemburski", + "localeNo": "Norweski", + "localeEl": "Grecki", + "localeCy": "Walijski", + "localeDa": "Duński", "largeTextLabel": "Duży", "settingInterfaceZoom": "Przybliżenie", "localeDe": "Deutsche", @@ -92,7 +103,6 @@ "password1Label": "Hasło", "currentPasswordLabel": "Obecne hasło", "yourDisplayName": "Nazwa", - "profileOnionLabel": "Przekaż ten adres osobom, z którymi chcesz nawiązać kontakt", "noPasswordWarning": "Brak hasła do konta oznacza, że dane przechowywane na tym urządzeniu nie będą zaszyfrowane", "radioNoPassword": "Niezaszyfrowany (brak hasła)", "radioUsePassword": "Hasło", @@ -102,13 +112,13 @@ "profileName": "Nazwa", "editProfileTitle": "Edytuj profil", "addProfileTitle": "Dodaj nowy profil", - "deleteBtn": "Usuń", + "deleteBtn": "Delete", "unblockBtn": "Odblokuj", "dontSavePeerHistory": "Nie", "savePeerHistoryDescription": "Zapisywanie wiadomości", "savePeerHistory": "Tak", "blockBtn": "Zablokuj", - "saveBtn": "Zapisz", + "saveBtn": "Save", "displayNameLabel": "Nazwa", "addressLabel": "Adresy", "puzzleGameBtn": "Puzzle", @@ -129,7 +139,6 @@ "membershipDescription": "Lista użytkowników, którzy wysyłali wiadomości w tej grupie. Członkowie grupy, którzy nie wysyłali żadnych wiadomości nie są na tej liście.", "addListItemBtn": "Dodaj", "peerNotOnline": "Znajomy jest niedostępny. Nie można użyć aplikacji.", - "searchList": "Lista wyszukiwania", "update": "Zaktualizuj", "inviteBtn": "Zaproś", "inviteToGroupLabel": "Zaproś do grupy", @@ -141,7 +150,6 @@ "serverConnectivityConnected": "Połączono z serwerem", "serverInfo": "Informacje o serwerze", "invitationLabel": "Zaproszenie", - "serverLabel": "Server", "search": "Szukaj...", "blocked": "Zablokowany", "pasteAddressToAddContact": "Wklej adres Cwtch znajomego, zaproszenie do grupy albo pęk kluczy", @@ -225,7 +233,6 @@ "tooltipRejectContactRequest": "Odrzuć zaproszenie do znajomych", "tooltipAcceptContactRequest": "Akceptuj zaproszenie do znajomych", "notificationNewMessageFromPeer": "Nowa wiadomość od znajomego!", - "groupInviteSettingsWarning": "Zaproszono Cię do grupy! Aby wyświetlić to zaproszenie, włącz Grupy (eksperymentalne) w Ustawieniach", "shutdownCwtchDialog": "Zamknąć Cwtch? Wszystkie połączenia zostaną zakończone, a aplikacja zostanie zamknięta.", "malformedMessage": "Wiadomość uszkodzona", "profileDeleteSuccess": "Profil został usunięty", @@ -248,21 +255,16 @@ "inviteToGroup": "Zaproszono Cię do grupy:", "successfullAddedContact": "Dodano znajomego ", "descriptionBlockUnknownConnections": "Blokowanie połączeń od osób, które nie są na liście Twoich znajomych.", - "descriptionExperimentsGroups": "Grupy (eksperymentalne) łączą się z niezaufanymi serwerami, aby umożliwić komunikację grupową.", - "descriptionExperiments": "Funkcje eksperymentalne są opcjonalne. Dodają one funkcjonalności, które mogą być mniej prywatne niż domyślne konwersacje 1:1, np. Grupy, integracja z botami, itp.", "titleManageProfiles": "Zarządzaj Profilami", "tooltipUnlockProfiles": "Wprowadź hasło, aby odblokować zaszyfrowane profile.", "titleManageContacts": "Konwersacje", "tooltipAddContact": "Dodaj znajomego lub grupę", "tooltipOpenSettings": "Ustawienia", "contactAlreadyExists": "Ten znajomy już istnieje", - "invalidImportString": "Niepoprawny ciąg importu", "conversationSettings": "Ustawienia konwersacji", "enterCurrentPasswordForDelete": "Aby usunąć ten profil, wprowadź hasło.", - "enableGroups": "Włącz Grupy", "localeIt": "Italiana", "localeEs": "Espanol", - "todoPlaceholder": "Do zrobienia...", "addNewItem": "Dodaj do listy", "addListItem": "Add a New List Item", "newConnectionPaneTitle": "Nowe połączenie", @@ -321,7 +323,6 @@ "fileSavedTo": "Zapisano do", "verfiyResumeButton": "Zweryfikuj\/wznów", "copyServerKeys": "Kopiuj klucze", - "archiveConversation": "Zarchiwizuj tę konwersację", "streamerModeLabel": "Tryb streamera\/prezentacji", "retrievingManifestMessage": "Pobieranie informacji o pliku...", "openFolderButton": "Otwórz folder", @@ -330,6 +331,5 @@ "labelFilesize": "Rozmiar", "messageFileSent": "Plik został wysłany", "tooltipSendFile": "Wyślij plik", - "settingFileSharing": "Udostępnianie plików", - "copiedToClipboardNotification": "Skopiowano do schowka" + "settingFileSharing": "Udostępnianie plików" } \ No newline at end of file diff --git a/lib/l10n/intl_pt.arb b/lib/l10n/intl_pt.arb index d8af24b6..b90ee446 100644 --- a/lib/l10n/intl_pt.arb +++ b/lib/l10n/intl_pt.arb @@ -1,6 +1,6 @@ { "@@locale": "pt", - "@@last_modified": "2022-04-21T21:35:58+02:00", + "@@last_modified": "2022-06-15T19:44:34+02:00", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'", "settingAndroidPowerExemptionDescription": "Optional: Request Android to exempt Cwtch from optimized power management. This will result in better stability at the cost of greater battery use.", diff --git a/lib/l10n/intl_ro.arb b/lib/l10n/intl_ro.arb index 260a7e4c..73a48f10 100644 --- a/lib/l10n/intl_ro.arb +++ b/lib/l10n/intl_ro.arb @@ -1,6 +1,6 @@ { "@@locale": "ro", - "@@last_modified": "2022-04-21T21:35:58+02:00", + "@@last_modified": "2022-06-15T19:44:34+02:00", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'", "settingAndroidPowerExemptionDescription": "Optional: Request Android to exempt Cwtch from optimized power management. This will result in better stability at the cost of greater battery use.", diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index c6eea337..712b4f60 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -1,24 +1,76 @@ { "@@locale": "ru", - "@@last_modified": "2022-04-21T21:35:58+02:00", + "@@last_modified": "2022-06-15T19:44:34+02:00", + "editProfile": "Изменить профиль", "okButton": "OK", - "settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'", - "settingAndroidPowerExemptionDescription": "Optional: Request Android to exempt Cwtch from optimized power management. This will result in better stability at the cost of greater battery use.", - "settingAndroidPowerExemption": "Android Ignore Battery Optimizations", - "thisFeatureRequiresGroupExpermientsToBeEnabled": "This feature requires the Groups Experiment to be enabled in Settings", - "messageFormattingDescription": "Enable rich text formatting in displayed messages e.g. **bold** and *italic*", - "formattingExperiment": "Message Formatting", - "clickableLinkError": "Error encountered while attempting to open URL", - "clickableLinksCopy": "Copy URL", - "clickableLinkOpen": "Open URL", - "clickableLinksWarning": "Opening this URL will launch an application outside of Cwtch and may reveal metadata or otherwise compromise the security of Cwtch. Only open URLs from people you trust. Are you sure you want to continue?", - "shuttingDownApp": "Shutting down...", - "successfullyImportedProfile": "Successfully Imported Profile: %profile", - "failedToImportProfile": "Error Importing Profile", - "importProfileTooltip": "Use an encrypted Cwtch backup to bring in a profile created in another instance of Cwtch.", - "importProfile": "Import Profile", - "exportProfileTooltip": "Backup this profile to an encrypted file. The encrypted file can be imported into another Cwtch app.", - "exportProfile": "Export Profile", + "settingsAndroidPowerReenablePopup": "Невозможно перезапустить функцию оптимазации батарее для Cwtch. Перейдите в настройки Android \/ Настройки \/ Приложения и уведомления \/ Все приложения \/ Cwtch \/ Батарея \/ Эконоимя заряда \/ Отключена", + "settingAndroidPowerExemptionDescription": "Необязательно: в настройках Android исключите Cwtch в параметрах оптимизации батареи. Это улучшит стабильность за счёт небольшого расхода батареи..", + "settingAndroidPowerExemption": "Игнорировать оптимазацию батареи Android", + "thisFeatureRequiresGroupExpermientsToBeEnabled": "Чтобы использовать данную функцию, в настройках необходимо включить \"Эксперементы\", затем \"Групповые чаты\"", + "messageFormattingDescription": "Включите форматирование, если к примеру хотите использовать **жирный-текст** и *курсив*", + "formattingExperiment": "Форматирование сообщений", + "clickableLinkError": "Ошибка при попытке открыть данную ссылку", + "clickableLinksCopy": "Копировать ссылку", + "clickableLinkOpen": "Открыть ссылку", + "clickableLinksWarning": "Открытие данной ссылки приведет к запуску приложения за пределами Cwtch и может раскрыть метаданные или иным образом поставить под угрозу безопасность Cwtch. Открывайте ссылки только от тех людей, которым вы доверяете. Вы уверены, что хотите продолжить?", + "shuttingDownApp": "Выключение...", + "successfullyImportedProfile": "Профиль успешно импортирован: %profile", + "failedToImportProfile": "Ошибка импорта профиля", + "importProfileTooltip": "Используйте зашифрованную резервную копию Cwtch, чтобы перенести профиль, созданный на другом устройстве где установлен Cwtch..", + "importProfile": "Загрузить профиль", + "exportProfileTooltip": "Сделать зашифрованную резервную копию в файл. Его потом потом можно импортировать на других устройствах где установлен Cwtch.", + "exportProfile": "Сохранить профиль", + "notificationContentContactInfo": "Информация о разговоре", + "notificationContentSimpleEvent": "Обычное событие", + "conversationNotificationPolicySettingDescription": "Настройка уведомлений", + "conversationNotificationPolicySettingLabel": "Настройка уведомлений", + "settingsGroupAppearance": "Настройки отображения", + "notificationContentSettingDescription": "Управление уведомлениями в данной теме", + "notificationPolicySettingDescription": "Настройка уведомлений по-умолчанию", + "notificationContentSettingLabel": "Содержимое уведомления", + "notificationPolicySettingLabel": "Уведомления", + "conversationNotificationPolicyOptIn": "Включить", + "conversationNotificationPolicyDefault": "По-умолчанию", + "notificationPolicyDefaultAll": "Всё по-умолчанию", + "notificationPolicyOptIn": "Включить", + "notificationPolicyMute": "Без звука", + "tooltipSelectACustomProfileImage": "Сменить изображение профиля", + "torSettingsEnabledCacheDescription": "Кэшировать текущий загруженный узел Tor для повторного подключения при следующем запуске Cwtch. Это позволит Tor запускаться быстрее. Если этот параметр отключен, Cwtch будет очищать кэшированные данные при запуске.", + "torSettingsEnableCache": "Кешировать узлы Tor", + "descriptionACNCircuitInfo": "Подробная информация о соединении, который сеть анонимной связи использует для подключения к этому разговору.", + "labelACNCircuitInfo": "Информация о цепи ACN", + "fileSharingSettingsDownloadFolderTooltip": "Нажмите обзор чтобы выбрать другую папку по-умолчанию для загружаемых файлов.", + "fileSharingSettingsDownloadFolderDescription": "При включение функции автоматическое скачивание файлов (например картинок), необходимо указать папку для сохранения.", + "torSettingsErrorSettingPort": "Номер порта должен быть в диапазоне от 1 до 65535", + "torSettingsUseCustomTorServiceConfigurastionDescription": "Переопределение конфигурации Tor по умолчанию. Предупреждение: это может быть опасно. Если не знаете, что делаете, лучше не трогать!", + "torSettingsUseCustomTorServiceConfiguration": "Используйте пользовательскую конфигурацию службы Tor (torrc)", + "torSettingsCustomControlPortDescription": "Используйте настраиваемый порт для управления подключениями к прокси-серверу Tor.", + "torSettingsCustomControlPort": "Выберите контрольный порт", + "torSettingsCustomSocksPortDescription": "Используйте настраиваемый порт для подключения к прокси-серверу Tor.", + "torSettingsCustomSocksPort": "Выберите SOCKS порт", + "torSettingsEnabledAdvancedDescription": "Использовать установленную службу Tor в вашей системе или измените параметры службы Cwtch Tor", + "torSettingsEnabledAdvanced": "Включить расширенные настройки Tor", + "themeColorLabel": "Основной цвет темы", + "settingDownloadFolder": "Папка для загрузок", + "settingImagePreviewsDescription": "Автоматическая загрузка изображений. Обратите внимание, что предварительный просмотр изображений часто может использоваться для взлома или деаномизации. Не используйте данную функцию если Вы контактируете с ненадежными контактами.", + "importLocalServerLabel": "Использовать локальный сервер", + "deleteServerConfirmBtn": "Вы точно хотите удалить сервер?", + "unlockProfileTip": "Создайте или импортируйте профиль, чтобы начать", + "unlockServerTip": "Создайте или импортируйте сервер, чтобы начать", + "saveServerButton": "Сохранить", + "serverEnabled": "Состояние сервера", + "descriptionFileSharing": "Данная функция позволяет обмениваться файлами напрямую с контактами и группами в Cwtch. Отправляемый файл будет напрямую скачиваться с вашего устройства через Cwtch, поверх скрытой сети Tor", + "settingUIColumnOptionSame": "Как в портретном режиме", + "settingUIColumnSingle": "Один столбец", + "createProfileToBegin": "Пожалуйста, создайте или импортируйте профиль, чтобы начать", + "yesLeave": "Удалить", + "leaveConversation": "Удалить", + "enableGroups": "Групповые чаты", + "settingTheme": "Ночной режим", + "addNewProfileBtn": "Создать новый профиль", + "profileOnionLabel": "Send this address to contacts you want to connect with", + "savePeerHistoryDescription": "Определяет политику хранения или удаления сообщений с данным контактом", + "savePeerHistory": "Настройка истории", "deleteConfirmLabel": "Введите УДАЛИТЬ, чтобы продолжить", "deleteConfirmText": "УДАЛИТЬ", "localeCy": "Валлийский", @@ -26,49 +78,24 @@ "localeEl": "Греческий", "localeNo": "Норвежский", "localeLb": "Люксембургский", - "settingsGroupAppearance": "Появление", "settingGroupBehaviour": "Поведение", "settingsGroupExperiments": "Эксперименты", "labelTorNetwork": "Сеть Tor", - "notificationPolicyMute": "Тишина", "conversationNotificationPolicyNever": "Никогда", "newMessageNotificationConversationInfo": "Новое сообщение от %1", "newMessageNotificationSimple": "Новое сообщение", "localeRo": "Румынский", - "notificationContentContactInfo": "Conversation Information", - "notificationContentSimpleEvent": "Plain Event", - "conversationNotificationPolicySettingDescription": "Control notification behaviour for this conversation", - "conversationNotificationPolicySettingLabel": "Conversation Notification Policy", - "notificationContentSettingDescription": "Controls the contents of conversation notifications", - "notificationPolicySettingDescription": "Controls the default application notification behaviour", - "notificationContentSettingLabel": "Notification Content", - "notificationPolicySettingLabel": "Notification Policy", - "conversationNotificationPolicyOptIn": "Opt In", - "conversationNotificationPolicyDefault": "Default", - "notificationPolicyDefaultAll": "Default All", - "notificationPolicyOptIn": "Opt In", - "tooltipSelectACustomProfileImage": "Select a Custom Profile Image", - "torSettingsEnabledCacheDescription": "Cache the current downloaded Tor consensus to reuse next time Cwtch is opened. This will allow Tor to start faster. When disabled, Cwtch will purge cached data on start up.", - "torSettingsEnableCache": "Cache Tor Consensus", - "descriptionACNCircuitInfo": "In depth information about the path that the anonymous communication network is using to connect to this conversation.", - "labelACNCircuitInfo": "ACN Circuit Info", - "fileSharingSettingsDownloadFolderTooltip": "Browse to select a different default folder for downloaded files.", - "fileSharingSettingsDownloadFolderDescription": "When files are downloaded automatically (e.g. image files, when image previews are enabled) a default location to download the files to is needed.", - "torSettingsErrorSettingPort": "Port Number must be between 1 and 65535", "msgAddToAccept": "Добавьте учетную запись в контакты, чтобы принять этот файл.", "btnSendFile": "Отправить файл", "msgConfirmSend": "Вы уверены, что хотите отправить?", "msgFileTooBig": "Размер файла не должен превышать 10GB", "storageMigrationModalMessage": "Перенос профилей в новый формат хранения. Это может занять несколько минут...", "loadingCwtch": "Загрузка Cwtch...", - "themeColorLabel": "Светлая или Темная тема", - "settingDownloadFolder": "Папка для скачивания", "serverConnectionsLabel": "Всего соединений:", "serverTotalMessagesLabel": "Всего сообщений:", "plainServerDescription": "Мы настоятельно рекомендуем защитить свой Onion сервер Cwtch паролем. Если Вы этого не сделаете, то любой у кого окажется доступ к серверу, сможет получить доступ к информации на этом сервере включая конфиденциальные криптографические ключи.", "settingServersDescription": "Экспериментальная функция которая позволяет добавлять сервер для Cwtch в скрытой сети Tor. В меню появится дополнительная опция Серверы", "streamerModeLabel": "Режим маскировки", - "settingUIColumnSingle": "Один стобец", "settingUIColumnLandscape": "Столбцы чатов в ландшафтном режиме", "settingUIColumnPortrait": "Столбцы чатов в портретном режиме", "resetTor": "Сброс", @@ -77,14 +104,6 @@ "descriptionExperiments": "Экспериментальные функции Cwtch это необязательные дополнительные функции, которые добавляют некоторые возможности, но не имеют такой же устойчивости к метаданным как если бы вы общались через традиционный чат 1 на 1..", "settingLanguage": "Выбрать язык", "profileName": "Введите имя...", - "torSettingsUseCustomTorServiceConfigurastionDescription": "Override the default tor configuration. Warning: This could be dangerous. Only turn this on if you know what you are doing.", - "torSettingsUseCustomTorServiceConfiguration": "Use a Custom Tor Service Configuration (torrc)", - "torSettingsCustomControlPortDescription": "Use a custom port for control connections to the Tor proxy", - "torSettingsCustomControlPort": "Custom Control Port", - "torSettingsCustomSocksPortDescription": "Use a custom port for data connections to the Tor proxy", - "torSettingsCustomSocksPort": "Custom SOCKS Port", - "torSettingsEnabledAdvancedDescription": "Use an existing Tor service on your system, or change the parameters of the Cwtch Tor Service", - "torSettingsEnabledAdvanced": "Enable Advanced Tor Configuration", "themeNameNeon2": "Неон2", "themeNameNeon1": "Неон1", "themeNameMidnight": "Полночь", @@ -94,7 +113,6 @@ "themeNameVampire": "Вампир", "themeNameWitch": "Ведьма", "themeNameCwtch": "Cwtch", - "settingImagePreviewsDescription": "Автоматическая загрузка изображений. Обратите внимание, что предварительный просмотр изображений часто может использоваться для взлома или деаномизации. Не используйте данную функцию если Вы контактируете с ненадежными контактами. Аватары профиля запланированы для версии Cwtch 1.6.", "settingImagePreviews": "Предпросмотр изображений и фотографий профиля", "experimentClickableLinksDescription": "Экспериментальная функция которая позволяет нажимать на URL адреса в сообщениях", "enableExperimentClickableLinks": "Включить кликабельные ссылки", @@ -107,11 +125,8 @@ "groupsOnThisServerLabel": "Группы, в которых я нахожусь, размещены на этом сервере", "importLocalServerButton": "Импорт %1", "importLocalServerSelectText": "Выбрать локальный сервер", - "importLocalServerLabel": "Импортировать локальный сервер", "newMessagesLabel": "Новое сообщение", "localeRU": "Русский", - "profileOnionLabel": "Send this address to contacts you want to connect with", - "savePeerHistory": "Хранить историю", "saveBtn": "Сохранить", "networkStatusOnline": "В сети", "defaultProfileName": "Алиса", @@ -127,29 +142,23 @@ "fileInterrupted": "Прервано", "fileSavedTo": "Сохранить в", "encryptedServerDescription": "Шифрование сервера паролем защитит его от других людей у которых может оказаться доступ к этому устройству, включая Onion адрес сервера. Зашифрованный сервер нельзя расшифровать, пока не будет введен правильный пароль разблокировки.", - "deleteServerConfirmBtn": "Точно удалить сервер?", "deleteServerSuccess": "Сервер успешно удален", "enterCurrentPasswordForDeleteServer": "Пожалуйста, введите пароль сервера, чтобы удалить его", "copyAddress": "Копировать адрес", "settingServers": "Использовать серверы", "enterServerPassword": "Введите пароль для разблокировки сервера", - "unlockProfileTip": "Создайте или разблокируйте профиль, чтобы начать", - "unlockServerTip": "Создайте или разблокируйте сервер, чтобы начать", "addServerTooltip": "Добавить сервер", "serversManagerTitleShort": "Серверы", "serversManagerTitleLong": "Личные серверы", - "saveServerButton": "Сохранить сервер", "serverAutostartDescription": "Автозапуск сервера при старте программы", "serverAutostartLabel": "Автозапуск", "serverEnabledDescription": "Запустить или остановить сервер", - "serverEnabled": "Сервер запущен", "serverDescriptionDescription": "Описание видите только Вы. Сделано для удобства", "serverDescriptionLabel": "Описание сервера", "serverAddress": "Адрес сервера", "editServerTitle": "Изменить сервер", "addServerTitle": "Добавить сервер", "titleManageProfilesShort": "Профили", - "descriptionFileSharing": "Данная функция позволяет обмениваться файлами напрямую с контактами и группами в Cwtch. Отправляемый файл будет напрямую скачиваться с вашего устройства через Cwtch.", "settingFileSharing": "Передача файлов", "tooltipSendFile": "Отправить файл", "messageFileOffered": "Контакт предлагает загрузить вам файл", @@ -171,7 +180,6 @@ "addContactConfirm": "Добавить контакт %1", "addContact": "Добавить контакт", "contactGoto": "Перейти к сообщению от %1", - "settingUIColumnOptionSame": "Как в настройках портретного режима", "settingUIColumnDouble14Ratio": "Двойной (1:4)", "settingUIColumnDouble12Ratio": "Двойной (1:2)", "localePl": "Польский", @@ -193,7 +201,6 @@ "debugLog": "Влючить отладку через консоль", "torNetworkStatus": "Статус сети Tor", "addContactFirst": "Добавьте или выберите контакт, чтобы начать чат.", - "createProfileToBegin": "Пожалуйста, создайте или разблокируйте профиль, чтобы начать", "nickChangeSuccess": "Имя профиля успешно изменено", "addServerFirst": "Перед созданием группы, необходимо создать сервер", "deleteProfileSuccess": "Профиль успешно удален", @@ -208,9 +215,7 @@ "accepted": "Принять!", "chatHistoryDefault": "Этот чат будет удален после закрытия Cwtch! Историю сообщений можно включить для каждого чата отдельно через меню настроек в правом верхнем углу..", "newPassword": "Новый пароль", - "yesLeave": "Да, оставить этот чат", "reallyLeaveThisGroupPrompt": "Вы уверены, что хотите закончить этот разговор? Все сообщения будут удалены.", - "leaveConversation": "Да, оставить этот чат", "inviteToGroup": "Вас пригласили присоединиться к группе:", "titleManageServers": "Управление серверами", "successfullAddedContact": "Успешно добавлен", @@ -223,7 +228,6 @@ "invalidImportString": "Недействительная строка импорта", "conversationSettings": "Настройки чата", "enterCurrentPasswordForDelete": "Пожалуйста, введите текущий пароль, чтобы удалить этот профиль.", - "enableGroups": "Включить Групповые чаты", "localeIt": "Итальянский", "localeEs": "Испанский", "todoPlaceholder": "Выполняю...", @@ -243,7 +247,6 @@ "experimentsEnabled": "Включить Экспериментальные функции", "themeDark": "Темная", "themeLight": "Светлая", - "settingTheme": "Тема", "largeTextLabel": "Большой", "settingInterfaceZoom": "Уровень масштабирования", "localeDe": "Немецкий", @@ -260,7 +263,6 @@ "error0ProfilesLoadedForPassword": "0 профилей, загруженных с этим паролем", "password": "Пароль", "enterProfilePassword": "Введите пароль для просмотра ваших профилей", - "addNewProfileBtn": "Добавить новый профиль", "deleteProfileConfirmBtn": "Действительно удалить профиль?", "deleteProfileBtn": "Удалить профиль", "passwordChangeError": "Ошибка при смене пароля: Введенный пароль отклонен", @@ -275,13 +277,11 @@ "noPasswordWarning": "Отсутствие пароля в этой учетной записи означает, что все данные, хранящиеся локально, не будут зашифрованы", "radioNoPassword": "Незашифрованный (без пароля)", "radioUsePassword": "Пароль", - "editProfile": "Изменить профиль", "newProfile": "Новый профиль", "editProfileTitle": "Изменить профиль", "addProfileTitle": "Добавить новый профиль", "unblockBtn": "Разблокировать контакт", "dontSavePeerHistory": "Удалить историю", - "savePeerHistoryDescription": "Определяет политуку хранения или удаления переписки с данным контактом.", "blockBtn": "Заблокировать контакт", "displayNameLabel": "Отображаемое имя", "addressLabel": "Адрес", -- 2.25.1 From 8ab82569e3ca58acf933485ec018a75c976024a3 Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Thu, 16 Jun 2022 09:22:49 -0700 Subject: [PATCH 6/7] Message Formatting Toolbar Tooltips --- lib/l10n/intl_cy.arb | 10 +++++++++- lib/l10n/intl_da.arb | 10 +++++++++- lib/l10n/intl_de.arb | 10 +++++++++- lib/l10n/intl_el.arb | 10 +++++++++- lib/l10n/intl_en.arb | 10 +++++++++- lib/l10n/intl_es.arb | 10 +++++++++- lib/l10n/intl_fr.arb | 10 +++++++++- lib/l10n/intl_it.arb | 10 +++++++++- lib/l10n/intl_lb.arb | 10 +++++++++- lib/l10n/intl_no.arb | 10 +++++++++- lib/l10n/intl_pl.arb | 10 +++++++++- lib/l10n/intl_pt.arb | 10 +++++++++- lib/l10n/intl_ro.arb | 10 +++++++++- lib/l10n/intl_ru.arb | 10 +++++++++- lib/views/messageview.dart | 8 ++++++++ 15 files changed, 134 insertions(+), 14 deletions(-) diff --git a/lib/l10n/intl_cy.arb b/lib/l10n/intl_cy.arb index 49bef166..87124a99 100644 --- a/lib/l10n/intl_cy.arb +++ b/lib/l10n/intl_cy.arb @@ -1,6 +1,14 @@ { "@@locale": "cy", - "@@last_modified": "2022-06-15T19:44:34+02:00", + "@@last_modified": "2022-06-16T18:20:12+02:00", + "tooltipPreviewFormatting": "Preview Message Formatting", + "tooltipCode": "Code \/ Monospace", + "tooltipStrikethrough": "Strikethrough", + "tooltipSubscript": "Subscript", + "tooltipSuperscript": "Superscript", + "tooltipItalicize": "Italic", + "tooltipBackToMessageEditing": "Back to Message Editing", + "tooltipBoldText": "Bold", "formattingExperiment": "Fformatio Neges", "clickableLinkOpen": "Agor URL", "clickableLinksCopy": "Copïo URL", diff --git a/lib/l10n/intl_da.arb b/lib/l10n/intl_da.arb index 2977a08b..ccf17f16 100644 --- a/lib/l10n/intl_da.arb +++ b/lib/l10n/intl_da.arb @@ -1,6 +1,14 @@ { "@@locale": "da", - "@@last_modified": "2022-06-15T19:44:34+02:00", + "@@last_modified": "2022-06-16T18:20:12+02:00", + "tooltipPreviewFormatting": "Preview Message Formatting", + "tooltipCode": "Code \/ Monospace", + "tooltipStrikethrough": "Strikethrough", + "tooltipSubscript": "Subscript", + "tooltipSuperscript": "Superscript", + "tooltipItalicize": "Italic", + "tooltipBackToMessageEditing": "Back to Message Editing", + "tooltipBoldText": "Bold", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'", "settingAndroidPowerExemptionDescription": "Optional: Request Android to exempt Cwtch from optimized power management. This will result in better stability at the cost of greater battery use.", diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index e3576801..53f7ca0a 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -1,6 +1,14 @@ { "@@locale": "de", - "@@last_modified": "2022-06-15T19:44:34+02:00", + "@@last_modified": "2022-06-16T18:20:12+02:00", + "tooltipPreviewFormatting": "Preview Message Formatting", + "tooltipCode": "Code \/ Monospace", + "tooltipStrikethrough": "Strikethrough", + "tooltipSubscript": "Subscript", + "tooltipSuperscript": "Superscript", + "tooltipItalicize": "Italic", + "tooltipBackToMessageEditing": "Back to Message Editing", + "tooltipBoldText": "Bold", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Die Akku Optimierungen können nicht innerhalb von Cwtch wieder aktiviert werden. Bitte gehe zu Android \/ Einstellungen \/ Apps \/ Cwtch \/ Akku und setze die Akku Nutzung auf 'Optimiert'", "settingAndroidPowerExemptionDescription": "Optional: Fordere Android auf, Cwtch von der optimierten Energieverwaltung auszunehmen. Dies wird zu einer besseren Stabilität auf Kosten eines höheren Batterieverbrauchs führen.", diff --git a/lib/l10n/intl_el.arb b/lib/l10n/intl_el.arb index e69d9d74..47e8f61a 100644 --- a/lib/l10n/intl_el.arb +++ b/lib/l10n/intl_el.arb @@ -1,6 +1,14 @@ { "@@locale": "el", - "@@last_modified": "2022-06-15T19:44:34+02:00", + "@@last_modified": "2022-06-16T18:20:12+02:00", + "tooltipPreviewFormatting": "Preview Message Formatting", + "tooltipCode": "Code \/ Monospace", + "tooltipStrikethrough": "Strikethrough", + "tooltipSubscript": "Subscript", + "tooltipSuperscript": "Superscript", + "tooltipItalicize": "Italic", + "tooltipBackToMessageEditing": "Back to Message Editing", + "tooltipBoldText": "Bold", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'", "settingAndroidPowerExemptionDescription": "Optional: Request Android to exempt Cwtch from optimized power management. This will result in better stability at the cost of greater battery use.", diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index b07a32dc..8ba1033c 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -1,6 +1,14 @@ { "@@locale": "en", - "@@last_modified": "2022-06-15T19:44:34+02:00", + "@@last_modified": "2022-06-16T18:20:12+02:00", + "tooltipPreviewFormatting": "Preview Message Formatting", + "tooltipCode": "Code \/ Monospace", + "tooltipStrikethrough": "Strikethrough", + "tooltipSubscript": "Subscript", + "tooltipSuperscript": "Superscript", + "tooltipItalicize": "Italic", + "tooltipBackToMessageEditing": "Back to Message Editing", + "tooltipBoldText": "Bold", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'", "settingAndroidPowerExemptionDescription": "Optional: Request Android to exempt Cwtch from optimized power management. This will result in better stability at the cost of greater battery use.", diff --git a/lib/l10n/intl_es.arb b/lib/l10n/intl_es.arb index caa8d16e..b4ca4af8 100644 --- a/lib/l10n/intl_es.arb +++ b/lib/l10n/intl_es.arb @@ -1,6 +1,14 @@ { "@@locale": "es", - "@@last_modified": "2022-06-15T19:44:34+02:00", + "@@last_modified": "2022-06-16T18:20:12+02:00", + "tooltipPreviewFormatting": "Preview Message Formatting", + "tooltipCode": "Code \/ Monospace", + "tooltipStrikethrough": "Strikethrough", + "tooltipSubscript": "Subscript", + "tooltipSuperscript": "Superscript", + "tooltipItalicize": "Italic", + "tooltipBackToMessageEditing": "Back to Message Editing", + "tooltipBoldText": "Bold", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'", "settingAndroidPowerExemptionDescription": "Optional: Request Android to exempt Cwtch from optimized power management. This will result in better stability at the cost of greater battery use.", diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index 5381a9b3..cd4d5e5a 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -1,6 +1,14 @@ { "@@locale": "fr", - "@@last_modified": "2022-06-15T19:44:34+02:00", + "@@last_modified": "2022-06-16T18:20:12+02:00", + "tooltipPreviewFormatting": "Preview Message Formatting", + "tooltipCode": "Code \/ Monospace", + "tooltipStrikethrough": "Strikethrough", + "tooltipSubscript": "Subscript", + "tooltipSuperscript": "Superscript", + "tooltipItalicize": "Italic", + "tooltipBackToMessageEditing": "Back to Message Editing", + "tooltipBoldText": "Bold", "acceptGroupBtn": "Accepter", "settingAndroidPowerExemptionDescription": "Android applique par défaut un profil de gestion de l'énergie \"optimisé\" aux applications, ce qui peut entraîner leur arrêt ou leur suppression. Demandez à Android d'exempter Cwtch de ce profil pour une meilleure stabilité mais une plus grande consommation d'énergie.", "settingsAndroidPowerReenablePopup": "Impossible de réactiver l'optimisation de la batterie à partir de Cwtch. Veuillez aller dans Android \/ Paramètres \/ Apps \/ Cwtch \/ Batterie et régler l'utilisation sur 'Optimisé'.", diff --git a/lib/l10n/intl_it.arb b/lib/l10n/intl_it.arb index 60417df3..736ca3b0 100644 --- a/lib/l10n/intl_it.arb +++ b/lib/l10n/intl_it.arb @@ -1,6 +1,14 @@ { "@@locale": "it", - "@@last_modified": "2022-06-15T19:44:34+02:00", + "@@last_modified": "2022-06-16T18:20:12+02:00", + "tooltipPreviewFormatting": "Preview Message Formatting", + "tooltipCode": "Code \/ Monospace", + "tooltipStrikethrough": "Strikethrough", + "tooltipSubscript": "Subscript", + "tooltipSuperscript": "Superscript", + "tooltipItalicize": "Italic", + "tooltipBackToMessageEditing": "Back to Message Editing", + "tooltipBoldText": "Bold", "settingsAndroidPowerReenablePopup": "Impossibile riattivare l'ottimizzazione della batteria dall'interno di Cwtch. Vai su Android \/ Impostazioni \/ Apps \/ Cwtch \/ Informazioni App \/ (Utilizzo) Batteria e imposta su 'Ottimizzato'.", "puzzleGameBtn": "Gioco di puzzle", "editProfileTitle": "Modifica il profilo", diff --git a/lib/l10n/intl_lb.arb b/lib/l10n/intl_lb.arb index e93dbcd8..3bca9aa5 100644 --- a/lib/l10n/intl_lb.arb +++ b/lib/l10n/intl_lb.arb @@ -1,6 +1,14 @@ { "@@locale": "lb", - "@@last_modified": "2022-06-15T19:44:34+02:00", + "@@last_modified": "2022-06-16T18:20:12+02:00", + "tooltipPreviewFormatting": "Preview Message Formatting", + "tooltipCode": "Code \/ Monospace", + "tooltipStrikethrough": "Strikethrough", + "tooltipSubscript": "Subscript", + "tooltipSuperscript": "Superscript", + "tooltipItalicize": "Italic", + "tooltipBackToMessageEditing": "Back to Message Editing", + "tooltipBoldText": "Bold", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'", "settingAndroidPowerExemptionDescription": "Optional: Request Android to exempt Cwtch from optimized power management. This will result in better stability at the cost of greater battery use.", diff --git a/lib/l10n/intl_no.arb b/lib/l10n/intl_no.arb index 0351363e..d228f320 100644 --- a/lib/l10n/intl_no.arb +++ b/lib/l10n/intl_no.arb @@ -1,6 +1,14 @@ { "@@locale": "no", - "@@last_modified": "2022-06-15T19:44:34+02:00", + "@@last_modified": "2022-06-16T18:20:12+02:00", + "tooltipPreviewFormatting": "Preview Message Formatting", + "tooltipCode": "Code \/ Monospace", + "tooltipStrikethrough": "Strikethrough", + "tooltipSubscript": "Subscript", + "tooltipSuperscript": "Superscript", + "tooltipItalicize": "Italic", + "tooltipBackToMessageEditing": "Back to Message Editing", + "tooltipBoldText": "Bold", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'", "settingAndroidPowerExemptionDescription": "Optional: Request Android to exempt Cwtch from optimized power management. This will result in better stability at the cost of greater battery use.", diff --git a/lib/l10n/intl_pl.arb b/lib/l10n/intl_pl.arb index cb974395..3fb48d32 100644 --- a/lib/l10n/intl_pl.arb +++ b/lib/l10n/intl_pl.arb @@ -1,6 +1,14 @@ { "@@locale": "pl", - "@@last_modified": "2022-06-15T19:44:34+02:00", + "@@last_modified": "2022-06-16T18:20:12+02:00", + "tooltipPreviewFormatting": "Preview Message Formatting", + "tooltipCode": "Code \/ Monospace", + "tooltipStrikethrough": "Strikethrough", + "tooltipSubscript": "Subscript", + "tooltipSuperscript": "Superscript", + "tooltipItalicize": "Italic", + "tooltipBackToMessageEditing": "Back to Message Editing", + "tooltipBoldText": "Bold", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Nie udało się ponownie włączyć optymalizacji użycia baterii dla Cwtch. Przejdź do Android \/ Ustawienia \/ Aplikacje \/ Cwtch \/ Bateria i ustaw Zużycie na 'Optymalizacja'", "settingAndroidPowerExemptionDescription": "Opcjonalne: wyłącz optymalizację użycia baterii przez Cwtch w systemie Android. Będzie to skutkować lepszą stabilnością w zamian za wyższy pobór energii", diff --git a/lib/l10n/intl_pt.arb b/lib/l10n/intl_pt.arb index b90ee446..3e6ab494 100644 --- a/lib/l10n/intl_pt.arb +++ b/lib/l10n/intl_pt.arb @@ -1,6 +1,14 @@ { "@@locale": "pt", - "@@last_modified": "2022-06-15T19:44:34+02:00", + "@@last_modified": "2022-06-16T18:20:12+02:00", + "tooltipPreviewFormatting": "Preview Message Formatting", + "tooltipCode": "Code \/ Monospace", + "tooltipStrikethrough": "Strikethrough", + "tooltipSubscript": "Subscript", + "tooltipSuperscript": "Superscript", + "tooltipItalicize": "Italic", + "tooltipBackToMessageEditing": "Back to Message Editing", + "tooltipBoldText": "Bold", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'", "settingAndroidPowerExemptionDescription": "Optional: Request Android to exempt Cwtch from optimized power management. This will result in better stability at the cost of greater battery use.", diff --git a/lib/l10n/intl_ro.arb b/lib/l10n/intl_ro.arb index 73a48f10..8edcd1ab 100644 --- a/lib/l10n/intl_ro.arb +++ b/lib/l10n/intl_ro.arb @@ -1,6 +1,14 @@ { "@@locale": "ro", - "@@last_modified": "2022-06-15T19:44:34+02:00", + "@@last_modified": "2022-06-16T18:20:12+02:00", + "tooltipPreviewFormatting": "Preview Message Formatting", + "tooltipCode": "Code \/ Monospace", + "tooltipStrikethrough": "Strikethrough", + "tooltipSubscript": "Subscript", + "tooltipSuperscript": "Superscript", + "tooltipItalicize": "Italic", + "tooltipBackToMessageEditing": "Back to Message Editing", + "tooltipBoldText": "Bold", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Cannot re-enable Battery Optimization from within Cwtch. Please go to Android \/ Settings \/ Apps \/ Cwtch \/ Battery and set Usage to 'Optimized'", "settingAndroidPowerExemptionDescription": "Optional: Request Android to exempt Cwtch from optimized power management. This will result in better stability at the cost of greater battery use.", diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index 712b4f60..d331216e 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -1,6 +1,14 @@ { "@@locale": "ru", - "@@last_modified": "2022-06-15T19:44:34+02:00", + "@@last_modified": "2022-06-16T18:20:12+02:00", + "tooltipPreviewFormatting": "Preview Message Formatting", + "tooltipCode": "Code \/ Monospace", + "tooltipStrikethrough": "Strikethrough", + "tooltipSubscript": "Subscript", + "tooltipSuperscript": "Superscript", + "tooltipItalicize": "Italic", + "tooltipBackToMessageEditing": "Back to Message Editing", + "tooltipBoldText": "Bold", "editProfile": "Изменить профиль", "okButton": "OK", "settingsAndroidPowerReenablePopup": "Невозможно перезапустить функцию оптимазации батарее для Cwtch. Перейдите в настройки Android \/ Настройки \/ Приложения и уведомления \/ Все приложения \/ Cwtch \/ Батарея \/ Эконоимя заряда \/ Отключена", diff --git a/lib/views/messageview.dart b/lib/views/messageview.dart index 81b2da6e..f96296fc 100644 --- a/lib/views/messageview.dart +++ b/lib/views/messageview.dart @@ -347,6 +347,7 @@ class _MessageViewState extends State { var showMessageFormattingPreview = Provider.of(context).isExperimentEnabled(FormattingExperiment); var preview = showMessageFormattingPreview ? IconButton( + tooltip: AppLocalizations.of(context)!.tooltipBackToMessageEditing, icon: Icon(Icons.text_fields), onPressed: () { setState(() { @@ -385,6 +386,7 @@ class _MessageViewState extends State { var bold = IconButton( icon: Icon(Icons.format_bold), + tooltip: AppLocalizations.of(context)!.tooltipBoldText, onPressed: () { setState(() { var selected = ctrlrCompose.selection.textInside(ctrlrCompose.text); @@ -398,6 +400,7 @@ class _MessageViewState extends State { var italic = IconButton( icon: Icon(Icons.format_italic), + tooltip: AppLocalizations.of(context)!.tooltipItalicize, onPressed: () { setState(() { var selected = ctrlrCompose.selection.textInside(ctrlrCompose.text); @@ -411,6 +414,7 @@ class _MessageViewState extends State { var code = IconButton( icon: Icon(Icons.code), + tooltip: AppLocalizations.of(context)!.tooltipCode, onPressed: () { setState(() { var selected = ctrlrCompose.selection.textInside(ctrlrCompose.text); @@ -424,6 +428,7 @@ class _MessageViewState extends State { var superscript = IconButton( icon: Icon(Icons.superscript), + tooltip: AppLocalizations.of(context)!.tooltipSuperscript, onPressed: () { setState(() { var selected = ctrlrCompose.selection.textInside(ctrlrCompose.text); @@ -437,6 +442,7 @@ class _MessageViewState extends State { var subscript = IconButton( icon: Icon(Icons.subscript), + tooltip: AppLocalizations.of(context)!.tooltipSubscript, onPressed: () { setState(() { var selected = ctrlrCompose.selection.textInside(ctrlrCompose.text); @@ -450,6 +456,7 @@ class _MessageViewState extends State { var strikethrough = IconButton( icon: Icon(Icons.format_strikethrough), + tooltip: AppLocalizations.of(context)!.tooltipStrikethrough, onPressed: () { setState(() { var selected = ctrlrCompose.selection.textInside(ctrlrCompose.text); @@ -463,6 +470,7 @@ class _MessageViewState extends State { var preview = IconButton( icon: Icon(Icons.text_format), + tooltip: AppLocalizations.of(context)!.tooltipPreviewFormatting, onPressed: () { setState(() { showPreview = true; -- 2.25.1 From 0d90219c8794394daabb857d44d629cb7f824411 Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Thu, 16 Jun 2022 09:40:55 -0700 Subject: [PATCH 7/7] Add Snackbar Notifications for all Copies --- lib/views/addeditprofileview.dart | 3 ++- lib/views/contactsview.dart | 2 ++ lib/widgets/serverrow.dart | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/views/addeditprofileview.dart b/lib/views/addeditprofileview.dart index e3c196d9..aaa64b3e 100644 --- a/lib/views/addeditprofileview.dart +++ b/lib/views/addeditprofileview.dart @@ -348,7 +348,8 @@ class _AddEditProfileViewState extends State { void _copyOnion() { Clipboard.setData(new ClipboardData(text: Provider.of(context, listen: false).onion)); - // TODO Toast + final snackBar = SnackBar(content: Text(AppLocalizations.of(context)!.copiedToClipboardNotification)); + ScaffoldMessenger.of(context).showSnackBar(snackBar); } void _createPressed() async { diff --git a/lib/views/contactsview.dart b/lib/views/contactsview.dart index e332e757..379a7949 100644 --- a/lib/views/contactsview.dart +++ b/lib/views/contactsview.dart @@ -156,6 +156,8 @@ class _ContactsViewState extends State { splashRadius: Material.defaultSplashRadius / 2, onPressed: () { Clipboard.setData(new ClipboardData(text: Provider.of(context, listen: false).onion)); + final snackBar = SnackBar(content: Text(AppLocalizations.of(context)!.copiedToClipboardNotification)); + ScaffoldMessenger.of(context).showSnackBar(snackBar); })); // Manage known Servers diff --git a/lib/widgets/serverrow.dart b/lib/widgets/serverrow.dart index 86f1c821..d8c245d8 100644 --- a/lib/widgets/serverrow.dart +++ b/lib/widgets/serverrow.dart @@ -61,6 +61,8 @@ class _ServerRowState extends State { icon: Icon(CwtchIcons.address_copy_2, color: Provider.of(context).current().mainTextColor), onPressed: () { Clipboard.setData(new ClipboardData(text: server.serverBundle)); + final snackBar = SnackBar(content: Text(AppLocalizations.of(context)!.copiedToClipboardNotification)); + ScaffoldMessenger.of(context).showSnackBar(snackBar); }, ), -- 2.25.1