diff options
149 files changed, 8376 insertions, 2979 deletions
@@ -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; } |