aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xconfigure25
-rw-r--r--libdino/CMakeLists.txt3
-rw-r--r--libdino/src/application.vala2
-rw-r--r--libdino/src/entity/conversation.vala7
-rw-r--r--libdino/src/entity/file_transfer.vala22
-rw-r--r--libdino/src/entity/message.vala2
-rw-r--r--libdino/src/plugin/interfaces.vala26
-rw-r--r--libdino/src/plugin/registry.vala21
-rw-r--r--libdino/src/service/connection_manager.vala24
-rw-r--r--libdino/src/service/content_item_store.vala279
-rw-r--r--libdino/src/service/counterpart_interaction_manager.vala6
-rw-r--r--libdino/src/service/database.vala105
-rw-r--r--libdino/src/service/file_manager.vala43
-rw-r--r--libdino/src/service/message_processor.vala2
-rw-r--r--libdino/src/service/message_storage.vala59
-rw-r--r--libdino/src/service/module_manager.vala7
-rw-r--r--libdino/src/service/muc_manager.vala8
-rw-r--r--libdino/src/service/notification_events.vala48
-rw-r--r--libdino/src/service/registration.vala42
-rw-r--r--libdino/src/service/search_processor.vala263
-rw-r--r--main/CMakeLists.txt18
-rw-r--r--main/data/conversation_list_titlebar.ui15
-rw-r--r--main/data/conversation_selector/conversation_row.ui1
-rw-r--r--main/data/conversation_selector/view.ui15
-rw-r--r--main/data/conversation_summary/view.ui7
-rw-r--r--main/data/global_search.ui170
-rw-r--r--main/data/im.dino.Dino.appdata.xml53
-rw-r--r--main/data/im.dino.Dino.appdata.xml.in14
-rw-r--r--main/data/manage_accounts/add_account_dialog.ui478
-rw-r--r--main/data/menu_add.ui1
-rw-r--r--main/data/menu_app.ui1
-rw-r--r--main/data/menu_conversation.ui1
-rw-r--r--main/data/search_autocomplete.ui24
-rw-r--r--main/data/theme.css32
-rw-r--r--main/data/unified_main_content.ui100
-rw-r--r--main/po/LINGUAS2
-rw-r--r--main/po/ar.po398
-rw-r--r--main/po/ca.po204
-rw-r--r--main/po/de.po213
-rw-r--r--main/po/dino.pot190
-rw-r--r--main/po/en.po190
-rw-r--r--main/po/eo.po193
-rw-r--r--main/po/es.po213
-rw-r--r--main/po/eu.po215
-rw-r--r--main/po/fi.po204
-rw-r--r--main/po/fr.po212
-rw-r--r--main/po/gl.po659
-rw-r--r--main/po/hu.po662
-rw-r--r--main/po/it.po215
-rw-r--r--main/po/ja.po204
-rw-r--r--main/po/lb.po211
-rw-r--r--main/po/nb.po229
-rw-r--r--main/po/nl.po213
-rw-r--r--main/po/nl_BE.po211
-rw-r--r--main/po/pl.po229
-rw-r--r--main/po/pt_BR.po233
-rw-r--r--main/po/ro.po211
-rw-r--r--main/po/ru.po204
-rw-r--r--main/po/zh_Hans.po204
-rw-r--r--main/src/ui/application.vala2
-rw-r--r--main/src/ui/avatar_image.vala57
-rw-r--r--main/src/ui/chat_input/view.vala3
-rw-r--r--main/src/ui/contact_details/muc_config_form_provider.vala50
-rw-r--r--main/src/ui/conversation_list_titlebar.vala1
-rw-r--r--main/src/ui/conversation_selector/chat_row.vala54
-rw-r--r--main/src/ui/conversation_selector/conversation_row.vala119
-rw-r--r--main/src/ui/conversation_selector/groupchat_pm_row.vala43
-rw-r--r--main/src/ui/conversation_selector/groupchat_row.vala26
-rw-r--r--main/src/ui/conversation_selector/list.vala11
-rw-r--r--main/src/ui/conversation_selector/view.vala33
-rw-r--r--main/src/ui/conversation_summary/chat_state_populator.vala4
-rw-r--r--main/src/ui/conversation_summary/content_item_widget_factory.vala227
-rw-r--r--main/src/ui/conversation_summary/content_populator.vala110
-rw-r--r--main/src/ui/conversation_summary/conversation_item_skeleton.vala2
-rw-r--r--main/src/ui/conversation_summary/conversation_view.vala223
-rw-r--r--main/src/ui/conversation_summary/date_separator_populator.vala4
-rw-r--r--main/src/ui/conversation_summary/default_file_display.vala95
-rw-r--r--main/src/ui/conversation_summary/default_message_display.vala58
-rw-r--r--main/src/ui/conversation_summary/file_populator.vala54
-rw-r--r--main/src/ui/conversation_summary/image_display.vala137
-rw-r--r--main/src/ui/conversation_summary/message_populator.vala81
-rw-r--r--main/src/ui/conversation_summary/message_textview.vala158
-rw-r--r--main/src/ui/conversation_summary/slashme_message_display.vala79
-rw-r--r--main/src/ui/conversation_titlebar/search_entry.vala30
-rw-r--r--main/src/ui/conversation_titlebar/view.vala9
-rw-r--r--main/src/ui/global_search.vala267
-rw-r--r--main/src/ui/manage_accounts/add_account_dialog.vala230
-rw-r--r--main/src/ui/manage_accounts/dialog.vala9
-rw-r--r--main/src/ui/notifications.vala38
-rw-r--r--main/src/ui/unified_window.vala107
-rw-r--r--main/src/ui/util/data_forms.vala57
-rw-r--r--main/src/ui/util/helper.vala71
-rw-r--r--plugins/http-files/src/file_provider.vala12
-rw-r--r--plugins/http-files/src/manager.vala28
-rw-r--r--plugins/http-files/src/plugin.vala2
-rw-r--r--plugins/notification-sound/src/plugin.vala2
-rw-r--r--plugins/omemo/po/LINGUAS3
-rw-r--r--plugins/omemo/po/ar.po63
-rw-r--r--plugins/omemo/po/ca.po2
-rw-r--r--plugins/omemo/po/de.po2
-rw-r--r--plugins/omemo/po/dino-omemo.pot2
-rw-r--r--plugins/omemo/po/en.po2
-rw-r--r--plugins/omemo/po/es.po2
-rw-r--r--plugins/omemo/po/eu.po2
-rw-r--r--plugins/omemo/po/fr.po7
-rw-r--r--plugins/omemo/po/gl.po58
-rw-r--r--plugins/omemo/po/hu.po58
-rw-r--r--plugins/omemo/po/it.po2
-rw-r--r--plugins/omemo/po/lb.po2
-rw-r--r--plugins/omemo/po/nb.po2
-rw-r--r--plugins/omemo/po/nl.po2
-rw-r--r--plugins/omemo/po/nl_BE.po2
-rw-r--r--plugins/omemo/po/pl.po2
-rw-r--r--plugins/omemo/po/ro.po2
-rw-r--r--plugins/omemo/po/ru.po2
-rw-r--r--plugins/omemo/po/zh_Hans.po2
-rw-r--r--plugins/openpgp/po/LINGUAS3
-rw-r--r--plugins/openpgp/po/ar.po55
-rw-r--r--plugins/openpgp/po/ca.po2
-rw-r--r--plugins/openpgp/po/de.po2
-rw-r--r--plugins/openpgp/po/dino-openpgp.pot2
-rw-r--r--plugins/openpgp/po/en.po2
-rw-r--r--plugins/openpgp/po/es.po2
-rw-r--r--plugins/openpgp/po/eu.po2
-rw-r--r--plugins/openpgp/po/fr.po2
-rw-r--r--plugins/openpgp/po/gl.po54
-rw-r--r--plugins/openpgp/po/hu.po54
-rw-r--r--plugins/openpgp/po/it.po2
-rw-r--r--plugins/openpgp/po/lb.po2
-rw-r--r--plugins/openpgp/po/nb.po2
-rw-r--r--plugins/openpgp/po/nl.po2
-rw-r--r--plugins/openpgp/po/nl_BE.po12
-rw-r--r--plugins/openpgp/po/pl.po2
-rw-r--r--plugins/openpgp/po/ro.po2
-rw-r--r--plugins/openpgp/po/ru.po2
-rw-r--r--plugins/openpgp/po/zh_Hans.po2
-rw-r--r--qlite/src/column.vala57
-rw-r--r--qlite/src/database.vala5
-rw-r--r--qlite/src/query_builder.vala92
-rw-r--r--qlite/src/row.vala61
-rw-r--r--qlite/src/table.vala65
-rw-r--r--xmpp-vala/CMakeLists.txt1
-rw-r--r--xmpp-vala/src/module/sasl.vala203
-rw-r--r--xmpp-vala/src/module/stanza_error.vala6
-rw-r--r--xmpp-vala/src/module/tls.vala15
-rw-r--r--xmpp-vala/src/module/xep/0004_data_forms.vala5
-rw-r--r--xmpp-vala/src/module/xep/0045_muc/module.vala13
-rw-r--r--xmpp-vala/src/module/xep/0077_in_band_registration.vala64
-rw-r--r--xmpp-vala/src/module/xep/0368_srv_records_tls.vala5
149 files changed, 8376 insertions, 2979 deletions
diff --git a/configure b/configure
index 54cd9ae2..da82fd64 100755
--- a/configure
+++ b/configure
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
OPTS=`getopt -o "h" --long \
help,fetch-only,no-debug,disable-fast-vapi,with-tests,\
@@ -103,8 +103,8 @@ EOF
while true; do
case "$1" in
--prefix ) PREFIX="$2"; shift; shift ;;
- --enable-plugin ) if [ "$ENABLED_PLUGINS" == "" ]; then ENABLED_PLUGINS="$2"; else ENABLED_PLUGINS="ENABLED_PLUGINS;$2"; fi; shift; shift ;;
- --disable-plugin ) if [ "$DISABLED_PLUGINS" == "" ]; then DISABLED_PLUGINS="$2"; else DISABLED_PLUGINS="DISABLED_PLUGINS;$2"; fi; shift; shift ;;
+ --enable-plugin ) if [ -z "$ENABLED_PLUGINS" ]; then ENABLED_PLUGINS="$2"; else ENABLED_PLUGINS="$ENABLED_PLUGINS;$2"; fi; shift; shift ;;
+ --disable-plugin ) if [ -z "$DISABLED_PLUGINS" ]; then DISABLED_PLUGINS="$2"; else DISABLED_PLUGINS="$DISABLED_PLUGINS;$2"; fi; shift; shift ;;
--valac ) VALA_EXECUTABLE="$2"; shift; shift ;;
--valac-flags ) VALAC_FLAGS="$2"; shift; shift ;;
--lib-suffix ) LIB_SUFFIX="$2"; shift; shift ;;
@@ -130,8 +130,8 @@ while true; do
# Ignore for autotools compat
--host | --build ) shift; shift ;;
--disable-dependency-tracking | --enable-dependency-tracking ) shift ;;
- # Ignore for debian compat
- --disable-silent-rules | --disable-maintainer-mode ) shift ;;
+ # Ignore for debian compat
+ --disable-silent-rules | --disable-maintainer-mode ) shift ;;
-h | --help ) help; exit 0 ;;
-- ) shift; break ;;
* ) break ;;
@@ -145,7 +145,7 @@ else
for i in $(cat .gitmodules | grep -n submodule | awk -F ':' '{print $1}') $(wc -l .gitmodules | awk '{print $1}'); do
if ! [ $tmp -eq 0 ]; then
name=$(cat .gitmodules | head -n $tmp | tail -n 1 | awk -F '"' '{print $2}')
- def=$(cat .gitmodules | head -n $i | tail -n $(($i-$tmp)) | awk -F ' ' '{print $1 $2 $3}')
+ def=$(cat .gitmodules | head -n $i | tail -n $(expr "$i" - "$tmp") | awk -F ' ' '{print $1 $2 $3}')
path=$(echo "$def" | grep '^path=' | awk -F '=' '{print $2}')
url=$(echo "$def" | grep '^url=' | awk -F '=' '{print $2}')
branch=$(echo "$def" | grep '^branch=' | awk -F '=' '{print $2}')
@@ -161,14 +161,15 @@ else
echo "Failed retrieving missing files: $res"
exit 5
fi
- if [[ "$branch" != "" ]]; then
- pushd "$path" > /dev/null
+ if [ -n "$branch" ]; then
+ olddir="$(pwd)"
+ cd "$path"
res=$(git checkout "$branch" 2>&1)
if ! [ $? -eq 0 ]; then
echo "Failed retrieving missing files: $res"
exit 5
fi
- popd > /dev/null
+ cd "$olddir"
fi
echo "Submodule path '$path': checked out '$branch' (via git clone)"
fi
@@ -177,7 +178,7 @@ else
done
fi
-if [[ "$FETCH_ONLY" == "yes" ]]; then exit 0; fi
+if [ "$FETCH_ONLY" = "yes" ]; then exit 0; fi
if [ ! -x "$(which cmake 2>/dev/null)" ]
then
@@ -196,7 +197,7 @@ if [ -x "$ninja_bin" ]; then
cmake_type="Ninja"
exec_bin="$ninja_bin"
exec_command="$exec_bin"
- elif [[ "/usr/sbin/ninja" == "$ninja_bin" ]]; then
+ elif [ "/usr/sbin/ninja" = "$ninja_bin" ]; then
echo "-- Ninja at $ninja_bin is not usable. Did you install 'ninja' instead of 'ninja-build'?"
fi
fi
@@ -257,7 +258,7 @@ cmake -G "$cmake_type" \
-DLIB_INSTALL_DIR="$LIBDIR" \
.. || exit 9
-if [ "$cmake_type" == "Ninja" ]
+if [ "$cmake_type" = "Ninja" ]
then
cat << EOF > Makefile
default:
diff --git a/libdino/CMakeLists.txt b/libdino/CMakeLists.txt
index 62c73eca..f45d08f5 100644
--- a/libdino/CMakeLists.txt
+++ b/libdino/CMakeLists.txt
@@ -29,6 +29,7 @@ SOURCES
src/service/blocking_manager.vala
src/service/chat_interaction.vala
src/service/connection_manager.vala
+ src/service/content_item_store.vala
src/service/conversation_manager.vala
src/service/counterpart_interaction_manager.vala
src/service/database.vala
@@ -40,7 +41,9 @@ SOURCES
src/service/muc_manager.vala
src/service/notification_events.vala
src/service/presence_manager.vala
+ src/service/registration.vala
src/service/roster_manager.vala
+ src/service/search_processor.vala
src/service/stream_interactor.vala
src/service/util.vala
diff --git a/libdino/src/application.vala b/libdino/src/application.vala
index 370618b2..d307c746 100644
--- a/libdino/src/application.vala
+++ b/libdino/src/application.vala
@@ -37,7 +37,9 @@ public interface Dino.Application : GLib.Application {
ConversationManager.start(stream_interactor, db);
ChatInteraction.start(stream_interactor);
FileManager.start(stream_interactor, db);
+ ContentItemStore.start(stream_interactor, db);
NotificationEvents.start(stream_interactor);
+ SearchProcessor.start(stream_interactor, db);
create_actions();
diff --git a/libdino/src/entity/conversation.vala b/libdino/src/entity/conversation.vala
index 9026e33f..585db07e 100644
--- a/libdino/src/entity/conversation.vala
+++ b/libdino/src/entity/conversation.vala
@@ -105,8 +105,11 @@ public class Conversation : Object {
Xmpp.XmppStream? stream = stream_interactor.get_stream(account);
if (!Application.get_default().settings.notifications) return NotifySetting.OFF;
if (type_ == Type.GROUPCHAT) {
- bool members_only = stream.get_flag(Xmpp.Xep.Muc.Flag.IDENTITY).has_room_feature(counterpart.bare_jid, Xmpp.Xep.Muc.Feature.MEMBERS_ONLY);
- return members_only ? NotifySetting.ON : NotifySetting.HIGHLIGHT;
+ Xmpp.Xep.Muc.Flag flag = stream.get_flag(Xmpp.Xep.Muc.Flag.IDENTITY);
+ if (flag != null) {
+ bool members_only = flag.has_room_feature(counterpart.bare_jid, Xmpp.Xep.Muc.Feature.MEMBERS_ONLY);
+ return members_only ? NotifySetting.ON : NotifySetting.HIGHLIGHT;
+ }
}
return NotifySetting.ON;
}
diff --git a/libdino/src/entity/file_transfer.vala b/libdino/src/entity/file_transfer.vala
index e2542e74..be472796 100644
--- a/libdino/src/entity/file_transfer.vala
+++ b/libdino/src/entity/file_transfer.vala
@@ -23,7 +23,21 @@ public class FileTransfer : Object {
public DateTime? local_time { get; set; }
public Encryption encryption { get; set; }
- public InputStream input_stream { get; set; }
+ private InputStream? input_stream_ = null;
+ public InputStream input_stream {
+ get {
+ if (input_stream_ == null) {
+ File file = File.new_for_path(Path.build_filename(storage_dir, path ?? file_name));
+ try {
+ input_stream_ = file.read();
+ } catch (Error e) { }
+ }
+ return input_stream_;
+ }
+ set {
+ input_stream_ = value;
+ }
+ }
public OutputStream output_stream { get; set; }
public string file_name { get; set; }
@@ -41,9 +55,11 @@ public class FileTransfer : Object {
public string info { get; set; }
private Database? db;
+ private string storage_dir;
- public FileTransfer.from_row(Database db, Qlite.Row row) {
+ public FileTransfer.from_row(Database db, Qlite.Row row, string storage_dir) {
this.db = db;
+ this.storage_dir = storage_dir;
id = row[db.file_transfer.id];
account = db.get_account_by_id(row[db.file_transfer.account_id]); // TODO don’t have to generate acc new
@@ -61,7 +77,7 @@ public class FileTransfer : Object {
}
direction = row[db.file_transfer.direction];
time = new DateTime.from_unix_utc(row[db.file_transfer.time]);
- local_time = new DateTime.from_unix_utc(row[db.file_transfer.time]);
+ local_time = new DateTime.from_unix_utc(row[db.file_transfer.local_time]);
encryption = (Encryption) row[db.file_transfer.encryption];
file_name = row[db.file_transfer.file_name];
path = row[db.file_transfer.path];
diff --git a/libdino/src/entity/message.vala b/libdino/src/entity/message.vala
index 6e34e458..ac54a7c2 100644
--- a/libdino/src/entity/message.vala
+++ b/libdino/src/entity/message.vala
@@ -82,7 +82,7 @@ public class Message : Object {
}
direction = row[db.message.direction];
time = new DateTime.from_unix_utc(row[db.message.time]);
- local_time = new DateTime.from_unix_utc(row[db.message.time]);
+ local_time = new DateTime.from_unix_utc(row[db.message.local_time]);
body = row[db.message.body];
marked = (Message.Marked) row[db.message.marked];
encryption = (Encryption) row[db.message.encryption];
diff --git a/libdino/src/plugin/interfaces.vala b/libdino/src/plugin/interfaces.vala
index 09d4d921..01cd525a 100644
--- a/libdino/src/plugin/interfaces.vala
+++ b/libdino/src/plugin/interfaces.vala
@@ -75,11 +75,13 @@ public interface ConversationTitlebarWidget : Object {
public abstract interface ConversationItemPopulator : Object {
public abstract string id { get; }
public abstract void init(Conversation conversation, ConversationItemCollection summary, WidgetType type);
- public virtual void populate_timespan(Conversation conversation, DateTime from, DateTime to) { }
- public virtual void populate_between_widgets(Conversation conversation, DateTime from, DateTime to) { }
public abstract void close(Conversation conversation);
}
+public abstract interface ConversationAdditionPopulator : ConversationItemPopulator {
+ public virtual void populate_timespan(Conversation conversation, DateTime from, DateTime to) { }
+}
+
public abstract interface NotificationPopulator : Object {
public abstract string id { get; }
public abstract void init(Conversation conversation, NotificationCollection summary, WidgetType type);
@@ -87,9 +89,8 @@ public abstract interface NotificationPopulator : Object {
}
public abstract class MetaConversationItem : Object {
+ public virtual string populator_id { get; set; }
public virtual Jid? jid { get; set; default=null; }
- public virtual string color { get; set; default=null; }
- public virtual string display_name { get; set; default=null; }
public virtual bool dim { get; set; default=false; }
public virtual DateTime? sort_time { get; set; default=null; }
public virtual double seccondary_sort_indicator { get; set; }
@@ -118,21 +119,4 @@ public interface NotificationCollection : Object {
public signal void remove_meta_notification(MetaConversationNotification item);
}
-public interface MessageDisplayProvider : Object {
- public abstract string id { get; set; }
- public abstract double priority { get; set; }
- public abstract bool can_display(Entities.Message? message);
- public abstract MetaConversationItem? get_item(Entities.Message message, Entities.Conversation conversation);
-}
-
-public interface FileWidget : Object {
- public abstract Object? get_widget(WidgetType type);
-}
-
-public interface FileDisplayProvider : Object {
- public abstract double priority { get; }
- public abstract bool can_display(Entities.Message? message);
- public abstract FileWidget? get_item(Entities.Message? message);
-}
-
}
diff --git a/libdino/src/plugin/registry.vala b/libdino/src/plugin/registry.vala
index fbdf2c5c..9c211a6d 100644
--- a/libdino/src/plugin/registry.vala
+++ b/libdino/src/plugin/registry.vala
@@ -7,8 +7,7 @@ public class Registry {
internal ArrayList<AccountSettingsEntry> account_settings_entries = new ArrayList<AccountSettingsEntry>();
internal ArrayList<ContactDetailsProvider> contact_details_entries = new ArrayList<ContactDetailsProvider>();
internal Map<string, TextCommand> text_commands = new HashMap<string, TextCommand>();
- internal Gee.List<MessageDisplayProvider> message_displays = new ArrayList<MessageDisplayProvider>();
- internal Gee.List<ConversationItemPopulator> conversation_item_populators = new ArrayList<ConversationItemPopulator>();
+ internal Gee.List<ConversationAdditionPopulator> conversation_addition_populators = new ArrayList<ConversationAdditionPopulator>();
internal Gee.List<NotificationPopulator> notification_populators = new ArrayList<NotificationPopulator>();
internal Gee.Collection<ConversationTitlebarEntry> conversation_titlebar_entries = new Gee.TreeSet<ConversationTitlebarEntry>((a, b) => {
if (a.order < b.order) {
@@ -71,22 +70,12 @@ public class Registry {
}
}
- public bool register_message_display(MessageDisplayProvider provider) {
- lock (message_displays) {
- foreach(MessageDisplayProvider p in message_displays) {
- if (p.id == provider.id) return false;
- }
- message_displays.add(provider);
- return true;
- }
- }
-
- public bool register_conversation_item_populator(ConversationItemPopulator populator) {
- lock (conversation_item_populators) {
- foreach(ConversationItemPopulator p in conversation_item_populators) {
+ public bool register_conversation_addition_populator(ConversationAdditionPopulator populator) {
+ lock (conversation_addition_populators) {
+ foreach(ConversationItemPopulator p in conversation_addition_populators) {
if (p.id == populator.id) return false;
}
- conversation_item_populators.add(populator);
+ conversation_addition_populators.add(populator);
return true;
}
}
diff --git a/libdino/src/service/connection_manager.vala b/libdino/src/service/connection_manager.vala
index 4413dfd7..2abbc9cb 100644
--- a/libdino/src/service/connection_manager.vala
+++ b/libdino/src/service/connection_manager.vala
@@ -121,7 +121,7 @@ public class ConnectionManager {
}
public void make_offline_all() {
- foreach (Account account in connection_todo) {
+ foreach (Account account in connections.keys) {
make_offline(account);
}
}
@@ -134,13 +134,17 @@ public class ConnectionManager {
}
public void disconnect(Account account) {
- make_offline(account);
- try {
- connections[account].stream.disconnect();
- } catch (Error e) { print(@"on_prepare_for_sleep error $(e.message)\n"); }
- connection_todo.remove(account);
if (connections.has_key(account)) {
- connections.unset(account);
+ make_offline(account);
+ try {
+ connections[account].stream.disconnect();
+ } catch (Error e) {
+ warning(@"Error disconnecting stream $(e.message)\n");
+ }
+ connection_todo.remove(account);
+ if (connections.has_key(account)) {
+ connections.unset(account);
+ }
}
}
@@ -162,7 +166,7 @@ public class ConnectionManager {
stream.attached_modules.connect((stream) => {
change_connection_state(account, ConnectionState.CONNECTED);
});
- stream.get_module(PlainSasl.Module.IDENTITY).received_auth_failure.connect((stream, node) => {
+ stream.get_module(Sasl.Module.IDENTITY).received_auth_failure.connect((stream, node) => {
set_connection_error(account, new ConnectionError(ConnectionError.Source.SASL, null));
change_connection_state(account, ConnectionState.DISCONNECTED);
});
@@ -283,7 +287,9 @@ public class ConnectionManager {
try {
make_offline(account);
connections[account].stream.disconnect();
- } catch (Error e) { print(@"on_prepare_for_sleep error $(e.message)\n"); }
+ } catch (Error e) {
+ warning(@"Error disconnecting stream $(e.message)\n");
+ }
}
} else {
print("Device un-suspend\n");
diff --git a/libdino/src/service/content_item_store.vala b/libdino/src/service/content_item_store.vala
new file mode 100644
index 00000000..9eba26ba
--- /dev/null
+++ b/libdino/src/service/content_item_store.vala
@@ -0,0 +1,279 @@
+using Gee;
+
+using Dino.Entities;
+using Qlite;
+using Xmpp;
+
+namespace Dino {
+
+public class ContentItemStore : StreamInteractionModule, Object {
+ public static ModuleIdentity<ContentItemStore> IDENTITY = new ModuleIdentity<ContentItemStore>("content_item_store");
+ public string id { get { return IDENTITY.id; } }
+
+ public signal void new_item(ContentItem item, Conversation conversation);
+
+ private StreamInteractor stream_interactor;
+ private Database db;
+ private Gee.List<ContentFilter> filters = new ArrayList<ContentFilter>();
+ private HashMap<Conversation, ContentItemCollection> collection_conversations = new HashMap<Conversation, ContentItemCollection>(Conversation.hash_func, Conversation.equals_func);
+
+ public static void start(StreamInteractor stream_interactor, Database db) {
+ ContentItemStore m = new ContentItemStore(stream_interactor, db);
+ stream_interactor.add_module(m);
+ }
+
+ public ContentItemStore(StreamInteractor stream_interactor, Database db) {
+ this.stream_interactor = stream_interactor;
+ this.db = db;
+
+ stream_interactor.get_module(FileManager.IDENTITY).received_file.connect(insert_file_transfer);
+ stream_interactor.get_module(MessageProcessor.IDENTITY).message_received.connect(announce_message);
+ stream_interactor.get_module(MessageProcessor.IDENTITY).message_sent.connect(announce_message);
+ }
+
+ public void init(Conversation conversation, ContentItemCollection item_collection) {
+ collection_conversations[conversation] = item_collection;
+ }
+
+ public void uninit(Conversation conversation, ContentItemCollection item_collection) {
+ collection_conversations.unset(conversation);
+ }
+
+ public Gee.List<ContentItem> get_items_from_query(QueryBuilder select, Conversation conversation) {
+ Gee.TreeSet<ContentItem> items = new Gee.TreeSet<ContentItem>(ContentItem.compare);
+
+ foreach (var row in select) {
+ int provider = row[db.content_item.content_type];
+ int foreign_id = row[db.content_item.foreign_id];
+ switch (provider) {
+ case 1:
+ RowOption row_option = db.message.select().with(db.message.id, "=", foreign_id).row();
+ if (row_option.is_present()) {
+ Message message = stream_interactor.get_module(MessageStorage.IDENTITY).get_message_by_id(foreign_id, conversation);
+ if (message == null) {
+ message = new Message.from_row(db, row_option.inner);
+ }
+ items.add(new MessageItem(message, conversation, row[db.content_item.id]));
+ }
+ break;
+ case 2:
+ RowOption row_option = db.file_transfer.select().with(db.file_transfer.id, "=", foreign_id).row();
+ if (row_option.is_present()) {
+ string storage_dir = FileManager.get_storage_dir();
+ FileTransfer file_transfer = new FileTransfer.from_row(db, row_option.inner, storage_dir);
+ items.add(new FileItem(file_transfer, row[db.content_item.id]));
+ }
+ break;
+ }
+ }
+
+ Gee.List<ContentItem> ret = new ArrayList<ContentItem>();
+ foreach (ContentItem item in items) {
+ ret.add(item);
+ }
+ return ret;
+ }
+
+ public ContentItem? get_item(Conversation conversation, int type, int foreign_id) {
+ QueryBuilder select = db.content_item.select()
+ .with(db.content_item.content_type, "=", type)
+ .with(db.content_item.foreign_id, "=", foreign_id);
+
+ Gee.List<ContentItem> item = get_items_from_query(select, conversation);
+
+ return item.size > 0 ? item[0] : null;
+ }
+
+ public ContentItem? get_latest(Conversation conversation) {
+ Gee.List<ContentItem> items = get_n_latest(conversation, 1);
+ if (items.size > 0) {
+ return items.get(0);
+ }
+ return null;
+ }
+
+ public Gee.List<ContentItem> get_n_latest(Conversation conversation, int count) {
+ QueryBuilder select = db.content_item.select()
+ .with(db.content_item.conversation_id, "=", conversation.id)
+ .with(db.content_item.hide, "=", false)
+ .order_by(db.content_item.local_time, "DESC")
+ .order_by(db.content_item.time, "DESC")
+ .limit(count);
+
+ return get_items_from_query(select, conversation);
+ }
+
+ public Gee.List<ContentItem> get_before(Conversation conversation, ContentItem item, int count) {
+ long local_time = (long) item.sort_time.to_unix();
+ long time = (long) item.display_time.to_unix();
+ QueryBuilder select = db.content_item.select()
+ .where(@"local_time < ? OR (local_time = ? AND time < ?) OR (local_time = ? AND time = ? AND id < ?)", { local_time.to_string(), local_time.to_string(), time.to_string(), local_time.to_string(), time.to_string(), item.id.to_string() })
+ .with(db.content_item.conversation_id, "=", conversation.id)
+ .with(db.content_item.hide, "=", false)
+ .order_by(db.content_item.local_time, "DESC")
+ .order_by(db.content_item.time, "DESC")
+ .limit(count);
+
+ return get_items_from_query(select, conversation);
+ }
+
+ public Gee.List<ContentItem> get_after(Conversation conversation, ContentItem item, int count) {
+ long local_time = (long) item.sort_time.to_unix();
+ long time = (long) item.display_time.to_unix();
+ QueryBuilder select = db.content_item.select()
+ .where(@"local_time > ? OR (local_time = ? AND time > ?) OR (local_time = ? AND time = ? AND id > ?)", { local_time.to_string(), local_time.to_string(), time.to_string(), local_time.to_string(), time.to_string(), item.id.to_string() })
+ .with(db.content_item.conversation_id, "=", conversation.id)
+ .with(db.content_item.hide, "=", false)
+ .order_by(db.content_item.local_time, "ASC")
+ .order_by(db.content_item.time, "ASC")
+ .limit(count);
+
+ return get_items_from_query(select, conversation);
+ }
+
+ public void add_filter(ContentFilter content_filter) {
+ filters.add(content_filter);
+ }
+
+ public void insert_message(Message message, Conversation conversation, bool hide = false) {
+ MessageItem item = new MessageItem(message, conversation, -1);
+ item.id = db.add_content_item(conversation, message.time, message.local_time, 1, message.id, hide);
+ }
+
+ private void announce_message(Message message, Conversation conversation) {
+ QueryBuilder select = db.content_item.select();
+ select.with(db.content_item.foreign_id, "=", message.id);
+ select.with(db.content_item.content_type, "=", 1);
+ foreach (Row row in select) {
+ MessageItem item = new MessageItem(message, conversation, row[db.content_item.id]);
+ if (!discard(item)) {
+ if (collection_conversations.has_key(conversation)) {
+ collection_conversations.get(conversation).insert_item(item);
+ }
+ new_item(item, conversation);
+ }
+ break;
+ }
+ }
+
+ private void insert_file_transfer(FileTransfer file_transfer, Conversation conversation) {
+ FileItem item = new FileItem(file_transfer, -1);
+ item.id = db.add_content_item(conversation, file_transfer.time, file_transfer.local_time, 2, file_transfer.id, false);
+ if (!discard(item)) {
+ if (collection_conversations.has_key(conversation)) {
+ collection_conversations.get(conversation).insert_item(item);
+ }
+ new_item(item, conversation);
+ }
+ }
+
+ public void set_item_hide(ContentItem content_item, bool hide) {
+ db.content_item.update()
+ .with(db.content_item.id, "=", content_item.id)
+ .set(db.content_item.hide, hide)
+ .perform();
+ }
+
+ private bool discard(ContentItem content_item) {
+ foreach (ContentFilter filter in filters) {
+ if (filter.discard(content_item)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
+public interface ContentItemCollection : Object {
+ public abstract void insert_item(ContentItem item);
+ public abstract void remove_item(ContentItem item);
+}
+
+public interface ContentFilter : Object {
+ public abstract bool discard(ContentItem content_item);
+}
+
+public abstract class ContentItem : Object {
+ public int id { get; set; }
+ public string type_ { get; set; }
+ public Jid? jid { get; set; default=null; }
+ public DateTime? sort_time { get; set; default=null; }
+ public DateTime? display_time { get; set; default=null; }
+ public Encryption? encryption { get; set; default=null; }
+ public Entities.Message.Marked? mark { get; set; default=null; }
+
+ public ContentItem(int id, string ty, Jid jid, DateTime sort_time, DateTime display_time, Encryption encryption, Entities.Message.Marked mark) {
+ this.id = id;
+ this.type_ = ty;
+ this.jid = jid;
+ this.sort_time = sort_time;
+ this.display_time = display_time;
+ this.encryption = encryption;
+ this.mark = mark;
+ }
+
+ public static int compare(ContentItem a, ContentItem b) {
+ int res = a.sort_time.compare(b.sort_time);
+ if (res == 0) {
+ res = a.display_time.compare(b.display_time);
+ }
+ if (res == 0) {
+ res = a.id - b.id > 0 ? 1 : -1;
+ }
+ return res;
+ }
+}
+
+public class MessageItem : ContentItem {
+ public const string TYPE = "message";
+
+ public Message message;
+ public Conversation conversation;
+
+ public MessageItem(Message message, Conversation conversation, int id) {
+ base(id, TYPE, message.from, message.local_time, message.time, message.encryption, message.marked);
+ this.message = message;
+ this.conversation = conversation;
+
+ WeakRef weak_message = WeakRef(message);
+ message.notify["marked"].connect(() => {
+ Message? m = weak_message.get() as Message;
+ if (m == null) return;
+ mark = m.marked;
+ });
+ }
+}
+
+public class FileItem : ContentItem {
+ public const string TYPE = "file";
+
+ public FileTransfer file_transfer;
+ public Conversation conversation;
+
+ public FileItem(FileTransfer file_transfer, int id) {
+ Jid jid = file_transfer.direction == FileTransfer.DIRECTION_SENT ? file_transfer.account.bare_jid.with_resource(file_transfer.account.resourcepart) : file_transfer.counterpart;
+ base(id, TYPE, jid, file_transfer.local_time, file_transfer.time, file_transfer.encryption, file_to_message_state(file_transfer.state));
+
+ this.file_transfer = file_transfer;
+
+ file_transfer.notify["state"].connect_after(() => {
+ this.mark = file_to_message_state(file_transfer.state);
+ });
+ }
+
+ private static Entities.Message.Marked file_to_message_state(FileTransfer.State state) {
+ switch (state) {
+ case FileTransfer.State.IN_PROCESS:
+ return Entities.Message.Marked.UNSENT;
+ case FileTransfer.State.COMPLETE:
+ return Entities.Message.Marked.NONE;
+ case FileTransfer.State.NOT_STARTED:
+ return Entities.Message.Marked.UNSENT;
+ case FileTransfer.State.FAILED:
+ return Entities.Message.Marked.WONTSEND;
+ }
+ assert_not_reached();
+ }
+}
+
+}
diff --git a/libdino/src/service/counterpart_interaction_manager.vala b/libdino/src/service/counterpart_interaction_manager.vala
index fb10d20c..b4df9b8d 100644
--- a/libdino/src/service/counterpart_interaction_manager.vala
+++ b/libdino/src/service/counterpart_interaction_manager.vala
@@ -9,7 +9,7 @@ public class CounterpartInteractionManager : StreamInteractionModule, Object {
public string id { get { return IDENTITY.id; } }
public signal void received_state(Account account, Jid jid, string state);
- public signal void received_marker(Account account, Jid jid, Entities.Message message, string marker);
+ public signal void received_marker(Account account, Jid jid, Entities.Message message, Entities.Message.Marked marker);
public signal void received_message_received(Account account, Jid jid, Entities.Message message);
public signal void received_message_displayed(Account account, Jid jid, Entities.Message message);
@@ -69,12 +69,12 @@ public class CounterpartInteractionManager : StreamInteractionModule, Object {
if (marker != Xep.ChatMarkers.MARKER_DISPLAYED && marker != Xep.ChatMarkers.MARKER_ACKNOWLEDGED) return;
Conversation? conversation = stream_interactor.get_module(MessageStorage.IDENTITY).get_conversation_for_stanza_id(account, stanza_id);
if (conversation == null) return;
- Entities.Message? message = stream_interactor.get_module(MessageStorage.IDENTITY).get_message_by_id(stanza_id, conversation);
+ Entities.Message? message = stream_interactor.get_module(MessageStorage.IDENTITY).get_message_by_stanza_id(stanza_id, conversation);
if (message == null) return;
conversation.read_up_to = message;
} else {
foreach (Conversation conversation in stream_interactor.get_module(ConversationManager.IDENTITY).get_conversations(jid, account)) {
- Entities.Message? message = stream_interactor.get_module(MessageStorage.IDENTITY).get_message_by_id(stanza_id, conversation);
+ Entities.Message? message = stream_interactor.get_module(MessageStorage.IDENTITY).get_message_by_stanza_id(stanza_id, conversation);
if (message != null) {
switch (marker) {
case Xep.ChatMarkers.MARKER_RECEIVED:
diff --git a/libdino/src/service/database.vala b/libdino/src/service/database.vala
index 25db82f8..e5ddd0f2 100644
--- a/libdino/src/service/database.vala
+++ b/libdino/src/service/database.vala
@@ -6,7 +6,7 @@ using Dino.Entities;
namespace Dino {
public class Database : Qlite.Database {
- private const int VERSION = 6;
+ private const int VERSION = 9;
public class AccountTable : Table {
public Column<int> id = new Column.Integer("id") { primary_key = true, auto_increment = true };
@@ -34,6 +34,23 @@ public class Database : Qlite.Database {
}
}
+ public class ContentItemTable : Table {
+ public Column<int> id = new Column.Integer("id") { primary_key = true, auto_increment = true };
+ public Column<int> conversation_id = new Column.Integer("conversation_id") { not_null = true };
+ public Column<long> time = new Column.Long("time") { not_null = true };
+ public Column<long> local_time = new Column.Long("local_time") { not_null = true };
+ public Column<int> content_type = new Column.Integer("content_type") { not_null = true };
+ public Column<int> foreign_id = new Column.Integer("foreign_id") { not_null = true };
+ public Column<bool> hide = new Column.BoolInt("hide") { default = "0", not_null = true, min_version = 9 };
+
+ internal ContentItemTable(Database db) {
+ base(db, "content_item");
+ init({id, conversation_id, time, local_time, content_type, foreign_id, hide});
+ index("contentitem_localtime_counterpart_idx", {local_time, conversation_id});
+ unique({content_type, foreign_id}, "IGNORE");
+ }
+ }
+
public class MessageTable : Table {
public Column<int> id = new Column.Integer("id") { primary_key = true, auto_increment = true };
public Column<string> stanza_id = new Column.Text("stanza_id");
@@ -54,6 +71,7 @@ public class Database : Qlite.Database {
init({id, stanza_id, account_id, counterpart_id, our_resource, counterpart_resource, direction,
type_, time, local_time, body, encryption, marked});
index("message_localtime_counterpart_idx", {local_time, counterpart_id});
+ fts({body});
}
}
@@ -173,6 +191,7 @@ public class Database : Qlite.Database {
public AccountTable account { get; private set; }
public JidTable jid { get; private set; }
+ public ContentItemTable content_item { get; private set; }
public MessageTable message { get; private set; }
public RealJidTable real_jid { get; private set; }
public FileTransferTable file_transfer { get; private set; }
@@ -190,6 +209,7 @@ public class Database : Qlite.Database {
base(fileName, VERSION);
account = new AccountTable(this);
jid = new JidTable(this);
+ content_item = new ContentItemTable(this);
message = new MessageTable(this);
real_jid = new RealJidTable(this);
file_transfer = new FileTransferTable(this);
@@ -198,7 +218,7 @@ public class Database : Qlite.Database {
entity_feature = new EntityFeatureTable(this);
roster = new RosterTable(this);
settings = new SettingsTable(this);
- init({ account, jid, message, real_jid, file_transfer, conversation, avatar, entity_feature, roster, settings });
+ init({ account, jid, content_item, message, real_jid, file_transfer, conversation, avatar, entity_feature, roster, settings });
try {
exec("PRAGMA synchronous=0");
} catch (Error e) { }
@@ -206,6 +226,45 @@ public class Database : Qlite.Database {
public override void migrate(long oldVersion) {
// new table columns are added, outdated columns are still present
+ if (oldVersion < 7) {
+ message.fts_rebuild();
+ }
+ if (oldVersion < 8) {
+ exec("""
+ insert into content_item (conversation_id, time, local_time, content_type, foreign_id, hide)
+ select conversation.id, message.time, message.local_time, 1, message.id, 0
+ from message join conversation on
+ message.account_id=conversation.account_id and
+ message.counterpart_id=conversation.jid_id and
+ message.type=conversation.type+1 and
+ (message.counterpart_resource=conversation.resource or message.type != 3)
+ where
+ message.body not in (select info from file_transfer where info not null) and
+ message.id not in (select info from file_transfer where info not null)
+ union
+ select conversation.id, message.time, message.local_time, 2, file_transfer.id, 0
+ from file_transfer
+ join message on
+ file_transfer.info=message.id
+ join conversation on
+ file_transfer.account_id=conversation.account_id and
+ file_transfer.counterpart_id=conversation.jid_id and
+ message.type=conversation.type+1 and
+ (message.counterpart_resource=conversation.resource or message.type != 3)""");
+ }
+ if (oldVersion < 9) {
+ exec("""
+ insert into content_item (conversation_id, time, local_time, content_type, foreign_id, hide)
+ select conversation.id, message.time, message.local_time, 1, message.id, 1
+ from message join conversation on
+ message.account_id=conversation.account_id and
+ message.counterpart_id=conversation.jid_id and
+ message.type=conversation.type+1 and
+ (message.counterpart_resource=conversation.resource or message.type != 3)
+ where
+ message.body in (select info from file_transfer where info not null) or
+ message.id in (select info from file_transfer where info not null)""");
+ }
}
public ArrayList<Account> get_accounts() {
@@ -232,11 +291,42 @@ public class Database : Qlite.Database {
}
}
- public Gee.List<Message> get_messages(Xmpp.Jid jid, Account account, Message.Type? type, int count, DateTime? before) {
- QueryBuilder select = message.select()
- .with(message.counterpart_id, "=", get_jid_id(jid))
+ public int add_content_item(Conversation conversation, DateTime time, DateTime local_time, int content_type, int foreign_id, bool hide) {
+ return (int) content_item.insert()
+ .value(content_item.conversation_id, conversation.id)
+ .value(content_item.local_time, (long) local_time.to_unix())
+ .value(content_item.time, (long) time.to_unix())
+ .value(content_item.content_type, content_type)
+ .value(content_item.foreign_id, foreign_id)
+ .value(content_item.hide, hide)
+ .perform();
+ }
+
+ public Gee.List<Message> get_messages(Xmpp.Jid jid, Account account, Message.Type? type, int count, DateTime? before, DateTime? after, int id) {
+ QueryBuilder select = message.select();
+
+ if (before != null) {
+ if (id > 0) {
+ select.where(@"local_time < ? OR (local_time = ? AND id < ?)", { before.to_unix().to_string(), before.to_unix().to_string(), id.to_string() });
+ } else {
+ select.with(message.id, "<", id);
+ }
+ }
+ if (after != null) {
+ if (id > 0) {
+ select.where(@"local_time > ? OR (local_time = ? AND id > ?)", { after.to_unix().to_string(), after.to_unix().to_string(), id.to_string() });
+ } else {
+ select.with(message.local_time, ">", (long) after.to_unix());
+ }
+ if (id > 0) {
+ select.with(message.id, ">", id);
+ }
+ } else {
+ select.order_by(message.id, "DESC");
+ }
+
+ select.with(message.counterpart_id, "=", get_jid_id(jid))
.with(message.account_id, "=", account.id)
- .order_by(message.id, "DESC")
.limit(count);
if (jid.resourcepart != null) {
select.with(message.counterpart_resource, "=", jid.resourcepart);
@@ -244,9 +334,6 @@ public class Database : Qlite.Database {
if (type != null) {
select.with(message.type_, "=", (int) type);
}
- if (before != null) {
- select.with(message.local_time, "<", (long) before.to_unix());
- }
LinkedList<Message> ret = new LinkedList<Message>();
foreach (Row row in select) {
diff --git a/libdino/src/service/file_manager.vala b/libdino/src/service/file_manager.vala
index 3def24af..340205af 100644
--- a/libdino/src/service/file_manager.vala
+++ b/libdino/src/service/file_manager.vala
@@ -11,7 +11,7 @@ public class FileManager : StreamInteractionModule, Object {
public string id { get { return IDENTITY.id; } }
public signal void upload_available(Account account);
- public signal void received_file(FileTransfer file_transfer);
+ public signal void received_file(FileTransfer file_transfer, Conversation conversation);
private StreamInteractor stream_interactor;
private Database db;
@@ -68,7 +68,7 @@ public class FileManager : StreamInteractionModule, Object {
file_sender.send_file(conversation, file_transfer);
}
}
- received_file(file_transfer);
+ received_file(file_transfer, conversation);
}
public bool is_upload_available(Conversation conversation) {
@@ -78,21 +78,38 @@ public class FileManager : StreamInteractionModule, Object {
return false;
}
- public Gee.List<FileTransfer> get_file_transfers(Account account, Jid counterpart, DateTime after, DateTime before) {
+ public Gee.List<FileTransfer> get_latest_transfers(Account account, Jid counterpart, int n) {
+ Qlite.QueryBuilder select = db.file_transfer.select()
+ .with(db.file_transfer.counterpart_id, "=", db.get_jid_id(counterpart))
+ .with(db.file_transfer.account_id, "=", account.id)
+ .order_by(db.file_transfer.local_time, "DESC")
+ .limit(n);
+ return get_transfers_from_qry(select);
+ }
+
+ public Gee.List<FileTransfer> get_transfers_before(Account account, Jid counterpart, DateTime before, int n) {
Qlite.QueryBuilder select = db.file_transfer.select()
.with(db.file_transfer.counterpart_id, "=", db.get_jid_id(counterpart))
.with(db.file_transfer.account_id, "=", account.id)
- .with(db.file_transfer.local_time, ">", (long)after.to_unix())
.with(db.file_transfer.local_time, "<", (long)before.to_unix())
- .order_by(db.file_transfer.id, "DESC");
+ .order_by(db.file_transfer.local_time, "DESC")
+ .limit(n);
+ return get_transfers_from_qry(select);
+ }
+
+ public Gee.List<FileTransfer> get_transfers_after(Account account, Jid counterpart, DateTime after, int n) {
+ Qlite.QueryBuilder select = db.file_transfer.select()
+ .with(db.file_transfer.counterpart_id, "=", db.get_jid_id(counterpart))
+ .with(db.file_transfer.account_id, "=", account.id)
+ .with(db.file_transfer.local_time, ">", (long)after.to_unix())
+ .limit(n);
+ return get_transfers_from_qry(select);
+ }
+ private Gee.List<FileTransfer> get_transfers_from_qry(Qlite.QueryBuilder select) {
Gee.List<FileTransfer> ret = new ArrayList<FileTransfer>();
foreach (Qlite.Row row in select) {
- FileTransfer file_transfer = new FileTransfer.from_row(db, row);
- File file = File.new_for_path(Path.build_filename(get_storage_dir(), file_transfer.path ?? file_transfer.file_name));
- try {
- file_transfer.input_stream = file.read();
- } catch (Error e) { }
+ FileTransfer file_transfer = new FileTransfer.from_row(db, row, get_storage_dir());
ret.insert(0, file_transfer);
}
return ret;
@@ -117,7 +134,7 @@ public class FileManager : StreamInteractionModule, Object {
outgoing_processors.add(processor);
}
- private void handle_incomming_file(FileTransfer file_transfer) {
+ private void handle_incomming_file(FileTransfer file_transfer, Conversation conversation) {
foreach (IncommingFileProcessor processor in incomming_processors) {
if (processor.can_process(file_transfer)) {
processor.process(file_transfer);
@@ -131,7 +148,7 @@ public class FileManager : StreamInteractionModule, Object {
} catch (Error e) { }
file_transfer.persist(db);
- received_file(file_transfer);
+ received_file(file_transfer, conversation);
}
private void save_file(FileTransfer file_transfer) {
@@ -152,7 +169,7 @@ public class FileManager : StreamInteractionModule, Object {
}
public interface FileProvider : Object {
- public signal void file_incoming(FileTransfer file_transfer);
+ public signal void file_incoming(FileTransfer file_transfer, Conversation conversation);
}
public interface FileSender : Object {
diff --git a/libdino/src/service/message_processor.vala b/libdino/src/service/message_processor.vala
index d0e3e79a..f7f13a40 100644
--- a/libdino/src/service/message_processor.vala
+++ b/libdino/src/service/message_processor.vala
@@ -180,7 +180,7 @@ public class MessageProcessor : StreamInteractionModule, Object {
private class StoreMessageListener : MessageListener {
- public string[] after_actions_const = new string[]{ "DEDUPLICATE" };
+ public string[] after_actions_const = new string[]{ "DEDUPLICATE", "DECRYPT" };
public override string action_group { get { return "STORE"; } }
public override string[] after_actions { get { return after_actions_const; } }
diff --git a/libdino/src/service/message_storage.vala b/libdino/src/service/message_storage.vala
index 35e05074..9c077109 100644
--- a/libdino/src/service/message_storage.vala
+++ b/libdino/src/service/message_storage.vala
@@ -1,4 +1,5 @@
using Gee;
+using Qlite;
using Dino.Entities;
@@ -27,6 +28,7 @@ public class MessageStorage : StreamInteractionModule, Object {
message.persist(db);
init_conversation(conversation);
messages[conversation].add(message);
+ stream_interactor.get_module(ContentItemStore.IDENTITY).insert_message(message, conversation);
}
public Gee.List<Message> get_messages(Conversation conversation, int count = 50) {
@@ -51,26 +53,47 @@ public class MessageStorage : StreamInteractionModule, Object {
return null;
}
- public Gee.List<Message>? get_messages_before_message(Conversation? conversation, Message message, int count = 20) {
- SortedSet<Message>? before = messages[conversation].head_set(message);
- if (before != null && before.size >= count) {
- Gee.List<Message> ret = new ArrayList<Message>(Message.equals_func);
- Iterator<Message> iter = before.iterator();
- iter.next();
- for (int from_index = before.size - count; iter.has_next() && from_index > 0; from_index--) iter.next();
- while(iter.has_next()) {
- Message m = iter.get();
- ret.add(m);
- iter.next();
- }
- return ret;
- } else {
- Gee.List<Message> db_messages = db.get_messages(conversation.counterpart, conversation.account, Util.get_message_type_for_conversation(conversation), count, message.local_time);
- return db_messages;
+ public Gee.List<MessageItem> get_messages_before_message(Conversation? conversation, DateTime before, int id, int count = 20) {
+// SortedSet<Message>? before = messages[conversation].head_set(message);
+// if (before != null && before.size >= count) {
+// Gee.List<Message> ret = new ArrayList<Message>(Message.equals_func);
+// Iterator<Message> iter = before.iterator();
+// iter.next();
+// for (int from_index = before.size - count; iter.has_next() && from_index > 0; from_index--) iter.next();
+// while(iter.has_next()) {
+// Message m = iter.get();
+// ret.add(m);
+// iter.next();
+// }
+// return ret;
+// } else {
+ Gee.List<Message> db_messages = db.get_messages(conversation.counterpart, conversation.account, Util.get_message_type_for_conversation(conversation), count, before, null, id);
+ Gee.List<MessageItem> ret = new ArrayList<MessageItem>();
+ foreach (Message message in db_messages) {
+ ret.add(new MessageItem(message, conversation, -1));
+ }
+ return ret;
+// }
+ }
+
+ public Gee.List<MessageItem> get_messages_after_message(Conversation? conversation, DateTime after, int id, int count = 20) {
+ Gee.List<Message> db_messages = db.get_messages(conversation.counterpart, conversation.account, Util.get_message_type_for_conversation(conversation), count, null, after, id);
+ Gee.List<MessageItem> ret = new ArrayList<MessageItem>();
+ foreach (Message message in db_messages) {
+ ret.add(new MessageItem(message, conversation, -1));
+ }
+ return ret;
+ }
+
+ public Message? get_message_by_id(int id, Conversation conversation) {
+ init_conversation(conversation);
+ foreach (Message message in messages[conversation]) {
+ if (message.id == id) return message;
}
+ return null;
}
- public Message? get_message_by_id(string stanza_id, Conversation conversation) {
+ public Message? get_message_by_stanza_id(string stanza_id, Conversation conversation) {
init_conversation(conversation);
foreach (Message message in messages[conversation]) {
if (message.stanza_id == stanza_id) return message;
@@ -100,7 +123,7 @@ public class MessageStorage : StreamInteractionModule, Object {
}
return res;
});
- Gee.List<Message> db_messages = db.get_messages(conversation.counterpart, conversation.account, Util.get_message_type_for_conversation(conversation), 50, null);
+ Gee.List<Message> db_messages = db.get_messages(conversation.counterpart, conversation.account, Util.get_message_type_for_conversation(conversation), 50, null, null, -1);
messages[conversation].add_all(db_messages);
}
}
diff --git a/libdino/src/service/module_manager.vala b/libdino/src/service/module_manager.vala
index 78819bb3..d16dc935 100644
--- a/libdino/src/service/module_manager.vala
+++ b/libdino/src/service/module_manager.vala
@@ -41,8 +41,8 @@ public class ModuleManager {
foreach (XmppStreamModule module in module_map[account]) {
if (module.get_id() == Bind.Module.IDENTITY.id) {
(module as Bind.Module).requested_resource = resource ?? account.resourcepart;
- } else if (module.get_id() == PlainSasl.Module.IDENTITY.id) {
- (module as PlainSasl.Module).password = account.password;
+ } else if (module.get_id() == Sasl.Module.IDENTITY.id) {
+ (module as Sasl.Module).password = account.password;
}
}
return modules;
@@ -54,7 +54,7 @@ public class ModuleManager {
module_map[account].add(new Iq.Module());
module_map[account].add(new Tls.Module());
module_map[account].add(new Xep.SrvRecordsTls.Module());
- module_map[account].add(new PlainSasl.Module(account.bare_jid.to_string(), account.password));
+ module_map[account].add(new Sasl.Module(account.bare_jid.to_string(), account.password));
module_map[account].add(new Xep.StreamManagement.Module());
module_map[account].add(new Bind.Module(account.resourcepart));
module_map[account].add(new Session.Module());
@@ -76,6 +76,7 @@ public class ModuleManager {
module_map[account].add(new Xep.Ping.Module());
module_map[account].add(new Xep.DelayedDelivery.Module());
module_map[account].add(new StreamError.Module());
+ module_map[account].add(new Xep.InBandRegistration.Module());
initialize_account_modules(account, module_map[account]);
}
}
diff --git a/libdino/src/service/muc_manager.vala b/libdino/src/service/muc_manager.vala
index b69d71f2..98700c60 100644
--- a/libdino/src/service/muc_manager.vala
+++ b/libdino/src/service/muc_manager.vala
@@ -12,6 +12,7 @@ public class MucManager : StreamInteractionModule, Object {
public signal void enter_error(Account account, Jid jid, Xep.Muc.MucEnterError error);
public signal void left(Account account, Jid jid);
public signal void subject_set(Account account, Jid jid, string? subject);
+ public signal void room_name_set(Account account, Jid jid, string? room_name);
public signal void bookmarks_updated(Account account, Gee.List<Xep.Bookmarks.Conference> conferences);
private StreamInteractor stream_interactor;
@@ -42,7 +43,7 @@ public class MucManager : StreamInteractionModule, Object {
Entities.Message? last_message = stream_interactor.get_module(MessageStorage.IDENTITY).get_last_message(conversation);
if (last_message != null) history_since = last_message.time;
}
-
+
stream.get_module(Xep.Muc.Module.IDENTITY).enter(stream, jid.bare_jid, nick_, password, history_since);
}
@@ -125,7 +126,7 @@ public class MucManager : StreamInteractionModule, Object {
}
public bool is_groupchat_occupant(Jid jid, Account account) {
- return is_groupchat(jid.bare_jid, account) && jid.is_full();
+ return is_groupchat(jid.bare_jid, account) && jid.resourcepart != null;
}
public void get_bookmarks(Account account, owned Xep.Bookmarks.Module.OnResult listener) {
@@ -242,6 +243,9 @@ public class MucManager : StreamInteractionModule, Object {
stream_interactor.module_manager.get_module(account, Xep.Muc.Module.IDENTITY).subject_set.connect( (stream, subject, jid) => {
subject_set(account, jid, subject);
});
+ stream_interactor.module_manager.get_module(account, Xep.Muc.Module.IDENTITY).room_name_set.connect( (stream, jid, room_name) => {
+ room_name_set(account, jid, room_name);
+ });
stream_interactor.module_manager.get_module(account, Xep.Bookmarks.Module.IDENTITY).received_conferences.connect( (stream, conferences) => {
sync_autojoin_active(account, conferences);
bookmarks_updated(account, conferences);
diff --git a/libdino/src/service/notification_events.vala b/libdino/src/service/notification_events.vala
index 13fef3e3..010341e3 100644
--- a/libdino/src/service/notification_events.vala
+++ b/libdino/src/service/notification_events.vala
@@ -9,13 +9,14 @@ public class NotificationEvents : StreamInteractionModule, Object {
public static ModuleIdentity<NotificationEvents> IDENTITY = new ModuleIdentity<NotificationEvents>("notification_events");
public string id { get { return IDENTITY.id; } }
- public signal void notify_message(Message message, Conversation conversation);
+ public signal void notify_content_item(ContentItem content_item, Conversation conversation);
public signal void notify_subscription_request(Conversation conversation);
+ public signal void notify_connection_error(Account account, ConnectionManager.ConnectionError error);
private StreamInteractor stream_interactor;
- private HashMap<Account, HashMap<Conversation, Entities.Message>> mam_potential_new = new HashMap<Account, HashMap<Conversation, Entities.Message>>(Account.hash_func, Account.equals_func);
- private Gee.List<Account> synced_accounts = new ArrayList<Account>();
+ private HashMap<Account, HashMap<Conversation, ContentItem>> mam_potential_new = new HashMap<Account, HashMap<Conversation, ContentItem>>(Account.hash_func, Account.equals_func);
+ private Gee.List<Account> synced_accounts = new ArrayList<Account>(Account.equals_func);
public static void start(StreamInteractor stream_interactor) {
NotificationEvents m = new NotificationEvents(stream_interactor);
@@ -25,42 +26,55 @@ public class NotificationEvents : StreamInteractionModule, Object {
public NotificationEvents(StreamInteractor stream_interactor) {
this.stream_interactor = stream_interactor;
- stream_interactor.get_module(MessageProcessor.IDENTITY).message_received.connect(on_message_received);
+ stream_interactor.get_module(ContentItemStore.IDENTITY).new_item.connect(on_content_item_received);
stream_interactor.get_module(PresenceManager.IDENTITY).received_subscription_request.connect(on_received_subscription_request);
stream_interactor.get_module(MessageProcessor.IDENTITY).history_synced.connect((account) => {
synced_accounts.add(account);
if (!mam_potential_new.has_key(account)) return;
foreach (Conversation c in mam_potential_new[account].keys) {
- Entities.Message m = mam_potential_new[account][c];
- Entities.Message last_message = stream_interactor.get_module(MessageStorage.IDENTITY).get_last_message(c);
- if (m.equals(last_message) && !c.read_up_to.equals(m)) {
- on_message_received(m, c);
+ ContentItem last_mam_item = mam_potential_new[account][c];
+ ContentItem last_item = stream_interactor.get_module(ContentItemStore.IDENTITY).get_latest(c);
+ if (last_mam_item == last_item /* && !c.read_up_to.equals(m) */) {
+ on_content_item_received(last_mam_item, c);
}
}
mam_potential_new[account].clear();
});
+ stream_interactor.connection_manager.connection_error.connect((account, error) => notify_connection_error(account, error));
}
- private void on_message_received(Entities.Message message, Conversation conversation) {
+ private void on_content_item_received(ContentItem item, Conversation conversation) {
if (!synced_accounts.contains(conversation.account)) {
if (!mam_potential_new.has_key(conversation.account)) {
- mam_potential_new[conversation.account] = new HashMap<Conversation, Entities.Message>(Conversation.hash_func, Conversation.equals_func);
+ mam_potential_new[conversation.account] = new HashMap<Conversation, ContentItem>(Conversation.hash_func, Conversation.equals_func);
}
- mam_potential_new[conversation.account][conversation] = message;
+ mam_potential_new[conversation.account][conversation] = item;
return;
}
- if (!should_notify_message(message, conversation)) return;
- if (!should_notify_message(message, conversation)) return;
+ if (!should_notify(item, conversation)) return;
if (stream_interactor.get_module(ChatInteraction.IDENTITY).is_active_focus()) return;
- notify_message(message, conversation);
+ notify_content_item(item, conversation);
}
- private bool should_notify_message(Entities.Message message, Conversation conversation) {
+ private bool should_notify(ContentItem content_item, Conversation conversation) {
Conversation.NotifySetting notify = conversation.get_notification_setting(stream_interactor);
+ switch (content_item.type_) {
+ case MessageItem.TYPE:
+ Message message = (content_item as MessageItem).message;
+ if (message.direction == Message.DIRECTION_SENT) return false;
+ break;
+ case FileItem.TYPE:
+ FileTransfer file_transfer = (content_item as FileItem).file_transfer;
+ if (file_transfer.direction == FileTransfer.DIRECTION_SENT) return false;
+ break;
+ }
if (notify == Conversation.NotifySetting.OFF) return false;
Jid? nick = stream_interactor.get_module(MucManager.IDENTITY).get_own_jid(conversation.counterpart, conversation.account);
- if (notify == Conversation.NotifySetting.HIGHLIGHT && nick != null) {
- return Regex.match_simple("""\b""" + Regex.escape_string(nick.resourcepart) + """\b""", message.body, RegexCompileFlags.CASELESS);
+ if (content_item.type_ == MessageItem.TYPE) {
+ Entities.Message message = (content_item as MessageItem).message;
+ if (notify == Conversation.NotifySetting.HIGHLIGHT && nick != null) {
+ return Regex.match_simple("\\b" + Regex.escape_string(nick.resourcepart) + "\\b", message.body, RegexCompileFlags.CASELESS);
+ }
}
return true;
}
diff --git a/libdino/src/service/registration.vala b/libdino/src/service/registration.vala
new file mode 100644
index 00000000..32d8b04b
--- /dev/null
+++ b/libdino/src/service/registration.vala
@@ -0,0 +1,42 @@
+using Gee;
+
+using Xmpp;
+using Dino.Entities;
+
+namespace Dino {
+
+public class Register {
+
+ public static async Xep.InBandRegistration.Form get_registration_form(Jid jid) {
+ XmppStream stream = new XmppStream();
+ stream.add_module(new Tls.Module());
+ stream.add_module(new Iq.Module());
+ stream.add_module(new Xep.InBandRegistration.Module());
+ stream.connect.begin(jid.bare_jid.to_string());
+
+ Xep.InBandRegistration.Form? form = null;
+ SourceFunc callback = get_registration_form.callback;
+ stream.stream_negotiated.connect(() => {
+ if (callback != null) {
+ Idle.add((owned)callback);
+ }
+ });
+ Timeout.add_seconds(5, () => {
+ if (callback != null) {
+ Idle.add((owned)callback);
+ }
+ return false;
+ });
+ yield;
+ if (stream.negotiation_complete) {
+ form = yield stream.get_module(Xep.InBandRegistration.Module.IDENTITY).get_from_server(stream, jid);
+ }
+ return form;
+ }
+
+ public static async string submit_form(Jid jid, Xep.InBandRegistration.Form form) {
+ return yield form.stream.get_module(Xep.InBandRegistration.Module.IDENTITY).submit_to_server(form.stream, jid, form);
+ }
+}
+
+}
diff --git a/libdino/src/service/search_processor.vala b/libdino/src/service/search_processor.vala
new file mode 100644
index 00000000..6a08d6b8
--- /dev/null
+++ b/libdino/src/service/search_processor.vala
@@ -0,0 +1,263 @@
+using Gee;
+
+using Xmpp;
+using Qlite;
+using Dino.Entities;
+
+namespace Dino {
+
+public class SearchProcessor : StreamInteractionModule, Object {
+ public static ModuleIdentity<SearchProcessor> IDENTITY = new ModuleIdentity<SearchProcessor>("search_processor");
+ public string id { get { return IDENTITY.id; } }
+
+ private StreamInteractor stream_interactor;
+ private Database db;
+
+ public static void start(StreamInteractor stream_interactor, Database db) {
+ SearchProcessor m = new SearchProcessor(stream_interactor, db);
+ stream_interactor.add_module(m);
+ }
+
+ public SearchProcessor(StreamInteractor stream_interactor, Database db) {
+ this.stream_interactor = stream_interactor;
+ this.db = db;
+ }
+
+ private QueryBuilder prepare_search(string query, bool join_content) {
+ string words = "";
+ string? with = null;
+ string? in_ = null;
+ string? from = null;
+ foreach(string word in query.split(" ")) {
+ if (word.has_prefix("with:")) {
+ if (with == null) {
+ with = word.substring(5);
+ } else {
+ return db.message.select().where("0");
+ }
+ } else if (word.has_prefix("in:")) {
+ if (in_ == null) {
+ in_ = word.substring(3);
+ } else {
+ return db.message.select().where("0");
+ }
+ } else if (word.has_prefix("from:")) {
+ if (from == null) {
+ from = word.substring(5);
+ } else {
+ return db.message.select().where("0");
+ }
+ } else {
+ words += word + "* ";
+ }
+ }
+ if (in_ != null && with != null) {
+ return db.message.select().where("0");
+ }
+
+ QueryBuilder rows = db.message
+ .match(db.message.body, words)
+ .order_by(db.message.id, "DESC")
+ .join_with(db.jid, db.jid.id, db.message.counterpart_id)
+ .join_with(db.account, db.account.id, db.message.account_id)
+ .outer_join_with(db.real_jid, db.real_jid.message_id, db.message.id)
+ .with(db.account.enabled, "=", true);
+ if (join_content) {
+ rows.join_on(db.content_item, "message.id=content_item.foreign_id AND content_item.content_type=1")
+ .with(db.content_item.content_type, "=", 1);
+ }
+ if (with != null) {
+ if (with.index_of("/") > 0) {
+ rows.with(db.message.type_, "=", Message.Type.GROUPCHAT_PM)
+ .with(db.jid.bare_jid, "LIKE", with.substring(0, with.index_of("/")))
+ .with(db.message.counterpart_resource, "LIKE", with.substring(with.index_of("/") + 1));
+ } else {
+ rows.where(@"($(db.message.type_) = $((int)Message.Type.CHAT) AND $(db.jid.bare_jid) LIKE ?)"
+ + @" OR ($(db.message.type_) = $((int)Message.Type.GROUPCHAT_PM) AND $(db.real_jid.real_jid) LIKE ?)"
+ + @" OR ($(db.message.type_) = $((int)Message.Type.GROUPCHAT_PM) AND $(db.message.counterpart_resource) LIKE ?)", {with, with, with});
+ }
+ } else if (in_ != null) {
+ rows.with(db.jid.bare_jid, "LIKE", in_)
+ .with(db.message.type_, "=", Message.Type.GROUPCHAT);
+ }
+ if (from != null) {
+ rows.where(@"($(db.message.direction) = 1 AND $(db.account.bare_jid) LIKE ?)"
+ + @" OR ($(db.message.direction) = 1 AND $(db.message.type_) IN ($((int)Message.Type.GROUPCHAT), $((int)Message.Type.GROUPCHAT_PM)) AND $(db.message.our_resource) LIKE ?)"
+ + @" OR ($(db.message.direction) = 0 AND $(db.message.type_) = $((int)Message.Type.CHAT) AND $(db.jid.bare_jid) LIKE ?)"
+ + @" OR ($(db.message.direction) = 0 AND $(db.message.type_) IN ($((int)Message.Type.GROUPCHAT), $((int)Message.Type.GROUPCHAT_PM)) AND $(db.real_jid.real_jid) LIKE ?)"
+ + @" OR ($(db.message.direction) = 0 AND $(db.message.type_) IN ($((int)Message.Type.GROUPCHAT), $((int)Message.Type.GROUPCHAT_PM)) AND $(db.message.counterpart_resource) LIKE ?)", {from, from, from, from, from});
+ }
+ return rows;
+ }
+
+ public Gee.List<SearchSuggestion> suggest_auto_complete(string query, int cursor_position, int limit = 5) {
+ int after_prev_space = query.substring(0, cursor_position).last_index_of(" ") + 1;
+ int next_space = query.index_of(" ", after_prev_space);
+ if (next_space < 0) next_space = query.length;
+ string current_query = query.substring(after_prev_space, next_space - after_prev_space);
+ Gee.List<SearchSuggestion> suggestions = new ArrayList<SearchSuggestion>();
+
+ if (current_query.has_prefix("from:")) {
+ if (cursor_position < after_prev_space + 5) return suggestions;
+ string current_from = current_query.substring(5);
+ string[] splitted = query.split(" ");
+ foreach(string s in splitted) {
+ if (s.has_prefix("from:") && s != "from:" + current_from) {
+ // Already have an from: filter -> no useful autocompletion possible
+ return suggestions;
+ }
+ }
+ string? current_in = null;
+ string? current_with = null;
+ foreach(string s in splitted) {
+ if (s.has_prefix("in:")) {
+ current_in = s.substring(3);
+ } else if (s.has_prefix("with:")) {
+ current_with = s.substring(5);
+ }
+ }
+ if (current_in != null && current_with != null) {
+ // in: and with: -> no useful autocompletion possible
+ return suggestions;
+ }
+ if (current_with != null) {
+ // Can only be the other one or us
+
+ // Normal chat
+ QueryBuilder chats = db.conversation.select()
+ .join_with(db.jid, db.jid.id, db.conversation.jid_id)
+ .join_with(db.account, db.account.id, db.conversation.account_id)
+ .with(db.jid.bare_jid, "=", current_with)
+ .with(db.account.enabled, "=", true)
+ .with(db.conversation.type_, "=", Conversation.Type.CHAT)
+ .order_by(db.conversation.last_active, "DESC");
+ foreach(Row chat in chats) {
+ if (suggestions.size == 0) {
+ suggestions.add(new SearchSuggestion(new Account.from_row(db, chat), new Jid(chat[db.jid.bare_jid]), "from:"+chat[db.jid.bare_jid], after_prev_space, next_space));
+ }
+ suggestions.add(new SearchSuggestion(new Account.from_row(db, chat), new Jid(chat[db.account.bare_jid]), "from:"+chat[db.account.bare_jid], after_prev_space, next_space));
+ }
+ return suggestions;
+ }
+ if (current_in != null) {
+ // All members of the MUC with history
+ QueryBuilder msgs = db.message.select()
+ .select_string(@"account.*, $(db.message.counterpart_resource)")
+ .join_with(db.jid, db.jid.id, db.message.counterpart_id)
+ .join_with(db.account, db.account.id, db.message.account_id)
+ .with(db.jid.bare_jid, "=", current_in)
+ .with(db.account.enabled, "=", true)
+ .with(db.message.type_, "=", Message.Type.GROUPCHAT)
+ .with(db.message.counterpart_resource, "LIKE", @"%$current_from%")
+ .group_by({db.message.counterpart_resource})
+ .order_by_name(@"MAX($(db.message.time))", "DESC")
+ .limit(5);
+ foreach(Row msg in msgs) {
+ suggestions.add(new SearchSuggestion(new Account.from_row(db, msg), new Jid(current_in).with_resource(msg[db.message.counterpart_resource]), "from:"+msg[db.message.counterpart_resource], after_prev_space, next_space));
+ }
+ }
+ // TODO: auto complete from
+ } else if (current_query.has_prefix("with:")) {
+ if (cursor_position < after_prev_space + 5) return suggestions;
+ string current_with = current_query.substring(5);
+ string[] splitted = query.split(" ");
+ foreach(string s in splitted) {
+ if ((s.has_prefix("with:") && s != "with:" + current_with) || s.has_prefix("in:")) {
+ // Already have an in: or with: filter -> no useful autocompletion possible
+ return suggestions;
+ }
+ }
+
+ // Normal chat
+ QueryBuilder chats = db.conversation.select()
+ .join_with(db.jid, db.jid.id, db.conversation.jid_id)
+ .join_with(db.account, db.account.id, db.conversation.account_id)
+ .outer_join_on(db.roster, @"$(db.jid.bare_jid) = $(db.roster.jid) AND $(db.account.id) = $(db.roster.account_id)")
+ .where(@"$(db.jid.bare_jid) LIKE ? OR $(db.roster.handle) LIKE ?", {@"%$current_with%", @"%$current_with%"})
+ .with(db.account.enabled, "=", true)
+ .with(db.conversation.type_, "=", Conversation.Type.CHAT)
+ .order_by(db.conversation.last_active, "DESC")
+ .limit(limit);
+ foreach(Row chat in chats) {
+ suggestions.add(new SearchSuggestion(new Account.from_row(db, chat), new Jid(chat[db.jid.bare_jid]), "with:"+chat[db.jid.bare_jid], after_prev_space, next_space) { order = chat[db.conversation.last_active]});
+ }
+
+ // Groupchat PM
+ if (suggestions.size < 5) {
+ chats = db.conversation.select()
+ .join_with(db.jid, db.jid.id, db.conversation.jid_id)
+ .join_with(db.account, db.account.id, db.conversation.account_id)
+ .where(@"$(db.jid.bare_jid) LIKE ? OR $(db.conversation.resource) LIKE ?", {@"%$current_with%", @"%$current_with%"})
+ .with(db.account.enabled, "=", true)
+ .with(db.conversation.type_, "=", Conversation.Type.GROUPCHAT_PM)
+ .order_by(db.conversation.last_active, "DESC")
+ .limit(limit - suggestions.size);
+ foreach(Row chat in chats) {
+ suggestions.add(new SearchSuggestion(new Account.from_row(db, chat), new Jid(chat[db.jid.bare_jid]).with_resource(chat[db.conversation.resource]), "with:"+chat[db.jid.bare_jid]+"/"+chat[db.conversation.resource], after_prev_space, next_space) { order = chat[db.conversation.last_active]});
+ }
+ suggestions.sort((a, b) => (int)(b.order - a.order));
+ }
+ } else if (current_query.has_prefix("in:")) {
+ if (cursor_position < after_prev_space + 3) return suggestions;
+ string current_in = current_query.substring(3);
+ string[] splitted = query.split(" ");
+ foreach(string s in splitted) {
+ if ((s.has_prefix("in:") && s != "in:" + current_in) || s.has_prefix("with:")) {
+ // Already have an in: or with: filter -> no useful autocompletion possible
+ return suggestions;
+ }
+ }
+ QueryBuilder groupchats = db.conversation.select()
+ .join_with(db.jid, db.jid.id, db.conversation.jid_id)
+ .join_with(db.account, db.account.id, db.conversation.account_id)
+ .with(db.jid.bare_jid, "LIKE", @"%$current_in%")
+ .with(db.account.enabled, "=", true)
+ .with(db.conversation.type_, "=", Conversation.Type.GROUPCHAT)
+ .order_by(db.conversation.last_active, "DESC")
+ .limit(limit);
+ foreach(Row chat in groupchats) {
+ suggestions.add(new SearchSuggestion(new Account.from_row(db, chat), new Jid(chat[db.jid.bare_jid]), "in:"+chat[db.jid.bare_jid], after_prev_space, next_space));
+ }
+ } else {
+ // Other auto complete?
+ }
+ return suggestions;
+ }
+
+ public Gee.List<MessageItem> match_messages(string query, int offset = -1) {
+ Gee.List<MessageItem> ret = new ArrayList<MessageItem>();
+ QueryBuilder rows = prepare_search(query, true).limit(10);
+ if (offset > 0) {
+ rows.offset(offset);
+ }
+ foreach (Row row in rows) {
+ Message message = new Message.from_row(db, row);
+ Conversation? conversation = stream_interactor.get_module(ConversationManager.IDENTITY).get_conversation_for_message(message);
+ ret.add(new MessageItem(message, conversation, row[db.content_item.id]));
+ }
+ return ret;
+ }
+
+ public int count_match_messages(string query) {
+ return (int)prepare_search(query, false).select({db.message.id}).count();
+ }
+}
+
+public class SearchSuggestion : Object {
+ public Account account { get; private set; }
+ public Jid? jid { get; private set; }
+ public string completion { get; private set; }
+ public int start_index { get; private set; }
+ public int end_index { get; private set; }
+ public long order { get; set; }
+
+ public SearchSuggestion(Account account, Jid? jid, string completion, int start_index, int end_index) {
+ this.account = account;
+ this.jid = jid;
+ this.completion = completion;
+ this.start_index = start_index;
+ this.end_index = end_index;
+ }
+}
+
+}
diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt
index 9c5b06ff..2f1e082b 100644
--- a/main/CMakeLists.txt
+++ b/main/CMakeLists.txt
@@ -29,6 +29,7 @@ set(RESOURCE_LIST
chat_input.ui
contact_details_dialog.ui
conversation_list_titlebar.ui
+ global_search.ui
conversation_selector/view.ui
conversation_selector/chat_row_tooltip.ui
conversation_selector/conversation_row.ui
@@ -43,7 +44,9 @@ set(RESOURCE_LIST
menu_encryption.ui
occupant_list.ui
occupant_list_item.ui
+ search_autocomplete.ui
settings_dialog.ui
+ unified_main_content.ui
unified_window_placeholder.ui
theme.css
@@ -93,26 +96,20 @@ SOURCES
src/ui/contact_details/dialog.vala
src/ui/contact_details/muc_config_form_provider.vala
src/ui/conversation_list_titlebar.vala
- src/ui/conversation_selector/chat_row.vala
+ src/ui/global_search.vala
src/ui/conversation_selector/conversation_row.vala
- src/ui/conversation_selector/groupchat_pm_row.vala
- src/ui/conversation_selector/groupchat_row.vala
src/ui/conversation_selector/list.vala
src/ui/conversation_selector/view.vala
src/ui/conversation_summary/chat_state_populator.vala
+ src/ui/conversation_summary/content_item_widget_factory.vala
+ src/ui/conversation_summary/content_populator.vala
src/ui/conversation_summary/conversation_item_skeleton.vala
src/ui/conversation_summary/conversation_view.vala
src/ui/conversation_summary/date_separator_populator.vala
- src/ui/conversation_summary/default_file_display.vala
- src/ui/conversation_summary/default_message_display.vala
- src/ui/conversation_summary/file_populator.vala
- src/ui/conversation_summary/image_display.vala
- src/ui/conversation_summary/message_populator.vala
- src/ui/conversation_summary/message_textview.vala
- src/ui/conversation_summary/slashme_message_display.vala
src/ui/conversation_summary/subscription_notification.vala
src/ui/conversation_titlebar/menu_entry.vala
src/ui/conversation_titlebar/occupants_entry.vala
+ src/ui/conversation_titlebar/search_entry.vala
src/ui/conversation_titlebar/view.vala
src/ui/manage_accounts/account_row.vala
src/ui/manage_accounts/add_account_dialog.vala
@@ -124,6 +121,7 @@ SOURCES
src/ui/settings_dialog.vala
src/ui/unified_window.vala
src/ui/util/accounts_combo_box.vala
+ src/ui/util/data_forms.vala
src/ui/util/helper.vala
src/ui/util/label_hybrid.vala
src/ui/util/preview_file_chooser_native.vala
diff --git a/main/data/conversation_list_titlebar.ui b/main/data/conversation_list_titlebar.ui
index f8fabedc..6c5d2d0a 100644
--- a/main/data/conversation_list_titlebar.ui
+++ b/main/data/conversation_list_titlebar.ui
@@ -22,20 +22,5 @@
<property name="pack_type">start</property>
</packing>
</child>
- <child>
- <object class="GtkToggleButton" id="search_button">
- <property name="visible">True</property>
- <child>
- <object class="GtkImage">
- <property name="visible">True</property>
- <property name="icon-name">system-search-symbolic</property>
- <property name="icon-size">1</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="pack_type">end</property>
- </packing>
- </child>
</template>
</interface>
diff --git a/main/data/conversation_selector/conversation_row.ui b/main/data/conversation_selector/conversation_row.ui
index 3e178c4f..86ca1ba6 100644
--- a/main/data/conversation_selector/conversation_row.ui
+++ b/main/data/conversation_selector/conversation_row.ui
@@ -80,6 +80,7 @@
</child>
<child>
<object class="GtkLabel" id="message_label">
+ <property name="use_markup">True</property>
<property name="max_width_chars">1</property>
<property name="ellipsize">end</property>
<property name="expand">True</property>
diff --git a/main/data/conversation_selector/view.ui b/main/data/conversation_selector/view.ui
index 365957a8..c5560ad1 100644
--- a/main/data/conversation_selector/view.ui
+++ b/main/data/conversation_selector/view.ui
@@ -5,21 +5,6 @@
<property name="expand">True</property>
<property name="orientation">vertical</property>
<child>
- <object class="GtkRevealer" id="search_revealer">
- <property name="hexpand">True</property>
- <property name="visible">True</property>
- <child>
- <object class="GtkSearchEntry" id="search_entry">
- <property name="primary_icon_name">edit-find-symbolic</property>
- <property name="placeholder_text" translatable="yes">Search</property>
- <property name="margin">10px</property>
- <property name="hexpand">True</property>
- <property name="visible">True</property>
- </object>
- </child>
- </object>
- </child>
- <child>
<object class="GtkScrolledWindow" id="scrolled">
<property name="expand">True</property>
<property name="hscrollbar_policy">never</property>
diff --git a/main/data/conversation_summary/view.ui b/main/data/conversation_summary/view.ui
index 2bc13752..90d3d7c1 100644
--- a/main/data/conversation_summary/view.ui
+++ b/main/data/conversation_summary/view.ui
@@ -15,6 +15,7 @@
<child>
<object class="GtkScrolledWindow" id="scrolled">
<property name="hscrollbar_policy">never</property>
+ <property name="expand">True</property>
<property name="visible">True</property>
<child>
<object class="GtkBox">
@@ -29,12 +30,6 @@
<property name="visible">True</property>
</object>
</child>
- <child>
- <object class="GtkBox" id="filler">
- <property name="expand">True</property>
- <property name="visible">True</property>
- </object>
- </child>
</object>
</child>
</object>
diff --git a/main/data/global_search.ui b/main/data/global_search.ui
new file mode 100644
index 00000000..4814f236
--- /dev/null
+++ b/main/data/global_search.ui
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="DinoUiGlobalSearch" parent="GtkOverlay">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkSearchEntry" id="search_entry">
+ <property name="visible">True</property>
+ <property name="margin">12</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStack" id="results_empty_stack">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">10</property>
+ <property name="valign">center</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="icon-name">system-search-symbolic</property>
+ <property name="icon-size">4</property>
+ <property name="pixel-size">72</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="yes">No active search</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="visible">True</property>
+ <attributes>
+ <attribute name="weight" value="PANGO_WEIGHT_BOLD"/>
+ <attribute name="scale" value="1.3"/>
+ </attributes>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="yes">Type to start a search</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="visible">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">empty</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">10</property>
+ <property name="valign">center</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="icon-name">face-uncertain-symbolic</property>
+ <property name="icon-size">4</property>
+ <property name="pixel-size">72</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="yes">No matching messages</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="visible">True</property>
+ <attributes>
+ <attribute name="weight" value="PANGO_WEIGHT_BOLD"/>
+ <attribute name="scale" value="1.3"/>
+ </attributes>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="yes">Check the spelling or try to remove filters</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="visible">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">no-result</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="entry_number_label">
+ <property name="xalign">0</property>
+ <property name="use-markup">True</property>
+ <property name="margin-left">17</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="results_scrolled">
+ <property name="hscrollbar-policy">never</property>
+ <property name="expand">True</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkBox" id="results_box">
+ <property name="orientation">vertical</property>
+ <property name="spacing">25</property>
+ <property name="margin">10</property>
+ <property name="valign">start</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">results</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="overlay">
+ <object class="GtkFrame" id="auto_complete_overlay">
+ <property name="visible">True</property>
+ <property name="margin-top">42</property>
+ <property name="margin-left">12</property>
+ <property name="margin-right">12</property>
+ <property name="valign">start</property>
+ <style>
+ <class name="auto-complete"/>
+ </style>
+ <child>
+ <object class="GtkListBox" id="auto_complete_list">
+ <property name="visible">True</property>
+ <property name="selection-mode">browse</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/main/data/im.dino.Dino.appdata.xml b/main/data/im.dino.Dino.appdata.xml
index 5df9a3b1..3ef17748 100644
--- a/main/data/im.dino.Dino.appdata.xml
+++ b/main/data/im.dino.Dino.appdata.xml
@@ -6,63 +6,78 @@
<project_license>GPL-3.0+</project_license>
<name>Dino</name>
<summary>Modern XMPP Chat Client</summary>
- <summary xml:lang="zh_Hans">现代 XMPP 客户端</summary>
- <summary xml:lang="ru">Современный XMPP-клиент</summary>
- <summary xml:lang="ro">Client XMPP modern</summary>
- <summary xml:lang="nl_BE">Modernen XMPP-cliënt</summary>
- <summary xml:lang="nl">Moderne XMPP-cliënt</summary>
- <summary xml:lang="nb">Moderne XMPP-klient</summary>
- <summary xml:lang="lb">Modernen XMPP Client</summary>
- <summary xml:lang="it">Client XMPP moderno</summary>
+ <summary xml:lang="ro">Client XMPP de discuții modern</summary>
+ <summary xml:lang="pt_BR">Moderno cliente de chat XMPP</summary>
+ <summary xml:lang="pl">Nowoczesny klient Chatu XMPP</summary>
+ <summary xml:lang="nl_BE">Modernen XMPP-chatcliënt</summary>
+ <summary xml:lang="nl">Moderne XMPP-chatcliënt</summary>
+ <summary xml:lang="nb">Moderne XMPP-sludreklient</summary>
+ <summary xml:lang="lb">Modernen XMPP Chat Client</summary>
+ <summary xml:lang="it">Client di chat moderno per XMPP</summary>
+ <summary xml:lang="hu">Modern XMPP Üzenetküldő</summary>
+ <summary xml:lang="gl">Cliente moderno para conversas XMPP</summary>
<summary xml:lang="fr">Client XMPP moderne</summary>
- <summary xml:lang="fi">Moderni XMPP-asiakasohjelma</summary>
- <summary xml:lang="eu">XMPP bezero modernoa</summary>
- <summary xml:lang="es">Cliente XMPP moderno</summary>
+ <summary xml:lang="eu">XMPP txat bezero modernoa</summary>
+ <summary xml:lang="es">Cliente de XMPP moderno</summary>
<summary xml:lang="de">Moderner XMPP Chat Client</summary>
- <summary xml:lang="ca">Client d'XMPP modern</summary>
+ <summary xml:lang="ar">تطبيق حديث للدردشة عبر XMPP</summary>
<description>
<p>Dino is a modern open-source chat client for the desktop. It focuses on providing a clean and reliable Jabber/XMPP experience while having your privacy in mind.</p>
<p xml:lang="zh_Hans">Dino 是一个现代的开源聊天桌面客户端。它致力于提供一个清爽又可靠的 Jabber/XMPP 体验,同时又保护您的隐私。</p>
<p xml:lang="ro">Dino este un client de chat modern, cu sursă deschisă, pentru calculatoare. Se concentrează să furnizeze o experiență Jabber/XMPP clară și fiabilă, ținând cont de confidențialitatea dumneavoastră.</p>
+ <p xml:lang="pt_BR">Dino é um moderno chat de código aberto para desktop. Ele é focado em prover uma transparente e confiável experiência Jabber/XMPP, tendo em mente a sua privacidade.</p>
+ <p xml:lang="pl">Dino jest nowoczesnym klientem chat z otwartym źródłem w wersji na komputery. Skupia się na prostej obsłudze Jabber/XMPP dbając o twoją prywatność.</p>
<p xml:lang="nl_BE">Dino is een moderne, vrije chattoepassing voor uw bureaublad. Ze biedt een eenvoudige en betrouwbare Jabber/XMPP-ervaring, met uw privacy in het achterhoofd.</p>
<p xml:lang="nl">Dino is een moderne, vrije chattoepassing voor uw bureaublad. Ze biedt een eenvoudige en betrouwbare Jabber/XMPP-ervaring, met uw privacy in het achterhoofd.</p>
<p xml:lang="nb">Dino er en moderne friporg-sludringsklient for skrivebordet. Det fokuserer på rask og pålitelig XMPP-opplevelse, samtidig som det hegner om personvernet.</p>
<p xml:lang="lb">Dino ass e modernen, quell-offene Chat Client fir den Desktop. Hien biet eng opgeraumt a robust Jabber/XMPP Erfarung a leet ee Schwéierpunkt op Privatsphär.</p>
+ <p xml:lang="it">Dino è un client di chat per il desktop, moderno e open-source. Si concentra nel fornire un'esperienza Jabber/XMPP pulita e affidabile tenendo presente la tua privacy.</p>
+ <p xml:lang="hu">A Dino egy modern, nyílt forráskódú üzenetküldő alkalmazás asztali rendszerekre, ami a hangsúlyt a letisztult és megbízható Jabber/XMPP élményre helyezi, miközben a magánszféra megőrzését is fontosnak tartja.</p>
+ <p xml:lang="gl">Dino é un cliente moderno e de código aberto para o escritorio. Orientado a proporcionar unha experiencia Jabber/XMPP limpa e fiable tendo a intimidade presente.</p>
<p xml:lang="fr">Dino est un client de chat libre et moderne pour le bureau. Il tente de fournir une expérience Jabber/XMPP simple et fiable tout en ayant toujours à l’esprit votre vie privée.</p>
<p xml:lang="fi">Dino on nykyaikainen avoimen lähdekoodin jutteluohjelma työpöydälle. Se keskittyy tarjoamaan selkeän ja luotettavan Jabber/XMPP-kokemuksen unohtamatta yksityisyyttäsi.</p>
<p xml:lang="eu">Dino mahaigainerako iturburu irekiko txat bezero moderno bat da. Jabber/XMPP esperientzia garbi eta fidagarri bat ematen du zure pribatutasuna kontuan hartzeaz gain.</p>
<p xml:lang="es">Dino es un cliente de conversaciones moderno y libre para escritorio. Está enfocado en proveer una experiencia Jabber/XMPP limpia y confiable teniendo tu privacidad en mente.</p>
<p xml:lang="de">Dino ist ein moderner, quelloffener Chat Client. Er bietet eine aufgeräumte und robuste Jabber/XMPP Erfahrung und legt einen Schwerpunkt auf Privatsphäre.</p>
<p xml:lang="ca">Dino és un client de xat lliure i modern per a l'escriptori. Està centrat en proveir una experiència neta i fiable de Jabber/XMPP, sempre tenint en compte la vostra privacitat.</p>
+ <p xml:lang="ar">دينو برنامج حديث ومفتوح المصدر للدردشة صُمّم لسطح المكتب. ويُركّز علي تقديم تجربة نظيفة وموثوق منها لجابر/XMPP مع أخذ خصوصيتكم بعين الإعتبار.</p>
<p>It supports end-to-end encryption with OMEMO and OpenPGP and allows configuring privacy-related features such as read receipts and typing notifications.</p>
<p xml:lang="zh_Hans">它支持 OMEMO 和 OpenPGP 端对端加密并允许配置隐私相关的特性比如已读回执和输入提醒。</p>
<p xml:lang="ro">Suportă criptare de la un capăt la altul prin intermediul OMEMO și OpenPGP, și permite configurarea caracteristicilor legate de confidențialitate precum trimiterea notificărilor de primire și tastare.</p>
+ <p xml:lang="pt_BR">Suporte criptografia ponta a ponta com OMEMO e OpenPGP e permite configurar privacidade—características relacionadas às notificações de leitura, recebimento e escrita.</p>
<p xml:lang="nl_BE">Ze ondersteunt eind-tot-eind-versleuteling met OMEMO en OpenPGP, en laat u toe privacygerelateerde functies, gelijk leesbevestigingen en typmeldingen, in te stellen.</p>
<p xml:lang="nl">Ze ondersteunt eind-tot-eind-versleuteling met OMEMO en OpenPGP, en staat u toe privacy-gerelateerde functies, zoals leesbevestigingen en typmeldingen, in te stellen.</p>
<p xml:lang="nb">Det støtter ende-til-ende -kryptering med OMEMO og OpenPGP, og tillater oppsett av personvernsrelaterte funksjoner som meldingskvitteringer og skrivevarsling.</p>
<p xml:lang="lb">Hien ënnerstëtz Enn-zu-Enn Verschlësselung mat OMEMO an OpenPGP an enthält Privatsphäre-Astellungen zu Liesbestätegungen an Tipp-Benoriichtegungen.</p>
<p xml:lang="it">Support la crittografia end-to-end tramite OMEMO e OpenPGP e permette di configurare le funzioni relative alla privacy come le ricevute di lettura e le notifiche di digitazione.</p>
+ <p xml:lang="hu">Támogatja a végponttól-végpontig titkosítást az OMEMO és az OpenPGP által, és magánszférához kötődő beállítási lehetőségeket is biztosít, mint például a kézbesítési, vagy gépelési értesítések küldése.</p>
+ <p xml:lang="gl">Soporta o cifrado de extremo-a-extremo con OMEMO e OpenPGP e permite configurar características orientadas a intimidade tales como confirmación de lectura e notificacións de escritura.</p>
<p xml:lang="fr">Il prend en charge le chiffrement de bout en bout avec OMEMO et OpenPGP et permet de configurer les fonctions liées à la vie privée telles que l’accusé de réception et les notifications de frappe.</p>
<p xml:lang="fi">Se tukee päästä päähän -salausta OMEMO:n ja OpenPGP:n avulla ja mahdollistaa yksityisyyteen liittyvien ominaisuuksien, kuten lukukuittausten ja kirjoitusilmoitusten asetusten määrittämisen.</p>
- <p xml:lang="eu">Amaieratik amaierarako enkriptazioa onartzen du OMEMO eta OpenPGPrekin eta pribatutasun ezaugarriak konfiguratzea baimentzen du irakurtze baieztapenak eta idazketa jakinarazpenak bezala.</p>
+ <p xml:lang="eu">Amaieratik amaierarako enkriptazioa onartzen du OMEMO eta OpenPGPrekin eta pribatutasun ezaugarriak konfiguratzea baimentzen du irakurtze markak eta idazketa jakinarazpenak bezala.</p>
<p xml:lang="es">Soporta cifrado de extremo a extremo a través de OMEMO y OpenPGP y permite configurar las características relacionadas con la privacidad, como confirmaciones de lectura y notificaciones de escritura.</p>
<p xml:lang="de">Er unterstützt Ende-zu-Ende Verschlüsselung mit OMEMO und OpenPGP und enthält Privatsphäre-Einstellungen zu Lesebestätigungen und Tippbenachrichtigungen.</p>
<p xml:lang="ca">Implementa xifratge punt a punt amb OMEMO i OpenPGP, i permet configurar funcionalitats relacionades amb la privacitat com per exemple rebuts de lectura i notificacions d'escriptura.</p>
+ <p xml:lang="ar">وهو يدعم التشفير بواسطة OMEMO و OpenPGP يسمح بإعداد ميزات الخصوصية كالإيصالات المقروءة والإخطارات عند الكتابة.</p>
<p>Dino fetches history from the server and synchronizes messages with other devices.</p>
<p xml:lang="zh_Hans">Dino 从服务器获取消息并和其他设备同步。</p>
<p xml:lang="ru">Dino загружает историю с сервера и синхронизирует сообщения с другими устройствами.</p>
<p xml:lang="ro">Dino preia istoricul discuțiilor de pe server și sincronizează mesajele cu celelalte dispozitive.</p>
+ <p xml:lang="pt_BR">Dino obtém o histórico do servidor e sincroniza mensagens com outros dispositivos.</p>
<p xml:lang="nl_BE">Dino haalt de geschiedenis op van de server en synchroniseert berichten met andere apparaten.</p>
<p xml:lang="nl">Dino haalt de geschiedenis op van de server en synchroniseert berichten met andere apparaten.</p>
<p xml:lang="nb">Dino henter historikk fra tjeneren og synkroniserer meldinger med andre enheter.</p>
<p xml:lang="lb">Dino rifft  Gespréichverläf vum Server of a synchroniséiert Noriichte mat anere Geräter.</p>
<p xml:lang="it">Dino recupera la cronologia dal server e sincronizza i messaggi con gli altri dispositivi.</p>
+ <p xml:lang="hu">A Dino lekéri a chat előzményeket a szerverről, és szinkronizálja az üzeneteket a többi eszközzel.</p>
+ <p xml:lang="gl">Dino obtén o histórico desde o servidor e sincroniza as mensaxes con outros dispositivos.</p>
<p xml:lang="fr">Dino récupère l’historique du serveur et synchronise les messages avec d'autres appareils.</p>
<p xml:lang="fi">Dino hakee historian palvelimelta ja synkronisoi viestit muiden laitteiden kanssa.</p>
<p xml:lang="eu">Dinok zerbitzaritik hartzen du historia eta beste gailuekin mezuak sinkronizatzen ditu.</p>
<p xml:lang="es">Dino recupera los mensajes desde el servidor y sincroniza los mensajes con otros dispositivos.</p>
<p xml:lang="de">Dino ruft Gesprächsverläufe vom Server ab und synchronisiert Nachrichten mit anderen Geräten.</p>
<p xml:lang="ca">Dino recupera l'historial del servidor i sincronitza els missatges amb altres dispositius.</p>
+ <p xml:lang="ar">يقوم دينو بجلب السِجلّ مِن السيرفر ثم يُزامِن الرسائل مع الأجهزة الأخرى.</p>
</description>
<screenshots>
<screenshot type="default">
@@ -70,17 +85,22 @@
<caption xml:lang="zh_Hans">带有对话的主窗口</caption>
<caption xml:lang="ru">Главное окно с чатами</caption>
<caption xml:lang="ro">Fereastra principală de conversații</caption>
+ <caption xml:lang="pt_BR">Janela principal com as conversas</caption>
+ <caption xml:lang="pl">Główne okno rozmów</caption>
<caption xml:lang="nl_BE">Hoofdvenster met gesprekken</caption>
<caption xml:lang="nl">Hoofdvenster met gesprekken</caption>
<caption xml:lang="nb">Hovedvindu med samtaler</caption>
<caption xml:lang="lb">Haaptfënster mat den Conversatiounen</caption>
<caption xml:lang="it">La finestra principale con le conversazioni</caption>
+ <caption xml:lang="hu">A fő ablak a beszélgetésekkel</caption>
+ <caption xml:lang="gl">Xanela principal con conversas</caption>
<caption xml:lang="fr">Fenêtre principale avec des conversations</caption>
<caption xml:lang="fi">Keskustelut pääikkunassa</caption>
<caption xml:lang="eu">Leiho nagusia elkarrizketekin</caption>
<caption xml:lang="es">Ventana principal con conversaciones</caption>
<caption xml:lang="de">Hauptfenster mit Konversationen</caption>
<caption xml:lang="ca">Finestra principal amb converses</caption>
+ <caption xml:lang="ar">النافذة الرئيسية بالمُحادثات</caption>
<image height="900" width="1600">https://dino.im/img/appdata/main.png</image>
</screenshot>
<screenshot>
@@ -89,16 +109,20 @@
<caption xml:lang="ru">Начать чат</caption>
<caption xml:lang="ro">Pornește o conversație</caption>
<caption xml:lang="pt_BR">Iniciar conversa</caption>
+ <caption xml:lang="pl">Rozpocznij rozmowę</caption>
<caption xml:lang="nl_BE">Gesprek beginnen</caption>
<caption xml:lang="nl">Gesprek beginnen</caption>
<caption xml:lang="nb">Start samtale</caption>
<caption xml:lang="lb">Konversatioun starten</caption>
<caption xml:lang="it">Inizia una Conversazione</caption>
+ <caption xml:lang="hu">Csevegés kezdeményezése</caption>
+ <caption xml:lang="gl">Iniciar Conversa</caption>
<caption xml:lang="fr">Commencer une discussion</caption>
<caption xml:lang="fi">Aloita keskustelu</caption>
<caption xml:lang="eu">Elkarrizketa hasi</caption>
<caption xml:lang="es">Iniciar conversación</caption>
<caption xml:lang="de">Unterhaltung starten</caption>
+ <caption xml:lang="ar">الشروع في محادثة</caption>
<image height="900" width="1600">https://dino.im/img/appdata/start_chat.png</image>
</screenshot>
<screenshot>
@@ -114,6 +138,8 @@
<caption xml:lang="lb">Kontaktdetailer</caption>
<caption xml:lang="ja">相手先の詳細</caption>
<caption xml:lang="it">Dettagli del contatto</caption>
+ <caption xml:lang="hu">Felhasználó információ</caption>
+ <caption xml:lang="gl">Detalles do contacto</caption>
<caption xml:lang="fr">Informations du contact</caption>
<caption xml:lang="fi">Yhteystiedot</caption>
<caption xml:lang="eu">Kontaktuaren xehetasunak</caption>
@@ -121,6 +147,7 @@
<caption xml:lang="eo">Kontaktaj Detaloj</caption>
<caption xml:lang="de">Kontaktdetails</caption>
<caption xml:lang="ca">Detalls del contacte</caption>
+ <caption xml:lang="ar">تفاصيل عن المُراسل</caption>
<image height="900" width="1600">https://dino.im/img/appdata/contact_details.png</image>
</screenshot>
</screenshots>
diff --git a/main/data/im.dino.Dino.appdata.xml.in b/main/data/im.dino.Dino.appdata.xml.in
index cf748d9b..17c56b8b 100644
--- a/main/data/im.dino.Dino.appdata.xml.in
+++ b/main/data/im.dino.Dino.appdata.xml.in
@@ -7,17 +7,9 @@
<name>Dino</name>
<summary>Modern XMPP Chat Client</summary>
<description>
- <p>
- Dino is a modern open-source chat client for the desktop. It focuses on providing a clean and reliable
- Jabber/XMPP experience while having your privacy in mind.
- </p>
- <p>
- It supports end-to-end encryption with OMEMO and OpenPGP and allows configuring privacy-related features
- such as read receipts and typing notifications.
- </p>
- <p>
- Dino fetches history from the server and synchronizes messages with other devices.
- </p>
+ <p>Dino is a modern open-source chat client for the desktop. It focuses on providing a clean and reliable Jabber/XMPP experience while having your privacy in mind.</p>
+ <p>It supports end-to-end encryption with OMEMO and OpenPGP and allows configuring privacy-related features such as read receipts and typing notifications.</p>
+ <p>Dino fetches history from the server and synchronizes messages with other devices.</p>
</description>
<screenshots>
<screenshot type="default">
diff --git a/main/data/manage_accounts/add_account_dialog.ui b/main/data/manage_accounts/add_account_dialog.ui
index 44c131c3..b39f07a8 100644
--- a/main/data/manage_accounts/add_account_dialog.ui
+++ b/main/data/manage_accounts/add_account_dialog.ui
@@ -1,136 +1,390 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<template class="DinoUiManageAccountsAddAccountDialog">
- <property name="default_width">300</property>
+ <property name="default_width">400</property>
<property name="modal">True</property>
- <child type="titlebar">
- <object class="GtkHeaderBar">
- <property name="visible">True</property>
- <child>
- <object class="GtkButton" id="cancel_button">
- <property name="label" translatable="yes">Cancel</property>
- <property name="visible">True</property>
- </object>
- <packing>
- <property name="pack_type">start</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="ok_button">
- <property name="can_default">True</property>
- <property name="label" translatable="yes">Save</property>
- <property name="sensitive">False</property>
- <property name="visible">True</property>
- <style>
- <class name="suggested-action"/>
- </style>
- </object>
- <packing>
- <property name="pack_type">end</property>
- </packing>
- </child>
- </object>
- </child>
<child internal-child="vbox">
<object class="GtkBox">
<property name="visible">True</property>
<child>
- <object class="GtkGrid" id="info_grid">
- <property name="orientation">vertical</property>
- <property name="margin">20</property>
- <property name="column-spacing">10</property>
- <property name="row-spacing">7</property>
+ <object class="GtkOverlay">
<property name="visible">True</property>
<child>
- <object class="GtkLabel">
- <property name="label">JID</property>
- <property name="xalign">1</property>
- <property name="visible">True</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="jid_entry">
- <property name="activates_default">True</property>
- <property name="hexpand">True</property>
- <property name="width_request">200</property>
- <property name="visible">True</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel">
- <property name="label" translatable="yes">Password</property>
- <property name="xalign">1</property>
+ <object class="GtkBox">
+ <property name="expand">True</property>
<property name="visible">True</property>
+ <child>
+ <object class="GtkStack" id="stack">
+ <property name="transition_type">slide-left</property>
+ <property name="expand">True</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkBox" id="sign_in_box">
+ <property name="orientation">vertical</property>
+ <property name="margin">20</property>
+ <property name="margin-start">50</property>
+ <property name="margin-end">50</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label">Sign in</property>
+ <property name="margin-bottom">10</property>
+ <property name="visible">True</property>
+ <attributes>
+ <attribute name="scale" value="1.3"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="info_grid">
+ <property name="orientation">vertical</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label">JID</property>
+ <property name="xalign">0</property>
+ <property name="visible">True</property>
+ <attributes>
+ <attribute name="scale" value="0.9"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="jid_entry">
+ <property name="activates_default">True</property>
+ <property name="hexpand">True</property>
+ <property name="width_request">200</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="yes">Password</property>
+ <property name="xalign">0</property>
+ <property name="margin-top">7</property>
+ <property name="visible">True</property>
+ <attributes>
+ <attribute name="scale" value="0.9"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="password_entry">
+ <property name="activates_default">True</property>
+ <property name="hexpand">True</property>
+ <property name="input_purpose">password</property>
+ <property name="width_request">200</property>
+ <property name="visible">True</property>
+ <property name="visibility">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="yes">Local alias</property>
+ <property name="xalign">0</property>
+ <property name="margin-top">7</property>
+ <property name="visible">True</property>
+ <attributes>
+ <attribute name="scale" value="0.9"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="alias_entry">
+ <property name="activates_default">True</property>
+ <property name="hexpand">True</property>
+ <property name="width_request">200</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">horizontal</property>
+ <property name="margin-top">20</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkButton" id="serverlist_button">
+ <property name="label" translatable="yes">Create account</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="pack_type">start</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="sign_in_continue">
+ <property name="can_default">True</property>
+ <property name="label" translatable="yes">Save</property>
+ <property name="sensitive">False</property>
+ <property name="visible">True</property>
+ <style>
+ <class name="suggested-action"/>
+ </style>
+ </object>
+ <packing>
+ <property name="pack_type">end</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">login</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="create_account_box">
+ <property name="orientation">vertical</property>
+ <property name="margin">20</property>
+ <property name="margin-start">50</property>
+ <property name="margin-end">50</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="yes">Create account</property>
+ <property name="margin-bottom">20</property>
+ <property name="visible">True</property>
+ <attributes>
+ <attribute name="scale" value="1.3"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Choose a public server</property>
+ <attributes>
+ <attribute name="weight" value="PANGO_WEIGHT_BOLD"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFrame">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="max_content_height">300</property>
+ <property name="propagate_natural_height">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkListBox" id="server_list_box">
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="margin-top">20</property>
+ <property name="label" translatable="yes">Or specify a server address</property>
+ <attributes>
+ <attribute name="weight" value="PANGO_WEIGHT_BOLD"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="server_entry">
+ <property name="activates_default">True</property>
+ <property name="can_default">True</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="margin-top">30</property>
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkButton" id="login_button">
+ <property name="label" translatable="yes">Sign in instead</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="pack_type">start</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="select_server_continue">
+ <property name="sensitive">False</property>
+ <property name="can_default">True</property>
+ <property name="visible">True</property>
+ <style>
+ <class name="text-button"/>
+ <class name="suggested-action"/>
+ </style>
+ <child>
+ <object class="GtkStack" id="select_server_continue_stack">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="yes">Next</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="name">label</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinner">
+ <property name="active">True</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="name">spinner</property>
+ </packing>
+ </child>
+ </object>
+
+ </child>
+ </object>
+ <packing>
+ <property name="pack_type">end</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">server</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="register_box">
+ <property name="margin">20</property>
+ <property name="margin-start">50</property>
+ <property name="margin-end">50</property>
+ <property name="orientation">vertical</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="register_title">
+ <property name="margin-bottom">10</property>
+ <property name="visible">True</property>
+ <attributes>
+ <attribute name="scale" value="1.3"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="form_box">
+ <property name="orientation">vertical</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="margin-top">30</property>
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkButton" id="register_form_back">
+ <property name="label" translatable="yes">Pick another server</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="pack_type">start</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="register_form_continue">
+ <property name="can_default">True</property>
+ <property name="visible">True</property>
+ <style>
+ <class name="text-button"/>
+ <class name="suggested-action"/>
+ </style>
+ <child>
+ <object class="GtkStack" id="register_form_continue_stack">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="register_form_continue_label">
+ <property name="label" translatable="yes">Next</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="name">label</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinner">
+ <property name="active">True</property>
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="name">spinner</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="pack_type">end</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">form</property>
+ </packing>
+ </child>
+ </object>
+ </child>
</object>
<packing>
- <property name="left_attach">0</property>
- <property name="top_attach">1</property>
- <property name="width">1</property>
- <property name="height">1</property>
+ <property name="index">-1</property>
</packing>
</child>
- <child>
- <object class="GtkEntry" id="password_entry">
- <property name="activates_default">True</property>
- <property name="hexpand">True</property>
- <property name="input_purpose">password</property>
- <property name="width_request">200</property>
+ <child type="overlay">
+ <object class="GtkRevealer" id="notification_revealer">
<property name="visible">True</property>
- <property name="visibility">False</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">start</property>
+ <child>
+ <object class="GtkFrame" id="frame2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <style>
+ <class name="app-notification"/>
+ </style>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">20</property>
+ <child>
+ <object class="GtkLabel" id="notification_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="label_item">
+ <placeholder/>
+ </child>
+ </object>
+ </child>
</object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">1</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel">
- <property name="label" translatable="yes">Local alias</property>
- <property name="xalign">1</property>
- <property name="visible">True</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">2</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="alias_entry">
- <property name="activates_default">True</property>
- <property name="hexpand">True</property>
- <property name="width_request">200</property>
- <property name="visible">True</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">2</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
</child>
</object>
</child>
</object>
</child>
- <action-widgets>
- <action-widget response="cancel">cancel_button</action-widget>
- <action-widget response="ok" default="true">ok_button</action-widget>
- </action-widgets>
</template>
</interface>
diff --git a/main/data/menu_add.ui b/main/data/menu_add.ui
index d8fd691b..fdf01352 100644
--- a/main/data/menu_add.ui
+++ b/main/data/menu_add.ui
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
<interface>
<menu id="menu_add">
<section>
diff --git a/main/data/menu_app.ui b/main/data/menu_app.ui
index beb81f3f..eb862ddb 100644
--- a/main/data/menu_app.ui
+++ b/main/data/menu_app.ui
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
<interface>
<menu id="menu_app">
<section>
diff --git a/main/data/menu_conversation.ui b/main/data/menu_conversation.ui
index 42b580be..a65522c3 100644
--- a/main/data/menu_conversation.ui
+++ b/main/data/menu_conversation.ui
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
<interface>
<menu id="menu_conversation">
<section>
diff --git a/main/data/search_autocomplete.ui b/main/data/search_autocomplete.ui
new file mode 100644
index 00000000..94ec5d7f
--- /dev/null
+++ b/main/data/search_autocomplete.ui
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <object class="GtkBox" id="root">
+ <property name="orientation">horizontal</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="DinoUiAvatarImage" id="image">
+ <property name="margin">4</property>
+ <property name="margin-start">6</property>
+ <property name="margin-end">6</property>
+ <property name="height">24</property>
+ <property name="width">24</property>
+ <property name="visible">True</property>
+ <property name="allow_gray">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label">
+ <property name="visible">True</property>
+ <property name="ellipsize">end</property>
+ </object>
+ </child>
+ </object>
+</interface> \ No newline at end of file
diff --git a/main/data/theme.css b/main/data/theme.css
index e7d58ffb..174ce5b2 100644
--- a/main/data/theme.css
+++ b/main/data/theme.css
@@ -17,12 +17,38 @@ window.dino-main .dino-conversation undershoot {
background: none;
}
-window.dino-main .dino-chatinput frame box {
+@keyframes highlight {
+ from { background: alpha(@warning_color, 0.5) }
+ to { background: transparent }
+}
+
+window.dino-main .dino-conversation .highlight-once {
+ animation-duration: 3s;
+ animation-timing-function: ease-out;
+ animation-iteration-count: 1;
+ animation-name: highlight;
+}
+
+window.dino-main .dino-sidebar > frame {
+ background: @insensitive_bg_color;
+ border-left: 1px solid @borders;
+ border-bottom: 1px solid @borders;
+}
+
+window.dino-main .dino-sidebar > frame.collapsed {
+ border-bottom: 1px solid @borders;
+}
+
+window.dino-main .dino-sidebar frame.auto-complete {
background: @theme_base_color;
}
-window.dino-main .dino-chatinput frame box:backdrop {
- background: @theme_unfocused_base_color;
+window.dino-main .dino-sidebar frame.auto-complete list > row {
+ transition: none;
+}
+
+window.dino-main .dino-chatinput frame box {
+ background: transparent;
}
window.dino-main button.dino-chatinput-button {
diff --git a/main/data/unified_main_content.ui b/main/data/unified_main_content.ui
new file mode 100644
index 00000000..b2f3a891
--- /dev/null
+++ b/main/data/unified_main_content.ui
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <object class="GtkPaned" id="paned">
+ <property name="position">300</property>
+ <property name="orientation">horizontal</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="DinoUiConversationSelectorView" id="conversation_list">
+ <property name="visible">True</property>
+ </object>
+ <packing>
+ <property name="resize">False</property>
+ <property name="shrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkOverlay">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkOverlay">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="visible">True</property>
+ <style>
+ <class name="dino-conversation"/>
+ </style>
+ <child>
+ <object class="DinoUiConversationSummaryConversationView" id="conversation_frame">
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="DinoUiChatInputView" id="chat_input">
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="overlay">
+ <object class="GtkRevealer" id="goto_end_revealer">
+ <property name="halign">end</property>
+ <property name="valign">end</property>
+ <property name="transition-type">crossfade</property>
+ <property name="visible">True</property>
+ <property name="margin-end">30</property>
+ <property name="margin-bottom">70</property>
+ <child>
+ <object class="GtkButton" id="goto_end_button">
+ <property name="vexpand">False</property>
+ <property name="halign">end</property>
+ <property name="valign">end</property>
+ <property name="visible">True</property>
+ <style>
+ <class name="circular"/>
+ </style>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">go-down-symbolic</property>
+ <property name="icon-size">1</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="overlay">
+ <object class="GtkRevealer" id="search_revealer">
+ <property name="visible">True</property>
+ <property name="halign">end</property>
+ <property name="transition-type">slide-left</property>
+ <style>
+ <class name="dino-sidebar"/>
+ </style>
+ <child>
+ <object class="GtkFrame">
+ <property name="visible">True</property>
+ <property name="width-request">400</property>
+ <property name="shadow-type">none</property>
+ <child>
+ <object class="DinoUiGlobalSearch" id="search_box">
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">True</property>
+ <property name="shrink">False</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/main/po/LINGUAS b/main/po/LINGUAS
index ac789b9d..d0d8aa1e 100644
--- a/main/po/LINGUAS
+++ b/main/po/LINGUAS
@@ -7,6 +7,8 @@ es
eu
fi
fr
+gl
+hu
it
ja
lb
diff --git a/main/po/ar.po b/main/po/ar.po
index f67dbe0e..f04492a9 100644
--- a/main/po/ar.po
+++ b/main/po/ar.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
-"PO-Revision-Date: 2018-04-13 17:34+0000\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-10-23 21:35+0000\n"
"Last-Translator: ButterflyOfFire <ButterflyOfFire@protonmail.com>\n"
"Language-Team: Arabic <https://hosted.weblate.org/projects/dino/translations/"
"ar/>\n"
@@ -18,26 +18,31 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
-"X-Generator: Weblate 3.0-dev\n"
+"X-Generator: Weblate 3.3-dev\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "طلب اشتراك"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "قبول"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "رفض"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
-msgstr ""
+msgstr "إزالة الحساب %s ؟"
#: main/src/ui/manage_accounts/dialog.vala:129
msgid "Remove"
@@ -49,12 +54,11 @@ msgstr "اختيار الصورة الرمزية"
#: main/src/ui/manage_accounts/dialog.vala:153
msgid "Select"
-msgstr ""
+msgstr "اختيار"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -68,38 +72,64 @@ msgstr "الصور"
msgid "All files"
msgstr "كافة الملفات"
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr "الإتصال جارٍ …"
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "متصل"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "غير متصل"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "كلمة المرور خاطئة"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr "شهادة TLS غير صالحة"
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "خطأ"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "إضافة حساب"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
-msgstr ""
+msgstr "يجب أن يكون JID على شكل “user@example.com”"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr "لا ردّ مِن طرف الخادم"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr "قم بالتسجيل على %s"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr "يتطلب الخادم التسجيل من خلال موقع ويب"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr "التسجيلات مفتوحة"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr "إنشاء حساب"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr "إطّلع على %s للمزيد من المعلومات حول التسجيل"
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
@@ -107,25 +137,25 @@ msgid "Me"
msgstr "أنا"
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
-#, fuzzy, no-c-format
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#, no-c-format
msgid "%b %d"
msgstr "%b %d"
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "البارحة"
#: main/src/ui/conversation_selector/conversation_row.vala:161
#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:196
-#, fuzzy, no-c-format
+#, no-c-format
msgid "%H∶%M"
msgstr "%H∶%M"
#: main/src/ui/conversation_selector/conversation_row.vala:162
#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:197
-#, fuzzy, no-c-format
+#, no-c-format
msgid "%l∶%M %p"
msgstr "%l∶%M %p"
@@ -135,11 +165,11 @@ msgstr "%l∶%M %p"
msgid "%i min ago"
msgid_plural "%i mins ago"
msgstr[0] ""
-msgstr[1] ""
+msgstr[1] "منذ %i د"
msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgstr[5] ""
+msgstr[5] "منذ %i دقائق"
#: main/src/ui/conversation_selector/conversation_row.vala:167
#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:203
@@ -148,7 +178,7 @@ msgstr "الآن"
#: main/src/ui/application.vala:44
msgid "Join Conference"
-msgstr ""
+msgstr "الإنضمام إلى فريق محادثة"
#: main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:63
@@ -162,24 +192,26 @@ msgid "Add"
msgstr "إضافة"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "حفظ"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
-msgstr ""
+msgstr "الإلتحاق بقناة"
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "التالي"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
-msgstr ""
+msgstr "الشروع في محادثة"
#: main/src/ui/add_conversation/select_contact_dialog.vala:86
msgid "Start"
@@ -187,208 +219,211 @@ msgstr "إبدأ"
#: main/src/ui/add_conversation/conference_details_fragment.vala:108
msgid "Joining…"
-msgstr ""
+msgstr "في طريق الإلتحاق …"
#: main/src/ui/add_conversation/conference_details_fragment.vala:138
msgid "Password required to enter room"
-msgstr ""
+msgstr "كلمة السر مطلوبة للدخول إلى غرفة المحادثة"
#: main/src/ui/add_conversation/conference_details_fragment.vala:143
msgid "Banned from joining or creating conference"
-msgstr ""
+msgstr "محظور مِن الإنضمام أو إنشاء فِرَق محادثة"
#: main/src/ui/add_conversation/conference_details_fragment.vala:145
msgid "Room does not exist"
-msgstr ""
+msgstr "غرفة المحادثة غير موجودة"
#: main/src/ui/add_conversation/conference_details_fragment.vala:147
msgid "Not allowed to create room"
-msgstr ""
+msgstr "ليس لديك تسريح لإنشاء غرفة محادثة"
#: main/src/ui/add_conversation/conference_details_fragment.vala:149
msgid "Members-only room"
-msgstr ""
+msgstr "الغرفة خاصة بأعضائها فقط"
#: main/src/ui/add_conversation/conference_details_fragment.vala:152
msgid "Choose a different nick"
-msgstr ""
+msgstr "إختر إسما مستعارا آخر"
#: main/src/ui/add_conversation/conference_details_fragment.vala:154
msgid "Too many occupants in room"
-msgstr ""
+msgstr "غرفة المحادثة مكتضة"
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
-msgstr ""
+msgstr "ليس هناك أية حسابات نشطة"
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
-msgstr ""
+msgstr "إدارة الحسابات"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
-msgstr ""
+msgstr "ليس هناك أية محادثات نشطة"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
-msgstr ""
+msgstr "اليوم"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
-msgstr ""
+msgstr "%a, %b %d"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
-msgstr ""
+msgstr "%s و %s و %i آخَرين"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
-msgstr ""
+msgstr "%s, %s و %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
-msgstr ""
+msgstr "%s و %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
msgid "is typing…"
msgid_plural "are typing…"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
+msgstr[0] "يكتب…"
+msgstr[1] "يكتب…"
+msgstr[2] "يكتُبان…"
+msgstr[3] "يكتبون…"
+msgstr[4] "يكتبون…"
+msgstr[5] "يكتبون…"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
-msgstr ""
-
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr ""
+msgstr "توقفَ عن الكتابة"
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
-msgstr ""
+msgstr "الرسالة طويلة جدًا"
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr ""
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr ""
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
-msgstr ""
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "ملف"
#: main/src/ui/conversation_summary/subscription_notification.vala:48
msgid "This contact would like to add you to their contact list"
-msgstr ""
+msgstr "يريد هذا المراسل إضافتك إلى قائمة مراسليه"
#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:184
#, no-c-format
msgid "%x, %H∶%M"
-msgstr ""
+msgstr "%x, %H∶%M"
#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:185
#, no-c-format
msgid "%x, %l∶%M %p"
-msgstr ""
+msgstr "%x, %l∶%M %p"
#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:188
#, no-c-format
msgid "%b %d, %H∶%M"
-msgstr ""
+msgstr "%b %d, %H∶%M"
#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:189
#, no-c-format
msgid "%b %d, %l∶%M %p"
-msgstr ""
+msgstr "%b %d, %l∶%M %p"
#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:192
#, no-c-format
msgid "%a, %H∶%M"
-msgstr ""
+msgstr "%a, %H∶%M"
#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:193
#, no-c-format
msgid "%a, %l∶%M %p"
-msgstr ""
+msgstr "%a, %l∶%M %p"
#: main/src/ui/occupant_menu/list.vala:106
msgid "Owner"
-msgstr ""
+msgstr "المالك"
#: main/src/ui/occupant_menu/list.vala:108
msgid "Admin"
-msgstr ""
+msgstr "المدير"
#: main/src/ui/occupant_menu/list.vala:110
msgid "Member"
-msgstr ""
+msgstr "عضو"
#: main/src/ui/occupant_menu/list.vala:112
msgid "User"
-msgstr ""
+msgstr "مستخدِم"
#: main/src/ui/occupant_menu/view.vala:27
#: main/src/ui/occupant_menu/view.vala:36
msgid "Invite"
-msgstr ""
+msgstr "دعوة"
#: main/src/ui/occupant_menu/view.vala:35
msgid "Invite to Conference"
-msgstr ""
+msgstr "دعوة إلى فريق محادثة"
#: main/src/ui/occupant_menu/view.vala:85
msgid "Start private conversation"
-msgstr ""
+msgstr "الشروع في محادثة خاصة"
#: main/src/ui/occupant_menu/view.vala:93
msgid "Kick"
-msgstr ""
+msgstr "طرد"
+
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr "%i نتيجة بحث"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr "في %s"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr "مع %s"
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
-msgstr ""
+msgstr "تفاصيل فريق المحادثة"
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
-msgstr ""
+msgstr "تفاصيل عن المُراسل"
#: main/src/ui/contact_details/muc_config_form_provider.vala:39
msgid "Name of the room"
-msgstr ""
+msgstr "إسم غرفة المحادثة"
#: main/src/ui/contact_details/muc_config_form_provider.vala:42
msgid "Description of the room"
-msgstr ""
+msgstr "وصف غرفة المحادثة"
#: main/src/ui/contact_details/muc_config_form_provider.vala:45
msgid "Persistent"
-msgstr ""
+msgstr "دائمة"
#: main/src/ui/contact_details/muc_config_form_provider.vala:46
msgid "The room will persist after the last occupant leaves"
-msgstr ""
+msgstr "سوف تبقى الغرفة حتى و إن غادرها آخِر مقيم"
#: main/src/ui/contact_details/muc_config_form_provider.vala:49
msgid "Publicly searchable"
-msgstr ""
+msgstr "يمكن البحث عنها للعلن"
#: main/src/ui/contact_details/muc_config_form_provider.vala:52
msgid "Occupants may change the subject"
-msgstr ""
+msgstr "يمكن للمقيمين تغيير الموضوع"
#: main/src/ui/contact_details/muc_config_form_provider.vala:55
msgid "Discover real JIDs"
-msgstr ""
+msgstr "استكشاف مُعرّفي JID الحقيقيين"
#: main/src/ui/contact_details/muc_config_form_provider.vala:56
msgid "Who may discover real JIDs?"
@@ -396,19 +431,19 @@ msgstr ""
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
-msgstr ""
+msgstr "كلمة السر"
#: main/src/ui/contact_details/muc_config_form_provider.vala:60
msgid "Password required for room entry, if any"
-msgstr ""
+msgstr "مطلوب كلمة السر لدخول الغرفة، إن وُجِدت"
#: main/src/ui/contact_details/muc_config_form_provider.vala:63
msgid "Moderated"
-msgstr ""
+msgstr "تحت الإشراف"
#: main/src/ui/contact_details/muc_config_form_provider.vala:64
msgid "Only occupants with voice may send messages"
@@ -416,15 +451,15 @@ msgstr ""
#: main/src/ui/contact_details/muc_config_form_provider.vala:67
msgid "Members only"
-msgstr ""
+msgstr "الأعضاء فقط"
#: main/src/ui/contact_details/muc_config_form_provider.vala:68
msgid "Only members may enter the room"
-msgstr ""
+msgstr "يمكن للأعضاء فقط الإلتحاق بالغرفة"
#: main/src/ui/contact_details/muc_config_form_provider.vala:71
msgid "Message history"
-msgstr ""
+msgstr "إدارة التأريخ"
#: main/src/ui/contact_details/muc_config_form_provider.vala:72
msgid "Maximum amount of backlog issued by the room"
@@ -432,153 +467,202 @@ msgstr ""
#: main/src/ui/contact_details/muc_config_form_provider.vala:78
msgid "Room Configuration"
-msgstr ""
+msgstr "إعدادات الغرفة"
#: main/src/ui/contact_details/blocking_provider.vala:31
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
-msgstr ""
+msgstr "الإعدادات"
#: main/src/ui/contact_details/blocking_provider.vala:31
msgid "Block"
-msgstr ""
+msgstr "حظر"
#: main/src/ui/contact_details/blocking_provider.vala:31
msgid "Communication and status updates in either direction are blocked"
-msgstr ""
+msgstr "تم حظر الإتصال وتحديثات الحالة في كلا الإتجاهين"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/data/settings_dialog.ui:22
msgid "Send typing notifications"
-msgstr ""
+msgstr "إرسال إشعارات عند الكتابة"
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/data/settings_dialog.ui:34
msgid "Send read receipts"
-msgstr ""
+msgstr "إرسال إيصالات القراءة"
#: main/src/ui/contact_details/settings_provider.vala:30
#: main/src/ui/contact_details/settings_provider.vala:39
msgid "Notifications"
-msgstr ""
+msgstr "الإشعارات"
#: main/src/ui/contact_details/settings_provider.vala:39
msgid "Local Settings"
-msgstr ""
+msgstr "الإعدادات المحلية"
#: main/src/ui/contact_details/settings_provider.vala:74
#: main/src/ui/contact_details/settings_provider.vala:114
#: main/src/ui/contact_details/settings_provider.vala:116
msgid "On"
-msgstr ""
+msgstr "نشط"
#: main/src/ui/contact_details/settings_provider.vala:76
#: main/src/ui/contact_details/settings_provider.vala:114
#: main/src/ui/contact_details/settings_provider.vala:117
msgid "Off"
-msgstr ""
+msgstr "معطّل"
#: main/src/ui/contact_details/settings_provider.vala:78
msgid "Only when mentioned"
-msgstr ""
+msgstr "فقط عندما يُشار إليّ"
#: main/src/ui/contact_details/settings_provider.vala:80
#: main/src/ui/contact_details/settings_provider.vala:115
#, c-format
msgid "Default: %s"
-msgstr ""
+msgstr "إفتراضي: %s"
#: main/data/settings_dialog.ui:7
msgid "Preferences"
-msgstr ""
+msgstr "التفضيلات"
#: main/data/settings_dialog.ui:46
msgid "Notify when a new message arrives"
-msgstr ""
+msgstr "الإشعار عند تلقي رسائل جديدة"
#: main/data/settings_dialog.ui:58
msgid "Convert smileys to emojis"
-msgstr ""
+msgstr "تحويل الوجوه المبتسمة إلى إيموجي"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
-msgstr ""
+msgstr "الحسابات"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
-msgstr ""
+msgstr "اللقب المحلي"
#: main/data/manage_accounts/dialog.ui:255
msgid "No accounts configured"
-msgstr ""
+msgstr "لم يتم إعداد أي حساب بعد"
#: main/data/manage_accounts/dialog.ui:266
msgid "Add an account"
-msgstr ""
+msgstr "إضافة حساب"
+
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr "إنشاء حساب"
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr "إختر خادمًا عموميًا"
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr "أو قم بإدخال عنوان خادم"
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr "قم بتسجيل الدخول بدلاً من ذلك"
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr "إختيار سيرفر آخَر"
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
-msgstr ""
+msgstr "غير مشفّرة"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
-msgstr ""
-
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr ""
+msgstr "الخروج"
-#: main/data/im.dino.Dino.appdata.xml.in:8
+#: main/data/im.dino.Dino.appdata.xml.in:7
msgid "Modern XMPP Chat Client"
-msgstr ""
+msgstr "تطبيق حديث للدردشة عبر XMPP"
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
"privacy in mind."
msgstr ""
+"دينو برنامج حديث ومفتوح المصدر للدردشة صُمّم لسطح المكتب. ويُركّز علي تقديم "
+"تجربة نظيفة وموثوق منها لجابر/XMPP مع أخذ خصوصيتكم بعين الإعتبار."
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
"notifications."
msgstr ""
+"وهو يدعم التشفير بواسطة OMEMO و OpenPGP يسمح بإعداد ميزات الخصوصية "
+"كالإيصالات المقروءة والإخطارات عند الكتابة."
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
-msgstr ""
+msgstr "يقوم دينو بجلب السِجلّ مِن السيرفر ثم يُزامِن الرسائل مع الأجهزة الأخرى."
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
-msgstr ""
+msgstr "النافذة الرئيسية بالمُحادثات"
#: main/data/add_conversation/conference_details_fragment.ui:19
#: main/data/add_conversation/add_groupchat_dialog.ui:49
#: main/data/add_conversation/add_contact_dialog.ui:49
msgid "Account"
-msgstr ""
+msgstr "الحساب"
#: main/data/add_conversation/conference_details_fragment.ui:123
#: main/data/add_conversation/add_groupchat_dialog.ui:120
msgid "Nick"
-msgstr ""
+msgstr "الإسم المستعار"
#: main/data/add_conversation/add_groupchat_dialog.ui:175
#: main/data/add_conversation/add_contact_dialog.ui:102
msgid "Alias"
-msgstr ""
+msgstr "اللقب"
#: main/data/add_conversation/add_contact_dialog.ui:8
msgid "Add Contact"
-msgstr ""
+msgstr "إضافة مُراسِل"
+
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr "لا يوجد بحث نشط"
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr "أكتب للشروع في البحث"
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr "لا توجد رسائل متطابقة"
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr "تحقق مِن التدقيق الإملائي أو حاول إزالة فلاتر"
+
+#~ msgid "Copy Link Address"
+#~ msgstr "نسخ العنوان"
+
+#~ msgid "Copy"
+#~ msgstr "نسخ"
+
+#~ msgid "Select All"
+#~ msgstr "اختيار الكل"
+
+#~ msgid "Search"
+#~ msgstr "البحث"
#~ msgid "Start Chat"
#~ msgstr "إبدأ الدردشة"
diff --git a/main/po/ca.po b/main/po/ca.po
index a2ecd3c8..4d93de40 100644
--- a/main/po/ca.po
+++ b/main/po/ca.po
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dino 20180510\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-05-10 14:38+0200\n"
"Last-Translator: fiaxh <weblate@mx.ax.lt>\n"
"Language-Team: Catalan <https://hosted.weblate.org/projects/dino/"
@@ -17,20 +17,25 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 2.19-dev\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "Petició de subscripció"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "Acepta"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "Rebutja"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -51,7 +56,6 @@ msgstr "Selecciona"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -65,52 +69,78 @@ msgstr "Imatges"
msgid "All files"
msgstr "Tots els fitxers"
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr "S'està connectant…"
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "Connectat"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "Desconnectat"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "Contrasenya incorrecta"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr "El certificat TLS és invàlid"
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "Error"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "Afegeix un compte"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
msgstr ""
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr ""
+
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
msgid "Me"
msgstr "Jo"
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr "%b %d"
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "Ahir"
@@ -155,22 +185,24 @@ msgid "Add"
msgstr "Afegeix"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "Desa"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr ""
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "Següent"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr ""
@@ -210,70 +242,58 @@ msgstr "Seleccioneu un sobrenom diferent"
msgid "Too many occupants in room"
msgstr "Massa ocupants a la sala"
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr "No hi ha cap compte actiu"
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr "Gestiona els comptes"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr "Cap conversa activa"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr "Avui"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr "%a, %b %d"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
msgid "is typing…"
msgid_plural "are typing…"
msgstr[0] "està escrivint…"
msgstr[1] "estan escrivint…"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr "ha parat d'escriure"
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr "Fitxer"
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr "El missatge és massa llarg"
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr "Copia l'adreça de l'enllaç"
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr "Copia"
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
-msgstr "Selecciona-ho tot"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "Fitxer"
#: main/src/ui/conversation_summary/subscription_notification.vala:48
msgid "This contact would like to add you to their contact list"
@@ -342,12 +362,27 @@ msgstr "Inicia una convesa privada"
msgid "Kick"
msgstr "Expulsa"
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr ""
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr ""
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr ""
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr "Detalls de la conferència"
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr "Detalls del contacte"
@@ -385,7 +420,7 @@ msgstr "Qui pot descobrir els JID reals?"
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -427,7 +462,7 @@ msgstr "Configuració de la sala"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr "Preferències"
@@ -493,12 +528,12 @@ msgstr "Notifica'm quan arriba un missatge nou"
msgid "Convert smileys to emojis"
msgstr "Converteix «smileys» a emoji"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr "Comptes"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr "Àlias local"
@@ -510,24 +545,41 @@ msgstr "No hi ha cap compte configurat"
msgid "Add an account"
msgstr "Afegeix un compte"
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr ""
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr "Sense xifrar"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr "Surt"
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr "Cerca"
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
+#: main/data/im.dino.Dino.appdata.xml.in:7
#, fuzzy
msgid "Modern XMPP Chat Client"
msgstr "Client d'XMPP modern"
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
@@ -537,7 +589,7 @@ msgstr ""
"proveir una experiència neta i fiable de Jabber/XMPP, sempre tenint en "
"compte la vostra privacitat."
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
@@ -547,7 +599,7 @@ msgstr ""
"funcionalitats relacionades amb la privacitat com per exemple rebuts de "
"lectura i notificacions d'escriptura."
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
@@ -555,7 +607,7 @@ msgstr ""
"Dino recupera l'historial del servidor i sincronitza els missatges amb "
"altres dispositius."
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
msgstr "Finestra principal amb converses"
@@ -579,6 +631,34 @@ msgstr "Àlias"
msgid "Add Contact"
msgstr "Afegeix el contacte"
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr ""
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr ""
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr ""
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr ""
+
+#~ msgid "Copy Link Address"
+#~ msgstr "Copia l'adreça de l'enllaç"
+
+#~ msgid "Copy"
+#~ msgstr "Copia"
+
+#~ msgid "Select All"
+#~ msgstr "Selecciona-ho tot"
+
+#~ msgid "Search"
+#~ msgstr "Cerca"
+
#~ msgid "Send message marker"
#~ msgstr "Envia marcador de missatge"
diff --git a/main/po/de.po b/main/po/de.po
index 203f4d96..f7b0788e 100644
--- a/main/po/de.po
+++ b/main/po/de.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dino-0.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
-"PO-Revision-Date: 2018-06-08 16:38+0000\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-09-18 17:25+0000\n"
"Last-Translator: fiaxh <weblate@mx.ax.lt>\n"
"Language-Team: German <https://hosted.weblate.org/projects/dino/translations/"
"de/>\n"
@@ -12,22 +12,27 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.0\n"
+"X-Generator: Weblate 3.2-dev\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "Kontaktanfrage"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "Annehmen"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "Ablehnen"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -48,7 +53,6 @@ msgstr "Auswählen"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -62,38 +66,64 @@ msgstr "Bilder"
msgid "All files"
msgstr "Alle Dateien"
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr "Verbinden…"
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "Verbunden"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "Nicht verbunden"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "Passwort falsch"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr "Ungültiges TLS-Zertifikat"
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "Fehler"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "Konto hinzufügen"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
-msgstr "JID sollte das Format “benutzer@example.com” haben"
+msgstr "JID sollte das Format “benutzer@beispiel.de” haben"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr "Keine Antwort vom Server"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr "Konto auf %s erstellen"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr "Der Server erfordert die Registrierung durch eine Webseite"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr "Registrierung öffnen"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr "Registrieren"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr "Eventuell sind auf %s Informationen zur Registrierung zu finden"
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
@@ -101,13 +131,13 @@ msgid "Me"
msgstr "Ich"
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr "%d. %b"
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "Gestern"
@@ -152,22 +182,24 @@ msgid "Add"
msgstr "Hinzufügen"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "Speichern"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr "Kanal beitreten"
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "Weiter"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr "Unterhaltung starten"
@@ -207,70 +239,58 @@ msgstr "Wähle einen anderen Spitznamen"
msgid "Too many occupants in room"
msgstr "Zu viele Nutzer im Raum"
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr "Keine Konten aktiv"
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr "Konten verwalten"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr "Keine Unterhaltung aktiv"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr "Heute"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr "%a, %d %b"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
msgstr "%s, %s und %i weitere"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
msgstr "%s, %s und %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
msgstr "%s und %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
msgid "is typing…"
msgid_plural "are typing…"
msgstr[0] "tippt gerade…"
msgstr[1] "tippen gerade…"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr "hat aufgehört zu tippen"
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr "Datei"
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr "Nachricht zu lang"
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr "Link-Adresse Kopieren"
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr "Kopieren"
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
-msgstr "Alles Auswählen"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "Datei"
#: main/src/ui/conversation_summary/subscription_notification.vala:48
msgid "This contact would like to add you to their contact list"
@@ -339,12 +359,27 @@ msgstr "Private Unterhaltung beginnen"
msgid "Kick"
msgstr "Hinauswerfen"
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr "%i Suchergebnisse"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr "In %s"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr "Mit %s"
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr "Konferenzdetails"
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr "Kontaktdetails"
@@ -383,7 +418,7 @@ msgstr "Wer kann echte JIDs sehen?"
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -425,7 +460,7 @@ msgstr "Raum Konfiguration"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr "Einstellungen"
@@ -491,12 +526,12 @@ msgstr "Benachrichtigen bei Empfang einer neuen Nachricht"
msgid "Convert smileys to emojis"
msgstr "Smileys zu Emojis umwandeln"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr "Konten"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr "Lokaler Alias"
@@ -508,24 +543,40 @@ msgstr "Keine Konten konfiguriert"
msgid "Add an account"
msgstr "Konto hinzufügen"
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr "Konto erstellen"
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr "Wähle einen öffentlichen Server"
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr "Oder gib eine Serveradresse an"
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr "Stattdessen anmelden"
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr "Anderen Server wählen"
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr "Unverschlüsselt"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr "Beenden"
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr "Suchen"
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
-#, fuzzy
+#: main/data/im.dino.Dino.appdata.xml.in:7
msgid "Modern XMPP Chat Client"
-msgstr "Moderner XMPP Client"
+msgstr "Moderner XMPP Chat Client"
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
@@ -535,7 +586,7 @@ msgstr ""
"und robuste Jabber/XMPP Erfahrung und legt einen Schwerpunkt auf "
"Privatsphäre."
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
@@ -545,7 +596,7 @@ msgstr ""
"enthält Privatsphäre-Einstellungen zu Lesebestätigungen und "
"Tippbenachrichtigungen."
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
@@ -553,7 +604,7 @@ msgstr ""
"Dino ruft Gesprächsverläufe vom Server ab und synchronisiert Nachrichten mit "
"anderen Geräten."
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
msgstr "Hauptfenster mit Konversationen"
@@ -577,6 +628,34 @@ msgstr "Alias"
msgid "Add Contact"
msgstr "Kontakt hinzufügen"
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr "Keine Suche gestartet"
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr "Tippe um eine Suche zu beginnen"
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr "Keine Nachrichten gefunden"
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr "Überprüfe die Schreibweise oder entferne Filter"
+
+#~ msgid "Copy Link Address"
+#~ msgstr "Link-Adresse Kopieren"
+
+#~ msgid "Copy"
+#~ msgstr "Kopieren"
+
+#~ msgid "Select All"
+#~ msgstr "Alles Auswählen"
+
+#~ msgid "Search"
+#~ msgstr "Suchen"
+
#~ msgid "Send message marker"
#~ msgstr "Lesebestätigung senden"
diff --git a/main/po/dino.pot b/main/po/dino.pot
index d21aedb3..2f7e5c1e 100644
--- a/main/po/dino.pot
+++ b/main/po/dino.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,20 +18,25 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr ""
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr ""
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr ""
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -52,7 +57,6 @@ msgstr ""
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -66,52 +70,78 @@ msgstr ""
msgid "All files"
msgstr ""
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr ""
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr ""
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr ""
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr ""
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr ""
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr ""
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr ""
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
msgstr ""
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr ""
+
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
msgid "Me"
msgstr ""
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr ""
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr ""
@@ -156,22 +186,24 @@ msgid "Add"
msgstr ""
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr ""
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr ""
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr ""
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr ""
@@ -211,69 +243,57 @@ msgstr ""
msgid "Too many occupants in room"
msgstr ""
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr ""
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr ""
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr ""
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr ""
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
msgid "is typing…"
msgid_plural "are typing…"
msgstr[0] ""
msgstr[1] ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr ""
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr ""
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr ""
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr ""
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr ""
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
msgstr ""
#: main/src/ui/conversation_summary/subscription_notification.vala:48
@@ -343,12 +363,27 @@ msgstr ""
msgid "Kick"
msgstr ""
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr ""
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr ""
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr ""
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr ""
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr ""
@@ -386,7 +421,7 @@ msgstr ""
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -428,7 +463,7 @@ msgstr ""
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr ""
@@ -493,12 +528,12 @@ msgstr ""
msgid "Convert smileys to emojis"
msgstr ""
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr ""
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr ""
@@ -510,43 +545,60 @@ msgstr ""
msgid "Add an account"
msgstr ""
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr ""
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr ""
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr ""
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr ""
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
+#: main/data/im.dino.Dino.appdata.xml.in:7
msgid "Modern XMPP Chat Client"
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
"privacy in mind."
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
"notifications."
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
msgstr ""
@@ -569,3 +621,19 @@ msgstr ""
#: main/data/add_conversation/add_contact_dialog.ui:8
msgid "Add Contact"
msgstr ""
+
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr ""
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr ""
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr ""
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr ""
diff --git a/main/po/en.po b/main/po/en.po
index dbad709b..75216ebb 100644
--- a/main/po/en.po
+++ b/main/po/en.po
@@ -2,26 +2,31 @@ msgid ""
msgstr ""
"Project-Id-Version: dino-0.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr ""
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr ""
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr ""
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -42,7 +47,6 @@ msgstr ""
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -56,52 +60,78 @@ msgstr ""
msgid "All files"
msgstr ""
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr ""
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr ""
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr ""
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr ""
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr ""
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr ""
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr ""
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
msgstr ""
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr ""
+
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
msgid "Me"
msgstr ""
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr ""
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr ""
@@ -146,22 +176,24 @@ msgid "Add"
msgstr ""
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr ""
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr ""
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr ""
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr ""
@@ -201,69 +233,57 @@ msgstr ""
msgid "Too many occupants in room"
msgstr ""
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr ""
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr ""
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr ""
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr ""
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
msgid "is typing…"
msgid_plural "are typing…"
msgstr[0] ""
msgstr[1] ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr ""
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr ""
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr ""
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr ""
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr ""
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
msgstr ""
#: main/src/ui/conversation_summary/subscription_notification.vala:48
@@ -333,12 +353,27 @@ msgstr ""
msgid "Kick"
msgstr ""
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr ""
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr ""
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr ""
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr ""
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr ""
@@ -376,7 +411,7 @@ msgstr ""
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -418,7 +453,7 @@ msgstr ""
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr ""
@@ -483,12 +518,12 @@ msgstr ""
msgid "Convert smileys to emojis"
msgstr ""
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr ""
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr ""
@@ -500,43 +535,60 @@ msgstr ""
msgid "Add an account"
msgstr ""
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr ""
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr ""
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr ""
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr ""
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
+#: main/data/im.dino.Dino.appdata.xml.in:7
msgid "Modern XMPP Chat Client"
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
"privacy in mind."
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
"notifications."
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
msgstr ""
@@ -559,3 +611,19 @@ msgstr ""
#: main/data/add_conversation/add_contact_dialog.ui:8
msgid "Add Contact"
msgstr ""
+
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr ""
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr ""
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr ""
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr ""
diff --git a/main/po/eo.po b/main/po/eo.po
index 04681807..b449a285 100644
--- a/main/po/eo.po
+++ b/main/po/eo.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-03-31 13:36+0000\n"
"Last-Translator: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>\n"
"Language-Team: Esperanto <https://hosted.weblate.org/projects/dino/"
@@ -19,20 +19,25 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 2.20-dev\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "Abona peto"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "Akcepti"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "Rifuzi"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -53,7 +58,6 @@ msgstr "Elekti"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -67,52 +71,78 @@ msgstr "Bildoj"
msgid "All files"
msgstr ""
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr ""
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "Konektita"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "Malkonektita"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "Malĝusta pasvorto"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr ""
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "Eraro"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "Aldoni Konton"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
msgstr ""
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr ""
+
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
msgid "Me"
msgstr ""
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr "%b %d"
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "Hieraŭ"
@@ -157,22 +187,24 @@ msgid "Add"
msgstr "Aldoni"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "Konservi"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr ""
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "Sekva"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr ""
@@ -212,70 +244,58 @@ msgstr ""
msgid "Too many occupants in room"
msgstr ""
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr "Neniuj aktivaj kontoj"
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr "Administri kontojn"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr "Neniu aktiva interparolo"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr ""
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
#, fuzzy
msgid "is typing…"
msgid_plural "are typing…"
msgstr[0] "tajpas…"
msgstr[1] "tajpas…"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr "ĉesis tajpi"
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr ""
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr ""
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr ""
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr ""
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
msgstr ""
#: main/src/ui/conversation_summary/subscription_notification.vala:48
@@ -345,12 +365,27 @@ msgstr "Komenci privatan interparolon"
msgid "Kick"
msgstr ""
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr ""
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr ""
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr ""
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr ""
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr "Kontaktaj Detaloj"
@@ -388,7 +423,7 @@ msgstr "Kiu rajtas eltrovi verajn JID-ojn?"
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -430,7 +465,7 @@ msgstr "Ĉambraj Agordoj"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr "Agordoj"
@@ -495,12 +530,12 @@ msgstr "Sciigi pri envenaj mesaĝoj"
msgid "Convert smileys to emojis"
msgstr "Grafikigi tekstajn mienetojn"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr "Kontoj"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr "Loka kaŝnomo"
@@ -512,43 +547,60 @@ msgstr ""
msgid "Add an account"
msgstr "Aldoni konton"
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr ""
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr "Neĉifrita"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr "Ĉesi"
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr "Serĉi"
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
+#: main/data/im.dino.Dino.appdata.xml.in:7
msgid "Modern XMPP Chat Client"
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
"privacy in mind."
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
"notifications."
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
msgstr ""
@@ -572,6 +624,25 @@ msgstr "Kaŝnomo"
msgid "Add Contact"
msgstr ""
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr ""
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr ""
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr ""
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr ""
+
+#~ msgid "Search"
+#~ msgstr "Serĉi"
+
#~ msgid "Send message marker"
#~ msgstr "Sendi mesaĝmarkilon"
diff --git a/main/po/es.po b/main/po/es.po
index 637aebba..7232e398 100644
--- a/main/po/es.po
+++ b/main/po/es.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
-"PO-Revision-Date: 2018-05-06 17:05+0000\n"
-"Last-Translator: mgueji <miguejim@mailbox.org>\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-09-29 07:35+0000\n"
+"Last-Translator: Bonber Rash <bonber@protonmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/dino/"
"translations/es/>\n"
"Language: es\n"
@@ -17,22 +17,27 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.0-dev\n"
+"X-Generator: Weblate 3.2-dev\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "Solicitud de suscripción"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "Aceptar"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "Denegar"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -53,7 +58,6 @@ msgstr "Seleccionar"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -67,52 +71,78 @@ msgstr "Imágenes"
msgid "All files"
msgstr "Todos los ficheros"
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr "Conectando…"
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "Conectado"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "Desconectado"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "Contraseña incorrecta"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr "Certificado TLS no válido"
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "Error"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "Añadir Cuenta"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
msgstr "El JID debe tener la forma \"usuario@ejemplo.com\""
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr "No hay respuesta del servidor"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr "Registrado en %s"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr "El servidor requiere registrarse a través de un sitio web"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr "Registro abierto"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr "Registro"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr "Mira %s para mas información sobre el registro"
+
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
msgid "Me"
msgstr "Yo"
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr "%d %b"
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "Ayer"
@@ -157,22 +187,24 @@ msgid "Add"
msgstr "Añadir"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "Guardar"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr "Unirse a canal"
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "Siguiente"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr "Iniciar conversación"
@@ -213,70 +245,58 @@ msgstr "Elige un alias diferente"
msgid "Too many occupants in room"
msgstr "La conversación tiene demasiados ocupantes"
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr "No hay cuentas activas"
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr "Gestionar cuentas"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr "No hay conversaciones activa"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr "Hoy"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr "%a, %d %b"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
msgstr "%s, %s y %i otros"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
msgstr "%s, %s y %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
msgstr "%s y %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
msgid "is typing…"
msgid_plural "are typing…"
msgstr[0] "está escribiendo…"
msgstr[1] "están escribiendo…"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr "ha dejado de escribir"
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr "Archivo"
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr "Mensaje demasiado largo"
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr "Copiar dirección del enlace"
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr "Copiar"
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
-msgstr "Seleccionar todo"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "Archivo"
#: main/src/ui/conversation_summary/subscription_notification.vala:48
msgid "This contact would like to add you to their contact list"
@@ -345,12 +365,27 @@ msgstr "Iniciar conversación privada"
msgid "Kick"
msgstr "Expulsar"
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr "%i resultados de la busqueda"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr "En %s"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr "Con %s"
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr "Detalles de la Conversación"
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr "Detalles del contacto"
@@ -388,7 +423,7 @@ msgstr "¿Quién puede ver los JIDs reales?"
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -432,7 +467,7 @@ msgstr "Configuración de la conversación en grupo"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr "Ajustes"
@@ -497,12 +532,12 @@ msgstr "Notificar cuando llega un nuevo mensaje"
msgid "Convert smileys to emojis"
msgstr "Convertir smileys en emojis"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr "Cuentas"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr "Alias local"
@@ -514,24 +549,40 @@ msgstr "No hay cuentas activas"
msgid "Add an account"
msgstr "Añadir una cuenta"
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr "Crear cuenta"
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr "Escoger un servidor publico"
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr "O especifica la dirección del servidor"
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr "Inicio de sesión requerido"
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr "Escoge otro servidor"
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr "Sin cifrar"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr "Salir"
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr "Buscar"
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
-#, fuzzy
+#: main/data/im.dino.Dino.appdata.xml.in:7
msgid "Modern XMPP Chat Client"
-msgstr "Cliente XMPP moderno"
+msgstr "Cliente de XMPP moderno"
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
@@ -541,7 +592,7 @@ msgstr ""
"enfocado en proveer una experiencia Jabber/XMPP limpia y confiable teniendo "
"tu privacidad en mente."
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
@@ -551,7 +602,7 @@ msgstr ""
"configurar las características relacionadas con la privacidad, como "
"confirmaciones de lectura y notificaciones de escritura."
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
@@ -559,7 +610,7 @@ msgstr ""
"Dino recupera los mensajes desde el servidor y sincroniza los mensajes con "
"otros dispositivos."
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
msgstr "Ventana principal con conversaciones"
@@ -583,6 +634,34 @@ msgstr "Alias"
msgid "Add Contact"
msgstr "Añadir contacto"
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr "Busqueda no activa"
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr "Escribe para empezar una busqueda"
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr "Sin mensajes que coincidan"
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr "Verifique la ortografía o intente eliminar los filtros"
+
+#~ msgid "Copy Link Address"
+#~ msgstr "Copiar dirección del enlace"
+
+#~ msgid "Copy"
+#~ msgstr "Copiar"
+
+#~ msgid "Select All"
+#~ msgstr "Seleccionar todo"
+
+#~ msgid "Search"
+#~ msgstr "Buscar"
+
#~ msgid "Send message marker"
#~ msgstr "Enviar confirmación al recibir y al leer los mensajes"
diff --git a/main/po/eu.po b/main/po/eu.po
index d83e01ac..7696f6e2 100644
--- a/main/po/eu.po
+++ b/main/po/eu.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
-"PO-Revision-Date: 2018-05-13 08:34+0000\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-09-11 15:13+0000\n"
"Last-Translator: Aitor Beriain <beriain@bitmessage.ch>\n"
"Language-Team: Basque <https://hosted.weblate.org/projects/dino/translations/"
"eu/>\n"
@@ -17,22 +17,27 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.0-dev\n"
+"X-Generator: Weblate 3.2-dev\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "Harpidetzaren eskaera"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "Onartu"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "Ukatu"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -53,7 +58,6 @@ msgstr "Hautatu"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -67,52 +71,78 @@ msgstr "Irudiak"
msgid "All files"
msgstr "Fitxategi guztiak"
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr "Konektatzen…"
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "Konektatuta"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "Ez konektatuta"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "Pasahitz okerra"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr "TLS ziurtagiri ez balidouna"
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "Akatsa"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "Kontua gehitu"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
msgstr "JIDak \"erabiltzailea@eredua.com\" itxura izan beharko luke"
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr "Erantzunik ez zerbitzaritik"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr "Izena eman hemen: %s"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr "Zerbitzariak webgune baten bidez izena ematea eskatzen du"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr "Izen emate irekia"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr "Izena eman"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr "Ikusi %s izena ematearen inguruko informazioa lortzeko"
+
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
msgid "Me"
msgstr "Ni"
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr "%b %d"
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "Atzo"
@@ -157,22 +187,24 @@ msgid "Add"
msgstr "Gehitu"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "Gorde"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr "Kanalera gehitu"
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "Hurrengoa"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr "Elkarrizketa hasi"
@@ -212,70 +244,58 @@ msgstr "Ezizen ezberdin bat hautatu"
msgid "Too many occupants in room"
msgstr "Gelak kide gehiegi ditu"
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr "Ez dago kontu aktiborik"
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr "Kontuak kudeatu"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr "Ez dago solasaldi aktiborik"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr "Gaur"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr "%a, %b %d"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
msgstr "%s, %s eta beste %i"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
msgstr "%s, %s eta %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
msgstr "%s eta %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
msgid "is typing…"
msgid_plural "are typing…"
msgstr[0] "idazten ari da…"
msgstr[1] "idazten ari dira…"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr "idazteari utzi dio"
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr "Fitxategia"
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr "Mezu luzeegia"
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr "Loturaren helbidea kopiatu"
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr "Kopiatu"
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
-msgstr "Dena hautatu"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "Fitxategia"
#: main/src/ui/conversation_summary/subscription_notification.vala:48
msgid "This contact would like to add you to their contact list"
@@ -344,12 +364,27 @@ msgstr "Solasaldi pribatua hasi"
msgid "Kick"
msgstr "Kanporatu"
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr "Bilaketaren emaitzak: %i"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr "hemen %s"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr "%s(r)ekin"
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr "Konferentziaren xehetasunak"
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr "Kontaktuaren xehetasunak"
@@ -387,7 +422,7 @@ msgstr "Nork ikus ditzake egiazko JIDak?"
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -430,7 +465,7 @@ msgstr "Gelaren konfigurazioa"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr "Ezarpenak"
@@ -496,12 +531,12 @@ msgstr "Mezu berri bat heltzerakoan jakinarazi"
msgid "Convert smileys to emojis"
msgstr "Irrifartxoak emotikono bihurtu"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr "Kontuak"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr "Bertako ezizena"
@@ -513,24 +548,40 @@ msgstr "Ez dago konfiguratutako konturik"
msgid "Add an account"
msgstr "Kontu bat gehitu"
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr "Kontua sortu"
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr "Zerbitzari publiko bat hautatu"
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr "Edo zerbitzari baten helbidea zehaztu"
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr "Saioa hasi"
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr "Beste zerbitzari bat hartu"
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr "Enkriptatu gabe"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr "Irten"
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr "Bilatu"
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
-#, fuzzy
+#: main/data/im.dino.Dino.appdata.xml.in:7
msgid "Modern XMPP Chat Client"
-msgstr "XMPP bezero modernoa"
+msgstr "XMPP txat bezero modernoa"
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
@@ -540,17 +591,17 @@ msgstr ""
"esperientzia garbi eta fidagarri bat ematen du zure pribatutasuna kontuan "
"hartzeaz gain."
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
"notifications."
msgstr ""
"Amaieratik amaierarako enkriptazioa onartzen du OMEMO eta OpenPGPrekin eta "
-"pribatutasun ezaugarriak konfiguratzea baimentzen du irakurtze baieztapenak "
-"eta idazketa jakinarazpenak bezala."
+"pribatutasun ezaugarriak konfiguratzea baimentzen du irakurtze markak eta "
+"idazketa jakinarazpenak bezala."
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
@@ -558,7 +609,7 @@ msgstr ""
"Dinok zerbitzaritik hartzen du historia eta beste gailuekin mezuak "
"sinkronizatzen ditu."
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
msgstr "Leiho nagusia elkarrizketekin"
@@ -582,6 +633,34 @@ msgstr "Ezizena"
msgid "Add Contact"
msgstr "Kontaktua gehitu"
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr "Ez dago bilaketa aktiborik"
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr "Idatzi bilatzen hasteko"
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr "Ez dago bat egiten duen mezurik"
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr "Ortografia egiaztatu edo saiatu iragazkiak kentzen"
+
+#~ msgid "Copy Link Address"
+#~ msgstr "Loturaren helbidea kopiatu"
+
+#~ msgid "Copy"
+#~ msgstr "Kopiatu"
+
+#~ msgid "Select All"
+#~ msgstr "Dena hautatu"
+
+#~ msgid "Search"
+#~ msgstr "Bilatu"
+
#~ msgid "Send message marker"
#~ msgstr "Mezu marka bidali"
diff --git a/main/po/fi.po b/main/po/fi.po
index d245eba8..8bee495f 100644
--- a/main/po/fi.po
+++ b/main/po/fi.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-05-13 10:18+0000\n"
"Last-Translator: mjlapin <muu@kapsi.fi>\n"
"Language-Team: Finnish <https://hosted.weblate.org/projects/dino/"
@@ -19,20 +19,25 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.0-dev\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "Yhteyspyyntö"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "Hyväksy"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "Hylkää"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -53,7 +58,6 @@ msgstr "Valitse"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -67,52 +71,78 @@ msgstr "Kuvat"
msgid "All files"
msgstr "Kaikki tiedostot"
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr "Yhdistää…"
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "Yhdistetty"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "Ei yhdistetty"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "Väärä salasana"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr "TLS-varmenne ei kelpaa"
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "Virhe"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "Lisää tili"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
msgstr "Anna JID muodossa \"user@example.com\""
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr ""
+
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
msgid "Me"
msgstr "Minä"
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr "%d. %b"
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "Eilen"
@@ -157,22 +187,24 @@ msgid "Add"
msgstr "Lisää"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "Tallenna"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr "Liity kanavalle"
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "Seuraava"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr "Aloita keskustelu"
@@ -212,70 +244,58 @@ msgstr "Valitse jokin muu nimimerkki"
msgid "Too many occupants in room"
msgstr "Liikaa käyttäjiä huoneessa"
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr "Ei aktiivisia tilejä"
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr "Hallitse tilejä"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr "Ei aktiivisia keskusteluja"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr "Tänään"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr "%a, %b %d"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
msgstr "%s, %s and %i muuta"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
msgstr "%s, %s ja %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
msgstr "%s ja %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
msgid "is typing…"
msgid_plural "are typing…"
msgstr[0] "kirjoittaa…"
msgstr[1] "kirjoittavat…"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr "on lakannut kirjoittamasta"
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr "Tiedosto"
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr "Viesti liian pitkä"
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr "Kopioi linkin osoite"
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr "Kopioi"
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
-msgstr "Valitse kaikki"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "Tiedosto"
#: main/src/ui/conversation_summary/subscription_notification.vala:48
msgid "This contact would like to add you to their contact list"
@@ -344,12 +364,27 @@ msgstr "Aloita yksityiskeskustelu"
msgid "Kick"
msgstr "Potkaise pihalle"
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr ""
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr ""
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr ""
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr "Ryhmäkeskustelun yksityiskohdat"
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr "Yhteystiedot"
@@ -387,7 +422,7 @@ msgstr "Kuka voi nähdä oikeat JID:t?"
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -429,7 +464,7 @@ msgstr "Huoneen asetukset"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr "Asetukset"
@@ -494,12 +529,12 @@ msgstr "Ilmoita kun uusi viesti saapuu"
msgid "Convert smileys to emojis"
msgstr "Muuta hymiöt emojeiksi"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr "Tilit"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr "Paikallinen alias"
@@ -511,24 +546,41 @@ msgstr "Ei asetettuja tilejä"
msgid "Add an account"
msgstr "Lisää tili"
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr ""
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr "Salaamaton"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr "Lopeta"
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr "Etsi"
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
+#: main/data/im.dino.Dino.appdata.xml.in:7
#, fuzzy
msgid "Modern XMPP Chat Client"
msgstr "Moderni XMPP-asiakasohjelma"
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
@@ -538,7 +590,7 @@ msgstr ""
"keskittyy tarjoamaan selkeän ja luotettavan Jabber/XMPP-kokemuksen "
"unohtamatta yksityisyyttäsi."
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
@@ -548,7 +600,7 @@ msgstr ""
"mahdollistaa yksityisyyteen liittyvien ominaisuuksien, kuten lukukuittausten "
"ja kirjoitusilmoitusten asetusten määrittämisen."
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
@@ -556,7 +608,7 @@ msgstr ""
"Dino hakee historian palvelimelta ja synkronisoi viestit muiden laitteiden "
"kanssa."
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
msgstr "Keskustelut pääikkunassa"
@@ -580,6 +632,34 @@ msgstr "Alias"
msgid "Add Contact"
msgstr "Lisää yhteystieto"
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr ""
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr ""
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr ""
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr ""
+
+#~ msgid "Copy Link Address"
+#~ msgstr "Kopioi linkin osoite"
+
+#~ msgid "Copy"
+#~ msgstr "Kopioi"
+
+#~ msgid "Select All"
+#~ msgstr "Valitse kaikki"
+
+#~ msgid "Search"
+#~ msgstr "Etsi"
+
#~ msgid "Send message marker"
#~ msgstr "Lähetä lukukuittaus"
diff --git a/main/po/fr.po b/main/po/fr.po
index 46b96a23..ffd79de0 100644
--- a/main/po/fr.po
+++ b/main/po/fr.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
-"PO-Revision-Date: 2018-05-06 18:23+0000\n"
-"Last-Translator: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-10-22 04:29+0000\n"
+"Last-Translator: Jean-Baptiste <jean-baptiste@holcroft.fr>\n"
"Language-Team: French <https://hosted.weblate.org/projects/dino/translations/"
"fr/>\n"
"Language: fr\n"
@@ -17,22 +17,27 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 3.0-dev\n"
+"X-Generator: Weblate 3.3-dev\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "Demande d’abonnement"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "Accepter"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "Refuser"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -53,7 +58,6 @@ msgstr "Choisir"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -67,52 +71,78 @@ msgstr "Images"
msgid "All files"
msgstr "Tous les fichiers"
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr "Connexion…"
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "Connecté"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "Déconnecté"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "Mauvais mot de passe"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr "Certificat TLS invalide"
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "Erreur"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "Ajouter un compte"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
msgstr "Le JID doit être de la forme « utilisateur@example.com »"
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr "Pas de réponse du serveur"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr "S’inscrire sur %s"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr "Ce serveur nécessite de s’inscrire depuis son site web"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr "Inscription ouverte"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr "S’inscrire"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr "Consultez %s pour plus d’informations sur comment s’inscrire"
+
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
msgid "Me"
msgstr "Moi"
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr "%d %b"
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "Hier"
@@ -157,22 +187,24 @@ msgid "Add"
msgstr "Ajouter"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "Sauver"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr "Rejoindre un salon"
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "Suivant"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr "Commencer une discussion"
@@ -212,70 +244,58 @@ msgstr "Choisissez un autre pseudo"
msgid "Too many occupants in room"
msgstr "Trop de participants dans ce salon"
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr "Aucun compte actif"
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr "Gérer les comptes"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr "Aucune discussion en cours"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr "Aujourd’hui"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr "%a %d %b"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
msgstr "%s, %s et %i autres"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
msgstr "%s, %s et %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
msgstr "%s et %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
msgid "is typing…"
msgid_plural "are typing…"
msgstr[0] "est en train d’écrire…"
msgstr[1] "sont en train d’écrire…"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr "a arrêté d’écrire"
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr "Fichier"
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr "Message trop long"
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr "Copier l’adresse du lien"
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr "Copier"
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
-msgstr "Tout sélectionner"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "Fichier"
#: main/src/ui/conversation_summary/subscription_notification.vala:48
msgid "This contact would like to add you to their contact list"
@@ -344,12 +364,27 @@ msgstr "Commencer une discussion privée"
msgid "Kick"
msgstr "Éjecter"
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr "%i résultats de recherche"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr "Dans %s"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr "Avec %s"
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr "Informations du salon"
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr "Informations du contact"
@@ -387,7 +422,7 @@ msgstr "Qui peut découvrir les vrais JID ?"
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -402,6 +437,7 @@ msgid "Moderated"
msgstr "Modéré"
#: main/src/ui/contact_details/muc_config_form_provider.vala:64
+#, fuzzy
msgid "Only occupants with voice may send messages"
msgstr "Seuls les membres ayant voix peu"
@@ -429,7 +465,7 @@ msgstr "Configuration du salon"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr "Paramètres"
@@ -494,12 +530,12 @@ msgstr "Notifier l’arrivée de nouveaux messages"
msgid "Convert smileys to emojis"
msgstr "Convertir les smileys en emojis"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr "Comptes"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr "Alias local"
@@ -511,24 +547,40 @@ msgstr "Aucun compte configuré"
msgid "Add an account"
msgstr "Ajouter un compte"
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr "Créer un compte"
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr "Choisissez un serveur public"
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr "Ou indiquez l’adresse d’un serveur"
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr "Connectez-vous à la place"
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr "Choisissez un autre serveur"
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr "Non-chiffré"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr "Quitter"
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr "Rechercher"
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
-#, fuzzy
+#: main/data/im.dino.Dino.appdata.xml.in:7
msgid "Modern XMPP Chat Client"
msgstr "Client XMPP moderne"
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
@@ -538,7 +590,7 @@ msgstr ""
"fournir une expérience Jabber/XMPP simple et fiable tout en ayant toujours à "
"l’esprit votre vie privée."
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
@@ -548,7 +600,7 @@ msgstr ""
"permet de configurer les fonctions liées à la vie privée telles que l’accusé "
"de réception et les notifications de frappe."
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
@@ -556,7 +608,7 @@ msgstr ""
"Dino récupère l’historique du serveur et synchronise les messages avec "
"d'autres appareils."
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
msgstr "Fenêtre principale avec des conversations"
@@ -580,6 +632,34 @@ msgstr "Alias"
msgid "Add Contact"
msgstr "Ajouter un contact"
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr "Pas de recherche en cours"
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr "Commencez à écrire pour lancer une recherche"
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr "Aucun message correspondant"
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr "Vérifiez l’orthographe ou essayez de supprimer des filtres"
+
+#~ msgid "Copy Link Address"
+#~ msgstr "Copier l’adresse du lien"
+
+#~ msgid "Copy"
+#~ msgstr "Copier"
+
+#~ msgid "Select All"
+#~ msgstr "Tout sélectionner"
+
+#~ msgid "Search"
+#~ msgstr "Rechercher"
+
#~ msgid "Send message marker"
#~ msgstr "Envoyer les marqueurs de message"
diff --git a/main/po/gl.po b/main/po/gl.po
new file mode 100644
index 00000000..16a64742
--- /dev/null
+++ b/main/po/gl.po
@@ -0,0 +1,659 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-09-29 05:27+0000\n"
+"Last-Translator: Xosé M <xosem@disroot.org>\n"
+"Language-Team: Galician <https://hosted.weblate.org/projects/dino/"
+"translations/gl/>\n"
+"Language: gl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 3.2-dev\n"
+
+#: main/src/ui/notifications.vala:71
+msgid "Subscription request"
+msgstr "Petición de suscrición"
+
+#: main/src/ui/notifications.vala:77
+#: main/src/ui/conversation_summary/subscription_notification.vala:37
+msgid "Accept"
+msgstr "Aceptar"
+
+#: main/src/ui/notifications.vala:78
+#: main/src/ui/conversation_summary/subscription_notification.vala:38
+msgid "Deny"
+msgstr "Rexeitar"
+
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
+#: main/src/ui/manage_accounts/dialog.vala:126
+#, c-format
+msgid "Remove account %s?"
+msgstr "Eliminar a conta %s?"
+
+#: main/src/ui/manage_accounts/dialog.vala:129
+msgid "Remove"
+msgstr "Eliminar"
+
+#: main/src/ui/manage_accounts/dialog.vala:153
+msgid "Select avatar"
+msgstr "Escoller avatar"
+
+#: main/src/ui/manage_accounts/dialog.vala:153
+msgid "Select"
+msgstr "Escolla"
+
+#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
+#: main/src/ui/add_conversation/add_conference_dialog.vala:16
+#: main/src/ui/add_conversation/select_contact_dialog.vala:41
+#: main/data/add_conversation/add_groupchat_dialog.ui:11
+#: main/data/add_conversation/add_contact_dialog.ui:12
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: main/src/ui/manage_accounts/dialog.vala:161
+msgid "Images"
+msgstr "Imaxes"
+
+#: main/src/ui/manage_accounts/dialog.vala:165
+msgid "All files"
+msgstr "Todos os ficheiros"
+
+#: main/src/ui/manage_accounts/dialog.vala:222
+msgid "Connecting…"
+msgstr "Conectando…"
+
+#: main/src/ui/manage_accounts/dialog.vala:224
+msgid "Connected"
+msgstr "Conectada"
+
+#: main/src/ui/manage_accounts/dialog.vala:226
+msgid "Disconnected"
+msgstr "Desconectada"
+
+#: main/src/ui/manage_accounts/dialog.vala:235
+msgid "Wrong password"
+msgstr "Contrasinal incorrecto"
+
+#: main/src/ui/manage_accounts/dialog.vala:237
+msgid "Invalid TLS certificate"
+msgstr "Certificado TLS non válido"
+
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
+msgid "Error"
+msgstr "Fallo"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
+msgid "Add Account"
+msgstr "Engadir conta"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
+msgid "JID should be of the form “user@example.com”"
+msgstr "JID debe ter o formato \"usuaria@servidor.com\""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr "Sen resposta do servidor"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr "Rexistrar en %s"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr "O servidor solicita que se rexistre na súa web"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr "Rexistro aberto"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr "Rexistrar"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr "Comprobe %s para ter información sobre como rexistrarse"
+
+#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
+#: main/src/ui/conversation_selector/chat_row.vala:30
+msgid "Me"
+msgstr "Eu"
+
+#: main/src/ui/conversation_selector/conversation_row.vala:154
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#, no-c-format
+msgid "%b %d"
+msgstr "%b %d"
+
+#: main/src/ui/conversation_selector/conversation_row.vala:158
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
+msgid "Yesterday"
+msgstr "Onte"
+
+#: main/src/ui/conversation_selector/conversation_row.vala:161
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:196
+#, no-c-format
+msgid "%H∶%M"
+msgstr "%H∶%M"
+
+#: main/src/ui/conversation_selector/conversation_row.vala:162
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:197
+#, no-c-format
+msgid "%l∶%M %p"
+msgstr "%l∶%M %p"
+
+#: main/src/ui/conversation_selector/conversation_row.vala:165
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:201
+#, c-format
+msgid "%i min ago"
+msgid_plural "%i mins ago"
+msgstr[0] "hai %i min"
+msgstr[1] "hai %i minutos"
+
+#: main/src/ui/conversation_selector/conversation_row.vala:167
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:203
+msgid "Just now"
+msgstr "Xusto agora"
+
+#: main/src/ui/application.vala:44
+msgid "Join Conference"
+msgstr "Unirse a Sala"
+
+#: main/src/ui/application.vala:44
+#: main/src/ui/add_conversation/add_conference_dialog.vala:63
+#: main/src/ui/add_conversation/conference_details_fragment.vala:133
+msgid "Join"
+msgstr "Unirse"
+
+#: main/src/ui/add_conversation/add_groupchat_dialog.vala:28
+#: main/data/add_conversation/add_contact_dialog.ui:24
+msgid "Add"
+msgstr "Engadir"
+
+#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
+#: main/data/manage_accounts/add_account_dialog.ui:119
+msgid "Save"
+msgstr "Gardar"
+
+#: main/src/ui/add_conversation/add_conference_dialog.vala:27
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
+msgid "Join Channel"
+msgstr "Unirse a Canal"
+
+#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
+msgid "Next"
+msgstr "Seguinte"
+
+#: main/src/ui/add_conversation/select_contact_dialog.vala:85
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
+msgid "Start Conversation"
+msgstr "Iniciar Conversa"
+
+#: main/src/ui/add_conversation/select_contact_dialog.vala:86
+msgid "Start"
+msgstr "Iniciar"
+
+#: main/src/ui/add_conversation/conference_details_fragment.vala:108
+msgid "Joining…"
+msgstr "Uníndose…"
+
+#: main/src/ui/add_conversation/conference_details_fragment.vala:138
+msgid "Password required to enter room"
+msgstr "Precisa un contrasinal para entrar na sala"
+
+#: main/src/ui/add_conversation/conference_details_fragment.vala:143
+msgid "Banned from joining or creating conference"
+msgstr "Non ter permiso para unirse ou crear a conferencia"
+
+#: main/src/ui/add_conversation/conference_details_fragment.vala:145
+msgid "Room does not exist"
+msgstr "A Sala non existe"
+
+#: main/src/ui/add_conversation/conference_details_fragment.vala:147
+msgid "Not allowed to create room"
+msgstr "Non pode crear a sala"
+
+#: main/src/ui/add_conversation/conference_details_fragment.vala:149
+msgid "Members-only room"
+msgstr "Sala só para membros"
+
+#: main/src/ui/add_conversation/conference_details_fragment.vala:152
+msgid "Choose a different nick"
+msgstr "Escolla un alcume diferente"
+
+#: main/src/ui/add_conversation/conference_details_fragment.vala:154
+msgid "Too many occupants in room"
+msgstr "Demasiada xente na sala"
+
+#: main/src/ui/unified_window.vala:233
+msgid "No active accounts"
+msgstr "Sen contas activas"
+
+#: main/src/ui/unified_window.vala:234
+msgid "Manage accounts"
+msgstr "Xestionar contas"
+
+#: main/src/ui/unified_window.vala:241
+msgid "No active conversations"
+msgstr "Sen conversas activas"
+
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
+msgid "Today"
+msgstr "Hoxe"
+
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
+msgid "%a, %b %d"
+msgstr "%a, %b %d"
+
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
+#, c-format
+msgid "%s, %s and %i others"
+msgstr "%s, %s e %i outros"
+
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#, c-format
+msgid "%s, %s and %s"
+msgstr "%s, %s e %s"
+
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#, c-format
+msgid "%s and %s"
+msgstr "%s e %s"
+
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
+msgid "is typing…"
+msgid_plural "are typing…"
+msgstr[0] "está a escribir…"
+msgstr[1] "están escribindo…"
+
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+msgid "has stopped typing"
+msgstr "deixou de escribir"
+
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
+msgid "Message too long"
+msgstr "Mensaxe demasiado longa"
+
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "Ficheiro"
+
+#: main/src/ui/conversation_summary/subscription_notification.vala:48
+msgid "This contact would like to add you to their contact list"
+msgstr "Este contacto gostaríalle engadila a súa listaxe de contactos"
+
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:184
+#, no-c-format
+msgid "%x, %H∶%M"
+msgstr "%x, %H∶%M"
+
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:185
+#, no-c-format
+msgid "%x, %l∶%M %p"
+msgstr "%x, %l∶%M %p"
+
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:188
+#, no-c-format
+msgid "%b %d, %H∶%M"
+msgstr "%b %d, %H∶%M"
+
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:189
+#, no-c-format
+msgid "%b %d, %l∶%M %p"
+msgstr "%b %d, %l∶%M %p"
+
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:192
+#, no-c-format
+msgid "%a, %H∶%M"
+msgstr "%a, %H∶%M"
+
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:193
+#, no-c-format
+msgid "%a, %l∶%M %p"
+msgstr "%a, %l∶%M %p"
+
+#: main/src/ui/occupant_menu/list.vala:106
+msgid "Owner"
+msgstr "Dona"
+
+#: main/src/ui/occupant_menu/list.vala:108
+msgid "Admin"
+msgstr "Admin"
+
+#: main/src/ui/occupant_menu/list.vala:110
+msgid "Member"
+msgstr "Participante"
+
+#: main/src/ui/occupant_menu/list.vala:112
+msgid "User"
+msgstr "Usuaria"
+
+#: main/src/ui/occupant_menu/view.vala:27
+#: main/src/ui/occupant_menu/view.vala:36
+msgid "Invite"
+msgstr "Convidar"
+
+#: main/src/ui/occupant_menu/view.vala:35
+msgid "Invite to Conference"
+msgstr "Convidar a Conferencia"
+
+#: main/src/ui/occupant_menu/view.vala:85
+msgid "Start private conversation"
+msgstr "Iniciar conversa privada"
+
+#: main/src/ui/occupant_menu/view.vala:93
+msgid "Kick"
+msgstr "Expulsar"
+
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr "%i resultados da busca"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr "En %s"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr "Con %s"
+
+#: main/src/ui/contact_details/dialog.vala:37
+msgid "Conference Details"
+msgstr "Detalles da Conferencia"
+
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
+msgid "Contact Details"
+msgstr "Detalles do contacto"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:39
+msgid "Name of the room"
+msgstr "Nome da sala"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:42
+msgid "Description of the room"
+msgstr "Descrición da sala"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:45
+msgid "Persistent"
+msgstr "Persistente"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:46
+msgid "The room will persist after the last occupant leaves"
+msgstr "A sala permanecerá despois de que salga o derradeiro ocupante"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:49
+msgid "Publicly searchable"
+msgstr "Pódese atopar públicamente"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:52
+msgid "Occupants may change the subject"
+msgstr "As participantes poden cambiar o asunto"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:55
+msgid "Discover real JIDs"
+msgstr "Descubrir os JIDs reais"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:56
+msgid "Who may discover real JIDs?"
+msgstr "Quen pode descubrir os JIDs reais?"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:59
+#: main/data/manage_accounts/dialog.ui:170
+#: main/data/manage_accounts/add_account_dialog.ui:62
+#: main/data/add_conversation/conference_details_fragment.ui:175
+#: main/data/add_conversation/add_groupchat_dialog.ui:147
+msgid "Password"
+msgstr "Contrasinal"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:60
+msgid "Password required for room entry, if any"
+msgstr "Contrasinal requerido para entrar na sala, si fose preciso"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:63
+msgid "Moderated"
+msgstr "Moderada"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:64
+msgid "Only occupants with voice may send messages"
+msgstr "Só as participantes con voz poden enviar mensaxes"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:67
+msgid "Members only"
+msgstr "Só participantes"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:68
+msgid "Only members may enter the room"
+msgstr "Só participantes poden entrar na sala"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:71
+msgid "Message history"
+msgstr "Histórico de mensaxes"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:72
+msgid "Maximum amount of backlog issued by the room"
+msgstr "Cantidade máxima de rexistros proporcionados pola sala"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:78
+msgid "Room Configuration"
+msgstr "Configuración da sala"
+
+#: main/src/ui/contact_details/blocking_provider.vala:31
+#: main/src/ui/contact_details/settings_provider.vala:22
+#: main/src/ui/contact_details/settings_provider.vala:25
+#: main/src/ui/contact_details/settings_provider.vala:30
+#: main/data/menu_app.ui:11
+msgid "Settings"
+msgstr "Axustes"
+
+#: main/src/ui/contact_details/blocking_provider.vala:31
+msgid "Block"
+msgstr "Bloquear"
+
+#: main/src/ui/contact_details/blocking_provider.vala:31
+msgid "Communication and status updates in either direction are blocked"
+msgstr ""
+"As actualizacións de estado e comunicación están bloqueadas en calquer "
+"dirección"
+
+#: main/src/ui/contact_details/settings_provider.vala:22
+#: main/data/settings_dialog.ui:22
+msgid "Send typing notifications"
+msgstr "Enviar notificacións de escritura"
+
+#: main/src/ui/contact_details/settings_provider.vala:25
+#: main/data/settings_dialog.ui:34
+msgid "Send read receipts"
+msgstr "Enviar confirmación de lectura"
+
+#: main/src/ui/contact_details/settings_provider.vala:30
+#: main/src/ui/contact_details/settings_provider.vala:39
+msgid "Notifications"
+msgstr "Notificacións"
+
+#: main/src/ui/contact_details/settings_provider.vala:39
+msgid "Local Settings"
+msgstr "Axustes locais"
+
+#: main/src/ui/contact_details/settings_provider.vala:74
+#: main/src/ui/contact_details/settings_provider.vala:114
+#: main/src/ui/contact_details/settings_provider.vala:116
+msgid "On"
+msgstr "On"
+
+#: main/src/ui/contact_details/settings_provider.vala:76
+#: main/src/ui/contact_details/settings_provider.vala:114
+#: main/src/ui/contact_details/settings_provider.vala:117
+msgid "Off"
+msgstr "Off"
+
+#: main/src/ui/contact_details/settings_provider.vala:78
+msgid "Only when mentioned"
+msgstr "Só cando mencionada"
+
+#: main/src/ui/contact_details/settings_provider.vala:80
+#: main/src/ui/contact_details/settings_provider.vala:115
+#, c-format
+msgid "Default: %s"
+msgstr "Por omisión: %s"
+
+#: main/data/settings_dialog.ui:7
+msgid "Preferences"
+msgstr "Preferencias"
+
+#: main/data/settings_dialog.ui:46
+msgid "Notify when a new message arrives"
+msgstr "Notificar cando chega unha nova mensaxe"
+
+#: main/data/settings_dialog.ui:58
+msgid "Convert smileys to emojis"
+msgstr "Converter risoños a emojis"
+
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
+msgid "Accounts"
+msgstr "Contas"
+
+#: main/data/manage_accounts/dialog.ui:200
+#: main/data/manage_accounts/add_account_dialog.ui:83
+msgid "Local alias"
+msgstr "Alcume local"
+
+#: main/data/manage_accounts/dialog.ui:255
+msgid "No accounts configured"
+msgstr "Sen contas configuradas"
+
+#: main/data/manage_accounts/dialog.ui:266
+msgid "Add an account"
+msgstr "Engadir unha conta"
+
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr "Crear unha conta"
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr "Escoller un servidor público"
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr "Ou indicar un enderezo de servidor"
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr "ou Conectarse"
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr "Escoller outro servidor"
+
+#: main/data/menu_encryption.ui:14
+msgid "Unencrypted"
+msgstr "Non cifrado"
+
+#: main/data/menu_app.ui:17
+msgid "Quit"
+msgstr "Saír"
+
+#: main/data/im.dino.Dino.appdata.xml.in:7
+msgid "Modern XMPP Chat Client"
+msgstr "Cliente moderno para conversas XMPP"
+
+#: main/data/im.dino.Dino.appdata.xml.in:9
+msgid ""
+"Dino is a modern open-source chat client for the desktop. It focuses on "
+"providing a clean and reliable Jabber/XMPP experience while having your "
+"privacy in mind."
+msgstr ""
+"Dino é un cliente moderno e de código aberto para o escritorio. Orientado a "
+"proporcionar unha experiencia Jabber/XMPP limpa e fiable tendo a intimidade "
+"presente."
+
+#: main/data/im.dino.Dino.appdata.xml.in:10
+msgid ""
+"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
+"configuring privacy-related features such as read receipts and typing "
+"notifications."
+msgstr ""
+"Soporta o cifrado de extremo-a-extremo con OMEMO e OpenPGP e permite "
+"configurar características orientadas a intimidade tales como confirmación "
+"de lectura e notificacións de escritura."
+
+#: main/data/im.dino.Dino.appdata.xml.in:11
+msgid ""
+"Dino fetches history from the server and synchronizes messages with other "
+"devices."
+msgstr ""
+"Dino obtén o histórico desde o servidor e sincroniza as mensaxes con outros "
+"dispositivos."
+
+#: main/data/im.dino.Dino.appdata.xml.in:15
+msgid "Main window with conversations"
+msgstr "Xanela principal con conversas"
+
+#: main/data/add_conversation/conference_details_fragment.ui:19
+#: main/data/add_conversation/add_groupchat_dialog.ui:49
+#: main/data/add_conversation/add_contact_dialog.ui:49
+msgid "Account"
+msgstr "Conta"
+
+#: main/data/add_conversation/conference_details_fragment.ui:123
+#: main/data/add_conversation/add_groupchat_dialog.ui:120
+msgid "Nick"
+msgstr "Sobrenome"
+
+#: main/data/add_conversation/add_groupchat_dialog.ui:175
+#: main/data/add_conversation/add_contact_dialog.ui:102
+msgid "Alias"
+msgstr "Alcume"
+
+#: main/data/add_conversation/add_contact_dialog.ui:8
+msgid "Add Contact"
+msgstr "Engadir contacto"
+
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr "Sen busca activa"
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr "Escriba para iniciar a busca"
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr "Sen mensaxes coincidentes"
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr "Comprobe a escrita ou intente eliminar filtros"
+
+#~ msgid "Copy Link Address"
+#~ msgstr "Copiar enderezo da ligazón"
+
+#~ msgid "Copy"
+#~ msgstr "Copiar"
+
+#~ msgid "Select All"
+#~ msgstr "Escoller todo"
diff --git a/main/po/hu.po b/main/po/hu.po
new file mode 100644
index 00000000..c9e5bae7
--- /dev/null
+++ b/main/po/hu.po
@@ -0,0 +1,662 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-08-31 14:13+0000\n"
+"Last-Translator: notramo <notramo@vipmail.hu>\n"
+"Language-Team: Hungarian <https://hosted.weblate.org/projects/dino/"
+"translations/hu/>\n"
+"Language: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 3.2-dev\n"
+
+#: main/src/ui/notifications.vala:71
+msgid "Subscription request"
+msgstr "Feliratkozási kérés"
+
+#: main/src/ui/notifications.vala:77
+#: main/src/ui/conversation_summary/subscription_notification.vala:37
+msgid "Accept"
+msgstr "Elfogadás"
+
+#: main/src/ui/notifications.vala:78
+#: main/src/ui/conversation_summary/subscription_notification.vala:38
+msgid "Deny"
+msgstr "Tiltás"
+
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
+#: main/src/ui/manage_accounts/dialog.vala:126
+#, c-format
+msgid "Remove account %s?"
+msgstr "Eltávolítod a %s fiókot?"
+
+#: main/src/ui/manage_accounts/dialog.vala:129
+msgid "Remove"
+msgstr "Eltávolítás"
+
+#: main/src/ui/manage_accounts/dialog.vala:153
+msgid "Select avatar"
+msgstr "Profilkép választása"
+
+#: main/src/ui/manage_accounts/dialog.vala:153
+msgid "Select"
+msgstr "Választ"
+
+#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
+#: main/src/ui/add_conversation/add_conference_dialog.vala:16
+#: main/src/ui/add_conversation/select_contact_dialog.vala:41
+#: main/data/add_conversation/add_groupchat_dialog.ui:11
+#: main/data/add_conversation/add_contact_dialog.ui:12
+msgid "Cancel"
+msgstr "Mégse"
+
+#: main/src/ui/manage_accounts/dialog.vala:161
+msgid "Images"
+msgstr "Képek"
+
+#: main/src/ui/manage_accounts/dialog.vala:165
+msgid "All files"
+msgstr "Összes fájl"
+
+#: main/src/ui/manage_accounts/dialog.vala:222
+msgid "Connecting…"
+msgstr "Csatlakozás…"
+
+#: main/src/ui/manage_accounts/dialog.vala:224
+msgid "Connected"
+msgstr "Csatlakozva"
+
+#: main/src/ui/manage_accounts/dialog.vala:226
+msgid "Disconnected"
+msgstr "Lecsatlakozva"
+
+#: main/src/ui/manage_accounts/dialog.vala:235
+msgid "Wrong password"
+msgstr "Hibás jelszó"
+
+#: main/src/ui/manage_accounts/dialog.vala:237
+msgid "Invalid TLS certificate"
+msgstr "Érvénytelen TLS tanúsítvány"
+
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
+msgid "Error"
+msgstr "Hiba"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
+msgid "Add Account"
+msgstr "Fiók hozzáadása"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
+msgid "JID should be of the form “user@example.com”"
+msgstr ""
+"A JID-nek ebben a formátumban kell lennie: \"felhasználó@szolgáltató.com\""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr ""
+
+#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
+#: main/src/ui/conversation_selector/chat_row.vala:30
+msgid "Me"
+msgstr "Én"
+
+#: main/src/ui/conversation_selector/conversation_row.vala:154
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#, no-c-format
+msgid "%b %d"
+msgstr "%b %d"
+
+#: main/src/ui/conversation_selector/conversation_row.vala:158
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
+msgid "Yesterday"
+msgstr "Tegnap"
+
+#: main/src/ui/conversation_selector/conversation_row.vala:161
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:196
+#, no-c-format
+msgid "%H∶%M"
+msgstr "%H:%M"
+
+#: main/src/ui/conversation_selector/conversation_row.vala:162
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:197
+#, no-c-format
+msgid "%l∶%M %p"
+msgstr "%I:%M %p"
+
+#: main/src/ui/conversation_selector/conversation_row.vala:165
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:201
+#, c-format
+msgid "%i min ago"
+msgid_plural "%i mins ago"
+msgstr[0] "%i perccel ezelőtt"
+msgstr[1] "%i perccel ezelőtt"
+
+#: main/src/ui/conversation_selector/conversation_row.vala:167
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:203
+msgid "Just now"
+msgstr "Most"
+
+#: main/src/ui/application.vala:44
+msgid "Join Conference"
+msgstr "Csatlakozás konferenciához"
+
+#: main/src/ui/application.vala:44
+#: main/src/ui/add_conversation/add_conference_dialog.vala:63
+#: main/src/ui/add_conversation/conference_details_fragment.vala:133
+msgid "Join"
+msgstr "Csatlakozás"
+
+#: main/src/ui/add_conversation/add_groupchat_dialog.vala:28
+#: main/data/add_conversation/add_contact_dialog.ui:24
+msgid "Add"
+msgstr "Hozzáadás"
+
+#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
+#: main/data/manage_accounts/add_account_dialog.ui:119
+msgid "Save"
+msgstr "Mentés"
+
+#: main/src/ui/add_conversation/add_conference_dialog.vala:27
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
+msgid "Join Channel"
+msgstr "Csatlakozás csatornához"
+
+#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
+msgid "Next"
+msgstr "Következő"
+
+#: main/src/ui/add_conversation/select_contact_dialog.vala:85
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
+msgid "Start Conversation"
+msgstr "Csevegés kezdeményezése"
+
+#: main/src/ui/add_conversation/select_contact_dialog.vala:86
+msgid "Start"
+msgstr "Indítás"
+
+#: main/src/ui/add_conversation/conference_details_fragment.vala:108
+msgid "Joining…"
+msgstr "Csatlakozás…"
+
+#: main/src/ui/add_conversation/conference_details_fragment.vala:138
+msgid "Password required to enter room"
+msgstr "A szobába való belépéshez jelszó szükséges"
+
+#: main/src/ui/add_conversation/conference_details_fragment.vala:143
+msgid "Banned from joining or creating conference"
+msgstr "A csatlakozás egy konferenciához, vagy új létrehozása le van tiltva"
+
+#: main/src/ui/add_conversation/conference_details_fragment.vala:145
+msgid "Room does not exist"
+msgstr "A szoba nem létezik"
+
+#: main/src/ui/add_conversation/conference_details_fragment.vala:147
+msgid "Not allowed to create room"
+msgstr "Szoba létrehozása nem engedélyezett"
+
+#: main/src/ui/add_conversation/conference_details_fragment.vala:149
+msgid "Members-only room"
+msgstr "Csak tagoknak engedélyezett szoba"
+
+#: main/src/ui/add_conversation/conference_details_fragment.vala:152
+msgid "Choose a different nick"
+msgstr "Válassz egy másik becenevet"
+
+#: main/src/ui/add_conversation/conference_details_fragment.vala:154
+msgid "Too many occupants in room"
+msgstr "Túl sok résztvevő van a szobában"
+
+#: main/src/ui/unified_window.vala:233
+msgid "No active accounts"
+msgstr "Nincs aktív fiók"
+
+#: main/src/ui/unified_window.vala:234
+msgid "Manage accounts"
+msgstr "Fiókok kezelése"
+
+#: main/src/ui/unified_window.vala:241
+msgid "No active conversations"
+msgstr "Nincs aktív beszélgetés"
+
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
+msgid "Today"
+msgstr "Ma"
+
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
+msgid "%a, %b %d"
+msgstr "%a, %b %d"
+
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
+#, c-format
+msgid "%s, %s and %i others"
+msgstr "%s, %s és %i további felhasználó"
+
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#, c-format
+msgid "%s, %s and %s"
+msgstr "%s, %s, és %s"
+
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#, c-format
+msgid "%s and %s"
+msgstr "%s és %s"
+
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
+msgid "is typing…"
+msgid_plural "are typing…"
+msgstr[0] "gépel…"
+msgstr[1] "gépel…"
+
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+msgid "has stopped typing"
+msgstr "abbahagyta a gépelést"
+
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
+msgid "Message too long"
+msgstr "Az üzenet túl hosszú"
+
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "Fájl"
+
+#: main/src/ui/conversation_summary/subscription_notification.vala:48
+msgid "This contact would like to add you to their contact list"
+msgstr "Ez az ismerős hozzá szeretne adni téged az ismerőslistájához"
+
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:184
+#, no-c-format
+msgid "%x, %H∶%M"
+msgstr "%x, %H:%M"
+
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:185
+#, no-c-format
+msgid "%x, %l∶%M %p"
+msgstr "%x, %I:%M %p"
+
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:188
+#, no-c-format
+msgid "%b %d, %H∶%M"
+msgstr "%b %d, %H:%M"
+
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:189
+#, no-c-format
+msgid "%b %d, %l∶%M %p"
+msgstr "%b %d, %I:%M %p"
+
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:192
+#, no-c-format
+msgid "%a, %H∶%M"
+msgstr "%a, %H:%M"
+
+#: main/src/ui/conversation_summary/conversation_item_skeleton.vala:193
+#, no-c-format
+msgid "%a, %l∶%M %p"
+msgstr "%a, %l∶%M %p"
+
+#: main/src/ui/occupant_menu/list.vala:106
+msgid "Owner"
+msgstr "Tulajdonos"
+
+#: main/src/ui/occupant_menu/list.vala:108
+msgid "Admin"
+msgstr "Adminisztrátor"
+
+#: main/src/ui/occupant_menu/list.vala:110
+msgid "Member"
+msgstr "Tag"
+
+#: main/src/ui/occupant_menu/list.vala:112
+msgid "User"
+msgstr "Felhasználó"
+
+#: main/src/ui/occupant_menu/view.vala:27
+#: main/src/ui/occupant_menu/view.vala:36
+msgid "Invite"
+msgstr "Meghívás"
+
+#: main/src/ui/occupant_menu/view.vala:35
+msgid "Invite to Conference"
+msgstr "Meghívás a konferenciába"
+
+#: main/src/ui/occupant_menu/view.vala:85
+msgid "Start private conversation"
+msgstr "Privát beszélgetés indítása"
+
+#: main/src/ui/occupant_menu/view.vala:93
+msgid "Kick"
+msgstr "Kirúgás"
+
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr ""
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr ""
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr ""
+
+#: main/src/ui/contact_details/dialog.vala:37
+msgid "Conference Details"
+msgstr "A konferencia részletei"
+
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
+msgid "Contact Details"
+msgstr "Felhasználó információ"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:39
+msgid "Name of the room"
+msgstr "A szoba neve"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:42
+msgid "Description of the room"
+msgstr "A szoba leírása"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:45
+msgid "Persistent"
+msgstr "Tartós"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:46
+msgid "The room will persist after the last occupant leaves"
+msgstr "A szoba megmarad azután is, hogy az utolsó résztvevő elhagyta"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:49
+msgid "Publicly searchable"
+msgstr "Nyilvánosan kereshető"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:52
+msgid "Occupants may change the subject"
+msgstr "Résztvevők megváltoztathatják a témát"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:55
+msgid "Discover real JIDs"
+msgstr "Valódi JID-k megtekintése"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:56
+msgid "Who may discover real JIDs?"
+msgstr "Ki láthatja a valódi JID-ket?"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:59
+#: main/data/manage_accounts/dialog.ui:170
+#: main/data/manage_accounts/add_account_dialog.ui:62
+#: main/data/add_conversation/conference_details_fragment.ui:175
+#: main/data/add_conversation/add_groupchat_dialog.ui:147
+msgid "Password"
+msgstr "Jelszó"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:60
+msgid "Password required for room entry, if any"
+msgstr "A szobába lépéshez szükséges jelszó, ha van"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:63
+msgid "Moderated"
+msgstr "Moderált"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:64
+msgid "Only occupants with voice may send messages"
+msgstr "Csak az erre jogosult felhasználók küldhetnek üzenetet"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:67
+msgid "Members only"
+msgstr "Csak tagoknak"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:68
+msgid "Only members may enter the room"
+msgstr "Csak a szoba tagjai léphetnek be"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:71
+msgid "Message history"
+msgstr "Üzenet előzmények"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:72
+msgid "Maximum amount of backlog issued by the room"
+msgstr "A szoba üzenetelőzményeinek maximális mennyisége"
+
+#: main/src/ui/contact_details/muc_config_form_provider.vala:78
+msgid "Room Configuration"
+msgstr "Szoba beállítása"
+
+#: main/src/ui/contact_details/blocking_provider.vala:31
+#: main/src/ui/contact_details/settings_provider.vala:22
+#: main/src/ui/contact_details/settings_provider.vala:25
+#: main/src/ui/contact_details/settings_provider.vala:30
+#: main/data/menu_app.ui:11
+msgid "Settings"
+msgstr "Beállítások"
+
+#: main/src/ui/contact_details/blocking_provider.vala:31
+msgid "Block"
+msgstr "Tiltás"
+
+#: main/src/ui/contact_details/blocking_provider.vala:31
+msgid "Communication and status updates in either direction are blocked"
+msgstr ""
+"Mind a két irányból le van tiltva a kommunikáció és az állapotjelentések"
+
+#: main/src/ui/contact_details/settings_provider.vala:22
+#: main/data/settings_dialog.ui:22
+msgid "Send typing notifications"
+msgstr "Gépelési értesítés küldése"
+
+#: main/src/ui/contact_details/settings_provider.vala:25
+#: main/data/settings_dialog.ui:34
+msgid "Send read receipts"
+msgstr "Kézbesítési jelentés küldése"
+
+#: main/src/ui/contact_details/settings_provider.vala:30
+#: main/src/ui/contact_details/settings_provider.vala:39
+msgid "Notifications"
+msgstr "Értesítések"
+
+#: main/src/ui/contact_details/settings_provider.vala:39
+msgid "Local Settings"
+msgstr "Helyi beállítások"
+
+#: main/src/ui/contact_details/settings_provider.vala:74
+#: main/src/ui/contact_details/settings_provider.vala:114
+#: main/src/ui/contact_details/settings_provider.vala:116
+msgid "On"
+msgstr "Engedélyezve"
+
+#: main/src/ui/contact_details/settings_provider.vala:76
+#: main/src/ui/contact_details/settings_provider.vala:114
+#: main/src/ui/contact_details/settings_provider.vala:117
+msgid "Off"
+msgstr "Kikapcsolva"
+
+#: main/src/ui/contact_details/settings_provider.vala:78
+msgid "Only when mentioned"
+msgstr "Csak ha említenek"
+
+#: main/src/ui/contact_details/settings_provider.vala:80
+#: main/src/ui/contact_details/settings_provider.vala:115
+#, c-format
+msgid "Default: %s"
+msgstr "Alapértelmezett: %s"
+
+#: main/data/settings_dialog.ui:7
+msgid "Preferences"
+msgstr "Beállítások"
+
+#: main/data/settings_dialog.ui:46
+msgid "Notify when a new message arrives"
+msgstr "Értesítés új üzenet érkezésekor"
+
+#: main/data/settings_dialog.ui:58
+msgid "Convert smileys to emojis"
+msgstr "Smiley-k átalakítása emojikká"
+
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
+msgid "Accounts"
+msgstr "Fiókok"
+
+#: main/data/manage_accounts/dialog.ui:200
+#: main/data/manage_accounts/add_account_dialog.ui:83
+msgid "Local alias"
+msgstr "Helyi név"
+
+#: main/data/manage_accounts/dialog.ui:255
+msgid "No accounts configured"
+msgstr "Nincs beállított fiók"
+
+#: main/data/manage_accounts/dialog.ui:266
+msgid "Add an account"
+msgstr "Fiók hozzáadása"
+
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr ""
+
+#: main/data/menu_encryption.ui:14
+msgid "Unencrypted"
+msgstr "Titkosítatlan"
+
+#: main/data/menu_app.ui:17
+msgid "Quit"
+msgstr "Kilépés"
+
+#: main/data/im.dino.Dino.appdata.xml.in:7
+msgid "Modern XMPP Chat Client"
+msgstr "Modern XMPP Üzenetküldő"
+
+#: main/data/im.dino.Dino.appdata.xml.in:9
+msgid ""
+"Dino is a modern open-source chat client for the desktop. It focuses on "
+"providing a clean and reliable Jabber/XMPP experience while having your "
+"privacy in mind."
+msgstr ""
+"A Dino egy modern, nyílt forráskódú üzenetküldő alkalmazás asztali "
+"rendszerekre, ami a hangsúlyt a letisztult és megbízható Jabber/XMPP "
+"élményre helyezi, miközben a magánszféra megőrzését is fontosnak tartja."
+
+#: main/data/im.dino.Dino.appdata.xml.in:10
+msgid ""
+"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
+"configuring privacy-related features such as read receipts and typing "
+"notifications."
+msgstr ""
+"Támogatja a végponttól-végpontig titkosítást az OMEMO és az OpenPGP által, "
+"és magánszférához kötődő beállítási lehetőségeket is biztosít, mint például "
+"a kézbesítési, vagy gépelési értesítések küldése."
+
+#: main/data/im.dino.Dino.appdata.xml.in:11
+msgid ""
+"Dino fetches history from the server and synchronizes messages with other "
+"devices."
+msgstr ""
+"A Dino lekéri a chat előzményeket a szerverről, és szinkronizálja az "
+"üzeneteket a többi eszközzel."
+
+#: main/data/im.dino.Dino.appdata.xml.in:15
+msgid "Main window with conversations"
+msgstr "A fő ablak a beszélgetésekkel"
+
+#: main/data/add_conversation/conference_details_fragment.ui:19
+#: main/data/add_conversation/add_groupchat_dialog.ui:49
+#: main/data/add_conversation/add_contact_dialog.ui:49
+msgid "Account"
+msgstr "Fiók"
+
+#: main/data/add_conversation/conference_details_fragment.ui:123
+#: main/data/add_conversation/add_groupchat_dialog.ui:120
+msgid "Nick"
+msgstr "Becenév"
+
+#: main/data/add_conversation/add_groupchat_dialog.ui:175
+#: main/data/add_conversation/add_contact_dialog.ui:102
+msgid "Alias"
+msgstr "Alias"
+
+#: main/data/add_conversation/add_contact_dialog.ui:8
+msgid "Add Contact"
+msgstr "Ismerős hozzáadása"
+
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr ""
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr ""
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr ""
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr ""
+
+#~ msgid "Copy Link Address"
+#~ msgstr "Link címének másolása"
+
+#~ msgid "Copy"
+#~ msgstr "Másolás"
+
+#~ msgid "Select All"
+#~ msgstr "Összes kijelölése"
+
+#~ msgid "Search"
+#~ msgstr "Keresés"
diff --git a/main/po/it.po b/main/po/it.po
index e3c47b67..32a98ad1 100644
--- a/main/po/it.po
+++ b/main/po/it.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
-"PO-Revision-Date: 2018-05-12 12:38+0000\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-09-12 07:20+0000\n"
"Last-Translator: Valerio Baldisserotto <svalo@libersoft.it>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/dino/"
"translations/it/>\n"
@@ -17,22 +17,27 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.0-dev\n"
+"X-Generator: Weblate 3.2-dev\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "Richiesta di iscrizione"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "Accetta"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "Rifiuta"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -53,7 +58,6 @@ msgstr "Seleziona"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -67,52 +71,78 @@ msgstr "Immagini"
msgid "All files"
msgstr "Tutti i documenti"
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr "Connessione…"
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "Connesso"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "Disconnesso"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "Password errata"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr "Il certificato TLS non è valido"
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "Errore"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "Aggiungi un account"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
msgstr "Il JID dovrebbe essere nella forma \"utente@example.com\""
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr "Nessuna risposta dal server"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr "Registrati su %s"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr "Il server richiede di registrarsi tramite un sito web"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr "Apri la Registrazione"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr "Registrati"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr "Controlla %s per informazioni su come registrarsi"
+
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
msgid "Me"
msgstr "Io"
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr "%d %b"
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "Ieri"
@@ -157,22 +187,24 @@ msgid "Add"
msgstr "Aggiungi"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "Salva"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr "Entra nel Canale"
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "Avanti"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr "Inizia una Conversazione"
@@ -212,70 +244,58 @@ msgstr "Scegli un soprannome differente"
msgid "Too many occupants in room"
msgstr "La stanza ha troppi occupanti"
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr "Nessun account attivo"
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr "Gestisci accounts"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr "Nessuna conversazione attiva"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr "Oggi"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr "%a, %d %b"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
msgstr "%s, %s e %i altri"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
msgstr "%s, %s, e %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
msgstr "%s e %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
msgid "is typing…"
msgid_plural "are typing…"
msgstr[0] "sta scrivendo…"
msgstr[1] "stanno scrivendo…"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr "ha smesso di scrivere"
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr "File"
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr "Messaggio troppo lungo"
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr "Copia l'indirizzo del collegamento"
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr "Copia"
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
-msgstr "Seleziona Tutto"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "File"
#: main/src/ui/conversation_summary/subscription_notification.vala:48
msgid "This contact would like to add you to their contact list"
@@ -344,12 +364,27 @@ msgstr "Inizia una conversazione privata"
msgid "Kick"
msgstr "Espelli"
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr "%i risultati per la ricerca"
+
+#: main/src/ui/global_search.vala:161
+#, fuzzy, c-format
+msgid "In %s"
+msgstr "In %s"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr "Con %s"
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr "Dettagli della conferenza"
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr "Dettagli del contatto"
@@ -387,7 +422,7 @@ msgstr "Chi può scoprire i veri JIDs?"
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -429,7 +464,7 @@ msgstr "Configurazione della stanza"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr "Impostazioni"
@@ -496,12 +531,12 @@ msgstr "Notifica quando arriva un nuovo messaggio"
msgid "Convert smileys to emojis"
msgstr "Trasforma smileys in emojis"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr "Account"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr "Alias locale"
@@ -513,31 +548,51 @@ msgstr "Nessun account configurato"
msgid "Add an account"
msgstr "Aggiungi un account"
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr "Crea account"
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr "Scegli un server pubblico"
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr "Oppure inserisci l'indirizzo di un server"
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+#, fuzzy
+msgid "Sign in instead"
+msgstr "Oppure accedi"
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr "Scegli un altro server"
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr "Non cifrato"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr "Esci"
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr "Cerca"
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
-#, fuzzy
+#: main/data/im.dino.Dino.appdata.xml.in:7
msgid "Modern XMPP Chat Client"
-msgstr "Client XMPP moderno"
+msgstr "Client di chat moderno per XMPP"
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
"privacy in mind."
msgstr ""
+"Dino è un client di chat per il desktop, moderno e open-source. Si concentra "
+"nel fornire un'esperienza Jabber/XMPP pulita e affidabile tenendo presente "
+"la tua privacy."
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
@@ -547,7 +602,7 @@ msgstr ""
"configurare le funzioni relative alla privacy come le ricevute di lettura e "
"le notifiche di digitazione."
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
@@ -555,7 +610,7 @@ msgstr ""
"Dino recupera la cronologia dal server e sincronizza i messaggi con gli "
"altri dispositivi."
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
msgstr "La finestra principale con le conversazioni"
@@ -579,6 +634,34 @@ msgstr "Alias"
msgid "Add Contact"
msgstr "Aggiungi Contatto"
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr "Nessuna ricerca attiva"
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr "Digita per iniziare una ricerca"
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr "Nessun messaggio corrispondente"
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr "Controlla l'ortografia o prova a rimuovere dei filtri"
+
+#~ msgid "Copy Link Address"
+#~ msgstr "Copia l'indirizzo del collegamento"
+
+#~ msgid "Copy"
+#~ msgstr "Copia"
+
+#~ msgid "Select All"
+#~ msgstr "Seleziona Tutto"
+
+#~ msgid "Search"
+#~ msgstr "Cerca"
+
#~ msgid "Send message marker"
#~ msgstr "Invia lo stato del messaggio"
diff --git a/main/po/ja.po b/main/po/ja.po
index bc042736..ac3fbaeb 100644
--- a/main/po/ja.po
+++ b/main/po/ja.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-04-04 05:38+0000\n"
"Last-Translator: Mako N <mako@pasero.net>\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/dino/"
@@ -19,20 +19,25 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 2.20-dev\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "在席通知の申込"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "承諾"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "拒否"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -53,7 +58,6 @@ msgstr "選択"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -67,52 +71,78 @@ msgstr "画像"
msgid "All files"
msgstr "すべてのファイル"
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr "接続中…"
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "接続しました"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "切断しました"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "パスワードが違います"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr "TLS 証明書が不正です"
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "エラー"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "アカウントを追加"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
msgstr "JID は “user@example.com” の形式にしてください"
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr ""
+
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
msgid "Me"
msgstr ""
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr ""
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "昨日"
@@ -156,22 +186,24 @@ msgid "Add"
msgstr "追加"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "保存"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr ""
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "次"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr ""
@@ -211,69 +243,57 @@ msgstr "別のニックネームを選んでください"
msgid "Too many occupants in room"
msgstr "談話室は参加者が多すぎます"
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr ""
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr "アカウントを管理"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr ""
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr "今日"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
msgstr ""
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
msgid "is typing…"
msgid_plural "are typing…"
msgstr[0] "は入力中…"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr "は入力を中断しました"
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr "ファイル"
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr "メッセージが長すぎます"
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr "リンクアドレスをコピー"
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr "コピー"
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
-msgstr "すべて選択"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "ファイル"
#: main/src/ui/conversation_summary/subscription_notification.vala:48
msgid "This contact would like to add you to their contact list"
@@ -342,12 +362,27 @@ msgstr "私信を始める"
msgid "Kick"
msgstr "蹴り出す"
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr ""
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr ""
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr ""
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr "談話室の詳細"
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr "相手先の詳細"
@@ -385,7 +420,7 @@ msgstr ""
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -427,7 +462,7 @@ msgstr "談話室の調整"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr "設定"
@@ -492,12 +527,12 @@ msgstr "新しいメッセージが届いたとき通知"
msgid "Convert smileys to emojis"
msgstr "スマイリーを絵文字に変換"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr "アカウント"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr ""
@@ -509,43 +544,60 @@ msgstr ""
msgid "Add an account"
msgstr "アカウントを追加"
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr ""
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr "非暗号化"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr ""
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr "検索"
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
+#: main/data/im.dino.Dino.appdata.xml.in:7
msgid "Modern XMPP Chat Client"
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
"privacy in mind."
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
"notifications."
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
msgstr ""
@@ -569,5 +621,33 @@ msgstr "別名"
msgid "Add Contact"
msgstr "相手先を追加"
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr ""
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr ""
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr ""
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr ""
+
+#~ msgid "Copy Link Address"
+#~ msgstr "リンクアドレスをコピー"
+
+#~ msgid "Copy"
+#~ msgstr "コピー"
+
+#~ msgid "Select All"
+#~ msgstr "すべて選択"
+
+#~ msgid "Search"
+#~ msgstr "検索"
+
#~ msgid "Start Chat"
#~ msgstr "会話を開始"
diff --git a/main/po/lb.po b/main/po/lb.po
index 36e56c1e..a28dce2a 100644
--- a/main/po/lb.po
+++ b/main/po/lb.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Luxembourgish (Dino)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
-"PO-Revision-Date: 2018-05-01 00:12+0000\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-09-10 00:23+0000\n"
"Last-Translator: Dennis Fink <dennis.fink@c3l.lu>\n"
"Language-Team: Luxembourgish <https://hosted.weblate.org/projects/dino/"
"translations/lb/>\n"
@@ -12,22 +12,27 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.0-dev\n"
+"X-Generator: Weblate 3.2-dev\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "Abonnement Ufro"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "Akzeptéieren"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "Verweigeren"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -48,7 +53,6 @@ msgstr "Auswielen"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -62,52 +66,78 @@ msgstr "Biller"
msgid "All files"
msgstr "All Dateien"
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr "Verbannen…"
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "Verbonnen"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "Getrennt"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "Falsch Passwuert"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr "Invaliden TLS Zertifikat"
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "Feeler"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "Account bäisetzen"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
msgstr "JID sollt folgend Form hunn „user@example.com“"
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr "Keng Äntwert vum Server"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr "Ob %s registréieren"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr "De Server setzt eng Registréierung duerch eng Websäit viraus"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr "Oppe Registréierung"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr "Registréieren"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr "Kuck %s fir Informatioune iwwert Registréierung"
+
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
msgid "Me"
msgstr "Ech"
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr "%b %d"
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "Gëschter"
@@ -152,22 +182,24 @@ msgid "Add"
msgstr "Bäisetzen"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "Späicheren"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr "Kanal bäitrieden"
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "Nächst"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr "Konversatioun starten"
@@ -207,70 +239,58 @@ msgstr "Wiel een anere Spëtznumm"
msgid "Too many occupants in room"
msgstr "De Raum huet ze vill Benotzer"
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr "Keng Kontoen aktiv"
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr "Kontoe managen"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr "Keng Conversatiounen aktiv"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr "Haut"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr "%a, %b %d"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
msgstr "%s, %s an %i anerer"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
msgstr "%s, %s an %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
msgstr "%s an %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
msgid "is typing…"
msgid_plural "are typing…"
msgstr[0] "tippt grad…"
msgstr[1] "tippe grad…"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr "huet opgehalen ze tippen"
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr "Datei"
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr "Noriicht ze laang"
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr "Kopéier Link Adress"
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr "Kopéieren"
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
-msgstr "Alles auswielen"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "Datei"
#: main/src/ui/conversation_summary/subscription_notification.vala:48
msgid "This contact would like to add you to their contact list"
@@ -339,12 +359,27 @@ msgstr "Privat Conversatioun starten"
msgid "Kick"
msgstr "Erausgeheien"
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr "%i Sichresultater"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr "An %s"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr "Mat %s"
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr "Konferenz Detailer"
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr "Kontaktdetailer"
@@ -382,7 +417,7 @@ msgstr "Ween däerf echt JIDs gesinn?"
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -424,7 +459,7 @@ msgstr "Raum Astellungen"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr "Astellungen"
@@ -489,12 +524,12 @@ msgstr "Benoriichtege wann een neie Message ukënnt"
msgid "Convert smileys to emojis"
msgstr "Smileyen an Emojien konvertéieren"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr "Kontoen"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr "Lokalen Pseudonym"
@@ -506,24 +541,40 @@ msgstr "Keng Kontoe konfiguréiert"
msgid "Add an account"
msgstr "Ee Konto bäisetzen"
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr "Account kreéieren"
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr "Ëffentleche Server auswielen"
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr "Oder spezifizéier eng Server Adress"
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr "Aloggen a Platz"
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr "Anere Server auswielen"
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr "Onverschlësselt"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr "Zoumaachen"
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr "Sichen"
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
-#, fuzzy
+#: main/data/im.dino.Dino.appdata.xml.in:7
msgid "Modern XMPP Chat Client"
-msgstr "Modernen XMPP Client"
+msgstr "Modernen XMPP Chat Client"
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
@@ -533,7 +584,7 @@ msgstr ""
"opgeraumt a robust Jabber/XMPP Erfarung a leet ee Schwéierpunkt op "
"Privatsphär."
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
@@ -542,7 +593,7 @@ msgstr ""
"Hien ënnerstëtz Enn-zu-Enn Verschlësselung mat OMEMO an OpenPGP an enthält "
"Privatsphäre-Astellungen zu Liesbestätegungen an Tipp-Benoriichtegungen."
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
@@ -550,7 +601,7 @@ msgstr ""
"Dino rifft  Gespréichverläf vum Server of a synchroniséiert Noriichte mat "
"anere Geräter."
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
msgstr "Haaptfënster mat den Conversatiounen"
@@ -574,6 +625,34 @@ msgstr "Pseudonym"
msgid "Add Contact"
msgstr "Kontakt bäisetzen"
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr "Keng aktiv Sich"
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr "Tipp fir eng Sich ze starten"
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr "Keng Message fonnt"
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr "Iwwerpréif Schreifweis oder läsch Filteren"
+
+#~ msgid "Copy Link Address"
+#~ msgstr "Kopéier Link Adress"
+
+#~ msgid "Copy"
+#~ msgstr "Kopéieren"
+
+#~ msgid "Select All"
+#~ msgstr "Alles auswielen"
+
+#~ msgid "Search"
+#~ msgstr "Sichen"
+
#~ msgid "Send message marker"
#~ msgstr "Message Marker verschécken"
diff --git a/main/po/nb.po b/main/po/nb.po
index bf44313e..cc98f31a 100644
--- a/main/po/nb.po
+++ b/main/po/nb.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
-"PO-Revision-Date: 2018-05-02 06:11+0000\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-09-17 23:27+0000\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/dino/"
"translations/nb/>\n"
@@ -17,22 +17,27 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.0-dev\n"
+"X-Generator: Weblate 3.2-dev\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "Abonnementsforespørsel"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "Godta"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "Nekt"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -53,7 +58,6 @@ msgstr "Velg"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -67,52 +71,78 @@ msgstr "Bilder"
msgid "All files"
msgstr "Alle filer"
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr "Kobler til…"
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "Tilkoblet"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "Frakoblet"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "Feil passord"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr "Ugyldig TLS-sertifikat"
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "Feil"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "Legg til konto"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
msgstr "JID skal være av typen \"bruker@eksmepel.no\""
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr "Inget svar fra tjener"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr "Registrer på %s"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr "Tjeneren krever at man logger inn via en nettside"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr "Åpne registrering"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr "Registrer"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr "Se %s for å lære hvordan du registrerer deg"
+
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
msgid "Me"
msgstr "Meg"
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr "%b %d"
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "I går"
@@ -157,22 +187,24 @@ msgid "Add"
msgstr "Legg til"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "Lagre"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr "Ta del i kanal"
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "Neste"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr "Start samtale"
@@ -212,74 +244,58 @@ msgstr "Velg et annet kallenavn"
msgid "Too many occupants in room"
msgstr "Rommet har for mange deltagere"
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr "Ingen kontoer aktive"
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr "Behandle kontoer"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr "Ingen kontoer aktive"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr "I dag"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr "%a, %d %b"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
msgstr "%s, %s og %i andre"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
msgstr "%s, %s og %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
msgstr "%s og %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
msgid "is typing…"
msgid_plural "are typing…"
-msgstr[0] ""
-"Du kjenner blott blodets hvisken og benpipernes bøn fra det ubevisste "
-"sjeleliv…"
-msgstr[1] ""
-"Du kjenner blott blodets hvisken og benpipernes bøn fra de ubevisste "
-"sjeleliv…"
-
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+msgstr[0] "skriver…"
+msgstr[1] "skriver…"
+
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr "har tatt pause i skrivinga"
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr "Fil"
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
-msgstr "Meldingen er for land"
+msgstr "Meldingen er for lang"
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr "Kopier lenkeadresse"
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr "Kopier"
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
-msgstr "Velg alle"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "Fil"
#: main/src/ui/conversation_summary/subscription_notification.vala:48
msgid "This contact would like to add you to their contact list"
@@ -348,22 +364,37 @@ msgstr "Start privat samtale"
msgid "Kick"
msgstr "Kast ut"
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr "%i søkeresultater"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr "I %s"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr "Med %s"
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr "Konferansedetaljer"
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr "Kontaktdetaljer"
#: main/src/ui/contact_details/muc_config_form_provider.vala:39
msgid "Name of the room"
-msgstr "Rommets navn"
+msgstr "Romnavn"
#: main/src/ui/contact_details/muc_config_form_provider.vala:42
msgid "Description of the room"
-msgstr "Beskrivelse av rommet"
+msgstr "Rombeskrivelse"
#: main/src/ui/contact_details/muc_config_form_provider.vala:45
msgid "Persistent"
@@ -391,7 +422,7 @@ msgstr "Hvem har tilgang til oppdagelse av ekte JID-er?"
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -399,7 +430,7 @@ msgstr "Passord"
#: main/src/ui/contact_details/muc_config_form_provider.vala:60
msgid "Password required for room entry, if any"
-msgstr "Passord kreves for å ta del i rommet. La stå tomt for inget"
+msgstr "Passord som kreves for å ta del i rommet. La stå tomt for inget"
#: main/src/ui/contact_details/muc_config_form_provider.vala:63
msgid "Moderated"
@@ -433,7 +464,7 @@ msgstr "Rom-oppsett"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr "Innstillinger"
@@ -498,12 +529,12 @@ msgstr "Varsle ved mottak av ny melding"
msgid "Convert smileys to emojis"
msgstr "Konverter smilefjes til emoji-er"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr "Kontoer"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr "Lokalt alias"
@@ -515,24 +546,40 @@ msgstr "Ingen kontoer satt opp"
msgid "Add an account"
msgstr "Legg til en konto"
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr "Opprett konto"
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr "Velg en offentlig tjener"
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr "Eller angi en tjeneradresse"
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr "Logg inn istedenfor"
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr "Velg en annen tjener"
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr "Ukryptert"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr "Avslutt"
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr "Søk"
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
-#, fuzzy
+#: main/data/im.dino.Dino.appdata.xml.in:7
msgid "Modern XMPP Chat Client"
-msgstr "Moderne XMPP-klient"
+msgstr "Moderne XMPP-sludreklient"
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
@@ -542,7 +589,7 @@ msgstr ""
"på rask og pålitelig XMPP-opplevelse, samtidig som det hegner om "
"personvernet."
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
@@ -552,7 +599,7 @@ msgstr ""
"oppsett av personvernsrelaterte funksjoner som meldingskvitteringer og "
"skrivevarsling."
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
@@ -560,7 +607,7 @@ msgstr ""
"Dino henter historikk fra tjeneren og synkroniserer meldinger med andre "
"enheter."
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
msgstr "Hovedvindu med samtaler"
@@ -584,6 +631,34 @@ msgstr "Alias"
msgid "Add Contact"
msgstr "Legg til kontakt"
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr "Inget aktivt søk"
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr "Skriv for å starte et søk"
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr "Ingen samsvarende meldinger"
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr "Sjekk stavingen eller prøv å fjerne filter"
+
+#~ msgid "Copy Link Address"
+#~ msgstr "Kopier lenkeadresse"
+
+#~ msgid "Copy"
+#~ msgstr "Kopier"
+
+#~ msgid "Select All"
+#~ msgstr "Velg alle"
+
+#~ msgid "Search"
+#~ msgstr "Søk"
+
#~ msgid "Send message marker"
#~ msgstr "Send meldingsmarkør"
diff --git a/main/po/nl.po b/main/po/nl.po
index f6208660..86d645ef 100644
--- a/main/po/nl.po
+++ b/main/po/nl.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
-"PO-Revision-Date: 2018-05-02 07:36+0000\n"
-"Last-Translator: Nathan Follens <nathan@email.is>\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-09-24 12:24+0000\n"
+"Last-Translator: Nathan Follens <nthn@unseen.is>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/dino/translations/"
"nl/>\n"
"Language: nl\n"
@@ -17,22 +17,27 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.0-dev\n"
+"X-Generator: Weblate 3.2-dev\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "Abonneringsverzoek"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "Toestaan"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "Afwijzen"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -53,7 +58,6 @@ msgstr "Selecteren"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -67,52 +71,78 @@ msgstr "Afbeeldingen"
msgid "All files"
msgstr "Alle bestanden"
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr "Verbinding maken…"
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "Verbonden"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "Verbinding verbroken"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "Verkeerd wachtwoord"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr "Ongeldig TLS-certificaat"
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "Fout"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "Account toevoegen"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
msgstr "JID moet de vorm ‘gebruiker@voorbeeld.be’ volgen"
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr "Geen antwoord van server"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr "Registreren bij %s"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr "De server vereist registratie via een website"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr "Open registratie"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr "Registreren"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr "Bekijk %s voor meer informatie over hoe te registreren"
+
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
msgid "Me"
msgstr "Ik"
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr "%d %b"
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "Gisteren"
@@ -157,22 +187,24 @@ msgid "Add"
msgstr "Toevoegen"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "Opslaan"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr "Deelnemen aan kanaal"
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "Volgende"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr "Gesprek beginnen"
@@ -212,70 +244,58 @@ msgstr "Kies een andere bijnaam"
msgid "Too many occupants in room"
msgstr "Groepsgesprek heeft te veel deelnemers"
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr "Geen accounts actief"
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr "Accounts beheren"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr "Geen gesprekken actief"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr "Vandaag"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr "%a, %b %d"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
msgstr "%s, %s en %i anderen"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
msgstr "%s, %s en %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
msgstr "%s en %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
msgid "is typing…"
msgid_plural "are typing…"
msgstr[0] "is aan het typen…"
msgstr[1] "zijn aan het typen…"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr "is gestopt met typen"
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr "Bestand"
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr "Bericht te lang"
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr "Verwijzingsadres kopiëren"
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr "Kopiëren"
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
-msgstr "Alles selecteren"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "Bestand"
#: main/src/ui/conversation_summary/subscription_notification.vala:48
msgid "This contact would like to add you to their contact list"
@@ -344,12 +364,27 @@ msgstr "Privégesprek beginnen"
msgid "Kick"
msgstr "Schoppen"
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr "%i zoekresultaten"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr "In %s"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr "Met %s"
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr "Groepsgespreksgegevens"
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr "Contactgegevens"
@@ -388,7 +423,7 @@ msgstr "Wie mag de JID’s van de deelnemers zien?"
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -430,7 +465,7 @@ msgstr "Gespreksconfiguratie"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr "Instellingen"
@@ -495,12 +530,12 @@ msgstr "Melding tonen bij nieuw bericht"
msgid "Convert smileys to emojis"
msgstr "Smileys omzetten naar emoji’s"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr "Accounts"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr "Lokale alias"
@@ -512,24 +547,40 @@ msgstr "Geen accounts ingesteld"
msgid "Add an account"
msgstr "Account toevoegen"
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr "Account aanmaken"
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr "Kies een openbare server"
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr "Of voer een serveradres in"
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr "Inloggen"
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr "Kies een andere server"
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr "Onversleuteld"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr "Afsluiten"
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr "Zoeken"
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
-#, fuzzy
+#: main/data/im.dino.Dino.appdata.xml.in:7
msgid "Modern XMPP Chat Client"
-msgstr "Moderne XMPP-cliënt"
+msgstr "Moderne XMPP-chatcliënt"
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
@@ -539,7 +590,7 @@ msgstr ""
"eenvoudige en betrouwbare Jabber/XMPP-ervaring, met uw privacy in het "
"achterhoofd."
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
@@ -549,7 +600,7 @@ msgstr ""
"toe privacy-gerelateerde functies, zoals leesbevestigingen en typmeldingen, "
"in te stellen."
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
@@ -557,7 +608,7 @@ msgstr ""
"Dino haalt de geschiedenis op van de server en synchroniseert berichten met "
"andere apparaten."
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
msgstr "Hoofdvenster met gesprekken"
@@ -581,6 +632,34 @@ msgstr "Alias"
msgid "Add Contact"
msgstr "Contact toevoegen"
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr "Geen actieve zoekopdracht"
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr "Typ om te beginnen zoeken"
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr "Geen overeenkomende berichten"
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr "Controleer de spelling of probeer filters te verwijderen"
+
+#~ msgid "Copy Link Address"
+#~ msgstr "Verwijzingsadres kopiëren"
+
+#~ msgid "Copy"
+#~ msgstr "Kopiëren"
+
+#~ msgid "Select All"
+#~ msgstr "Alles selecteren"
+
+#~ msgid "Search"
+#~ msgstr "Zoeken"
+
#~ msgid "Send message marker"
#~ msgstr "Berichtmarkers sturen"
diff --git a/main/po/nl_BE.po b/main/po/nl_BE.po
index ac82d837..b6b222c8 100644
--- a/main/po/nl_BE.po
+++ b/main/po/nl_BE.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
-"PO-Revision-Date: 2018-06-18 12:37+0000\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-10-12 10:27+0000\n"
"Last-Translator: Nathan Follens <nthn@unseen.is>\n"
"Language-Team: Flemish <https://hosted.weblate.org/projects/dino/"
"translations/nl_BE/>\n"
@@ -17,22 +17,27 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.0.1\n"
+"X-Generator: Weblate 3.2.1\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "Abonneringsverzoek"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "Toestaan"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "Afwijzen"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -53,7 +58,6 @@ msgstr "Selecteren"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -67,52 +71,78 @@ msgstr "Afbeeldingen"
msgid "All files"
msgstr "Alle bestanden"
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr "Verbinding maken…"
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "Verbonden"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "Verbinding verbroken"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "Verkeerd paswoord"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr "Ongeldig TLS-certificaat"
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "Fout"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "Account toevoegen"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
msgstr "JID moet de vorm ‘gebruiker@voorbeeld.be’ volgen"
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr "Geen antwoord van server"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr "Registreren bij %s"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr "De server vereist registratie via ne website"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr "Open registratie"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr "Registreren"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr "Bekijk %s voor meer informatie over hoe te registreren"
+
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
msgid "Me"
msgstr "Ik"
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr "%d %b"
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "Gisteren"
@@ -157,22 +187,24 @@ msgid "Add"
msgstr "Toevoegen"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "Opslaan"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr "Deelnemen aan kanaal"
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "Volgende"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr "Gesprek beginnen"
@@ -212,70 +244,58 @@ msgstr "Kiest nen anderen bijnaam"
msgid "Too many occupants in room"
msgstr "Groepsgesprek heeft te veel deelnemers"
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr "Geen accounts actief"
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr "Accounts beheren"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr "Geen gesprekken actief"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr "Vandaag"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr "%a, %b %d"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
msgstr "%s, %s en %i anderen"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
msgstr "%s, %s en %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
msgstr "%s en %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
msgid "is typing…"
msgid_plural "are typing…"
msgstr[0] "is aan het typen…"
msgstr[1] "zijn aan het typen…"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr "is gestopt met typen"
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr "Bestand"
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr "Bericht te lang"
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr "Verwijzingsadres kopiëren"
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr "Kopiëren"
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
-msgstr "Alles selecteren"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "Bestand"
#: main/src/ui/conversation_summary/subscription_notification.vala:48
msgid "This contact would like to add you to their contact list"
@@ -344,12 +364,27 @@ msgstr "Privégesprek beginnen"
msgid "Kick"
msgstr "Schoppen"
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr "%i zoekresultaten"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr "In %s"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr "Met %s"
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr "Groepsgespreksgegevens"
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr "Contactgegevens"
@@ -389,7 +424,7 @@ msgstr "Wie mag de JID’s van de deelnemers zien?"
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -432,7 +467,7 @@ msgstr "Gespreksconfiguratie"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr "Instellingen"
@@ -497,12 +532,12 @@ msgstr "Melding tonen bij nieuw bericht"
msgid "Convert smileys to emojis"
msgstr "Smileys omzetten naar emoji’s"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr "Accounts"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr "Lokalen alias"
@@ -514,24 +549,40 @@ msgstr "Geen accounts ingesteld"
msgid "Add an account"
msgstr "Account toevoegen"
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr "Account aanmaken"
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr "Kiest nen openbare server"
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr "Of voert een serveradres in"
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr "Inloggen"
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr "Kiest nen andere server"
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr "Onversleuteld"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr "Afsluiten"
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr "Zoeken"
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
-#, fuzzy
+#: main/data/im.dino.Dino.appdata.xml.in:7
msgid "Modern XMPP Chat Client"
-msgstr "Modernen XMPP-cliënt"
+msgstr "Modernen XMPP-chatcliënt"
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
@@ -541,7 +592,7 @@ msgstr ""
"eenvoudige en betrouwbare Jabber/XMPP-ervaring, met uw privacy in het "
"achterhoofd."
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
@@ -551,7 +602,7 @@ msgstr ""
"toe privacygerelateerde functies, gelijk leesbevestigingen en typmeldingen, "
"in te stellen."
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
@@ -559,7 +610,7 @@ msgstr ""
"Dino haalt de geschiedenis op van de server en synchroniseert berichten met "
"andere apparaten."
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
msgstr "Hoofdvenster met gesprekken"
@@ -583,6 +634,34 @@ msgstr "Alias"
msgid "Add Contact"
msgstr "Contact toevoegen"
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr "Genen actieve zoekopdracht"
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr "Typt voor te beginnen zoeken"
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr "Geen overeenkomende berichten"
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr "Controleert de spelling of probeert filters te verwijderen"
+
+#~ msgid "Copy Link Address"
+#~ msgstr "Verwijzingsadres kopiëren"
+
+#~ msgid "Copy"
+#~ msgstr "Kopiëren"
+
+#~ msgid "Select All"
+#~ msgstr "Alles selecteren"
+
+#~ msgid "Search"
+#~ msgstr "Zoeken"
+
#~ msgid "Send message marker"
#~ msgstr "Berichtmarkers sturen"
diff --git a/main/po/pl.po b/main/po/pl.po
index 46679b13..1d5e8046 100644
--- a/main/po/pl.po
+++ b/main/po/pl.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
-"PO-Revision-Date: 2018-02-19 18:39+0000\n"
-"Last-Translator: Andrzej Czerniak <andrzej.czerniak@gmail.com>\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-09-25 09:34+0000\n"
+"Last-Translator: Michael K <kellermichal@gmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/dino/translations/"
"pl/>\n"
"Language: pl\n"
@@ -18,22 +18,27 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 2.19\n"
+"X-Generator: Weblate 3.2-dev\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "Żądanie subskrypcji"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "Akceptuj"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "Odmów"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -54,7 +59,6 @@ msgstr "Wybierz"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -68,38 +72,64 @@ msgstr "Obrazy"
msgid "All files"
msgstr "Wszystkie pliki"
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr "Próba łączenia…"
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "Połączony"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "Rozłączony"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "Błędne hasło"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr "Nieprawidłowy certyfikat TLS"
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "Błąd"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "Dodaj konto"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
-msgstr ""
+msgstr "JID powinien być w formie \"użytkownik@przykład.com\""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr "Brak odpowiedzi z serwera"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr "Zarejestrowano na %s"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr "Serwer wymaga rejestracji przez stronę internetową"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr "Otwarta rejestracja"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr "Zarejestruj"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr "Sprawdź %s aby dowiedzieć się na temat rejestracji"
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
@@ -107,13 +137,13 @@ msgid "Me"
msgstr "Ja"
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr "%b %d"
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "Wczoraj"
@@ -159,24 +189,26 @@ msgid "Add"
msgstr "Dodaj"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "Zapisz"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
-msgstr ""
+msgstr "Dołącz do kanału"
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "Następny"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
-msgstr ""
+msgstr "Rozpocznij rozmowę"
#: main/src/ui/add_conversation/select_contact_dialog.vala:86
msgid "Start"
@@ -214,42 +246,42 @@ msgstr "Wybierz inny pseudonim"
msgid "Too many occupants in room"
msgstr "Zbyt duża liczba osób w pokoju"
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr "Brak aktywnych kont"
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr "Zarządzaj kontami"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr "Brak aktywnych konwersacji"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr "Dzisiaj"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr "%a, %b %d"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
-msgstr ""
+msgstr "%s, %s i %i inne"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
-msgstr ""
+msgstr "%s, %s, i %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
-msgstr ""
+msgstr "%s i %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
#, fuzzy
msgid "is typing…"
msgid_plural "are typing…"
@@ -257,29 +289,17 @@ msgstr[0] "pisze…"
msgstr[1] "pisze…"
msgstr[2] "pisze…"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr "przerwał pisanie"
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr "Plik"
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr "Wiadomość jest zbyt długa"
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr "Skopiuj adres odnośnika"
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr "Kopiuj"
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
-msgstr "Wybierz wszystkie"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "Plik"
#: main/src/ui/conversation_summary/subscription_notification.vala:48
msgid "This contact would like to add you to their contact list"
@@ -348,12 +368,27 @@ msgstr "Rozpocznij prywatną rozmowę"
msgid "Kick"
msgstr "Wykop"
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr "%i wyniki wyszukiwania"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr "W %s"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr "Z %s"
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr "Szczegóły pokoju"
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr "Szczegóły kontaktu"
@@ -391,7 +426,7 @@ msgstr "Kto może wyświetlać prawdziwy JID?"
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -433,7 +468,7 @@ msgstr "Konfiguracja pokoju"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr "Ustawienia"
@@ -499,12 +534,12 @@ msgstr "Powiadom jeżeli nadejdzie wiadomość"
msgid "Convert smileys to emojis"
msgstr "Zamień tekst na emotikony"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr "Konta"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr "Lokalna nazwa użytkownika"
@@ -516,45 +551,65 @@ msgstr "Brak skonfigurowanych kont"
msgid "Add an account"
msgstr "Dodaj konto"
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr "Załóż konto"
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr "Wybierz serwer publiczny"
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr "Lub specjalny adres serwera"
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr "Wybierz kolejny serwer"
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr "Nieszyfrowany"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr "Wyjdź"
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr "Wyszukaj"
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
+#: main/data/im.dino.Dino.appdata.xml.in:7
msgid "Modern XMPP Chat Client"
-msgstr ""
+msgstr "Nowoczesny klient Chatu XMPP"
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
"privacy in mind."
msgstr ""
+"Dino jest nowoczesnym klientem chat z otwartym źródłem w wersji na "
+"komputery. Skupia się na prostej obsłudze Jabber/XMPP dbając o twoją "
+"prywatność."
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
"notifications."
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
-msgstr ""
+msgstr "Główne okno rozmów"
#: main/data/add_conversation/conference_details_fragment.ui:19
#: main/data/add_conversation/add_groupchat_dialog.ui:49
@@ -576,6 +631,34 @@ msgstr "Alias"
msgid "Add Contact"
msgstr "Dodaj kontakt"
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr ""
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr "Zacznij pisać aby wyszukać"
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr ""
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr ""
+
+#~ msgid "Copy Link Address"
+#~ msgstr "Skopiuj adres odnośnika"
+
+#~ msgid "Copy"
+#~ msgstr "Kopiuj"
+
+#~ msgid "Select All"
+#~ msgstr "Wybierz wszystkie"
+
+#~ msgid "Search"
+#~ msgstr "Wyszukaj"
+
#~ msgid "Send message marker"
#~ msgstr "Wyślij informację o odczytaniu wiadomości"
diff --git a/main/po/pt_BR.po b/main/po/pt_BR.po
index 8819ddb1..9cfecb3b 100644
--- a/main/po/pt_BR.po
+++ b/main/po/pt_BR.po
@@ -6,9 +6,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
-"PO-Revision-Date: 2018-06-14 20:43+0000\n"
-"Last-Translator: 5lm31d5 <jeanrk15@gmail.com>\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-09-10 03:24+0000\n"
+"Last-Translator: Rhagni Oliveira <rhagni@gmail.com>\n"
"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/dino/"
"translations/pt_BR/>\n"
"Language: pt_BR\n"
@@ -16,22 +16,27 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 3.0.1\n"
+"X-Generator: Weblate 3.2-dev\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "Pedido de assinatura"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "Aceitar"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "Negar"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -52,7 +57,6 @@ msgstr "Selecionar"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -66,52 +70,78 @@ msgstr "Imagens"
msgid "All files"
msgstr "Todos os arquivos"
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr "Conectando…"
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "Conectado"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "Desconectado"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "Senha incorreta"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr "Certificado TLS inválido"
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "Erro"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "Adicionar conta"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
+msgstr "O Jabber ID deve estar no formato \"usuário@exemplo.com\""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr "Sem resposta do servidor"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr "Registre-se em %s"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr "O servidor requer que se inscreva através de um site"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
msgstr ""
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr "Registrar"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr "Verifique %s para informação de como se inscrever"
+
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
msgid "Me"
msgstr "Eu"
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr "%b %d"
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "Ontem"
@@ -156,22 +186,24 @@ msgid "Add"
msgstr "Adicionar"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "Salvar"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr "Juntar-se a um canal"
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "Próximo"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr "Iniciar conversa"
@@ -211,71 +243,58 @@ msgstr "Escolha um apelido diferente"
msgid "Too many occupants in room"
msgstr "Número máximo da sala"
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr "Nenhuma conta ativa"
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr "Gerenciar contas"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr "Nenhuma conversa ativa"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr "Hoje"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr "%a, %b %d"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
-msgstr ""
+msgstr "%s, %s e outros %i"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
-msgstr ""
+msgstr "%s, %s e %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
-msgstr ""
+msgstr "%s e %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
-#, fuzzy
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
msgid "is typing…"
msgid_plural "are typing…"
msgstr[0] "está digitando…"
-msgstr[1] "está digitando…"
+msgstr[1] "estão digitando…"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr "parou de digitar"
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr "Arquivo"
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr "Mensagem muito longa"
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr "Copiar endereço do link"
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr "Copiar"
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
-msgstr "Selecionar tudo"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "Arquivo"
#: main/src/ui/conversation_summary/subscription_notification.vala:48
msgid "This contact would like to add you to their contact list"
@@ -344,12 +363,27 @@ msgstr "Iniciar conversa privada"
msgid "Kick"
msgstr "Kick"
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr "%i resultado(s) da busca"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr "Em %s"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr "Com %s"
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr "Detalhes da Conferência"
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr "Detalhes do contato"
@@ -387,7 +421,7 @@ msgstr "Quem pode encontrar JIDs reais?"
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -429,7 +463,7 @@ msgstr "Configuração da sala"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr "Configurações"
@@ -449,7 +483,7 @@ msgstr "Enviar notificação ao digitar"
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/data/settings_dialog.ui:34
msgid "Send read receipts"
-msgstr ""
+msgstr "Enviar confirmação de leitura"
#: main/src/ui/contact_details/settings_provider.vala:30
#: main/src/ui/contact_details/settings_provider.vala:39
@@ -494,12 +528,12 @@ msgstr "Notificar quando uma nova mensagem chegar"
msgid "Convert smileys to emojis"
msgstr "Converter smileys para emojis"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr "Contas"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr "Pseudônimo local"
@@ -511,45 +545,70 @@ msgstr "Nenhuma conta configurada"
msgid "Add an account"
msgstr "Adicionar conta"
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr "Criar conta"
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr "Escolha um servidor publico"
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr "Ou especifique um endereço de servidor"
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr "Entrar em vez disso"
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr "Escolha outro servidor"
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr "Não-criptografado"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr "Sair"
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr "Pesquisar"
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
+#: main/data/im.dino.Dino.appdata.xml.in:7
msgid "Modern XMPP Chat Client"
-msgstr ""
+msgstr "Moderno cliente de chat XMPP"
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
"privacy in mind."
msgstr ""
+"Dino é um moderno chat de código aberto para desktop. Ele é focado em prover "
+"uma transparente e confiável experiência Jabber/XMPP, tendo em mente a sua "
+"privacidade."
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
"notifications."
msgstr ""
+"Suporte criptografia ponta a ponta com OMEMO e OpenPGP e permite configurar "
+"privacidade—características relacionadas às notificações de leitura, "
+"recebimento e escrita."
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
msgstr ""
+"Dino obtém o histórico do servidor e sincroniza mensagens com outros "
+"dispositivos."
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
-msgstr ""
+msgstr "Janela principal com as conversas"
#: main/data/add_conversation/conference_details_fragment.ui:19
#: main/data/add_conversation/add_groupchat_dialog.ui:49
@@ -571,6 +630,34 @@ msgstr "Pseudônimo"
msgid "Add Contact"
msgstr "Adicionar contato"
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr "Sem busca ativa"
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr "Escreva para iniciar a busca"
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr "Sem mensagens correspondentes"
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr "Verifique a grafia ou tente remover filtros"
+
+#~ msgid "Copy Link Address"
+#~ msgstr "Copiar endereço do link"
+
+#~ msgid "Copy"
+#~ msgstr "Copiar"
+
+#~ msgid "Select All"
+#~ msgstr "Selecionar tudo"
+
+#~ msgid "Search"
+#~ msgstr "Pesquisar"
+
#~ msgid "Send message marker"
#~ msgstr "Enviar marcador de mensagem"
diff --git a/main/po/ro.po b/main/po/ro.po
index 2a6c2ee8..d8d59de8 100644
--- a/main/po/ro.po
+++ b/main/po/ro.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
-"PO-Revision-Date: 2018-05-02 23:41+0000\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-09-12 22:24+0000\n"
"Last-Translator: Licaon Kter <licaon.kter@protonmail.com>\n"
"Language-Team: Romanian <https://hosted.weblate.org/projects/dino/"
"translations/ro/>\n"
@@ -18,22 +18,27 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
"20)) ? 1 : 2;\n"
-"X-Generator: Weblate 3.0-dev\n"
+"X-Generator: Weblate 3.2-dev\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "Cerere de abonare"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "Acceptă"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "Refuză"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -54,7 +59,6 @@ msgstr "Selectare"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -68,52 +72,78 @@ msgstr "Imagini"
msgid "All files"
msgstr "Toate fișierele"
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr "Conectare…"
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "Conectat"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "Deconectat"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "Parolă greșită"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr "Certificat TLS invalid"
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "Eroare"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "Adaugă un cont"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
msgstr "JID trebuie să fie de forma “utilizator@exemplu.ro”"
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr "Nici un răspuns de la server"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr "Înregistrare pe %s"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr "Serverul necesită înregistrarea printr-un site web"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr "Deschis pentru înregistrare"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr "Înregistrează-te"
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr "Aflați pe %s informații despre cum se face înregistrarea"
+
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
msgid "Me"
msgstr "Eu"
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr "%b %d"
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "Ieri"
@@ -159,22 +189,24 @@ msgid "Add"
msgstr "Adaugă"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "Salvare"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr "Alătură-te canalului"
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "Următorul"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr "Pornește o conversație"
@@ -214,71 +246,59 @@ msgstr "Alegeți un nume diferit"
msgid "Too many occupants in room"
msgstr "Discuția are prea mulți membrii"
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr "Nici un cont activ"
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr "Administrare conturi"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr "Nici o conversație activă"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr "Azi"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr "%a, %b %d"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
msgstr "%s, %s și încă %i alții"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
msgstr "%s, %s și %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
msgstr "%s și %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
msgid "is typing…"
msgid_plural "are typing…"
msgstr[0] "tastează…"
msgstr[1] "tastează…"
msgstr[2] "tastează…"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr "s-a oprit din scris"
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr "Fișier"
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr "Mesaj prea lung"
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr "Copiază adresa legăturii"
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr "Copiere"
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
-msgstr "Selectează tot"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "Fișier"
#: main/src/ui/conversation_summary/subscription_notification.vala:48
msgid "This contact would like to add you to their contact list"
@@ -347,12 +367,27 @@ msgstr "Pornește o conversație privată"
msgid "Kick"
msgstr "Dă afară"
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr "%i rezultate la căutare"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr "În %s"
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr "Cu %s"
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr "Detalii conferință"
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr "Detalii contact"
@@ -390,7 +425,7 @@ msgstr "Cine poate descoperi ID-urile adevărate?"
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -432,7 +467,7 @@ msgstr "Configurare discuție"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr "Setări"
@@ -497,12 +532,12 @@ msgstr "Notifică atunci când este primit un mesaj nou"
msgid "Convert smileys to emojis"
msgstr "Convertește zâmbilici în emoticoane"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr "Conturi"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr "Alias local"
@@ -514,24 +549,40 @@ msgstr "Nici un cont configurat"
msgid "Add an account"
msgstr "Adaugă un cont"
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr "Creează cont"
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr "Alegeți un server public"
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr "Sau specificați adresa serverului"
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr "Înapoi la conectare"
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr "Alege alt server"
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr "Necriptat"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr "Ieșire"
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr "Căutare"
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
-#, fuzzy
+#: main/data/im.dino.Dino.appdata.xml.in:7
msgid "Modern XMPP Chat Client"
-msgstr "Client XMPP modern"
+msgstr "Client XMPP de discuții modern"
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
@@ -541,7 +592,7 @@ msgstr ""
"Se concentrează să furnizeze o experiență Jabber/XMPP clară și fiabilă, "
"ținând cont de confidențialitatea dumneavoastră."
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
@@ -551,7 +602,7 @@ msgstr ""
"și permite configurarea caracteristicilor legate de confidențialitate precum "
"trimiterea notificărilor de primire și tastare."
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
@@ -559,7 +610,7 @@ msgstr ""
"Dino preia istoricul discuțiilor de pe server și sincronizează mesajele cu "
"celelalte dispozitive."
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
msgstr "Fereastra principală de conversații"
@@ -583,6 +634,34 @@ msgstr "Alias"
msgid "Add Contact"
msgstr "Adaugă contact"
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr "Nici o căutare activă"
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr "Tastați ceva pentru a porni căutarea"
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr "Nici un mesaj nu se potrivește"
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr "Verificați ortografia sau încercați să eliminați filtre"
+
+#~ msgid "Copy Link Address"
+#~ msgstr "Copiază adresa legăturii"
+
+#~ msgid "Copy"
+#~ msgstr "Copiere"
+
+#~ msgid "Select All"
+#~ msgstr "Selectează tot"
+
+#~ msgid "Search"
+#~ msgstr "Căutare"
+
#~ msgid "Send message marker"
#~ msgstr "Trimite marcajul mesajului"
diff --git a/main/po/ru.po b/main/po/ru.po
index f2e25fc0..a014f090 100644
--- a/main/po/ru.po
+++ b/main/po/ru.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-07-01 09:42+0000\n"
"Last-Translator: nvlgit <nvlbox@gmail.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/dino/"
@@ -20,20 +20,25 @@ msgstr ""
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 3.1-dev\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "Требуется авторизация"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "Принять"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "Отклонить"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -54,7 +59,6 @@ msgstr "Выбрать"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -68,52 +72,78 @@ msgstr "Изображения"
msgid "All files"
msgstr "Все файлы"
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr "Подключение…"
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "Подключено"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "Отключено"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "Неверный пароль"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr "Недействительный TSL сертификат"
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "Ошибка"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "Добавить аккаунт"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
msgstr "JID должен быть в виде «user@example.com»"
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr ""
+
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
msgid "Me"
msgstr "Я"
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr "%b %d"
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "Вчера"
@@ -159,22 +189,24 @@ msgid "Add"
msgstr "Добавить"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "Сохранить"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr "Войти в канал"
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "Следующее"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr "Начать чат"
@@ -214,42 +246,42 @@ msgstr "Выберите другой никнейм"
msgid "Too many occupants in room"
msgstr "Слишком много посетителей в комнате"
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr "Нет активных аккаунтов"
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr "Управление аккаунтами"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr "Нет активных чатов"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr "Сегодня"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr "%a, %b %d"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, fuzzy, c-format
msgid "%s, %s and %i others"
msgstr "%s, %s и %i других"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
msgstr "%s, %s и %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
msgstr "%s и %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
#, fuzzy
msgid "is typing…"
msgid_plural "are typing…"
@@ -257,29 +289,17 @@ msgstr[0] "печатает…"
msgstr[1] "печатает…"
msgstr[2] "печатает…"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr "перестал печатать"
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr "Файл"
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr "Сообщение слишком длинное"
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr "Копировать адресс ссылки"
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr "Копировать"
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
-msgstr "Выбрать всё"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "Файл"
#: main/src/ui/conversation_summary/subscription_notification.vala:48
msgid "This contact would like to add you to their contact list"
@@ -348,12 +368,27 @@ msgstr "Начать личный чат"
msgid "Kick"
msgstr "Выгнать"
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr ""
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr ""
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr ""
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr "Информация о конференции"
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr "Информация о контакте"
@@ -391,7 +426,7 @@ msgstr "Кто может видеть настоящие JID?"
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -433,7 +468,7 @@ msgstr "Конфигурация комнаты"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr "Настройки"
@@ -498,12 +533,12 @@ msgstr "Уведомлять о новых сообщениях"
msgid "Convert smileys to emojis"
msgstr "Превращать смайлы в эмоджи"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr "Аккаунты"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr "Локальный псевдоним"
@@ -515,38 +550,55 @@ msgstr "Нет настроенных аккаунтов"
msgid "Add an account"
msgstr "Добавить аккаунт"
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr ""
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr "Не шифровать"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr "Выйти"
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr "Поиск"
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
+#: main/data/im.dino.Dino.appdata.xml.in:7
#, fuzzy
msgid "Modern XMPP Chat Client"
msgstr "Современный XMPP-клиент"
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
"privacy in mind."
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
"notifications."
msgstr ""
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
@@ -554,7 +606,7 @@ msgstr ""
"Dino загружает историю с сервера и синхронизирует сообщения с другими "
"устройствами."
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
msgstr "Главное окно с чатами"
@@ -578,6 +630,34 @@ msgstr "Псевдоним"
msgid "Add Contact"
msgstr "Добавить контакт"
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr ""
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr ""
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr ""
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr ""
+
+#~ msgid "Copy Link Address"
+#~ msgstr "Копировать адресс ссылки"
+
+#~ msgid "Copy"
+#~ msgstr "Копировать"
+
+#~ msgid "Select All"
+#~ msgstr "Выбрать всё"
+
+#~ msgid "Search"
+#~ msgstr "Поиск"
+
#~ msgid "Send message marker"
#~ msgstr "Отправлять маркеры сообщений"
diff --git a/main/po/zh_Hans.po b/main/po/zh_Hans.po
index 165ab765..2cf8f99c 100644
--- a/main/po/zh_Hans.po
+++ b/main/po/zh_Hans.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dino\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-05-09 10:35+0000\n"
"Last-Translator: fiaxh <weblate@mx.ax.lt>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
@@ -19,20 +19,25 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 3.0-dev\n"
-#: main/src/ui/notifications.vala:70
+#: main/src/ui/notifications.vala:71
msgid "Subscription request"
msgstr "订阅请求"
-#: main/src/ui/notifications.vala:76
+#: main/src/ui/notifications.vala:77
#: main/src/ui/conversation_summary/subscription_notification.vala:37
msgid "Accept"
msgstr "接受"
-#: main/src/ui/notifications.vala:77
+#: main/src/ui/notifications.vala:78
#: main/src/ui/conversation_summary/subscription_notification.vala:38
msgid "Deny"
msgstr "拒绝"
+#: main/src/ui/notifications.vala:84
+#, c-format
+msgid "Failed connecting to %s"
+msgstr ""
+
#: main/src/ui/manage_accounts/dialog.vala:126
#, c-format
msgid "Remove account %s?"
@@ -53,7 +58,6 @@ msgstr "选择"
#: main/src/ui/manage_accounts/dialog.vala:153 main/src/ui/application.vala:44
#: main/src/ui/add_conversation/add_conference_dialog.vala:16
#: main/src/ui/add_conversation/select_contact_dialog.vala:41
-#: main/data/manage_accounts/add_account_dialog.ui:11
#: main/data/add_conversation/add_groupchat_dialog.ui:11
#: main/data/add_conversation/add_contact_dialog.ui:12
msgid "Cancel"
@@ -67,52 +71,78 @@ msgstr "图片"
msgid "All files"
msgstr "所有文件"
-#: main/src/ui/manage_accounts/dialog.vala:231
+#: main/src/ui/manage_accounts/dialog.vala:222
msgid "Connecting…"
msgstr "连接中…"
-#: main/src/ui/manage_accounts/dialog.vala:233
+#: main/src/ui/manage_accounts/dialog.vala:224
msgid "Connected"
msgstr "已连接"
-#: main/src/ui/manage_accounts/dialog.vala:235
+#: main/src/ui/manage_accounts/dialog.vala:226
msgid "Disconnected"
msgstr "已断开连接"
-#: main/src/ui/manage_accounts/dialog.vala:244
+#: main/src/ui/manage_accounts/dialog.vala:235
msgid "Wrong password"
msgstr "密码错误"
-#: main/src/ui/manage_accounts/dialog.vala:246
+#: main/src/ui/manage_accounts/dialog.vala:237
msgid "Invalid TLS certificate"
msgstr "无效的 TLS 证书"
-#: main/src/ui/manage_accounts/dialog.vala:249
-#: main/src/ui/manage_accounts/dialog.vala:251
+#: main/src/ui/manage_accounts/dialog.vala:240
+#: main/src/ui/manage_accounts/dialog.vala:242
msgid "Error"
msgstr "错误"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:22
+#: main/src/ui/manage_accounts/add_account_dialog.vala:55
msgid "Add Account"
msgstr "添加帐号"
-#: main/src/ui/manage_accounts/add_account_dialog.vala:45
+#: main/src/ui/manage_accounts/add_account_dialog.vala:135
msgid "JID should be of the form “user@example.com”"
msgstr "JID 必须形如 “user@example.com”"
+#: main/src/ui/manage_accounts/add_account_dialog.vala:171
+msgid "No response from server"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:177
+#, c-format
+msgid "Register on %s"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:180
+msgid "The server requires to sign up through a website"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:182
+msgid "Open Registration"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:198
+msgid "Register"
+msgstr ""
+
+#: main/src/ui/manage_accounts/add_account_dialog.vala:200
+#, c-format
+msgid "Check %s for information on how to sign up"
+msgstr ""
+
#: main/src/ui/conversation_selector/groupchat_pm_row.vala:24
#: main/src/ui/conversation_selector/chat_row.vala:30
msgid "Me"
msgstr "我"
#: main/src/ui/conversation_selector/conversation_row.vala:154
-#: main/src/ui/conversation_summary/date_separator_populator.vala:102
+#: main/src/ui/conversation_summary/date_separator_populator.vala:100
#, no-c-format
msgid "%b %d"
msgstr "%_m 月 %_d 日"
#: main/src/ui/conversation_selector/conversation_row.vala:158
-#: main/src/ui/conversation_summary/date_separator_populator.vala:93
+#: main/src/ui/conversation_summary/date_separator_populator.vala:91
msgid "Yesterday"
msgstr "昨天"
@@ -156,22 +186,24 @@ msgid "Add"
msgstr "添加"
#: main/src/ui/add_conversation/add_groupchat_dialog.vala:42
-#: main/data/manage_accounts/add_account_dialog.ui:21
+#: main/data/manage_accounts/add_account_dialog.ui:119
msgid "Save"
msgstr "保存"
#: main/src/ui/add_conversation/add_conference_dialog.vala:27
-#: main/src/ui/unified_window.vala:176 main/data/menu_add.ui:12
+#: main/src/ui/unified_window.vala:243 main/data/menu_add.ui:13
msgid "Join Channel"
msgstr "加入频道"
#: main/src/ui/add_conversation/add_conference_dialog.vala:48
+#: main/data/manage_accounts/add_account_dialog.ui:228
+#: main/data/manage_accounts/add_account_dialog.ui:308
msgid "Next"
msgstr "下一个"
#: main/src/ui/add_conversation/select_contact_dialog.vala:85
-#: main/src/ui/unified_window.vala:175 main/data/menu_add.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:28
+#: main/src/ui/unified_window.vala:242 main/data/menu_add.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:19
msgid "Start Conversation"
msgstr "开始聊天"
@@ -211,69 +243,57 @@ msgstr "选择一个不同的昵称"
msgid "Too many occupants in room"
msgstr "房间内人数过多"
-#: main/src/ui/unified_window.vala:166
+#: main/src/ui/unified_window.vala:233
msgid "No active accounts"
msgstr "没有激活的帐号"
-#: main/src/ui/unified_window.vala:167
+#: main/src/ui/unified_window.vala:234
msgid "Manage accounts"
msgstr "管理帐号"
-#: main/src/ui/unified_window.vala:174
+#: main/src/ui/unified_window.vala:241
msgid "No active conversations"
msgstr "没有激活的会话"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:87
+#: main/src/ui/conversation_summary/date_separator_populator.vala:85
msgid "Today"
msgstr "今天"
-#: main/src/ui/conversation_summary/date_separator_populator.vala:100
+#: main/src/ui/conversation_summary/date_separator_populator.vala:98
msgid "%a, %b %d"
msgstr "%a,%b%d日"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:148
+#: main/src/ui/conversation_summary/chat_state_populator.vala:146
#, c-format
msgid "%s, %s and %i others"
msgstr "%s、%s 以及 %i 个其他人"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:150
+#: main/src/ui/conversation_summary/chat_state_populator.vala:148
#, c-format
msgid "%s, %s and %s"
msgstr "%s、%s 和 %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:152
+#: main/src/ui/conversation_summary/chat_state_populator.vala:150
#, c-format
msgid "%s and %s"
msgstr "%s 和 %s"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:157
+#: main/src/ui/conversation_summary/chat_state_populator.vala:155
msgid "is typing…"
msgid_plural "are typing…"
msgstr[0] "正在输入…"
-#: main/src/ui/conversation_summary/chat_state_populator.vala:159
+#: main/src/ui/conversation_summary/chat_state_populator.vala:157
msgid "has stopped typing"
msgstr "已经停止输入"
-#: main/src/ui/conversation_summary/default_file_display.vala:50
-msgid "File"
-msgstr "文件"
-
-#: main/src/ui/conversation_summary/message_textview.vala:41
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:58
msgid "Message too long"
msgstr "消息太长"
-#: main/src/ui/conversation_summary/message_textview.vala:94
-msgid "Copy Link Address"
-msgstr "复制链接地址"
-
-#: main/src/ui/conversation_summary/message_textview.vala:102
-msgid "Copy"
-msgstr "复制"
-
-#: main/src/ui/conversation_summary/message_textview.vala:107
-msgid "Select All"
-msgstr "全选"
+#: main/src/ui/conversation_summary/content_item_widget_factory.vala:196
+msgid "File"
+msgstr "文件"
#: main/src/ui/conversation_summary/subscription_notification.vala:48
msgid "This contact would like to add you to their contact list"
@@ -342,12 +362,27 @@ msgstr "启动私密会话"
msgid "Kick"
msgstr "踢出"
+#: main/src/ui/global_search.vala:134
+#, c-format
+msgid "%i search results"
+msgstr ""
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "In %s"
+msgstr ""
+
+#: main/src/ui/global_search.vala:161
+#, c-format
+msgid "With %s"
+msgstr ""
+
#: main/src/ui/contact_details/dialog.vala:37
msgid "Conference Details"
msgstr "聊天室详情"
-#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:6
-#: main/data/im.dino.Dino.appdata.xml.in:32
+#: main/src/ui/contact_details/dialog.vala:37 main/data/menu_conversation.ui:7
+#: main/data/im.dino.Dino.appdata.xml.in:23
msgid "Contact Details"
msgstr "联系人详情"
@@ -385,7 +420,7 @@ msgstr "谁可能发现真实 JID?"
#: main/src/ui/contact_details/muc_config_form_provider.vala:59
#: main/data/manage_accounts/dialog.ui:170
-#: main/data/manage_accounts/add_account_dialog.ui:73
+#: main/data/manage_accounts/add_account_dialog.ui:62
#: main/data/add_conversation/conference_details_fragment.ui:175
#: main/data/add_conversation/add_groupchat_dialog.ui:147
msgid "Password"
@@ -427,7 +462,7 @@ msgstr "房间配置"
#: main/src/ui/contact_details/settings_provider.vala:22
#: main/src/ui/contact_details/settings_provider.vala:25
#: main/src/ui/contact_details/settings_provider.vala:30
-#: main/data/menu_app.ui:10
+#: main/data/menu_app.ui:11
msgid "Settings"
msgstr "设置"
@@ -492,12 +527,12 @@ msgstr "新消息到达时通知"
msgid "Convert smileys to emojis"
msgstr "将笑脸转换成 Emoji"
-#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:6
+#: main/data/manage_accounts/dialog.ui:9 main/data/menu_app.ui:7
msgid "Accounts"
msgstr "帐号"
#: main/data/manage_accounts/dialog.ui:200
-#: main/data/manage_accounts/add_account_dialog.ui:102
+#: main/data/manage_accounts/add_account_dialog.ui:83
msgid "Local alias"
msgstr "本地别名"
@@ -509,24 +544,41 @@ msgstr "没有配置账户"
msgid "Add an account"
msgstr "添加新账号"
+#: main/data/manage_accounts/add_account_dialog.ui:109
+#: main/data/manage_accounts/add_account_dialog.ui:146
+msgid "Create account"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:158
+msgid "Choose a public server"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:187
+msgid "Or specify a server address"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:207
+msgid "Sign in instead"
+msgstr ""
+
+#: main/data/manage_accounts/add_account_dialog.ui:288
+msgid "Pick another server"
+msgstr ""
+
#: main/data/menu_encryption.ui:14
msgid "Unencrypted"
msgstr "未加密"
-#: main/data/menu_app.ui:16
+#: main/data/menu_app.ui:17
msgid "Quit"
msgstr "退出"
-#: main/data/conversation_selector/view.ui:14
-msgid "Search"
-msgstr "搜索"
-
-#: main/data/im.dino.Dino.appdata.xml.in:8
+#: main/data/im.dino.Dino.appdata.xml.in:7
#, fuzzy
msgid "Modern XMPP Chat Client"
msgstr "现代 XMPP 客户端"
-#: main/data/im.dino.Dino.appdata.xml.in:10
+#: main/data/im.dino.Dino.appdata.xml.in:9
msgid ""
"Dino is a modern open-source chat client for the desktop. It focuses on "
"providing a clean and reliable Jabber/XMPP experience while having your "
@@ -535,7 +587,7 @@ msgstr ""
"Dino 是一个现代的开源聊天桌面客户端。它致力于提供一个清爽又可靠的 Jabber/"
"XMPP 体验,同时又保护您的隐私。"
-#: main/data/im.dino.Dino.appdata.xml.in:14
+#: main/data/im.dino.Dino.appdata.xml.in:10
msgid ""
"It supports end-to-end encryption with OMEMO and OpenPGP and allows "
"configuring privacy-related features such as read receipts and typing "
@@ -544,13 +596,13 @@ msgstr ""
"它支持 OMEMO 和 OpenPGP 端对端加密并允许配置隐私相关的特性比如已读回执和输入"
"提醒。"
-#: main/data/im.dino.Dino.appdata.xml.in:18
+#: main/data/im.dino.Dino.appdata.xml.in:11
msgid ""
"Dino fetches history from the server and synchronizes messages with other "
"devices."
msgstr "Dino 从服务器获取消息并和其他设备同步。"
-#: main/data/im.dino.Dino.appdata.xml.in:24
+#: main/data/im.dino.Dino.appdata.xml.in:15
msgid "Main window with conversations"
msgstr "带有对话的主窗口"
@@ -574,6 +626,34 @@ msgstr "别名"
msgid "Add Contact"
msgstr "增加联系人"
+#: main/data/global_search.ui:37
+msgid "No active search"
+msgstr ""
+
+#: main/data/global_search.ui:52
+msgid "Type to start a search"
+msgstr ""
+
+#: main/data/global_search.ui:85
+msgid "No matching messages"
+msgstr ""
+
+#: main/data/global_search.ui:100
+msgid "Check the spelling or try to remove filters"
+msgstr ""
+
+#~ msgid "Copy Link Address"
+#~ msgstr "复制链接地址"
+
+#~ msgid "Copy"
+#~ msgstr "复制"
+
+#~ msgid "Select All"
+#~ msgstr "全选"
+
+#~ msgid "Search"
+#~ msgstr "搜索"
+
#~ msgid "Send message marker"
#~ msgstr "发送消息标记"
diff --git a/main/src/ui/application.vala b/main/src/ui/application.vala
index 22d6d93d..86a4e288 100644
--- a/main/src/ui/application.vala
+++ b/main/src/ui/application.vala
@@ -32,7 +32,7 @@ public class Dino.Ui.Application : Gtk.Application, Dino.Application {
window = new UnifiedWindow(this, stream_interactor);
notifications = new Notifications(stream_interactor, window);
notifications.start();
- notifications.conversation_selected.connect(window.on_conversation_selected);
+ notifications.conversation_selected.connect((conversation) => window.on_conversation_selected(conversation));
}
window.present();
});
diff --git a/main/src/ui/avatar_image.vala b/main/src/ui/avatar_image.vala
index 26955ae0..f690637b 100644
--- a/main/src/ui/avatar_image.vala
+++ b/main/src/ui/avatar_image.vala
@@ -18,6 +18,8 @@ public class AvatarImage : Misc {
private bool gray;
private Jid[] current_jids;
private Gdk.Pixbuf[] current_avatars;
+ private Cairo.ImageSurface? cached_surface;
+ private static int8 use_image_surface = -1;
public AvatarImage() {
can_focus = false;
@@ -78,9 +80,30 @@ public class AvatarImage : Misc {
hex_color.length > 6 ? (double) hex_color.substring(6, 2).to_long(null, 16) / 255 : 1);
}
- public override bool draw(Cairo.Context ctx) {
+ public override bool draw(Cairo.Context ctx_in) {
if (text_only == null && (current_jids == null || current_avatars == null || current_jids.length == 0)) return false;
- double radius = 3;
+
+ Cairo.Context ctx = ctx_in;
+ int width = this.width, height = this.height, base_factor = 1;
+ if (use_image_surface == -1) {
+ // TODO: detect if we have to buffer in image surface
+ use_image_surface = 1;
+ }
+ if (use_image_surface == 1) {
+ ctx_in.scale(1f/scale_factor, 1f/scale_factor);
+ if (cached_surface != null) {
+ ctx_in.set_source_surface(cached_surface, 0, 0);
+ ctx_in.paint();
+ return true;
+ }
+ width *= scale_factor;
+ height *= scale_factor;
+ base_factor *= scale_factor;
+ cached_surface = new Cairo.ImageSurface(Cairo.Format.ARGB32, width, height);
+ ctx = new Cairo.Context(cached_surface);
+ }
+
+ double radius = 3 * base_factor;
double degrees = Math.PI / 180.0;
ctx.new_sub_path();
ctx.arc(width - radius, radius, radius, -90 * degrees, 0 * degrees);
@@ -91,23 +114,23 @@ public class AvatarImage : Misc {
ctx.clip();
if (text_only != null) {
- ctx.set_source_surface(sub_surface(ctx, -1, width, height), 0, 0);
+ ctx.set_source_surface(sub_surface(ctx, -1, width, height, base_factor), 0, 0);
ctx.paint();
} else if (current_jids.length == 4 || with_plus) {
Cairo.Surface buffer = new Cairo.Surface.similar(ctx.get_target(), Cairo.Content.COLOR_ALPHA, width, height);
Cairo.Context bufctx = new Cairo.Context(buffer);
bufctx.scale(0.5, 0.5);
- bufctx.set_source_surface(sub_surface(ctx, 0, width - 1, height - 1, 2), 0, 0);
+ bufctx.set_source_surface(sub_surface(ctx, 0, width - 1, height - 1, 2 * base_factor), 0, 0);
bufctx.paint();
- bufctx.set_source_surface(sub_surface(ctx, 1, width - 1, height - 1, 2), width + 1, 0);
+ bufctx.set_source_surface(sub_surface(ctx, 1, width - 1, height - 1, 2 * base_factor), width + 1, 0);
bufctx.paint();
- bufctx.set_source_surface(sub_surface(ctx, 2, width - 1, height - 1, 2), 0, height + 1);
+ bufctx.set_source_surface(sub_surface(ctx, 2, width - 1, height - 1, 2 * base_factor), 0, height + 1);
bufctx.paint();
if (with_plus) {
- bufctx.set_source_surface(sub_surface(ctx, -1, width - 1, height - 1, 2), width + 1, height + 1);
+ bufctx.set_source_surface(sub_surface(ctx, -1, width - 1, height - 1, 2 * base_factor), width + 1, height + 1);
bufctx.paint();
} else {
- bufctx.set_source_surface(sub_surface(ctx, 3, width - 1, height - 1, 2), width + 1, height + 1);
+ bufctx.set_source_surface(sub_surface(ctx, 3, width - 1, height - 1, 2 * base_factor), width + 1, height + 1);
bufctx.paint();
}
@@ -117,11 +140,11 @@ public class AvatarImage : Misc {
Cairo.Surface buffer = new Cairo.Surface.similar(ctx.get_target(), Cairo.Content.COLOR_ALPHA, width, height);
Cairo.Context bufctx = new Cairo.Context(buffer);
bufctx.scale(0.5, 0.5);
- bufctx.set_source_surface(sub_surface(ctx, 0, width - 1, height - 1, 2), 0, 0);
+ bufctx.set_source_surface(sub_surface(ctx, 0, width - 1, height - 1, 2 * base_factor), 0, 0);
bufctx.paint();
- bufctx.set_source_surface(sub_surface(ctx, 1, width - 1, height * 2, 2), width + 1, 0);
+ bufctx.set_source_surface(sub_surface(ctx, 1, width - 1, height * 2, 2 * base_factor), width + 1, 0);
bufctx.paint();
- bufctx.set_source_surface(sub_surface(ctx, 2, width - 1 , height - 1, 2), 0, height + 1);
+ bufctx.set_source_surface(sub_surface(ctx, 2, width - 1 , height - 1, 2 * base_factor), 0, height + 1);
bufctx.paint();
ctx.set_source_surface(buffer, 0, 0);
@@ -130,15 +153,15 @@ public class AvatarImage : Misc {
Cairo.Surface buffer = new Cairo.Surface.similar(ctx.get_target(), Cairo.Content.COLOR_ALPHA, width, height);
Cairo.Context bufctx = new Cairo.Context(buffer);
bufctx.scale(0.5, 0.5);
- bufctx.set_source_surface(sub_surface(ctx, 0, width - 1, height * 2, 2), 0, 0);
+ bufctx.set_source_surface(sub_surface(ctx, 0, width - 1, height * 2, 2 * base_factor), 0, 0);
bufctx.paint();
- bufctx.set_source_surface(sub_surface(ctx, 1, width - 1, height * 2, 2), width + 1, 0);
+ bufctx.set_source_surface(sub_surface(ctx, 1, width - 1, height * 2, 2 * base_factor), width + 1, 0);
bufctx.paint();
ctx.set_source_surface(buffer, 0, 0);
ctx.paint();
} else if (current_jids.length == 1) {
- ctx.set_source_surface(sub_surface(ctx, 0, width, height), 0, 0);
+ ctx.set_source_surface(sub_surface(ctx, 0, width, height, base_factor), 0, 0);
ctx.paint();
} else {
assert_not_reached();
@@ -157,6 +180,11 @@ public class AvatarImage : Misc {
ctx.fill();
}
+ if (use_image_surface == 1) {
+ ctx_in.set_source_surface(ctx.get_target(), 0, 0);
+ ctx_in.paint();
+ }
+
return true;
}
@@ -276,6 +304,7 @@ public class AvatarImage : Misc {
assert(jids.length > 0);
assert(jids.length < 5);
assert(!with_plus || jids.length == 3);
+ this.cached_surface = null;
this.text_only = null;
this.gray = gray && allow_gray;
this.with_plus = with_plus;
diff --git a/main/src/ui/chat_input/view.vala b/main/src/ui/chat_input/view.vala
index a1c2b83d..dd111997 100644
--- a/main/src/ui/chat_input/view.vala
+++ b/main/src/ui/chat_input/view.vala
@@ -32,7 +32,7 @@ public class View : Box {
[GtkChild] private Separator file_separator;
private EncryptionButton encryption_widget = new EncryptionButton() { margin_top=3, valign=Align.START, visible=true };
- public View(StreamInteractor stream_interactor) {
+ public View init(StreamInteractor stream_interactor) {
this.stream_interactor = stream_interactor;
occupants_tab_completor = new OccupantsTabCompletor(stream_interactor, text_input);
@@ -70,6 +70,7 @@ public class View : Box {
Util.force_css(frame, "* { border-radius: 3px; }");
stream_interactor.get_module(FileManager.IDENTITY).upload_available.connect(on_upload_available);
+ return this;
}
public void initialize_for_conversation(Conversation conversation) {
diff --git a/main/src/ui/contact_details/muc_config_form_provider.vala b/main/src/ui/contact_details/muc_config_form_provider.vala
index 072627bf..a088bd97 100644
--- a/main/src/ui/contact_details/muc_config_form_provider.vala
+++ b/main/src/ui/contact_details/muc_config_form_provider.vala
@@ -74,57 +74,9 @@ public class MucConfigFormProvider : Plugins.ContactDetailsProvider, Object {
}
}
- Widget? widget = get_widget(field);
+ Widget? widget = Util.get_data_form_fild_widget(field);
if (widget != null) contact_details.add(_("Room Configuration"), label, desc, widget);
}
-
- private static Widget? get_widget(DataForms.DataForm.Field field) {
- if (field.type_ == null) return null;
- switch (field.type_) {
- case DataForms.DataForm.Type.BOOLEAN:
- DataForms.DataForm.BooleanField boolean_field = field as DataForms.DataForm.BooleanField;
- Switch sw = new Switch() { active=boolean_field.value, valign=Align.CENTER, visible=true };
- sw.state_set.connect((state) => {
- boolean_field.value = state;
- return false;
- });
- return sw;
- case DataForms.DataForm.Type.JID_MULTI:
- return null;
- case DataForms.DataForm.Type.LIST_SINGLE:
- DataForms.DataForm.ListSingleField list_single_field = field as DataForms.DataForm.ListSingleField;
- ComboBoxText combobox = new ComboBoxText() { valign=Align.CENTER, visible=true };
- for (int i = 0; i < list_single_field.options.size; i++) {
- DataForms.DataForm.Option option = list_single_field.options[i];
- combobox.append(option.value, option.label);
- if (option.value == list_single_field.value) combobox.active = i;
- }
- combobox.changed.connect(() => {
- list_single_field.value = combobox.get_active_id();
- });
- return combobox;
- case DataForms.DataForm.Type.LIST_MULTI:
- return null;
- case DataForms.DataForm.Type.TEXT_PRIVATE:
- DataForms.DataForm.TextPrivateField text_private_field = field as DataForms.DataForm.TextPrivateField;
- Entry entry = new Entry() { text=text_private_field.value ?? "", valign=Align.CENTER, visible=true, visibility=false };
- entry.key_release_event.connect(() => {
- text_private_field.value = entry.text;
- return false;
- });
- return entry;
- case DataForms.DataForm.Type.TEXT_SINGLE:
- DataForms.DataForm.TextSingleField text_single_field = field as DataForms.DataForm.TextSingleField;
- Entry entry = new Entry() { text=text_single_field.value ?? "", valign=Align.CENTER, visible=true };
- entry.key_release_event.connect(() => {
- text_single_field.value = entry.text;
- return false;
- });
- return entry;
- default:
- return null;
- }
- }
}
}
diff --git a/main/src/ui/conversation_list_titlebar.vala b/main/src/ui/conversation_list_titlebar.vala
index 65515019..60d9a6fb 100644
--- a/main/src/ui/conversation_list_titlebar.vala
+++ b/main/src/ui/conversation_list_titlebar.vala
@@ -10,7 +10,6 @@ public class ConversationListTitlebar : Gtk.HeaderBar {
public signal void conversation_opened(Conversation conversation);
[GtkChild] private MenuButton add_button;
- [GtkChild] public ToggleButton search_button;
private StreamInteractor stream_interactor;
diff --git a/main/src/ui/conversation_selector/chat_row.vala b/main/src/ui/conversation_selector/chat_row.vala
deleted file mode 100644
index fb427413..00000000
--- a/main/src/ui/conversation_selector/chat_row.vala
+++ /dev/null
@@ -1,54 +0,0 @@
-using Gdk;
-using Gee;
-using Gtk;
-
-using Dino.Entities;
-using Xmpp;
-
-namespace Dino.Ui.ConversationSelector {
-
-public class ChatRow : ConversationRow {
-
- public ChatRow(StreamInteractor stream_interactor, Conversation conversation) {
- base(stream_interactor, conversation);
- has_tooltip = true;
- query_tooltip.connect ((x, y, keyboard_tooltip, tooltip) => {
- tooltip.set_custom(generate_tooltip());
- return true;
- });
- stream_interactor.get_module(RosterManager.IDENTITY).updated_roster_item.connect((account, jid, roster_item) => {
- if (conversation.account.equals(account) && conversation.counterpart.equals(jid)) {
- update_name_label();
- }
- });
- }
-
- protected override void update_message_label() {
- base.update_message_label();
- if (last_message != null && last_message.direction == Message.DIRECTION_SENT) {
- nick_label.visible = true;
- nick_label.label = _("Me") + ": ";
- } else {
- nick_label.label = "";
- }
- }
-
- private Widget generate_tooltip() {
- Builder builder = new Builder.from_resource("/im/dino/Dino/conversation_selector/chat_row_tooltip.ui");
- Box main_box = builder.get_object("main_box") as Box;
- Box inner_box = builder.get_object("inner_box") as Box;
- Label jid_label = builder.get_object("jid_label") as Label;
-
- jid_label.label = conversation.counterpart.to_string();
-
- Gee.List<Jid>? full_jids = stream_interactor.get_module(PresenceManager.IDENTITY).get_full_jids(conversation.counterpart, conversation.account);
- if (full_jids != null) {
- for (int i = 0; i < full_jids.size; i++) {
- inner_box.add(get_fulljid_box(full_jids[i]));
- }
- }
- return main_box;
- }
-}
-
-}
diff --git a/main/src/ui/conversation_selector/conversation_row.vala b/main/src/ui/conversation_selector/conversation_row.vala
index d79b840b..8157fde8 100644
--- a/main/src/ui/conversation_selector/conversation_row.vala
+++ b/main/src/ui/conversation_selector/conversation_row.vala
@@ -3,13 +3,14 @@ using Gdk;
using Gtk;
using Pango;
+using Dino;
using Dino.Entities;
using Xmpp;
namespace Dino.Ui.ConversationSelector {
[GtkTemplate (ui = "/im/dino/Dino/conversation_selector/conversation_row.ui")]
-public abstract class ConversationRow : ListBoxRow {
+public class ConversationRow : ListBoxRow {
public signal void closed();
@@ -27,7 +28,7 @@ public abstract class ConversationRow : ListBoxRow {
protected const int AVATAR_SIZE = 40;
- protected Message? last_message;
+ protected ContentItem? last_content_item;
protected bool read = true;
@@ -41,45 +42,122 @@ public abstract class ConversationRow : ListBoxRow {
this.conversation = conversation;
this.stream_interactor = stream_interactor;
+ switch (conversation.type_) {
+ case Conversation.Type.CHAT:
+ stream_interactor.get_module(RosterManager.IDENTITY).updated_roster_item.connect((account, jid, roster_item) => {
+ if (conversation.account.equals(account) && conversation.counterpart.equals(jid)) {
+ update_name_label();
+ }
+ });
+ break;
+ case Conversation.Type.GROUPCHAT:
+ closed.connect(() => {
+ stream_interactor.get_module(MucManager.IDENTITY).part(conversation.account, conversation.counterpart);
+ });
+ stream_interactor.get_module(MucManager.IDENTITY).room_name_set.connect((account, jid, room_name) => {
+ if (conversation != null && conversation.counterpart.equals_bare(jid) && conversation.account.equals(account)) {
+ update_name_label();
+ }
+ });
+ break;
+ case Conversation.Type.GROUPCHAT_PM:
+ break;
+ }
+
+ // Set tooltip
+ switch (conversation.type_) {
+ case Conversation.Type.CHAT:
+ has_tooltip = true;
+ query_tooltip.connect ((x, y, keyboard_tooltip, tooltip) => {
+ tooltip.set_custom(generate_tooltip());
+ return true;
+ });
+ break;
+ case Conversation.Type.GROUPCHAT:
+ has_tooltip = true;
+ set_tooltip_text(conversation.counterpart.bare_jid.to_string());
+ break;
+ case Conversation.Type.GROUPCHAT_PM:
+ break;
+ }
+
+ stream_interactor.get_module(ContentItemStore.IDENTITY).new_item.connect((item, c) => {
+ if (conversation.equals(c)) {
+ content_item_received(item);
+ }
+ });
+ last_content_item = stream_interactor.get_module(ContentItemStore.IDENTITY).get_latest(conversation);
+
x_button.clicked.connect(close_conversation);
image.set_jid(stream_interactor, conversation.counterpart, conversation.account);
conversation.notify["read-up-to"].connect(update_read);
update_name_label();
- message_received();
-
+ content_item_received();
}
public void update() {
update_time_label();
}
- public void message_received(Entities.Message? m = null) {
- last_message = stream_interactor.get_module(MessageStorage.IDENTITY).get_last_message(conversation) ?? m;
+ public void content_item_received(ContentItem? ci = null) {
+ last_content_item = stream_interactor.get_module(ContentItemStore.IDENTITY).get_latest(conversation) ?? ci;
update_message_label();
update_time_label();
update_read();
}
- protected void update_name_label(string? new_name = null) {
+ protected void update_name_label() {
name_label.label = Util.get_conversation_display_name(stream_interactor, conversation);
}
protected void update_time_label(DateTime? new_time = null) {
- if (last_message != null) {
+ if (last_content_item != null) {
time_label.visible = true;
- time_label.label = get_relative_time(last_message.time.to_local());
+ time_label.label = get_relative_time(last_content_item.display_time.to_local());
}
}
- protected virtual void update_message_label() {
- if (last_message != null) {
+ protected void update_message_label() {
+ if (last_content_item != null) {
+ switch (last_content_item.type_) {
+ case MessageItem.TYPE:
+ MessageItem message_item = last_content_item as MessageItem;
+ Message last_message = message_item.message;
+
+ if (conversation.type_ == Conversation.Type.GROUPCHAT) {
+ nick_label.label = Util.get_message_display_name(stream_interactor, last_message, conversation.account) + ": ";
+ } else {
+ nick_label.label = last_message.direction == Message.DIRECTION_SENT ? _("Me") + ": " : "";
+ }
+
+ message_label.label = Markup.escape_text((new Regex("\\s+")).replace_literal(last_message.body, -1, 0, " "));
+ break;
+ case FileItem.TYPE:
+ FileItem file_item = last_content_item as FileItem;
+ FileTransfer transfer = file_item.file_transfer;
+
+ if (conversation.type_ != Conversation.Type.GROUPCHAT) {
+ nick_label.label = transfer.direction == Message.DIRECTION_SENT ? _("Me") + ": " : "";
+ }
+
+ if (transfer.direction == Message.DIRECTION_SENT) {
+ message_label.label = "<i>" + (transfer.mime_type.has_prefix("image") ? _("Image sent") : _("File sent") ) + "</i>";
+ } else {
+ message_label.label = "<i>" +(transfer.mime_type.has_prefix("image") ? _("Image received") : _("File received") ) + "</i>";
+ }
+ break;
+ }
+ nick_label.visible = true;
message_label.visible = true;
- message_label.label = (new Regex("\\s+")).replace_literal(last_message.body, -1, 0, " ");
}
}
protected void update_read() {
+ MessageItem? message_item = last_content_item as MessageItem;
+ if (message_item == null) return;
+ Message last_message = message_item.message;
+
bool read_was = read;
read = last_message == null || (conversation.read_up_to != null && last_message.equals(conversation.read_up_to));
if (read == read_was) return;
@@ -143,6 +221,23 @@ public abstract class ConversationRow : ListBoxRow {
}
}
+ private Widget generate_tooltip() {
+ Builder builder = new Builder.from_resource("/im/dino/Dino/conversation_selector/chat_row_tooltip.ui");
+ Box main_box = builder.get_object("main_box") as Box;
+ Box inner_box = builder.get_object("inner_box") as Box;
+ Label jid_label = builder.get_object("jid_label") as Label;
+
+ jid_label.label = conversation.counterpart.to_string();
+
+ Gee.List<Jid>? full_jids = stream_interactor.get_module(PresenceManager.IDENTITY).get_full_jids(conversation.counterpart, conversation.account);
+ if (full_jids != null) {
+ for (int i = 0; i < full_jids.size; i++) {
+ inner_box.add(get_fulljid_box(full_jids[i]));
+ }
+ }
+ return main_box;
+ }
+
private static string get_relative_time(DateTime datetime) {
DateTime now = new DateTime.now_utc();
TimeSpan timespan = now.difference(datetime);
diff --git a/main/src/ui/conversation_selector/groupchat_pm_row.vala b/main/src/ui/conversation_selector/groupchat_pm_row.vala
deleted file mode 100644
index 795bdcb6..00000000
--- a/main/src/ui/conversation_selector/groupchat_pm_row.vala
+++ /dev/null
@@ -1,43 +0,0 @@
-using Gdk;
-using Gee;
-using Gtk;
-
-using Dino.Entities;
-
-namespace Dino.Ui.ConversationSelector {
-
-public class GroupchatPmRow : ConversationRow {
-
- public GroupchatPmRow(StreamInteractor stream_interactor, Conversation conversation) {
- base(stream_interactor, conversation);
- has_tooltip = true;
- query_tooltip.connect ((x, y, keyboard_tooltip, tooltip) => {
- tooltip.set_custom(generate_tooltip());
- return true;
- });
- }
-
- protected override void update_message_label() {
- base.update_message_label();
- if (last_message != null && last_message.direction == Message.DIRECTION_SENT) {
- nick_label.visible = true;
- nick_label.label = _("Me") + ": ";
- } else {
- nick_label.label = "";
- }
- }
-
- private Widget generate_tooltip() {
- Builder builder = new Builder.from_resource("/im/dino/Dino/conversation_selector/chat_row_tooltip.ui");
- Box main_box = builder.get_object("main_box") as Box;
- Box inner_box = builder.get_object("inner_box") as Box;
- Label jid_label = builder.get_object("jid_label") as Label;
- jid_label.label = conversation.counterpart.to_string();
- if (stream_interactor.get_module(MucManager.IDENTITY).is_joined(conversation.counterpart, conversation.account)) {
- inner_box.add(get_fulljid_box(conversation.counterpart));
- }
- return main_box;
- }
-}
-
-}
diff --git a/main/src/ui/conversation_selector/groupchat_row.vala b/main/src/ui/conversation_selector/groupchat_row.vala
deleted file mode 100644
index fdbfa40b..00000000
--- a/main/src/ui/conversation_selector/groupchat_row.vala
+++ /dev/null
@@ -1,26 +0,0 @@
-using Dino.Entities;
-
-namespace Dino.Ui.ConversationSelector {
-
-public class GroupchatRow : ConversationRow {
-
- public GroupchatRow(StreamInteractor stream_interactor, Conversation conversation) {
- base(stream_interactor, conversation);
- has_tooltip = true;
- set_tooltip_text(conversation.counterpart.bare_jid.to_string());
-
- closed.connect(() => {
- stream_interactor.get_module(MucManager.IDENTITY).part(conversation.account, conversation.counterpart);
- });
- }
-
- protected override void update_message_label() {
- base.update_message_label();
- if (last_message != null) {
- nick_label.visible = true;
- nick_label.label = Util.get_message_display_name(stream_interactor, last_message, conversation.account) + ": ";
- }
- }
-}
-
-}
diff --git a/main/src/ui/conversation_selector/list.vala b/main/src/ui/conversation_selector/list.vala
index e250c4cd..8d71419b 100644
--- a/main/src/ui/conversation_selector/list.vala
+++ b/main/src/ui/conversation_selector/list.vala
@@ -67,7 +67,6 @@ public class List : ListBox {
private void on_message_received(Entities.Message message, Conversation conversation) {
if (rows.has_key(conversation)) {
- rows[conversation].message_received(message);
invalidate_sort();
}
}
@@ -75,19 +74,13 @@ public class List : ListBox {
private void add_conversation(Conversation conversation) {
ConversationRow row;
if (!rows.has_key(conversation)) {
- if (conversation.type_ == Conversation.Type.GROUPCHAT) {
- row = new GroupchatRow(stream_interactor, conversation);
- } else if (conversation.type_ == Conversation.Type.GROUPCHAT_PM){
- row = new GroupchatPmRow(stream_interactor, conversation);
- } else {
- row = new ChatRow(stream_interactor, conversation);
- }
+ row = new ConversationRow(stream_interactor, conversation);
rows[conversation] = row;
add(row);
row.closed.connect(() => { select_next_conversation(conversation); });
row.main_revealer.set_reveal_child(true);
}
- //invalidate_sort();
+ invalidate_sort();
}
private void select_next_conversation(Conversation conversation) {
diff --git a/main/src/ui/conversation_selector/view.vala b/main/src/ui/conversation_selector/view.vala
index b6b02848..d06ad133 100644
--- a/main/src/ui/conversation_selector/view.vala
+++ b/main/src/ui/conversation_selector/view.vala
@@ -10,43 +10,14 @@ namespace Dino.Ui.ConversationSelector {
public class View : Box {
public List conversation_list;
- [GtkChild] public SearchEntry search_entry;
- [GtkChild] public Revealer search_revealer;
[GtkChild] private ScrolledWindow scrolled;
- public View(StreamInteractor stream_interactor) {
+ public View init(StreamInteractor stream_interactor) {
conversation_list = new List(stream_interactor) { visible=true };
scrolled.add(conversation_list);
- search_entry.key_release_event.connect(search_key_release_event);
- search_entry.search_changed.connect(search_changed);
+ return this;
}
- public void conversation_selected(Conversation? conversation) {
- search_entry.set_text("");
- }
-
- private void refilter() {
- string[]? values = null;
- string str = search_entry.get_text ();
- if (str != "") values = str.split(" ");
- conversation_list.set_filter_values(values);
- }
-
- private void search_changed(Editable editable) {
- refilter();
- }
-
- private bool search_key_release_event(EventKey event) {
- conversation_list.select_row(conversation_list.get_row_at_y(0));
- if (event.keyval == Key.Down) {
- ConversationRow? row = (ConversationRow) conversation_list.get_row_at_index(0);
- if (row != null) {
- conversation_list.select_row(row);
- row.grab_focus();
- }
- }
- return false;
- }
}
}
diff --git a/main/src/ui/conversation_summary/chat_state_populator.vala b/main/src/ui/conversation_summary/chat_state_populator.vala
index 1ea52a6d..d07ab743 100644
--- a/main/src/ui/conversation_summary/chat_state_populator.vala
+++ b/main/src/ui/conversation_summary/chat_state_populator.vala
@@ -6,7 +6,7 @@ using Xmpp;
namespace Dino.Ui.ConversationSummary {
-class ChatStatePopulator : Plugins.ConversationItemPopulator, Object {
+class ChatStatePopulator : Plugins.ConversationItemPopulator, Plugins.ConversationAdditionPopulator, Object {
public string id { get { return "chat_state"; } }
@@ -43,8 +43,6 @@ class ChatStatePopulator : Plugins.ConversationItemPopulator, Object {
public void populate_timespan(Conversation conversation, DateTime from, DateTime to) { }
- public void populate_between_widgets(Conversation conversation, DateTime from, DateTime to) { }
-
private void update_chat_state(Account account, Jid jid) {
HashMap<Jid, string>? states = stream_interactor.get_module(CounterpartInteractionManager.IDENTITY).get_chat_states(current_conversation);
diff --git a/main/src/ui/conversation_summary/content_item_widget_factory.vala b/main/src/ui/conversation_summary/content_item_widget_factory.vala
new file mode 100644
index 00000000..26b66664
--- /dev/null
+++ b/main/src/ui/conversation_summary/content_item_widget_factory.vala
@@ -0,0 +1,227 @@
+using Gee;
+using Gdk;
+using Gtk;
+using Xmpp;
+
+using Dino.Entities;
+
+namespace Dino.Ui.ConversationSummary {
+
+public class ContentItemWidgetFactory : Object {
+
+ private StreamInteractor stream_interactor;
+ private HashMap<string, WidgetGenerator> generators = new HashMap<string, WidgetGenerator>();
+
+ public ContentItemWidgetFactory(StreamInteractor stream_interactor) {
+ this.stream_interactor = stream_interactor;
+
+ generators[MessageItem.TYPE] = new MessageItemWidgetGenerator(stream_interactor);
+ generators[FileItem.TYPE] = new FileItemWidgetGenerator(stream_interactor);
+ }
+
+ public Widget? get_widget(ContentItem item) {
+ WidgetGenerator? generator = generators[item.type_];
+ if (generator != null) {
+ return (Widget?) generator.get_widget(item);
+ }
+ return null;
+ }
+
+ public void register_widget_generator(WidgetGenerator generator) {
+ generators[generator.handles_type] = generator;
+ }
+}
+
+public interface WidgetGenerator : Object {
+ public abstract string handles_type { get; set; }
+ public abstract Object get_widget(ContentItem item);
+}
+
+public class MessageItemWidgetGenerator : WidgetGenerator, Object {
+
+ public string handles_type { get; set; default=FileItem.TYPE; }
+
+ private StreamInteractor stream_interactor;
+
+ public MessageItemWidgetGenerator(StreamInteractor stream_interactor) {
+ this.stream_interactor = stream_interactor;
+ }
+
+ public Object get_widget(ContentItem item) {
+ MessageItem message_item = item as MessageItem;
+ Conversation conversation = message_item.conversation;
+ Message message = message_item.message;
+
+ Label label = new Label("") { use_markup=true, xalign=0, selectable=true, wrap=true, wrap_mode=Pango.WrapMode.WORD_CHAR, vexpand=true, visible=true };
+ string markup_text = message.body;
+ if (markup_text.length > 10000) {
+ markup_text = markup_text.substring(0, 10000) + " [" + _("Message too long") + "]";
+ }
+ if (message_item.message.body.has_prefix("/me")) {
+ markup_text = markup_text.substring(3);
+ }
+
+ if (conversation.type_ == Conversation.Type.GROUPCHAT) {
+ markup_text = Util.parse_add_markup(markup_text, conversation.nickname, true, true);
+ } else {
+ markup_text = Util.parse_add_markup(markup_text, null, true, true);
+ }
+
+ if (message_item.message.body.has_prefix("/me")) {
+ string display_name = Util.get_message_display_name(stream_interactor, message, conversation.account);
+ update_me_style(stream_interactor, message.real_jid ?? message.from, display_name, conversation.account, label, markup_text);
+ label.realize.connect(() => update_me_style(stream_interactor, message.real_jid ?? message.from, display_name, conversation.account, label, markup_text));
+ label.style_updated.connect(() => update_me_style(stream_interactor, message.real_jid ?? message.from, display_name, conversation.account, label, markup_text));
+ }
+
+ label.label = markup_text;
+ return label;
+ }
+
+ public static void update_me_style(StreamInteractor stream_interactor, Jid jid, string display_name, Account account, Label label, string action_text) {
+ string color = Util.get_name_hex_color(stream_interactor, account, jid, Util.is_dark_theme(label));
+ label.label = @"<span color=\"#$(color)\">$(Markup.escape_text(display_name))</span>" + action_text;
+ }
+}
+
+public class FileItemWidgetGenerator : WidgetGenerator, Object {
+
+ public StreamInteractor stream_interactor;
+ public string handles_type { get; set; default=FileItem.TYPE; }
+
+ private const int MAX_HEIGHT = 300;
+ private const int MAX_WIDTH = 600;
+
+ public FileItemWidgetGenerator(StreamInteractor stream_interactor) {
+ this.stream_interactor = stream_interactor;
+ }
+
+ public Object get_widget(ContentItem item) {
+ FileItem file_item = item as FileItem;
+ FileTransfer transfer = file_item.file_transfer;
+ if (transfer.mime_type != null && transfer.mime_type.has_prefix("image")) {
+ return getImageWidget(transfer);
+ } else {
+ return getDefaultWidget(transfer);
+ }
+ }
+
+ private Widget getImageWidget(FileTransfer file_transfer) {
+ Image image = new Image() { halign=Align.START, visible = true };
+ Gdk.Pixbuf pixbuf;
+ try {
+ pixbuf = new Gdk.Pixbuf.from_file(file_transfer.get_file().get_path());
+ } catch (Error error) {
+ return null;
+ }
+
+ int max_scaled_height = MAX_HEIGHT * image.scale_factor;
+ if (pixbuf.height > max_scaled_height) {
+ pixbuf = pixbuf.scale_simple((int) ((double) max_scaled_height / pixbuf.height * pixbuf.width), max_scaled_height, Gdk.InterpType.BILINEAR);
+ }
+ int max_scaled_width = MAX_WIDTH * image.scale_factor;
+ if (pixbuf.width > max_scaled_width) {
+ pixbuf = pixbuf.scale_simple(max_scaled_width, (int) ((double) max_scaled_width / pixbuf.width * pixbuf.height), Gdk.InterpType.BILINEAR);
+ }
+ pixbuf = crop_corners(pixbuf, 3 * image.get_scale_factor());
+ Util.image_set_from_scaled_pixbuf(image, pixbuf);
+ Util.force_css(image, "* { box-shadow: 0px 0px 2px 0px rgba(0,0,0,0.1); margin: 2px; border-radius: 3px; }");
+
+ Builder builder = new Builder.from_resource("/im/dino/Dino/conversation_summary/image_toolbar.ui");
+ Widget toolbar = builder.get_object("main") as Widget;
+ Util.force_background(toolbar, "rgba(0, 0, 0, 0.5)");
+ Util.force_css(toolbar, "* { padding: 3px; border-radius: 3px; }");
+
+ Label url_label = builder.get_object("url_label") as Label;
+ Util.force_color(url_label, "#eee");
+
+ if (file_transfer.file_name != null && file_transfer.file_name != "") {
+ string caption = file_transfer.file_name;
+ url_label.label = caption;
+ } else {
+ url_label.visible = false;
+ }
+
+ Image open_image = builder.get_object("open_image") as Image;
+ Util.force_css(open_image, "*:not(:hover) { color: #eee; }");
+ Button open_button = builder.get_object("open_button") as Button;
+ Util.force_css(open_button, "*:hover { background-color: rgba(255,255,255,0.3); border-color: transparent; }");
+ open_button.clicked.connect(() => {
+ try{
+ AppInfo.launch_default_for_uri(file_transfer.get_file().get_uri(), null);
+ } catch (Error err) {
+ print("Tried to open file://" + file_transfer.get_file().get_path() + " " + err.message + "\n");
+ }
+ });
+
+ Revealer toolbar_revealer = new Revealer() { transition_type=RevealerTransitionType.CROSSFADE, transition_duration=400, visible=true };
+ toolbar_revealer.add(toolbar);
+
+ Grid grid = new Grid() { visible=true };
+ grid.attach(toolbar_revealer, 0, 0, 1, 1);
+ grid.attach(image, 0, 0, 1, 1);
+
+ EventBox event_box = new EventBox() { halign=Align.START, visible=true };
+ event_box.add(grid);
+ event_box.enter_notify_event.connect(() => { toolbar_revealer.reveal_child = true; return false; });
+ event_box.leave_notify_event.connect(() => { toolbar_revealer.reveal_child = false; return false; });
+
+ return event_box;
+ }
+
+ private static Gdk.Pixbuf crop_corners(Gdk.Pixbuf pixbuf, double radius = 3) {
+ Cairo.Context ctx = new Cairo.Context(new Cairo.ImageSurface(Cairo.Format.ARGB32, pixbuf.width, pixbuf.height));
+ Gdk.cairo_set_source_pixbuf(ctx, pixbuf, 0, 0);
+ double degrees = Math.PI / 180.0;
+ ctx.new_sub_path();
+ ctx.arc(pixbuf.width - radius, radius, radius, -90 * degrees, 0 * degrees);
+ ctx.arc(pixbuf.width - radius, pixbuf.height - radius, radius, 0 * degrees, 90 * degrees);
+ ctx.arc(radius, pixbuf.height - radius, radius, 90 * degrees, 180 * degrees);
+ ctx.arc(radius, radius, radius, 180 * degrees, 270 * degrees);
+ ctx.close_path();
+ ctx.clip();
+ ctx.paint();
+ return Gdk.pixbuf_get_from_surface(ctx.get_target(), 0, 0, pixbuf.width, pixbuf.height);
+ }
+
+ private Widget getDefaultWidget(FileTransfer file_transfer) {
+ Box main_box = new Box(Orientation.HORIZONTAL, 4) { halign=Align.START, visible=true };
+ string? icon_name = ContentType.get_generic_icon_name(file_transfer.mime_type);
+ Image content_type_image = new Image.from_icon_name(icon_name, IconSize.DND) { visible=true };
+ main_box.add(content_type_image);
+
+ Box right_box = new Box(Orientation.VERTICAL, 0) { visible=true };
+ Label name_label = new Label(file_transfer.file_name) { xalign=0, yalign=0, visible=true};
+ right_box.add(name_label);
+ Label mime_label = new Label("<span size='small'>" + _("File") + ": " + file_transfer.mime_type + "</span>") { use_markup=true, xalign=0, yalign=1, visible=true};
+ mime_label.get_style_context().add_class("dim-label");
+ right_box.add(mime_label);
+ main_box.add(right_box);
+
+ EventBox event_box = new EventBox() { halign=Align.START, visible=true };
+ event_box.add(main_box);
+
+ event_box.enter_notify_event.connect((event) => {
+ event.get_window().set_cursor(new Cursor.for_display(Gdk.Display.get_default(), CursorType.HAND2));
+ return false;
+ });
+ event_box.leave_notify_event.connect((event) => {
+ event.get_window().set_cursor(new Cursor.for_display(Gdk.Display.get_default(), CursorType.XTERM));
+ return false;
+ });
+ event_box.button_release_event.connect((event_button) => {
+ if (event_button.button == 1) {
+ try{
+ AppInfo.launch_default_for_uri(file_transfer.get_file().get_uri(), null);
+ } catch (Error err) {
+ print("Tried to open " + file_transfer.get_file().get_path());
+ }
+ }
+ return false;
+ });
+
+ return event_box;
+ }
+}
+
+}
diff --git a/main/src/ui/conversation_summary/content_populator.vala b/main/src/ui/conversation_summary/content_populator.vala
new file mode 100644
index 00000000..754446d3
--- /dev/null
+++ b/main/src/ui/conversation_summary/content_populator.vala
@@ -0,0 +1,110 @@
+using Gee;
+using Gtk;
+
+using Xmpp;
+using Dino.Entities;
+
+namespace Dino.Ui.ConversationSummary {
+
+public class ContentProvider : ContentItemCollection, Object {
+
+ private StreamInteractor stream_interactor;
+ private ContentItemWidgetFactory widget_factory;
+ private Conversation? current_conversation;
+ private Plugins.ConversationItemCollection? item_collection;
+
+ public ContentProvider(StreamInteractor stream_interactor) {
+ this.stream_interactor = stream_interactor;
+ this.widget_factory = new ContentItemWidgetFactory(stream_interactor);
+ }
+
+ public void init(Plugins.ConversationItemCollection item_collection, Conversation conversation, Plugins.WidgetType type) {
+ if (current_conversation != null) {
+ stream_interactor.get_module(ContentItemStore.IDENTITY).uninit(current_conversation, this);
+ }
+ current_conversation = conversation;
+ this.item_collection = item_collection;
+ stream_interactor.get_module(ContentItemStore.IDENTITY).init(conversation, this);
+ }
+
+ public void insert_item(ContentItem item) {
+ item_collection.insert_item(new ContentMetaItem(item, widget_factory));
+ }
+
+ public void remove_item(ContentItem item) { }
+
+
+ public Gee.List<ContentMetaItem> populate_latest(Conversation conversation, int n) {
+ Gee.List<ContentItem> items = stream_interactor.get_module(ContentItemStore.IDENTITY).get_n_latest(conversation, n);
+ Gee.List<ContentMetaItem> ret = new ArrayList<ContentMetaItem>();
+ foreach (ContentItem item in items) {
+ ret.add(new ContentMetaItem(item, widget_factory));
+ }
+ return ret;
+ }
+
+ public Gee.List<ContentMetaItem> populate_before(Conversation conversation, ContentItem before_item, int n) {
+ Gee.List<ContentMetaItem> ret = new ArrayList<ContentMetaItem>();
+ Gee.List<ContentItem> items = stream_interactor.get_module(ContentItemStore.IDENTITY).get_before(conversation, before_item, n);
+ foreach (ContentItem item in items) {
+ ret.add(new ContentMetaItem(item, widget_factory));
+ }
+ return ret;
+ }
+
+ public Gee.List<ContentMetaItem> populate_after(Conversation conversation, ContentItem after_item, int n) {
+ Gee.List<ContentMetaItem> ret = new ArrayList<ContentMetaItem>();
+ Gee.List<ContentItem> items = stream_interactor.get_module(ContentItemStore.IDENTITY).get_after(conversation, after_item, n);
+ foreach (ContentItem item in items) {
+ ret.add(new ContentMetaItem(item, widget_factory));
+ }
+ return ret;
+ }
+
+ public ContentMetaItem get_content_meta_item(ContentItem content_item) {
+ return new ContentMetaItem(content_item, widget_factory);
+ }
+}
+
+public class ContentMetaItem : Plugins.MetaConversationItem {
+ public override Jid? jid { get; set; }
+ public override DateTime? sort_time { get; set; }
+ public override DateTime? display_time { get; set; }
+ public override Encryption? encryption { get; set; }
+
+ public ContentItem content_item;
+ private ContentItemWidgetFactory widget_factory;
+
+ public ContentMetaItem(ContentItem content_item, ContentItemWidgetFactory widget_factory) {
+ this.jid = content_item.jid;
+ this.sort_time = content_item.sort_time;
+ this.seccondary_sort_indicator = content_item.id;
+ this.display_time = content_item.display_time;
+ this.encryption = content_item.encryption;
+ this.mark = content_item.mark;
+
+ WeakRef weak_item = WeakRef(content_item);
+ content_item.notify["mark"].connect(() => {
+ ContentItem? ci = weak_item.get() as ContentItem;
+ if (ci == null) return;
+ this.mark = ci.mark;
+ });
+
+ this.can_merge = true;
+ this.requires_avatar = true;
+ this.requires_header = true;
+
+ this.content_item = content_item;
+ this.widget_factory = widget_factory;
+ }
+
+ public override bool can_merge { get; set; default=true; }
+ public override bool requires_avatar { get; set; default=true; }
+ public override bool requires_header { get; set; default=true; }
+
+ public override Object? get_widget(Plugins.WidgetType type) {
+ return widget_factory.get_widget(content_item);
+ }
+}
+
+}
diff --git a/main/src/ui/conversation_summary/conversation_item_skeleton.vala b/main/src/ui/conversation_summary/conversation_item_skeleton.vala
index a8da93ef..a4e45f7a 100644
--- a/main/src/ui/conversation_summary/conversation_item_skeleton.vala
+++ b/main/src/ui/conversation_summary/conversation_item_skeleton.vala
@@ -176,7 +176,7 @@ public class DefaultSkeletonHeader : Box {
return datetime.format(format);
}
- public virtual string get_relative_time(DateTime datetime) {
+ public static string get_relative_time(DateTime datetime) {
DateTime now = new DateTime.now_local();
TimeSpan timespan = now.difference(datetime);
if (timespan > 365 * TimeSpan.DAY) {
diff --git a/main/src/ui/conversation_summary/conversation_view.vala b/main/src/ui/conversation_summary/conversation_view.vala
index b4a34f3b..83da81aa 100644
--- a/main/src/ui/conversation_summary/conversation_view.vala
+++ b/main/src/ui/conversation_summary/conversation_view.vala
@@ -11,19 +11,19 @@ public class ConversationView : Box, Plugins.ConversationItemCollection, Plugins
public Conversation? conversation { get; private set; }
- [GtkChild] private ScrolledWindow scrolled;
+ [GtkChild] public ScrolledWindow scrolled;
[GtkChild] private Revealer notification_revealer;
[GtkChild] private Box notifications;
[GtkChild] private Box main;
[GtkChild] private Stack stack;
private StreamInteractor stream_interactor;
- private Gee.TreeSet<Plugins.MetaConversationItem> meta_items = new TreeSet<Plugins.MetaConversationItem>(sort_meta_items);
- private Gee.Map<Plugins.MetaConversationItem, Gee.List<Plugins.MetaConversationItem>> meta_after_items = new Gee.HashMap<Plugins.MetaConversationItem, Gee.List<Plugins.MetaConversationItem>>();
+ private Gee.TreeSet<Plugins.MetaConversationItem> content_items = new Gee.TreeSet<Plugins.MetaConversationItem>(compare_meta_items);
+ private Gee.TreeSet<Plugins.MetaConversationItem> meta_items = new TreeSet<Plugins.MetaConversationItem>(compare_meta_items);
private Gee.HashMap<Plugins.MetaConversationItem, ConversationItemSkeleton> item_item_skeletons = new Gee.HashMap<Plugins.MetaConversationItem, ConversationItemSkeleton>();
private Gee.HashMap<Plugins.MetaConversationItem, Widget> widgets = new Gee.HashMap<Plugins.MetaConversationItem, Widget>();
private Gee.List<ConversationItemSkeleton> item_skeletons = new Gee.ArrayList<ConversationItemSkeleton>();
- private MessagePopulator message_item_populator;
+ private ContentProvider content_populator;
private SubscriptionNotitication subscription_notification;
private double? was_value;
@@ -33,24 +33,25 @@ public class ConversationView : Box, Plugins.ConversationItemCollection, Plugins
private Mutex reloading_mutex = Mutex();
private bool animate = false;
private bool firstLoad = true;
+ private bool at_current_content = true;
+ private bool reload_messages = true;
- public ConversationView(StreamInteractor stream_interactor) {
+ public ConversationView init(StreamInteractor stream_interactor) {
this.stream_interactor = stream_interactor;
scrolled.vadjustment.notify["upper"].connect_after(on_upper_notify);
scrolled.vadjustment.notify["value"].connect(on_value_notify);
- message_item_populator = new MessagePopulator(stream_interactor);
+ content_populator = new ContentProvider(stream_interactor);
subscription_notification = new SubscriptionNotitication(stream_interactor);
- insert_item.connect(on_insert_item);
- remove_item.connect(on_remove_item);
+ insert_item.connect(filter_insert_item);
+ remove_item.connect(do_remove_item);
add_meta_notification.connect(on_add_meta_notification);
remove_meta_notification.connect(on_remove_meta_notification);
Application app = GLib.Application.get_default() as Application;
- app.plugin_registry.register_conversation_item_populator(new ChatStatePopulator(stream_interactor));
- app.plugin_registry.register_conversation_item_populator(new FilePopulator(stream_interactor));
- app.plugin_registry.register_conversation_item_populator(new DateSeparatorPopulator(stream_interactor));
+ app.plugin_registry.register_conversation_addition_populator(new ChatStatePopulator(stream_interactor));
+ app.plugin_registry.register_conversation_addition_populator(new DateSeparatorPopulator(stream_interactor));
Timeout.add_seconds(60, () => {
foreach (ConversationItemSkeleton item_skeleton in item_skeletons) {
@@ -59,68 +60,144 @@ public class ConversationView : Box, Plugins.ConversationItemCollection, Plugins
return true;
});
- Util.force_base_background(this);
+ return this;
}
- // Workaround GTK TextView issues: Delay first load of contents
public void initialize_for_conversation(Conversation? conversation) {
+ // Workaround for rendering issues
if (firstLoad) {
- int timeout = firstLoad ? 1000 : 0;
- Timeout.add(timeout, () => {
- initialize_for_conversation_(conversation);
+ main.visible = false;
+ Idle.add(() => {
+ main.visible=true;
return false;
});
firstLoad = false;
- } else {
- initialize_for_conversation_(conversation);
}
+ stack.set_visible_child_name("void");
+ initialize_for_conversation_(conversation);
+ display_latest();
+ stack.set_visible_child_name("main");
+ }
+ public void initialize_around_message(Conversation conversation, ContentItem content_item) {
+ stack.set_visible_child_name("void");
+ clear();
+ initialize_for_conversation_(conversation);
+ Gee.List<ContentMetaItem> before_items = content_populator.populate_before(conversation, content_item, 40);
+ foreach (ContentMetaItem item in before_items) {
+ do_insert_item(item);
+ }
+ ContentMetaItem meta_item = content_populator.get_content_meta_item(content_item);
+ meta_item.can_merge = false;
+ Widget w = insert_new(meta_item);
+ content_items.add(meta_item);
+ meta_items.add(meta_item);
+
+ Gee.List<ContentMetaItem> after_items = content_populator.populate_after(conversation, content_item, 40);
+ foreach (ContentMetaItem item in after_items) {
+ do_insert_item(item);
+ }
+ if (after_items.size == 40) {
+ at_current_content = false;
+ }
+ {
+ int h = 0, i = 0;
+ main.@foreach((widget) => {
+ if (i >= before_items.size) return;
+ ConversationItemSkeleton? sk = widget as ConversationItemSkeleton;
+ i += sk != null ? sk.items.size : 1;
+ int minimum_height, natural_height;
+ widget.get_preferred_height_for_width(main.get_allocated_width() - 2 * main.margin, out minimum_height, out natural_height);
+ h += minimum_height + 15;
+ });
+ }
+
+ reload_messages = false;
+ Timeout.add(700, () => {
+ int h = 0, i = 0;
+ main.@foreach((widget) => {
+ if (i >= before_items.size) return;
+ ConversationItemSkeleton? sk = widget as ConversationItemSkeleton;
+ i += sk != null ? sk.items.size : 1;
+ h += widget.get_allocated_height() + 15;
+ });
+ scrolled.vadjustment.value = h - scrolled.vadjustment.page_size * 1/3;
+ w.get_style_context().add_class("highlight-once");
+ reload_messages = true;
+ stack.set_visible_child_name("main");
+ return false;
+ });
}
private void initialize_for_conversation_(Conversation? conversation) {
+ // Deinitialize old conversation
Dino.Application app = Dino.Application.get_default();
if (this.conversation != null) {
- foreach (Plugins.ConversationItemPopulator populator in app.plugin_registry.conversation_item_populators) {
+ foreach (Plugins.ConversationItemPopulator populator in app.plugin_registry.conversation_addition_populators) {
populator.close(conversation);
}
foreach (Plugins.NotificationPopulator populator in app.plugin_registry.notification_populators) {
populator.close(conversation);
}
}
+
+ // Clear data structures
+ clear_notifications();
this.conversation = conversation;
- stack.set_visible_child_name("void");
- clear();
- was_upper = null;
- was_page_size = null;
+
+
+ // Init for new conversation
+ foreach (Plugins.ConversationItemPopulator populator in app.plugin_registry.conversation_addition_populators) {
+ populator.init(conversation, this, Plugins.WidgetType.GTK);
+ }
+ content_populator.init(this, conversation, Plugins.WidgetType.GTK);
+ subscription_notification.init(conversation, this);
+
animate = false;
Timeout.add(20, () => { animate = true; return false; });
+ }
- foreach (Plugins.ConversationItemPopulator populator in app.plugin_registry.conversation_item_populators) {
- populator.init(conversation, this, Plugins.WidgetType.GTK);
+ private void display_latest() {
+ clear();
+
+ Gee.List<ContentMetaItem> items = content_populator.populate_latest(conversation, 40);
+ foreach (ContentMetaItem item in items) {
+ do_insert_item(item);
}
+ Application app = GLib.Application.get_default() as Application;
foreach (Plugins.NotificationPopulator populator in app.plugin_registry.notification_populators) {
populator.init(conversation, this, Plugins.WidgetType.GTK);
}
- message_item_populator.init(conversation, this);
- message_item_populator.populate_latest(conversation, 40);
Idle.add(() => { on_value_notify(); return false; });
+ }
- subscription_notification.init(conversation, this);
-
- stack.set_visible_child_name("main");
+ public void filter_insert_item(Plugins.MetaConversationItem item) {
+ if (meta_items.size > 0) {
+ bool after_last = meta_items.last().sort_time.compare(item.sort_time) < 0;
+ bool within_range = meta_items.last().sort_time.compare(item.sort_time) > 0 && meta_items.first().sort_time.compare(item.sort_time) < 0;
+ bool accept = within_range || (at_current_content && after_last);
+ if (!accept) {
+ return;
+ }
+ }
+ do_insert_item(item);
}
- public void on_insert_item(Plugins.MetaConversationItem item) {
+ public void do_insert_item(Plugins.MetaConversationItem item) {
lock (meta_items) {
if (!item.can_merge || !merge_back(item)) {
insert_new(item);
}
}
+ if (item as ContentMetaItem != null) {
+ content_items.add(item);
+ }
+ meta_items.add(item);
}
- public void on_remove_item(Plugins.MetaConversationItem item) {
- lock (meta_items) {
- ConversationItemSkeleton? skeleton = item_item_skeletons[item];
+ private void do_remove_item(Plugins.MetaConversationItem item) {
+ ConversationItemSkeleton? skeleton = item_item_skeletons[item];
+ if (skeleton != null) {
if (skeleton.items.size > 1) {
skeleton.remove_meta_item(item);
} else {
@@ -130,6 +207,7 @@ public class ConversationView : Box, Plugins.ConversationItemCollection, Plugins
item_skeletons.remove(skeleton);
item_item_skeletons.unset(item);
}
+ content_items.remove(item);
meta_items.remove(item);
}
}
@@ -173,10 +251,9 @@ public class ConversationView : Box, Plugins.ConversationItemCollection, Plugins
lower_start_item.encryption == item.encryption &&
(item.mark == Message.Marked.WONTSEND) == (lower_start_item.mark == Message.Marked.WONTSEND)) {
lower_skeleton.add_meta_item(item);
- force_alloc_width(lower_skeleton, main.get_allocated_width());
+ widgets[item] = widgets[lower_start_item];
item_item_skeletons[item] = lower_skeleton;
- meta_items.add(item);
return true;
}
@@ -184,7 +261,7 @@ public class ConversationView : Box, Plugins.ConversationItemCollection, Plugins
return false;
}
- private void insert_new(Plugins.MetaConversationItem item) {
+ private Widget insert_new(Plugins.MetaConversationItem item) {
Plugins.MetaConversationItem? lower_item = meta_items.lower(item);
// Does another skeleton need to be split?
@@ -203,7 +280,6 @@ public class ConversationView : Box, Plugins.ConversationItemCollection, Plugins
item_item_skeletons[item] = item_skeleton;
int index = lower_item != null ? item_skeletons.index_of(item_item_skeletons[lower_item]) + 1 : 0;
item_skeletons.insert(index, item_skeleton);
- meta_items.add(item);
// Insert widget
Widget insert = item_skeleton;
@@ -217,22 +293,22 @@ public class ConversationView : Box, Plugins.ConversationItemCollection, Plugins
main.add(insert);
}
widgets[item] = insert;
- force_alloc_width(insert, main.get_allocated_width());
main.reorder_child(insert, index);
// If an item from the past was added, add everything between that item and the (post-)first present item
if (index == 0) {
Dino.Application app = Dino.Application.get_default();
if (item_skeletons.size == 1) {
- foreach (Plugins.ConversationItemPopulator populator in app.plugin_registry.conversation_item_populators) {
+ foreach (Plugins.ConversationAdditionPopulator populator in app.plugin_registry.conversation_addition_populators) {
populator.populate_timespan(conversation, item.sort_time, new DateTime.now_utc());
}
} else {
- foreach (Plugins.ConversationItemPopulator populator in app.plugin_registry.conversation_item_populators) {
+ foreach (Plugins.ConversationAdditionPopulator populator in app.plugin_registry.conversation_addition_populators) {
populator.populate_timespan(conversation, item.sort_time, meta_items.higher(item).sort_time);
}
}
}
+ return insert;
}
private void split_at_time(ConversationItemSkeleton split_skeleton, DateTime time) {
@@ -241,12 +317,12 @@ public class ConversationView : Box, Plugins.ConversationItemCollection, Plugins
while(i < split_skeleton.items.size) {
Plugins.MetaConversationItem meta_item = split_skeleton.items[i];
if (time.compare(meta_item.display_time) < 0) {
- remove_item(meta_item);
+ do_remove_item(meta_item);
if (!already_divided) {
insert_new(meta_item);
already_divided = true;
} else {
- insert_item(meta_item);
+ do_insert_item(meta_item);
}
}
i++;
@@ -254,55 +330,80 @@ public class ConversationView : Box, Plugins.ConversationItemCollection, Plugins
}
private void on_upper_notify() {
- if (was_upper == null || scrolled.vadjustment.value > was_upper - was_page_size - 1 ||
- scrolled.vadjustment.value > was_upper - was_page_size - 1) { // scrolled down or content smaller than page size
- scrolled.vadjustment.value = scrolled.vadjustment.upper - scrolled.vadjustment.page_size; // scroll down
+ if (was_upper == null || scrolled.vadjustment.value > was_upper - was_page_size - 1) { // scrolled down or content smaller than page size
+ if (at_current_content) {
+ scrolled.vadjustment.value = scrolled.vadjustment.upper - scrolled.vadjustment.page_size; // scroll down
+ }
} else if (scrolled.vadjustment.value < scrolled.vadjustment.upper - scrolled.vadjustment.page_size - 1) {
scrolled.vadjustment.value = scrolled.vadjustment.upper - was_upper + scrolled.vadjustment.value; // stay at same content
}
was_upper = scrolled.vadjustment.upper;
was_page_size = scrolled.vadjustment.page_size;
+ was_value = scrolled.vadjustment.value;
reloading_mutex.trylock();
reloading_mutex.unlock();
}
private void on_value_notify() {
- if (scrolled.vadjustment.value < 200) {
+ if (scrolled.vadjustment.value < 400) {
load_earlier_messages();
+ } else if (scrolled.vadjustment.upper - (scrolled.vadjustment.value + scrolled.vadjustment.page_size) < 400) {
+ load_later_messages();
}
}
private void load_earlier_messages() {
was_value = scrolled.vadjustment.value;
if (!reloading_mutex.trylock()) return;
- if (meta_items.size > 0) message_item_populator.populate_before(conversation, meta_items.first(), 20);
+ if (meta_items.size > 0) {
+ Gee.List<ContentMetaItem> items = content_populator.populate_before(conversation, (content_items.first() as ContentMetaItem).content_item, 20);
+ foreach (ContentMetaItem item in items) {
+ do_insert_item(item);
+ }
+ } else {
+ reloading_mutex.unlock();
+ }
+ }
+
+ private void load_later_messages() {
+ if (!reloading_mutex.trylock()) return;
+ if (meta_items.size > 0 && !at_current_content) {
+ Gee.List<ContentMetaItem> items = content_populator.populate_after(conversation, (content_items.last() as ContentMetaItem).content_item, 20);
+ if (items.size == 0) {
+ at_current_content = true;
+ }
+ foreach (ContentMetaItem item in items) {
+ do_insert_item(item);
+ }
+ } else {
+ reloading_mutex.unlock();
+ }
}
- private static int sort_meta_items(Plugins.MetaConversationItem a, Plugins.MetaConversationItem b) {
+ private static int compare_meta_items(Plugins.MetaConversationItem a, Plugins.MetaConversationItem b) {
int res = a.sort_time.compare(b.sort_time);
if (res == 0) {
- if (a.seccondary_sort_indicator < b.seccondary_sort_indicator) res = -1;
- else if (a.seccondary_sort_indicator > b.seccondary_sort_indicator) res = 1;
+ if (a.seccondary_sort_indicator < b.seccondary_sort_indicator) {
+ res = -1;
+ } else if (a.seccondary_sort_indicator > b.seccondary_sort_indicator) {
+ res = 1;
+ }
}
return res;
}
- // Workaround GTK TextView issues
- private void force_alloc_width(Widget widget, int width) {
- Allocation alloc = Allocation();
- widget.get_preferred_width(out alloc.width, null);
- widget.get_preferred_height(out alloc.height, null);
- alloc.width = width;
- widget.size_allocate(alloc);
- }
-
private void clear() {
+ was_upper = null;
+ was_page_size = null;
+ content_items.clear();
meta_items.clear();
- meta_after_items.clear();
item_skeletons.clear();
item_item_skeletons.clear();
widgets.clear();
main.@foreach((widget) => { widget.destroy(); });
+ }
+
+ private void clear_notifications() {
notifications.@foreach((widget) => { widget.destroy(); });
notification_revealer.transition_duration = 0;
notification_revealer.set_reveal_child(false);
diff --git a/main/src/ui/conversation_summary/date_separator_populator.vala b/main/src/ui/conversation_summary/date_separator_populator.vala
index 34005ab6..6a1ba782 100644
--- a/main/src/ui/conversation_summary/date_separator_populator.vala
+++ b/main/src/ui/conversation_summary/date_separator_populator.vala
@@ -6,7 +6,7 @@ using Xmpp;
namespace Dino.Ui.ConversationSummary {
-class DateSeparatorPopulator : Plugins.ConversationItemPopulator, Object {
+class DateSeparatorPopulator : Plugins.ConversationItemPopulator, Plugins.ConversationAdditionPopulator, Object {
public string id { get { return "date_separator"; } }
@@ -35,8 +35,6 @@ class DateSeparatorPopulator : Plugins.ConversationItemPopulator, Object {
public void populate_timespan(Conversation conversation, DateTime after, DateTime before) { }
- public void populate_between_widgets(Conversation conversation, DateTime from, DateTime to) { }
-
private void on_insert_item(Plugins.MetaConversationItem item) {
if (item.display_time == null) return;
diff --git a/main/src/ui/conversation_summary/default_file_display.vala b/main/src/ui/conversation_summary/default_file_display.vala
deleted file mode 100644
index 1547440b..00000000
--- a/main/src/ui/conversation_summary/default_file_display.vala
+++ /dev/null
@@ -1,95 +0,0 @@
-using Gdk;
-using Gtk;
-
-using Dino.Entities;
-using Xmpp;
-
-namespace Dino.Ui.ConversationSummary {
-
-public class DefaultFileDisplay : Plugins.MetaConversationItem {
- public override Jid? jid { get; set; }
- public override DateTime? sort_time { get; set; }
- public override DateTime? display_time { get; set; }
- public override Encryption? encryption { get; set; }
- public override Entities.Message.Marked? mark { get; set; }
-
- public override bool can_merge { get; set; default=true; }
- public override bool requires_avatar { get; set; default=true; }
- public override bool requires_header { get; set; default=true; }
-
- private const int MAX_HEIGHT = 300;
- private const int MAX_WIDTH = 600;
-
- private StreamInteractor stream_interactor;
- private FileTransfer file_transfer;
-
- public DefaultFileDisplay(StreamInteractor stream_interactor, FileTransfer file_transfer) {
- this.stream_interactor = stream_interactor;
- this.file_transfer = file_transfer;
-
- this.jid = file_transfer.direction == FileTransfer.DIRECTION_SENT ? file_transfer.account.bare_jid.with_resource(file_transfer.account.resourcepart) : file_transfer.counterpart;
- this.sort_time = file_transfer.time;
- this.seccondary_sort_indicator = file_transfer.id + 0.2903;
- this.display_time = file_transfer.time;
- this.encryption = file_transfer.encryption;
- this.mark = file_to_message_state(file_transfer.state);
- file_transfer.notify["state"].connect_after(() => {
- this.mark = file_to_message_state(file_transfer.state);
- });
- }
-
- public override Object? get_widget(Plugins.WidgetType widget_type) {
- Box main_box = new Box(Orientation.HORIZONTAL, 4) { halign=Align.START, visible=true };
- string? icon_name = ContentType.get_generic_icon_name(file_transfer.mime_type);
- Image content_type_image = new Image.from_icon_name(icon_name, IconSize.DND) { visible=true };
- main_box.add(content_type_image);
-
- Box right_box = new Box(Orientation.VERTICAL, 0) { visible=true };
- Label name_label = new Label(file_transfer.file_name) { xalign=0, yalign=0, visible=true};
- right_box.add(name_label);
- Label mime_label = new Label("<span size='small'>" + _("File") + ": " + file_transfer.mime_type + "</span>") { use_markup=true, xalign=0, yalign=1, visible=true};
- mime_label.get_style_context().add_class("dim-label");
- right_box.add(mime_label);
- main_box.add(right_box);
-
- EventBox event_box = new EventBox() { halign=Align.START, visible=true };
- event_box.add(main_box);
-
- event_box.enter_notify_event.connect((event) => {
- event.get_window().set_cursor(new Cursor.for_display(Gdk.Display.get_default(), CursorType.HAND2));
- return false;
- });
- event_box.leave_notify_event.connect((event) => {
- event.get_window().set_cursor(new Cursor.for_display(Gdk.Display.get_default(), CursorType.XTERM));
- return false;
- });
- event_box.button_release_event.connect((event_button) => {
- if (event_button.button == 1) {
- try{
- AppInfo.launch_default_for_uri(file_transfer.get_file().get_uri(), null);
- } catch (Error err) {
- print("Tried to open " + file_transfer.get_file().get_path());
- }
- }
- return false;
- });
-
- return event_box;
- }
-
- private Entities.Message.Marked file_to_message_state(FileTransfer.State state) {
- switch (state) {
- case FileTransfer.State.IN_PROCESS:
- return Entities.Message.Marked.UNSENT;
- case FileTransfer.State.COMPLETE:
- return Entities.Message.Marked.NONE;
- case FileTransfer.State.NOT_STARTED:
- return Entities.Message.Marked.UNSENT;
- case FileTransfer.State.FAILED:
- return Entities.Message.Marked.WONTSEND;
- }
- assert_not_reached();
- }
-}
-
-}
diff --git a/main/src/ui/conversation_summary/default_message_display.vala b/main/src/ui/conversation_summary/default_message_display.vala
deleted file mode 100644
index 519e5107..00000000
--- a/main/src/ui/conversation_summary/default_message_display.vala
+++ /dev/null
@@ -1,58 +0,0 @@
-using Dino.Entities;
-using Xmpp;
-
-namespace Dino.Ui.ConversationSummary {
-
-public class DefaultMessageDisplay : Plugins.MessageDisplayProvider, Object {
- public string id { get; set; default="default"; }
- public double priority { get; set; default=0; }
-
- public StreamInteractor stream_interactor;
-
- public DefaultMessageDisplay(StreamInteractor stream_interactor) {
- this.stream_interactor = stream_interactor;
- }
-
- public bool can_display(Entities.Message? message) { return true; }
-
- public Plugins.MetaConversationItem? get_item(Entities.Message message, Conversation conversation) {
- return new MetaMessageItem(stream_interactor, message, conversation);
- }
-}
-
-public class MetaMessageItem : Plugins.MetaConversationItem {
- public override Jid? jid { get; set; }
- public override DateTime? sort_time { get; set; }
- public override DateTime? display_time { get; set; }
- public override Encryption? encryption { get; set; }
-
- private StreamInteractor stream_interactor;
- private Conversation conversation;
- private Message message;
-
- public MetaMessageItem(StreamInteractor stream_interactor, Message message, Conversation conversation) {
- this.stream_interactor = stream_interactor;
- this.conversation = conversation;
- this.message = message;
- this.jid = message.from;
- this.sort_time = message.local_time;
- this.seccondary_sort_indicator = message.id + 0.2085;
- this.display_time = message.time;
- this.encryption = message.encryption;
- }
-
- public override bool can_merge { get; set; default=true; }
- public override bool requires_avatar { get; set; default=true; }
- public override bool requires_header { get; set; default=true; }
-
- public override Object? get_widget(Plugins.WidgetType widget_type) {
- MessageTextView text_view = new MessageTextView() { visible = true };
- text_view.add_text(message.body);
- if (conversation.type_ == Conversation.Type.GROUPCHAT) {
- text_view.highlight_word(conversation.nickname);
- }
- return text_view;
- }
-}
-
-}
diff --git a/main/src/ui/conversation_summary/file_populator.vala b/main/src/ui/conversation_summary/file_populator.vala
deleted file mode 100644
index af7bc992..00000000
--- a/main/src/ui/conversation_summary/file_populator.vala
+++ /dev/null
@@ -1,54 +0,0 @@
-using Gee;
-using Gtk;
-
-using Dino.Entities;
-using Xmpp;
-
-namespace Dino.Ui.ConversationSummary {
-
-class FilePopulator : Plugins.ConversationItemPopulator, Object {
-
- public string id { get { return "file"; } }
-
- private StreamInteractor? stream_interactor;
- private Conversation? current_conversation;
- private Plugins.ConversationItemCollection? item_collection;
-
- public FilePopulator(StreamInteractor stream_interactor) {
- this.stream_interactor = stream_interactor;
-
- stream_interactor.get_module(FileManager.IDENTITY).received_file.connect((file_transfer) => {
- if (current_conversation != null && current_conversation.account.equals(file_transfer.account) && current_conversation.counterpart.equals_bare(file_transfer.counterpart)) {
- insert_file(file_transfer);
- }
- });
- }
-
- public void init(Conversation conversation, Plugins.ConversationItemCollection item_collection, Plugins.WidgetType type) {
- current_conversation = conversation;
- this.item_collection = item_collection;
- }
-
- public void close(Conversation conversation) { }
-
- public void populate_timespan(Conversation conversation, DateTime from, DateTime to) {
- Gee.List<FileTransfer> transfers = stream_interactor.get_module(FileManager.IDENTITY).get_file_transfers(conversation.account, conversation.counterpart, from, to);
- foreach (FileTransfer transfer in transfers) {
- insert_file(transfer);
- }
- }
-
- public void populate_between_widgets(Conversation conversation, DateTime from, DateTime to) { }
-
- private void insert_file(FileTransfer transfer) {
- Plugins.MetaConversationItem item = null;
- if (transfer.mime_type != null && transfer.mime_type.has_prefix("image")) {
- item = new ImageDisplay(stream_interactor, transfer);
- } else {
- item = new DefaultFileDisplay(stream_interactor, transfer);
- }
- item_collection.insert_item(item);
- }
-}
-
-}
diff --git a/main/src/ui/conversation_summary/image_display.vala b/main/src/ui/conversation_summary/image_display.vala
deleted file mode 100644
index 15880836..00000000
--- a/main/src/ui/conversation_summary/image_display.vala
+++ /dev/null
@@ -1,137 +0,0 @@
-using Gtk;
-
-using Dino.Entities;
-using Xmpp;
-
-namespace Dino.Ui.ConversationSummary {
-
-public class ImageDisplay : Plugins.MetaConversationItem {
- public override Jid? jid { get; set; }
- public override DateTime? sort_time { get; set; }
- public override DateTime? display_time { get; set; }
- public override Encryption? encryption { get; set; }
- public override Entities.Message.Marked? mark { get; set; }
-
- public override bool can_merge { get; set; default=true; }
- public override bool requires_avatar { get; set; default=true; }
- public override bool requires_header { get; set; default=true; }
-
- private const int MAX_HEIGHT = 300;
- private const int MAX_WIDTH = 600;
-
- private StreamInteractor stream_interactor;
- private FileTransfer file_transfer;
-
- public ImageDisplay(StreamInteractor stream_interactor, FileTransfer file_transfer) {
- this.stream_interactor = stream_interactor;
- this.file_transfer = file_transfer;
-
- this.jid = file_transfer.direction == FileTransfer.DIRECTION_SENT ? file_transfer.account.bare_jid.with_resource(file_transfer.account.resourcepart) : file_transfer.counterpart;
- this.sort_time = file_transfer.time;
- this.seccondary_sort_indicator = file_transfer.id + 0.2903;
- this.display_time = file_transfer.time;
- this.encryption = file_transfer.encryption;
- this.mark = file_to_message_state(file_transfer.state);
- file_transfer.notify["state"].connect_after(() => {
- this.mark = file_to_message_state(file_transfer.state);
- });
- }
-
- public override Object? get_widget(Plugins.WidgetType widget_type) {
- Image image = new Image() { halign=Align.START, visible = true };
- Gdk.Pixbuf pixbuf;
- try {
- pixbuf = new Gdk.Pixbuf.from_file(file_transfer.get_file().get_path());
- } catch (Error error) {
- return null;
- }
-
- int max_scaled_height = MAX_HEIGHT * image.scale_factor;
- if (pixbuf.height > max_scaled_height) {
- pixbuf = pixbuf.scale_simple((int) ((double) max_scaled_height / pixbuf.height * pixbuf.width), max_scaled_height, Gdk.InterpType.BILINEAR);
- }
- int max_scaled_width = MAX_WIDTH * image.scale_factor;
- if (pixbuf.width > max_scaled_width) {
- pixbuf = pixbuf.scale_simple(max_scaled_width, (int) ((double) max_scaled_width / pixbuf.width * pixbuf.height), Gdk.InterpType.BILINEAR);
- }
- pixbuf = crop_corners(pixbuf, 3 * image.get_scale_factor());
- Util.image_set_from_scaled_pixbuf(image, pixbuf);
- Util.force_css(image, "* { box-shadow: 0px 0px 2px 0px rgba(0,0,0,0.1); margin: 2px; border-radius: 3px; }");
-
- Builder builder = new Builder.from_resource("/im/dino/Dino/conversation_summary/image_toolbar.ui");
- Widget toolbar = builder.get_object("main") as Widget;
- Util.force_background(toolbar, "rgba(0, 0, 0, 0.5)");
- Util.force_css(toolbar, "* { padding: 3px; border-radius: 3px; }");
-
- Label url_label = builder.get_object("url_label") as Label;
- Util.force_color(url_label, "#eee");
- update_info(url_label, file_transfer.file_name);
-
- Image open_image = builder.get_object("open_image") as Image;
- Util.force_css(open_image, "*:not(:hover) { color: #eee; }");
- Button open_button = builder.get_object("open_button") as Button;
- Util.force_css(open_button, "*:hover { background-color: rgba(255,255,255,0.3); border-color: transparent; }");
- open_button.clicked.connect(() => {
- try{
- AppInfo.launch_default_for_uri(file_transfer.get_file().get_uri(), null);
- } catch (Error err) {
- print("Tried to open file://" + file_transfer.get_file().get_path() + " " + err.message + "\n");
- }
- });
-
- Revealer toolbar_revealer = new Revealer() { transition_type=RevealerTransitionType.CROSSFADE, transition_duration=400, visible=true };
- toolbar_revealer.add(toolbar);
-
- Grid grid = new Grid() { visible=true };
- grid.attach(toolbar_revealer, 0, 0, 1, 1);
- grid.attach(image, 0, 0, 1, 1);
-
- EventBox event_box = new EventBox() { halign=Align.START, visible=true };
- event_box.add(grid);
- event_box.enter_notify_event.connect(() => { toolbar_revealer.reveal_child = true; return false; });
- event_box.leave_notify_event.connect(() => { toolbar_revealer.reveal_child = false; return false; });
-
- return event_box;
- }
-
- private static Gdk.Pixbuf crop_corners(Gdk.Pixbuf pixbuf, double radius = 3) {
- Cairo.Context ctx = new Cairo.Context(new Cairo.ImageSurface(Cairo.Format.ARGB32, pixbuf.width, pixbuf.height));
- Gdk.cairo_set_source_pixbuf(ctx, pixbuf, 0, 0);
- double degrees = Math.PI / 180.0;
- ctx.new_sub_path();
- ctx.arc(pixbuf.width - radius, radius, radius, -90 * degrees, 0 * degrees);
- ctx.arc(pixbuf.width - radius, pixbuf.height - radius, radius, 0 * degrees, 90 * degrees);
- ctx.arc(radius, pixbuf.height - radius, radius, 90 * degrees, 180 * degrees);
- ctx.arc(radius, radius, radius, 180 * degrees, 270 * degrees);
- ctx.close_path();
- ctx.clip();
- ctx.paint();
- return Gdk.pixbuf_get_from_surface(ctx.get_target(), 0, 0, pixbuf.width, pixbuf.height);
- }
-
- private void update_info(Label url_label, string? info) {
- string url = info ?? "";
- if (url.has_prefix("https://")) url = url.substring(8);
- if (url.has_prefix("http://")) url = url.substring(7);
- if (url.has_prefix("www.")) url = url.substring(4);
- string[] slash_split = url.split("/");
- if (slash_split.length > 2) url = slash_split[0] + "/…/" + slash_split[slash_split.length - 1];
- url_label.label = url;
- }
-
- private Entities.Message.Marked file_to_message_state(FileTransfer.State state) {
- switch (state) {
- case FileTransfer.State.IN_PROCESS:
- return Entities.Message.Marked.UNSENT;
- case FileTransfer.State.COMPLETE:
- return Entities.Message.Marked.NONE;
- case FileTransfer.State.NOT_STARTED:
- return Entities.Message.Marked.UNSENT;
- case FileTransfer.State.FAILED:
- return Entities.Message.Marked.WONTSEND;
- }
- assert_not_reached();
- }
-}
-
-}
diff --git a/main/src/ui/conversation_summary/message_populator.vala b/main/src/ui/conversation_summary/message_populator.vala
deleted file mode 100644
index b342306b..00000000
--- a/main/src/ui/conversation_summary/message_populator.vala
+++ /dev/null
@@ -1,81 +0,0 @@
-using Gee;
-using Gtk;
-
-using Dino.Entities;
-
-namespace Dino.Ui.ConversationSummary {
-
-public class MessagePopulator : Object {
-
- private StreamInteractor? stream_interactor;
- private Conversation? current_conversation;
- private Plugins.ConversationItemCollection? item_collection;
- private HashMap<Plugins.MetaConversationItem, Message> meta_message = new HashMap<Plugins.MetaConversationItem, Message>();
-
- public MessagePopulator(StreamInteractor stream_interactor) {
- this.stream_interactor = stream_interactor;
-
- Application app = GLib.Application.get_default() as Application;
- app.plugin_registry.register_message_display(new DefaultMessageDisplay(stream_interactor));
- app.plugin_registry.register_message_display(new SlashmeMessageDisplay(stream_interactor));
-
-
- stream_interactor.get_module(MessageProcessor.IDENTITY).message_received.connect(handle_message);
- stream_interactor.get_module(MessageProcessor.IDENTITY).message_sent.connect(handle_message);
- }
-
- public void init(Conversation conversation, Plugins.ConversationItemCollection item_collection) {
- current_conversation = conversation;
- this.item_collection = item_collection;
- }
-
- public void close(Conversation conversation) { }
-
- public void populate_latest(Conversation conversation, int n) {
- Gee.List<Entities.Message>? messages = stream_interactor.get_module(MessageStorage.IDENTITY).get_messages(conversation, n);
- if (messages != null) {
- foreach (Entities.Message message in messages) {
- handle_message(message, conversation);
- }
- }
- }
-
- public void populate_before(Conversation conversation, Plugins.MetaConversationItem item, int n) {
- Gee.List<Entities.Message>? messages = stream_interactor.get_module(MessageStorage.IDENTITY).get_messages_before_message(conversation, meta_message[item], n);
- if (messages != null) {
- foreach (Entities.Message message in messages) {
- handle_message(message, conversation);
- }
- }
- }
-
- private void handle_message(Message message, Conversation conversation) {
- if (!conversation.equals(current_conversation)) return;
-
- Plugins.MessageDisplayProvider? best_provider = null;
- double priority = -1;
- Application app = GLib.Application.get_default() as Application;
- foreach (Plugins.MessageDisplayProvider provider in app.plugin_registry.message_displays) {
- if (provider.can_display(message) && provider.priority > priority) {
- best_provider = provider;
- priority = provider.priority;
- }
- }
- Plugins.MetaConversationItem? meta_item = best_provider.get_item(message, conversation);
- if (meta_item == null) return;
- meta_message[meta_item] = message;
-
- meta_item.mark = message.marked;
- WeakRef weak_meta_item = WeakRef(meta_item);
- WeakRef weak_message = WeakRef(message);
- message.notify["marked"].connect(() => {
- Plugins.MetaConversationItem? mi = weak_meta_item.get() as Plugins.MetaConversationItem;
- Message? m = weak_message.get() as Message;
- if (mi == null || m == null) return;
- mi.mark = m.marked;
- });
- item_collection.insert_item(meta_item);
- }
-}
-
-}
diff --git a/main/src/ui/conversation_summary/message_textview.vala b/main/src/ui/conversation_summary/message_textview.vala
deleted file mode 100644
index 0b5ed6e4..00000000
--- a/main/src/ui/conversation_summary/message_textview.vala
+++ /dev/null
@@ -1,158 +0,0 @@
-using Gdk;
-using Gtk;
-
-using Dino.Entities;
-
-namespace Dino.Ui.ConversationSummary {
-
-public class MessageTextView : TextView {
-
- private TextTag link_tag;
- private TextTag bold_tag;
-
- public MessageTextView() {
- Object(editable:false, hexpand:true, wrap_mode:WrapMode.WORD_CHAR);
-
- link_tag = buffer.create_tag("url", underline: Pango.Underline.SINGLE, foreground: "blue");
- bold_tag = buffer.create_tag("semibold", weight: Pango.Weight.SEMIBOLD);
- button_release_event.connect((event_button) => {
- if (event_button.button == 1) {
- open_url(event_button);
- }
- return false;
- });
- motion_notify_event.connect(change_cursor_over_url);
-
- update_display_style();
- Util.force_base_background(this, "textview, text:not(:selected)");
- style_updated.connect(update_display_style);
- populate_popup.connect(populate_context_menu);
- }
-
- // Workaround GTK TextView issues
- public override void get_preferred_width (out int minimum_width, out int natural_width) {
- base.get_preferred_width(out minimum_width, out natural_width);
- minimum_width = 0;
- }
-
- public void add_text(string text_) {
- string text = text_;
- if (text.length > 10000) {
- text = text.slice(0, 10000) + " [" + _("Message too long") + "]";
- }
- TextIter end;
- buffer.get_end_iter(out end);
- buffer.insert(ref end, text, -1);
- format_suffix_urls(text);
- }
-
- public void highlight_word(string word) {
- Regex word_regex = new Regex("""\b""" + Regex.escape_string(word) + """\b""");
- MatchInfo match_info;
- word_regex.match(buffer.text, 0, out match_info);
- for (; match_info.matches(); match_info.next()) {
- int start;
- int end;
- match_info.fetch_pos(0, out start, out end);
- start = buffer.text[0:start].char_count();
- end = buffer.text[0:end].char_count();
- TextIter start_iter;
- TextIter end_iter;
- buffer.get_iter_at_offset(out start_iter, start);
- buffer.get_iter_at_offset(out end_iter, end);
- buffer.apply_tag_by_name("semibold", start_iter, end_iter);
- }
- }
-
- private void update_display_style() {
- LinkButton lnk = new LinkButton("http://example.com");
- RGBA link_color = lnk.get_style_context().get_color(StateFlags.LINK);
- link_tag.foreground_rgba = link_color;
- }
-
- private string? find_url_at_location(int x, int y) {
- TextIter iter;
- get_iter_at_location(out iter, x, y);
- TextIter start_iter = iter, end_iter = iter;
- if (start_iter.backward_to_tag_toggle(link_tag) && end_iter.forward_to_tag_toggle(link_tag)) {
- return start_iter.get_text(end_iter);
- }
-
- return null;
- }
-
- private void populate_context_menu(Gtk.Menu popup) {
- popup.@foreach((widget) => { widget.destroy(); });
-
- Gdk.Window window = get_window(TextWindowType.TEXT);
- List<weak Seat> seats = window.get_display().list_seats();
- if (seats.length() > 0) {
- int device_x, device_y;
- window.get_device_position(seats.nth_data(0).get_pointer(), out device_x, out device_y, null);
- string url = find_url_at_location(device_x, device_y);
- if (url != null) {
- Gtk.MenuItem copy_url_item = new Gtk.MenuItem.with_label(_("Copy Link Address")) { visible=true };
- copy_url_item.activate.connect(() => {
- Clipboard.get_default(window.get_display()).set_text(url, url.length);
- });
- popup.append(copy_url_item);
- }
- }
-
- Gtk.MenuItem copy_item = new Gtk.MenuItem.with_label(_("Copy")) { visible=true };
- copy_item.sensitive = buffer.get_has_selection();
- copy_item.activate.connect(() => this.copy_clipboard() );
- popup.append(copy_item);
-
- Gtk.MenuItem select_all_item = new Gtk.MenuItem.with_label(_("Select All")) { visible=true };
- select_all_item.activate.connect(() => this.select_all(true) );
- popup.append(select_all_item);
- }
-
- private void format_suffix_urls(string text) {
- int absolute_start = buffer.text.char_count() - text.char_count();
-
- Regex url_regex = new Regex("""(?i)\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))""");
- MatchInfo match_info;
- url_regex.match(text, 0, out match_info);
- for (; match_info.matches(); match_info.next()) {
- int start;
- int end;
- match_info.fetch_pos(0, out start, out end);
- start = text[0:start].char_count();
- end = text[0:end].char_count();
- TextIter start_iter;
- TextIter end_iter;
- buffer.get_iter_at_offset(out start_iter, absolute_start + start);
- buffer.get_iter_at_offset(out end_iter, absolute_start + end);
- buffer.apply_tag_by_name("url", start_iter, end_iter);
- }
- }
-
- private bool open_url(EventButton event_button) {
- int buffer_x, buffer_y;
- window_to_buffer_coords(TextWindowType.TEXT, (int) event_button.x, (int) event_button.y, out buffer_x, out buffer_y);
- string url = find_url_at_location(buffer_x, buffer_y);
- if (url != null) {
- try{
- AppInfo.launch_default_for_uri(url, null);
- } catch (Error err) {
- print("Tried to open " + url);
- }
- }
- return false;
- }
-
- private bool change_cursor_over_url(EventMotion event_motion) {
- TextIter iter;
- get_iter_at_location(out iter, (int) event_motion.x, (int) event_motion.y);
- if (iter.has_tag(buffer.tag_table.lookup("url"))) {
- event_motion.window.set_cursor(new Cursor.for_display(get_display(), CursorType.HAND2));
- } else {
- event_motion.window.set_cursor(new Cursor.for_display(get_display(), CursorType.XTERM));
- }
- return false;
- }
-}
-
-}
diff --git a/main/src/ui/conversation_summary/slashme_message_display.vala b/main/src/ui/conversation_summary/slashme_message_display.vala
deleted file mode 100644
index 1ee20748..00000000
--- a/main/src/ui/conversation_summary/slashme_message_display.vala
+++ /dev/null
@@ -1,79 +0,0 @@
-using Gtk;
-
-using Dino.Entities;
-using Xmpp;
-
-namespace Dino.Ui.ConversationSummary {
-
-public class SlashmeMessageDisplay : Plugins.MessageDisplayProvider, Object {
- public string id { get; set; default="slashme"; }
- public double priority { get; set; default=1; }
-
- public StreamInteractor stream_interactor;
-
- public SlashmeMessageDisplay(StreamInteractor stream_interactor) {
- this.stream_interactor = stream_interactor;
- }
-
- public bool can_display(Entities.Message? message) {
- return message.body.has_prefix("/me");
- }
-
- public Plugins.MetaConversationItem? get_item(Entities.Message message, Conversation conversation) {
- return new MetaSlashmeItem(stream_interactor, message, conversation);
- }
-}
-
-public class MetaSlashmeItem : Plugins.MetaConversationItem {
- public override Jid? jid { get; set; }
- public override DateTime? sort_time { get; set; }
- public override DateTime? display_time { get; set; }
- public override Encryption? encryption { get; set; }
-
- private StreamInteractor stream_interactor;
- private Conversation conversation;
- private Message message;
- private TextTag nick_tag;
- private MessageTextView text_view;
-
- public MetaSlashmeItem(StreamInteractor stream_interactor, Message message, Conversation conversation) {
- this.stream_interactor = stream_interactor;
- this.conversation = conversation;
- this.message = message;
- this.jid = message.from;
- this.sort_time = message.local_time;
- this.seccondary_sort_indicator = message.id + 0.0845;
- this.display_time = message.time;
- this.encryption = message.encryption;
- }
-
- public override bool can_merge { get; set; default=false; }
- public override bool requires_avatar { get; set; default=true; }
- public override bool requires_header { get; set; default=false; }
-
- public override Object? get_widget(Plugins.WidgetType widget_type) {
- text_view = new MessageTextView() { valign=Align.CENTER, vexpand=true, visible = true };
- if (conversation.type_ == Conversation.Type.GROUPCHAT) {
- text_view.highlight_word(conversation.nickname);
- }
-
- string display_name = Util.get_message_display_name(stream_interactor, message, conversation.account);
- string color = Util.get_name_hex_color(stream_interactor, conversation.account, conversation.counterpart, Util.is_dark_theme(text_view));
- nick_tag = text_view.buffer.create_tag("nick", foreground: "#" + color);
- TextIter iter;
- text_view.buffer.get_start_iter(out iter);
- text_view.buffer.insert_with_tags(ref iter, display_name, display_name.length, nick_tag);
- text_view.add_text(message.body.substring(3));
-
- text_view.style_updated.connect(update_style);
- text_view.realize.connect(update_style);
- return text_view;
- }
-
- private void update_style() {
- string color = Util.get_name_hex_color(stream_interactor, conversation.account, message.real_jid ?? message.from, Util.is_dark_theme(text_view));
- nick_tag.foreground = "#" + color;
- }
-}
-
-}
diff --git a/main/src/ui/conversation_titlebar/search_entry.vala b/main/src/ui/conversation_titlebar/search_entry.vala
new file mode 100644
index 00000000..b452bdce
--- /dev/null
+++ b/main/src/ui/conversation_titlebar/search_entry.vala
@@ -0,0 +1,30 @@
+using Gtk;
+using Gee;
+
+using Dino.Entities;
+
+namespace Dino.Ui {
+
+public class SearchMenuEntry : Plugins.ConversationTitlebarEntry, Object {
+ public string id { get { return "search"; } }
+
+ Plugins.ConversationTitlebarWidget search_button;
+
+ public SearchMenuEntry(Plugins.ConversationTitlebarWidget search_button) {
+ this.search_button = search_button;
+ }
+
+ public double order { get { return 1; } }
+ public Plugins.ConversationTitlebarWidget? get_widget(Plugins.WidgetType type) {
+ if (type == Plugins.WidgetType.GTK) {
+ return search_button;
+ }
+ return null;
+ }
+}
+
+public class GlobalSearchButton : Plugins.ConversationTitlebarWidget, Gtk.ToggleButton {
+ public new void set_conversation(Conversation conversation) { }
+}
+
+}
diff --git a/main/src/ui/conversation_titlebar/view.vala b/main/src/ui/conversation_titlebar/view.vala
index d01cd9bb..7ee47311 100644
--- a/main/src/ui/conversation_titlebar/view.vala
+++ b/main/src/ui/conversation_titlebar/view.vala
@@ -11,6 +11,7 @@ public class ConversationTitlebar : Gtk.HeaderBar {
private Window window;
private Conversation? conversation;
private Gee.List<Plugins.ConversationTitlebarWidget> widgets = new ArrayList<Plugins.ConversationTitlebarWidget>();
+ public GlobalSearchButton search_button = new GlobalSearchButton() { visible = true };
public ConversationTitlebar(StreamInteractor stream_interactor, Window window) {
this.stream_interactor = stream_interactor;
@@ -19,9 +20,11 @@ public class ConversationTitlebar : Gtk.HeaderBar {
this.get_style_context().add_class("dino-right");
show_close_button = true;
hexpand = true;
+ search_button.set_image(new Gtk.Image.from_icon_name("system-search-symbolic", Gtk.IconSize.MENU) { visible = true });
Application app = GLib.Application.get_default() as Application;
app.plugin_registry.register_contact_titlebar_entry(new MenuEntry(stream_interactor));
+ app.plugin_registry.register_contact_titlebar_entry(new SearchMenuEntry(search_button));
app.plugin_registry.register_contact_titlebar_entry(new OccupantsEntry(stream_interactor, window));
foreach(var e in app.plugin_registry.conversation_titlebar_entries) {
@@ -33,6 +36,12 @@ public class ConversationTitlebar : Gtk.HeaderBar {
}
+ stream_interactor.get_module(MucManager.IDENTITY).room_name_set.connect((account, jid, room_name) => {
+ if (conversation != null && conversation.counterpart.equals_bare(jid) && conversation.account.equals(account)) {
+ update_title();
+ }
+ });
+
stream_interactor.get_module(MucManager.IDENTITY).subject_set.connect((account, jid, subject) => {
if (conversation != null && conversation.counterpart.equals_bare(jid) && conversation.account.equals(account)) {
update_subtitle(subject);
diff --git a/main/src/ui/global_search.vala b/main/src/ui/global_search.vala
new file mode 100644
index 00000000..99a69e1b
--- /dev/null
+++ b/main/src/ui/global_search.vala
@@ -0,0 +1,267 @@
+using Gee;
+using Gtk;
+using Pango;
+
+using Dino.Entities;
+
+namespace Dino.Ui {
+
+[GtkTemplate (ui = "/im/dino/Dino/global_search.ui")]
+class GlobalSearch : Overlay {
+ public signal void selected_item(MessageItem item);
+ private StreamInteractor stream_interactor;
+ private string search = "";
+ private int loaded_results = -1;
+ private Mutex reloading_mutex = Mutex();
+
+ [GtkChild] public SearchEntry search_entry;
+ [GtkChild] public Label entry_number_label;
+ [GtkChild] public ScrolledWindow results_scrolled;
+ [GtkChild] public Box results_box;
+ [GtkChild] public Stack results_empty_stack;
+ [GtkChild] public Frame auto_complete_overlay;
+ [GtkChild] public ListBox auto_complete_list;
+
+ public GlobalSearch init(StreamInteractor stream_interactor) {
+ this.stream_interactor = stream_interactor;
+
+ search_entry.search_changed.connect(() => {
+ set_search(search_entry.text);
+ });
+ search_entry.notify["text"].connect_after(() => { update_auto_complete(); });
+ search_entry.notify["cursor-position"].connect_after(() => { update_auto_complete(); });
+
+ results_scrolled.vadjustment.notify["value"].connect(() => {
+ if (results_scrolled.vadjustment.upper - (results_scrolled.vadjustment.value + results_scrolled.vadjustment.page_size) < 100) {
+ if (!reloading_mutex.trylock()) return;
+ Gee.List<MessageItem> new_messages = stream_interactor.get_module(SearchProcessor.IDENTITY).match_messages(search, loaded_results);
+ if (new_messages.size == 0) {
+ reloading_mutex.unlock();
+ return;
+ }
+ loaded_results += new_messages.size;
+ append_messages(new_messages);
+ }
+ });
+ results_scrolled.vadjustment.notify["upper"].connect_after(() => {
+ reloading_mutex.trylock();
+ reloading_mutex.unlock();
+ });
+
+ event.connect((event) => {
+ if (auto_complete_overlay.visible) {
+ if (event.type == Gdk.EventType.KEY_PRESS && event.key.keyval == Gdk.Key.Up) {
+ var row = auto_complete_list.get_selected_row();
+ var index = row == null ? -1 : row.get_index() - 1;
+ if (index == -1) index = (int)auto_complete_list.get_children().length() - 1;
+ auto_complete_list.select_row(auto_complete_list.get_row_at_index(index));
+ return true;
+ }
+ if (event.type == Gdk.EventType.KEY_PRESS && event.key.keyval == Gdk.Key.Down) {
+ var row = auto_complete_list.get_selected_row();
+ var index = row == null ? 0 : row.get_index() + 1;
+ if (index == auto_complete_list.get_children().length()) index = 0;
+ auto_complete_list.select_row(auto_complete_list.get_row_at_index(index));
+ return true;
+ }
+ if (event.type == Gdk.EventType.KEY_PRESS && event.key.keyval == Gdk.Key.Tab ||
+ event.type == Gdk.EventType.KEY_RELEASE && event.key.keyval == Gdk.Key.Return) {
+ auto_complete_list.get_selected_row().activate();
+ return true;
+ }
+ }
+ // TODO: Handle cursor movement in results
+ // TODO: Direct all keystrokes to text input
+ return false;
+ });
+
+ return this;
+ }
+
+ private void update_auto_complete() {
+ Gee.List<SearchSuggestion> suggestions = stream_interactor.get_module(SearchProcessor.IDENTITY).suggest_auto_complete(search_entry.text, search_entry.cursor_position);
+ auto_complete_overlay.visible = suggestions.size > 0;
+ if (suggestions.size > 0) {
+ auto_complete_list.@foreach((widget) => auto_complete_list.remove(widget));
+ foreach(SearchSuggestion suggestion in suggestions) {
+ Builder builder = new Builder.from_resource("/im/dino/Dino/search_autocomplete.ui");
+ AvatarImage avatar = (AvatarImage)builder.get_object("image");
+ avatar.set_jid(stream_interactor, suggestion.jid, suggestion.account);
+ Label label = (Label)builder.get_object("label");
+ string display_name = Util.get_display_name(stream_interactor, suggestion.jid, suggestion.account);
+ if (display_name != suggestion.jid.to_string()) {
+ label.set_markup(@"$display_name <span font_weight='light' fgalpha='80%'>$(suggestion.jid)</span>");
+ } else {
+ label.label = display_name;
+ }
+ ListBoxRow row = new ListBoxRow() { visible = true, can_focus = false };
+ row.add((Widget)builder.get_object("root"));
+ row.activate.connect(() => {
+ handle_suggestion(suggestion);
+ });
+ auto_complete_list.add(row);
+ }
+ auto_complete_list.select_row(auto_complete_list.get_row_at_index(0));
+ }
+ }
+
+ private void handle_suggestion(SearchSuggestion suggestion) {
+ search_entry.move_cursor(MovementStep.LOGICAL_POSITIONS, suggestion.start_index - search_entry.cursor_position, false);
+ search_entry.delete_from_cursor(DeleteType.CHARS, suggestion.end_index - suggestion.start_index);
+ search_entry.insert_at_cursor(suggestion.completion + " ");
+ }
+
+ private void clear_search() {
+ results_box.@foreach((widget) => { widget.destroy(); });
+ }
+
+ private void set_search(string search) {
+ clear_search();
+ this.search = search;
+
+ if (get_keywords(search).is_empty) {
+ results_empty_stack.set_visible_child_name("empty");
+ return;
+ }
+
+ Gee.List<MessageItem> messages = stream_interactor.get_module(SearchProcessor.IDENTITY).match_messages(search);
+ if (messages.size == 0) {
+ results_empty_stack.set_visible_child_name("no-result");
+ } else {
+ results_empty_stack.set_visible_child_name("results");
+
+ int match_count = messages.size < 10 ? messages.size : stream_interactor.get_module(SearchProcessor.IDENTITY).count_match_messages(search);
+ entry_number_label.label = "<i>" + _("%i search results").printf(match_count) + "</i>";
+ loaded_results += messages.size;
+ append_messages(messages);
+ }
+ }
+
+ private void append_messages(Gee.List<MessageItem> messages) {
+ foreach (MessageItem item in messages) {
+ Gee.List<MessageItem> before_message = stream_interactor.get_module(MessageStorage.IDENTITY).get_messages_before_message(item.conversation, item.message.local_time, item.message.id, 1);
+ Gee.List<MessageItem> after_message = stream_interactor.get_module(MessageStorage.IDENTITY).get_messages_after_message(item.conversation, item.message.local_time, item.message.id, 1);
+
+ Box context_box = new Box(Orientation.VERTICAL, 5) { visible=true };
+ if (before_message != null && before_message.size > 0) {
+ context_box.add(get_context_message_widget(before_message.first()));
+ }
+
+ Widget match_widget = get_match_message_widget(item);
+ context_box.add(match_widget);
+
+ if (after_message != null && after_message.size > 0) {
+ context_box.add(get_context_message_widget(after_message.first()));
+ }
+
+ Label date_label = new Label(ConversationSummary.DefaultSkeletonHeader.get_relative_time(item.display_time)) { xalign=0, visible=true };
+ date_label.get_style_context().add_class("dim-label");
+
+ string display_name = Util.get_conversation_display_name(stream_interactor, item.conversation);
+ string title = item.message.type_ == Message.Type.GROUPCHAT ? _("In %s").printf(display_name) : _("With %s").printf(display_name);
+ Box header_box = new Box(Orientation.HORIZONTAL, 10) { margin_start=7, visible=true };
+ header_box.add(new Label(@"<b>$(Markup.escape_text(title))</b>") { ellipsize=EllipsizeMode.END, xalign=0, use_markup=true, visible=true });
+ header_box.add(date_label);
+
+ Box result_box = new Box(Orientation.VERTICAL, 7) { visible=true };
+ result_box.add(header_box);
+ result_box.add(context_box);
+
+ results_box.add(result_box);
+ }
+ }
+
+ private Widget get_match_message_widget(MessageItem item) {
+ Grid grid = get_skeleton(item);
+ grid.margin_top = 3;
+ grid.margin_bottom = 3;
+
+ string text = item.message.body.replace("\n", "").replace("\r", "");
+ if (text.length > 200) {
+ int index = text.index_of(search);
+ if (index + search.length <= 100) {
+ text = text.substring(0, 150) + " … " + text.substring(text.length - 50, 50);
+ } else if (index >= text.length - 100) {
+ text = text.substring(0, 50) + " … " + text.substring(text.length - 150, 150);
+ } else {
+ text = text.substring(0, 25) + " … " + text.substring(index - 50, 50) + text.substring(index, 100) + " … " + text.substring(text.length - 25, 25);
+ }
+ }
+ Label label = new Label("") { use_markup=true, xalign=0, selectable=true, wrap=true, wrap_mode=Pango.WrapMode.WORD_CHAR, vexpand=true, visible=true };
+ string markup_text = Markup.escape_text(text);
+
+ // Build regex containing all keywords
+ string regex_str = "(";
+ Gee.List<string> keywords = get_keywords(Regex.escape_string(search.down()));
+ bool first = true;
+ foreach (string keyword in keywords) {
+ if (first) {
+ first = false;
+ } else {
+ regex_str += "|";
+ }
+ regex_str += "\\b" + keyword;
+ }
+ regex_str += ")";
+
+ // Color the keywords
+ int elongated_by = 0;
+ Regex highlight_regex = new Regex(regex_str);
+ MatchInfo match_info;
+ string markup_text_bak = markup_text.down();
+ highlight_regex.match(markup_text_bak, 0, out match_info);
+ for (; match_info.matches(); match_info.next()) {
+ int start, end;
+ match_info.fetch_pos(0, out start, out end);
+ markup_text = markup_text[0:start+elongated_by] + "<span bgcolor=\"yellow\">" + markup_text[start+elongated_by:end+elongated_by] + "</span>" + markup_text[end+elongated_by:markup_text.length];
+ elongated_by += "<span bgcolor=\"yellow\">".length + "</span>".length;
+ }
+ markup_text_bak += ""; // We need markup_text_bak to live until here because url_regex.match does not copy the string
+
+ label.label = markup_text;
+ grid.attach(label, 1, 1, 1, 1);
+
+ Button button = new Button() { relief=ReliefStyle.NONE, visible=true };
+ button.clicked.connect(() => {
+ selected_item(item);
+ });
+ button.add(grid);
+ return button;
+ }
+
+ private Grid get_context_message_widget(MessageItem item) {
+ Grid grid = get_skeleton(item);
+ grid.margin_start = 7;
+ Label label = new Label(item.message.body.replace("\n", "").replace("\r", "")) { ellipsize=EllipsizeMode.MIDDLE, xalign=0, visible=true };
+ grid.attach(label, 1, 1, 1, 1);
+ grid.opacity = 0.55;
+ return grid;
+ }
+
+ private Grid get_skeleton(MessageItem item) {
+ AvatarImage image = new AvatarImage() { height=32, width=32, margin_end=7, valign=Align.START, visible=true, allow_gray = false };
+ image.set_jid(stream_interactor, item.jid, item.message.account);
+ Grid grid = new Grid() { row_homogeneous=false, visible=true };
+ grid.attach(image, 0, 0, 1, 2);
+
+ string display_name = Util.get_display_name(stream_interactor, item.jid, item.message.account);
+ string color = Util.get_name_hex_color(stream_interactor, item.message.account, item.jid, false); // TODO Util.is_dark_theme(name_label)
+ Label name_label = new Label("") { use_markup=true, xalign=0, visible=true };
+ name_label.label = @"<span size='small' foreground=\"#$color\">$display_name</span>";
+ grid.attach(name_label, 1, 0, 1, 1);
+ return grid;
+ }
+
+ private static Gee.List<string> get_keywords(string search_string) {
+ Gee.List<string> ret = new ArrayList<string>();
+ foreach (string search in search_string.split(" ")) {
+ bool is_filter = search.has_prefix("from:") || search.has_prefix("in:") || search.has_prefix("with:");
+ if (!is_filter && search != "") {
+ ret.add(search);
+ }
+ }
+ return ret;
+ }
+}
+
+}
diff --git a/main/src/ui/manage_accounts/add_account_dialog.vala b/main/src/ui/manage_accounts/add_account_dialog.vala
index 5715db51..f9ab794e 100644
--- a/main/src/ui/manage_accounts/add_account_dialog.vala
+++ b/main/src/ui/manage_accounts/add_account_dialog.vala
@@ -11,29 +11,120 @@ public class AddAccountDialog : Gtk.Dialog {
public signal void added(Account account);
- [GtkChild] private Button cancel_button;
- [GtkChild] private Button ok_button;
- [GtkChild] private Entry alias_entry;
+ [GtkChild] private Stack stack;
+
+ [GtkChild] private Revealer notification_revealer;
+ [GtkChild] private Label notification_label;
+
+ // Sign in
+ [GtkChild] private Box sign_in_box;
[GtkChild] private Entry jid_entry;
+ [GtkChild] private Entry alias_entry;
[GtkChild] private Entry password_entry;
+ [GtkChild] private Button sign_in_continue;
+ [GtkChild] private Button serverlist_button;
+
+ // Select Server
+ [GtkChild] private Box create_account_box;
+ [GtkChild] private Button login_button;
+ [GtkChild] private Stack select_server_continue_stack;
+ [GtkChild] private Button select_server_continue;
+ [GtkChild] private Label register_form_continue_label;
+ [GtkChild] private ListBox server_list_box;
+ [GtkChild] private Entry server_entry;
+
+ // Register Form
+ [GtkChild] private Box register_box;
+ [GtkChild] private Label register_title;
+ [GtkChild] private Box form_box;
+ [GtkChild] private Button register_form_back;
+ [GtkChild] private Stack register_form_continue_stack;
+ [GtkChild] private Button register_form_continue;
+
+ private static string[] server_list = new string[]{
+ "5222.de",
+ "jabber.fr",
+ "movim.eu",
+ "yax.im"
+ };
+ private HashMap<ListBoxRow, string> list_box_jids = new HashMap<ListBoxRow, string>();
+ private Jid? server_jid = null;
+ private Xep.InBandRegistration.Form? form = null;
public AddAccountDialog(StreamInteractor stream_interactor) {
- Object(use_header_bar : 1);
this.title = _("Add Account");
- cancel_button.clicked.connect(() => { close(); });
- ok_button.clicked.connect(on_ok_button_clicked);
+ // Sign in
jid_entry.changed.connect(on_jid_entry_changed);
jid_entry.focus_out_event.connect(on_jid_entry_focus_out_event);
+ sign_in_continue.clicked.connect(on_sign_in_continue_clicked);
+ serverlist_button.clicked.connect(show_select_server);
+
+ // Select Server
+ server_entry.changed.connect(() => {
+ Jid? jid = Jid.parse(server_entry.text);
+ select_server_continue.sensitive = jid != null && jid.localpart == null && jid.resourcepart == null;
+ });
+ select_server_continue.clicked.connect(on_select_server_continue);
+ login_button.clicked.connect(show_sign_in);
+
+ foreach (string server in server_list) {
+ ListBoxRow list_box_row = new ListBoxRow() { visible=true };
+ list_box_row.add(new Label(server) { xalign=0, margin=3, margin_start=7, margin_end=7, visible=true });
+ list_box_jids[list_box_row] = server;
+ server_list_box.add(list_box_row);
+ }
+
+ // Register Form
+ register_form_continue.clicked.connect(on_register_form_continue_clicked);
+ register_form_back.clicked.connect(show_select_server);
+
+ show_sign_in();
+ }
+
+ private void show_sign_in() {
+ sign_in_box.visible = true;
+ stack.visible_child_name = "login";
+ create_account_box.visible = false;
+ register_box.visible = false;
+ set_default(sign_in_continue);
+ animate_window_resize(sign_in_box);
+ }
+
+ private void show_select_server() {
+ server_entry.text = "";
+ server_entry.grab_focus();
+ set_default(select_server_continue);
+
+ server_list_box.row_selected.disconnect(on_server_list_row_selected);
+ server_list_box.unselect_all();
+ server_list_box.row_selected.connect(on_server_list_row_selected);
+
+ create_account_box.visible = true;
+ stack.visible_child_name = "server";
+ sign_in_box.visible = false;
+ register_box.visible = false;
+
+ animate_window_resize(create_account_box);
+ }
+
+ private void show_register_form() {
+ register_box.visible = true;
+ stack.visible_child_name = "form";
+ sign_in_box.visible = false;
+ create_account_box.visible = false;
+
+ set_default(register_form_continue);
+ animate_window_resize(register_box);
}
private void on_jid_entry_changed() {
Jid? jid = Jid.parse(jid_entry.text);
if (jid != null && jid.localpart != null && jid.resourcepart == null) {
- ok_button.set_sensitive(true);
+ sign_in_continue.set_sensitive(true);
jid_entry.secondary_icon_name = null;
} else {
- ok_button.set_sensitive(false);
+ sign_in_continue.set_sensitive(false);
}
}
@@ -41,7 +132,6 @@ public class AddAccountDialog : Gtk.Dialog {
Jid? jid = Jid.parse(jid_entry.text);
if (jid == null || jid.localpart == null || jid.resourcepart != null) {
jid_entry.secondary_icon_name = "dialog-warning-symbolic";
- // TODO why doesn't the tooltip work
jid_entry.set_icon_tooltip_text(EntryIconPosition.SECONDARY, _("JID should be of the form “user@example.com”"));
} else {
jid_entry.secondary_icon_name = null;
@@ -49,13 +139,131 @@ public class AddAccountDialog : Gtk.Dialog {
return false;
}
- private void on_ok_button_clicked() {
+ private void on_sign_in_continue_clicked() {
Jid jid = new Jid(jid_entry.get_text());
string password = password_entry.get_text();
string alias = alias_entry.get_text();
+ store_account(jid, password, alias);
+ close();
+ }
+
+ private void on_select_server_continue() {
+ server_jid = new Jid(server_entry.text);
+ request_show_register_form.begin();
+ }
+
+ private void on_server_list_row_selected(ListBox box, ListBoxRow? row) {
+ server_jid = new Jid(list_box_jids[row]);
+ request_show_register_form.begin();
+ }
+
+ private async void request_show_register_form() {
+ select_server_continue_stack.visible_child_name = "spinner";
+ form = yield Register.get_registration_form(server_jid);
+ if (select_server_continue_stack == null) {
+ return;
+ }
+ select_server_continue_stack.visible_child_name = "label";
+ if (form != null) {
+ set_register_form(server_jid, form);
+ show_register_form();
+ } else {
+ display_notification(_("No response from server"));
+ }
+ }
+
+ private void set_register_form(Jid server, Xep.InBandRegistration.Form form) {
+ form_box.foreach((widget) => { widget.destroy(); });
+ register_title.label = _("Register on %s").printf(server.to_string());
+
+ if (form.oob != null) {
+ form_box.add(new Label(_("The server requires to sign up through a website")){ use_markup=true, visible=true } );
+ form_box.add(new Label(@"<a href=\"$(form.oob)\">$(form.oob)</a>") { use_markup=true, visible=true });
+ register_form_continue_label.label = _("Open Registration");
+ register_form_continue.visible = true;
+ register_form_continue.grab_focus();
+ } else if (form.fields.size > 0) {
+ int i = 0;
+ foreach (Xep.DataForms.DataForm.Field field in form.fields) {
+ if (field.label != null && field.label != "") {
+ form_box.add(new Label(field.label) { xalign=0, margin_top=7, visible=true });
+ }
+ Widget field_widget = Util.get_data_form_fild_widget(field);
+ if (field_widget != null) {
+ form_box.add(field_widget);
+ }
+ i++;
+ }
+ register_form_continue.visible = true;
+ register_form_continue_label.label = _("Register");
+ } else {
+ form_box.add(new Label(_("Check %s for information on how to sign up").printf(@"<a href=\"http://$(server)\">$(server)</a>")) { use_markup=true, visible=true });
+ register_form_continue.visible = false;
+ }
+ }
+
+ private async void on_register_form_continue_clicked() {
+ notification_revealer.set_reveal_child(false);
+ // Button is opening a registration website
+ if (form.oob != null) {
+ try {
+ AppInfo.launch_default_for_uri(form.oob, null);
+ } catch (Error e) { }
+ show_sign_in();
+ return;
+ }
+
+ register_form_continue_stack.visible_child_name = "spinner";
+ string? error = yield Register.submit_form(server_jid, form);
+ if (register_form_continue_stack == null) {
+ return;
+ }
+ register_form_continue_stack.visible_child_name = "label";
+ if (error == null) {
+ string? username = null, password = null;
+ foreach (Xep.DataForms.DataForm.Field field in form.fields) {
+ switch (field.var) {
+ case "username": username = field.get_value_string(); break;
+ case "password": password = field.get_value_string(); break;
+ }
+ }
+ store_account(new Jid(username + "@" + server_jid.domainpart), password, "");
+ close();
+ } else {
+ display_notification(error);
+ }
+ }
+
+ private void store_account(Jid jid, string password, string? alias) {
Account account = new Account(jid, null, password, alias);
added(account);
- close();
+ }
+
+ private void display_notification(string text) {
+ notification_label.label = text;
+ notification_revealer.set_reveal_child(true);
+ Timeout.add_seconds(5, () => {
+ notification_revealer.set_reveal_child(false);
+ return false;
+ });
+ }
+
+ private void animate_window_resize(Widget widget) { // TODO code duplication
+ int def_height, curr_width, curr_height;
+ get_size(out curr_width, out curr_height);
+ widget.get_preferred_height(null, out def_height);
+ def_height += 5;
+ int difference = def_height - curr_height;
+ Timer timer = new Timer();
+ Timeout.add((int) (stack.transition_duration / 30),
+ () => {
+ ulong microsec;
+ timer.elapsed(out microsec);
+ ulong millisec = microsec / 1000;
+ double partial = double.min(1, (double) millisec / stack.transition_duration);
+ resize(curr_width, (int) (curr_height + difference * partial));
+ return millisec < stack.transition_duration;
+ });
}
}
diff --git a/main/src/ui/manage_accounts/dialog.vala b/main/src/ui/manage_accounts/dialog.vala
index 5706fc8c..1a370349 100644
--- a/main/src/ui/manage_accounts/dialog.vala
+++ b/main/src/ui/manage_accounts/dialog.vala
@@ -215,15 +215,6 @@ public class Dialog : Gtk.Dialog {
if (error != null) {
state_label.label = get_connection_error_description(error);
state_label.get_style_context().add_class("is_error");
-
- if (error.source == ConnectionManager.ConnectionError.Source.SASL ||
- error.source == ConnectionManager.ConnectionError.Source.TLS ||
- error.reconnect_recomendation == ConnectionManager.ConnectionError.Reconnect.NEVER) {
- active_switch.state_set.disconnect(change_account_state);
- active_switch.active = false;
- active_switch.state_set.connect(change_account_state);
- }
-
} else {
ConnectionManager.ConnectionState state = stream_interactor.connection_manager.get_state(account);
switch (state) {
diff --git a/main/src/ui/notifications.vala b/main/src/ui/notifications.vala
index f7540a4d..77a290a0 100644
--- a/main/src/ui/notifications.vala
+++ b/main/src/ui/notifications.vala
@@ -41,19 +41,36 @@ public class Notifications : Object {
}
public void start() {
- stream_interactor.get_module(NotificationEvents.IDENTITY).notify_message.connect(notify_message);
+ stream_interactor.get_module(NotificationEvents.IDENTITY).notify_content_item.connect(notify_content_item);
stream_interactor.get_module(NotificationEvents.IDENTITY).notify_subscription_request.connect(notify_subscription_request);
+ stream_interactor.get_module(NotificationEvents.IDENTITY).notify_connection_error.connect(notify_connection_error);
}
- private void notify_message(Entities.Message message, Conversation conversation) {
+ private void notify_content_item(ContentItem content_item, Conversation conversation) {
if (!notifications.has_key(conversation)) {
notifications[conversation] = new Notification("");
notifications[conversation].set_default_action_and_target_value("app.open-conversation", new Variant.int32(conversation.id));
}
string display_name = Util.get_conversation_display_name(stream_interactor, conversation);
- string text = message.body;
+ string text = "";
+ switch (content_item.type_) {
+ case MessageItem.TYPE:
+ Message message = (content_item as MessageItem).message;
+ text = message.body;
+ break;
+ case FileItem.TYPE:
+ FileItem file_item = content_item as FileItem;
+ FileTransfer transfer = file_item.file_transfer;
+
+ if (transfer.direction == Message.DIRECTION_SENT) {
+ text = transfer.mime_type.has_prefix("image") ? _("Image sent") : _("File sent");
+ } else {
+ text = transfer.mime_type.has_prefix("image") ? _("Image received") : _("File received");
+ }
+ break;
+ }
if (stream_interactor.get_module(MucManager.IDENTITY).is_groupchat(conversation.counterpart, conversation.account)) {
- string muc_occupant = Util.get_display_name(stream_interactor, message.from, conversation.account);
+ string muc_occupant = Util.get_display_name(stream_interactor, content_item.jid, conversation.account);
text = @"$muc_occupant: $text";
}
notifications[conversation].set_title(display_name);
@@ -79,6 +96,19 @@ public class Notifications : Object {
active_ids.add(conversation.id.to_string() + "-subscription");
}
+ private void notify_connection_error(Account account, ConnectionManager.ConnectionError error) {
+ Notification notification = new Notification(_("Failed connecting to %s").printf(account.bare_jid.domainpart));
+ switch (error.source) {
+ case ConnectionManager.ConnectionError.Source.SASL:
+ notification.set_body("Wrong password");
+ break;
+ case ConnectionManager.ConnectionError.Source.TLS:
+ notification.set_body("Invalid TLS certificate");
+ break;
+ }
+ window.get_application().send_notification(account.id.to_string() + "-connection-error", notification);
+ }
+
private Icon get_pixbuf_icon(Cairo.ImageSurface surface) throws Error {
Gdk.Pixbuf avatar = Gdk.pixbuf_get_from_surface(surface, 0, 0, surface.get_width(), surface.get_height());
uint8[] buffer;
diff --git a/main/src/ui/unified_window.vala b/main/src/ui/unified_window.vala
index e2798def..61a22085 100644
--- a/main/src/ui/unified_window.vala
+++ b/main/src/ui/unified_window.vala
@@ -1,11 +1,12 @@
using Gee;
+using Gdk;
using Gtk;
using Dino.Entities;
namespace Dino.Ui {
-public class UnifiedWindow : Window {
+public class UnifiedWindow : Gtk.Window {
private NoAccountsPlaceholder accounts_placeholder = new NoAccountsPlaceholder() { visible=true };
private NoConversationsPlaceholder conversations_placeholder = new NoConversationsPlaceholder() { visible=true };
@@ -16,7 +17,12 @@ public class UnifiedWindow : Window {
private ConversationTitlebar conversation_titlebar;
private HeaderBar placeholder_headerbar = new HeaderBar() { title="Dino", show_close_button=true, visible=true };
private Paned headerbar_paned = new Paned(Orientation.HORIZONTAL) { visible=true };
- private Paned paned = new Paned(Orientation.HORIZONTAL) { visible=true };
+ private Paned paned;
+ private Revealer goto_end_revealer;
+ private Button goto_end_button;
+ private Revealer search_revealer;
+ private SearchEntry search_entry;
+ private GlobalSearch search_box;
private Stack stack = new Stack() { visible=true };
private StreamInteractor stream_interactor;
@@ -36,8 +42,47 @@ public class UnifiedWindow : Window {
setup_unified();
setup_stack();
- conversation_list_titlebar.search_button.bind_property("active", filterable_conversation_list.search_revealer, "reveal-child",
- BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
+ var vadjustment = conversation_frame.scrolled.vadjustment;
+ vadjustment.notify["value"].connect(() => {
+ goto_end_revealer.reveal_child = vadjustment.value < vadjustment.upper - vadjustment.page_size;
+ });
+ goto_end_button.clicked.connect(() => {
+ conversation_frame.initialize_for_conversation(conversation);
+ });
+
+ conversation_titlebar.search_button.clicked.connect(() => {
+ search_revealer.reveal_child = conversation_titlebar.search_button.active;
+ });
+ search_revealer.notify["child-revealed"].connect(() => {
+ if (search_revealer.child_revealed) {
+ if (conversation_frame.conversation != null && search_box.search_entry.text == "") {
+ reset_search_entry();
+ }
+ search_box.search_entry.grab_focus();
+ }
+ });
+ search_box.selected_item.connect((item) => {
+ on_conversation_selected(item.conversation, false, false);
+ conversation_frame.initialize_around_message(item.conversation, item);
+ close_search();
+ });
+ event.connect((event) => {
+ if (event.type == EventType.BUTTON_PRESS) {
+ int dest_x, dest_y;
+ bool ret = search_box.translate_coordinates(this, 0, 0, out dest_x, out dest_y);
+ int geometry_x, geometry_y, geometry_width, geometry_height;
+ this.get_window().get_geometry(out geometry_x, out geometry_y, out geometry_width, out geometry_height);
+ if (ret && event.button.x_root - geometry_x < dest_x || event.button.y_root - geometry_y < dest_y) {
+ close_search();
+ }
+ } else if (event.type == EventType.KEY_RELEASE) {
+ if (event.key.keyval == Gdk.Key.Escape) {
+ close_search();
+ }
+ }
+ return false;
+ });
+
paned.bind_property("position", headerbar_paned, "position", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
focus_in_event.connect(on_focus_in_event);
@@ -50,38 +95,60 @@ public class UnifiedWindow : Window {
accounts_placeholder.primary_button.clicked.connect(() => { get_application().activate_action("accounts", null); });
conversations_placeholder.primary_button.clicked.connect(() => { get_application().activate_action("add_chat", null); });
conversations_placeholder.secondary_button.clicked.connect(() => { get_application().activate_action("add_conference", null); });
- filterable_conversation_list.conversation_list.conversation_selected.connect(on_conversation_selected);
- conversation_list_titlebar.conversation_opened.connect(on_conversation_selected);
+ filterable_conversation_list.conversation_list.conversation_selected.connect((conversation) => on_conversation_selected(conversation));
+ conversation_list_titlebar.conversation_opened.connect((conversation) => on_conversation_selected(conversation));
check_stack();
}
- public void on_conversation_selected(Conversation conversation) {
+ private void reset_search_entry() {
+ if (conversation_frame.conversation != null) {
+ switch (conversation.type_) {
+ case Conversation.Type.CHAT:
+ case Conversation.Type.GROUPCHAT_PM:
+ search_box.search_entry.text = @"with:$(conversation.counterpart) ";
+ break;
+ case Conversation.Type.GROUPCHAT:
+ search_box.search_entry.text = @"in:$(conversation.counterpart) ";
+ break;
+ }
+ }
+ }
+
+ public void on_conversation_selected(Conversation conversation, bool do_reset_search = true, bool default_initialize_conversation = true) {
if (this.conversation == null || !this.conversation.equals(conversation)) {
this.conversation = conversation;
stream_interactor.get_module(ChatInteraction.IDENTITY).on_conversation_selected(conversation);
conversation.active = true; // only for conversation_selected
filterable_conversation_list.conversation_list.on_conversation_selected(conversation); // only for conversation_opened
+ if (do_reset_search) {
+ reset_search_entry();
+ }
chat_input.initialize_for_conversation(conversation);
- conversation_frame.initialize_for_conversation(conversation);
+ if (default_initialize_conversation) {
+ conversation_frame.initialize_for_conversation(conversation);
+ }
conversation_titlebar.initialize_for_conversation(conversation);
}
}
+ private void close_search() {
+ conversation_titlebar.search_button.active = false;
+ search_revealer.reveal_child = false;
+ }
+
private void setup_unified() {
- chat_input = new ChatInput.View(stream_interactor) { visible=true };
- conversation_frame = new ConversationSummary.ConversationView(stream_interactor) { visible=true };
- filterable_conversation_list = new ConversationSelector.View(stream_interactor) { visible=true };
-
- Grid grid = new Grid() { orientation=Orientation.VERTICAL, visible=true };
- grid.get_style_context().add_class("dino-conversation");
- grid.add(conversation_frame);
- grid.add(chat_input);
-
- paned.set_position(300);
- paned.pack1(filterable_conversation_list, false, false);
- paned.pack2(grid, true, false);
+ Builder builder = new Builder.from_resource("/im/dino/Dino/unified_main_content.ui");
+ paned = (Paned) builder.get_object("paned");
+ chat_input = ((ChatInput.View) builder.get_object("chat_input")).init(stream_interactor);
+ conversation_frame = ((ConversationSummary.ConversationView) builder.get_object("conversation_frame")).init(stream_interactor);
+ filterable_conversation_list = ((ConversationSelector.View) builder.get_object("conversation_list")).init(stream_interactor);
+ goto_end_revealer = (Revealer) builder.get_object("goto_end_revealer");
+ goto_end_button = (Button) builder.get_object("goto_end_button");
+ search_box = ((GlobalSearch) builder.get_object("search_box")).init(stream_interactor);
+ search_revealer = (Revealer) builder.get_object("search_revealer");
+ search_entry = (SearchEntry) builder.get_object("search_entry");
}
private void setup_headerbar() {
diff --git a/main/src/ui/util/data_forms.vala b/main/src/ui/util/data_forms.vala
new file mode 100644
index 00000000..11308462
--- /dev/null
+++ b/main/src/ui/util/data_forms.vala
@@ -0,0 +1,57 @@
+using Gee;
+using Gtk;
+
+using Dino.Entities;
+using Xmpp.Xep;
+
+namespace Dino.Ui.Util {
+
+public static Widget? get_data_form_fild_widget(DataForms.DataForm.Field field) {
+ if (field.type_ == null) return null;
+ switch (field.type_) {
+ case DataForms.DataForm.Type.BOOLEAN:
+ DataForms.DataForm.BooleanField boolean_field = field as DataForms.DataForm.BooleanField;
+ Switch sw = new Switch() { active=boolean_field.value, valign=Align.CENTER, visible=true };
+ sw.state_set.connect((state) => {
+ boolean_field.value = state;
+ return false;
+ });
+ return sw;
+ case DataForms.DataForm.Type.JID_MULTI:
+ return null;
+ case DataForms.DataForm.Type.LIST_SINGLE:
+ DataForms.DataForm.ListSingleField list_single_field = field as DataForms.DataForm.ListSingleField;
+ ComboBoxText combobox = new ComboBoxText() { valign=Align.CENTER, visible=true };
+ for (int i = 0; i < list_single_field.options.size; i++) {
+ DataForms.DataForm.Option option = list_single_field.options[i];
+ combobox.append(option.value, option.label);
+ if (option.value == list_single_field.value) combobox.active = i;
+ }
+ combobox.changed.connect(() => {
+ list_single_field.value = combobox.get_active_id();
+ });
+ return combobox;
+ case DataForms.DataForm.Type.LIST_MULTI:
+ return null;
+ case DataForms.DataForm.Type.TEXT_PRIVATE:
+ DataForms.DataForm.TextPrivateField text_private_field = field as DataForms.DataForm.TextPrivateField;
+ Entry entry = new Entry() { text=text_private_field.value ?? "", valign=Align.CENTER, visible=true, visibility=false };
+ entry.key_release_event.connect(() => {
+ text_private_field.value = entry.text;
+ return false;
+ });
+ return entry;
+ case DataForms.DataForm.Type.TEXT_SINGLE:
+ DataForms.DataForm.TextSingleField text_single_field = field as DataForms.DataForm.TextSingleField;
+ Entry entry = new Entry() { text=text_single_field.value ?? "", valign=Align.CENTER, visible=true };
+ entry.key_release_event.connect(() => {
+ text_single_field.value = entry.text;
+ return false;
+ });
+ return entry;
+ default:
+ return null;
+ }
+}
+
+}
diff --git a/main/src/ui/util/helper.vala b/main/src/ui/util/helper.vala
index 3cadfffb..e51b8344 100644
--- a/main/src/ui/util/helper.vala
+++ b/main/src/ui/util/helper.vala
@@ -59,7 +59,13 @@ public static string get_conversation_display_name(StreamInteractor stream_inter
}
public static string get_display_name(StreamInteractor stream_interactor, Jid jid, Account account) {
- if (stream_interactor.get_module(MucManager.IDENTITY).is_groupchat_occupant(jid, account)) {
+ if (stream_interactor.get_module(MucManager.IDENTITY).is_groupchat(jid, account)) {
+ string room_name = stream_interactor.get_module(MucManager.IDENTITY).get_room_name(account, jid);
+ if (room_name != null && room_name != jid.localpart) {
+ return room_name;
+ }
+ return jid.bare_jid.to_string();
+ } else if (stream_interactor.get_module(MucManager.IDENTITY).is_groupchat_occupant(jid, account)) {
return jid.resourcepart;
} else {
if (jid.equals_bare(account.bare_jid)) {
@@ -118,10 +124,6 @@ public static void force_background(Gtk.Widget widget, string color, string sele
force_css(widget, force_background_css.printf(selector, color));
}
-public static void force_base_background(Gtk.Widget widget, string selector = "*") {
- force_background(widget, "@theme_base_color", selector);
-}
-
public static void force_color(Gtk.Widget widget, string color, string selector = "*") {
force_css(widget, force_color_css.printf(selector, color));
}
@@ -142,4 +144,63 @@ public static bool is_24h_format() {
return settings_format == "24h" || p_format == " ";
}
+public static string parse_add_markup(string s_, string? highlight_word, bool parse_links, bool parse_text_markup, bool already_escaped_ = false) {
+ string s = s_;
+ bool already_escaped = already_escaped_;
+
+ if (parse_links) {
+ Regex url_regex = new Regex("""(?i)\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))""");
+ MatchInfo match_info;
+ url_regex.match(s.down(), 0, out match_info);
+ if (match_info.matches()) {
+ int start, end;
+ match_info.fetch_pos(0, out start, out end);
+ string link = s[start:end];
+ return parse_add_markup(s[0:start], highlight_word, parse_links, parse_text_markup, already_escaped) +
+ "<a href=\"" + Markup.escape_text(link) + "\">" + parse_add_markup(link, highlight_word, false, false, already_escaped) + "</a>" +
+ parse_add_markup(s[end:s.length], highlight_word, parse_links, parse_text_markup, already_escaped);
+ }
+ }
+
+ if (!already_escaped) {
+ s = Markup.escape_text(s);
+ already_escaped = true;
+ }
+
+ if (highlight_word != null) {
+ Regex highlight_regex = new Regex("\\b" + Regex.escape_string(highlight_word.down()) + "\\b");
+ MatchInfo match_info;
+ highlight_regex.match(s.down(), 0, out match_info);
+ if (match_info.matches()) {
+ int start, end;
+ match_info.fetch_pos(0, out start, out end);
+ return parse_add_markup(s[0:start], highlight_word, parse_links, parse_text_markup, already_escaped) +
+ "<b>" + s[start:end] + "</b>" +
+ parse_add_markup(s[end:s.length], highlight_word, parse_links, parse_text_markup, already_escaped);
+ }
+ }
+
+ if (parse_text_markup) {
+ string[] markup_string = new string[]{"`", "_", "*"};
+ string[] convenience_tag = new string[]{"tt", "i", "b"};
+
+ for (int i = 0; i < markup_string.length; i++) {
+ Regex regex = new Regex(Regex.escape_string(markup_string[i]) + ".+" + Regex.escape_string(markup_string[i]));
+ MatchInfo match_info;
+ regex.match(s.down(), 0, out match_info);
+ if (match_info.matches()) {
+ int start, end;
+ match_info.fetch_pos(0, out start, out end);
+ start += markup_string[i].length;
+ end -= markup_string[i].length;
+ return parse_add_markup(s[0:start], highlight_word, parse_links, parse_text_markup, already_escaped) +
+ @"<$(convenience_tag[i])>" + s[start:end] + @"</$(convenience_tag[i])>" +
+ parse_add_markup(s[end:s.length], highlight_word, parse_links, parse_text_markup, already_escaped);
+ }
+ }
+ }
+
+ return s;
+}
+
}
diff --git a/plugins/http-files/src/file_provider.vala b/plugins/http-files/src/file_provider.vala
index b647cdbb..6f4b19f4 100644
--- a/plugins/http-files/src/file_provider.vala
+++ b/plugins/http-files/src/file_provider.vala
@@ -26,8 +26,8 @@ public class FileProvider : Dino.FileProvider, Object {
private class ReceivedMessageListener : MessageListener {
- public string[] after_actions_const = new string[]{ };
- public override string action_group { get { return "DECRYPT"; } }
+ public string[] after_actions_const = new string[]{ "STORE" };
+ public override string action_group { get { return ""; } }
public override string[] after_actions { get { return after_actions_const; } }
private FileProvider outer;
@@ -90,7 +90,13 @@ public class FileProvider : Dino.FileProvider, Object {
file_transfer.state = FileTransfer.State.NOT_STARTED;
file_transfer.provider = 0;
file_transfer.info = message.id.to_string();
- file_incoming(file_transfer);
+ file_incoming(file_transfer, conversation);
+
+ ContentItem? content_item = stream_interactor.get_module(ContentItemStore.IDENTITY).get_item(conversation, 1, message.id);
+ if (content_item != null) {
+ stream_interactor.get_module(ContentItemStore.IDENTITY).set_item_hide(content_item, true);
+ }
+
success = true;
Idle.add((owned)callback);
});
diff --git a/plugins/http-files/src/manager.vala b/plugins/http-files/src/manager.vala
index 7335b89a..78697f9c 100644
--- a/plugins/http-files/src/manager.vala
+++ b/plugins/http-files/src/manager.vala
@@ -40,6 +40,11 @@ public class Manager : StreamInteractionModule, FileSender, Object {
message.encryption = Encryption.NONE;
stream_interactor.get_module(MessageProcessor.IDENTITY).send_message(message, conversation);
file_transfer.info = message.id.to_string();
+
+ ContentItem? content_item = stream_interactor.get_module(ContentItemStore.IDENTITY).get_item(conversation, 1, message.id);
+ if (content_item != null) {
+ stream_interactor.get_module(ContentItemStore.IDENTITY).set_item_hide(content_item, true);
+ }
},
(stream, error_str) => {
print(@"Failed getting upload url + $error_str\n");
@@ -81,28 +86,25 @@ public class Manager : StreamInteractionModule, FileSender, Object {
}
}
-public class FileMessageFilterDisplay : Plugins.MessageDisplayProvider, Object {
- public string id { get; set; default="file_message_filter"; }
- public double priority { get; set; default=10; }
-
+public class FileMessageFilter : ContentFilter, Object {
public Database db;
- public FileMessageFilterDisplay(Dino.Database db) {
+ public FileMessageFilter(Dino.Database db) {
this.db = db;
}
- public bool can_display(Entities.Message? message) {
- return message_is_file(db, message);
- }
-
- public Plugins.MetaConversationItem? get_item(Entities.Message message, Conversation conversation) {
- return null;
+ public bool discard(ContentItem content_item) {
+ if (content_item.type_ == MessageItem.TYPE) {
+ MessageItem message_item = content_item as MessageItem;
+ return message_is_file(db, message_item.message);
+ }
+ return false;
}
}
private bool message_is_file(Database db, Entities.Message message) {
- Qlite.QueryBuilder builder = db.file_transfer.select().with(db.file_transfer.info, "=", message.id.to_string());
- Qlite.QueryBuilder builder2 = db.file_transfer.select().with(db.file_transfer.info, "=", message.body);
+ Qlite.QueryBuilder builder = db.file_transfer.select({db.file_transfer.id}).with(db.file_transfer.info, "=", message.id.to_string());
+ Qlite.QueryBuilder builder2 = db.file_transfer.select({db.file_transfer.id}).with(db.file_transfer.info, "=", message.body);
return builder.count() > 0 || builder2.count() > 0;
}
diff --git a/plugins/http-files/src/plugin.vala b/plugins/http-files/src/plugin.vala
index 1fc0c9fd..bd136f31 100644
--- a/plugins/http-files/src/plugin.vala
+++ b/plugins/http-files/src/plugin.vala
@@ -19,7 +19,7 @@ public class Plugin : RootInterface, Object {
});
app.stream_interactor.get_module(FileManager.IDENTITY).add_provider(file_provider);
- app.plugin_registry.register_message_display(new FileMessageFilterDisplay(app.db));
+ app.stream_interactor.get_module(ContentItemStore.IDENTITY).add_filter(new FileMessageFilter(app.db));
}
public void shutdown() {
diff --git a/plugins/notification-sound/src/plugin.vala b/plugins/notification-sound/src/plugin.vala
index ba251434..081fd1c3 100644
--- a/plugins/notification-sound/src/plugin.vala
+++ b/plugins/notification-sound/src/plugin.vala
@@ -9,7 +9,7 @@ public class Plugin : RootInterface, Object {
this.app = app;
Canberra.Context.create(out sound_context);
- app.stream_interactor.get_module(NotificationEvents.IDENTITY).notify_message.connect((message, conversation) => {
+ app.stream_interactor.get_module(NotificationEvents.IDENTITY).notify_content_item.connect((item, conversation) => {
sound_context.play(0, Canberra.PROP_EVENT_ID, "message-new-instant", Canberra.PROP_EVENT_DESCRIPTION, "New Dino message");
});
}
diff --git a/plugins/omemo/po/LINGUAS b/plugins/omemo/po/LINGUAS
index ab999840..978c5744 100644
--- a/plugins/omemo/po/LINGUAS
+++ b/plugins/omemo/po/LINGUAS
@@ -1,9 +1,12 @@
+ar
ca
de
en
es
eu
fr
+gl
+hu
it
lb
nb
diff --git a/plugins/omemo/po/ar.po b/plugins/omemo/po/ar.po
new file mode 100644
index 00000000..cb7e0d1f
--- /dev/null
+++ b/plugins/omemo/po/ar.po
@@ -0,0 +1,63 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-10-23 17:22+0000\n"
+"Last-Translator: ButterflyOfFire <ButterflyOfFire@protonmail.com>\n"
+"Language-Team: Arabic <https://hosted.weblate.org/projects/dino/plugin-omemo/"
+"ar/>\n"
+"Language: ar\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
+"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
+"X-Generator: Weblate 3.3-dev\n"
+
+#: plugins/omemo/src/account_settings_widget.vala:42
+#: plugins/omemo/src/account_settings_widget.vala:45
+#: plugins/omemo/data/account_settings_dialog.ui:19
+msgid "Own fingerprint"
+msgstr "بصمتك الخاصة"
+
+#: plugins/omemo/src/account_settings_widget.vala:42
+msgid "Will be generated on first connect"
+msgstr "سيتم توليدها عند أول اتصال"
+
+#: plugins/omemo/src/contact_details_provider.vala:31
+msgid "Encryption"
+msgstr "التشفير"
+
+#: plugins/omemo/src/contact_details_provider.vala:31
+#, c-format
+msgid "%d OMEMO device"
+msgid_plural "%d OMEMO devices"
+msgstr[0] ""
+msgstr[1] "%d جهاز أوميمو"
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] "%d أجهزة أوميمو"
+
+#: plugins/omemo/src/account_settings_dialog.vala:35
+#, c-format
+msgid "Unknown device (0x%.8x)"
+msgstr "جهاز مجهول (0x%.8x)"
+
+#: plugins/omemo/data/account_settings_dialog.ui:5
+msgid "OMEMO Keys"
+msgstr "مفاتيح أوميمو"
+
+#: plugins/omemo/data/account_settings_dialog.ui:88
+msgid "Other devices"
+msgstr "أجهزة أخرى"
+
+#: plugins/omemo/data/account_settings_dialog.ui:112
+msgid "- None -"
+msgstr "- لا شيء -"
diff --git a/plugins/omemo/po/ca.po b/plugins/omemo/po/ca.po
index 277a50da..f974fce7 100644
--- a/plugins/omemo/po/ca.po
+++ b/plugins/omemo/po/ca.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dino-omemo 20180123\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-01-24 11:21+0100\n"
"Last-Translator: Jordi Mallach <jordi@mallach.net>\n"
"Language-Team: Catalan <ca@dodds.net>\n"
diff --git a/plugins/omemo/po/de.po b/plugins/omemo/po/de.po
index 168cdc34..de39ec53 100644
--- a/plugins/omemo/po/de.po
+++ b/plugins/omemo/po/de.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dino-omemo-0.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2017-11-17 21:03+0000\n"
"Last-Translator: fiaxh <weblate@mx.ax.lt>\n"
"Language-Team: German <https://hosted.weblate.org/projects/dino/plugin-omemo/"
diff --git a/plugins/omemo/po/dino-omemo.pot b/plugins/omemo/po/dino-omemo.pot
index 042e2d64..3e96437a 100644
--- a/plugins/omemo/po/dino-omemo.pot
+++ b/plugins/omemo/po/dino-omemo.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/plugins/omemo/po/en.po b/plugins/omemo/po/en.po
index 8c059c72..0941effe 100644
--- a/plugins/omemo/po/en.po
+++ b/plugins/omemo/po/en.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dino-omemo-0.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/plugins/omemo/po/es.po b/plugins/omemo/po/es.po
index 45a6ed19..8f0b9b13 100644
--- a/plugins/omemo/po/es.po
+++ b/plugins/omemo/po/es.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2017-11-18 07:32+0000\n"
"Last-Translator: sergio <srg.dev@posteo.net>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/dino/plugin-"
diff --git a/plugins/omemo/po/eu.po b/plugins/omemo/po/eu.po
index ce17cf87..8475ff48 100644
--- a/plugins/omemo/po/eu.po
+++ b/plugins/omemo/po/eu.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2017-11-22 16:39+0000\n"
"Last-Translator: Aitor Beriain <beriain@bitmessage.ch>\n"
"Language-Team: Basque <https://hosted.weblate.org/projects/dino/plugin-omemo/"
diff --git a/plugins/omemo/po/fr.po b/plugins/omemo/po/fr.po
index 6b0b85be..fa2a9554 100644
--- a/plugins/omemo/po/fr.po
+++ b/plugins/omemo/po/fr.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
-"PO-Revision-Date: 2018-01-02 20:13+0000\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-10-22 04:29+0000\n"
"Last-Translator: fiaxh <weblate@mx.ax.lt>\n"
"Language-Team: French <https://hosted.weblate.org/projects/dino/plugin-omemo/"
"fr/>\n"
@@ -16,11 +16,12 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 2.19-dev\n"
+"X-Generator: Weblate 3.3-dev\n"
#: plugins/omemo/src/account_settings_widget.vala:42
#: plugins/omemo/src/account_settings_widget.vala:45
#: plugins/omemo/data/account_settings_dialog.ui:19
+#, fuzzy
msgid "Own fingerprint"
msgstr "Notre empreinte de clé"
diff --git a/plugins/omemo/po/gl.po b/plugins/omemo/po/gl.po
new file mode 100644
index 00000000..4b87ef0a
--- /dev/null
+++ b/plugins/omemo/po/gl.po
@@ -0,0 +1,58 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-09-29 03:26+0000\n"
+"Last-Translator: Xosé M <xosem@disroot.org>\n"
+"Language-Team: Galician <https://hosted.weblate.org/projects/dino/plugin-"
+"omemo/gl/>\n"
+"Language: gl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 3.2-dev\n"
+
+#: plugins/omemo/src/account_settings_widget.vala:42
+#: plugins/omemo/src/account_settings_widget.vala:45
+#: plugins/omemo/data/account_settings_dialog.ui:19
+msgid "Own fingerprint"
+msgstr "Pegada propia"
+
+#: plugins/omemo/src/account_settings_widget.vala:42
+msgid "Will be generated on first connect"
+msgstr "Crearase na primeira conexión"
+
+#: plugins/omemo/src/contact_details_provider.vala:31
+msgid "Encryption"
+msgstr "Cifrado"
+
+#: plugins/omemo/src/contact_details_provider.vala:31
+#, c-format
+msgid "%d OMEMO device"
+msgid_plural "%d OMEMO devices"
+msgstr[0] "%d dispositivo OMEMO"
+msgstr[1] "%d dispositivos OMEMO"
+
+#: plugins/omemo/src/account_settings_dialog.vala:35
+#, c-format
+msgid "Unknown device (0x%.8x)"
+msgstr "Dispositivo descoñecido (0x%.8x)"
+
+#: plugins/omemo/data/account_settings_dialog.ui:5
+msgid "OMEMO Keys"
+msgstr "Chaves OMEMO"
+
+#: plugins/omemo/data/account_settings_dialog.ui:88
+msgid "Other devices"
+msgstr "Outros dispositivos"
+
+#: plugins/omemo/data/account_settings_dialog.ui:112
+msgid "- None -"
+msgstr "-Nada-"
diff --git a/plugins/omemo/po/hu.po b/plugins/omemo/po/hu.po
new file mode 100644
index 00000000..6b9c3608
--- /dev/null
+++ b/plugins/omemo/po/hu.po
@@ -0,0 +1,58 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-08-31 08:36+0000\n"
+"Last-Translator: notramo <notramo@vipmail.hu>\n"
+"Language-Team: Hungarian <https://hosted.weblate.org/projects/dino/plugin-"
+"omemo/hu/>\n"
+"Language: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 3.2-dev\n"
+
+#: plugins/omemo/src/account_settings_widget.vala:42
+#: plugins/omemo/src/account_settings_widget.vala:45
+#: plugins/omemo/data/account_settings_dialog.ui:19
+msgid "Own fingerprint"
+msgstr "Saját ujjlenyomat"
+
+#: plugins/omemo/src/account_settings_widget.vala:42
+msgid "Will be generated on first connect"
+msgstr "Az első csatlakozáskor lesz létrehozva"
+
+#: plugins/omemo/src/contact_details_provider.vala:31
+msgid "Encryption"
+msgstr "Titkosítás"
+
+#: plugins/omemo/src/contact_details_provider.vala:31
+#, c-format
+msgid "%d OMEMO device"
+msgid_plural "%d OMEMO devices"
+msgstr[0] "%d OMEMO eszköz"
+msgstr[1] "%d OMEMO eszköz"
+
+#: plugins/omemo/src/account_settings_dialog.vala:35
+#, c-format
+msgid "Unknown device (0x%.8x)"
+msgstr "Ismeretlen eszköz (0x%.8x)"
+
+#: plugins/omemo/data/account_settings_dialog.ui:5
+msgid "OMEMO Keys"
+msgstr "OMEMO kulcsok"
+
+#: plugins/omemo/data/account_settings_dialog.ui:88
+msgid "Other devices"
+msgstr "További eszközök"
+
+#: plugins/omemo/data/account_settings_dialog.ui:112
+msgid "- None -"
+msgstr "- Nincs -"
diff --git a/plugins/omemo/po/it.po b/plugins/omemo/po/it.po
index fe5ff9b5..0cbb8940 100644
--- a/plugins/omemo/po/it.po
+++ b/plugins/omemo/po/it.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dino-omemo-0.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2017-12-11 00:48+0000\n"
"Last-Translator: M <d.pitrolo@gmx.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/dino/plugin-"
diff --git a/plugins/omemo/po/lb.po b/plugins/omemo/po/lb.po
index 21190b6f..2cbafcac 100644
--- a/plugins/omemo/po/lb.po
+++ b/plugins/omemo/po/lb.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dino-omemo-0.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2017-11-18 12:11+0000\n"
"Last-Translator: Dennis Fink <dennis.fink@c3l.lu>\n"
"Language-Team: Luxembourgish <https://hosted.weblate.org/projects/dino/"
diff --git a/plugins/omemo/po/nb.po b/plugins/omemo/po/nb.po
index 378916b7..0c11c3c0 100644
--- a/plugins/omemo/po/nb.po
+++ b/plugins/omemo/po/nb.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2017-11-18 00:21+0000\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/dino/"
diff --git a/plugins/omemo/po/nl.po b/plugins/omemo/po/nl.po
index ea893d5e..b33d9d24 100644
--- a/plugins/omemo/po/nl.po
+++ b/plugins/omemo/po/nl.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dino-omemo-0.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2017-11-17 20:52+0000\n"
"Last-Translator: Nathan Follens <nathan@email.is>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/dino/plugin-omemo/"
diff --git a/plugins/omemo/po/nl_BE.po b/plugins/omemo/po/nl_BE.po
index 7194ed85..036439e7 100644
--- a/plugins/omemo/po/nl_BE.po
+++ b/plugins/omemo/po/nl_BE.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-06-18 12:37+0000\n"
"Last-Translator: Nathan Follens <nthn@unseen.is>\n"
"Language-Team: Flemish <https://hosted.weblate.org/projects/dino/plugin-"
diff --git a/plugins/omemo/po/pl.po b/plugins/omemo/po/pl.po
index 83de1c5b..30882060 100644
--- a/plugins/omemo/po/pl.po
+++ b/plugins/omemo/po/pl.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-01-31 18:58+0000\n"
"Last-Translator: Andrzej Czerniak <andrzej.czerniak@gmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/dino/plugin-omemo/"
diff --git a/plugins/omemo/po/ro.po b/plugins/omemo/po/ro.po
index 13b84630..71afd33e 100644
--- a/plugins/omemo/po/ro.po
+++ b/plugins/omemo/po/ro.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-01-12 23:09+0000\n"
"Last-Translator: Licaon Kter <licaon.kter@protonmail.com>\n"
"Language-Team: Romanian <https://hosted.weblate.org/projects/dino/plugin-"
diff --git a/plugins/omemo/po/ru.po b/plugins/omemo/po/ru.po
index a89ed150..41148209 100644
--- a/plugins/omemo/po/ru.po
+++ b/plugins/omemo/po/ru.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-05-01 23:41+0000\n"
"Last-Translator: Alexander <ilabdsf@gmail.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/dino/plugin-"
diff --git a/plugins/omemo/po/zh_Hans.po b/plugins/omemo/po/zh_Hans.po
index 5557c861..7ae0560d 100644
--- a/plugins/omemo/po/zh_Hans.po
+++ b/plugins/omemo/po/zh_Hans.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dino-omemo-0.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-05-08 09:39+0000\n"
"Last-Translator: fiaxh <weblate@mx.ax.lt>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
diff --git a/plugins/openpgp/po/LINGUAS b/plugins/openpgp/po/LINGUAS
index ab999840..978c5744 100644
--- a/plugins/openpgp/po/LINGUAS
+++ b/plugins/openpgp/po/LINGUAS
@@ -1,9 +1,12 @@
+ar
ca
de
en
es
eu
fr
+gl
+hu
it
lb
nb
diff --git a/plugins/openpgp/po/ar.po b/plugins/openpgp/po/ar.po
new file mode 100644
index 00000000..e6953e95
--- /dev/null
+++ b/plugins/openpgp/po/ar.po
@@ -0,0 +1,55 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-10-23 17:22+0000\n"
+"Last-Translator: ButterflyOfFire <ButterflyOfFire@protonmail.com>\n"
+"Language-Team: Arabic <https://hosted.weblate.org/projects/dino/plugin-"
+"openpgp/ar/>\n"
+"Language: ar\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
+"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
+"X-Generator: Weblate 3.3-dev\n"
+
+#: plugins/openpgp/src/account_settings_widget.vala:60
+#: plugins/openpgp/src/account_settings_widget.vala:64
+#: plugins/openpgp/src/account_settings_widget.vala:93
+msgid "Key publishing disabled"
+msgstr "نشر المفاتيح معطل"
+
+#: plugins/openpgp/src/account_settings_widget.vala:60
+msgid "Error in GnuPG"
+msgstr "خطأ في GnuPG"
+
+#: plugins/openpgp/src/account_settings_widget.vala:64
+msgid "No keys available. Generate one!"
+msgstr "لا مفتاح متوفر. قم بتوليد واحد !"
+
+#: plugins/openpgp/src/account_settings_widget.vala:93
+msgid "Select key"
+msgstr "اختيار مفتاح"
+
+#: plugins/openpgp/src/account_settings_widget.vala:106
+msgid "Loading…"
+msgstr "جارٍ التحميل…"
+
+#: plugins/openpgp/src/account_settings_widget.vala:106
+msgid "Querying GnuPG"
+msgstr "استعلام GnuPG"
+
+#: plugins/openpgp/src/contact_details_provider.vala:28
+msgid "Key not in keychain"
+msgstr "المفتاح ليس في سلسلة المفاتيح"
+
+#: plugins/openpgp/src/contact_details_provider.vala:30
+msgid "Encryption"
+msgstr "التشفير"
diff --git a/plugins/openpgp/po/ca.po b/plugins/openpgp/po/ca.po
index a1d2fd14..687bbae5 100644
--- a/plugins/openpgp/po/ca.po
+++ b/plugins/openpgp/po/ca.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dino-openpgp 20180123\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-01-24 11:24+0100\n"
"Last-Translator: Jordi Mallach <jordi@mallach.net>\n"
"Language-Team: Catalan <ca@dodds.net>\n"
diff --git a/plugins/openpgp/po/de.po b/plugins/openpgp/po/de.po
index 3db3049f..f8a619b3 100644
--- a/plugins/openpgp/po/de.po
+++ b/plugins/openpgp/po/de.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dino-openpgp-0.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-01-24 12:15+0000\n"
"Last-Translator: fiaxh <weblate@mx.ax.lt>\n"
"Language-Team: German <https://hosted.weblate.org/projects/dino/plugin-"
diff --git a/plugins/openpgp/po/dino-openpgp.pot b/plugins/openpgp/po/dino-openpgp.pot
index c4d7c780..9222f6e1 100644
--- a/plugins/openpgp/po/dino-openpgp.pot
+++ b/plugins/openpgp/po/dino-openpgp.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/plugins/openpgp/po/en.po b/plugins/openpgp/po/en.po
index 5263ce0c..7a574d5e 100644
--- a/plugins/openpgp/po/en.po
+++ b/plugins/openpgp/po/en.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dino-openpgp-0.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
diff --git a/plugins/openpgp/po/es.po b/plugins/openpgp/po/es.po
index 07719c2d..af1cc477 100644
--- a/plugins/openpgp/po/es.po
+++ b/plugins/openpgp/po/es.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-04-13 21:39+0000\n"
"Last-Translator: mgueji <miguejim@mailbox.org>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/dino/plugin-"
diff --git a/plugins/openpgp/po/eu.po b/plugins/openpgp/po/eu.po
index cdc758b8..efb74cde 100644
--- a/plugins/openpgp/po/eu.po
+++ b/plugins/openpgp/po/eu.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-04-03 15:27+0000\n"
"Last-Translator: Aitor Beriain <beriain@bitmessage.ch>\n"
"Language-Team: Basque <https://hosted.weblate.org/projects/dino/plugin-"
diff --git a/plugins/openpgp/po/fr.po b/plugins/openpgp/po/fr.po
index 3784eb69..d57fa7f3 100644
--- a/plugins/openpgp/po/fr.po
+++ b/plugins/openpgp/po/fr.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-01-24 12:13+0000\n"
"Last-Translator: Jean-Baptiste <jean-baptiste@holcroft.fr>\n"
"Language-Team: French <https://hosted.weblate.org/projects/dino/plugin-"
diff --git a/plugins/openpgp/po/gl.po b/plugins/openpgp/po/gl.po
new file mode 100644
index 00000000..eec550c7
--- /dev/null
+++ b/plugins/openpgp/po/gl.po
@@ -0,0 +1,54 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-09-29 03:26+0000\n"
+"Last-Translator: Xosé M <xosem@disroot.org>\n"
+"Language-Team: Galician <https://hosted.weblate.org/projects/dino/plugin-"
+"openpgp/gl/>\n"
+"Language: gl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 3.2-dev\n"
+
+#: plugins/openpgp/src/account_settings_widget.vala:60
+#: plugins/openpgp/src/account_settings_widget.vala:64
+#: plugins/openpgp/src/account_settings_widget.vala:93
+msgid "Key publishing disabled"
+msgstr "Desactivada a publicación de chaves"
+
+#: plugins/openpgp/src/account_settings_widget.vala:60
+msgid "Error in GnuPG"
+msgstr "Fallo en GnuPG"
+
+#: plugins/openpgp/src/account_settings_widget.vala:64
+msgid "No keys available. Generate one!"
+msgstr "Sen chaves dispoñibles. Crear unha!"
+
+#: plugins/openpgp/src/account_settings_widget.vala:93
+msgid "Select key"
+msgstr "Escolla chave"
+
+#: plugins/openpgp/src/account_settings_widget.vala:106
+msgid "Loading…"
+msgstr "Cargando…"
+
+#: plugins/openpgp/src/account_settings_widget.vala:106
+msgid "Querying GnuPG"
+msgstr "Consultando a GnuPG"
+
+#: plugins/openpgp/src/contact_details_provider.vala:28
+msgid "Key not in keychain"
+msgstr "A chave non está no anel de chaves"
+
+#: plugins/openpgp/src/contact_details_provider.vala:30
+msgid "Encryption"
+msgstr "Cifrado"
diff --git a/plugins/openpgp/po/hu.po b/plugins/openpgp/po/hu.po
new file mode 100644
index 00000000..dcd7b951
--- /dev/null
+++ b/plugins/openpgp/po/hu.po
@@ -0,0 +1,54 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-08-31 08:38+0000\n"
+"Last-Translator: notramo <notramo@vipmail.hu>\n"
+"Language-Team: Hungarian <https://hosted.weblate.org/projects/dino/plugin-"
+"openpgp/hu/>\n"
+"Language: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 3.2-dev\n"
+
+#: plugins/openpgp/src/account_settings_widget.vala:60
+#: plugins/openpgp/src/account_settings_widget.vala:64
+#: plugins/openpgp/src/account_settings_widget.vala:93
+msgid "Key publishing disabled"
+msgstr "A kulcs publikálása kikapcsolva"
+
+#: plugins/openpgp/src/account_settings_widget.vala:60
+msgid "Error in GnuPG"
+msgstr "Hiba a GnuPG-ben"
+
+#: plugins/openpgp/src/account_settings_widget.vala:64
+msgid "No keys available. Generate one!"
+msgstr "Nincs elérhető kulcs. Generálj egyet!"
+
+#: plugins/openpgp/src/account_settings_widget.vala:93
+msgid "Select key"
+msgstr "Válassz kulcsot"
+
+#: plugins/openpgp/src/account_settings_widget.vala:106
+msgid "Loading…"
+msgstr "Betöltés…"
+
+#: plugins/openpgp/src/account_settings_widget.vala:106
+msgid "Querying GnuPG"
+msgstr "A GnuPG lekérése"
+
+#: plugins/openpgp/src/contact_details_provider.vala:28
+msgid "Key not in keychain"
+msgstr "A kulcs nincs a kulcstartóban"
+
+#: plugins/openpgp/src/contact_details_provider.vala:30
+msgid "Encryption"
+msgstr "Titkosítás"
diff --git a/plugins/openpgp/po/it.po b/plugins/openpgp/po/it.po
index 9eb21c93..20b21644 100644
--- a/plugins/openpgp/po/it.po
+++ b/plugins/openpgp/po/it.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dino-openpgp-0.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-01-24 12:18+0000\n"
"Last-Translator: fiaxh <weblate@mx.ax.lt>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/dino/plugin-"
diff --git a/plugins/openpgp/po/lb.po b/plugins/openpgp/po/lb.po
index 1e88ce84..d8ab6119 100644
--- a/plugins/openpgp/po/lb.po
+++ b/plugins/openpgp/po/lb.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dino-openpgp-0.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-01-24 12:20+0000\n"
"Last-Translator: fiaxh <weblate@mx.ax.lt>\n"
"Language-Team: Luxembourgish <https://hosted.weblate.org/projects/dino/"
diff --git a/plugins/openpgp/po/nb.po b/plugins/openpgp/po/nb.po
index c6f0513f..905f19f1 100644
--- a/plugins/openpgp/po/nb.po
+++ b/plugins/openpgp/po/nb.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2017-11-18 00:23+0000\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/dino/"
diff --git a/plugins/openpgp/po/nl.po b/plugins/openpgp/po/nl.po
index 5c3161c9..9a05fa51 100644
--- a/plugins/openpgp/po/nl.po
+++ b/plugins/openpgp/po/nl.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dino-openpgp-0.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2017-11-17 20:52+0000\n"
"Last-Translator: Nathan Follens <nathan@email.is>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/dino/plugin-"
diff --git a/plugins/openpgp/po/nl_BE.po b/plugins/openpgp/po/nl_BE.po
index 743c5c47..7749eef1 100644
--- a/plugins/openpgp/po/nl_BE.po
+++ b/plugins/openpgp/po/nl_BE.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
-"PO-Revision-Date: 2018-06-18 12:37+0000\n"
-"Last-Translator: Nathan Follens <nthn@unseen.is>\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
+"PO-Revision-Date: 2018-10-04 12:26+0000\n"
+"Last-Translator: woutersj <woutersj@gmail.com>\n"
"Language-Team: Flemish <https://hosted.weblate.org/projects/dino/plugin-"
"openpgp/nl_BE/>\n"
"Language: nl_BE\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.0.1\n"
+"X-Generator: Weblate 3.2-dev\n"
#: plugins/openpgp/src/account_settings_widget.vala:60
#: plugins/openpgp/src/account_settings_widget.vala:64
@@ -31,11 +31,11 @@ msgstr "Fout in GnuPG"
#: plugins/openpgp/src/account_settings_widget.vala:64
msgid "No keys available. Generate one!"
-msgstr "Geen sleutels beschikbaar. Genereert der enen!"
+msgstr "Geen sleutels beschikbaar. Genereer er een!"
#: plugins/openpgp/src/account_settings_widget.vala:93
msgid "Select key"
-msgstr "Selecteert ne sleutel"
+msgstr "Selecteer een sleutel"
#: plugins/openpgp/src/account_settings_widget.vala:106
msgid "Loading…"
diff --git a/plugins/openpgp/po/pl.po b/plugins/openpgp/po/pl.po
index 9b07a6da..daba9452 100644
--- a/plugins/openpgp/po/pl.po
+++ b/plugins/openpgp/po/pl.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-01-30 19:02+0000\n"
"Last-Translator: Andrzej Czerniak <andrzej.czerniak@gmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/dino/plugin-"
diff --git a/plugins/openpgp/po/ro.po b/plugins/openpgp/po/ro.po
index 090a68e9..55a5547a 100644
--- a/plugins/openpgp/po/ro.po
+++ b/plugins/openpgp/po/ro.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-01-12 23:14+0000\n"
"Last-Translator: Licaon Kter <licaon.kter@protonmail.com>\n"
"Language-Team: Romanian <https://hosted.weblate.org/projects/dino/plugin-"
diff --git a/plugins/openpgp/po/ru.po b/plugins/openpgp/po/ru.po
index 158a1943..092e6322 100644
--- a/plugins/openpgp/po/ru.po
+++ b/plugins/openpgp/po/ru.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-03-23 18:26+0000\n"
"Last-Translator: ethylmorphine <desilent@icloud.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/dino/plugin-"
diff --git a/plugins/openpgp/po/zh_Hans.po b/plugins/openpgp/po/zh_Hans.po
index 7c09eb29..9c33bb10 100644
--- a/plugins/openpgp/po/zh_Hans.po
+++ b/plugins/openpgp/po/zh_Hans.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: dino-omemo-0.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-05 09:22-0600\n"
+"POT-Creation-Date: 2018-10-23 23:56+0200\n"
"PO-Revision-Date: 2018-05-08 09:42+0000\n"
"Last-Translator: fiaxh <weblate@mx.ax.lt>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
diff --git a/qlite/src/column.vala b/qlite/src/column.vala
index 9c201885..daa6a59f 100644
--- a/qlite/src/column.vala
+++ b/qlite/src/column.vala
@@ -3,6 +3,8 @@ using Sqlite;
namespace Qlite {
public abstract class Column<T> {
+ public const string DEFALT_TABLE_NAME = "";
+
public string name { get; private set; }
public string? default { get; set; }
public int sqlite_type { get; private set; }
@@ -12,16 +14,21 @@ public abstract class Column<T> {
public virtual bool not_null { get; set; }
public long min_version { get; set; default = -1; }
public long max_version { get; set; default = long.MAX; }
+ internal Table table { get; set; }
- public abstract T get(Row row);
+ public abstract T get(Row row, string? table_name = DEFALT_TABLE_NAME);
- public virtual bool is_null(Row row) {
+ public virtual bool is_null(Row row, string? table_name = DEFALT_TABLE_NAME) {
return false;
}
internal abstract void bind(Statement stmt, int index, T value);
public string to_string() {
+ return table == null ? name : (table.name + "." + name);
+ }
+
+ public string to_column_definition() {
string res = name;
switch (sqlite_type) {
case INTEGER:
@@ -58,12 +65,12 @@ public abstract class Column<T> {
base(name, INTEGER);
}
- public override int get(Row row) {
- return (int) row.get_integer(name);
+ public override int get(Row row, string? table_name = DEFALT_TABLE_NAME) {
+ return (int) row.get_integer(name, table_name == DEFALT_TABLE_NAME ? table.name : table_name);
}
- public override bool is_null(Row row) {
- return !row.has_integer(name);
+ public override bool is_null(Row row, string? table_name = DEFALT_TABLE_NAME) {
+ return !row.has_integer(name, table_name == DEFALT_TABLE_NAME ? table.name : table_name);
}
internal override void bind(Statement stmt, int index, int value) {
@@ -76,12 +83,12 @@ public abstract class Column<T> {
base(name, INTEGER);
}
- public override long get(Row row) {
- return (long) row.get_integer(name);
+ public override long get(Row row, string? table_name = DEFALT_TABLE_NAME) {
+ return (long) row.get_integer(name, table_name == DEFALT_TABLE_NAME ? table.name : table_name);
}
- public override bool is_null(Row row) {
- return !row.has_integer(name);
+ public override bool is_null(Row row, string? table_name = DEFALT_TABLE_NAME) {
+ return !row.has_integer(name, table_name == DEFALT_TABLE_NAME ? table.name : table_name);
}
internal override void bind(Statement stmt, int index, long value) {
@@ -94,12 +101,12 @@ public abstract class Column<T> {
base(name, FLOAT);
}
- public override double get(Row row) {
- return row.get_real(name);
+ public override double get(Row row, string? table_name = DEFALT_TABLE_NAME) {
+ return row.get_real(name, table_name == DEFALT_TABLE_NAME ? table.name : table_name);
}
- public override bool is_null(Row row) {
- return !row.has_real(name);
+ public override bool is_null(Row row, string? table_name = DEFALT_TABLE_NAME) {
+ return !row.has_real(name, table_name == DEFALT_TABLE_NAME ? table.name : table_name);
}
internal override void bind(Statement stmt, int index, double value) {
@@ -112,12 +119,12 @@ public abstract class Column<T> {
base(name, TEXT);
}
- public override string? get(Row row) {
- return row.get_text(name);
+ public override string? get(Row row, string? table_name = DEFALT_TABLE_NAME) {
+ return row.get_text(name, table_name == DEFALT_TABLE_NAME ? table.name : table_name);
}
- public override bool is_null(Row row) {
- return get(row) == null;
+ public override bool is_null(Row row, string? table_name = DEFALT_TABLE_NAME) {
+ return get(row, table_name == DEFALT_TABLE_NAME ? table.name : table_name) == null;
}
internal override void bind(Statement stmt, int index, string? value) {
@@ -136,11 +143,11 @@ public abstract class Column<T> {
public override bool not_null { get { return true; } set {} }
- public override string get(Row row) {
- return (!)row.get_text(name);
+ public override string get(Row row, string? table_name = DEFALT_TABLE_NAME) {
+ return (!)row.get_text(name, table_name == DEFALT_TABLE_NAME ? table.name : table_name);
}
- public override bool is_null(Row row) {
+ public override bool is_null(Row row, string? table_name = DEFALT_TABLE_NAME) {
return false;
}
@@ -154,8 +161,8 @@ public abstract class Column<T> {
base(name, TEXT);
}
- public override bool get(Row row) {
- return row.get_text(name) == "1";
+ public override bool get(Row row, string? table_name = DEFALT_TABLE_NAME) {
+ return row.get_text(name, table_name == DEFALT_TABLE_NAME ? table.name : table_name) == "1";
}
internal override void bind(Statement stmt, int index, bool value) {
@@ -168,8 +175,8 @@ public abstract class Column<T> {
base(name, INTEGER);
}
- public override bool get(Row row) {
- return row.get_integer(name) == 1;
+ public override bool get(Row row, string? table_name = DEFALT_TABLE_NAME) {
+ return row.get_integer(name, table_name == DEFALT_TABLE_NAME ? table.name : table_name) == 1;
}
internal override void bind(Statement stmt, int index, bool value) {
diff --git a/qlite/src/database.vala b/qlite/src/database.vala
index 37a7b7f7..d13b9bc4 100644
--- a/qlite/src/database.vala
+++ b/qlite/src/database.vala
@@ -90,6 +90,11 @@ public class Database {
return new QueryBuilder(this).select(columns);
}
+ internal MatchQueryBuilder match_query(Table table) {
+ ensure_init();
+ return new MatchQueryBuilder(this, table);
+ }
+
public InsertBuilder insert() {
ensure_init();
return new InsertBuilder(this);
diff --git a/qlite/src/query_builder.vala b/qlite/src/query_builder.vala
index 915e2d2d..88f05e04 100644
--- a/qlite/src/query_builder.vala
+++ b/qlite/src/query_builder.vala
@@ -10,16 +10,22 @@ public class QueryBuilder : StatementBuilder {
private Column[] columns = {};
// FROM [...]
- private Table? table;
- private string? table_name;
+ protected Table? table;
+ protected string? table_name;
+
+ // JOIN [...]
+ private string joins = "";
// WHERE [...]
- private string selection = "1";
- private StatementBuilder.AbstractField[] selection_args = {};
+ protected string selection = "1";
+ internal StatementBuilder.AbstractField[] selection_args = {};
// ORDER BY [...]
private OrderingTerm[]? order_by_terms = {};
+ // GROUP BY [...]
+ private string? group_by_term;
+
// LIMIT [...] OFFSET [...]
private int limit_val;
private int offset_val;
@@ -30,12 +36,12 @@ public class QueryBuilder : StatementBuilder {
public QueryBuilder select(Column[] columns = {}) {
this.columns = columns;
- if (columns.length == 0) {
+ if (columns.length != 0) {
for (int i = 0; i < columns.length; i++) {
if (column_selector == "*") {
- column_selector = columns[0].name;
+ column_selector = columns[i].to_string();
} else {
- column_selector += ", " + columns[i].name;
+ column_selector += ", " + columns[i].to_string();
}
}
} else {
@@ -50,21 +56,45 @@ public class QueryBuilder : StatementBuilder {
return this;
}
- public QueryBuilder from(Table table) {
+ public virtual QueryBuilder from(Table table) {
if (this.table_name != null) error("cannot use from() multiple times.");
this.table = table;
this.table_name = table.name;
return this;
}
- public QueryBuilder from_name(string table) {
+ public virtual QueryBuilder from_name(string table) {
this.table_name = table;
return this;
}
+ public QueryBuilder outer_join_with<T>(Table table, Column<T> lhs, Column<T> rhs, string? as = null) {
+ return outer_join_on(table, @"$lhs = $rhs", as);
+ }
+
+ public QueryBuilder outer_join_on(Table table, string on, string? as = null) {
+ if (as == null) as = table.name;
+ joins += @" LEFT OUTER JOIN $(table.name) AS $as ON $on";
+ return this;
+ }
+
+ public QueryBuilder join_with<T>(Table table, Column<T> lhs, Column<T> rhs, string? as = null) {
+ return join_on(table, @"$lhs = $rhs", as);
+ }
+
+ public QueryBuilder join_on(Table table, string on, string? as = null) {
+ if (as == null) as = table.name;
+ joins += @" JOIN $(table.name) AS $as ON $on";
+ return this;
+ }
+
+ internal QueryBuilder join_name(string table_name, string on) {
+ joins += @" JOIN $table_name ON $on";
+ return this;
+ }
+
public QueryBuilder where(string selection, string[] selection_args = {}) {
- if (this.selection != "1") error("selection was already done, but where() was called.");
- this.selection = selection;
+ this.selection = @"($(this.selection)) AND ($selection)";
foreach (string arg in selection_args) {
this.selection_args += new StatementBuilder.StringField(arg);
}
@@ -74,17 +104,17 @@ public class QueryBuilder : StatementBuilder {
public QueryBuilder with<T>(Column<T> column, string comp, T value) {
if ((column.unique || column.primary_key) && comp == "=") single_result = true;
selection_args += new Field<T>(column, value);
- selection = @"($selection) AND $(column.name) $comp ?";
+ selection = @"($selection) AND $column $comp ?";
return this;
}
public QueryBuilder with_null<T>(Column<T> column) {
- selection = @"($selection) AND $(column.name) ISNULL";
+ selection = @"($selection) AND $column ISNULL";
return this;
}
public QueryBuilder without_null<T>(Column<T> column) {
- selection = @"($selection) AND $(column.name) NOT NULL";
+ selection = @"($selection) AND $column NOT NULL";
return this;
}
@@ -98,6 +128,17 @@ public class QueryBuilder : StatementBuilder {
return this;
}
+ public QueryBuilder group_by(Column[] columns) {
+ foreach(Column col in columns) {
+ if (group_by_term == null) {
+ group_by_term = col.to_string();
+ } else {
+ group_by_term += @", $col";
+ }
+ }
+ return this;
+ }
+
public QueryBuilder limit(int limit) {
if (this.limit_val != 0 && limit > this.limit_val) error("tried to increase an existing limit");
this.limit_val = limit;
@@ -135,7 +176,7 @@ public class QueryBuilder : StatementBuilder {
}
internal override Statement prepare() {
- Statement stmt = db.prepare(@"SELECT $column_selector $(table_name == null ? "" : @"FROM $((!) table_name)") WHERE $selection $(OrderingTerm.all_to_string(order_by_terms)) $(limit_val > 0 ? @" LIMIT $limit_val OFFSET $offset_val" : "")");
+ Statement stmt = db.prepare(@"SELECT $column_selector $(table_name == null ? "" : @"FROM $((!) table_name)") $joins WHERE $selection $(group_by_term == null ? "" : @"GROUP BY $group_by_term") $(OrderingTerm.all_to_string(order_by_terms)) $(limit_val > 0 ? @" LIMIT $limit_val OFFSET $offset_val" : "")");
for (int i = 0; i < selection_args.length; i++) {
selection_args[i].bind(stmt, i+1);
}
@@ -147,13 +188,13 @@ public class QueryBuilder : StatementBuilder {
}
class OrderingTerm {
- Column column;
+ Column? column;
string column_name;
string dir;
public OrderingTerm(Column column, string dir) {
this.column = column;
- this.column_name = column.name;
+ this.column_name = column.to_string();
this.dir = dir;
}
@@ -177,4 +218,21 @@ public class QueryBuilder : StatementBuilder {
}
}
+public class MatchQueryBuilder : QueryBuilder {
+ internal MatchQueryBuilder(Database db, Table table) {
+ base(db);
+ if (table.fts_columns == null) error("MATCH query on non FTS table");
+ from(table);
+ join_name(@"_fts_$table_name", @"_fts_$table_name.docid = $table_name.rowid");
+ }
+
+ public MatchQueryBuilder match(Column<string> column, string match) {
+ if (table == null) error("MATCH must occur after FROM statement");
+ if (!(column in table.fts_columns)) error("MATCH selection on non FTS column");
+ selection_args += new StatementBuilder.StringField(match);
+ selection = @"($selection) AND _fts_$table_name.$(column.name) MATCH ?";
+ return this;
+ }
+}
+
}
diff --git a/qlite/src/row.vala b/qlite/src/row.vala
index be459719..d3807f41 100644
--- a/qlite/src/row.vala
+++ b/qlite/src/row.vala
@@ -10,15 +10,21 @@ public class Row {
internal Row(Statement stmt) {
for (int i = 0; i < stmt.column_count(); i++) {
+ string column_name;
+ if (stmt.column_origin_name(i) != null) {
+ column_name = @"$(stmt.column_table_name(i)).$(stmt.column_origin_name(i))";
+ } else {
+ column_name = stmt.column_name(i);
+ }
switch(stmt.column_type(i)) {
case TEXT:
- text_map[stmt.column_name(i)] = stmt.column_text(i);
+ text_map[column_name] = stmt.column_text(i);
break;
case INTEGER:
- int_map[stmt.column_name(i)] = (long) stmt.column_int64(i);
+ int_map[column_name] = (long) stmt.column_int64(i);
break;
case FLOAT:
- real_map[stmt.column_name(i)] = stmt.column_double(i);
+ real_map[column_name] = stmt.column_double(i);
break;
}
}
@@ -28,27 +34,54 @@ public class Row {
return field[this];
}
- public string? get_text(string field) {
- if (text_map.has_key(field)) {
- return text_map[field];
+ private string field_name(string field, string? table) {
+ if (table != null) {
+ return @"$table.$field";
+ } else {
+ return field;
+ }
+ }
+
+ public string? get_text(string field, string? table = null) {
+ if (text_map.has_key(field_name(field, table))) {
+ return text_map[field_name(field, table)];
}
return null;
}
- public long get_integer(string field) {
- return int_map[field];
+ public long get_integer(string field, string? table = null) {
+ return int_map[field_name(field, table)];
+ }
+
+ public bool has_integer(string field, string? table = null) {
+ return int_map.has_key(field_name(field, table));
}
- public bool has_integer(string field) {
- return int_map.has_key(field);
+ public double get_real(string field, string? table = null, double def = 0) {
+ return real_map[field_name(field, table)] ?? def;
}
- public double get_real(string field, double def = 0) {
- return real_map[field] ?? def;
+ public bool has_real(string field, string? table = null) {
+ return real_map.has_key(field_name(field, table)) && real_map[field_name(field, table)] != null;
}
- public bool has_real(string field) {
- return real_map.has_key(field) && real_map[field] != null;
+ public string to_string() {
+ string ret = "{";
+
+ foreach (string key in text_map.keys) {
+ if (ret.length > 1) ret += ", ";
+ ret = @"$ret$key: \"$(text_map[key])\"";
+ }
+ foreach (string key in int_map.keys) {
+ if (ret.length > 1) ret += ", ";
+ ret = @"$ret$key: $(int_map[key])";
+ }
+ foreach (string key in real_map.keys) {
+ if (ret.length > 1) ret += ", ";
+ ret = @"$ret$key: $(real_map[key])";
+ }
+
+ return ret + "}";
}
}
diff --git a/qlite/src/table.vala b/qlite/src/table.vala
index 7fa2fc62..6c6ef9de 100644
--- a/qlite/src/table.vala
+++ b/qlite/src/table.vala
@@ -8,6 +8,8 @@ public class Table {
protected Column[]? columns;
private string constraints = "";
private string[] post_statements = {};
+ private string[] create_statements = {};
+ internal Column[]? fts_columns;
public Table(Database db, string name) {
this.db = db;
@@ -17,6 +19,37 @@ public class Table {
public void init(Column[] columns, string constraints = "") {
this.columns = columns;
this.constraints = constraints;
+
+ foreach(Column c in columns) {
+ c.table = this;
+ }
+ }
+
+ public void fts(Column[] columns) {
+ if (fts_columns != null) error("Only one FTS index may be used per table.");
+ fts_columns = columns;
+ string cs = "";
+ string cnames = "";
+ string cnews = "";
+ foreach (Column c in columns) {
+ cs += @", $(c.to_column_definition())";
+ cnames += @", $(c.name)";
+ cnews += @", new.$(c.name)";
+ }
+ add_create_statement(@"CREATE VIRTUAL TABLE IF NOT EXISTS _fts_$name USING fts4(tokenize=unicode61, content=\"$name\"$cs)");
+ add_post_statement(@"CREATE TRIGGER IF NOT EXISTS _fts_bu_$(name) BEFORE UPDATE ON $name BEGIN DELETE FROM _fts_$name WHERE docid=old.rowid; END");
+ add_post_statement(@"CREATE TRIGGER IF NOT EXISTS _fts_bd_$(name) BEFORE DELETE ON $name BEGIN DELETE FROM _fts_$name WHERE docid=old.rowid; END");
+ add_post_statement(@"CREATE TRIGGER IF NOT EXISTS _fts_au_$(name) AFTER UPDATE ON $name BEGIN INSERT INTO _fts_$name(docid$cnames) VALUES(new.rowid$cnews); END");
+ add_post_statement(@"CREATE TRIGGER IF NOT EXISTS _fts_ai_$(name) AFTER INSERT ON $name BEGIN INSERT INTO _fts_$name(docid$cnames) VALUES(new.rowid$cnews); END");
+ }
+
+ public void fts_rebuild() {
+ if (fts_columns == null) error("FTS not available on this table.");
+ try {
+ db.exec(@"INSERT INTO _fts_$name(_fts_$name) VALUES('rebuild');");
+ } catch (Error e) {
+ error(@"Qlite Error: Rebuilding FTS index: $(e.message)");
+ }
}
public void unique(Column[] columns, string? on_conflict = null) {
@@ -37,6 +70,10 @@ public class Table {
post_statements += stmt;
}
+ public void add_create_statement(string stmt) {
+ create_statements += stmt;
+ }
+
public void index(string index_name, Column[] columns, bool unique = false) {
string stmt = @"CREATE $(unique ? "UNIQUE" : "") INDEX IF NOT EXISTS $index_name ON $name (";
bool first = true;
@@ -58,6 +95,15 @@ public class Table {
return db.select(columns).from(this);
}
+ private MatchQueryBuilder match_query() {
+ ensure_init();
+ return db.match_query(this);
+ }
+
+ public MatchQueryBuilder match(Column<string> column, string query) {
+ return match_query().match(column, query);
+ }
+
public InsertBuilder insert() {
ensure_init();
return db.insert().into(this);
@@ -99,7 +145,7 @@ public class Table {
for (int i = 0; i < columns.length; i++) {
Column c = columns[i];
if (c.min_version <= version && c.max_version >= version) {
- sql += @"$(!first ? "," : "") $c";
+ sql += @"$(!first ? "," : "") $(c.to_column_definition())";
first = false;
}
}
@@ -107,7 +153,14 @@ public class Table {
try {
db.exec(sql);
} catch (Error e) {
- error("Qlite Error: Create table at version");
+ error(@"Qlite Error: Create table at version: $(e.message)");
+ }
+ foreach (string stmt in create_statements) {
+ try {
+ db.exec(stmt);
+ } catch (Error e) {
+ error(@"Qlite Error: Create table at version: $(e.message)");
+ }
}
}
@@ -116,9 +169,9 @@ public class Table {
foreach (Column c in columns) {
if (c.min_version <= new_version && c.max_version >= new_version && c.min_version > old_version) {
try {
- db.exec(@"ALTER TABLE $name ADD COLUMN $c");
+ db.exec(@"ALTER TABLE $name ADD COLUMN $(c.to_column_definition())");
} catch (Error e) {
- error("Qlite Error: Add columns for version");
+ error(@"Qlite Error: Add columns for version: $(e.message)");
}
}
}
@@ -146,7 +199,7 @@ public class Table {
db.exec(@"INSERT INTO $name ($column_list) SELECT $column_list FROM _$(name)_$old_version");
db.exec(@"DROP TABLE _$(name)_$old_version");
} catch (Error e) {
- error("Qlite Error: Delete volumns for version change");
+ error(@"Qlite Error: Delete columns for version change: $(e.message)");
}
}
}
@@ -156,7 +209,7 @@ public class Table {
try {
db.exec(stmt);
} catch (Error e) {
- error("Qlite Error: Post");
+ error(@"Qlite Error: Post: $(e.message)");
}
}
}
diff --git a/xmpp-vala/CMakeLists.txt b/xmpp-vala/CMakeLists.txt
index 6734f0ee..1649411e 100644
--- a/xmpp-vala/CMakeLists.txt
+++ b/xmpp-vala/CMakeLists.txt
@@ -55,6 +55,7 @@ SOURCES
"src/module/xep/0054_vcard/module.vala"
"src/module/xep/0060_pubsub.vala"
"src/module/xep/0066_out_of_band_data.vala"
+ "src/module/xep/0077_in_band_registration.vala"
"src/module/xep/0082_date_time_profiles.vala"
"src/module/xep/0084_user_avatars.vala"
"src/module/xep/0085_chat_state_notifications.vala"
diff --git a/xmpp-vala/src/module/sasl.vala b/xmpp-vala/src/module/sasl.vala
index 4a427ce0..2e87e590 100644
--- a/xmpp-vala/src/module/sasl.vala
+++ b/xmpp-vala/src/module/sasl.vala
@@ -1,9 +1,27 @@
-namespace Xmpp.PlainSasl {
+namespace Xmpp.Sasl {
private const string NS_URI = "urn:ietf:params:xml:ns:xmpp-sasl";
+ public class Flag : XmppStreamFlag {
+ public static FlagIdentity<Flag> IDENTITY = new FlagIdentity<Flag>(NS_URI, "sasl");
+ public string mechanism;
+ public string name;
+ public string password;
+ public string client_nonce;
+ public uint8[] server_signature;
+ public bool finished = false;
+
+ public override string get_ns() { return NS_URI; }
+ public override string get_id() { return IDENTITY.id; }
+ }
+
+ namespace Mechanism {
+ public const string PLAIN = "PLAIN";
+ public const string SCRAM_SHA_1 = "SCRAM-SHA-1";
+ public const string SCRAM_SHA_1_PLUS = "SCRAM-SHA-1-PLUS";
+ }
+
public class Module : XmppStreamNegotiationModule {
- public static ModuleIdentity<Module> IDENTITY = new ModuleIdentity<Module>(NS_URI, "plain_module");
- private const string MECHANISM = "PLAIN";
+ public static ModuleIdentity<Module> IDENTITY = new ModuleIdentity<Module>(NS_URI, "sasl");
public string name { get; set; }
public string password { get; set; }
@@ -26,14 +44,109 @@ namespace Xmpp.PlainSasl {
stream.received_nonza.disconnect(this.received_nonza);
}
+ private static size_t SHA1_SIZE = 20;
+
+ private static uint8[] sha1(uint8[] data) {
+ Checksum checksum = new Checksum(ChecksumType.SHA1);
+ checksum.update(data, data.length);
+ uint8[] res = new uint8[SHA1_SIZE];
+ checksum.get_digest(res, ref SHA1_SIZE);
+ return res;
+ }
+
+ private static uint8[] hmac_sha1(uint8[] key, uint8[] data) {
+ Hmac hmac = new Hmac(ChecksumType.SHA1, key);
+ hmac.update(data);
+ uint8[] res = new uint8[SHA1_SIZE];
+ hmac.get_digest(res, ref SHA1_SIZE);
+ return res;
+ }
+
+ private static uint8[] pbkdf2_sha1(string password, uint8[] salt, uint iterations) {
+ uint8[] res = new uint8[SHA1_SIZE];
+ uint8[] last = new uint8[salt.length + 4];
+ for(int i = 0; i < salt.length; i++) {
+ last[i] = salt[i];
+ }
+ last[salt.length + 3] = 1;
+ for(int i = 0; i < iterations; i++) {
+ last = hmac_sha1((uint8[]) password.to_utf8(), last);
+ xor_inplace(res, last);
+ }
+ return res;
+ }
+
+ private static void xor_inplace(uint8[] mix, uint8[] a2) {
+ for(int i = 0; i < mix.length; i++) {
+ mix[i] = mix[i] ^ a2[i];
+ }
+ }
+
+ private static uint8[] xor(uint8[] a1, uint8[] a2) {
+ uint8[] mix = new uint8[a1.length];
+ for(int i = 0; i < a1.length; i++) {
+ mix[i] = a1[i] ^ a2[i];
+ }
+ return mix;
+ }
+
public void received_nonza(XmppStream stream, StanzaNode node) {
if (node.ns_uri == NS_URI) {
if (node.name == "success") {
+ Flag flag = stream.get_flag(Flag.IDENTITY);
+ if (flag.mechanism == Mechanism.SCRAM_SHA_1) {
+ string confirm = (string) Base64.decode(node.get_string_content());
+ uint8[] server_signature = null;
+ foreach(string c in confirm.split(",")) {
+ string[] split = c.split("=", 2);
+ if (split.length != 2) continue;
+ switch(split[0]) {
+ case "v": server_signature = Base64.decode(split[1]); break;
+ }
+ }
+ if (server_signature == null) return;
+ if (server_signature.length != flag.server_signature.length) return;
+ for(int i = 0; i < server_signature.length; i++) {
+ if (server_signature[i] != flag.server_signature[i]) return;
+ }
+ }
stream.require_setup();
- stream.get_flag(Flag.IDENTITY).finished = true;
+ flag.password = null; // Remove password from memory
+ flag.finished = true;
} else if (node.name == "failure") {
stream.remove_flag(stream.get_flag(Flag.IDENTITY));
received_auth_failure(stream, node);
+ } else if (node.name == "challenge" && stream.has_flag(Flag.IDENTITY)) {
+ Flag flag = stream.get_flag(Flag.IDENTITY);
+ if (flag.mechanism == Mechanism.SCRAM_SHA_1) {
+ string challenge = (string) Base64.decode(node.get_string_content());
+ string? server_nonce = null;
+ uint8[] salt = null;
+ uint iterations = 0;
+ foreach(string c in challenge.split(",")) {
+ string[] split = c.split("=", 2);
+ if (split.length != 2) continue;
+ switch(split[0]) {
+ case "r": server_nonce = split[1]; break;
+ case "s": salt = Base64.decode(split[1]); break;
+ case "i": iterations = int.parse(split[1]); break;
+ }
+ }
+ if (server_nonce == null || salt == null || iterations == 0) return;
+ if (!server_nonce.has_prefix(flag.client_nonce)) return;
+ string client_final_message_bare = @"c=biws,r=$server_nonce";
+ uint8[] salted_password = pbkdf2_sha1(flag.password, salt, iterations);
+ uint8[] client_key = hmac_sha1(salted_password, (uint8[]) "Client Key".to_utf8());
+ uint8[] stored_key = sha1(client_key);
+ string auth_message = @"n=$(flag.name),r=$(flag.client_nonce),$challenge,$client_final_message_bare";
+ uint8[] client_signature = hmac_sha1(stored_key, (uint8[]) auth_message.to_utf8());
+ uint8[] client_proof = xor(client_key, client_signature);
+ uint8[] server_key = hmac_sha1(salted_password, (uint8[]) "Server Key".to_utf8());
+ flag.server_signature = hmac_sha1(server_key, (uint8[]) auth_message.to_utf8());
+ string client_final_message = @"$client_final_message_bare,p=$(Base64.encode(client_proof))";
+ stream.write(new StanzaNode.build("response", NS_URI).add_self_xmlns()
+ .put_node(new StanzaNode.text(Base64.encode((uchar[]) (client_final_message).to_utf8()))));
+ }
}
}
}
@@ -44,45 +157,53 @@ namespace Xmpp.PlainSasl {
if (!stream.has_flag(Tls.Flag.IDENTITY) || !stream.get_flag(Tls.Flag.IDENTITY).finished) return;
var mechanisms = stream.features.get_subnode("mechanisms", NS_URI);
- if (mechanisms != null) {
- bool supportsPlain = false;
- foreach (var mechanism in mechanisms.sub_nodes) {
- if (mechanism.name != "mechanism" || mechanism.ns_uri != NS_URI) continue;
- var text = mechanism.get_subnode("#text");
- if (text != null && text.val == MECHANISM) {
- supportsPlain = true;
- }
- }
- if (!supportsPlain) {
- stderr.printf("Server at %s does not support %s auth, use full-features Sasl implementation!\n", stream.remote_name.to_string(), MECHANISM);
- return;
- }
-
- if (!name.contains("@")) {
- name = "%s@%s".printf(name, stream.remote_name.to_string());
- }
- if (!use_full_name && name.contains("@")) {
- var split = name.split("@");
- if (split[1] == stream.remote_name.to_string()) {
- name = split[0];
- } else {
- use_full_name = true;
- }
+ string[] supported_mechanisms = {};
+ foreach (var mechanism in mechanisms.sub_nodes) {
+ if (mechanism.name != "mechanism" || mechanism.ns_uri != NS_URI) continue;
+ supported_mechanisms += mechanism.get_string_content();
+ }
+ if (!name.contains("@")) {
+ name = "%s@%s".printf(name, stream.remote_name.to_string());
+ }
+ if (!use_full_name && name.contains("@")) {
+ var split = name.split("@");
+ if (split[1] == stream.remote_name.to_string()) {
+ name = split[0];
+ } else {
+ use_full_name = true;
}
- var name = this.name;
- if (!use_full_name && name.contains("@")) {
- var split = name.split("@");
- if (split[1] == stream.remote_name.to_string()) {
- name = split[0];
- }
+ }
+ string name = this.name;
+ if (!use_full_name && name.contains("@")) {
+ var split = name.split("@");
+ if (split[1] == stream.remote_name.to_string()) {
+ name = split[0];
}
+ }
+ if (Mechanism.SCRAM_SHA_1 in supported_mechanisms) {
+ string normalized_password = password.normalize(-1, NormalizeMode.NFKC);
+ string client_nonce = Random.next_int().to_string("%.8x") + Random.next_int().to_string("%.8x") + Random.next_int().to_string("%.8x");
+ string initial_message = @"n=$name,r=$client_nonce";
stream.write(new StanzaNode.build("auth", NS_URI).add_self_xmlns()
- .put_attribute("mechanism", MECHANISM)
+ .put_attribute("mechanism", Mechanism.SCRAM_SHA_1)
+ .put_node(new StanzaNode.text(Base64.encode((uchar[]) ("n,,"+initial_message).to_utf8()))));
+ var flag = new Flag();
+ flag.mechanism = Mechanism.SCRAM_SHA_1;
+ flag.name = name;
+ flag.password = normalized_password;
+ flag.client_nonce = client_nonce;
+ stream.add_flag(flag);
+ } else if (Mechanism.PLAIN in supported_mechanisms) {
+ stream.write(new StanzaNode.build("auth", NS_URI).add_self_xmlns()
+ .put_attribute("mechanism", Mechanism.PLAIN)
.put_node(new StanzaNode.text(Base64.encode(get_plain_bytes(name, password)))));
var flag = new Flag();
- flag.mechanism = MECHANISM;
+ flag.mechanism = Mechanism.PLAIN;
flag.name = name;
stream.add_flag(flag);
+ } else {
+ stderr.printf("No supported mechanism provided by server at %s\n", stream.remote_name.to_string());
+ return;
}
}
@@ -108,14 +229,4 @@ namespace Xmpp.PlainSasl {
public override string get_ns() { return NS_URI; }
public override string get_id() { return IDENTITY.id; }
}
-
- public class Flag : XmppStreamFlag {
- public static FlagIdentity<Flag> IDENTITY = new FlagIdentity<Flag>(NS_URI, "sasl");
- public string mechanism;
- public string name;
- public bool finished = false;
-
- public override string get_ns() { return NS_URI; }
- public override string get_id() { return IDENTITY.id; }
- }
}
diff --git a/xmpp-vala/src/module/stanza_error.vala b/xmpp-vala/src/module/stanza_error.vala
index 51aa2629..c45ff4e3 100644
--- a/xmpp-vala/src/module/stanza_error.vala
+++ b/xmpp-vala/src/module/stanza_error.vala
@@ -36,6 +36,10 @@ namespace Xmpp {
get { return error_node.get_attribute("by"); }
}
+ public string? text {
+ get { return error_node.get_deep_string_content("urn:ietf:params:xml:ns:xmpp-stanzas:text"); }
+ }
+
public string condition {
get {
Gee.List<StanzaNode> subnodes = error_node.sub_nodes;
@@ -57,7 +61,7 @@ namespace Xmpp {
}
public StanzaNode stanza;
- private StanzaNode error_node;
+ public StanzaNode error_node;
public ErrorStanza.from_stanza(StanzaNode stanza) {
this.stanza = stanza;
diff --git a/xmpp-vala/src/module/tls.vala b/xmpp-vala/src/module/tls.vala
index 7118a321..f2d58d32 100644
--- a/xmpp-vala/src/module/tls.vala
+++ b/xmpp-vala/src/module/tls.vala
@@ -4,6 +4,7 @@ namespace Xmpp.Tls {
public class Module : XmppStreamNegotiationModule {
public static ModuleIdentity<Module> IDENTITY = new ModuleIdentity<Module>(NS_URI, "tls_module");
+ public signal void invalid_certificate(TlsCertificate peer_cert, TlsCertificateFlags errors);
public bool require { get; set; default = true; }
public bool server_supports_tls = false;
public bool server_requires_tls = false;
@@ -27,6 +28,7 @@ namespace Xmpp.Tls {
var conn = TlsClientConnection.new(io_stream, identity);
stream.reset_stream(conn);
+ conn.accept_certificate.connect(on_invalid_certificate);
var flag = stream.get_flag(Flag.IDENTITY);
flag.peer_certificate = conn.get_peer_certificate();
flag.finished = true;
@@ -56,6 +58,19 @@ namespace Xmpp.Tls {
}
}
+ public static bool on_invalid_certificate(TlsCertificate peer_cert, TlsCertificateFlags errors) {
+ string error_str = "";
+ foreach (var f in new TlsCertificateFlags[]{TlsCertificateFlags.UNKNOWN_CA, TlsCertificateFlags.BAD_IDENTITY,
+ TlsCertificateFlags.NOT_ACTIVATED, TlsCertificateFlags.EXPIRED, TlsCertificateFlags.REVOKED,
+ TlsCertificateFlags.INSECURE, TlsCertificateFlags.GENERIC_ERROR, TlsCertificateFlags.VALIDATE_ALL}) {
+ if (f in errors) {
+ error_str += @"$(f), ";
+ }
+ }
+ warning(@"Tls Certificate Errors: $(error_str)");
+ return false;
+ }
+
public override bool mandatory_outstanding(XmppStream stream) {
return require && (!stream.has_flag(Flag.IDENTITY) || !stream.get_flag(Flag.IDENTITY).finished);
}
diff --git a/xmpp-vala/src/module/xep/0004_data_forms.vala b/xmpp-vala/src/module/xep/0004_data_forms.vala
index 69c14b08..9456197c 100644
--- a/xmpp-vala/src/module/xep/0004_data_forms.vala
+++ b/xmpp-vala/src/module/xep/0004_data_forms.vala
@@ -53,7 +53,6 @@ public class DataForm {
public string? label {
get { return node.get_attribute("label", NS_URI); }
set { node.set_attribute("label", value); }
- default = null;
}
public virtual Type? type_ { get; internal set; default=null; }
public string? var {
@@ -78,7 +77,7 @@ public class DataForm {
return ret;
}
- internal string get_value_string() {
+ public string get_value_string() {
Gee.List<string> values = get_values();
return values.size > 0 ? values[0] : "";
}
@@ -197,7 +196,7 @@ public class DataForm {
// TODO text-multi
- internal DataForm.from_node(StanzaNode node, XmppStream stream, owned OnResult listener) {
+ internal DataForm.from_node(StanzaNode node, XmppStream stream, owned OnResult? listener = null) {
this.stanza_node = node;
this.stream = stream;
this.on_result = (owned)listener;
diff --git a/xmpp-vala/src/module/xep/0045_muc/module.vala b/xmpp-vala/src/module/xep/0045_muc/module.vala
index b0a22d6b..955ea89b 100644
--- a/xmpp-vala/src/module/xep/0045_muc/module.vala
+++ b/xmpp-vala/src/module/xep/0045_muc/module.vala
@@ -60,7 +60,7 @@ public class Module : XmppStreamModule {
public signal void received_occupant_jid(XmppStream stream, Jid jid, Jid? real_jid);
public signal void received_occupant_role(XmppStream stream, Jid jid, Role? role);
public signal void subject_set(XmppStream stream, string? subject, Jid jid);
- public signal void room_configuration_changed(XmppStream stream, Jid jid, StatusCode code);
+ public signal void room_name_set(XmppStream stream, Jid jid, string? room_name);
public signal void room_entered(XmppStream stream, Jid jid, string nick);
public signal void room_enter_error(XmppStream stream, Jid jid, MucEnterError? error); // TODO "?" shoudln't be necessary (vala bug), remove someday
@@ -207,6 +207,16 @@ public class Module : XmppStreamModule {
stream.get_flag(Flag.IDENTITY).set_muc_subject(message.from, subject);
subject_set(stream, subject, message.from);
}
+
+ StanzaNode? x_node = message.stanza.get_subnode("x", NS_URI_USER);
+ if (x_node != null) {
+ StanzaNode? status_node = x_node.get_subnode("status", NS_URI_USER);
+ if (status_node != null && status_node.get_attribute_int("code") == 104) {
+ // room configuration has changed (e.g. room name)
+ // https://xmpp.org/extensions/xep-0045.html#roomconfig-notify
+ query_room_info(stream, message.from.bare_jid);
+ }
+ }
}
}
@@ -320,6 +330,7 @@ public class Module : XmppStreamModule {
foreach (ServiceDiscovery.Identity identity in query_result.identities) {
if (identity.category == "conference") {
stream.get_flag(Flag.IDENTITY).set_room_name(jid, identity.name);
+ room_name_set(stream, jid, identity.name);
}
}
diff --git a/xmpp-vala/src/module/xep/0077_in_band_registration.vala b/xmpp-vala/src/module/xep/0077_in_band_registration.vala
new file mode 100644
index 00000000..1c544c18
--- /dev/null
+++ b/xmpp-vala/src/module/xep/0077_in_band_registration.vala
@@ -0,0 +1,64 @@
+using Gee;
+
+namespace Xmpp.Xep.InBandRegistration {
+
+public const string NS_URI = "jabber:iq:register";
+
+public class Module : XmppStreamNegotiationModule {
+ public static ModuleIdentity<Module> IDENTITY = new ModuleIdentity<Module>(NS_URI, "0077_in_band_registration");
+
+ public async Form? get_from_server(XmppStream stream, Jid jid) {
+ Iq.Stanza request_form_iq = new Iq.Stanza.get(new StanzaNode.build("query", NS_URI).add_self_xmlns());
+ request_form_iq.to = jid;
+ SourceFunc callback = get_from_server.callback;
+ Form? form = null;
+ stream.get_module(Iq.Module.IDENTITY).send_iq(stream, request_form_iq, (stream, response_iq) => {
+ form = new Form.from_node(stream, response_iq);
+ Idle.add((owned)callback);
+ });
+ yield;
+ return form;
+ }
+
+ public async string submit_to_server(XmppStream stream, Jid jid, Form form) {
+ StanzaNode query_node = new StanzaNode.build("query", NS_URI).add_self_xmlns();
+ query_node.put_node(form.get_submit_node());
+ Iq.Stanza iq = new Iq.Stanza.set(query_node);
+ iq.to = jid;
+ string? error_message = null;
+ SourceFunc callback = submit_to_server.callback;
+ stream.get_module(Iq.Module.IDENTITY).send_iq(stream, iq, (stream, response_iq) => {
+ if (response_iq.is_error()) {
+ ErrorStanza? error_stanza = response_iq.get_error();
+ error_message = error_stanza.text ?? "Error";
+ }
+ Idle.add((owned)callback);
+ });
+ yield;
+ return error_message;
+ }
+
+ public override bool mandatory_outstanding(XmppStream stream) { return false; }
+
+ public override bool negotiation_active(XmppStream stream) { return false; }
+
+ public override void attach(XmppStream stream) { }
+
+ public override void detach(XmppStream stream) { }
+
+ public override string get_ns() { return NS_URI; }
+ public override string get_id() { return IDENTITY.id; }
+}
+
+public class Form : DataForms.DataForm {
+ public string? oob = null;
+
+ internal Form.from_node(XmppStream stream, Iq.Stanza iq) {
+ StanzaNode? x_node = iq.stanza.get_deep_subnode(NS_URI + ":query", DataForms.NS_URI + ":x");
+ base.from_node(x_node ?? new StanzaNode.build("x", NS_URI).add_self_xmlns(), stream);
+
+ oob = iq.stanza.get_deep_string_content(NS_URI + ":query", "jabber:x:oob:x", "url");
+ }
+}
+
+}
diff --git a/xmpp-vala/src/module/xep/0368_srv_records_tls.vala b/xmpp-vala/src/module/xep/0368_srv_records_tls.vala
index 8da8ba0c..87c8e433 100644
--- a/xmpp-vala/src/module/xep/0368_srv_records_tls.vala
+++ b/xmpp-vala/src/module/xep/0368_srv_records_tls.vala
@@ -37,9 +37,10 @@ public class TlsConnectionProvider : ConnectionProvider {
SocketClient client = new SocketClient();
try {
IOStream? io_stream = yield client.connect_to_host_async(srv_target.get_hostname(), srv_target.get_port());
- io_stream = TlsClientConnection.new(io_stream, new NetworkAddress(stream.remote_name.to_string(), srv_target.get_port()));
+ TlsConnection tls_connection = TlsClientConnection.new(io_stream, new NetworkAddress(stream.remote_name.to_string(), srv_target.get_port()));
+ tls_connection.accept_certificate.connect(Tls.Module.on_invalid_certificate);
stream.add_flag(new Tls.Flag() { finished=true });
- return io_stream;
+ return tls_connection;
} catch (Error e) {
return null;
}