From b3cca3938332011ef9b2454ba5a30f15863930ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Fri, 28 Jun 2019 23:38:58 -0400 Subject: Make Readline non-blocking: Use Readline's callback interface When Twinkle is running in CLI mode and is sent a "quit" command to its local socket, it will currently not respond immediately, but rather wait until the next line has been read from its standard input (issue #143). This is due to the blocking nature of readline(), which only returns once a complete line has been read. Switching to Readline's "alternate" callback interface is the first step in addressing this issue. (As a bonus, this also fixes a bug where the line pointer returned by readline() was not freed correctly.) --- src/userintf.cpp | 44 +++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/src/userintf.cpp b/src/userintf.cpp index f75a140..772184d 100644 --- a/src/userintf.cpp +++ b/src/userintf.cpp @@ -86,22 +86,29 @@ char * tw_command_generator (const char *text, int state) return ((char *)NULL); } -char *tw_readline(const char *prompt) +// Ugly hack to allow invoking methods on our object from within a C-style +// callback function. This relies on the object being a singleton. +static t_userintf *cb_user_intf; +// Callback method (a.k.a. "line handler") that will be invoked by Readline +// once a complete line has been read. +static void tw_readline_cb(char *line) { - static char *line = NULL; - if (!line) { + // EOF + cout << endl; + // Calling this from the line handler prevents one extra + // prompt from being displayed. (The duplicate call later on + // will not be an issue.) + rl_callback_handler_remove(); + + cb_user_intf->cmd_quit(); + } else { + if (*line) { + add_history(line); + cb_user_intf->exec_command(line); + } free(line); - line = NULL; - } - - line = readline(prompt); - - if (line && *line) { - add_history(line); } - - return line; } ///////////////////////////// @@ -2206,16 +2213,15 @@ void t_userintf::run(void) { read_history(sys_config->get_history_file().c_str()); stifle_history(CLI_MAX_HISTORY_LENGTH); + // Additional stuff for using the Readline callback interface + cb_user_intf = this; + rl_callback_handler_install(CLI_PROMPT, tw_readline_cb); while (!end_interface) { - char *command_line = tw_readline(CLI_PROMPT); - if (!command_line){ - cout << endl; - break; - } - - exec_command(command_line); + rl_callback_read_char(); } + + rl_callback_handler_remove(); // Terminate phone functions write_history(sys_config->get_history_file().c_str()); -- cgit v1.2.3 From cedd61a753785831f71ae5582c134c816c92700d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Sat, 29 Jun 2019 08:29:54 -0400 Subject: Make Readline non-blocking: Relay SIGWINCH to Readline When using Readline's callback interface, signals are (by default) only captured within the duration of the rl_callback_read_char() call. It is therefore expected of the application to capture SIGWINCH on its own, and notify Readline of the fact. (While it's possible to change this with rl_persistent_signal_handlers, some signals, such as SIGHUP, will still only be *processed* during that call, making it a somewhat unappealing solution. This all could be alleviated by calling rl_check_signals() periodically, but that function was only introduced in Readline 8.0, which is far too recent.) Note that we are using signal(2) and not sigaction(2), depite the various warnings that come with it, mostly because it's what is already present in the codebase. --- src/userintf.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/userintf.cpp b/src/userintf.cpp index 772184d..6534e99 100644 --- a/src/userintf.cpp +++ b/src/userintf.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include "address_book.h" #include "events.h" #include "line.h" @@ -111,6 +112,14 @@ static void tw_readline_cb(char *line) } } +// SIGWINCH handler to help us relay that information to Readline +static int sigwinch_received; +static void sigwinch_handler(int signum) +{ + sigwinch_received = 1; + signal(SIGWINCH, sigwinch_handler); +} + ///////////////////////////// // Private ///////////////////////////// @@ -2215,13 +2224,20 @@ void t_userintf::run(void) { // Additional stuff for using the Readline callback interface cb_user_intf = this; + signal(SIGWINCH, sigwinch_handler); rl_callback_handler_install(CLI_PROMPT, tw_readline_cb); while (!end_interface) { + // Relay any SIGWINCH to Readline + if (sigwinch_received) { + rl_resize_terminal(); + sigwinch_received = 0; + } rl_callback_read_char(); } rl_callback_handler_remove(); + signal(SIGWINCH, SIG_DFL); // Terminate phone functions write_history(sys_config->get_history_file().c_str()); -- cgit v1.2.3 From d26fa24087265dd4e9dccf0db261da0e6f093c8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Fri, 28 Jun 2019 23:48:04 -0400 Subject: Make Readline non-blocking: Wrap select(2) around Readline call By only invoking rl_callback_read_char() when there is actual input on stdin, we can now avoid blocking on Readline calls. --- src/userintf.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/userintf.cpp b/src/userintf.cpp index 6534e99..21888ac 100644 --- a/src/userintf.cpp +++ b/src/userintf.cpp @@ -17,9 +17,13 @@ #include #include +#include #include #include #include +#include +#include +#include #include "address_book.h" #include "events.h" #include "line.h" @@ -2228,12 +2232,30 @@ void t_userintf::run(void) { rl_callback_handler_install(CLI_PROMPT, tw_readline_cb); while (!end_interface) { + fd_set fds; + FD_ZERO(&fds); + FD_SET(fileno(rl_instream), &fds); + + int ret = select(FD_SETSIZE, &fds, NULL, NULL, NULL); + if ((ret == -1) && (errno != EINTR)) { + string msg("select() failed: "); + msg += get_error_str(errno); + ui->cb_show_msg(msg, MSG_CRITICAL); + break; + } // Relay any SIGWINCH to Readline if (sigwinch_received) { rl_resize_terminal(); sigwinch_received = 0; } - rl_callback_read_char(); + if (ret == -1) { + // errno == EINTR + continue; + } + + if (FD_ISSET(fileno(rl_instream), &fds)) { + rl_callback_read_char(); + } } rl_callback_handler_remove(); -- cgit v1.2.3 From 18f2b023bc2c1ea84e7690b604c196580ac8f110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Sat, 29 Jun 2019 08:31:08 -0400 Subject: Make Readline non-blocking: Use a self-pipe to break the Readline loop Now that we are no longer blocking on Readline calls, we can set up a self-pipe that will let us break out of the Readline loop upon receiving a "quit" command on our local socket, thus (finally) fixing issue #143. (Thanks to https://stackoverflow.com/a/27662212 for the tip!) Fixes #143 --- src/userintf.cpp | 31 +++++++++++++++++++++++++++++++ src/userintf.h | 1 + 2 files changed, 32 insertions(+) diff --git a/src/userintf.cpp b/src/userintf.cpp index 21888ac..5268a7c 100644 --- a/src/userintf.cpp +++ b/src/userintf.cpp @@ -18,12 +18,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include "address_book.h" #include "events.h" #include "line.h" @@ -1483,6 +1485,10 @@ bool t_userintf::exec_quit(const list command_list) { void t_userintf::do_quit(void) { end_interface = true; + // Signal the main thread that it should interrupt Readline + if (break_readline_loop_pipe[1] != -1) { + write(break_readline_loop_pipe[1], "X", 1); + } } bool t_userintf::exec_help(const list command_list) { @@ -2220,6 +2226,27 @@ void t_userintf::run(void) { // Initialize phone functions phone->init(); + // Set up the self-pipe used to interrupt Readline + if (pipe(break_readline_loop_pipe) == 0) { + // Mark both file descriptors as close-on-exec for good measure + for (int i = 0; i < 2; i++) { + int flags = fcntl(break_readline_loop_pipe[i], F_GETFD); + if (flags != -1) { + flags |= FD_CLOEXEC; + fcntl(break_readline_loop_pipe[i], F_SETFD, flags); + } + } + } else { + // Not fatal -- we just won't be able to interrupt Readline + string msg("pipe() failed: "); + msg += get_error_str(errno); + ui->cb_show_msg(msg, MSG_WARNING); + + // Mark both file descriptors as invalid + break_readline_loop_pipe[0] = -1; + break_readline_loop_pipe[1] = -1; + } + //Initialize GNU readline functions rl_attempted_completion_function = tw_completion; using_history(); @@ -2232,9 +2259,13 @@ void t_userintf::run(void) { rl_callback_handler_install(CLI_PROMPT, tw_readline_cb); while (!end_interface) { + // File descriptors we are watching (stdin + self-pipe) fd_set fds; FD_ZERO(&fds); FD_SET(fileno(rl_instream), &fds); + if (break_readline_loop_pipe[0] != -1) { + FD_SET(break_readline_loop_pipe[0], &fds); + } int ret = select(FD_SETSIZE, &fds, NULL, NULL, NULL); if ((ret == -1) && (errno != EINTR)) { diff --git a/src/userintf.h b/src/userintf.h index 48a4c50..2c6d96d 100644 --- a/src/userintf.h +++ b/src/userintf.h @@ -62,6 +62,7 @@ protected: private: bool end_interface; // indicates if interface loop should quit + int break_readline_loop_pipe[2]; // pipe used to interrupt Readline list all_commands; // list of all commands t_tone_gen *tone_gen; // tone generator for ringing -- cgit v1.2.3 From d358a52e6124b528fb0bc09eaf4d28c8215e07e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Sun, 30 Jun 2019 16:48:30 -0400 Subject: Always toggle window visibility when clicking on the systray icon Left-clicking on the system tray icon should always result in toggling the visibility of the main window; if the icon is visible and clickble, then the window can always be hidden via --hide, or on startup via the "Startup hidden in system tray" option. (In the latter case, this previously resulted in a hidden and inaccessible window, as reported in issue #121.) --- src/gui/mphoneform.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/gui/mphoneform.cpp b/src/gui/mphoneform.cpp index 6c447a8..b829be8 100644 --- a/src/gui/mphoneform.cpp +++ b/src/gui/mphoneform.cpp @@ -3239,12 +3239,7 @@ void MphoneForm::whatsThis() void MphoneForm::sysTrayIconClicked(QSystemTrayIcon::ActivationReason reason) { if (reason == QSystemTrayIcon::Trigger || reason == QSystemTrayIcon::DoubleClick) - { - if (sys_config->get_gui_hide_on_close()) - setVisible(!isVisible()); - else - activateWindow(); - } + setVisible(!isVisible()); } bool MphoneForm::event(QEvent * event) -- cgit v1.2.3 From 3377008db04ac8d7e4928b7abfbe84a4c694d6b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Sun, 30 Jun 2019 17:00:34 -0400 Subject: Add a "Show/Hide window" entry to the systray icon menu It's customary for applications embedding themselves in the system tray to offer a "Show/Hide window" menu entry on right-click, even for those applications which offer the same functionality via a single left-click. (Thanks to qBittorrent for the idea of using QMenu::aboutToShow to update the label of this menu entry.) --- src/gui/mphoneform.cpp | 21 ++++++++++++++++++++- src/gui/mphoneform.h | 2 ++ src/gui/mphoneform.ui | 11 +++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/gui/mphoneform.cpp b/src/gui/mphoneform.cpp index b829be8..a724eb0 100644 --- a/src/gui/mphoneform.cpp +++ b/src/gui/mphoneform.cpp @@ -200,6 +200,12 @@ void MphoneForm::init() connect(sysTray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(sysTrayIconClicked(QSystemTrayIcon::ActivationReason))); + connect(menu, &QMenu::aboutToShow, this, &MphoneForm::updateTrayIconMenu); + + // Toggle window visibility + menu->addAction(toggleWindowAction); + + menu->addSeparator(); // Call menu menu->addAction(callInvite); @@ -3239,7 +3245,20 @@ void MphoneForm::whatsThis() void MphoneForm::sysTrayIconClicked(QSystemTrayIcon::ActivationReason reason) { if (reason == QSystemTrayIcon::Trigger || reason == QSystemTrayIcon::DoubleClick) - setVisible(!isVisible()); + toggleWindow(); +} + +void MphoneForm::toggleWindow() +{ + setVisible(!isVisible()); +} + +void MphoneForm::updateTrayIconMenu() +{ + if (isVisible()) + toggleWindowAction->setText(tr("Hide window")); + else + toggleWindowAction->setText(tr("Show window")); } bool MphoneForm::event(QEvent * event) diff --git a/src/gui/mphoneform.h b/src/gui/mphoneform.h index 1527e8d..508072d 100644 --- a/src/gui/mphoneform.h +++ b/src/gui/mphoneform.h @@ -172,6 +172,8 @@ public slots: void DiamondcardAdminCenter(); void whatsThis(); void sysTrayIconClicked(QSystemTrayIcon::ActivationReason); + void toggleWindow(); + void updateTrayIconMenu(); void osdMuteClicked(); diff --git a/src/gui/mphoneform.ui b/src/gui/mphoneform.ui index 196b098..8857394 100644 --- a/src/gui/mphoneform.ui +++ b/src/gui/mphoneform.ui @@ -1822,6 +1822,11 @@ actgrActivateLine + + + Toggle window visibility + + @@ -2503,6 +2508,12 @@ + + toggleWindowAction + triggered() + MphoneForm + toggleWindow() + doMessageBuddy(QTreeWidgetItem*) -- cgit v1.2.3 From f3d6f33a3ca173e2fc57f1d8679d25b0ac1c6a15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Fri, 17 Aug 2018 21:35:23 -0400 Subject: Add configuration option to disable incoming call popup window Closes #126 --- src/gui/mphoneform.cpp | 3 ++- src/gui/syssettingsform.cpp | 6 ++++++ src/gui/syssettingsform.ui | 15 ++++++++++++++- src/sys_settings.cpp | 15 +++++++++++++++ src/sys_settings.h | 5 +++++ 5 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/gui/mphoneform.cpp b/src/gui/mphoneform.cpp index 6c447a8..d2a7b59 100644 --- a/src/gui/mphoneform.cpp +++ b/src/gui/mphoneform.cpp @@ -810,7 +810,8 @@ void MphoneForm::updateState() name = cr.from_uri.encode_no_params_hdrs(false); incomingCallPopup->setCallerName(QString::fromStdString(name)); - showIncomingCallPopup = true; + if (sys_config->get_gui_show_incoming_popup()) + showIncomingCallPopup = true; break; } diff --git a/src/gui/syssettingsform.cpp b/src/gui/syssettingsform.cpp index 355df59..aa9bb7d 100644 --- a/src/gui/syssettingsform.cpp +++ b/src/gui/syssettingsform.cpp @@ -268,6 +268,9 @@ void SysSettingsForm::populate() // Call history histSizeSpinBox->setValue(sys_config->get_ch_max_size()); + // Show popup on incoming call + incomingPopupCheckBox->setChecked(sys_config->get_gui_show_incoming_popup()); + // Auto show on incoming call autoShowCheckBox->setChecked(sys_config->get_gui_auto_show_incoming()); autoShowTimeoutSpinBox->setValue(sys_config->get_gui_auto_show_timeout()); @@ -377,6 +380,9 @@ void SysSettingsForm::validate() sys_config->set_gui_hide_on_close(guiHideCheckBox->isChecked()); sys_config->set_gui_show_call_osd(osdCheckBox->isChecked()); + // Show popup on incoming call + sys_config->set_gui_show_incoming_popup(incomingPopupCheckBox->isChecked()); + // Auto show on incoming call sys_config->set_gui_auto_show_incoming(autoShowCheckBox->isChecked()); sys_config->set_gui_auto_show_timeout(autoShowTimeoutSpinBox->value()); diff --git a/src/gui/syssettingsform.ui b/src/gui/syssettingsform.ui index a792f81..d9e5262 100644 --- a/src/gui/syssettingsform.ui +++ b/src/gui/syssettingsform.ui @@ -890,6 +890,19 @@ If before answering a call, the microphone or speaker appears to be invalid, a w + + + Display a popup window with "Answer" and "Reject" buttons on an incoming call. + + + Show &popup window on incoming call + + + Alt+P + + + + @@ -942,7 +955,7 @@ If before answering a call, the microphone or speaker appears to be invalid, a w - + diff --git a/src/sys_settings.cpp b/src/sys_settings.cpp index bb07539..f87af3e 100644 --- a/src/sys_settings.cpp +++ b/src/sys_settings.cpp @@ -72,6 +72,7 @@ using namespace utils; // GUI settings #define FLD_GUI_USE_SYSTRAY "gui_use_systray" #define FLD_GUI_HIDE_ON_CLOSE "gui_hide_on_close" +#define FLD_GUI_SHOW_INCOMING_POPUP "gui_show_incoming_popup" #define FLD_GUI_AUTO_SHOW_INCOMING "gui_auto_show_incoming" #define FLD_GUI_AUTO_SHOW_TIMEOUT "gui_auto_show_timeout" #define FLD_GUI_BROWSER_CMD "gui_browser_cmd" @@ -252,6 +253,7 @@ t_sys_settings::t_sys_settings() { gui_use_systray = true; gui_hide_on_close = true; + gui_show_incoming_popup = true; gui_auto_show_incoming = false; gui_auto_show_timeout = 10; gui_show_call_osd = true; @@ -401,6 +403,11 @@ bool t_sys_settings::get_gui_use_systray(void) const { return gui_use_systray; } +bool t_sys_settings::get_gui_show_incoming_popup(void) const { + t_mutex_guard guard(mtx_sys); + return gui_show_incoming_popup; +} + bool t_sys_settings::get_gui_auto_show_incoming(void) const { t_mutex_guard guard(mtx_sys); return gui_auto_show_incoming; @@ -755,6 +762,11 @@ void t_sys_settings::set_gui_hide_on_close(bool b) { gui_hide_on_close = b; } +void t_sys_settings::set_gui_show_incoming_popup(bool b) { + t_mutex_guard guard(mtx_sys); + gui_show_incoming_popup = b; +} + void t_sys_settings::set_gui_auto_show_incoming(bool b) { t_mutex_guard guard(mtx_sys); gui_auto_show_incoming = b; @@ -1579,6 +1591,8 @@ bool t_sys_settings::read_config(string &error_msg) { gui_use_systray = yesno2bool(value); } else if (parameter == FLD_GUI_HIDE_ON_CLOSE) { gui_hide_on_close = yesno2bool(value); + } else if (parameter == FLD_GUI_SHOW_INCOMING_POPUP) { + gui_show_incoming_popup = yesno2bool(value); } else if (parameter == FLD_GUI_AUTO_SHOW_INCOMING) { gui_auto_show_incoming = yesno2bool(value); } else if (parameter == FLD_GUI_AUTO_SHOW_TIMEOUT) { @@ -1723,6 +1737,7 @@ bool t_sys_settings::write_config(string &error_msg) { config << "# GUI\n"; config << FLD_GUI_USE_SYSTRAY << '=' << bool2yesno(gui_use_systray) << endl; config << FLD_GUI_HIDE_ON_CLOSE << '=' << bool2yesno(gui_hide_on_close) << endl; + config << FLD_GUI_SHOW_INCOMING_POPUP << '=' << bool2yesno(gui_show_incoming_popup) << endl; config << FLD_GUI_AUTO_SHOW_INCOMING << '=' << bool2yesno(gui_auto_show_incoming) << endl; config << FLD_GUI_AUTO_SHOW_TIMEOUT << '=' << gui_auto_show_timeout << endl; config << FLD_GUI_BROWSER_CMD << '=' << gui_browser_cmd << endl; diff --git a/src/sys_settings.h b/src/sys_settings.h index 232c4f9..906af5e 100644 --- a/src/sys_settings.h +++ b/src/sys_settings.h @@ -147,6 +147,9 @@ private: bool gui_use_systray; bool gui_hide_on_close; + /** Show popup on incoming call */ + bool gui_show_incoming_popup; + /** Show main window on incoming call after a few seconds */ bool gui_auto_show_incoming; int gui_auto_show_timeout; @@ -291,6 +294,7 @@ public: bool get_log_show_debug(void) const; bool get_gui_use_systray(void) const; bool get_gui_hide_on_close(void) const; + bool get_gui_show_incoming_popup(void) const; bool get_gui_auto_show_incoming(void) const; int get_gui_auto_show_timeout(void) const; string get_gui_browser_cmd(void) const; @@ -347,6 +351,7 @@ public: void set_log_show_debug(bool b); void set_gui_use_systray(bool b); void set_gui_hide_on_close(bool b); + void set_gui_show_incoming_popup(bool b); void set_gui_auto_show_incoming(bool b); void set_gui_auto_show_timeout(int timeout); void set_gui_browser_cmd(const string &s); -- cgit v1.2.3 From cdc748e253432ae505dda64ad6f4038554301483 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Wed, 3 Jul 2019 01:18:13 -0400 Subject: Use a mutex in all t_sys_settings getters/setters, even bool Despite what one might intuitively expect, the C++ standard does not make any guarantee about fundamental types being atomic, not even bool. (In fact, it explicitly mentions the existence of std::atomic for that purpose.) See https://stackoverflow.com/a/35226186 for more details about this subject. --- src/sys_settings.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sys_settings.cpp b/src/sys_settings.cpp index bb07539..b8af8fe 100644 --- a/src/sys_settings.cpp +++ b/src/sys_settings.cpp @@ -636,6 +636,7 @@ bool t_sys_settings::get_show_buddy_list(void) const { } bool t_sys_settings::get_gui_show_call_osd() const { + t_mutex_guard guard(mtx_sys); return gui_show_call_osd; } @@ -973,8 +974,7 @@ void t_sys_settings::set_warn_hide_user(bool b) { } void t_sys_settings::set_gui_show_call_osd(bool b) { - // Using mutexes in primitive type getters/setters doesn't make any sense. - // TODO: remove t_mutex_guard from other getters/setters like this one. + t_mutex_guard guard(mtx_sys); gui_show_call_osd = b; } -- cgit v1.2.3 From cedd7a19a4fb415031b97592129214d2163563aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Wed, 3 Jul 2019 15:18:56 -0400 Subject: Prevent recursive locking of phone_users_mtx in add_phone_user() When encountering two users with the same contact name, attempting to differentiate them using USER_HOST(), a.k.a. get_ip_sip(), would result in EDEADLK since phone_users_mtx was already locked by add_phone_user(). Closes #88 --- src/phone.cpp | 8 ++++++-- src/phone.h | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/phone.cpp b/src/phone.cpp index 16abc38..5f2ac2d 100644 --- a/src/phone.cpp +++ b/src/phone.cpp @@ -3054,7 +3054,7 @@ bool t_phone::add_phone_user(const t_user &user_config, t_user **dup_user) { // Check if there is already another profile having // the same contact name. if (user->get_contact_name() == user_config.get_contact_name() && - USER_HOST(user, AUTO_IP4_ADDRESS) == USER_HOST(&user_config, AUTO_IP4_ADDRESS) && + phone->get_ip_sip_locked(user, AUTO_IP4_ADDRESS) == phone->get_ip_sip_locked(&user_config, AUTO_IP4_ADDRESS) && (*i)->is_active()) { *dup_user = user; @@ -3160,9 +3160,13 @@ t_presence_epa *t_phone::ref_presence_epa(t_user *user) { } string t_phone::get_ip_sip(const t_user *user, const string &auto_ip) const { + t_rwmutex_reader x(phone_users_mtx); + return get_ip_sip_locked(user, auto_ip); +} + +string t_phone::get_ip_sip_locked(const t_user *user, const string &auto_ip) const { string result; - t_rwmutex_reader x(phone_users_mtx); t_phone_user *pu = find_phone_user(user->get_profile_name()); if (pu) { result = pu->get_ip_sip(auto_ip); diff --git a/src/phone.h b/src/phone.h index f9c18d8..76d2a49 100644 --- a/src/phone.h +++ b/src/phone.h @@ -256,6 +256,8 @@ protected: */ t_line *find_line_in_dialog_request(t_request *r, t_tid tid); + // Variation of get_ip_sip() for when phone_users_mtx is already locked + string get_ip_sip_locked(const t_user *user, const string &auto_ip) const; // Events void recvd_provisional(t_response *r, t_tuid tuid, t_tid tid); void recvd_success(t_response *r, t_tuid tuid, t_tid tid); -- cgit v1.2.3 From 1e9f091f39a32193b0671e9dfbfb657dd45fec3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Fri, 12 Jul 2019 19:01:41 -0400 Subject: Add an option to prevent an idle session while a call is in progress Having the session marked as idle while a call is in progress could trigger certain actions (such as locking the screen, logging out automatically, or suspending the system) which could be undesirable in this situation. Closes #123 --- CMakeLists.txt | 8 ++ README.md | 1 + src/gui/CMakeLists.txt | 8 ++ src/gui/gui.cpp | 20 ++++ src/gui/gui.h | 10 ++ src/gui/idlesession_inhibitor.cpp | 193 ++++++++++++++++++++++++++++++++++++++ src/gui/idlesession_inhibitor.h | 72 ++++++++++++++ src/gui/idlesession_manager.cpp | 92 ++++++++++++++++++ src/gui/idlesession_manager.h | 53 +++++++++++ src/gui/mphoneform.cpp | 2 + src/gui/syssettingsform.cpp | 17 ++++ src/gui/syssettingsform.h | 1 + src/gui/syssettingsform.ui | 13 +++ src/sys_settings.cpp | 21 +++++ src/sys_settings.h | 5 + twinkle_config.h.in | 1 + 16 files changed, 517 insertions(+) create mode 100644 src/gui/idlesession_inhibitor.cpp create mode 100644 src/gui/idlesession_inhibitor.h create mode 100644 src/gui/idlesession_manager.cpp create mode 100644 src/gui/idlesession_manager.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 5315383..6376a29 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,12 +6,15 @@ set(PRODUCT_VERSION "1.10.2") set(PRODUCT_DATE "February 14, 2018") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") +include(CMakeDependentOption) + OPTION(WITH_ZRTP "Enable ZRTP encrypted calls" OFF) OPTION(WITH_SPEEX "Enable the Speex codec" OFF) OPTION(WITH_ILBC "Enable the iLBC codec" OFF) OPTION(WITH_ALSA "Enable ALSA support" ON) OPTION(WITH_DIAMONDCARD "Enable Diamondcard integration" OFF) OPTION(WITH_QT5 "Enable Qt 5 GUI" ON) +CMAKE_DEPENDENT_OPTION(WITH_DBUS "Enable use of QtDBus (GUI only)" ON "WITH_QT5" OFF) OPTION(WITH_G729 "Enable G.729A support" OFF) OPTION(WITH_GSM "Use external GSM library" OFF) @@ -37,6 +40,11 @@ if (WITH_QT5) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS} ${Qt5Quick_EXECUTABLE_COMPILE_FLAGS}") include_directories(${Qt5Widgets_INCLUDES} ${Qt5Quick_INCLUDES}) add_definitions(${Qt5Widgets_DEFINITIONS} ${Qt5Quick_DEFINITIONS}) + + if (WITH_DBUS) + find_package(Qt5DBus REQUIRED) + set(HAVE_DBUS TRUE) + endif (WITH_DBUS) endif (WITH_QT5) include_directories(${LIBXML2_INCLUDE_DIR}) diff --git a/README.md b/README.md index d33c106..a6c05be 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ First of all, choose which options you want to have enabled. All possible options are: * Qt 5 GUI: `-DWITH_QT5=On` (on by default) +* D-Bus use: `-DWITH_DBUS=On` (on by default, requires `WITH_QT5`) * ALSA support: `-DWITH_ALSA=On` (on by default) * ZRTP support: `-DWITH_ZRTP=On` * G.729A codec support: `-DWITH_G729=On` diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index fca7d2e..f49c237 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -52,6 +52,9 @@ qt5_add_translation(twinkle_LANG ) set(qt_LIBS Qt5::Widgets Qt5::Quick) +if (WITH_DBUS) + list(APPEND qt_LIBS Qt5::DBus) +endif (WITH_DBUS) set(CMAKE_AUTOMOC ON) @@ -93,12 +96,17 @@ set(TWINKLE_GUI-SRCS textbrowsernoautolink.cpp osd.cpp incoming_call_popup.cpp + idlesession_manager.cpp ${twinkle_OBJS} ${twinkle_UIS} ${twinkle_QRC} ${twinkle_LANG} ) +if (WITH_DBUS) + list(APPEND TWINKLE_GUI-SRCS + idlesession_inhibitor.cpp) +endif (WITH_DBUS) add_executable(twinkle ${TWINKLE_GUI-SRCS}) target_link_libraries(twinkle ${twinkle_LIBS} ${qt_LIBS}) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index ac14edd..d96da2a 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -56,6 +56,7 @@ #include "yesnodialog.h" #include "command_args.h" #include "im/msg_session.h" +#include "idlesession_manager.h" #include "qcombobox.h" #include "qlabel.h" @@ -783,6 +784,12 @@ t_gui::t_gui(t_phone *_phone) : t_userintf(_phone), timerUpdateMessageSessions(N qRegisterMetaType("t_cf_type"); qRegisterMetaType("string"); qRegisterMetaType>("std::list"); + + m_idle_session_manager = new IdleSessionManager(this); + updateInhibitIdleSession(); + connect(this, &t_gui::update_state, + this, &t_gui::updateIdleSessionState, + Qt::QueuedConnection); mainWindow = new MphoneForm; #ifdef HAVE_KDE @@ -3175,6 +3182,19 @@ void t_gui::updateTimersMessageSessions() { } } +void t_gui::updateInhibitIdleSession() { + m_idle_session_manager->setEnabled(sys_config->get_inhibit_idle_session()); +} + +void t_gui::updateIdleSessionState() { + bool busy = false; + for (int i = 0; i < NUM_USER_LINES; i++) { + if (phone->get_line_state(i) == LS_BUSY) + busy = true; + } + m_idle_session_manager->setActivityState(busy); +} + string t_gui::mime2file_extension(t_media media) { string extension; diff --git a/src/gui/gui.h b/src/gui/gui.h index 3538afb..63f2cc9 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -43,6 +43,7 @@ using namespace std; // Forward declaration class MphoneForm; +class IdleSessionManager; // Length of redial list in combo boxes #define SIZE_REDIAL_LIST 10 @@ -65,6 +66,8 @@ class t_gui : public QObject, public t_userintf { Q_OBJECT private: MphoneForm *mainWindow; + + IdleSessionManager *m_idle_session_manager; // List of active instant messaging session. list messageSessions; @@ -426,6 +429,10 @@ signals: void mw_update_call_history(); void mw_update_missed_call_status(int num_missed_calls); +public slots: + // Apply the current "inhibit_idle_session" setting + void updateInhibitIdleSession(); + private slots: /** * Update timers associated with message sessions. This @@ -433,6 +440,9 @@ private slots: */ void updateTimersMessageSessions(); + // Update the current idle/busy state + void updateIdleSessionState(); + bool do_cb_ask_user_to_redirect_invite(t_user *user_config, const t_url &destination, const string &display); bool do_cb_ask_user_to_redirect_request(t_user *user_config, const t_url &destination, diff --git a/src/gui/idlesession_inhibitor.cpp b/src/gui/idlesession_inhibitor.cpp new file mode 100644 index 0000000..ba89a10 --- /dev/null +++ b/src/gui/idlesession_inhibitor.cpp @@ -0,0 +1,193 @@ +/* + (This file was initially copied from qBittorrent.) + + Copyright (C) 2019 Vladimir Golovnev + Frédéric Brière + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#include "idlesession_inhibitor.h" + +#include +#include +#include +#include +#include +#include + +#include + +// qUtf8Printable() was introduced in Qt 5.4 +#if QT_VERSION < 0x050400 +#define qUtf8Printable(string) QString(string).toUtf8().constData() +#endif + +// There are various standards for session/power management out there. +// Fortunately, most of them are either obsolete or redundant; the following +// two should cover most, if not all, cases. + +// freedesktop.org Power Management Specification (KDE, Xfce) +#define FDO_SERVICE "org.freedesktop.PowerManagement" +#define FDO_PATH "/org/freedesktop/PowerManagement/Inhibit" +#define FDO_INTERFACE "org.freedesktop.PowerManagement.Inhibit" +#define FDO_METHOD_INHIBIT "Inhibit" +#define FDO_METHOD_UNINHIBIT "UnInhibit" + +// GNOME Session (GNOME, MATE) +#define GSM_SERVICE "org.gnome.SessionManager" +#define GSM_PATH "/org/gnome/SessionManager" +#define GSM_INTERFACE "org.gnome.SessionManager" +#define GSM_METHOD_INHIBIT "Inhibit" +#define GSM_METHOD_UNINHIBIT "Uninhibit" +// Additional arguments required by GNOME's Inhibit() +// - toplevel_xid: The toplevel X window identifier +// (No idea what this does; everyone just uses 0) +#define GSM_ARG_TOPLEVEL_XID 0u +// - flags: Flags that spefify what should be inhibited +// (8: Inhibit the session being marked as idle) +#define GSM_ARG_INHIBIT_FLAG 8u + +// Common arguments to Inhibit() +#define INHIBIT_REASON "Call in progress" +// (Included for PRODUCT_NAME) +#include "protocol.h" + +// How long (in ms) to wait for a reply to our D-Bus (un)inhibit requests +#define DBUS_CALL_TIMEOUT 1000 + + +IdleSessionInhibitor::IdleSessionInhibitor(QObject *parent) + : QObject(parent) +{ + if (!QDBusConnection::sessionBus().isConnected()) { + qWarning("D-Bus: Could not connect to session bus"); + m_state = error; + return; + } + + auto interface = QDBusConnection::sessionBus().interface(); + if (interface->isServiceRegistered(FDO_SERVICE)) { + m_use_gsm = false; + } else if (interface->isServiceRegistered(GSM_SERVICE)) { + m_use_gsm = true; + } else { + qWarning("D-Bus: No supported session/power management service found"); + m_state = error; + return; + } + + m_state = idle; + m_intended_state = idle; + m_cookie = 0; +} + +void IdleSessionInhibitor::sendRequest(bool inhibit) +{ + QDBusMessage call; + if (!m_use_gsm) + call = QDBusMessage::createMethodCall( + FDO_SERVICE, + FDO_PATH, + FDO_INTERFACE, + inhibit ? FDO_METHOD_INHIBIT : FDO_METHOD_UNINHIBIT); + else + call = QDBusMessage::createMethodCall( + GSM_SERVICE, + GSM_PATH, + GSM_INTERFACE, + inhibit ? GSM_METHOD_INHIBIT : GSM_METHOD_UNINHIBIT); + + QList args; + if (inhibit) { + args << PRODUCT_NAME; + if (m_use_gsm) + args << GSM_ARG_TOPLEVEL_XID; + args << INHIBIT_REASON; + if (m_use_gsm) + args << GSM_ARG_INHIBIT_FLAG; + } else { + args << m_cookie; + } + call.setArguments(args); + + QDBusPendingCall pcall = QDBusConnection::sessionBus().asyncCall(call, DBUS_CALL_TIMEOUT); + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pcall, this); + connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), + this, SLOT(onAsyncReply(QDBusPendingCallWatcher*))); +} + +void IdleSessionInhibitor::requestBusy() +{ + m_intended_state = busy; + if (m_state != idle) + return; + + m_state = request_busy; + + sendRequest(true); +} + +void IdleSessionInhibitor::requestIdle() +{ + m_intended_state = idle; + if (m_state != busy) + return; + + m_state = request_idle; + + sendRequest(false); +} + +void IdleSessionInhibitor::onAsyncReply(QDBusPendingCallWatcher *call) +{ + switch (m_state) { + case request_idle: { + // Reply to "Uninhibit" has no return value + QDBusPendingReply<> reply = *call; + + if (reply.isError()) { + qWarning("D-Bus: Reply: Error: %s", qUtf8Printable(reply.error().message())); + m_state = error; + } else { + m_state = idle; + // Process any pending requestBusy() call + if (m_intended_state == busy) + requestBusy(); + } + break; + } + case request_busy: { + // Reply to "Inhibit" has a cookie as return value + QDBusPendingReply reply = *call; + + if (reply.isError()) { + qWarning("D-Bus: Reply: Error: %s", qUtf8Printable(reply.error().message())); + m_state = error; + } else { + m_state = busy; + m_cookie = reply.value(); + // Process any pending requestIdle() call + if (m_intended_state == idle) + requestIdle(); + } + break; + } + default: + qWarning("D-Bus: Unexpected reply in state %d", m_state); + m_state = error; + } + + call->deleteLater(); +} diff --git a/src/gui/idlesession_inhibitor.h b/src/gui/idlesession_inhibitor.h new file mode 100644 index 0000000..cd41494 --- /dev/null +++ b/src/gui/idlesession_inhibitor.h @@ -0,0 +1,72 @@ +/* + (This file was initially copied from qBittorrent.) + + Copyright (C) 2019 Vladimir Golovnev + Frédéric Brière + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#ifndef IDLESESSION_INHIBITOR_H +#define IDLESESSION_INHIBITOR_H + +#include + +// Forward declaration +QT_BEGIN_NAMESPACE +class QDBusPendingCallWatcher; +QT_END_NAMESPACE + +// Object tasked with inhibiting idle sessions via D-Bus +class IdleSessionInhibitor : public QObject +{ + Q_OBJECT + +public: + IdleSessionInhibitor(QObject *parent = 0); + + void requestBusy(); + void requestIdle(); + +private slots: + // Handle the reply to our (un)inhibit request + void onAsyncReply(QDBusPendingCallWatcher *call); + +private: + // Internal state of the inhibitor + enum _state + { + error, + busy, + idle, + request_busy, + request_idle + }; + // Current state + enum _state m_state; + // Most recent idle/busy setting, possibly pending while we're waiting + // for a reply to our previous D-Bus call + enum _state m_intended_state; + + // Cookie returned by Inhibit(), to be passed to Uninhibit() + unsigned int m_cookie; + + // Whether or not we are dealing with GNOME Session + bool m_use_gsm; + + // Send an (un)inhibit request via D-Bus + void sendRequest(bool inhibit); +}; + +#endif // IDLESESSION_INHIBITOR_H diff --git a/src/gui/idlesession_manager.cpp b/src/gui/idlesession_manager.cpp new file mode 100644 index 0000000..e1d5a81 --- /dev/null +++ b/src/gui/idlesession_manager.cpp @@ -0,0 +1,92 @@ +/* + (This file was initially copied from qBittorrent.) + + Copyright (C) 2019 Vladimir Golovnev + Frédéric Brière + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#include "twinkle_config.h" + +#include "idlesession_manager.h" +#ifdef HAVE_DBUS +#include "idlesession_inhibitor.h" +#endif + +IdleSessionManager::IdleSessionManager(QObject *parent) + : QObject(parent) +{ + // Creation of the inhibitor will only take place in setEnabled(), + // to prevent issueing a warning if no management service is found + // when the option has not been enabled in the first place. + + m_busy = false; + m_inhibitor = nullptr; +} + +void IdleSessionManager::setEnabled(bool enabled) +{ +#ifdef HAVE_DBUS + // Create our inhibitor if enabling for the first time + if (enabled && !m_inhibitor) + m_inhibitor = new IdleSessionInhibitor(this); + + // Changing this setting while busy requires special handling + if ((enabled != m_enabled) && m_busy) { + // We need to directly call request*() methods, as the current + // values of m_enabled and m_busy would screw up set*() + if (enabled) + // Forward the current state to the new inhibitor + m_inhibitor->requestBusy(); + else + // Switch back to idle before going silent + m_inhibitor->requestIdle(); + } +#endif + + m_enabled = enabled; +} + +void IdleSessionManager::setActivityState(bool busy) +{ + if (busy) + setBusy(); + else + setIdle(); +} + +void IdleSessionManager::setBusy() +{ + if (m_busy) + return; + m_busy = true; + +#ifdef HAVE_DBUS + if (m_enabled && m_inhibitor) + m_inhibitor->requestBusy(); +#endif +} + +void IdleSessionManager::setIdle() +{ + if (!m_busy) + return; + m_busy = false; + +#ifdef HAVE_DBUS + if (m_enabled && m_inhibitor) + m_inhibitor->requestIdle(); +#endif +} diff --git a/src/gui/idlesession_manager.h b/src/gui/idlesession_manager.h new file mode 100644 index 0000000..0ee7267 --- /dev/null +++ b/src/gui/idlesession_manager.h @@ -0,0 +1,53 @@ +/* + (This file was initially copied from qBittorrent.) + + Copyright (C) 2019 Vladimir Golovnev + Frédéric Brière + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#ifndef IDLESESSION_MANAGER_H +#define IDLESESSION_MANAGER_H + +#include + +// Forward declaration +class IdleSessionInhibitor; + +// Object responsible for keeping track of this session's activity, whether +// D-Bus is supported or not +class IdleSessionManager : public QObject +{ + Q_OBJECT + +public: + IdleSessionManager(QObject *parent = 0); + + // Enable/disable inhibition of idle session + void setEnabled(bool enabled); + + // Declare the session as busy/idle + void setActivityState(bool busy); + void setBusy(); + void setIdle(); + +private: + bool m_enabled; + bool m_busy; + + IdleSessionInhibitor *m_inhibitor; +}; + +#endif // IDLE_SESSION_MANAGER_H diff --git a/src/gui/mphoneform.cpp b/src/gui/mphoneform.cpp index 6c447a8..3dae103 100644 --- a/src/gui/mphoneform.cpp +++ b/src/gui/mphoneform.cpp @@ -2333,6 +2333,8 @@ void MphoneForm::editSysSettings() sysSettingsForm = new SysSettingsForm(this); sysSettingsForm->setModal(true); MEMMAN_NEW(sysSettingsForm); + connect(sysSettingsForm, SIGNAL(inhibitIdleSessionChanged()), + (t_gui *)ui, SLOT(updateInhibitIdleSession())); connect(sysSettingsForm, SIGNAL(sipUdpPortChanged()), this, SLOT(updateSipUdpPort())); connect(sysSettingsForm, SIGNAL(rtpPortChanged()), diff --git a/src/gui/syssettingsform.cpp b/src/gui/syssettingsform.cpp index 355df59..6e76593 100644 --- a/src/gui/syssettingsform.cpp +++ b/src/gui/syssettingsform.cpp @@ -15,6 +15,8 @@ along with this program. If not, see . */ +#include "twinkle_config.h" + #include #include #include "gui.h" @@ -264,6 +266,14 @@ void SysSettingsForm::populate() guiUseSystrayCheckBox->setChecked(sys_config->get_gui_use_systray()); guiHideCheckBox->setChecked(sys_config->get_gui_hide_on_close()); guiHideCheckBox->setEnabled(sys_config->get_gui_use_systray()); + + // Inhibit idle session + inhibitIdleSessionCheckBox->setChecked(sys_config->get_inhibit_idle_session()); +#ifdef HAVE_DBUS + inhibitIdleSessionCheckBox->setEnabled(true); +#else + inhibitIdleSessionCheckBox->setEnabled(false); +#endif // Call history histSizeSpinBox->setValue(sys_config->get_ch_max_size()); @@ -376,6 +386,13 @@ void SysSettingsForm::validate() sys_config->set_gui_use_systray(guiUseSystrayCheckBox->isChecked()); sys_config->set_gui_hide_on_close(guiHideCheckBox->isChecked()); sys_config->set_gui_show_call_osd(osdCheckBox->isChecked()); + + // Inhibit idle session + if (sys_config->get_inhibit_idle_session() != inhibitIdleSessionCheckBox->isChecked()) { + sys_config->set_inhibit_idle_session(inhibitIdleSessionCheckBox->isChecked()); + // Changing this setting while busy requires special handling + emit inhibitIdleSessionChanged(); + } // Auto show on incoming call sys_config->set_gui_auto_show_incoming(autoShowCheckBox->isChecked()); diff --git a/src/gui/syssettingsform.h b/src/gui/syssettingsform.h index 3a5e6ac..fec5f7a 100644 --- a/src/gui/syssettingsform.h +++ b/src/gui/syssettingsform.h @@ -31,6 +31,7 @@ public slots: virtual void playRingBackToneCheckBoxToggles( bool on ); signals: + void inhibitIdleSessionChanged(); void sipUdpPortChanged(); void rtpPortChanged(); diff --git a/src/gui/syssettingsform.ui b/src/gui/syssettingsform.ui index a792f81..3a1cb99 100644 --- a/src/gui/syssettingsform.ui +++ b/src/gui/syssettingsform.ui @@ -966,6 +966,19 @@ If before answering a call, the microphone or speaker appears to be invalid, a w + + + + If the session is marked as idle, it may trigger certain actions (such as locking the screen, logging out automatically, or suspending the system) depending on your configuration. Enabling this option will prevent this from happening while a call is in progress. + + + false + + + Prevent &idle session while a call is in progress + + + diff --git a/src/sys_settings.cpp b/src/sys_settings.cpp index bb07539..1966d0b 100644 --- a/src/sys_settings.cpp +++ b/src/sys_settings.cpp @@ -77,6 +77,9 @@ using namespace utils; #define FLD_GUI_BROWSER_CMD "gui_browser_cmd" #define FLD_GUI_SHOW_CALL_OSD "gui_show_call_osd" +// Inhibit idle session +#define FLD_INHIBIT_IDLE_SESSION "inhibit_idle_session" + // Address book settings #define FLD_AB_SHOW_SIP_ONLY "ab_show_sip_only" #define FLD_AB_LOOKUP_NAME "ab_lookup_name" @@ -255,6 +258,8 @@ t_sys_settings::t_sys_settings() { gui_auto_show_incoming = false; gui_auto_show_timeout = 10; gui_show_call_osd = true; + + inhibit_idle_session = false; ab_show_sip_only = false; ab_lookup_name = true; @@ -421,6 +426,11 @@ string t_sys_settings::get_gui_browser_cmd(void) const { return gui_browser_cmd; } +bool t_sys_settings::get_inhibit_idle_session(void) const { + t_mutex_guard guard(mtx_sys); + return inhibit_idle_session; +} + bool t_sys_settings::get_ab_show_sip_only(void) const { bool result; mtx_sys.lock(); @@ -770,6 +780,11 @@ void t_sys_settings::set_gui_browser_cmd(const string &s) { gui_browser_cmd = s; } +void t_sys_settings::set_inhibit_idle_session(bool b) { + t_mutex_guard guard(mtx_sys); + inhibit_idle_session = b; +} + void t_sys_settings::set_ab_show_sip_only(bool b) { mtx_sys.lock(); ab_show_sip_only = b; @@ -1587,6 +1602,8 @@ bool t_sys_settings::read_config(string &error_msg) { gui_browser_cmd = value; } else if (parameter == FLD_GUI_SHOW_CALL_OSD) { gui_show_call_osd = yesno2bool(value); + } else if (parameter == FLD_INHIBIT_IDLE_SESSION) { + inhibit_idle_session = yesno2bool(value); } else if (parameter == FLD_AB_SHOW_SIP_ONLY) { ab_show_sip_only = yesno2bool(value); } else if (parameter == FLD_AB_LOOKUP_NAME) { @@ -1728,6 +1745,10 @@ bool t_sys_settings::write_config(string &error_msg) { config << FLD_GUI_BROWSER_CMD << '=' << gui_browser_cmd << endl; config << FLD_GUI_SHOW_CALL_OSD << '=' << bool2yesno(gui_show_call_osd) << endl; config << endl; + + // Write inhibit idle session settings + config << FLD_INHIBIT_IDLE_SESSION << '=' << bool2yesno(inhibit_idle_session) << endl; + config << endl; // Write address book settings config << "# Address book\n"; diff --git a/src/sys_settings.h b/src/sys_settings.h index 232c4f9..5a74fc4 100644 --- a/src/sys_settings.h +++ b/src/sys_settings.h @@ -156,6 +156,9 @@ private: string gui_browser_cmd; //@} + // Inhibit idle session + bool inhibit_idle_session; + // Address book settings bool ab_show_sip_only; bool ab_lookup_name; @@ -295,6 +298,7 @@ public: int get_gui_auto_show_timeout(void) const; string get_gui_browser_cmd(void) const; bool get_gui_show_call_osd() const; + bool get_inhibit_idle_session() const; bool get_ab_show_sip_only(void) const; bool get_ab_lookup_name(void) const; bool get_ab_override_display(void) const; @@ -351,6 +355,7 @@ public: void set_gui_auto_show_timeout(int timeout); void set_gui_browser_cmd(const string &s); void set_gui_show_call_osd(bool b); + void set_inhibit_idle_session(bool b); void set_ab_show_sip_only(bool b); void set_ab_lookup_name(bool b); void set_ab_override_display(bool b); diff --git a/twinkle_config.h.in b/twinkle_config.h.in index 3928565..4f7ee77 100644 --- a/twinkle_config.h.in +++ b/twinkle_config.h.in @@ -9,6 +9,7 @@ #cmakedefine HAVE_LINUX_TYPES_H #cmakedefine HAVE_LINUX_ERRQUEUE_H #cmakedefine HAVE_LIBASOUND +#cmakedefine HAVE_DBUS #define VERSION "${PRODUCT_VERSION}" #define VERSION_DATE "${PRODUCT_DATE}" -- cgit v1.2.3 From 3d9fb0ac7490620a49a400b77ab8f851cdd4fcf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Sat, 13 Jul 2019 17:50:36 -0400 Subject: Properly display and log warning messages in IdleSessionInhibitor --- src/gui/gui.cpp | 3 ++- src/gui/idlesession_inhibitor.cpp | 27 +++++++++++++++------------ src/gui/idlesession_inhibitor.h | 3 +++ src/gui/idlesession_manager.cpp | 7 +++++++ 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index d96da2a..954d8e8 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -786,7 +786,6 @@ t_gui::t_gui(t_phone *_phone) : t_userintf(_phone), timerUpdateMessageSessions(N qRegisterMetaType>("std::list"); m_idle_session_manager = new IdleSessionManager(this); - updateInhibitIdleSession(); connect(this, &t_gui::update_state, this, &t_gui::updateIdleSessionState, Qt::QueuedConnection); @@ -825,6 +824,8 @@ void t_gui::run(void) { thr_process_events = new t_thread(process_events_main, NULL); MEMMAN_NEW(thr_process_events); + updateInhibitIdleSession(); + QString s; list user_list = phone->ref_users(); diff --git a/src/gui/idlesession_inhibitor.cpp b/src/gui/idlesession_inhibitor.cpp index ba89a10..9e4e1d4 100644 --- a/src/gui/idlesession_inhibitor.cpp +++ b/src/gui/idlesession_inhibitor.cpp @@ -20,6 +20,9 @@ #include "idlesession_inhibitor.h" +#include "log.h" +#include "userintf.h" + #include #include #include @@ -27,13 +30,6 @@ #include #include -#include - -// qUtf8Printable() was introduced in Qt 5.4 -#if QT_VERSION < 0x050400 -#define qUtf8Printable(string) QString(string).toUtf8().constData() -#endif - // There are various standards for session/power management out there. // Fortunately, most of them are either obsolete or redundant; the following // two should cover most, if not all, cases. @@ -72,7 +68,7 @@ IdleSessionInhibitor::IdleSessionInhibitor(QObject *parent) : QObject(parent) { if (!QDBusConnection::sessionBus().isConnected()) { - qWarning("D-Bus: Could not connect to session bus"); + issueWarning(tr("D-Bus: Could not connect to session bus")); m_state = error; return; } @@ -83,7 +79,7 @@ IdleSessionInhibitor::IdleSessionInhibitor(QObject *parent) } else if (interface->isServiceRegistered(GSM_SERVICE)) { m_use_gsm = true; } else { - qWarning("D-Bus: No supported session/power management service found"); + issueWarning(tr("D-Bus: No supported session/power management service found")); m_state = error; return; } @@ -158,7 +154,7 @@ void IdleSessionInhibitor::onAsyncReply(QDBusPendingCallWatcher *call) QDBusPendingReply<> reply = *call; if (reply.isError()) { - qWarning("D-Bus: Reply: Error: %s", qUtf8Printable(reply.error().message())); + issueWarning(tr("D-Bus: Reply: Error: %1").arg(reply.error().message())); m_state = error; } else { m_state = idle; @@ -173,7 +169,7 @@ void IdleSessionInhibitor::onAsyncReply(QDBusPendingCallWatcher *call) QDBusPendingReply reply = *call; if (reply.isError()) { - qWarning("D-Bus: Reply: Error: %s", qUtf8Printable(reply.error().message())); + issueWarning(tr("D-Bus: Reply: Error: %1").arg(reply.error().message())); m_state = error; } else { m_state = busy; @@ -185,9 +181,16 @@ void IdleSessionInhibitor::onAsyncReply(QDBusPendingCallWatcher *call) break; } default: - qWarning("D-Bus: Unexpected reply in state %d", m_state); + issueWarning(tr("D-Bus: Unexpected reply in state %1").arg(m_state)); m_state = error; } call->deleteLater(); } + +void IdleSessionInhibitor::issueWarning(const QString &msg) const +{ + log_file->write_report(msg.toStdString(), "IdleSessionInhibitor", + LOG_NORMAL, LOG_WARNING); + ui->cb_display_msg(msg.toStdString(), MSG_WARNING); +} diff --git a/src/gui/idlesession_inhibitor.h b/src/gui/idlesession_inhibitor.h index cd41494..812e0a0 100644 --- a/src/gui/idlesession_inhibitor.h +++ b/src/gui/idlesession_inhibitor.h @@ -67,6 +67,9 @@ private: // Send an (un)inhibit request via D-Bus void sendRequest(bool inhibit); + + // Display and log a warning + void issueWarning(const QString &msg) const; }; #endif // IDLESESSION_INHIBITOR_H diff --git a/src/gui/idlesession_manager.cpp b/src/gui/idlesession_manager.cpp index e1d5a81..5cc60b7 100644 --- a/src/gui/idlesession_manager.cpp +++ b/src/gui/idlesession_manager.cpp @@ -25,6 +25,10 @@ #include "idlesession_inhibitor.h" #endif +#include "log.h" + +#include + IdleSessionManager::IdleSessionManager(QObject *parent) : QObject(parent) { @@ -38,6 +42,9 @@ IdleSessionManager::IdleSessionManager(QObject *parent) void IdleSessionManager::setEnabled(bool enabled) { + // Make sure logging has been made available at this point + assert(log_file); + #ifdef HAVE_DBUS // Create our inhibitor if enabling for the first time if (enabled && !m_inhibitor) -- cgit v1.2.3 From 53d22e59ad08799c54fb8021954fd267deddfc5d Mon Sep 17 00:00:00 2001 From: 4-FLOSS-Free-Libre-Open-Source-Software <46166740+4-FLOSS-Free-Libre-Open-Source-Software@users.noreply.github.com> Date: Fri, 19 Jul 2019 14:00:25 +0200 Subject: Add twinkle-console option --sip-port --rtp-port --- src/main.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 20ee366..d8d363f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -241,14 +241,33 @@ int main(int argc, char *argv[]) { // Take default user profile if there are is no default is sys settings if (config_files.empty()) config_files.push_back(USER_CONFIG_FILE); - // Read user configurations. if (argc >= 2) { config_files.clear(); - for (int i = 1; i < argc; i++) { + for (int i = 1; i < argc && i < 2; i++) { config_files.push_back(argv[i]); } } + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "--sip-port") == 0) { + if (i < argc - 1) { + i++; + sys_config->set_override_sip_port(atoi(argv[i])); + } else { + cout << argv[0] << ": "; + cout << "Port missing for option '--sip-port'\n"; + } + } else if (strcmp(argv[i], "--rtp-port") == 0) { + if (i < argc - 1) { + i++; + sys_config->set_override_rtp_port(atoi(argv[i])); + } else { + cout << argv[0] << ": "; + cout << "Port missing for option '--rtp-port'\n"; + } + } + } + // Activate users for (list::iterator i = config_files.begin(); i != config_files.end(); i++) -- cgit v1.2.3 From a5b81c715d331ef2c799eaf20c10e384355c5667 Mon Sep 17 00:00:00 2001 From: 4-FLOSS-Free-Libre-Open-Source-Software <46166740+4-FLOSS-Free-Libre-Open-Source-Software@users.noreply.github.com> Date: Thu, 1 Aug 2019 22:13:59 +0200 Subject: resolve nat_public_ip hostname for dyndns to work --- src/phone_user.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/phone_user.cpp b/src/phone_user.cpp index c52f396..632d07b 100644 --- a/src/phone_user.cpp +++ b/src/phone_user.cpp @@ -1499,7 +1499,7 @@ bool t_phone_user::get_last_reg_failed(void) const { string t_phone_user::get_ip_sip(const string &auto_ip) const { if (stun_public_ip_sip) return h_ip2str(stun_public_ip_sip); - if (user_config->get_use_nat_public_ip()) return user_config->get_nat_public_ip(); + if (user_config->get_use_nat_public_ip()) return h_ip2str(gethostbyname(user_config->get_nat_public_ip())); if (LOCAL_IP == AUTO_IP4_ADDRESS) return auto_ip; return LOCAL_IP; } -- cgit v1.2.3 From ed606e1323ca7243308237256e80c3a9cb500874 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Sat, 21 Sep 2019 11:24:11 -0400 Subject: Support multiple WWW-Authenticate/Proxy-Authenticate headers The server may send multiple WWW-Authenticate/Proxy-Authenticate headers, with different digest algorithms, in decreasing order of preference. We must therefore avoid overwriting any supported challenge once we've got a hold of one. Closes #162 --- src/parser/hdr_www_authenticate.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/parser/hdr_www_authenticate.cpp b/src/parser/hdr_www_authenticate.cpp index ae87e99..2deb787 100644 --- a/src/parser/hdr_www_authenticate.cpp +++ b/src/parser/hdr_www_authenticate.cpp @@ -17,10 +17,23 @@ #include "hdr_www_authenticate.h" #include "definitions.h" +#include "util.h" t_hdr_www_authenticate::t_hdr_www_authenticate() : t_header("WWW-Authenticate") {} void t_hdr_www_authenticate::set_challenge(const t_challenge &c) { + // The server may send multiple WWW-Authenticate/Proxy-Authenticate + // headers, with different digest algorithms, in decreasing order of + // preference. We must therefore avoid overwriting any supported + // challenge once we've got a hold of one. (We don't simply ignore + // all unsupported challenges, however, just in case the server forgot + // to include a Digest challenge.) + if (populated) { + // Don't overwrite the previous challenge if it was supported + if (cmp_nocase(challenge.auth_scheme, AUTH_DIGEST) == 0) { + return; + } + } populated = true; challenge = c; } -- cgit v1.2.3 From 5404ca22fbc826415466bd834e5055404294da0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Wed, 25 Sep 2019 23:55:21 -0400 Subject: Fix QML binding loop in TextImageButton (used in incoming call popup) --- src/gui/qml/TextImageButton.qml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/gui/qml/TextImageButton.qml b/src/gui/qml/TextImageButton.qml index 83f61d7..c183630 100644 --- a/src/gui/qml/TextImageButton.qml +++ b/src/gui/qml/TextImageButton.qml @@ -12,6 +12,12 @@ Rectangle { signal clicked color: "red" + // Pre-compute this to avoid binding color to itself + property color darkerColor + Component.onCompleted: { + darkerColor = Qt.darker(color) + } + z: 2 Image { @@ -53,7 +59,7 @@ Rectangle { states: State { name: "pressed"; when: mouseArea.pressed - PropertyChanges { target: backgroundRect; color: Qt.darker(color) } + PropertyChanges { target: backgroundRect; color: darkerColor } } } -- cgit v1.2.3 From 2e60ab67d1789609f1e7eef11aaebfa9eb440a89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Sun, 29 Sep 2019 20:53:09 -0400 Subject: Remove duplicate mutex lock in `t_phone::end_call()` A write lock on `lines_mtx` has already been acquired at the beginning of `end_call()`. --- src/phone.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/phone.cpp b/src/phone.cpp index 16abc38..8de3834 100644 --- a/src/phone.cpp +++ b/src/phone.cpp @@ -279,8 +279,6 @@ void t_phone::end_call(void) { move_line_to_background(lineno1); move_line_to_background(lineno2); } else { - t_rwmutex_reader x(lines_mtx); - // Hangup the active line, and make the next // line active. int l = active_line; -- cgit v1.2.3 From 79cc23508006d61172522f4b12db8261e760768b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Sun, 29 Sep 2019 20:20:02 -0400 Subject: Make `t_phone::mutex_3way` recursive to avoid a deadlock `t_phone::mutex_3way` can be locked twice when hanging up a conference call: - `t_phone::cleanup_3way_state()` acquires a lock - `t_audio_session::stop_3way()` is called - `t_audio_session::get_peer_3way()` is called - `t_phone::get_3way_peer_line()` is called - which acquires another lock Making that mutex recursive is a simple way to work around this issue. --- src/phone.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/phone.h b/src/phone.h index f9c18d8..771db3b 100644 --- a/src/phone.h +++ b/src/phone.h @@ -130,7 +130,7 @@ private: bool is_3way; // indicates an acitive 3-way t_line *line1_3way; // first line in 3-way conf t_line *line2_3way; // second line in 3-way conf - mutable t_mutex mutex_3way; + mutable t_recursive_mutex mutex_3way; // Call transfer data. When a REFER comes in, the user has // to give permission before the triggered INVITE can be sent. -- cgit v1.2.3 From b60354d82e3dc0e219cf08e956c94aa2585c104b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Wed, 2 Oct 2019 22:05:01 -0400 Subject: Move t_rwmutex_reader/writer definitions into mutex.cpp These classes are about to get more complex, so let's move them ahead of time into mutex.cpp. --- src/threads/mutex.cpp | 28 ++++++++++++++++++++++++++++ src/threads/mutex.h | 20 ++++---------------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/threads/mutex.cpp b/src/threads/mutex.cpp index 744cd7b..9c6a762 100644 --- a/src/threads/mutex.cpp +++ b/src/threads/mutex.cpp @@ -124,3 +124,31 @@ void t_rwmutex::unlock() { pthread_rwlock_unlock(&_lock); } + +/////////////////////////// +// t_rwmutex_guard +/////////////////////////// + +t_rwmutex_reader::t_rwmutex_reader(t_rwmutex& mutex) : _mutex(mutex) +{ + // std::cout << "mtx rd lock " << (void*)&_mutex << std::endl; + _mutex.lockRead(); +} + +t_rwmutex_reader::~t_rwmutex_reader() +{ + // std::cout << "mtx rd unlock " << (void*)&_mutex << std::endl; + _mutex.unlock(); +} + +t_rwmutex_writer::t_rwmutex_writer(t_rwmutex& mutex) : _mutex(mutex) +{ + // std::cout << "mtx wr lock " << (void*)&_mutex << std::endl; + _mutex.lockWrite(); +} + +t_rwmutex_writer::~t_rwmutex_writer() +{ + // std::cout << "mtx wr unlock " << (void*)&_mutex << std::endl; + _mutex.unlock(); +} diff --git a/src/threads/mutex.h b/src/threads/mutex.h index 1fc07d1..15d5181 100644 --- a/src/threads/mutex.h +++ b/src/threads/mutex.h @@ -99,28 +99,16 @@ class t_rwmutex_reader { private: t_rwmutex& _mutex; public: - t_rwmutex_reader(t_rwmutex& mutex) : _mutex(mutex) { - // std::cout << "mtx rd lock " << (void*)&_mutex << std::endl; - _mutex.lockRead(); - } - ~t_rwmutex_reader() { - // std::cout << "mtx rd unlock " << (void*)&_mutex << std::endl; - _mutex.unlock(); - } + t_rwmutex_reader(t_rwmutex& mutex); + ~t_rwmutex_reader(); }; class t_rwmutex_writer { private: t_rwmutex& _mutex; public: - t_rwmutex_writer(t_rwmutex& mutex) : _mutex(mutex) { - // std::cout << "mtx wr lock " << (void*)&_mutex << std::endl; - _mutex.lockWrite(); - } - ~t_rwmutex_writer() { - // std::cout << "mtx wr unlock " << (void*)&_mutex << std::endl; - _mutex.unlock(); - } + t_rwmutex_writer(t_rwmutex& mutex); + ~t_rwmutex_writer(); }; -- cgit v1.2.3 From 3d126cd9a7f9029e199e9220e2ffa08ac4e23227 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Wed, 2 Oct 2019 22:13:56 -0400 Subject: Create t_rwmutex_guard base class (Doing this ahead of time to simplify the next commit a bit.) --- src/threads/mutex.cpp | 11 +++++++++-- src/threads/mutex.h | 15 ++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/threads/mutex.cpp b/src/threads/mutex.cpp index 9c6a762..7eaa329 100644 --- a/src/threads/mutex.cpp +++ b/src/threads/mutex.cpp @@ -129,7 +129,13 @@ void t_rwmutex::unlock() // t_rwmutex_guard /////////////////////////// -t_rwmutex_reader::t_rwmutex_reader(t_rwmutex& mutex) : _mutex(mutex) +t_rwmutex_guard::t_rwmutex_guard(t_rwmutex& mutex) : + _mutex(mutex) +{ +} + +t_rwmutex_reader::t_rwmutex_reader(t_rwmutex& mutex) : + t_rwmutex_guard(mutex) { // std::cout << "mtx rd lock " << (void*)&_mutex << std::endl; _mutex.lockRead(); @@ -141,7 +147,8 @@ t_rwmutex_reader::~t_rwmutex_reader() _mutex.unlock(); } -t_rwmutex_writer::t_rwmutex_writer(t_rwmutex& mutex) : _mutex(mutex) +t_rwmutex_writer::t_rwmutex_writer(t_rwmutex& mutex) : + t_rwmutex_guard(mutex) { // std::cout << "mtx wr lock " << (void*)&_mutex << std::endl; _mutex.lockWrite(); diff --git a/src/threads/mutex.h b/src/threads/mutex.h index 15d5181..d757d61 100644 --- a/src/threads/mutex.h +++ b/src/threads/mutex.h @@ -95,17 +95,22 @@ public: void unlock(); }; -class t_rwmutex_reader { -private: +// Base (abstract) class +class t_rwmutex_guard { +protected: t_rwmutex& _mutex; + + // A protected constructor to keep this class abstract + t_rwmutex_guard(t_rwmutex& mutex); +}; + +class t_rwmutex_reader : public t_rwmutex_guard { public: t_rwmutex_reader(t_rwmutex& mutex); ~t_rwmutex_reader(); }; -class t_rwmutex_writer { -private: - t_rwmutex& _mutex; +class t_rwmutex_writer : public t_rwmutex_guard { public: t_rwmutex_writer(t_rwmutex& mutex); ~t_rwmutex_writer(); -- cgit v1.2.3 From 91de36717a119f9501698af97550bfcdffd2875a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Fri, 27 Dec 2019 02:26:38 -0500 Subject: Introduce read-write-update locks and guards to prevent deadlocks This converts t_rwmutex and t_rwmutex_guard into a read-write-update[*] lock and guard, in an attempt to circumvent the various deadlocks that were introduced with the addition of lines_mtx in 38bb6b7. [*] For more details, see https://stackoverflow.com/a/18785300 and http://lkml.iu.edu/hypermail/linux/kernel/0004.3/0117.html. Note that this is not a real fix; this would require analyzing and refactoring phone.cpp, which is well beyond my abilities. This is at best a workaround that appears to conveniently dodge all the deadlocks I've encountered so far. (It would have been more proper to introduce a separate class for this purpose, but this would have required modifying over 80 lines just to change one type for another. As phone_users_mtx is the only other instance of this class, the impact of subverting t_rwmutex directly is minimal.) --- src/CMakeLists.txt | 1 + src/threads/mutex.cpp | 143 +++++++++++++++++++++++++++++++++++++++++++++----- src/threads/mutex.h | 68 ++++++++++++++++++++++++ 3 files changed, 199 insertions(+), 13 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 01f4997..0770bce 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -81,6 +81,7 @@ add_executable(twinkle-console ) set(twinkle_LIBS + -latomic -lpthread -lresolv ${LibMagic_LIBRARY} diff --git a/src/threads/mutex.cpp b/src/threads/mutex.cpp index 7eaa329..4c8c078 100644 --- a/src/threads/mutex.cpp +++ b/src/threads/mutex.cpp @@ -94,7 +94,13 @@ t_mutex_guard::~t_mutex_guard() { // t_rwmutex /////////////////////////// -t_rwmutex::t_rwmutex() +// Equivalent of an invalid thread ID, to be used when initializing t_rwmutex +// or when releasing upgrade ownership; the use of pthread_self() is only to +// provide a dummy value of the appropriate type. +static const optional_pthread_t invalid_thread_id = { false, pthread_self() }; + +t_rwmutex::t_rwmutex() : + _up_mutex_thread( invalid_thread_id ) { int ret = pthread_rwlock_init(&_lock, nullptr); if (ret != 0) throw string( @@ -106,56 +112,167 @@ t_rwmutex::~t_rwmutex() pthread_rwlock_destroy(&_lock); } -void t_rwmutex::lockRead() +void t_rwmutex::getUpgradeOwnership() +{ + _up_mutex.lock(); + _up_mutex_thread = { true, pthread_self() }; +} + +void t_rwmutex::releaseUpgradeOwnership() +{ + _up_mutex_thread = invalid_thread_id; + _up_mutex.unlock(); +} + +bool t_rwmutex::isUpgradeOwnershipOurs() const +{ + // Note that we don't need a mutex over _up_mutex_thread, being atomic + // is enough for our purposes. (We don't care about *who* owns + // _up_mutex, only about whether or not *we* own it, a fact which only + // our own thread can modify.) + optional_pthread_t lockOwner = _up_mutex_thread; + return lockOwner.has_value && pthread_equal(lockOwner.value, pthread_self()); +} + +void t_rwmutex::_lockRead() { int err = pthread_rwlock_rdlock(&_lock); if (err != 0) throw std::logic_error("Mutex lock failed"); } -void t_rwmutex::lockWrite() +void t_rwmutex::_lockWrite() { int err = pthread_rwlock_wrlock(&_lock); if (err != 0) throw std::logic_error("Mutex lock failed"); } -void t_rwmutex::unlock() +void t_rwmutex::_unlock() { pthread_rwlock_unlock(&_lock); } +void t_rwmutex::lockRead() +{ + if (isUpgradeOwnershipOurs()) { + throw std::logic_error("Acquiring read lock while holding update/write lock is not supported"); + } + + _lockRead(); +} + +void t_rwmutex::lockUpdate() +{ + if (isUpgradeOwnershipOurs()) { + throw std::logic_error("Acquiring update lock while holding update/write lock is not supported"); + } + + getUpgradeOwnership(); + _lockRead(); +} + +void t_rwmutex::lockWrite() +{ + if (isUpgradeOwnershipOurs()) { + throw std::logic_error("Acquiring write lock while holding update/write lock is not supported"); + } + + getUpgradeOwnership(); + _lockWrite(); +} + +void t_rwmutex::unlock() +{ + _unlock(); + + if (isUpgradeOwnershipOurs()) { + releaseUpgradeOwnership(); + } +} + +void t_rwmutex::upgradeLock() +{ + if (!isUpgradeOwnershipOurs()) { + throw std::logic_error("Attempting to upgrade a lock without upgrade ownership"); + } + + _unlock(); + _lockWrite(); +} + +void t_rwmutex::downgradeLock() +{ + if (!isUpgradeOwnershipOurs()) { + throw std::logic_error("Attempting to downgrade a lock without upgrade ownership"); + } + + _unlock(); + _lockRead(); +} + /////////////////////////// // t_rwmutex_guard /////////////////////////// t_rwmutex_guard::t_rwmutex_guard(t_rwmutex& mutex) : - _mutex(mutex) + _mutex(mutex), + _previously_owned_upgrade(_mutex.isUpgradeOwnershipOurs()) { } t_rwmutex_reader::t_rwmutex_reader(t_rwmutex& mutex) : t_rwmutex_guard(mutex) { - // std::cout << "mtx rd lock " << (void*)&_mutex << std::endl; - _mutex.lockRead(); + // No-op if we are nested within a writer/future_writer guard + if (!_previously_owned_upgrade) { + _mutex.lockRead(); + } } t_rwmutex_reader::~t_rwmutex_reader() { - // std::cout << "mtx rd unlock " << (void*)&_mutex << std::endl; - _mutex.unlock(); + // No-op if we are nested within a writer/future_writer guard + if (!_previously_owned_upgrade) { + _mutex.unlock(); + } +} + +t_rwmutex_future_writer::t_rwmutex_future_writer(t_rwmutex& mutex) : + t_rwmutex_guard(mutex) +{ + // No-op if we are nested within a future_writer guard + if (!_previously_owned_upgrade) { + _mutex.lockUpdate(); + } +} + +t_rwmutex_future_writer::~t_rwmutex_future_writer() { + // No-op if we are nested within a future_writer guard + if (!_previously_owned_upgrade) { + _mutex.unlock(); + } } t_rwmutex_writer::t_rwmutex_writer(t_rwmutex& mutex) : t_rwmutex_guard(mutex) { - // std::cout << "mtx wr lock " << (void*)&_mutex << std::endl; - _mutex.lockWrite(); + if (_previously_owned_upgrade) { + // Writer nested inside a future_writer: upgrade lock + _mutex.upgradeLock(); + } else { + // Stand-alone writer guard + _mutex.lockWrite(); + } } t_rwmutex_writer::~t_rwmutex_writer() { - // std::cout << "mtx wr unlock " << (void*)&_mutex << std::endl; - _mutex.unlock(); + if (_previously_owned_upgrade) { + // We were nested within a future_writer guard, so return + // the mutex to its previous state + _mutex.downgradeLock(); + } else { + _mutex.unlock(); + } } diff --git a/src/threads/mutex.h b/src/threads/mutex.h index d757d61..0d45a5f 100644 --- a/src/threads/mutex.h +++ b/src/threads/mutex.h @@ -21,6 +21,7 @@ #include #include // #include +#include /** * @file @@ -83,33 +84,100 @@ public: ~t_mutex_guard(); }; + +// Read-write-update lock +// +// Read-write lock with an additional "update" type of lock, which can later +// be upgraded to "write" (and downgraded back to "update" again). An update +// lock can co-exist with other read locks, but only one update lock can be +// held at any time, representing ownership of upgrade rights. +// +// See https://stackoverflow.com/a/18785300 for details and further references. +// +// Note that our version is rather simplistic, and does not allow downgrading +// from update/write to read. + +// A cheap substitute for std::optional, only available in C++14. +// Unfortunately, POSIX.1-2004 no longer requires pthread_t to be an arithmetic +// type, so we can't simply use 0 as an (unofficial) invalid thread ID. +struct optional_pthread_t { + bool has_value; + pthread_t value; +}; + class t_rwmutex { protected: + // Standard read-write lock pthread_rwlock_t _lock; + // Mutex for upgrade ownership + t_mutex _up_mutex; + // Thread ID that currently owns the _up_mutex lock, if any + std::atomic _up_mutex_thread; + + // Get/release upgrade ownership + void getUpgradeOwnership(); + void releaseUpgradeOwnership(); + + // Internal methods to manipulate _lock directly + void _lockRead(); + void _lockWrite(); + void _unlock(); public: t_rwmutex(); ~t_rwmutex(); + // Returns true if the calling thread currently owns the _up_mutex lock + bool isUpgradeOwnershipOurs() const; + + // The usual methods for obtaining/releasing locks void lockRead(); + void lockUpdate(); void lockWrite(); void unlock(); + + // Upgrade an update lock to a write lock, or downgrade in the + // opposite direction. Note that this does not count as an additional + // lock, so only one unlock() call will be needed at the end. + void upgradeLock(); + void downgradeLock(); }; + +// Equivalent of t_mutex_guard for t_rwmutex +// +// These can be nested as indicated below. Note that nesting a weaker guard +// will not downgrade the lock; for example, a Reader guard within a Writer +// guard will maintain the write lock. + // Base (abstract) class class t_rwmutex_guard { protected: + // The lock itself t_rwmutex& _mutex; + // Whether or not we had upgrade ownership beforehand, indicating that + // we are nested within the scope of a writer/future_writer guard + bool _previously_owned_upgrade; + // A protected constructor to keep this class abstract t_rwmutex_guard(t_rwmutex& mutex); }; +// Reader: Can be nested within the scope of any guard class t_rwmutex_reader : public t_rwmutex_guard { public: t_rwmutex_reader(t_rwmutex& mutex); ~t_rwmutex_reader(); }; +// Future writer: Can be nested within the scope of a future_writer guard +class t_rwmutex_future_writer : public t_rwmutex_guard { +public: + t_rwmutex_future_writer(t_rwmutex& mutex); + ~t_rwmutex_future_writer(); +}; + +// Writer: Can be nested within the scope of a future_writer guard class t_rwmutex_writer : public t_rwmutex_guard { public: t_rwmutex_writer(t_rwmutex& mutex); -- cgit v1.2.3 From 21ad823ba038f28a58f0f660cc7ebe902dd459b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Sun, 29 Sep 2019 00:07:00 -0400 Subject: Fix "INVITE with Replaces header" deadlock This occurs on reception of an INVITE with a Replaces header, due to the following path: - recvd_invite() acquires a read lock on lines_mtx - recvd_initial_invite() is called - A write lock over lines_mtx is acquired --- src/phone.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/phone.cpp b/src/phone.cpp index 8de3834..a609bef 100644 --- a/src/phone.cpp +++ b/src/phone.cpp @@ -905,7 +905,7 @@ void t_phone::post_process_response(t_response *r, t_tuid tuid, t_tid tid) { } void t_phone::recvd_invite(t_request *r, t_tid tid) { - t_rwmutex_reader x(lines_mtx); + t_rwmutex_future_writer x(lines_mtx); // Check if this INVITE is a retransmission. // Once the TU sent a 2XX repsonse on an INVITE it has to deal -- cgit v1.2.3 From 52fbf19819e911d590da3766898615d6c21027c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Sun, 29 Sep 2019 00:20:23 -0400 Subject: Fix "NOTIFY received when line is idle" deadlock This can easily be triggered by starting a blind transfer, and hanging up before the other end has accepted/rejected it, due to the following path: - recvd_notify() acquires a read lock on lines_mtx - cleanup_dead_lines() is called - A write lock on lines_mtx is acquired --- src/phone.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/phone.cpp b/src/phone.cpp index a609bef..c4e515f 100644 --- a/src/phone.cpp +++ b/src/phone.cpp @@ -1704,7 +1704,7 @@ void t_phone::recvd_notify(t_request *r, t_tid tid) { } // REFER notification - t_rwmutex_reader x(lines_mtx); + t_rwmutex_future_writer x(lines_mtx); for (unsigned short i = 0; i < lines.size(); i++) { if (lines[i]->match(r)) { lines[i]->recvd_notify(r, tid); -- cgit v1.2.3 From 31a25748fccca729e402aca15fca67eb9cc43c03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Sun, 29 Sep 2019 00:27:52 -0400 Subject: Fix "Transfer with consultation without Replaces" deadlock This occurs when performing a consult transfer if the target does not support the Replaces extension, due to the following path: - refer() acquires a read lock over lines_mtx - refer_consultation() is called - A write lock over lines_mtx is acquired Closes #118 --- src/phone.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/phone.cpp b/src/phone.cpp index c4e515f..401abb1 100644 --- a/src/phone.cpp +++ b/src/phone.cpp @@ -339,7 +339,7 @@ void t_phone::refer(const t_url &uri, const string &display) { void t_phone::refer(unsigned short lineno_from, unsigned short lineno_to) { - t_rwmutex_reader x(lines_mtx); + t_rwmutex_future_writer x(lines_mtx); // The nicest transfer is an attended transfer. An attended transfer // is only possible of the transfer target supports the 'replaces' -- cgit v1.2.3 From f1102b9a5e4e45434fb6e581b40f06d8ef39c911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Sun, 29 Sep 2019 00:38:15 -0400 Subject: Fix "REFER declined" deadlock This occurs when the user declines an incoming call transfer request, due to the following path: - recvd_refer_permission() acquires a read lock over lines_mtx - move_releasing_lines_to_background() is called - A write lock over lines_mtx is acquired --- src/phone.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/phone.cpp b/src/phone.cpp index 401abb1..2718c82 100644 --- a/src/phone.cpp +++ b/src/phone.cpp @@ -1871,7 +1871,7 @@ void t_phone::recvd_refer_permission(bool permission) { t_phone_user *pu = incoming_refer_data->get_phone_user(); t_user *user_config = pu->get_user_profile(); - t_rwmutex_reader x(lines_mtx); + t_rwmutex_future_writer x(lines_mtx); lines[i]->recvd_refer_permission(permission, r); if (!permission) { -- cgit v1.2.3 From 97ba6270f0ec26a09943715208b89baf31015aa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Sat, 21 Dec 2019 19:04:31 -0500 Subject: Add -DDEBUG to non-release builds, to prevent uCommon from adding NDEBUG Including will (as of uCommon 7.0.0) unilaterally define NDEBUG, and thus compile away any assert(), unless DEBUG has been previously defined.[1] Until this is fixed, the easiest way around this is simply to automatically define DEBUG for non-release builds. Note that there are a few other header files that check for the presence of DEBUG[2], but the net effect appears to be non-significant. (It *is* a debug build, after all!) [1] https://lists.gnu.org/archive/html/bug-commoncpp/2019-12/msg00000.html [2] - libxml2/libxml/xmlmemory.h - X11/Xthreads.h - X11/extensions/lbxproto.h - FLAC/assert.h --- CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5315383..1a6d4be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,14 @@ project(twinkle) -cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR) +cmake_minimum_required(VERSION 2.8.10 FATAL_ERROR) set(PRODUCT_VERSION "1.10.2") set(PRODUCT_DATE "February 14, 2018") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") +# Add -DDEBUG for non-release builds, or uCommon will unilaterally define NDEBUG +# (https://lists.gnu.org/archive/html/bug-commoncpp/2019-12/msg00000.html) +set_directory_properties(PROPERTIES + COMPILE_DEFINITIONS $<$,$>:DEBUG>) OPTION(WITH_ZRTP "Enable ZRTP encrypted calls" OFF) OPTION(WITH_SPEEX "Enable the Speex codec" OFF) -- cgit v1.2.3 From fae16c96e46834fbd860ee508885b26206525988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Fri, 27 Dec 2019 15:33:15 -0500 Subject: Switch Travis CI distribution to bionic Older versions of ccrtp under trusty/xenial do not compile with g++ 7+, so moving on to bionic will finally allow us to test modern compilers. (Ironically, current ccrtp will no longer compile with g++ 4.9.) Note that libzrtpcpp is no longer available on bionic, so it was disabled from the tests. --- .travis.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index de77d41..0a4e25e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,20 +1,19 @@ language: cpp -dist: trusty +dist: bionic sudo: required env: global: - - FLAGS="-DWITH_QT5=ON -DWITH_ALSA=ON -DWITH_GSM=ON -DWITH_SPEEX=ON -DWITH_ZRTP=ON" + - FLAGS="-DWITH_QT5=ON -DWITH_ALSA=ON -DWITH_GSM=ON -DWITH_SPEEX=ON -DWITH_ZRTP=OFF" # (qttools5-dev-tools is explicitly included because of Debian bug #835295) - - PACKAGES="libasound2-dev libgsm1-dev libspeex-dev libspeexdsp-dev libzrtpcpp-dev qtdeclarative5-dev qttools5-dev qttools5-dev-tools" + - PACKAGES="libasound2-dev libgsm1-dev libspeex-dev libspeexdsp-dev qtdeclarative5-dev qttools5-dev qttools5-dev-tools" matrix: # Test various compiler versions - - PACKAGES_ADD="g++-4.9" MATRIX_EVAL="CC=gcc-4.9 && CXX=g++-4.9" - PACKAGES_ADD="g++-5" MATRIX_EVAL="CC=gcc-5 && CXX=g++-5" - PACKAGES_ADD="g++-6" MATRIX_EVAL="CC=gcc-6 && CXX=g++-6" - # The version of uCommon available on trusty (6.0.7) will cause a build - # failure when compiling with GCC 7 or Clang. - #- PACKAGES_ADD="g++-7" MATRIX_EVAL="CC=gcc-7 && CXX=g++-7" + - PACKAGES_ADD="g++-7" MATRIX_EVAL="CC=gcc-7 && CXX=g++-7" + - PACKAGES_ADD="g++-8" MATRIX_EVAL="CC=gcc-8 && CXX=g++-8" + - PACKAGES_ADD="g++-9" MATRIX_EVAL="CC=gcc-9 && CXX=g++-9" # Test with all options disabled - FLAGS="-DWITH_QT5=OFF -DWITH_ALSA=OFF -DWITH_GSM=OFF -DWITH_SPEEX=OFF -DWITH_ZRTP=OFF" PACKAGES="" -- cgit v1.2.3 From 2e33ed900c19855057051a0346678953f5452d32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Fri, 27 Dec 2019 16:03:07 -0500 Subject: Test building with Clang as well as GCC on Travis CI Twinkle didn't compile with Clang back on trusty (due to libucommon); now that we've upgraded to bionic, we can finally test building with it. --- .travis.yml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0a4e25e..67a721c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,11 +9,15 @@ env: - PACKAGES="libasound2-dev libgsm1-dev libspeex-dev libspeexdsp-dev qtdeclarative5-dev qttools5-dev qttools5-dev-tools" matrix: # Test various compiler versions - - PACKAGES_ADD="g++-5" MATRIX_EVAL="CC=gcc-5 && CXX=g++-5" - - PACKAGES_ADD="g++-6" MATRIX_EVAL="CC=gcc-6 && CXX=g++-6" - - PACKAGES_ADD="g++-7" MATRIX_EVAL="CC=gcc-7 && CXX=g++-7" - - PACKAGES_ADD="g++-8" MATRIX_EVAL="CC=gcc-8 && CXX=g++-8" - - PACKAGES_ADD="g++-9" MATRIX_EVAL="CC=gcc-9 && CXX=g++-9" + - PACKAGES_ADD="g++-5" MATRIX_EVAL="CC=gcc-5 && CXX=g++-5" + - PACKAGES_ADD="g++-6" MATRIX_EVAL="CC=gcc-6 && CXX=g++-6" + - PACKAGES_ADD="g++-7" MATRIX_EVAL="CC=gcc-7 && CXX=g++-7" + - PACKAGES_ADD="g++-8" MATRIX_EVAL="CC=gcc-8 && CXX=g++-8" + - PACKAGES_ADD="g++-9" MATRIX_EVAL="CC=gcc-9 && CXX=g++-9" + - PACKAGES_ADD="clang-3.9" MATRIX_EVAL="CC=clang-3.9 && CXX=clang++-3.9" + - PACKAGES_ADD="clang-4.0" MATRIX_EVAL="CC=clang-4.0 && CXX=clang++-4.0" + - PACKAGES_ADD="clang-5.0" MATRIX_EVAL="CC=clang-5.0 && CXX=clang++-5.0" + - PACKAGES_ADD="clang-6.0" MATRIX_EVAL="CC=clang-6.0 && CXX=clang++-6.0" # Test with all options disabled - FLAGS="-DWITH_QT5=OFF -DWITH_ALSA=OFF -DWITH_GSM=OFF -DWITH_SPEEX=OFF -DWITH_ZRTP=OFF" PACKAGES="" -- cgit v1.2.3 From 62ff5807d14bb4f4f794f7dd6a99fb975d45e932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Fri, 27 Dec 2019 16:24:42 -0500 Subject: Also test building with Clang 7 and 8 (These are present in bionic-updates, which I had forgotten about.) --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 67a721c..671a119 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,6 +18,8 @@ env: - PACKAGES_ADD="clang-4.0" MATRIX_EVAL="CC=clang-4.0 && CXX=clang++-4.0" - PACKAGES_ADD="clang-5.0" MATRIX_EVAL="CC=clang-5.0 && CXX=clang++-5.0" - PACKAGES_ADD="clang-6.0" MATRIX_EVAL="CC=clang-6.0 && CXX=clang++-6.0" + - PACKAGES_ADD="clang-7" MATRIX_EVAL="CC=clang-7 && CXX=clang++-7" + - PACKAGES_ADD="clang-8" MATRIX_EVAL="CC=clang-8 && CXX=clang++-8" # Test with all options disabled - FLAGS="-DWITH_QT5=OFF -DWITH_ALSA=OFF -DWITH_GSM=OFF -DWITH_SPEEX=OFF -DWITH_ZRTP=OFF" PACKAGES="" -- cgit v1.2.3 From 4df6baa5ac4c9d96d5209b4f49390dc52a25f09d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Mon, 12 Feb 2018 19:22:53 -0500 Subject: CMake: Check for strerror_r() (HAVE_STRERROR_R and STRERROR_R_CHAR_P) This check (AC_FUNC_STRERROR_R) was originally present in configure.in, and was lost in the transition to CMake. --- CMakeLists.txt | 16 ++++++++++++++++ src/util.cpp | 4 ++-- twinkle_config.h.in | 2 ++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5315383..959bd26 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,6 +19,8 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") include (CheckIncludeFile) include (CheckIncludeFiles) +include (CheckSymbolExists) +include (CheckCXXSourceCompiles) find_package(LibXml2 REQUIRED) find_package(LibMagic REQUIRED) @@ -121,6 +123,20 @@ check_include_file(unistd.h HAVE_UNISTD_H) check_include_file(linux/types.h HAVE_LINUX_TYPES_H) check_include_files("sys/socket.h;linux/errqueue.h" HAVE_LINUX_ERRQUEUE_H) +check_symbol_exists(strerror_r "string.h" HAVE_STRERROR_R) +if (HAVE_STRERROR_R) + # Check whether the return type is (int) or (char *) + # Code taken from Apache Thrift's ConfigureChecks.cmake + check_cxx_source_compiles(" + #include + int main() { + char b; + char *a = strerror_r(0, &b, 0); + return 0; + } + " STRERROR_R_CHAR_P) +endif (HAVE_STRERROR_R) + set(datadir "${CMAKE_INSTALL_PREFIX}/share/twinkle") configure_file(twinkle_config.h.in twinkle_config.h) configure_file(twinkle.desktop.in twinkle.desktop) diff --git a/src/util.cpp b/src/util.cpp index 29aae39..60564a1 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -742,10 +742,10 @@ string to_printable(const string &s) { } string get_error_str(int errnum) { -#if HAVE_STRERROR_R +#ifdef HAVE_STRERROR_R char buf[81]; memset(buf, 0, sizeof(buf)); -#if STRERROR_R_CHAR_P +#ifdef STRERROR_R_CHAR_P string errmsg(strerror_r(errnum, buf, sizeof(buf)-1)); #else string errmsg; diff --git a/twinkle_config.h.in b/twinkle_config.h.in index 3928565..b7c678c 100644 --- a/twinkle_config.h.in +++ b/twinkle_config.h.in @@ -8,6 +8,8 @@ #cmakedefine HAVE_UNISTD_H #cmakedefine HAVE_LINUX_TYPES_H #cmakedefine HAVE_LINUX_ERRQUEUE_H +#cmakedefine HAVE_STRERROR_R +#cmakedefine STRERROR_R_CHAR_P #cmakedefine HAVE_LIBASOUND #define VERSION "${PRODUCT_VERSION}" -- cgit v1.2.3 From 87e996aaebdae6e2f07c8aa650b4eebdd00f0cba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Mon, 12 Feb 2018 19:28:16 -0500 Subject: CMake: Check for res_init() (HAVE_RES_INIT) This check (AC_CHECK_RES_INIT) was originally defined in acinclude.m4, and was lost in the transition to CMake. --- CMakeLists.txt | 13 +++++++++++++ src/sockets/dnssrv.cpp | 1 + twinkle_config.h.in | 1 + 3 files changed, 15 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 959bd26..ce718da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,7 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") include (CheckIncludeFile) include (CheckIncludeFiles) include (CheckSymbolExists) +include (CMakePushCheckState) include (CheckCXXSourceCompiles) find_package(LibXml2 REQUIRED) @@ -137,6 +138,18 @@ if (HAVE_STRERROR_R) " STRERROR_R_CHAR_P) endif (HAVE_STRERROR_R) +cmake_push_check_state() +list(APPEND CMAKE_REQUIRED_LIBRARIES "-lresolv") +check_cxx_source_compiles(" + #include + #include + #include + #include + + int main() { res_init(); return 0; } +" HAVE_RES_INIT) +cmake_pop_check_state() + set(datadir "${CMAKE_INSTALL_PREFIX}/share/twinkle") configure_file(twinkle_config.h.in twinkle_config.h) configure_file(twinkle.desktop.in twinkle.desktop) diff --git a/src/sockets/dnssrv.cpp b/src/sockets/dnssrv.cpp index 38cd61d..246bf02 100644 --- a/src/sockets/dnssrv.cpp +++ b/src/sockets/dnssrv.cpp @@ -11,6 +11,7 @@ #include #include #include +#include "twinkle_config.h" #include #include #include diff --git a/twinkle_config.h.in b/twinkle_config.h.in index b7c678c..9e32712 100644 --- a/twinkle_config.h.in +++ b/twinkle_config.h.in @@ -10,6 +10,7 @@ #cmakedefine HAVE_LINUX_ERRQUEUE_H #cmakedefine HAVE_STRERROR_R #cmakedefine STRERROR_R_CHAR_P +#cmakedefine HAVE_RES_INIT #cmakedefine HAVE_LIBASOUND #define VERSION "${PRODUCT_VERSION}" -- cgit v1.2.3 From 5635f7c2483c4ceac5c0e1cf5e522f7be32fd2f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Mon, 12 Feb 2018 20:02:11 -0500 Subject: CMake: Check for endianness (WORDS_BIGENDIAN) This check (AC_C_BIGENDIAN) was originally present in configure.in, and was lost in the transition to CMake. --- CMakeLists.txt | 3 +++ twinkle_config.h.in | 1 + 2 files changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index ce718da..c20bd16 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,7 @@ include (CheckIncludeFiles) include (CheckSymbolExists) include (CMakePushCheckState) include (CheckCXXSourceCompiles) +include (TestBigEndian) find_package(LibXml2 REQUIRED) find_package(LibMagic REQUIRED) @@ -150,6 +151,8 @@ check_cxx_source_compiles(" " HAVE_RES_INIT) cmake_pop_check_state() +test_big_endian(WORDS_BIGENDIAN) + set(datadir "${CMAKE_INSTALL_PREFIX}/share/twinkle") configure_file(twinkle_config.h.in twinkle_config.h) configure_file(twinkle.desktop.in twinkle.desktop) diff --git a/twinkle_config.h.in b/twinkle_config.h.in index 9e32712..2f03cf2 100644 --- a/twinkle_config.h.in +++ b/twinkle_config.h.in @@ -11,6 +11,7 @@ #cmakedefine HAVE_STRERROR_R #cmakedefine STRERROR_R_CHAR_P #cmakedefine HAVE_RES_INIT +#cmakedefine WORDS_BIGENDIAN #cmakedefine HAVE_LIBASOUND #define VERSION "${PRODUCT_VERSION}" -- cgit v1.2.3 From 6952b81fe89a136c0d087aa98cfbfd8bfc965818 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Tue, 13 Feb 2018 10:29:31 -0500 Subject: CMake: Check if libilbc links without 'extern "C"' (ILBC_CPP) This variable was originally set manually in configure.in. --- CMakeLists.txt | 3 +++ cmake/FindIlbc.cmake | 19 +++++++++++++++++++ twinkle_config.h.in | 1 + 3 files changed, 23 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index c20bd16..5e347b1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,6 +88,9 @@ if (WITH_ILBC) if (ILBC_FOUND) message(STATUS "iLBC OK") set(HAVE_ILBC TRUE) + if (ILBC_CPP) + set(HAVE_ILBC_CPP TRUE) + endif (ILBC_CPP) include_directories(${ILBC_INCLUDE_DIR}) else (ILBC_FOUND) diff --git a/cmake/FindIlbc.cmake b/cmake/FindIlbc.cmake index f66ca55..7bbffa9 100644 --- a/cmake/FindIlbc.cmake +++ b/cmake/FindIlbc.cmake @@ -1,8 +1,27 @@ +include (CMakePushCheckState) +include (CheckCXXSourceCompiles) + FIND_PATH(ILBC_INCLUDE_DIR ilbc/iLBC_decode.h) FIND_LIBRARY(ILBC_LIBRARIES NAMES ilbc) IF(ILBC_INCLUDE_DIR AND ILBC_LIBRARIES) SET(ILBC_FOUND TRUE) + + # Check if libilbc can be used without 'extern "C"' + CMAKE_PUSH_CHECK_STATE() + LIST(APPEND CMAKE_REQUIRED_INCLUDES "${ILBC_INCLUDE_DIR}") + LIST(APPEND CMAKE_REQUIRED_LIBRARIES "-lilbc") + SET(CMAKE_REQUIRED_QUIET TRUE) + CHECK_CXX_SOURCE_COMPILES(" + #include + + int main() { + iLBC_Dec_Inst_t *iLBCdec_inst; + initDecode(iLBCdec_inst, 0, 0); + return 0; + } + " ILBC_CPP) + CMAKE_POP_CHECK_STATE() ENDIF(ILBC_INCLUDE_DIR AND ILBC_LIBRARIES) IF(ILBC_FOUND) diff --git a/twinkle_config.h.in b/twinkle_config.h.in index 2f03cf2..4e649f7 100644 --- a/twinkle_config.h.in +++ b/twinkle_config.h.in @@ -1,6 +1,7 @@ #cmakedefine WITH_DIAMONDCARD #cmakedefine HAVE_SPEEX #cmakedefine HAVE_ILBC +#cmakedefine HAVE_ILBC_CPP #cmakedefine HAVE_ZRTP #cmakedefine HAVE_BCG729 #cmakedefine HAVE_GSM -- cgit v1.2.3 From 3a3a254bec9a447efaa988687b9890baab6a7426 Mon Sep 17 00:00:00 2001 From: 4-FLOSS-Free-Libre-Open-Source-Software <46166740+4-FLOSS-Free-Libre-Open-Source-Software@users.noreply.github.com> Date: Tue, 21 Jan 2020 14:02:59 +0100 Subject: let gui set MAX_PTIME cutoff 80ms --- src/gui/userprofileform.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/userprofileform.ui b/src/gui/userprofileform.ui index 4a11efa..f3683b8 100644 --- a/src/gui/userprofileform.ui +++ b/src/gui/userprofileform.ui @@ -823,7 +823,7 @@ This field is mandatory. 10 - 50 + 80 10 -- cgit v1.2.3 From f75d58ef753f553be2d37676933a0de2325b1f29 Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Wed, 19 Feb 2020 21:06:01 +0100 Subject: Fix typos in Czech translation --- src/gui/lang/twinkle_cs.ts | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/gui/lang/twinkle_cs.ts b/src/gui/lang/twinkle_cs.ts index dcd34af..34586ae 100644 --- a/src/gui/lang/twinkle_cs.ts +++ b/src/gui/lang/twinkle_cs.ts @@ -17,7 +17,7 @@ First name of contact. - Křestní jméno nebo jakékoliv jiné jméno. Bude třídicím klíčem. + Křestní jméno nebo jakékoliv jiné jméno. Bude třídícím klíčem. &First name: @@ -256,7 +256,7 @@ failed to publish - zveřejnění selhalho + zveřejnění selhalo request failed @@ -419,7 +419,7 @@ Over decadic D. Normally not needed. - Funční klávesa D. Používaná zřídka. + Funkční klávesa D. Používaná zřídka. 1 @@ -777,7 +777,7 @@ %1, STUN request failed. - %1, STUN diatz selhal. + %1, STUN dotaz selhal. %1, voice mail status failure. @@ -829,7 +829,7 @@ Cannot open web browser: %1 - Nemohu otevřit webový prohlížeč: %1 + Nemohu otevřít webový prohlížeč: %1 Configure your web browser in the system settings. @@ -1294,7 +1294,7 @@ With this option you request your SIP provider to hide your identity from the ca <b>Warning:</b> not all providers support identity hiding. </p> <p>S touto volbou dáváte najevo vašemu SIP poskytovateli, že nechcete aby byly na protistranu zaslánu informace o vaší identitě. Např. vaše SIP adresa nebo telefonní číslo. Nicméně vaše IP adresa bude protistraně <b>vždy</b> sdělena.</p> -<p><b>Upozornění: </b>Tuto možnost nenenabízejí všichni poskytovatelé!</p> +<p><b>Upozornění: </b>Tuto možnost nenabízejí všichni poskytovatelé!</p> Not all SIP providers support identity hiding. Make sure your SIP provider supports it if you really need it. @@ -2531,7 +2531,7 @@ Pokud je SAS shodný na obou stranách, klikněte na ikonku zámečku. Lze se o Redirect incoming call to - Příchozí hovor přeměrovat na + Příchozí hovor přesměrovat na You can specify up to 3 destinations to which you want to redirect the call. If the first destination does not answer the call, the second destination will be tried and so on. @@ -2602,7 +2602,7 @@ Pokud je SAS shodný na obou stranách, klikněte na ikonku zámečku. Lze se o Make the selected IP address the default IP address. The next time you start Twinkle, this IP address will be automatically selected. - Nastavit vybranou IP adresu jako výchozí. Při přístím startu Twinkle bude automaticky zvolena tato adresa. + Nastavit vybranou IP adresu jako výchozí. Při příštím startu Twinkle bude automaticky zvolena tato adresa. Set as default &NIC @@ -2701,7 +2701,7 @@ Pokud je SAS shodný na obou stranách, klikněte na ikonku zámečku. Lze se o Rename the highlighted profile. - Das ausgewählte Benutzerprofil umbenennen. + Přejmenovat označený profil. &Set as default @@ -2753,7 +2753,7 @@ Pokud je SAS shodný na obou stranách, klikněte na ikonku zámečku. Lze se o <html>You can use the profile editor to create a profile. With the profile editor you can change many settings to tune the SIP protocol, RTP and many other things.<br><br>Alternatively you can use the wizard to quickly setup a user profile. The wizard asks you only a few essential settings. If you create a user profile with the wizard you can still edit the full profile with the profile editor at a later time.<br><br>Choose what method you wish to use.</html> - <html>Pro vytvoření uživatelského profilu můžete použít editor profilu. Tento vám umožní změnit veškerá nastavení týkající se SIP protokolu, RTP jakož i dalších parametrů programu.<br><br>Popřípadě použijte Wizard pro rychlé a jednoduché nastavení základních paramtrů ke zvolenému uživatelskému profilu. Wizard se vás dotáže jen na nejzákladnější údaje, které vám váš SIP poskytovatel dá při zaregistrování. Pro některé poskytovatele vám budou dokonce některé z těchto údajů přímo wizardem nabídnuty. I přesto, že profil založíte pomocí wizardu ho budete moci později upravovat pomocí editoru.<br><br>Nápovědu získáte kdekoliv v Twinkle stiskem klávesové ombinace "Shift + F1", přes kontextovou nápovědu pomocí stisku pravého tlačítka na myši nebo stiskem na symbol "?" v pravém horním rohu okna.<br><br>Vyberte si jakým způsobem má být uživatelský profil založen.</html> + <html>Pro vytvoření uživatelského profilu můžete použít editor profilu. Tento vám umožní změnit veškerá nastavení týkající se SIP protokolu, RTP jakož i dalších parametrů programu.<br><br>Popřípadě použijte Wizard pro rychlé a jednoduché nastavení základních parametrů ke zvolenému uživatelskému profilu. Wizard se vás dotáže jen na nejzákladnější údaje, které vám váš SIP poskytovatel dá při zaregistrování. Pro některé poskytovatele vám budou dokonce některé z těchto údajů přímo wizardem nabídnuty. I přesto, že profil založíte pomocí wizardu ho budete moci později upravovat pomocí editoru.<br><br>Nápovědu získáte kdekoliv v Twinkle stiskem klávesové kombinace "Shift + F1", přes kontextovou nápovědu pomocí stisku pravého tlačítka na myši nebo stiskem na symbol "?" v pravém horním rohu okna.<br><br>Vyberte si jakým způsobem má být uživatelský profil založen.</html> <html>Next you may adjust the system settings. You can change these settings always at a later time.<br><br>Click OK to view and adjust the system settings.</html> @@ -3180,7 +3180,7 @@ Vyberte prosím aspoň jeden profil. When using ALSA, it is not recommended to use the default device for the microphone as it gives poor sound quality. - Při použítí ALSA rozhraní není doporučeno mít nastaveno pro mikrofon "standardní zařízení". Může to být příčinou špatné kvality zvuku. + Při použití ALSA rozhraní není doporučeno mít nastaveno pro mikrofon "standardní zařízení". Může to být příčinou špatné kvality zvuku. Reduce &noise from the microphone @@ -3896,7 +3896,7 @@ If before answering a call, the microphone or speaker appears to be invalid, a w %1 is not set to your home directory. - "%1" nní vaším domovským adresářem. + "%1" není vaším domovským adresářem. Directory %1 (%2) does not exist. @@ -4297,7 +4297,7 @@ Toto pole je povinné. When you tick this option Twinkle will first try to resolve a SIP address to an IP address itself. If it can, then the SIP request will be sent there. Only when it cannot resolve the address, it will send the SIP request to the proxy (note that an in-dialog request will only be sent to the proxy in this case when you also ticked the previous option.) - Pokud je aktivováno, pokusí se nejprve Twinkle najít k cílové adrese odpovídající IP adresu a poslat SIP dotaz přímo tam. Pokud se nepodaří IP adresu zjistit, je dotaz poslán na proxy. (Upozornění:in-dialog žádosti budou v tomto případě posílány na proxy, jen pokud je aktivována i předchozí volba.) + Pokud je aktivováno, pokusí se nejprve Twinkle najít k cílové adrese odpovídající IP adresu a poslat SIP dotaz přímo tam. Pokud se nepodaří IP adresu zjistit, je dotaz poslán na proxy. (Upozornění: in-dialog žádosti budou v tomto případě posílány na proxy, jen pokud je aktivována i předchozí volba.) The hostname, domain name or IP address of your outbound proxy. @@ -4466,7 +4466,7 @@ Systém VAD je vždy aktivován, pokud je nastaveno kódováni s VBR. Discontinuous transmission is an addition to VAD/VBR operation, that allows one to stop transmitting completely when the background noise is stationary. - Nesouvislé vysílání je rozšířením funkčnosi VAD/VBR, kdy je možné úplně přestat odesílat data v případě ticha. + Nesouvislé vysílání je rozšířením funkčnosti VAD/VBR, kdy je možné úplně přestat odesílat data v případě ticha. The dynamic type value (96 or higher) to be used for speex narrow band. @@ -4538,7 +4538,7 @@ Systém VAD je vždy aktivován, pokud je nastaveno kódováni s VBR. The pause after a DTMF tone. - Doba prodlevy mezi dvěmi DTMF tóny. + Doba prodlevy mezi dvěma DTMF tóny. DTMF &duration: @@ -4631,7 +4631,7 @@ Vysílá DTMF out-of-band přes požadavek SIP INFO.</p> Indicates if Twinkle should ask the user before redirecting a request when a 3XX response is received. - Pokud je aktivováno, dotáže se Twinkle při přijmutí požadavku 3XX uživatele, zda-li má být odchozí volání přesměrováno na nový cíl. + Pokud je aktivováno, dotáže se Twinkle při přijetí požadavku 3XX uživatele, zda-li má být odchozí volání přesměrováno na nový cíl. Max re&directions: @@ -4712,7 +4712,7 @@ Vysílá DTMF out-of-band přes požadavek SIP INFO.</p> <p>A SIP UAS may send SDP in a 1XX response for early media, e.g. ringing tone. When the call is answered the SIP UAS should send the same SDP in the 200 OK response according to RFC 3261. Once SDP has been received, SDP in subsequent responses should be discarded.</p> <p>By allowing SDP to change during call setup, Twinkle will not discard SDP in subsequent responses and modify the media stream if the SDP is changed. When the SDP in a response is changed, it must have a new version number in the o= line.</p> - <p>SIP UAS může odesílat SDP v 1XX odpovědi na zvuk zkraje hovoru, např. vyzváněcí tón. Pokud bude volání přijmuto, měl by SIP UAS dle RFC 3261 poslat to samé SDP v odpovědi 200 OK. Po přijmutí SDP by měly být všechny následující odpovědi SDP být zahozeny.</p> + <p>SIP UAS může odesílat SDP v 1XX odpovědi na zvuk zkraje hovoru, např. vyzváněcí tón. Pokud bude volání přijato, měl by SIP UAS dle RFC 3261 poslat to samé SDP v odpovědi 200 OK. Po přijetí SDP by měly být všechny následující odpovědi SDP být zahozeny.</p> <p>Pokud je povoleno, že se SDP během navázání hovoru může změnit, Twinkle nebude v následujících odpovědích ignorovat SDP, nýbrž změní požadovaným způsobem vlastnosti proudu RTP. Změněné SDP musí mít v "o=" řádku nové číslo verze.</p> @@ -4756,7 +4756,7 @@ Tento formát je používán většinou SIP telefonů. The Via, Route and Record-Route headers can be encoded as a list of comma separated values or as multiple occurrences of the same header. - Via-, Route- und Record-Route-Header mohou posílány zakódované jako seznam čárkou oddělených hodnot nebo jako jednotlivé hodnoty, každá ve své hlavičce. + Via-, Route- a Record-Route-Header mohou posílány zakódované jako seznam čárkou oddělených hodnot nebo jako jednotlivé hodnoty, každá ve své hlavičce. SIP extensions @@ -4796,7 +4796,7 @@ Tento formát je používán většinou SIP telefonů. <br><br> <b>povoleno</b>: 100rel je podporováno (je přidáno do odchozího INVITE jako podporovaná hlavička). Protistrana si potom může vyžádat PRACK na 1xx odpověď. <br><br> -<b>vyžadováno</b>: 100rel je vyžadováno. Požadavek je vložen do hlavičky require v odchozím INVITE. Pokud je v příchotím INVITE značeno, že je 100rel podporováno, pak bude Twinkle vyžadovat PRACK v odpovědi 1xx Pokud protistrana 100rel nepodporuje, nedojde k navázání spojení. +<b>vyžadováno</b>: 100rel je vyžadováno. Požadavek je vložen do hlavičky require v odchozím INVITE. Pokud je v příchozím INVITE značeno, že je 100rel podporováno, pak bude Twinkle vyžadovat PRACK v odpovědi 1xx Pokud protistrana 100rel nepodporuje, nedojde k navázání spojení. <br><br> <b>upřednostňováno</b>: Podobné jako "vyžadováno", akorát že v případě, že hovor selže, jelikož protistrana nepodporuje 100rel (odpověď 420), pak se Twinkle pokusí hovor znovu navázat bez vyžadování 100rel. @@ -5017,7 +5017,7 @@ K tomu jsou potřebné následující pravidla uvedená v tomto pořadí: </p> <blockquote> <tt> -Hledaný výraz = \+49([0-9]*) , Náhrada = 0$1<br> +Hledaný výraz = \+420([0-9]*) , Náhrada = 0$1<br> Hledaný výraz = \+([0-9]*) , Náhrada = 00$1</br> </tt> </blockquote> @@ -5031,7 +5031,7 @@ Hledaný výraz = 0[0-9]* , Náhrada = 9$&<br> </tt> </blockquote> ( $& je speciální proměnná, do které je uloženo celé originální číslo)<br> -Poznámka: Toto pravidlo nelze nastavit jednoduše jako třetí pravidlo ke dvou pravidlů z předcházejícího příkladu. Bude totiž použito vždy jen to první, které vyhledávání vyhoví. Namísto toho by muselo být změněno nahrazování v pravidlech 1 a 2 - "57$1" a "577$1" +Poznámka: Toto pravidlo nelze nastavit jednoduše jako třetí pravidlo ke dvou pravidlům z předcházejícího příkladu. Bude totiž použito vždy jen to první, které vyhledávání vyhoví. Namísto toho by muselo být změněno nahrazování v pravidlech 1 a 2 - "57$1" a "577$1" Move the selected number conversion rule upwards in the list. @@ -5230,7 +5230,7 @@ The values of all SIP headers of the outgoing 200 OK are passed in environment v <p> <b>TWINKLE_TRIGGER=in_call_answered</b>. <b>SIPSTATUS_CODE=200</b>. <b>SIPSTATUS_REASON</b> contains the reason phrase. The name of the user profile will be passed in <b>TWINKLE_USER_PROFILE</b>. <p> -Tento skript bude spuštěn, pokud bude příchozí hovor přijmut. +Tento skript bude spuštěn, pokud bude příchozí hovor přijat. </p> <h3>Systémové proměnné</h3> <p> @@ -5518,7 +5518,7 @@ Pokud je deaktivováno, použije Twinkle první kodek z vlastního seznamu, kter Include a P-Preferred-Identity header with your identity in an INVITE request for a call with identity hiding. - Pokud je vybráno a je aktivována volba "skrýt odesilatele", bude spolu s údajem odesilatele odeslána při požadavku INVITE hlacička P-Preferred-Identity. + Pokud je vybráno a je aktivována volba "skrýt odesilatele", bude spolu s údajem odesilatele odeslána při požadavku INVITE hlavička P-Preferred-Identity. <p> -- cgit v1.2.3 From 18c0f4b1ead38f816e869406dc88a6517057b934 Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Wed, 19 Feb 2020 21:25:00 +0100 Subject: Add Slovak translation --- src/gui/CMakeLists.txt | 1 + src/gui/lang/twinkle_sk.ts | 5818 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 5819 insertions(+) create mode 100644 src/gui/lang/twinkle_sk.ts diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index fca7d2e..6465640 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -37,6 +37,7 @@ set (twinkle_lang_SRC lang/twinkle_fr.ts lang/twinkle_nl.ts lang/twinkle_ru.ts + lang/twinkle_sk.ts lang/twinkle_sv.ts ) diff --git a/src/gui/lang/twinkle_sk.ts b/src/gui/lang/twinkle_sk.ts new file mode 100644 index 0000000..247de18 --- /dev/null +++ b/src/gui/lang/twinkle_sk.ts @@ -0,0 +1,5818 @@ + + + + + AddressCardForm + + Twinkle - Address Card + Twinkle - Záznam v adresári + + + &Remark: + P&oznámka: + + + Infix name of contact. + Prostredné meno. + + + First name of contact. + Krstné meno. + + + &First name: + &Krstné meno: + + + You may place any remark about the contact here. + Sem môžete vložiť akúkoľvek poznámku o kontakte. + + + &Phone: + &Telefón: + + + &Infix name: + &Prostredné meno: + + + Phone number or SIP address of contact. + Telefónne číslo alebo SIP adresa kontaktu. + + + Last name of contact. + Priezvisko kontaktu. + + + &Last name: + &Priezvisko: + + + &OK + &OK + + + Alt+O + Alt+O + + + &Cancel + &Zrušiť + + + Alt+C + Alt+Z + + + You must fill in a name. + Musíte zadať meno. + + + You must fill in a phone number or SIP address. + Musíte zadať telefónne číslo alebo SIP adresu. + + + + AddressTableModel + + Name + Meno + + + Phone + Telefón + + + Remark + Poznámka + + + + AuthenticationForm + + Twinkle - Authentication + Twinkle - Prihlásenie + + + user + No need to translate + user + + + The user for which authentication is requested. + Používateľ, ktorý sa má prihlásiť. + + + profile + No need to translate + profile + + + The user profile of the user for which authentication is requested. + Profil používateľa, pre ktorého je vyžadované prihlásenie. + + + User profile: + Profil používateľa: + + + User: + Používateľ: + + + &Password: + &Heslo: + + + Your password for authentication. + Vaše heslo na prihlásenie. + + + Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though. + Vaše prihlasovacie SIP meno. Často je rovnaké ako vaše SIP meno, no môže sa aj líšiť. + + + &User name: + Použí&vateľské meno: + + + &OK + &OK + + + &Cancel + &Zrušiť + + + Login required for realm: + Prihlásenie vyžadované pre realm: + + + realm + No need to translate + realm + + + The realm for which you need to authenticate. + Realm, ku ktorému je vyžadované prihlásenie. + + + + BuddyForm + + Twinkle - Buddy + Twinkle - Kontakt + + + Address book + Adresár + + + Select an address from the address book. + Vybrať adresu z adresára. + + + &Phone: + &Telefón: + + + Name of your buddy. + Meno vášho kontaktu. + + + &Show availability + Zobraziť dostupno&sť + + + Alt+S + Alt+S + + + Check this option if you want to see the availability of your buddy. This will only work if your provider offers a presence agent. + Vyberte túto možnosť, ak chcete vidieť dostupnosť vytvoreného kontaktu. Toto bude fungovať iba vtedy, ak váš poskytovateľ ponúka túto možnosť. + + + &Name: + &Meno: + + + SIP address your buddy. + SIP adresa vášho kontaktu. + + + &OK + &OK + + + Alt+O + Alt+O + + + &Cancel + &Zrušiť + + + Alt+C + Alt+Z + + + You must fill in a name. + Musíte zadať meno. + + + Invalid phone. + Neplatné telefónne číslo. + + + Failed to save buddy list: %1 + Nepodarilo sa uložiť zoznam kontaktov: %1 + + + + BuddyList + + Availability + Dostupnosť + + + unknown + neznáma + + + offline + offline + + + online + online + + + request rejected + požiadavka odmietnutá + + + not published + nie je zverejnená + + + failed to publish + zverejnenie zlyhalo + + + request failed + požiadavka zlyhala + + + Click right to add a buddy. + Pravým kliknutím pridáte kontakt. + + + + CoreAudio + + Failed to open sound card + Nepodarilo sa získať prístup ku zvukovej karte + + + Failed to create a UDP socket (RTP) on port %1 + Nepodarilo sa vytvoriť UDP socket (RTP) na porte %1 + + + Failed to create audio receiver thread. + Nepodarilo sa vytvoriť vlákno pre nahrávanie zvuku. + + + Failed to create audio transmitter thread. + Nepodarilo sa vytvoriť vlákno pre prehrávanie zvuku. + + + + CoreCallHistory + + local user + lokálny používateľ + + + remote user + vzdialený používateľ + + + failure + chyba + + + unknown + neznámy + + + in + prichádzajúce + + + out + odchádzajúce + + + + DeregisterForm + + Twinkle - Deregister + Twinkle - Odregistrovať + + + deregister all devices + odregistrovať všetky zariadenia + + + &OK + &OK + + + &Cancel + &Zrušiť + + + + DiamondcardProfileForm + + &Cancel + Zrušiť (Es&c) + + + Fill in your account ID. + Zadajte ID vášho účtu. + + + Fill in your PIN code. + Zadajte váš kód PIN. + + + A user profile with name %1 already exists. + Profil používateľa s menom %1 už existuje. + + + + DtmfForm + + Twinkle - DTMF + Twinkle - DTMF + + + Keypad + Numerická klávesnica + + + 2 + 2 + + + 3 + 3 + + + Over decadic A. Normally not needed. + Funkčný kláves A. Používaný zriedkavo. + + + 4 + 4 + + + 5 + 5 + + + 6 + 6 + + + Over decadic B. Normally not needed. + Funkčný kláves B. Používaný zriedkavo. + + + 7 + 7 + + + 8 + 8 + + + 9 + 9 + + + Over decadic C. Normally not needed. + Funkčný kláves C. Používaný zriedkavo. + + + Star (*) + Hviezdička (*) + + + 0 + 0 + + + Pound (#) + Mriežka (#) + + + Over decadic D. Normally not needed. + Funkčný kláves D. Používaný zriedkavo. + + + 1 + 1 + + + &Close + &Zavrieť + + + Alt+C + Alt+Z + + + + FreeDeskSysTray + + Show/Hide + Zobraziť/Minimalizovať + + + Quit + Ukončiť + + + + GUI + + The following profiles are both for user %1 + Nasledujúce profily používajú rovnakého používateľa %1 + + + You can only run multiple profiles for different users. + Viac profilov môžete používať iba pri rôznych používateľoch. + + + Cannot find a network interface. Twinkle will use 127.0.0.1 as the local IP address. When you connect to the network you have to restart Twinkle to use the correct IP address. + Nepodarilo sa nájsť sieťové rozhranie. Twinkle použije 127.0.0.1 ako svoju lokálnu IP adresu. Ak sa pripojíte k sieti neskôr, musíte Twinkle spustiť znovu, aby začal používať správnu IP adresu. + + + Line %1: incoming call for %2 + Linka %1: prichádzajúci hovor pre %2 + + + Call transferred by %1 + Volanie prepojené používateľom %1 + + + Line %1: far end cancelled call. + Linka %1: protistrana prerušila hovor. + + + Line %1: far end released call. + Linka %1: hovor ukončený protistranou. + + + Line %1: SDP answer from far end not supported. + Linka %1: SDP odpoveď protistrany nie je podporovaná. + + + Line %1: SDP answer from far end missing. + Linka %1: chýbajúca SDP odpoveď protistrany. + + + Line %1: Unsupported content type in answer from far end. + Linka %1: Typ obsahu v odpovedi protistrany nie je podporovaný. + + + Line %1: no ACK received, call will be terminated. + Linka %1: žiadny ACK od protistrany, volanie bude ukončené. + + + Line %1: no PRACK received, call will be terminated. + Linka %1: žiadny PRACK od protistrany, volanie bude ukončené. + + + Line %1: PRACK failed. + Linka %1: PRACK zlyhalo. + + + Line %1: failed to cancel call. + Linka %1: chyba pri pokuse o ukončenie hovoru. + + + Line %1: far end answered call. + Linka %1: protistrana prijala hovor. + + + Line %1: call failed. + Linka %1: volanie zlyhalo. + + + The call can be redirected to: + Hovor môže byť presmerovaný na: + + + Line %1: call released. + Linka %1: hovor ukončený. + + + Line %1: call established. + Linka %1:spojenie nadviazané. + + + Response on terminal capability request: %1 %2 + Odpoveď protistrany na požiadavku na výpis schopností: %1 %2 + + + Terminal capabilities of %1 + Schopnosti protistrany %1 + + + Accepted body types: + Akceptované "body types": + + + unknown + neznáme + + + Accepted encodings: + Akceptované kódovania: + + + Accepted languages: + Akceptované jazyky: + + + Allowed requests: + Povolené požiadavky: + + + Supported extensions: + Podporované rozšírenia: + + + none + žiadne + + + End point type: + Typ koncového zariadenia: + + + Line %1: call retrieve failed. + Linka %1: chyba pri pokuse o obnovenie hovoru. + + + %1, registration failed: %2 %3 + %1, neúspešné prihlásenie: %2 %3 + + + %1, registration succeeded (expires = %2 seconds) + %1, registrácia úspešná (platná na %2 sekúnd) + + + %1, registration failed: STUN failure + %1, registrácia skončila s chybou: zlyhanie STUN + + + %1, de-registration succeeded: %2 %3 + %1, úspešné odhlásenie: %2 %3 + + + %1, fetching registrations failed: %2 %3 + %1, chyba pri požiadavke na registráciu: %2 %3 + + + : you are not registered + : nie ste registrovaný + + + : you have the following registrations + : sú aktívne nasledujúce registrácie + + + : fetching registrations... + : prebieha požiadavka na registrácie... + + + Line %1: redirecting request to + Linka %1: požiadavka presmerovaná na + + + Redirecting request to: %1 + Presmerovať požiadavku na: %1 + + + Line %1: DTMF detected: + Linka %1: detegované DTMF: + + + invalid DTMF telephone event (%1) + neplatná udalosť DTMF (%1) + + + Line %1: send DTMF %2 + Linka %1: odosiela sa DTMF %2 + + + Line %1: far end does not support DTMF telephone events. + Linka %1: protistrana nepodporuje udalosti DTMF. + + + Line %1: received notification. + Linka %1: prijatá notifikácia. + + + Event: %1 + Udalosť: %1 + + + State: %1 + Stav: %1 + + + Reason: %1 + Dôvod: %1 + + + Progress: %1 %2 + Priebeh: %1 %2 + + + Line %1: call transfer failed. + Linka %1: prepojenie hovoru zlyhalo. + + + Line %1: call successfully transferred. + Linka %1: hovor bol úspešne prepojený. + + + Line %1: call transfer still in progress. + Linka %1: prepojenie hovoru stále prebieha. + + + No further notifications will be received. + Nebudú prijímané ďalšie notifikácie. + + + Line %1: transferring call to %2 + Linka %1: hovor sa prepája na %2 + + + Transfer requested by %1 + Prepojenie vyžiadal %1 + + + Line %1: Call transfer failed. Retrieving original call. + Linka %1: Prepojenie hovoru zlyhalo. Obnovujem pôvodný hovor. + + + Redirecting call + Presmerovávam hovor + + + User profile: + Profil používateľa: + + + User: + Používateľ: + + + Do you allow the call to be redirected to the following destination? + Súhlasíte, aby bol hovor presmerovaný na túto destináciu? + + + If you don't want to be asked this anymore, then you must change the settings in the SIP protocol section of the user profile. + Ak na túto otázku už ďalej nechcete odpovedať, musíte zmeniť nastavenia v sekcii protokol SIP v profile používateľa. + + + Redirecting request + Presmerovávam požiadavku + + + Do you allow the %1 request to be redirected to the following destination? + Má byť požiadavka %1 presmerovaná na nasledujúcu destináciu? + + + Transferring call + Prepájanie hovoru + + + Request to transfer call received from: + Požiadavka na prepojenie hovoru prijatá od: + + + Do you allow the call to be transferred to the following destination? + Povoliť prepojenie hovoru k nasledujúcej destinácii? + + + Info: + Info: + + + Warning: + Varovanie: + + + Critical: + Kritické: + + + Firewall / NAT discovery... + Detekcia firewallu/NATu... + + + Abort + Prerušiť + + + Line %1 + Linka %1 + + + Click the padlock to confirm a correct SAS. + Pre potvrdenie správneho hesla SAS kliknite na ikonu zámku. + + + The remote user on line %1 disabled the encryption. + Protistrana na linke %1 deaktivovala šifrovanie. + + + Line %1: SAS confirmed. + Linka %1: SAS potvrdené. + + + Line %1: SAS confirmation reset. + Linka %1: SAS potvrdenie vymazané. + + + Line %1: call rejected. + Linka %1: hovor odmietnutý. + + + Line %1: call redirected. + Linka %1: hovor presmerovaný. + + + Failed to start conference. + Nepodarilo sa zahájiť konferenciu. + + + Override lock file and start anyway? + Ignorovať súbor so zámkom a spustiť aj tak? + + + %1, STUN request failed: %2 %3 + %1, STUN požiadavka zlyhala: %2 %3 + + + %1, STUN request failed. + %1, STUN požiadavka zlyhala. + + + %1, voice mail status failure. + %1, chyba stavu hlasovej schránky. + + + %1, voice mail status rejected. + %1, odmietnutý stav hlasovej schránky. + + + %1, voice mailbox does not exist. + %1, hlasová schránka neexistuje. + + + %1, voice mail status terminated. + %1, ukončený prenos z hlasovej schránky. + + + %1, de-registration failed: %2 %3 + %1, deregistrácia zlyhala: %2 %3 + + + Request to transfer call received. + Prijatá požiadavka na prepojenie hovoru. + + + If these are users for different domains, then enable the following option in your user profile (SIP protocol) + Ak sú toto používatelia pre rôzne domény, aktivujte nasledujúcu voľbu v profile vášho používateľa (Protokol SIP) + + + Use domain name to create a unique contact header + Použiť doménové meno pre vytvorenie jedinečnej kontaktnej hlavičky + + + Failed to create a %1 socket (SIP) on port %2 + Zlyhalo vytvorenie %1 socketu (SIP) na porte %2 + + + Accepted by network + Akceptované sieťou + + + Failed to save message attachment: %1 + Zlyhalo uloženie prílohy správy: %1 + + + Transferred by: %1 + Prepojil: %1 + + + Cannot open web browser: %1 + Nemôžem otvoriť webový prehliadač: %1 + + + Configure your web browser in the system settings. + Nastavte váš webový prehliadač v nastaveniach systému. + + + + GetAddressForm + + Twinkle - Select address + Twinkle - Výber adresy + + + &Show only SIP addresses + Zobraziť iba adresy &SIP + + + Alt+S + Alt+S + + + Check this option when you only want to see contacts with SIP addresses, i.e. starting with "<b>sip:</b>". + Ak je aktivované, budú zobrazené iba kontakty, ktoré obsahujú platnú adresu SIP (začínajúcu na "<b>sip:</b>"). + + + &Reload + Aktua&lizovať + + + Alt+R + Alt+L + + + Reload the list of addresses from KAddressbook. + Znovu načítať zoznam adries z KAddressbook. + + + &OK + &OK + + + Alt+O + Alt+O + + + &Cancel + &Zrušiť + + + Alt+C + Alt+Z + + + &KAddressBook + &KAddressBook + + + This list of addresses is taken from <b>KAddressBook</b>. Contacts for which you did not provide a phone number are not shown here. To add, delete or modify address information you have to use KAddressBook. + Tento zoznam kontaktov pochádza z <b>KAddressBook</b>. Kontakty, ktoré neobsahujú telefónne číslo alebo adresu SIP tu nie sú uvedené. Pre vytvorenie alebo úpravu kontaktov použite program KAddressBook. + + + &Local address book + &Miestny adresár + + + Remark + Poznámka + + + Contacts in the local address book of Twinkle. + Kontakty v lokálnom adresári Twinkle. + + + &Add + Prid&ať + + + Alt+A + Alt+A + + + Add a new contact to the local address book. + Pridať nový kontakt do miestneho adresára. + + + &Delete + O&dstrániť + + + Alt+D + Alt+D + + + Delete a contact from the local address book. + Vymazať vybraný kontakt z miestneho adresára. + + + &Edit + &Upraviť + + + Alt+E + Alt+U + + + Edit a contact from the local address book. + Upraviť vybraný kontakt v miestnom adresári. + + + <p>You seem not to have any contacts with a phone number in <b>KAddressBook</b>, KDE's address book application. Twinkle retrieves all contacts with a phone number from KAddressBook. To manage your contacts you have to use KAddressBook.<p>As an alternative you may use Twinkle's local address book.</p> + Zdá sa, že <p><b>KAddressBook</b> neobsahuje žiadne záznamy s telefónnymi číslami, ktoré by Twinkle mohol načítať. Twinkle načítava z KAddressBook všetky kontakty s telefónnym číslom. Použite prosím tento program pre úpravu alebo pridanie vašich kontaktov.</p> +<p>Druhou možnosťou je použiť miestny adresár v Twinkle.</p> + + + + GetProfileNameForm + + Twinkle - Profile name + Twinkle - Názov profilu + + + &OK + &OK + + + &Cancel + &Zrušiť + + + Enter a name for your profile: + Zadajte názov profilu: + + + <b>The name of your profile</b> +<br><br> +A profile contains your user settings, e.g. your user name and password. You have to give each profile a name. +<br><br> +If you have multiple SIP accounts, you can create multiple profiles. When you startup Twinkle it will show you the list of profile names from which you can select the profile you want to run. +<br><br> +To remember your profiles easily you could use your SIP user name as a profile name, e.g. <b>example@example.com</b> + <b>Názov vášho profilu</b> +<br><br> +Profil obsahuje všetky nastavenia používateľa, napr. meno používateľa alebo heslo. Každý profil musí byť pomenovaný. +<br><br> +Ak máte viac SIP účtov, môžete si vytvoriť niekoľko profilov. Pri spustení vám Twinkle zobrazí zoznam názvov profilov, z ktorých si môžete vybrať tie, ktoré chcete spustiť. +<br><br> +Pre jednoduchšie zapamätanie profilu ich môžete pomenovať podľa vášho používateľského účtu, napr. <b>example@example.com</b> +</p> + + + Cannot find .twinkle directory in your home directory. + Nepodarilo sa nájsť adresár .twinkle vo vašom domovskom adresári. + + + Profile already exists. + Profil s týmto názvom už existuje. + + + Rename profile '%1' to: + Premenovať profil '%1' na: + + + + HistoryForm + + Twinkle - Call History + Twinkle - Zoznam volaní + + + Time + Čas + + + In/Out + Prichádzajúce/Odchádzajúce + + + From/To + Protistrana + + + Subject + Predmet + + + Status + Stav + + + Call details + Podrobnosti hovoru + + + Details of the selected call record. + Podrobnosti vybraného hovoru. + + + View + Zobraziť + + + &Incoming calls + &Prichádzajúce hovory + + + Alt+I + Alt+P + + + Check this option to show incoming calls. + Zaškrtnite túto voľbu pre zobrazenie prichádzajúcich hovorov. + + + &Outgoing calls + &Odchádzajúce hovory + + + Alt+O + Alt+O + + + Check this option to show outgoing calls. + Zaškrtnite túto voľbu pre zobrazenie odchádzajúcich hovorov. + + + &Answered calls + &Prijaté hovory + + + Alt+A + Alt+P + + + Check this option to show answered calls. + Zaškrtnite túto voľbu pre zobrazenie prijatých hovorov. + + + &Missed calls + &Zmeškané hovory + + + Alt+M + Alt+Z + + + Check this option to show missed calls. + Zaškrtnite túto voľbu pre zobrazenie zmeškaných hovorov. + + + Current &user profiles only + &Iba aktívne používateľské profily + + + Alt+U + Alt+I + + + Check this option to show only calls associated with this user profile. + Ak je táto voľba aktivovaná, budú zobrazené iba hovory, ktoré boli uskutočnené pod profilom tohto používateľa. + + + C&lear + &Vyčistiť + + + Alt+L + Alt+V + + + <p>Clear the complete call history.</p> +<p><b>Note:</b> this will clear <b>all</b> records, also records not shown depending on the checked view options.</p> + <p>Vymazať celú históriu volaní.</p> +<p><b>Poznámka:</b> Týmto sa vymažú všetky záznamy. Vrátane tých, ktoré momentálne - v závislosti od vybraných parametrov nastavení - nemusia byť zobrazené.</p> + + + Alt+C + Alt+S + + + Close this window. + Zavrieť toto okno. + + + Call start: + Začatý hovor: + + + Call answer: + Odpovedané na volanie: + + + Call end: + Hovor ukončený: + + + Call duration: + Trvanie hovoru: + + + Direction: + Smer: + + + From: + Od: + + + To: + Kam: + + + Reply to: + Odpovedať na: + + + Referred by: + Cez: + + + Subject: + Predmet: + + + Released by: + Ukončil: + + + Status: + Stav: + + + Far end device: + Zariadenie protistrany: + + + User profile: + Profil používateľa: + + + conversation + rozhovor + + + Call... + Volať... + + + Delete + Odstrániť + + + Re: + Odp: + + + Clo&se + Za&vrieť + + + Alt+S + Alt+S + + + &Call + &Volať + + + Call selected address. + Zavolať na vybranú adresu. + + + Number of calls: + Počet hovorov: + + + ### + ### + + + Total call duration: + Celkové trvanie hovorov: + + + + IncomingCallPopup + + %1 calling + %1 volá + + + + InviteForm + + Twinkle - Call + Twinkle - Volanie + + + &To: + K&am: + + + Optionally you can provide a subject here. This might be shown to the callee. + Tu môžete voliteľne zadať predmet hovoru, ktorý môže byť zobrazený volanému účastníkovi. + + + Address book + Adresár + + + Select an address from the address book. + Vybrať adresu z adresára. + + + The address that you want to call. This can be a full SIP address like <b>sip:example@example.com</b> or just the user part or telephone number of the full address. When you do not specify a full address, then Twinkle will complete the address by using the domain value of your user profile. + Adresa, na ktorú chcete zavolať. Toto môže byť plnohodnotná adresa SIP ako napr. <b>sip:priklad@priklad.com</b> alebo len meno používateľa, príp. telefónne číslo. Ak nie je zadaná úplná adresa, Twinkle ju doplní o doménové meno aktuálneho používateľského profilu. + + + The user that will make the call. + Používateľ, ktorý uskutoční hovor. + + + &Subject: + &Predmet: + + + &From: + &Od: + + + &OK + &OK + + + &Cancel + &Zrušiť + + + &Hide identity + &Skryť identitu volajúceho + + + Alt+H + Alt+H + + + <p> +With this option you request your SIP provider to hide your identity from the called party. This will only hide your identity, e.g. your SIP address, telephone number. It does <b>not</b> hide your IP address. +</p> +<p> +<b>Warning:</b> not all providers support identity hiding. +</p> + <p>Touto voľbou dávate najavo vášmu poskytovateľovi SIP, že si neželáte, aby boli protistrane zaslané informácie o vašej identite. Napr. vaša adresa SIP alebo telefónne číslo. Vaša IP adresa bude protistrane <b>vždy</b> zobrazená.</p> +<p><b>Upozornenie:</b> Túto možnosť nepodporujú všetci poskytovatelia!</p> + + + Not all SIP providers support identity hiding. Make sure your SIP provider supports it if you really need it. + Nie všetci poskytovatelia SIP umožňujú skrytie identity. Ak túto funkciu naozaj potrebujete, uistite sa, že ju váš poskytovateľ SIP ponúka. + + + F10 + F10 + + + + LogViewForm + + Twinkle - Log + Twinkle - Protokol + + + Contents of the current log file (~/.twinkle/twinkle.log) + Obsah aktuálneho súboru s protokolom (~/.twinkle/twinkle.log) + + + &Close + &Zavrieť + + + Alt+C + Alt+Z + + + C&lear + &Vyčistiť + + + Alt+L + Alt+V + + + Clear the log window. This does <b>not</b> clear the log file itself. + Vyčistiť okno s protokolom. Obsah samotného súboru s protokolom odstránený <b>nebude</b>. + + + + MessageForm + + Twinkle - Instant message + Twinkle - Textová správa + + + &To: + &Komu: + + + The user that will send the message. + Používateľ, ktorý pošle správu. + + + The address of the user that you want to send a message. This can be a full SIP address like <b>sip:example@example.com</b> or just the user part or telephone number of the full address. When you do not specify a full address, then Twinkle will complete the address by using the domain value of your user profile. + Adresa používateľa, ktorému chcete poslať správu. Môže to byť buď adresa SIP, ako napríklad <b>sip:priklad@priklad.com</b> alebo len používateľ, príp. telefónne číslo. Ak neuvediete celú adresu, Twinkle doplní adresu doménou z profilu vášho používateľského profilu. + + + Address book + Adresár + + + Select an address from the address book. + Výber adresy z adresára. + + + &User profile: + &Profil používateľa: + + + Conversation + Konverzácia + + + Type your message here and then press "send" to send it. + Sem napíšte správu a stlačením tlačidla "Odoslať" ju odošlite. + + + &Send + &Odoslať + + + Alt+S + Alt+D + + + Send the message. + Odoslať správu. + + + Delivery failure + Doručenie zlyhalo + + + Delivery notification + Potvrdenie o doručení + + + Send file... + Odoslať súbor... + + + Send file + Odoslať súbor + + + image size is scaled down in preview + obrázok je v náhľade zmenšený + + + Open with %1... + Otvoriť s %1... + + + Open with... + Otvoriť s... + + + Save attachment as... + Uložiť prílohu ako... + + + File already exists. Do you want to overwrite this file? + Súbor už existuje. Chcete tento súbor prepísať? + + + Failed to save attachment. + Chyba pri ukladaní prílohy. + + + %1 is typing a message. + %1 píše správu. + + + F10 + F10 + + + Size + Veľkosť + + + + MessageFormView + + sending message + odosielanie správy + + + + MphoneForm + + Twinkle + Twinkle + + + &Call: + Label in front of combobox to enter address + &Volané číslo: + + + The address that you want to call. This can be a full SIP address like <b>sip:example@example.com</b> or just the user part or telephone number of the full address. When you do not specify a full address, then Twinkle will complete the address by using the domain value of your user profile. + Adresa, na ktorú chcete zavolať. Toto môže byť plnohodnotná adresa SIP ako napr. <b>sip:priklad@priklad.com</b> alebo len meno používateľa, príp. telefónne číslo. Ak nie je zadaná úplná adresa, Twinkle ju doplní o doménové meno aktuálneho používateľského profilu. + + + The user that will make the call. + Používateľ, ktorý uskutoční volanie. + + + &User: + &Používateľ: + + + Dial + Volať + + + Dial the address. + Volať adresu. + + + Address book + Adresár + + + Select an address from the address book. + Vybrať adresu z adresára. + + + Auto answer indication. + Indikátor automatického príjmu hovoru. + + + Call redirect indication. + Indikátor presmerovania hovoru. + + + Do not disturb indication. + Indikátor stavu nerušiť. + + + Missed call indication. + Indikátor zmeškaných hovorov. + + + Registration status. + Stav registrácie. + + + Display + Správy + + + Line status + Stav linky + + + Line &1: + Linka &1: + + + Alt+1 + Alt+1 + + + Click to switch to line 1. + Kliknite pre prepnutie na linku 1. + + + From: + Od: + + + To: + Kam: + + + Subject: + Predmet: + + + idle + No need to translate + idle + + + Transferring call + Hovor bude presmerovaný + + + sas + No need to translate + sas + + + Short authentication string + Krátky overovací reťazec + + + g711a/g711a + No need to translate + g711a/g711a + + + Audio codec + Audio kodek + + + 0:00:00 + 0:00:00 + + + Call duration + Trvanie hovoru + + + sip:from + No need to translate + sip:from + + + sip:to + No need to translate + sip:to + + + subject + No need to translate + subject + + + photo + No need to translate + photo + + + Line &2: + Linka &2: + + + Alt+2 + Alt+2 + + + Click to switch to line 2. + Kliknite pre prepnutie na linku 2. + + + &File + &Súbor + + + &Edit + &Upraviť + + + C&all + &Hovor + + + Activate line + Vybrať linku + + + &Registration + &Registrácia + + + &Services + S&lužby + + + &View + &Zobraziť + + + &Help + Po&mocník + + + Quit + Ukončiť + + + &Quit + &Ukončiť + + + Ctrl+Q + Ctrl+Q + + + About Twinkle + O programe Twinkle + + + &About Twinkle + O &programe Twinkle + + + Call someone + Zavolať niekomu + + + F5 + F5 + + + Answer incoming call + Prijať prichádzajúci hovor + + + F6 + F6 + + + Release call + Ukončiť hovor + + + Reject incoming call + Odmietnuť prichádzajúci hovor + + + F8 + F8 + + + Put a call on hold, or retrieve a held call + Podržať hovor alebo pokračovať v podržanom hovore + + + Redirect incoming call without answering + Presmerovať prichádzajúci hovor bez prijatia hovoru + + + Open keypad to enter digits for voice menu's + Otvoriť numerickú klávesnicu pre hlasové menu + + + Register + Registrovať sa + + + &Register + &Registrovať sa + + + Deregister + Odregistrovať sa + + + &Deregister + &Odregistrovať sa + + + Deregister this device + Odregistrovať toto zariadenie + + + Show registrations + Zobraziť registrácie + + + &Show registrations + &Zobraziť registrácie + + + Terminal capabilities + Parametre protistrany + + + Request terminal capabilities from someone + Požiadavka na parametre protistrany + + + Do not disturb + Nerušiť + + + &Do not disturb + &Nerušiť + + + Call redirection + Presmerovanie hovoru + + + Call &redirection... + &Presmerovanie hovoru... + + + Repeat last call + Opakované vytáčanie + + + F12 + F12 + + + About Qt + O Qt + + + About &Qt + O &Qt + + + User profile + Profil používateľa + + + &User profile... + &Profil používateľa... + + + Join two calls in a 3-way conference + Spojiť dva hovory do konferencie + + + Mute a call + Vypnúť mikrofón + + + Transfer call + Presmerovať hovor + + + System settings + Nastavenia systému + + + &System settings... + &Nastavenia systému... + + + Deregister all + Všetko odregistrovať + + + Deregister &all + &Všetko odregistrovať + + + Deregister all your registered devices + Odregistrovať všetky registrované zariadenia + + + Auto answer + Automaticky prijímať volania + + + &Auto answer + &Automaticky prijímať volania + + + Log + Protokol + + + &Log... + &Protokol... + + + Call history + História volaní + + + Call &history... + &História volaní... + + + F9 + F9 + + + Change user ... + Zmeniť používateľa... + + + &Change user ... + &Zmeniť používateľa... + + + Activate or de-activate users + Aktivovať alebo deaktivovať používateľov + + + What's This? + Čo je toto? + + + What's &This? + Čo je &toto? + + + Shift+F1 + Shift+F1 + + + Line 1 + Linka 1 + + + Line 2 + Linka 2 + + + idle + voľná + + + dialing + vytáčam + + + attempting call, please wait + pokus o nadviazanie spojenia, prosím čakajte + + + incoming call + prichádzajúce volanie + + + establishing call, please wait + nadväzujem hovor, prosím čakajte + + + established + nadviazané + + + established (waiting for media) + nadviazané (čaká sa na zvuk) + + + releasing call, please wait + zavesujem, prosím čakajte + + + unknown state + neznámy stav + + + Voice is encrypted + Hovor je zašifrovaný + + + Click to confirm SAS. + Kliknite pre potvrdenie SAS. + + + Click to clear SAS verification. + Kliknite pre zrušenie overenia SAS. + + + User: + Používateľ: + + + Call: + Hovor: + + + Registration status: + Stav registrácie: + + + Registered + Registrovaný + + + Failed + Nepodarilo sa + + + Not registered + Neregistrovaný + + + No users are registered. + Nie je prihlásený žiaden používateľ. + + + Do not disturb active for: + Nerušiť aktivované pre: + + + Redirection active for: + Presmerovanie aktivované pre: + + + Auto answer active for: + Automatické prijímanie hovorov aktivované pre: + + + Do not disturb is not active. + Nerušiť nie je aktívne. + + + Redirection is not active. + Presmerovanie volaní nie je aktivované. + + + Auto answer is not active. + Automatické prijímanie hovorov nie je aktívne. + + + You have no missed calls. + Nemáte žiadne zmeškané hovory. + + + You missed 1 call. + 1 zmeškaný hovor. + + + You missed %1 calls. + %1 zmeškaných hovorov. + + + Click to see call history for details. + Kliknutím otvoríte podrobný zoznam hovorov. + + + Starting user profiles... + Štartujem profily používateľov... + + + The following profiles are both for user %1 + Nasledujúce profily používajú rovnakých používateľov %1 + + + You can only run multiple profiles for different users. + Rôzne profily musia používať rôznych používateľov. + + + You have changed the SIP UDP port. This setting will only become active when you restart Twinkle. + Bol zmenený port SIP UDP. Toto nastavenie bude aktívne až pri ďalšom spustení programu Twinkle. + + + Esc + Esc + + + Transfer consultation + Asistované presmerovanie + + + Hide identity + Skryť identitu + + + Click to show registrations. + Kliknutím zobrazíte registrácie. + + + %1 new, 1 old message + %1 nová, 1 stará správa + + + %1 new, %2 old messages + %1 nové, %2 staré správy + + + 1 new message + 1 nová správa + + + %1 new messages + %1 nových správ + + + 1 old message + 1 stará správa + + + %1 old messages + %1 starých správ + + + Messages waiting + Prijatých správ + + + No messages + Žiadne správy + + + <b>Voice mail status:</b> + <b>Stav hlasovej schránky:</b> + + + Failure + Chyba + + + Unknown + Neznámy + + + Click to access voice mail. + Kliknutím vstúpite do hlasovej schránky. + + + Click to activate/deactivate + Kliknutím aktivujete/deaktivujete + + + Click to activate + Kliknutím aktivujete + + + not provisioned + nie je poskytované + + + You must provision your voice mail address in your user profile, before you can access it. + Skôr ako vám bude umožnené použiť hlasovú schránku je potrebné nastaviť jej adresu v profile používateľa. + + + The line is busy. Cannot access voice mail. + Hlasovú schránku nie je možné otvoriť. Linka je obsadená. + + + The voice mail address %1 is an invalid address. Please provision a valid address in your user profile. + Adresa hlasovej schránky %1 je neplatná. Skontrolujte nastavenia vo vašom profile používateľa. + + + Message waiting indication. + Zobrazenie čakajúcich správ. + + + Voice mail + Hlasová schránka + + + &Voice mail + &Hlasová schránka + + + Access voice mail + Vstúpiť do hlasovej schránky + + + F11 + F11 + + + Buddy list + Zoznam kontaktov + + + &Message + S&práva + + + Msg + Msg + + + Instant &message... + Textová &správa... + + + Instant message + Textová správa + + + &Call... + &Volať... + + + &Edit... + &Upraviť... + + + &Delete + &Odstrániť + + + O&ffline + O&ffline + + + &Online + &Online + + + &Change availability + &Zmeniť dostupnosť + + + &Add buddy... + &Pridať kontakt... + + + Failed to save buddy list: %1 + Zlyhalo uloženie zoznamu kontaktov: %1 + + + You can create a separate buddy list for each user profile. You can only see availability of your buddies and publish your own availability if your provider offers a presence server. + Je možné vytvoriť oddelený zoznam kontaktov pre každý profil používateľa. Dostupnosť vašich kontaktov a vlastnú dostupnosť je možné zistiť a využívať len vtedy, ak to váš poskytovateľ podporuje. + + + &Buddy list + Zoznam &kontaktov + + + &Display + &Správy + + + F10 + F10 + + + Diamondcard + Diamondcard + + + Manual + Príručka + + + &Manual + Prír&učka + + + Sign up + Prihlásiť sa + + + &Sign up... + &Prihlásiť sa... + + + Recharge... + Dobiť kredit... + + + Balance history... + História zostatkov... + + + Call history... + História volaní... + + + Admin center... + Administratívne centrum... + + + Recharge + Dobiť kredit + + + Balance history + História zostatkov + + + Admin center + Administratívne centrum + + + Call + Volať + + + &Answer + Pri&jať + + + Answer + Prijať + + + &Bye + &Zavesiť + + + Bye + Zavesiť + + + &Reject + &Odmietnuť + + + Reject + Odmietnuť + + + &Hold + &Podržať + + + Hold + Podržať + + + R&edirect... + &Presmerovať... + + + Redirect + Presmerovať + + + &Dtmf... + &DTMF... + + + Dtmf + DTMF + + + &Terminal capabilities... + &Parametre protistrany... + + + &Redial + &Opakovať + + + Redial + Opakovať + + + &Conference + &Konferencia + + + Conf + Konferencia + + + &Mute + &Stíšiť + + + Mute + Stíšiť + + + Trans&fer... + Prep&ojiť... + + + Xfer + Prepojiť + + + + NumberConversionForm + + Twinkle - Number conversion + Twinkle - Konverzia tel. čísla + + + &Match expression: + &Hľadaný výraz: + + + &Replace: + &Nahradiť: + + + Perl style format string for the replacement number. + Formátovací reťazec (štýl Perlu) s nahradeným číslom. + + + Perl style regular expression matching the number format you want to modify. + Regulárny výraz (štýl Perlu) pre nahrádzané číslo. + + + &OK + &OK + + + Alt+O + Alt+O + + + &Cancel + &Zrušiť + + + Alt+C + Alt+Z + + + Match expression may not be empty. + Hľadaný výraz nesmie byť prázdny. + + + Replace value may not be empty. + Nahrádzaná hodnota nesmie byť prázdna. + + + Invalid regular expression. + Neplatný regulárny výraz. + + + + RedirectForm + + Twinkle - Redirect + Twinkle - Presmerovanie + + + Redirect incoming call to + Prichádzajúci hovor presmerovať na + + + You can specify up to 3 destinations to which you want to redirect the call. If the first destination does not answer the call, the second destination will be tried and so on. + Pre presmerovanie volania je možné zadať max. 3 čísla. Ak nebude hovor prijatý prvým cieľom, prebehne pokus o presmerovanie na druhý cieľ atď. + + + &3rd choice destination: + &3. cieľ: + + + &2nd choice destination: + &2. cieľ: + + + &1st choice destination: + &1. cieľ: + + + Address book + Adresár + + + Select an address from the address book. + Výber adresy z adresára. + + + &OK + &OK + + + &Cancel + &Zrušiť + + + F10 + F10 + + + F12 + F12 + + + F11 + F11 + + + + SelectNicForm + + Twinkle - Select NIC + Twinkle - Výber sieťového rozhrania + + + Select the network interface/IP address that you want to use: + Vyberte sieťové rozhranie/IP adresu, ktorú chcete použiť: + + + You have multiple IP addresses. Here you must select which IP address should be used. This IP address will be used inside the SIP messages. + Na vašom počítači je k dispozícii viac IP adries. Tu vyberiete tú, ktorú chcete používať. Táto IP adresa bude používať Twinkle vo vnútri správ SIP. + + + Set as default &IP + &Nastaviť ako predvolenú IP adresu + + + Alt+I + Alt+N + + + Make the selected IP address the default IP address. The next time you start Twinkle, this IP address will be automatically selected. + Nastaviť vybranú IP adresu ako predvolenú. Twinkle túto IP adresu automaticky použije pri ďalšom spustení. + + + Set as default &NIC + Nastaviť ako &predvolené rozhranie + + + Alt+N + Alt+P + + + Make the selected network interface the default interface. The next time you start Twinkle, this interface will be automatically selected. + Nastaviť vybrané sieťové rozhranie ako predvolené. Twinkle použije toto rozhranie pri ďalšom spustení. + + + &OK + &OK + + + Alt+O + Alt+O + + + If you want to remove or change the default at a later time, you can do that via the system settings. + Predvolené nastavenie je možné zmeniť kedykoľvek neskôr v nastaveniach systému. + + + + SelectProfileForm + + Twinkle - Select user profile + Twinkle - Výber profilu používateľa + + + Select user profile(s) to run: + Vyberte používateľské profily, ktoré majú byť aktivované: + + + Tick the check boxes of the user profiles that you want to run and press run. + Označte profil používateľa, s ktorým by mal Twinkle pracovať a stlačte "Spustiť". + + + Create a new profile with the profile editor. + Pomocou editoru profilu vytvoriť nový profil používateľa. + + + &Wizard + Spri&evodca + + + Alt+W + Alt+E + + + Create a new profile with the wizard. + Vytvoriť nový profil používateľa pomocou sprievodcu. + + + &Edit + U&praviť + + + Alt+E + Alt+P + + + Edit the highlighted profile. + Upraviť zvolený profil používateľa. + + + &Delete + &Odstrániť + + + Alt+D + Alt+S + + + Delete the highlighted profile. + Odstrániť zvolený profil používateľa. + + + Ren&ame + &Premenovať + + + Alt+A + Alt+P + + + Rename the highlighted profile. + Premenovať označený profil. + + + &Set as default + Nastaviť ako pred&volený + + + Alt+S + Alt+V + + + Make the selected profiles the default profiles. The next time you start Twinkle, these profiles will be automatically run. + Nastaviť vybrané profily ako predvolené. Twinkle ich použije automaticky pri ďalšom spustení. + + + &Run + &Spustiť + + + Alt+R + Alt+S + + + Run Twinkle with the selected profiles. + Spustiť Twinkle so zvolenými profilmi používateľmi. + + + S&ystem settings + S&ystémové nastavenia + + + Alt+Y + Alt+Y + + + Edit the system settings. + Upraviť nastavenia systému. + + + &Cancel + &Zrušiť + + + Alt+C + Alt+Z + + + <html>Before you can use Twinkle, you must create a user profile.<br>Click OK to create a profile.</html> + <html>Skôr ako budete môcť Twinkle začať používať, musíte vytvoriť profil používateľa.<br>Kliknite OK pre založenie nového profilu.</html> + + + <html>Next you may adjust the system settings. You can change these settings always at a later time.<br><br>Click OK to view and adjust the system settings.</html> + <html>V ďalšom kroku môžete upraviť nastavenia systému. Môžete to urobiť aj kedykoľvek neskôr.<br><br>Kliknite na OK pre prístup k nastaveniam systému.</html> + + + You did not select any user profile to run. +Please select a profile. + Nevybrali ste žiadny profil používateľa. +Vyberte prosím aspoň jeden profil. + + + Are you sure you want to delete profile '%1'? + Naozaj odstrániť profil používateľa '%1'? + + + Delete profile + Odstrániť profil + + + Failed to delete profile. + Chyba pri odstraňovaní profilu. + + + Failed to rename profile. + Chyba pri premenovaní profilu. + + + <p>If you want to remove or change the default at a later time, you can do that via the system settings.</p> + <p>Predvolené nastavenie je možné kedykoľvek zrušiť alebo zmeniť v nastaveniach systému. </p> + + + Cannot find .twinkle directory in your home directory. + Nie je možné nájsť adresár .twinkle vo vašom domovskom adresári. + + + &Profile editor + &Editor profilu + + + Create profile + Vytvoriť profil + + + Ed&itor + Ed&itor + + + Alt+I + Alt+I + + + Dia&mondcard + + + + Alt+M + Alt+M + + + Modify profile + Upraviť profil + + + Startup profile + Profil pri spustení + + + &Diamondcard + + + + Create a profile for a Diamondcard account. With a Diamondcard account you can make worldwide calls to regular and cell phones and send SMS messages. + Vytvoriť profil pre účet Diamondcard. S účtom Diamondcard môžete volať na pevné linky, do mobilných sietí po celom svete a odosielať správy SMS. + + + <html>You can use the profile editor to create a profile. With the profile editor you can change many settings to tune the SIP protocol, RTP and many other things.<br><br>Alternatively you can use the wizard to quickly setup a user profile. The wizard asks you only a few essential settings. If you create a user profile with the wizard you can still edit the full profile with the profile editor at a later time.<br><br> + + + + You can create a Diamondcard account to make worldwide calls to regular and cell phones and send SMS messages.<br><br> + Tu si môžete zaregistrovať účet Diamondcard, s ktorým môžete volať na pevné linky, do mobilných sietí po celom svete a odosielať správy SMS.<br><br> + + + Choose what method you wish to use.</html> + Vyberte metódu, ktorú chcete použiť</html> + + + + SelectUserForm + + Twinkle - Select user + Twinkle - Výber používateľa + + + &Cancel + &Zrušiť + + + Alt+C + Alt+Z + + + &Select all + Vybrať &všetko + + + Alt+S + Alt+V + + + &OK + &OK + + + Alt+O + Alt+O + + + C&lear all + O&dznačiť všetko + + + Alt+L + Alt+D + + + purpose + No need to translate + purpose + + + Register + Prihlásiť sa + + + Select users that you want to register. + Vybrať používateľov, ktorých chcete zaregistrovať. + + + Deregister + Odregistrovať + + + Select users that you want to deregister. + Vybrať používateľov, ktorých chcete odregistrovať. + + + Deregister all devices + Odhlásiť všetky zariadenia + + + Select users for which you want to deregister all devices. + Vybrať používateľov, pri ktorých chcete odhlásiť všetky zariadenia. + + + Do not disturb + Nerušiť + + + Select users for which you want to enable 'do not disturb'. + Vybrať používateľov, pri ktorých má byť aktivovaný režim "Nerušiť". + + + Auto answer + Automaticky prijať volanie + + + Select users for which you want to enable 'auto answer'. + Vybrať profil používateľa, pre ktorého má byť aktivovaný režim "Automaticky prijať volanie". + + + + SendFileForm + + Twinkle - Send File + Twinkle - Odoslať súbor + + + Select file to send. + Výber súboru na odoslanie. + + + &File: + &Súbor: + + + &Subject: + &Predmet: + + + &OK + &OK + + + Alt+O + Alt+O + + + &Cancel + &Zrušiť + + + Alt+C + Alt+Z + + + File does not exist. + Súbor neexistuje. + + + Send file... + Odoslať súbor... + + + + SrvRedirectForm + + Twinkle - Call Redirection + Twinkle - Presmerovanie hovoru + + + User: + Používateľ: + + + There are 3 redirect services:<p> +<b>Unconditional:</b> redirect all calls +</p> +<p> +<b>Busy:</b> redirect a call if both lines are busy +</p> +<p> +<b>No answer:</b> redirect a call when the no-answer timer expires +</p> + Existujú 3 spôsoby presmerovania volania:<p> +<b>Nepodmienené:</b> presmerovať všetky hovory +</p> +<p> +<b>Obsadené:</b> presmerovať hovor, ak sú obe linky obsadené +</p> +<p> +<b>Bez odpovede:</b> presmerovať hovor po uplynutí čakacej doby +</p> + + + &Unconditional + N&epodmienené + + + &Redirect all calls + &Presmerovať všetky hovory + + + Alt+R + Alt+R + + + Activate the unconditional redirection service. + Aktivovať službu presmerovaní všetkých hovorov. + + + Redirect to + Presmerovať na + + + You can specify up to 3 destinations to which you want to redirect the call. If the first destination does not answer the call, the second destination will be tried and so on. + Môžete zadať až 3 ciele pre presmerovanie volaní. Ak nebude hovor prijatý prvým cieľom, bude použitý druhý cieľ, prípadne tretí. + + + &3rd choice destination: + &3. cieľ: + + + &2nd choice destination: + &2. cieľ: + + + &1st choice destination: + &1. cieľ: + + + Address book + Adresár + + + Select an address from the address book. + Vyberte adresu z adresára. + + + &Busy + &Obsadené + + + &Redirect calls when I am busy + &Presmerovať hovory, ak sú linky obsadené + + + Activate the redirection when busy service. + Aktivovať presmerovanie, ak je linka obsadená. + + + &No answer + &Bez odpovede + + + &Redirect calls when I do not answer + &Presmerovať hovor, ak naň nie je odpovedané + + + Activate the redirection on no answer service. + Aktivovať službu "Presmerovať v neprítomnosti". + + + &OK + &OK + + + Alt+O + Alt+O + + + Accept and save all changes. + Prijať a uložiť všetky zmeny. + + + &Cancel + &Zrušiť + + + Alt+C + Alt+Z + + + Undo your changes and close the window. + Neukladať vykonané zmeny a zavrieť okno. + + + You have entered an invalid destination. + Zadali ste neplatnú cieľovú adresu. + + + F10 + F10 + + + F11 + F11 + + + F12 + F12 + + + + SysSettingsForm + + Twinkle - System Settings + Twinkle - Nastavenia systému + + + General + Všeobecné + + + Audio + Audio + + + Ring tones + Tóny vyzváňania + + + Address book + Adresár + + + Network + Sieť + + + Log + Protokol + + + Select a category for which you want to see or modify the settings. + Vyberte skupinu vlastností, v ktorej chcete zmeniť nastavenia. + + + Sound Card + Zvuková karta + + + Select the sound card for playing the ring tone for incoming calls. + Vyberte zvukovú kartu pre prehrávanie vyzváňacieho tónu prichádzajúceho volania. + + + Select the sound card to which your microphone is connected. + Vyberte zvukovú kartu, ku ktorej máte pripojený mikrofón. + + + Select the sound card for the speaker function during a call. + Vyberte zvukovú kartu pre slúchadlo alebo reproduktor. + + + &Speaker: + &Slúchadlo/reproduktor: + + + &Ring tone: + &Tón vyzváňania: + + + Other device: + Iné zariadenie: + + + &Microphone: + &Mikrofón: + + + Advanced + Pokročilé + + + OSS &fragment size: + Veľkosť &fragmentov OSS: + + + 16 + 16 + + + 32 + 32 + + + 64 + 64 + + + 128 + 128 + + + 256 + 256 + + + The ALSA play period size influences the real time behaviour of your soundcard for playing sound. If your sound frequently drops while using ALSA, you might try a different value here. + Nastavenie periódy prehrávania ALSA ovplyvňuje oneskorenie zvuku na zvukovej karte. Pri problémoch s vypadávaním alebo preskakovaním zvuku skúste použiť inú hodnotu. + + + ALSA &play period size: + Veľkosť &periódy prehrávania ALSA: + + + &ALSA capture period size: + Veľkosť periódy nahrávania &ALSA: + + + The OSS fragment size influences the real time behaviour of your soundcard. If your sound frequently drops while using OSS, you might try a different value here. + Veľkosť fragmentu OSS ovplyvňuje oneskorenie zvuku na zvukovej karte. Pri problémoch s vypadávaním alebo preskakovaním zvuku skúste použiť inú hodnotu. + + + The ALSA capture period size influences the real time behaviour of your soundcard for capturing sound. If the other side of your call complains about frequently dropping sound, you might try a different value here. + Veľkosť periódy nahrávania ALSA ovplyvňuje oneskorenie zvuku pri zaznamenávaní zvuku. Ak sa protistrana sťažuje na časté výpadky zvuku, skúste použiť inú hodnotu. + + + &Max log size: + &Maximálna veľkosť protokolu: + + + The maximum size of a log file in MB. When the log file exceeds this size, a backup of the log file is created and the current log file is zapped. Only one backup log file will be kept. + Maximálna veľkosť súboru s protokolom v MB. Pri dosiahnutí tejto veľkosti súboru Twinkle vytvorí z aktuálneho súboru zálohu a začne zapisovať do nového súboru. Uchováva sa len posledný súbor so zálohou. + + + MB + MB + + + Log &debug reports + Zapísať správy pre &ladenie + + + Alt+D + ALt+L + + + Indicates if reports marked as "debug" will be logged. + Indikuje, či sa majú do protokolu zapisovať "debug" správy. + + + Log &SIP reports + Zapisovať do protokolu &SIP hlásenia + + + Alt+S + Alt+S + + + Indicates if SIP messages will be logged. + Indikuje, či majú byť správy SIP ukladané do protokolu. + + + Log S&TUN reports + Zapisovať do protokolu hlásenia S&TUN + + + Alt+T + Alt+T + + + Indicates if STUN messages will be logged. + Indikuje, či majú byť správy STUN ukladané do protokolu. + + + Log m&emory reports + Zapisovať hlásenia o pa&mäti do protokolu + + + Alt+E + Alt+M + + + Indicates if reports concerning memory management will be logged. + Indikuje, či sa majú do protokolu zapisovať hlásenia o správe pamäte. + + + System tray + Systémová lišta + + + Create &system tray icon on startup + Pri spustení vytvoriť &ikonu v systémovej lište + + + Enable this option if you want a system tray icon for Twinkle. The system tray icon is created when you start Twinkle. + Zapnite túto voľbu, ak chcete vidieť ikonu Twinkle v systémovej lište. Tá sa vytvori pri spustení Twinkle. + + + &Hide in system tray when closing main window + Skryť v systémovej lište pri zatvorení &hlavného okna + + + Alt+H + Alt+H + + + Enable this option if you want Twinkle to hide in the system tray when you close the main window. + Povoľte, ak chcete, aby sa Twinkle pri zatvorení hlavného okna skryl do systémovej lišty. + + + Startup + Štart programu + + + S&tartup hidden in system tray + Spustiť minimalizované v &systémovej lište + + + Next time you start Twinkle it will immediately hide in the system tray. This works best when you also select a default user profile. + Pri budúcom štarte sa Twinkle ihneď skryje do systémovej lišty. Toto funguje najlepšie vtedy, ak vyberiete predvolený profil používateľa. + + + If you always use the same profile(s), then you can mark these profiles as default here. The next time you start Twinkle, you will not be asked to select which profiles to run. The default profiles will automatically run. + Ak vždy používate tie isté profily, potom ich tu môžete označiť ako predvolené. Pri ďalšom spustení sa vás Twinkle nebude pýtať na to, ktoré profily má spustiť. Automaticky budú spustené predvolené profily. + + + Services + Služby + + + Call &waiting + Čakajúce hovor&y + + + Alt+W + Alt+Y + + + With call waiting an incoming call is accepted when only one line is busy. When you disable call waiting an incoming call will be rejected when one line is busy. + Pri zapnutej funkcii čakajúcich hovorov sú prichádzajúce hovory prijaté vtedy, ak je obsadená iba jedna linka. Ak túto funkciu zakážete, prichádzajúce hovory budú odmietané aj keď je používaná iba jedna linka. + + + Hang up &both lines when ending a 3-way conference call. + Zavesiť o&be linky pri ukončení konferenčného hovoru. + + + Alt+B + Alt+B + + + Hang up both lines when you press bye to end a 3-way conference call. When this option is disabled, only the active line will be hung up and you can continue talking with the party on the other line. + Ak je aktivované budú pri "zavesení" hovoru v konferencii ukončené obe linky. V opačnom prípade bude ukončený hovor len na aktívnej linke a je možné pokračovať v hovore na druhej linke. + + + &Maximum calls in call history: + &Maximálny počet záznamov v histórií volaní: + + + The maximum number of calls that will be kept in the call history. + Maximálny počet hovorov, ktoré budú udržované v zozname hovorov. + + + &Auto show main window on incoming call after + Pri prichádzajúcom hovore &automaticky zobraziť hlavné okno programu po uplynutí + + + Alt+A + Alt+A + + + When the main window is hidden, it will be automatically shown on an incoming call after the number of specified seconds. + Ak je hlavné okno programu skryté, bude pri prichádzajúcom hovore po uplynutí zadaného času (s) automaticky zobrazené. + + + Number of seconds after which the main window should be shown. + Čas v sekundách, po uplynutí ktorého bude zobrazené hlavné okno. + + + secs + sekúnd + + + &RTP port: + &RTP port: + + + The UDP port used for sending and receiving RTP for the first line. The UDP port for the second line is 2 higher. E.g. if port 8000 is used for the first line, then the second line uses port 8002. When you use call transfer then the next even port (eg. 8004) is also used. + UDO port použitý pri posielaní a prijímaní RTP na prvej linke. UDP port pre druhú linku je o 2 čísla vyšší, napr. ak je pre prvú linku použitý port 8000, druhá linka používa port 8002. Ak použijete presmerovanie hovoru, použije sa nasledujúci párny port (napr. 8004). + + + &SIP UDP port: + &SIP UDP port: + + + Ring tone + Tón vyzváňania + + + &Play ring tone on incoming call + Pri prichádzajúcom hovore &prehrávať vyzváňací tón + + + Alt+P + Alt+P + + + Indicates if a ring tone should be played when a call comes in. + Indikuje, či má pri prichádzajúcich hovoroch znieť vyzváňanie. + + + &Default ring tone + &Predvolený tón vyzváňania + + + Play the default ring tone when a call comes in. + Prehrá predvolený tón vyzváňania pri prichádzajúcom hovore. + + + C&ustom ring tone + &Vlastný tón vyzváňania + + + Alt+U + Alt+V + + + Play a custom ring tone when a call comes in. + Pri prichádzajúcom hovore prehrať vlastný tón vyzváňania. + + + Specify the file name of a .wav file that you want to be played as ring tone. + Zadajte názov súboru .wav s vlastným tónom vyzváňania. + + + Ring back tone + Tón pre signalizáciu vyzváňania na volanej stanici + + + P&lay ring back tone when network does not play ring back tone + &Prehrať tón pre vyzváňanie na volanej stanici, ak telefónna sieť žiaden tón neposkytuje + + + Alt+L + Alt+P + + + <p> +Play ring back tone while you are waiting for the far-end to answer your call. +</p> +<p> +Depending on your SIP provider the network might provide ring back tone or an announcement. +</p> + <p>Prehrať tón pre vyzváňanie na volanej stanici, ak telefónna sieť žiadny taký tón neposkytuje.</p> + +<p>Prítomnosť tohto tónu závisí na vašom poskytovateľovi.</p> + + + D&efault ring back tone + Predvolený tón pre vyzváňanie na &volanej stanici + + + Play the default ring back tone. + Prehrávať predvolený tón vyzváňania na volanej stanici. + + + Cu&stom ring back tone + Vla&stný tón vyzváňania na volanej stanici + + + Play a custom ring back tone. + Použiť vlastný tón vyzváňania na volanej stanici. + + + Specify the file name of a .wav file that you want to be played as ring back tone. + Zadajte meno súboru .wav pre váš vlastný tón vyzváňania na volanej stanici. + + + &Lookup name for incoming call + Podľa čísla &zistiť meno volajúceho + + + Ove&rride received display name + P&repisovať meno volajúceho + + + Alt+R + Alt+R + + + The caller may have provided a display name already. Tick this box if you want to override that name with the name you have in your address book. + Volajúca protistrana môže posielať vlastné meno. Pri aktivovaní tejto voľby bude zobrazované meno prepísané menom z vášho adresára. + + + Lookup &photo for incoming call + Hľadať &fotografiu volajúceho + + + Lookup the photo of a caller in your address book and display it on an incoming call. + Hľadať fotografiu vo vašom adresári a zobraziť ju pri prichádzajúcom hovore. + + + &OK + &OK + + + Alt+O + Alt+O + + + Accept and save your changes. + Akceptovať a uložiť zmeny v nastaveniach. + + + &Cancel + &Zrušiť + + + Alt+C + Alt+Z + + + Undo all your changes and close the window. + Vrátiť všetky zmeny a zavrieť okno. + + + Ring tones + Description of .wav files in file dialog + Tóny vyzváňania + + + Choose ring tone + Vybrať tón vyzváňania + + + Ring back tones + Description of .wav files in file dialog + Tón vyzváňania na volanej stanici + + + Choose ring back tone + Vybrať tón vyzváňania na volanej stanici + + + &Validate devices before usage + Overiť zvukové za&riadenia pred ich použitím + + + Alt+V + Alt+R + + + <p> +Twinkle validates the audio devices before usage to avoid an established call without an audio channel. +<p> +On startup of Twinkle a warning is given if an audio device is inaccessible. +<p> +If before making a call, the microphone or speaker appears to be invalid, a warning is given and no call can be made. +<p> +If before answering a call, the microphone or speaker appears to be invalid, a warning is given and the call will not be answered. + <p>Twinkle overuje zvukové zariadenia pred ich použitím, aby se nestalo, že počas hovoru nebude fungovať zvuk. +<p>Twinkle pri štarte skontroluje a zobrazí varovanie,ak nie je dané audio zariadenie dostupné.</p> +<p>Ak sa pred začatím hovoru zistí, že mikrofón alebo reproduktor/slúchadlá nefunguje/ú, zobrazí sa varovanie a hovor nebude možné uskutočniť.</p> +<p>Rovnako v prípade, že je detegovaný prichádzajúci hovor a audio zariadenie nie je v poriadku, zobrazí sa varovanie a hovor nebude možné prijať. + + + On an incoming call, Twinkle will try to find the name belonging to the incoming SIP address in your address book. This name will be displayed. + Pri prichádzajúcom hovore sa Twinkle pokúsi nájsť k volajúcemu v adresári zodpovedajúci záznam. Ak sa to podarí, bude jeho meno zobrazené. + + + Select ring tone file. + Vybrať súbor s tónom vyzváňania. + + + Select ring back tone file. + Vybrať súbor vyzváňacieho tónu na protistrane. + + + Maximum allowed size (0-65535) in bytes of an incoming SIP message over UDP. + Maximálna povolená veľkosť prichádzajúcej SIP správy cez UDP v bajtoch(0-65535). + + + &SIP port: + &SIP port: + + + Max. SIP message size (&TCP): + Max. veľkosť SIP správy (&TCP): + + + The UDP/TCP port used for sending and receiving SIP messages. + UDP/TCP port použitý pre odosielanie a prijímanie správ SIP. + + + Max. SIP message size (&UDP): + Max. veľkosť správy SIP (&UDP): + + + Maximum allowed size (0-4294967295) in bytes of an incoming SIP message over TCP. + Maximálna povolená veľkosť prichádzajúcej správy SIP cez TCP v bajtoch (0-4294967295). + + + W&eb browser command: + Príkaz pre w&ebový prehliadač: + + + Command to start your web browser. If you leave this field empty Twinkle will try to figure out your default web browser. + Príkaz pre spustenie webového prehliadača. Ak toto pole necháte prázdne, Twinkle sa pokúsi zistiť váš predvolený prehliadač. + + + 512 + 512 + + + 1024 + 1024 + + + Tip: for crackling sound with PulseAudio, set play period size to maximum. + Tip: pri praskajúcom zvuku s PulseAudio nastavte najvyššiu periódu prehrávania ALSA. + + + Enable in-call OSD + Povoliť OSD počas hovoru + + + + SysTrayPopup + + Answer + Prijať + + + Reject + Odmietnuť + + + Incoming Call + Prichádzajúci hovor + + + + TermCapForm + + Twinkle - Terminal Capabilities + Twinkle - Parametre protistrany + + + &From: + &Od: + + + Get terminal capabilities of + Získať parametre protistrany + + + &To: + &Adresa: + + + The address that you want to query for capabilities (OPTION request). This can be a full SIP address like <b>sip:example@example.com</b> or just the user part or telephone number of the full address. When you do not specify a full address, then Twinkle will complete the address by using the domain value of your user profile. + Adresa alebo číslo protistrany, ktorej parametre sa majú zistiť (OPTION request). Môže to byť úplná adresa SIP ako <b>sip:priklad@priklad.com</b> alebo len meno používateľa, príp. telefónne číslo z úplnej adresy. Ak nie je zadaná úplná SIP adresa, Twinkle doplní adresu o doménu z profilu používateľa. + + + Address book + Adresár + + + Select an address from the address book. + Výber adresy z adresára. + + + &OK + &OK + + + &Cancel + &Zrušiť + + + F10 + F10 + + + + TransferForm + + Twinkle - Transfer + Twinkle - Prepojenie + + + Transfer call to + Prepojiť hovor na + + + &To: + &Na: + + + The address of the person you want to transfer the call to. This can be a full SIP address like <b>sip:example@example.com</b> or just the user part or telephone number of the full address. When you do not specify a full address, then Twinkle will complete the address by using the domain value of your user profile. + Adresa alebo číslo protistrany, na ktorú má byť hovor prepojený. Môže to byť úplná adresa SIP ako <b>sip:priklad@priklad.com</b> alebo len meno používateľa, príp. telefónne číslo z úplnej adresy. Ak nie je zadaná úplná SIP adresa, Twinkle doplní adresu o doménu z profilu používateľa. + + + Address book + Adresár + + + Select an address from the address book. + Výber adresy z adresára. + + + &OK + &OK + + + Alt+O + Alt+O + + + &Cancel + &Zrušiť + + + &Blind transfer + &Slepé presmerovanie + + + Alt+B + Alt+B + + + Transfer the call to a third party without contacting that third party yourself. + Hovor priamo presmerovať na nového účastníka, bez toho, aby bol najprv kontaktovaný. + + + T&ransfer with consultation + Asistované p&repojenie + + + Alt+R + Alt+R + + + Before transferring the call to a third party, first consult the party yourself. + Pred presmerovaním hovoru najprv kontaktovať nového účastníka a volajúceho ohlásiť. + + + Transfer to other &line + Presmerovať na inú &linku + + + Alt+L + Alt+L + + + Connect the remote party on the active line with the remote party on the other line. + Prepojiť hovor na aktívnej linke s hovorom na druhej linke. + + + F10 + F10 + + + + TwinkleCore + + Failed to create log file %1 . + Chyba pri vytváraní súboru s protokolom %1. + + + Cannot open file for reading: %1 + Chyba pri otváraní súboru na čítanie: %1 + + + File system error while reading file %1 . + Chyba súborového systému pri čítaní súboru %1. + + + Cannot open file for writing: %1 + Nie je možné otvoriť súbor %1 pre zápis + + + File system error while writing file %1 . + Chyba súborového systému pri zápise do %1. + + + Excessive number of socket errors. + Príliš veľký počet chýb socketu. + + + Built with support for: + Vytvorené s podporou pre: + + + Contributions: + Prispievatelia: + + + This software contains the following software from 3rd parties: + Tento program obsahuje softvérové časti nasledovných tretích strán: + + + * GSM codec from Jutta Degener and Carsten Bormann, University of Berlin + * GSM kodek od Jutta Degener a Carsten Bormann, University of Berlin + + + * G.711/G.726 codecs from Sun Microsystems (public domain) + * G.711/G.726 kodeky od Sun Microsystems (public domain) + + + * iLBC implementation from RFC 3951 (www.ilbcfreeware.org) + * iLBC implementácia RFC 3951 (www.ilbcfreeware.org) + + + * Parts of the STUN project at http://sourceforge.net/projects/stun + * Časti zo STUN projektu na http://sourceforge.net/projects/stun + + + * Parts of libsrv at http://libsrv.sourceforge.net/ + * Časti z libsrv na http://libsrv.sourceforge.net/ + + + For RTP the following dynamic libraries are linked: + Pre RTP sú linkované nasledujúce dynamické knižnice: + + + Translated to english by <your name> + Do slovenčiny preložil Jose Riha + + + Directory %1 does not exist. + Adresár "%1" neexistuje. + + + Cannot open file %1 . + Súbor %1 nie je možné otvoriť. + + + %1 is not set to your home directory. + "%1" nie je vaším domovským adresárom. + + + Directory %1 (%2) does not exist. + Adresár %1 (%2) neexistuje. + + + Cannot create directory %1 . + Adresár %1 nie je možné vytvoriť. + + + %1 is already running. +Lock file %2 already exists. + %1 už beží. +Súbor so zámkom %2 už existuje. + + + Cannot create %1 . + Nie je možné vytvoriť %1. + + + Syntax error in file %1 . + Chyba syntaxe v súbore %1. + + + Failed to backup %1 to %2 + Chyba pri zálohovaní %1 do %2 + + + unknown name (device is busy) + neznámy názov (zariadenie sa používa) + + + Default device + Predvolené zariadenie + + + Anonymous + Anonymné + + + Warning: + Varovanie: + + + Call transfer - %1 + Presmerovanie hovoru - %1 + + + Sound card cannot be set to full duplex. + Zvuková karta nefunguje v režime full duplex. + + + Cannot set buffer size on sound card. + Nie je možné nastaviť veľkosť bufferu na zvukovej karte. + + + Sound card cannot be set to %1 channels. + Zvukové zariadenie nie je možné nastaviť na %1 kanálov. + + + Cannot set sound card to 16 bits recording. + Audio zariadenie nie je možné nastaviť na 16 bitové nahrávanie. + + + Cannot set sound card to 16 bits playing. + Audio zariadenie nie je možné nastaviť na 16 bitové prehrávanie. + + + Cannot set sound card sample rate to %1 + Nie je možné nastaviť vzorkovaciu frekvenciu audio zariadenia na %1 + + + Opening ALSA driver failed + Chyba pri otváraní ovládača ALSA + + + Cannot open ALSA driver for PCM playback + Nie je možné otvoriť ovládač ALSA pre prehrávanie PCM + + + Cannot resolve STUN server: %1 + Nie je možné vyhľadať adresu STUN servera: %1 + + + You are behind a symmetric NAT. +STUN will not work. +Configure a public IP address in the user profile +and create the following static bindings (UDP) in your NAT. + Nachádzate sa za symetrickým NATom. +STUN nebude fungovať. +V profile používateľa nastavte verejnú IP adresu +a na vašom NATe namapujte statické (UDP) porty. + + + public IP: %1 --> private IP: %2 (SIP signaling) + verejná IP: %1 --> privátna IP: %2 (SIP signalizácia) + + + public IP: %1-%2 --> private IP: %3-%4 (RTP/RTCP) + verejná IP: %1 - %2 --> privátna IP: %3 - %4 (RTP/RTCP) + + + Cannot reach the STUN server: %1 + Nie je možné pripojiť sa na STUN server: %1 + + + Port %1 (SIP signaling) + Port %1 (SIP signalizácia) + + + NAT type discovery via STUN failed. + Detekcia typu NATu pomocou STUN skončila s chybou. + + + If you are behind a firewall then you need to open the following UDP ports. + Ak sa nachádzate za firewallom, je potrebné otvoriť nasledujúce UDP porty. + + + Ports %1-%2 (RTP/RTCP) + Porty %1-%2 (RTP/RTCP) + + + Cannot access the ring tone device (%1). + Zvukové zariadenie %1 pre tón vyzváňania nie je dostupné. + + + Cannot access the speaker (%1). + Zvukové zariadenie %1 pre reproduktory/slúchadlá nie je dostupné. + + + Cannot access the microphone (%1). + Zvukové zariadenie %1 pre mikrofón nie je dostupné. + + + Cannot open ALSA driver for PCM capture + Nie je možné otvoriť ovládač ALSA pre nahrávanie PCM + + + Cannot receive incoming TCP connections. + Nie je možné prijímať prichádzajúce TCP spojenia. + + + Failed to create file %1 + Zlyhalo vytvorenie súboru %1 + + + Failed to write data to file %1 + Zlyhal zápis dát do súboru %1 + + + Failed to send message. + Zlyhalo odoslanie správy. + + + Cannot lock %1 . + Nemôžem zamknúť %1. + + + + UserProfileForm + + Twinkle - User Profile + Twinkle - Profil používateľa + + + User profile: + Profil používateľa: + + + Select which profile you want to edit. + Vyberte profil, ktorý chcete upraviť. + + + User + Používateľ + + + SIP server + SIP server + + + RTP audio + RTP audio + + + SIP protocol + Protokol SIP + + + Address format + Formát adresy + + + Timers + Časovače + + + Ring tones + Vyzváňacie tóny + + + Scripts + Skripty + + + Security + Bezpečnosť + + + Select a category for which you want to see or modify the settings. + Vyberte skupinu vlastností, v ktorej chcete zmeniť nastavenia. + + + &OK + &OK + + + Alt+O + Alt+O + + + Accept and save your changes. + Akceptovať a uložiť zmeny v nastaveniach. + + + &Cancel + &Zrušiť + + + Alt+C + Alt+Z + + + Undo all your changes and close the window. + Vrátiť všetky zmeny a zavrieť okno. + + + SIP account + Účet SIP + + + &User name*: + &Meno používateľa*: + + + &Domain*: + &Doména*: + + + Or&ganization: + Or&ganizácia: + + + The SIP user name given to you by your provider. It is the user part in your SIP address, <b>username</b>@domain.com This could be a telephone number. +<br><br> +This field is mandatory. + Meno používateľa, ktoré vám pridelil váš poskytovateľ. Je to prvá časť vašej kompletnej SIP adresy, <b>menouzivatela</b>@domena.com. Môže byť vo forme telefónneho čísla. +<br><br> +Toto pole je povinné. + + + The domain part of your SIP address, username@<b>domain.com</b>. Instead of a real domain this could also be the hostname or IP address of your <b>SIP proxy</b>. If you want direct IP phone to IP phone communications then you fill in the hostname or IP address of your computer. +<br><br> +This field is mandatory. + Doménová časť vašej adresy SIP, menopouzivatela@<b>domena.com</b>. Miesto skutočnej domény tu môže byť tiež názov hostiteľa alebo IP adresa vašej <b>SIP proxy</b>. Pre priame volanie medzi IP adresami tu uveďte názov hostiteľa alebo IP adresu vášho počítača. +<br><br> +Toto pole je povinné. + + + You may fill in the name of your organization. When you make a call, this might be shown to the called party. + Tu je možné uviesť meno vašej organizácie. Ak niekomu voláte, môže byť tento údaj zobrazený protistrane. + + + This is just your full name, e.g. John Doe. It is used as a display name. When you make a call, this display name might be shown to the called party. + Toto je vaše celé meno, napríklad Jozef Mrkva. Tento údaj je zobrazený volanej protistrane ako meno volajúceho. + + + &Your name: + Vaše &meno: + + + SIP authentication + Prihlasovacie údaje SIP + + + &Realm: + &Realm (sféra): + + + Authentication &name: + Prihlasovacie &meno: + + + &Password: + &Heslo: + + + The realm for authentication. This value must be provided by your SIP provider. If you leave this field empty, then Twinkle will try the user name and password for any realm that it will be challenged with. + Hodnota "realm" (sféra) pre prihlásenie. Tento údaj vám musí poskytnúť váš poskytovateľ SIP. Ak toto pole necháte prázdne, Twinkle sa pokúsi o prihlásenie s vaším meno používateľa a heslom pri ľubovoľnom realme. + + + Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though. + Vaše prihlasovacie SIP meno. Je často identické s vaším SIP menom používateľa. Môžu však byť aj rozdielne. + + + Your password for authentication. + Vaše prihlasovacie heslo. + + + Registrar + Registrar (prihlasovací server) + + + &Registrar: + &Registrar: + + + The hostname, domain name or IP address of your registrar. If you use an outbound proxy that is the same as your registrar, then you may leave this field empty and only fill in the address of the outbound proxy. + Názov hostiteľa, doménové meno alebo IP adresa prihlasovacieho servera. Ak používate odchádzajúcu proxy, ktorá je rovnaká ako váš prihlasovací server, je možné toto pole nechať prázdne a vyplniť iba adresu odchádzajúcej proxy. + + + &Expiry: + &Platnosť: + + + The registration expiry time that Twinkle will request. + Doba platnosti registrácie v sekundách, ktorú si Twinkle vyžiada. + + + seconds + sekúnd + + + Re&gister at startup + Re&gistrovať sa pri štarte + + + Alt+G + Alt+H + + + Indicates if Twinkle should automatically register when you run this user profile. You should disable this when you want to do direct IP phone to IP phone communication without a SIP proxy. + Indikuje, či sa má Twinkle automaticky registrovať pri spustení tohto profilu. Toto by ste mali zakázať, ak chcete volať priamo medzi IP adresami bez SIP proxy. + + + Outbound Proxy + Odchádzajúca proxy + + + &Use outbound proxy + Po&užiť odchádzajúcu-proxy + + + Alt+U + Alt+U + + + Indicates if Twinkle should use an outbound proxy. If an outbound proxy is used then all SIP requests are sent to this proxy. Without an outbound proxy, Twinkle will try to resolve the SIP address that you type for a call invitation for example to an IP address and send the SIP request there. + Indikuje, či má Twinkle používať odchádzajúcu proxy. Ak sa používa odchádzajúca proxy, všetky požiadavky SIP sú posielané na túto proxy.Bez odchádzajúcej proxy sa Twinkle pokúsi použiť názov hostiteľa z adresy SIP a smerovať hovor priamo tam. + + + Outbound &proxy: + Odchádzajúca &proxy: + + + &Send in-dialog requests to proxy + Poslať in-&dialog požiadavky na proxy + + + Alt+S + Alt+D + + + SIP requests within a SIP dialog are normally sent to the address in the contact-headers exchanged during call setup. If you tick this box, that address is ignored and in-dialog request are also sent to the outbound proxy. + Požiadavky SIP sa bežne posielajú na adresu v kontaktných hlavičkách vymenených pri zostavovaní hovoru. Ak je toto pole zaškrtnuté, potom je táto adresa ignorovaná a všetky žiadosti sa takisto zasielajú na odchádzajúcu proxy. + + + &Don't send a request to proxy if its destination can be resolved locally. + N&eposielať žiadosti SIP na proxy, ak je možné cieľ spojiť lokálne. + + + Alt+D + Alt+E + + + When you tick this option Twinkle will first try to resolve a SIP address to an IP address itself. If it can, then the SIP request will be sent there. Only when it cannot resolve the address, it will send the SIP request to the proxy (note that an in-dialog request will only be sent to the proxy in this case when you also ticked the previous option.) + Ak je táto voľba aktivovaná, najprv sa Twinkle pokúsi nájsť k cieľovej adrese zodpovedajúcu IP adresu a poslať požiadavku SIP priamo tam. Ak sa nepodarí IP adresu zistiť, je požiadavka poslaná na proxy. (Upozornenie: in-dialog žiadosti budú v tomto prípade posielané na proxy iba ak je aktivovaná aj predchádzajúca voľba.) + + + The hostname, domain name or IP address of your outbound proxy. + Doménové meno, IP adresa alebo meno vašej odchádzajúcej proxy. + + + Co&decs + Ko&deky + + + Codecs + Kodeky + + + Available codecs: + Dostupné kodeky: + + + G.711 A-law + G.711 A-law + + + G.711 u-law + G.711 u-law + + + GSM + GSM + + + speex-nb (8 kHz) + speex-nb (8 kHz) + + + speex-wb (16 kHz) + speex-wb (16 kHz) + + + speex-uwb (32 kHz) + speex-uwb (32 kHz) + + + List of available codecs. + Zoznam dostupných kodekov. + + + Move a codec from the list of available codecs to the list of active codecs. + Presunúť kodek zo zoznamu dostupných kodekov do zoznamu aktívnych kodekov. + + + Move a codec from the list of active codecs to the list of available codecs. + Deaktivovať kodek. + + + Active codecs: + Aktívne kodeky: + + + List of active codecs. These are the codecs that will be used for media negotiation during call setup. The order of the codecs is the order of preference of use. + Zoznam aktívnych kodekov. Tieto budú použité pri dohodnutí parametrov hovoru počas zostavovania hovoru. Poradie tu uvedených kodekov je zároveň poradím, v akom budú kodeky preferované. + + + Move a codec upwards in the list of active codecs, i.e. increase its preference of use. + Presunúť tento kodek smerom hore v zozname kodekov, t. j. zvýšiť jeho prioritu. + + + Move a codec downwards in the list of active codecs, i.e. decrease its preference of use. + Presunúť tento kodek smerom dole v zozname kodekov, t. j. znížiť jeho prioritu. + + + &G.711/G.726 payload size: + &G.711/G.726 veľkosť payloadu: + + + The preferred payload size for the G.711 and G.726 codecs. + Uprednostňovaná veľkosť payloadu pre kodeky G.711 a G.726. + + + ms + ms + + + &iLBC + &iLBC + + + iLBC + iLBC + + + i&LBC payload type: + i&LBC typ payloadu: + + + iLBC &payload size (ms): + iLBC veľkosť &payloadu (ms): + + + The dynamic type value (96 or higher) to be used for iLBC. + Dynamická hodnota typu pre iLBC (96 alebo viac). + + + 20 + 20 + + + 30 + 30 + + + The preferred payload size for iLBC. + Uprednostňovaná veľkosť payloadu pre iLBC. + + + &Speex + &Speex + + + Speex + Speex + + + Perceptual &enhancement + Vylepšenie &kvality zvuku + + + Alt+E + Alt+K + + + Perceptual enhancement is a part of the decoder which, when turned on, tries to reduce (the perception of) the noise produced by the coding/decoding process. In most cases, perceptual enhancement make the sound further from the original objectively (if you use SNR), but in the end it still sounds better (subjective improvement). + Vylepšenie vnímanej kvality zvuku je súčasťou dekodéru, ktorá sa snaží znížiť (vnímaný) šum vzniknutý pri procese kódovania/dekódovania. Vo väčšine prípadov vedie táto funkcia k väčšiemu objektívnemu odchýleniu zvuku od originálu (z hľadiska SNR), ale i napriek tomu znie lepšie (subjektívne vylepšenie). + + + &Ultra wide band payload type: + Typ payload&u pre ultra široké pásmo: + + + Alt+V + Alt+U + + + &Wide band payload type: + Typ payloadu pre široké pásm&o: + + + Alt+B + Alt+B + + + Variable bit-rate (VBR) allows a codec to change its bit-rate dynamically to adapt to the "difficulty" of the audio being encoded. In the example of Speex, sounds like vowels and high-energy transients require a higher bit-rate to achieve good quality, while fricatives (e.g. s,f sounds) can be coded adequately with less bits. For this reason, VBR can achieve a lower bit-rate for the same quality, or a better quality for a certain bit-rate. Despite its advantages, VBR has two main drawbacks: first, by only specifying quality, there's no guarantee about the final average bit-rate. Second, for some real-time applications like voice over IP (VoIP), what counts is the maximum bit-rate, which must be low enough for the communication channel. + Variabilná šírka pásma (VBR) umožní danému kodeku prispôsobiť množstvo dát potrebných na prenos hovoru charakteru audio signálu. Kým napr. niektoré ostré samohlásky alebo veľmi premenlivé pasáže vyžadujú veľkú vzorkovaciu frekvenciu a tým aj veľký dátový tok, mäkké spoluhlásky si vystačia s malým dátovým tokom. Vďaka tomu VBC tak môže pri danej dátovej rýchlosti docieliť lepšej kvality zvuku alebo pri danej kvalite hovoru vystačiť s nižším dátovým tokom. Nevýhodou je, že pri zadanej kvalite nie je možné predpovedať aký veľký dátový tok v skutočnosti bude. A tiež, že v aplikáciách pracujúcich v reálnom čase (akým je práve VoIP) je rozhodujúca maximálna šírka pásma, ktorú musí zvládnuť komunikačný kanál. + + + The dynamic type value (96 or higher) to be used for speex wide band. + Dynamická hodnota typu pre speex wide band (96 alebo vyšší). + + + Co&mplexity: + Ko&mplexita: + + + Discontinuous transmission is an addition to VAD/VBR operation, that allows one to stop transmitting completely when the background noise is stationary. + Nesúvislé vysielanie je rozšírením funkčnosti VAD/VBR, kedy je možné úplne prestať odosielať dáta, keď je na linke ticho. + + + The dynamic type value (96 or higher) to be used for speex narrow band. + Dynamická hodnota typu pre speex narrow band (96 alebo vyšší). + + + With Speex, it is possible to vary the complexity allowed for the encoder. This is done by controlling how the search is performed with an integer ranging from 1 to 10 in a way that's similar to the -1 to -9 options to gzip and bzip2 compression utilities. For normal use, the noise level at complexity 1 is between 1 and 2 dB higher than at complexity 10, but the CPU requirements for complexity 10 is about 5 times higher than for complexity 1. In practice, the best trade-off is between complexity 2 and 4, though higher settings are often useful when encoding non-speech sounds like DTMF tones. + V prípade Speexu je možné meniť komplexitu kodéru. To slúži na zadanie hĺbky hľadania v rozsahu od 1 do 10. Podobný princíp je zavedený v kompresných programoch gzip a bzip2 s voľbou -1 až -9. Za normálnych podmienok je odstup šumu pri komplexite 1 o 1 až 2 dB vyšší ako pri komplexite 10. Avšak vyťaženie procesoru je asi 5x vyššie ako pri komplexite 1. V praxi sa osvedčilo nastavenie medzi 2 až 4. Vyššie nastavenia sú vhodné pre prenos tónov DTMF alebo hudby. + + + &Narrow band payload type: + Typ payloadu pre úz&ke pásmo: + + + G.726 + G.726 + + + G.726 &40 kbps payload type: + Typ payloadu pre G.726 &40 kb/s: + + + The dynamic type value (96 or higher) to be used for G.726 40 kbps. + Dynamická hodnota typu pre G.726 40 kb/s (96 alebo vyšší). + + + The dynamic type value (96 or higher) to be used for G.726 32 kbps. + Dynamická hodnota typu pre G.726 32 kb/s (96 alebo vyšší). + + + G.726 &24 kbps payload type: + Typ payloadu pre G.726 &24 kb/s: + + + The dynamic type value (96 or higher) to be used for G.726 24 kbps. + Dynamická hodnota typu pre G.726 24 kb/s (96 alebo vyšší). + + + G.726 &32 kbps payload type: + Typ payloadu pre G.726 &32 kb/s: + + + The dynamic type value (96 or higher) to be used for G.726 16 kbps. + Dynamická hodnota typu pre G.726 16 kb/s (96 alebo vyšší). + + + G.726 &16 kbps payload type: + Typ payloadu pre G.726 &16 kb/s: + + + DT&MF + DT&MF + + + DTMF + DTMF + + + The dynamic type value (96 or higher) to be used for DTMF events (RFC 2833). + Dynamická hodnota typu pre udalosti DTMF (RFC 2833) (96 alebo vyšší). + + + DTMF vo&lume: + H&lasitosť DTMF: + + + The power level of the DTMF tone in dB. + Hlasitosť vysielaných DTMF tónov v dB. + + + The pause after a DTMF tone. + Pauza medzi dvoma DTMF tónmi. + + + DTMF &duration: + Trvanie &DTMF: + + + DTMF payload &type: + &Typ payloadu DTMF: + + + DTMF &pause: + &Pauza DTMF: + + + dB + dB + + + Duration of a DTMF tone. + Doba trvania tónu DTMF. + + + DTMF t&ransport: + P&renos DTMF: + + + Auto + Automaticky + + + RFC 2833 + RFC 2833 + + + Inband + Zvukovo + + + Out-of-band (SIP INFO) + Out-of-band (SIP INFO) + + + <h2>RFC 2833</h2> +<p>Send DTMF tones as RFC 2833 telephone events.</p> +<h2>Inband</h2> +<p>Send DTMF inband.</p> +<h2>Auto</h2> +<p>If the far end of your call supports RFC 2833, then a DTMF tone will be send as RFC 2833 telephone event, otherwise it will be sent inband. +</p> +<h2>Out-of-band (SIP INFO)</h2> +<p> +Send DTMF out-of-band via a SIP INFO request. +</p> + <p><h3>RFC 2833</h3> +Vysielať DTMF tóny ako telefónne udalosti podľa RFC 2833.</p> +<p><h3>Zvukovo</h3> +Vysielať DTMF inband (skutočné tóny, ktoré Twinkle primieša do audio signálu).</p> +<p><h3>Auto</h3> +Ak protistrana podporuje RFC 2833, sú použité DTMF tóny podľa štandardu RFC 2833, inak ako inband.</p> +<p><h3>Out-of-band (SIP INFO)</h3> +Vysielať DTMF out-of-band prostredníctvom požiadavky SIP INFO.</p> + + + General + Všeobecné + + + Redirection + Presmerovanie + + + &Allow redirection + Povoliť presmerov&anie + + + Alt+A + Alt+A + + + Indicates if Twinkle should redirect a request if a 3XX response is received. + Indikuje, či má Twinkle presmerovať požiadavku pri odpovedi 3XX. + + + Ask user &permission to redirect + Vypýtať si povolenie od používateľa pred &presmerovaním + + + Alt+P + Alt+P + + + Indicates if Twinkle should ask the user before redirecting a request when a 3XX response is received. + Ak je táto voľba aktivovaná, Twinkle sa pri prijatí požiadavky 3XX spýta používateľa, či má byť hovor presmerovaný na nový cieľ. + + + Max re&directions: + Max. počet &presmerovaní: + + + The number of redirect addresses that Twinkle tries at a maximum before it gives up redirecting a request. This prevents a request from getting redirected forever. + Počet presmerovaní odchádzajúcich volaní, po ktorom Twinkle ukončí pokusy o nadviazanie spojení. Zabraňuje zacykleniu pri presmerovaní. + + + Protocol options + Nastavenie protokolu SIP + + + Call &Hold variant: + Spôsob pridržania &hovoru: + + + RFC 2543 + RFC 2543 + + + RFC 3264 + RFC 3264 + + + Indicates if RFC 2543 (set media IP address in SDP to 0.0.0.0) or RFC 3264 (use direction attributes in SDP) is used to put a call on-hold. + Indikuje, či bude pre podržanie hovoru použité RFC 2543 (nastavenie IP adresy SDP na 0.0.0.0) alebo RFC 3264 (použité smerové atribúty v SDP). + + + Allow m&issing Contact header in 200 OK on REGISTER + P&ovoliť chýbajúcu kontaktnú hlavičku v 200 OK pri REGISTER + + + Alt+I + Alt+O + + + A 200 OK response on a REGISTER request must contain a Contact header. Some registrars however, do not include a Contact header or include a wrong Contact header. This option allows for such a deviation from the specs. + Odpoveď 200 OK na požiadavku REGISTER musí obsahovať hlavičku Contact. Niektorí poskytovatelia buď hlavičku Contact neposielajú alebo ju posielajú chybnú. Táto voľba povolí toto odchýlenie od špecifikácie. + + + &Max-Forwards header is mandatory + Hlavička &Max-Forwards je povinná + + + Alt+M + Alt+M + + + According to RFC 3261 the Max-Forwards header is mandatory. But many implementations do not send this header. If you tick this box, Twinkle will reject a SIP request if Max-Forwards is missing. + Podľa RFC3261 je hlavička Max-Forwards povinná. Často však nie je posielaná. Ak je táto voľba aktivovaná, Twinkle odmietne požiadavky SIP, ktoré hlavičku Max-Forwards neobsahujú. + + + Put &registration expiry time in contact header + Vložiť do kontaktnej hlavičky dobu platnosti &registrácie + + + Alt+R + Alt+R + + + In a REGISTER message the expiry time for registration can be put in the Contact header or in the Expires header. If you tick this box it will be put in the Contact header, otherwise it goes in the Expires header. + Doba vypršania platnosti prihlásenia v požiadavke REGISTER môže byť prenášaná tak v hlavičke Contact ako aj v hlavičke Expires. Ak je táto voľba zapnutá, posiela ju Twinkle v hlavičke Contact, inak v hlavičke Expires. + + + &Use compact header names + Použiť &kompaktné názvy hlavičiek + + + Indicates if compact header names should be used for headers that have a compact form. + Indikuje, či má byť pre názvy hlavičiek použitá krátka forma, ak existuje. + + + Allow SDP change during call setup + Povoliť zmeny v SDP pri zostavovaní hovoru + + + <p>A SIP UAS may send SDP in a 1XX response for early media, e.g. ringing tone. When the call is answered the SIP UAS should send the same SDP in the 200 OK response according to RFC 3261. Once SDP has been received, SDP in subsequent responses should be discarded.</p> +<p>By allowing SDP to change during call setup, Twinkle will not discard SDP in subsequent responses and modify the media stream if the SDP is changed. When the SDP in a response is changed, it must have a new version number in the o= line.</p> + <p>SIP UAS môže odosielať SDP v 1XX odpovedi na zvuk na začiatku hovoru, napr. tón vyzváňania. Ak bude hovor prijatý, mal by SIP UAS podľa RFC 3261 poslať to isté SDP v odpovedi 200 OK. Po prijatí SDP by mali byť všetky nasledujúce odpovede SDP zahodené.</p> +<p>Povolením toho, že sa môže SDP počas zostavovania hovoru zmeniť, nebude v nasledujúcich odpovediach ignorovať SDP, ale zmení požadovaným spôsobom vlastnosti prúdu RTP. Zmenené SDP musí mat v riadku "o=" nové číslo verzie.</p> + + + <p> +Twinkle creates a unique contact header value by combining the SIP user name and domain: +</p> +<p> +<tt>&nbsp;user_domain@local_ip</tt> +</p> +<p> +This way 2 user profiles, having the same user name but different domain names, have unique contact addresses and hence can be activated simultaneously. +</p> +<p> +Some proxies do not handle a contact header value like this. You can disable this option to get a contact header value like this: +</p> +<p> +<tt>&nbsp;user@local_ip</tt> +</p> +<p> +This format is what most SIP phones use. +</p> + <p>Ak je táto voľba zapnutá, Twinkle vytvorí jednoznačnú hodnotu kontaktnej hlavičky kombináciou SIP mena používateľa a doménového mena: +<br> +<tt>&nbsp;pouzivatel_domena@lokalna_ip</tt> +</p> +<p> +To umožňuje vytvorenie viacerých používateľských profilov s rovnakým menom používateľa, ale rozdielnou doménou, ktoré potom majú odlišné kontaktné adresy a preto sa dajú tieto profily používať súčasne. +</p> +<p> +Niektoré proxy nemusia s takýmito kontaktnými hlavičkami vedieť pracovať. Ak je táto voľba deaktivovaná, Twinkle zasiela kontaktnú hlavičku v nasledovnom formáte: +<br> +<tt>&nbsp;pouzivatel@lokalna_ip</tt> +</p> +<p> +Tento formát je používaný na väčšine SIP telefónov. +</p> + + + &Encode Via, Route, Record-Route as list + Via, Route a Record-Route poslať ako &zoznam + + + The Via, Route and Record-Route headers can be encoded as a list of comma separated values or as multiple occurrences of the same header. + Via-, Route- a Record-Route-Header môžu byť posielané zakódované ako zoznam čiarkou oddelených hodnôt alebo ako jednotlivé hodnoty, každá vo svojej hlavičke. + + + SIP extensions + Rozšírenia SIP + + + &100 rel (PRACK): + &100 rel (PRACK): + + + disabled + deaktivované + + + supported + podporované + + + required + vyžadované + + + preferred + uprednostňované + + + Indicates if the 100rel extension (PRACK) is supported:<br><br> +<b>disabled</b>: 100rel extension is disabled +<br><br> +<b>supported</b>: 100rel is supported (it is added in the supported header of an outgoing INVITE). A far-end can now require a PRACK on a 1xx response. +<br><br> +<b>required</b>: 100rel is required (it is put in the require header of an outgoing INVITE). If an incoming INVITE indicates that it supports 100rel, then Twinkle will require a PRACK when sending a 1xx response. A call will fail when the far-end does not support 100rel. +<br><br> +<b>preferred</b>: Similar to required, but if a call fails because the far-end indicates it does not support 100rel (420 response) then the call will be re-attempted without the 100rel requirement. + Definuje spôsob podpory rozšírenia 100rel(PRACK):<br><br> +<b>deaktivované</b>: rozšírenie 100rel nie je podporované +<br><br> +<b>povolené</b>: 100rel je podporované (je pridané do odchádzajúceho INVITE ako podporovaná hlavička). Protistrana si potom môže vyžiadať PRACK na 1xx odpoveď. +<br><br> +<b>vyžadované</b>: 100rel je vyžadované. Požiadavka je vložená do hlavičky require v odchádzajúcom INVITE. Ak je v prichádzajúcom INVITE označené, že je 100rel podporované, potom Twinkle bude vyžadovať PRACK v odpovedi 1xx. Ak protistrana 100rel nepodporuje, nedôjde k nadviazaniu spojenia. +<br><br> +<b>uprednostňované</b>: Podobné ako "vyžadované", ale v prípade, že hovor zlyhá kvôli tomu, že protistrana nepodporuje 100rel (odpoveď 420), Twinkle sa pokúsi hovor znovu nadviazať bez vyžadovania 100rel. + + + REFER + REFER + + + Call transfer (REFER) + Presmerovanie volania (REFER) + + + Alt+T + Alt+T + + + Indicates if Twinkle should transfer a call if a REFER request is received. + Indikuje, či má Twinkle pri obdržaní požiadavky protistrany (REFER) presmerovať hovor na inú adresu. + + + As&k user permission to transfer + Vypýtať si povolenie od používateľa pred &presmerovaním + + + Alt+K + Alt+P + + + Indicates if Twinkle should ask the user before transferring a call when a REFER request is received. + Indikuje, či sa má Twinkle spýtať používateľa na povolenie pri prichádzajúcej požiadavke na presmerovanie (REFER). + + + Hold call &with referrer while setting up call to transfer target + Podržať ho&vor, kým sa zostavuje hovor s cieľom prepojenia + + + Alt+W + Alt+V + + + Indicates if Twinkle should put the current call on hold when a REFER request to transfer a call is received. + Indikuje, či Twinkle pri prichádzajúcej požiadavke na presmerovanie (REFER) podrží aktuálny hovor. + + + Ho&ld call with referee before sending REFER + Podržať hovor pred odos&laním REFER + + + Alt+L + Alt+L + + + Indicates if Twinkle should put the current call on hold when you transfer a call. + Indikuje, či má Twinkle podržať hovor pri jeho presmerovaní. + + + Auto re&fresh subscription to refer event while call transfer is not finished + Automaticky obnovovať registráciu &pre REFER signál, kým nie je presmerovanie dokončené + + + Alt+F + Alt+P + + + While a call is being transferred, the referee sends NOTIFY messages to the referrer about the progress of the transfer. These messages are only sent for a short interval which length is determined by the referee. If you tick this box, the referrer will automatically send a SUBSCRIBE to lengthen this interval if it is about to expire and the transfer has not yet been completed. + Počas presmerovania hovoru posiela sprostredkovateľ presmerovania správ NOTIFY o postupe presmerovania tomu, koho hovor je presmerovávaný. Avšak iba na krátky čas. Tento čas určuje ten, kto je presmerovávaný. Ak je aktivovaná táto voľba, posiela sprostredkovateľ (Twinkle) automaticky SUBSCRIBE tak, aby sa tento čas predĺžil až do momentu, kedy je proces presmerovania ukončený. + + + NAT traversal + Prekonanie NATu (traversal) + + + &NAT traversal not needed + Prekonanie &NATu (traversal) nie je potrebné + + + Alt+N + Alt+N + + + Choose this option when there is no NAT device between you and your SIP proxy or when your SIP provider offers hosted NAT traversal. + Vyberte túto voľbu, ak sa medzi Twinkle a vašou SIP proxy nenachádza žiaden NAT alebo pokiaľ váš poskytovateľ dokáže sám NAT prekonať. + + + &Use statically configured public IP address inside SIP messages + V správach SIP po&užiť statickú verejnú IP adresu + + + Indicates if Twinkle should use the public IP address specified in the next field inside SIP message, i.e. in SIP headers and SDP body instead of the IP address of your network interface.<br><br> +When you choose this option you have to create static address mappings in your NAT device as well. You have to map the RTP ports on the public IP address to the same ports on the private IP address of your PC. + Indikuje, či má Twinkle použiť vo vnútri správ SIP (v hlavičke SIP a tele SDP) verejnú IP adresu, miesto IP adresy vášho sieťového rozhrania.<br><br> +Ak si vyberiete túto voľbu, musíte tiež na vašom zariadení NAT nasmerovať zodpovedajúce RTP porty na váš počítač. + + + Choose this option when your SIP provider offers a STUN server for NAT traversal. + Vyberte túto voľbu, ak váš poskytovateľ SIP ponúka STUN server na premostenie vášho NATu. + + + S&TUN server: + Adresa S&TUN servera: + + + The hostname, domain name or IP address of the STUN server. + Doménové meno, IP adresa alebo meno STUN servera. + + + &Public IP address: + Verejná IP &adresa: + + + The public IP address of your NAT. + Verejná adresa vášho NATu. + + + Telephone numbers + Telefónne čísla + + + Only &display user part of URI for telephone number + Pri telefónnych číslach zobraziť iba používateľskú časť &URI + + + If a URI indicates a telephone number, then only display the user part. E.g. if a call comes in from sip:123456@twinklephone.com then display only "123456" to the user. A URI indicates a telephone number if it contains the "user=phone" parameter or when it has a numerical user part and you ticked the next option. + Ak URI označuje telefónne číslo, bude zobrazená iba používateľská časť adresy. Napr. ak príde volanie od sip:12345@voipposkytovatel.com, Twinkle zobrazí ako adresu len "12345". URI je považované za telefónne číslo, ak obsahuje parameter "user=phone" alebo ak je aktívna nasledujúca voľba a používateľská časť adresy je numerická. + + + &URI with numerical user part is a telephone number + &URI s numerickou používateľskou časťou je telefónne číslo + + + If you tick this option, then Twinkle considers a SIP address that has a user part that consists of digits, *, #, + and special symbols only as a telephone number. In an outgoing message, Twinkle will add the "user=phone" parameter to such a URI. + Ak povolíte túto voľbu, Twinkle bude považovať každú SIP adresu za telefónne číslo, ak má v používateľskej časti iba číslice, *, #, + a špeciálne znaky. V odchádzajúcich SIP správach označí Twinkle takéto adresy parametrom "user=phone". + + + &Remove special symbols from numerical dial strings + &Odstrániť z telefónneho čísla špeciálne znaky + + + Telephone numbers are often written with special symbols like dashes and brackets to make them readable to humans. When you dial such a number the special symbols must not be dialed. To allow you to simply copy/paste such a number into Twinkle, Twinkle can remove these symbols when you hit the dial button. + Aby boli telefónne čísla ľahšie čitateľné, často sa píšu s použitím špeciálnych znakov ako napr. "(", ")", " " (prázdny znak), "-". Pri vytáčaní nesmú byť tieto znaky vysielané. Ab bolo možné zjednodušiť vytáčanie pomocou copy/paste, Twinkle môže tieto znaky automaticky odstrániť. + + + &Special symbols: + Špeciálne &znaky: + + + The special symbols that may be part of a telephone number for nice formatting, but must be removed when dialing. + Zoznam všetkých špeciálnych znakov, ktoré má Twinkle z vytáčaných čísiel odstrániť. + + + Number conversion + Prevod čísiel + + + Match expression + Vyhľadávaný výraz + + + Replace + Nahradiť + + + <p> +Often the format of the telphone numbers you need to dial is different from the format of the telephone numbers stored in your address book, e.g. your numbers start with a +-symbol followed by a country code, but your provider expects '00' instead of the '+', or you are at the office and all your numbers need to be prefixed with a '9' to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings. +</p> +<p> +For each number you dial, Twinkle will try to find a match in the list of match expressions. For the first match it finds, the number will be replaced with the format string. If no match is found, the number stays unchanged. +</p> +<p> +The number conversion rules are also applied to incoming calls, so the numbers are displayed in the format you want. +</p> +<h3>Example 1</h3> +<p> +Assume your country code is 31 and you have stored all numbers in your address book in full international number format, e.g. +318712345678. For dialling numbers in your own country you want to strip of the '+31' and replace it by a '0'. For dialling numbers abroad you just want to replace the '+' by '00'. +</p> +<p> +The following rules will do the trick: +</p> +<blockquote> +<tt> +Match expression = \+31([0-9]*) , Replace = 0$1<br> +Match expression = \+([0-9]*) , Replace = 00$1</br> +</tt> +</blockquote> +<h3>Example 2</h3> +<p> +You are at work and all telephone numbers starting with a 0 should be prefixed with a 9 for an outside line. +</p> +<blockquote> +<tt> +Match expression = 0[0-9]* , Replace = 9$&<br> +</tt> +</blockquote> + <p> +Často sa formát telefónnych čísiel, ktoré očakáva poskytovateľ VoIP nezhoduje s formátom čísiel uložených v adresári. Napr. pri číslach začínajúcich na "+" a národným kódom krajiny očakáva váš poskytovateľ miesto "00" znak "+". Alebo ste pripojený na miestnu sieť SIP a je potrebné najprv zadať predvoľbu pre volania smerom von. +Tu je možné pomocou vyhľadávacích a nahradzovaných vzorov (podľa štýlu regulárnych výrazov so syntaxom jazyku Perl) nastaviť všeobecne platné pravidlá pre konverziu telefónnych čísiel. +</p> +<p> +Pri každom vytáčaní sa Twinkle pokúsi nájsť pre čísla z používateľskej časti adresy SIP zodpovedajúci výraz v zozname hľadaných vzorov. S prvým nájdeným vyhovujúcim výrazom je vykonaná úprava pôvodného čísla, pričom pozícia v "(" ")" v hľadanom výraze (napr. "([0-9]*)" pre "ľubovoľný počet čísiel") je nahradená znakmi v zodpovedajúcich premenných. Napr. "$1" pre prvú pozíciu. Viď tiež `man 7 regex` alebo konqueror:"#regex". Ak nie je nájdený žiaden zodpovedajúci hľadaný vzor, zostane číslo nezmenené. +</p> +<p> +Pravidlá budú tiež použité na čísla v prichádzajúcich hovoroch. Podľa nastavených pravidiel budú pretransformované do želaného formátu. +</p> +<h3>1. príklad</h3> +<p> +Napr. váš národní kód je "421" pre Slovenskú republiku a vo vašom adresári máte tiež veľa vnútroštátnych čísiel uložených v medzinárodnom formáte. Napr.. +421 2 123 456. Avšak poskytovateľ VoIP očakáva pre vnútroštátny hovor číslo 02 123456. Chcete teda nahradiť '+421' číslom '0' a zároveň pre zahraničné hovory nahradiť '+' predvoľbou '00'. +</p> +<p> +Na to sú potrebné nasledujúce pravidlá uvedené v tejto postupnosti: +</p> +<blockquote> +<tt> +Hľadaný výraz = \+421([0-9]*) , Náhrada = 0$1<br> +Hľadaný výraz = \+([0-9]*) , Náhrada = 00$1</br> +</tt> +</blockquote> +<h3>2. príklad</h3> +<p> +Nachádzate sa na telefónnej ústredni a všetkým číslam začínajúcim nulou má byť predradené číslo 9. +</p> +<blockquote> +<tt> +Hľadaný výraz = 0[0-9]* , Náhrada = 9$&<br> +</tt> +</blockquote> +( $& je špeciálna premenná, v ktorej je uložené celé pôvodné číslo)<br> +Poznámka: Toto pravidlo nie je možné nastaviť jednoducho ako tretie pravidlo k dvom pravidlám z príkladu č. 1. Bude totiž použité vždy len prvé pravidlo, ktoré vyhľadávaniu vyhovie. Miesto toho by muselo byť zmenené nahrádzanie v pravidlách 1 a 2 + + + Move the selected number conversion rule upwards in the list. + Posunúť vybrané pravidlo konverzie na vyššiu pozíciu. + + + Move the selected number conversion rule downwards in the list. + Posunúť vybrané pravidlo konverzie na nižšiu pozíciu. + + + &Add + &Pridať + + + Add a number conversion rule. + Pridať nové konverzné pravidlo. + + + Re&move + &Odstrániť + + + Remove the selected number conversion rule. + Odstrániť vybrané konverzné pravidlo. + + + &Edit + U&praviť + + + Edit the selected number conversion rule. + Upraviť vybrané konverzné pravidlo. + + + Type a telephone number here an press the Test button to see how it is converted by the list of number conversion rules. + Pre overenie funkčnosti vytvoreného konverzného pravidla sem napíšte skúšobné telefónne číslo a kliknite na Test. + + + &Test + &Test + + + Test how a number is converted by the number conversion rules. + Otestovať, ako bude číslo prevedené konverznými pravidlami. + + + When an incoming call is received, this timer is started. If the user answers the call, the timer is stopped. If the timer expires before the user answers the call, then Twinkle will reject the call with a "480 User Not Responding". + Tento časovač sa spustí pri prichádzajúcom hovore. Ak nebude na hovor do vypršania časového limitu odpovedané, Twinkle hovor odmietne so správou "480 User Not Responding". + + + NAT &keep alive: + &Keep alive NATu: + + + &No answer: + &Nedostupný po: + + + Ring &back tone: + &Tón vyzváňania na strane volaného: + + + <p> +Specify the file name of a .wav file that you want to be played as ring back tone for this user. +</p> +<p> +This ring back tone overrides the ring back tone settings in the system settings. +</p> + <p>Zadajte meno súboru .wav pre indikáciu zvonenia na strane tohto používateľa.</p> + +<p>Tento tón nahradí tón vyzváňania nastavený v systéme.</p> + + + <p> +Specify the file name of a .wav file that you want to be played as ring tone for this user. +</p> +<p> +This ring tone overrides the ring tone settings in the system settings. +</p> + <p>Zadajte meno súboru .wav pre tón vyzváňania v tomto profile používateľa.</p> + +<p>Toto nastavenie nahradí tón vyzváňania tón nastavený v systéme.</p> + + + &Ring tone: + &Tón vyzváňania: + + + <p> +This script is called when you release a call. +</p> +<h2>Environment variables</h2> +<p> +The values of all SIP headers of the outgoing SIP BYE request are passed in environment variables to your script. +</p> +<p> +<b>TWINKLE_TRIGGER=local_release</b>. <b>SIPREQUEST_METHOD=BYE</b>. <b>SIPREQUEST_URI</b> contains the request-URI of the BYE. The name of the user profile will be passed in <b>TWINKLE_USER_PROFILE</b>. + <p> +Tento skript sa spustí, ak je nejaký hovor ukončený z vašej strany. +</p> +<h3>Systémové premenné</h3> +<p> +Obsahy všetkých SIP hlavičiek odosielaných SIP BYE požiadaviek budú odovzdané tomuto skriptu prostredníctvom nasledujúcich systémových premenných: +</p> +<p> +<b>TWINKLE_TRIGGER=local_release</b>. +<b>SIPREQUEST_METHOD=BYE</b>. +<b>SIPREQUEST_URI</b> obsahuje request-URI metódy BYE. +<b>TWINKLE_USER_PROFILE</b> obsahuje meno aktívneho používateľského profilu. + + + <p> +This script is called when an incoming call fails. +</p> +<h2>Environment variables</h2> +<p> +The values of all SIP headers of the outgoing SIP failure response are passed in environment variables to your script. +</p> +<p> +<b>TWINKLE_TRIGGER=in_call_failed</b>. <b>SIPSTATUS_CODE</b> contains the status code of the failure response. <b>SIPSTATUS_REASON</b> contains the reason phrase. The name of the user profile will be passed in <b>TWINKLE_USER_PROFILE</b>. + <p> +Tento skript sa spustí, ak nebude prichádzajúci hovor prijatý. Tzn. ukončí sa vyzváňanie bez toho aby bolo "zdvihnuté". +</p> +<h3>Systémové premenné</h3> +<p> +Obsahy všetkých SIP hlavičiek odosielaných SIP failure požiadaviek budú odovzdané tomuto skriptu prostredníctvom nasledujúcich systémových premenných: +</p> +<p> +<b>TWINKLE_TRIGGER=in_call_failed</b>. +<b>SIPSTATUS_CODE</b> obsahuje stavový kód odosielanej SIP failure odpovede. +<b>SIPSTATUS_REASON</b> obsahuje "reason phrase", tedy príčinu chyby. +<b>TWINKLE_USER_PROFILE</b> obsahuje meno aktívneho používateľského profilu. + + + <p> +This script is called when the remote party releases a call. +</p> +<h2>Environment variables</h2> +<p> +The values of all SIP headers of the incoming SIP BYE request are passed in environment variables to your script. +</p> +<p> +<b>TWINKLE_TRIGGER=remote_release</b>. <b>SIPREQUEST_METHOD=BYE</b>. <b>SIPREQUEST_URI</b> contains the request-URI of the BYE. The name of the user profile will be passed in <b>TWINKLE_USER_PROFILE</b>. + <p> +Tento skript sa spustí, ak je hovor ukončený protistranou. +</p> +<h3>Systémové premenné</h3> +<p> +Obsahy všetkých SIP hlavičiek odosielaných SIP BYE požiadaviek budú odovzdané tomuto skriptu prostredníctvom nasledujúcich systémových premenných:</p> +<p> +<b>TWINKLE_TRIGGER=remote_release</b>. +<b>SIPREQUEST_METHOD=BYE</b>. +<b>SIPREQUEST_URI</b> obsahuje request-URI signálu BYE. +<b>TWINKLE_USER_PROFILE</b> obsahuje meno aktívneho používateľského profilu. + + + <p> +This script is called when the remote party answers your call. +</p> +<h2>Environment variables</h2> +<p> +The values of all SIP headers of the incoming 200 OK are passed in environment variables to your script. +</p> +<p> +<b>TWINKLE_TRIGGER=out_call_answered</b>. <b>SIPSTATUS_CODE=200</b>. <b>SIPSTATUS_REASON</b> contains the reason phrase. The name of the user profile will be passed in <b>TWINKLE_USER_PROFILE</b>. + <p> +Tento skript sa spustí, ak bude hovor prijatý protistranou. +</p> +<h3>Systémové premenné</h3> +<p> +Obsahy všetkých SIP hlavičiek prichádzajúcich hlásení "200 OK" budú odovzdané tomuto skriptu prostredníctvom nasledujúcich systémových premenných:</p> +</p> +<p> +<b>TWINKLE_TRIGGER=out_call_answered</b>. +<b>SIPSTATUS_CODE=200</b>. +<b>SIPSTATUS_REASON</b> obsahuje "reason phrase" +<b>TWINKLE_USER_PROFILE</b> obsahuje meno aktívneho používateľského profilu. + + + <p> +This script is called when you answer an incoming call. +</p> +<h2>Environment variables</h2> +<p> +The values of all SIP headers of the outgoing 200 OK are passed in environment variables to your script. +</p> +<p> +<b>TWINKLE_TRIGGER=in_call_answered</b>. <b>SIPSTATUS_CODE=200</b>. <b>SIPSTATUS_REASON</b> contains the reason phrase. The name of the user profile will be passed in <b>TWINKLE_USER_PROFILE</b>. + <p> +Tento skript sa spustí, ak bude prichádzajúci hovor prijatý. +</p> +<h3>Systémové premenné</h3> +<p> +Obsahy všetkých SIP hlavičiek odchádzajúcich hlásení "200 OK" budú odovzdané tomuto skriptu prostredníctvom nasledujúcich systémových premenných:</p> +</p> +<p> +<b>TWINKLE_TRIGGER=in_call_answered</b>. +<b>SIPSTATUS_CODE=200</b>. +<b>SIPSTATUS_REASON</b> obsahuje "reason phrase" +<b>TWINKLE_USER_PROFILE</b> obsahuje meno aktívneho používateľského profilu. + + + Call released locall&y: + Lokálne &ukončenie hovoru: + + + <p> +This script is called when an outgoing call fails. +</p> +<h2>Environment variables</h2> +<p> +The values of all SIP headers of the incoming SIP failure response are passed in environment variables to your script. +</p> +<p> +<b>TWINKLE_TRIGGER=out_call_failed</b>. <b>SIPSTATUS_CODE</b> contains the status code of the failure response. <b>SIPSTATUS_REASON</b> contains the reason phrase. The name of the user profile will be passed in <b>TWINKLE_USER_PROFILE</b>. + <p> +Tento skript sa spustí, ak nie je možné realizovať odchádzajúce volanie, napr. kvôli timeoutu, DND atď. +</p> +<h3>Systémové premenné</h3> +<p> +Obsahy všetkých SIP hlavičiek odosielaných SIP failure požiadaviek budú odovzdané tomuto skriptu prostredníctvom nasledujúcich systémových premenných: +</p> +<p> +<b>TWINKLE_TRIGGER=out_call_failed</b>. +<b>SIPSTATUS_CODE</b> obsahuje stavový kód odoslanej SIP failure odpovede. +<b>SIPSTATUS_REASON</b> obsahuje "reason phrase", tedy chybovou hlásenie vo forme jednoduchého textu. +<b>TWINKLE_USER_PROFILE</b> obsahuje meno aktívneho používateľského profilu. + + + <p> +This script is called when you make a call. +</p> +<h2>Environment variables</h2> +<p> +The values of all SIP headers of the outgoing INVITE are passed in environment variables to your script. +</p> +<p> +<b>TWINKLE_TRIGGER=out_call</b>. <b>SIPREQUEST_METHOD=INVITE</b>. <b>SIPREQUEST_URI</b> contains the request-URI of the INVITE. The name of the user profile will be passed in <b>TWINKLE_USER_PROFILE</b>. + <p> +Tento skript sa spustí pri zahájení hovoru z vašej strany. +</p> +<h3>Systémové premenné</h3> +<p> +Obsahy všetkých SIP hlavičiek odosielaných SIP INVITE požiadaviek budú odovzdané tomuto skriptu prostredníctvom nasledujúcich systémových premenných: +</p> +<p> +<b>TWINKLE_TRIGGER=out_call</b>. +<b>SIPREQUEST_METHOD=INVITE</b>. +<b>SIPREQUEST_URI</b> obsahuje request-URI signálu INVITE. +<b>TWINKLE_USER_PROFILE</b> obsahuje meno aktívneho používateľského profilu. + + + Outgoing call a&nswered: + Hovor &prijatý protistranou: + + + Incoming call &failed: + Prichádzajúce volanie bolo &neúspešné: + + + &Incoming call: + &Prichádzajúce volanie: + + + Call released &remotely: + Ukončenie &hovoru protistranou: + + + Incoming call &answered: + Prichádzajúce volanie &prijaté: + + + O&utgoing call: + Odchádzajúce &volanie: + + + Out&going call failed: + Od&chádzajúce volanie nebolo úspešné: + + + &Enable ZRTP/SRTP encryption + Povoliť &šifrovanie ZRTP/SRTP + + + When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unecrypted. + Ak je aktivované, Twinkle sa pokúsi pri všetkých odchádzajúcich a prichádzajúcich hovoroch šifrovať zvukové dáta. Aby bol hovor naozaj zašifrovaný musí aj protistrana podporovať šifrovanie ZRTP/SRTP. Inak ostane hovor nešifrovaný. + + + ZRTP settings + Nastavenia ZRTP + + + O&nly encrypt audio if remote party indicated ZRTP support in SDP + Šifro&vať iba ak protistrana potvrdí podporu ZRTP v SDP + + + A SIP endpoint supporting ZRTP may indicate ZRTP support during call setup in its signalling. Enabling this option will cause Twinkle only to encrypt calls when the remote party indicates ZRTP support. + Protistrana podporujúca ZRTP môže túto informáciu oznámiť už počas zostavovania hovoru. Ak je aktivovaná táto voľba, Twinkle sa v takýchto prípadoch pokúsi použiť šifrovaný prenos hovoru. + + + &Indicate ZRTP support in SDP + ZRTP podporu ohlasovať &v SDP + + + Twinkle will indicate ZRTP support during call setup in its signalling. + Ak je táto voľba zapnutá, Twinkle pri zostavovaní hovoru ohlási protistrane pomocí SDP, že podporuje ZRTP. + + + &Popup warning when remote party disables encryption during call + &Upozorniť, ak protistrana prepne na nešifrovaný prenos hovoru + + + A remote party of an encrypted call may send a ZRTP go-clear command to stop encryption. When Twinkle receives this command it will popup a warning if this option is enabled. + Protistrana môže počas šifrovaného hovoru vyslať príkaz ZRTP-go-clear a tým šifrovanie vypnúť. Ak je táto voľba aktívna, Twinkle na tento bezpečnostný problém okamžite upozorní. + + + Dynamic payload type %1 is used more than once. + Dynamický typ payloadu %1 je použitý viac ako raz. + + + You must fill in a user name for your SIP account. + Je potrebné zadať meno používateľa pre váš SIP účet. + + + You must fill in a domain name for your SIP account. +This could be the hostname or IP address of your PC if you want direct PC to PC dialing. + Pre váš SIP účet musíte zadať doménové meno. +Pre priame volania medzi IP adresami je to doménové meno alebo verejná IP adresa vášho počítača. + + + Invalid user name. + Neplatné meno používateľa. + + + Invalid domain. + Neplatná doména. + + + Invalid value for registrar. + Neplatné meno registrátora. + + + Invalid value for outbound proxy. + Neplatné meno odchádzajúcej proxy. + + + Value for public IP address missing. + Chýba verejná IP adresa. + + + Invalid value for STUN server. + Neplatná hodnota pre STUN server. + + + Ring tones + Description of .wav files in file dialog + Tóny vyzváňania + + + Choose ring tone + Vyberte tón vyzváňania + + + Ring back tones + Description of .wav files in file dialog + Tón pre signalizáciu vyzváňania na strane volaného + + + All files + Všetky súbory + + + Choose incoming call script + Vyberte skript, ktorý sa má spustiť pri prichádzajúcom hovore + + + Choose incoming call answered script + Vyberte skript, ktorý sa má spustiť po "prijatí prichádzajúceho volania" + + + Choose incoming call failed script + Vyberte skript, ktorý sa má spustiť pri chybe počas prichádzajúceho hovoru + + + Choose outgoing call script + Vyberte skript, ktorý sa má spustiť pri odchádzajúcom hovore + + + Choose outgoing call answered script + Vyberte skript, ktorý sa má spustiť pri prijatí hovoru protistranou + + + Choose outgoing call failed script + Vyberte skript, ktorý sa má spustiť pri chybe počas odchádzajúceho hovoru + + + Choose local release script + Vyberte skript, ktorý sa má spustiť pri vlastnom ukončení hovoru + + + Choose remote release script + Vyberte skript, ktorý sa má spustiť pri ukončení hovoru protistranou + + + Voice mail + Hlasová schránka + + + &Follow codec preference from far end on incoming calls + Pri prichádzajúcich hovoroch dávať prednosť kodekom &protistrany + + + <p> +For incoming calls, follow the preference from the far-end (SDP offer). Pick the first codec from the SDP offer that is also in the list of active codecs. +<p> +If you disable this option, then the first codec from the active codecs that is also in the SDP offer is picked. + Ak je táto voľba aktívna, Twinkle uprednostní pri prichádzajúcom hovore kodeky protistrany (SDP offer). Konkrétne bude použitý prvý kodek, ktorý je protistranou ponúkaný a tiež sa nachádza v zozname lokálnych kodekov. +Ak je voľba vypnutá, použije Twinkle prvý kodek vo vlastnom zozname, ktorý je tiež podporovaný protistranou. + + + Follow codec &preference from far end on outgoing calls + Pri odchádzajúcich hovoroch dávať prednosť kodekom podľa &preferencií protistrany + + + <p> +For outgoing calls, follow the preference from the far-end (SDP answer). Pick the first codec from the SDP answer that is also in the list of active codecs. +<p> +If you disable this option, then the first codec from the active codecs that is also in the SDP answer is picked. + Ak je táto voľba aktívna, Twinkle uprednostní pri odchádzajúcom hovore kodeky protistrany (SDP answer). Konkrétne bude použitý prvý kodek, ktorý je protistranou ponúkaný a tiež sa nachádza v zozname lokálnych kodekov. +Ak je voľba vypnutá, použije Twinkle prvý kodek vo vlastnom zozname, ktorý je tiež podporovaný protistranou, to znamená, že je uvedený v zozname SDP Answer. + + + Codeword &packing order: + Dátové poradie (codeword &packing order): + + + RFC 3551 + RFC 3551 + + + ATM AAL2 + ATM AAL2 + + + There are 2 standards to pack the G.726 codewords into an RTP packet. RFC 3551 is the default packing method. Some SIP devices use ATM AAL2 however. If you experience bad quality using G.726 with RFC 3551 packing, then try ATM AAL2 packing. + Existujú dve metódy balenia dátových paketov G.726 do RTP paketov. Štandardne je to RFC 3351. Niektorí poskytovatelia SIP však používajú ATM AAL2. Ak je prenos zvuku pri použití kodeku G.726 zarušený, môžte vyskúšať balenie ATM AAL2. + + + Replaces + Rozšírenie Replaces + + + Indicates if the Replaces-extenstion is supported. + Indikuje, či je podporované rozšírenie Replaces. + + + Attended refer to AoR (Address of Record) + Asistovane prepájať na AoR (Address of Record) + + + An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endoint. + Asistované prepojenie by malo používať Contact URI ako cieľovú adresu pre informovanie presmerovávanej strany o novom spojení. Táto adresa nemusí byť však globálne platiť. Ako alternatívu je možné použiť AoR (Address of Record). Nevýhodou je, že pri viacerých koncových zariadeniach nie je AoR jednoznačné, zatiaľčo URI kontaktu vždy ukazuje na jediné zariadenie. + + + Privacy + Súkromie + + + Privacy options + Nastavenia ochrany súkromia + + + &Send P-Preferred-Identity header when hiding user identity + &Posielať hlavičku P-Preferred-Identity pri skrývaní identity používateľa + + + Include a P-Preferred-Identity header with your identity in an INVITE request for a call with identity hiding. + Ak je vybrané a zároveň je aktívna voľba "skryť odosielateľa", bude spolu s údajom odosielateľa odoslaná pri požiadavke INVITE hlavička P-Preferred-Identity. + + + <p> +You can customize the way Twinkle handles incoming calls. Twinkle can call a script when a call comes in. Based on the output of the script Twinkle accepts, rejects or redirects the call. When accepting the call, the ring tone can be customized by the script as well. The script can be any executable program. +</p> +<p> +<b>Note:</b> Twinkle pauses while your script runs. It is recommended that your script does not take more than 200 ms. When you need more time, you can send the parameters followed by <b>end</b> and keep on running. Twinkle will continue when it receives the <b>end</b> parameter. +</p> +<p> +With your script you can customize call handling by outputting one or more of the following parameters to stdout. Each parameter should be on a separate line. +</p> +<p> +<blockquote> +<tt> +action=[ continue | reject | dnd | redirect | autoanswer ]<br> +reason=&lt;string&gt;<br> +contact=&lt;address to redirect to&gt;<br> +caller_name=&lt;name of caller to display&gt;<br> +ringtone=&lt;file name of .wav file&gt;<br> +display_msg=&lt;message to show on display&gt;<br> +end<br> +</tt> +</blockquote> +</p> +<h2>Parameters</h2> +<h3>action</h3> +<p> +<b>continue</b> - continue call handling as usual<br> +<b>reject</b> - reject call<br> +<b>dnd</b> - deny call with do not disturb indication<br> +<b>redirect</b> - redirect call to address specified by <b>contact</b><br> +<b>autoanswer</b> - automatically answer a call<br> +</p> +<p> +When the script does not write an action to stdout, then the default action is continue. +</p> +<p> +<b>reason: </b> +With the reason parameter you can set the reason string for reject or dnd. This might be shown to the far-end user. +</p> +<p> +<b>caller_name: </b> +This parameter will override the display name of the caller. +</p> +<p> +<b>ringtone: </b> +The ringtone parameter specifies the .wav file that will be played as ring tone when action is continue. +</p> +<h2>Environment variables</h2> +<p> +The values of all SIP headers in the incoming INVITE message are passed in environment variables to your script. The variable names are formatted as <b>SIP_&lt;HEADER_NAME&gt;</b> E.g. SIP_FROM contains the value of the from header. +</p> +<p> +TWINKLE_TRIGGER=in_call. SIPREQUEST_METHOD=INVITE. The request-URI of the INVITE will be passed in <b>SIPREQUEST_URI</b>. The name of the user profile will be passed in <b>TWINKLE_USER_PROFILE</b>. + <p> +Tu môžete upraviť ako Twinkle obslúži prichádzajúce hovory. Twinkle môže pri prichádzajúcich hovoroch spustiť skript. V závislosti od výstupu skriptu Twinkle prijme, odmietne alebo presmeruje hovor. Skript môže ovplyvniť aj tón vyzváňania. Môže se jednať o ľubovoľný spustiteľný program. +</p> +<p><b>Poznámka:</b> Twinkle prestane po dobu spustenia skriptu pracovať. Odporúčame, aby skript nebežal dlhšie ako 200 ms. Ak potrebujete viac času, môžete po odoslaní parametrov poslať <b>end</b> a pokračovať v spúšťaní. Twinkle bude sám po prijatí parametra <b>end</b> pokračovať. +<h3>Vrátené hodnoty</h3> - print po STDOUT (napr. `echo "action=dnd"`), jedna hodnota na riadok: <br> +<tt>action=[ continue | reject | dnd | redirect | autoanswer ]<br></tt> +<blockquote> +<i>continue</i> - pokračovať v normálnom spracovaní hovoru (predvolené)<br> +<i>reject</i> - odmietnuť hovor<br> +<i>dnd</i> - odmietnuť hovor s poznámkou "nerušiť"<br> +<i>redirect</i> - presmerovať hovor na <tt>contact</tt><br> +<i>autoanswer</i> - hovor automaticky prijať<br> +</blockquote> +<br> +<tt>reason=&lt;string&gt; </tt>pre dnd a reject (zobrazenie na strane volaného/volajúceho)<br> +<tt>contact=&lt;presmerovacia adresa&gt; </tt>pre presmerovanie<br> +<tt>caller_name=&lt;nové zobrazované meno volajúceho&gt; </tt>nahradí meno volajúceho<br> +<tt>ringtone=&lt;meno .wav súboru&gt; </tt>tón vyzváňania zvlášť pre tento hovor (iba pri <i>continue</i> ;-)<br> +<tt>display_msg=&lt;ľubovoľná poznámka pre zobrazenie detailov v hlavnom okne&gt;</tt><br> +<tt>end </tt>Twinkle vyhodnotí všetky vrátené hodnoty, uzatvorí STDOUT skriptu(!) a pokračuje ďalej<br> +</tt> +</p> +<p> +<h3>Systémové premenné</h3> +<p> +Hodnoty všetkých SIP hlavičiek prichádzajúceho INVITE budu odovzdané tomuto skriptu. Štruktúra premenných: <b>SIP_&lt;HEADER_NAME&gt;</b> - napr. SIP_FROM obsahuje hodnotu "from header". +</p> +<p> +TWINKLE_TRIGGER=in_call. <br> +SIPREQUEST_METHOD=INVITE. <br> +SIPREQUEST_URI obsahuje request-URI signálu INVITE.<br> +TWINKLE_USER_PROFILE obsahuje meno používateľského profilu, pre ktorý je prichádzajúce volanie určené. + + + &Voice mail address: + &Adresa hlasovej schránky: + + + The SIP address or telephone number to access your voice mail. + SIP adresa alebo telefónne číslo pre prístup k vašej hlasovej schránke. + + + Unsollicited + Nevyžiadané + + + Sollicited + Vyžiadané + + + <H2>Message waiting indication type</H2> +<p> +If your provider offers the message waiting indication service, then Twinkle can show you when new voice mail messages are waiting. Ask your provider which type of message waiting indication is offered. +</p> +<H3>Unsollicited</H3> +<p> +Asterisk provides unsollicited message waiting indication. +</p> +<H3>Sollicited</H3> +<p> +Sollicited message waiting indication as specified by RFC 3842. +</p> + <H2>Typ indikácie čakajúcich správ</H2> +<p> +Ak váš poskytovateľ SIP ponúka upozornenie na uložené správy v hlasovej schránke, môže vás Twinkle informovať o nových aj už vypočutých správach vo vašej hlasovej schránke. Spýtajte sa vášho poskytovateľa, aký typ indikácie čakajúcich správ je používaný + +</p> +<H3>Nevyžiadané</H3> +<p> +Asterisk podporuje nevyžiadané indikovanie čakajúcich správ. +</p> +<H3>Vyžiadané</H3> +<p> +Vyžiadaná indikácia čakajúcich správ podľa RFC 3842. +</p> + + + &MWI type: + Typ &MWI: + + + Sollicited MWI + Vyžiadané MWI + + + Subscription &duration: + Doba &platnosti odberu: + + + Mailbox &user name: + Meno používateľa &hlasovej schránky: + + + The hostname, domain name or IP address of your voice mailbox server. + Meno hostiteľa, doménové meno alebo IP adresa servera vašej hlasovej schránky. + + + For sollicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. + Podľa špecifikácie MWI sa koncové zariadenie prihlási na serveri k príjmu správ na určitú dobu. Pred vypršaním tejto doby by sa prihlásenie malo znovu obnoviť. + + + Your user name for accessing your voice mailbox. + Meno používateľa pre prístup k vašej hlasovej schránke. + + + Mailbox &server: + &Server hlasovej schránky: + + + Via outbound &proxy + Cez odchádzajúcu &proxy + + + Check this option if Twinkle should send SIP messages to the mailbox server via the outbound proxy. + Ak je táto voľba aktivovaná, Twinkle zasiela správy SIP na server hlasovej schránky cez odchádzajúcu proxy. + + + You must fill in a mailbox user name. + Musíte vyplniť meno používateľa hlasovej schránky. + + + You must fill in a mailbox server + Musíte vyplniť server hlasovej schránky + + + Invalid mailbox server. + Neplatný server hlasovej schránky. + + + Invalid mailbox user name. + Neplatné meno používateľa hlasovej schránky. + + + Use domain &name to create a unique contact header value + Použiť doménové &meno pre vytvorenie jednoznačnej hlavičky Contact + + + Select ring back tone file. + Vyberte súbor pre tón vyzváňania na druhej strane. + + + Select ring tone file. + Vyberte súbor s tónom vyzváňania. + + + Select script file. + Vyberte súbor so skriptom. + + + %1 converts to %2 + %1 konvertuje na %2 + + + Instant message + Textová správa + + + Presence + Prítomnosť + + + &Maximum number of sessions: + &Maximálny počet sedení: + + + When you have this number of instant message sessions open, new incoming message sessions will be rejected. + Ak je už otvorený tento počet sedení s textovými správami, nové prichádzajúce sedenia budú odmietnuté. + + + Your presence + Vaše dostupnosti + + + &Publish availability at startup + &Zverejniť dostupnosť pri štarte + + + Publish your availability at startup. + Zverejniť vašu dostupnosť pri spustení. + + + Buddy presence + Prítomnosť kontaktov + + + Publication &refresh interval (sec): + Interval &odosielania stavu (s): + + + Refresh rate of presence publications. + Frekvencia odosielania vlastnej dostupnosti. + + + &Subscription refresh interval (sec): + &Interval obnovenia príjmu dostupnosti (s): + + + Refresh rate of presence subscriptions. + Frekvencia príjmu dostupnosti kontaktov. + + + Transport/NAT + Prenos/NAT + + + Add q-value to registration + Pridať q-hodnotu k registrácii + + + The q-value indicates the priority of your registered device. If besides Twinkle you register other SIP devices for this account, then the network may use these values to determine which device to try first when delivering a call. + Hodnota 'q' určuje prioritu vášho registrovaného zariadenia. Ak je okrem Twinkle k VoIP účtu registrované aj iné SIP zariadenie, môže sieť využiť tieto hodnoty na určenie zariadenia, ktoré má byť prednostne oslovené pre obslúženie hovoru. + + + The q-value is a value between 0.000 and 1.000. A higher value means a higher priority. + Hodnota 'q' je medzi 0.000 and 1.000. Vyššia hodnota znamená vyššiu prioritu. + + + SIP transport + Prenos SIP + + + UDP + UDP + + + TCP + TCP + + + Transport mode for SIP. In auto mode, the size of a message determines which transport protocol is used. Messages larger than the UDP threshold are sent via TCP. Smaller messages are sent via UDP. + Režim prenosu SIP. V automatickom režime je prenosový protokol určený veľkosťou správy. Správy väčšie ako prah pre UDP sú posielané protokolom TCP. Menšie správy sú posielané pomocou UDP. + + + T&ransport protocol: + P&renosový protokol: + + + UDP t&hreshold: + &Prah použitia UDP: + + + Messages larger than the threshold are sent via TCP. Smaller messages are sent via UDP. + Správy väčšie ako špecifikovaný prah sú doručované protokolom TCP. Menšie správy sú doručované protokolom UDP. + + + Use &STUN (does not work for incoming TCP) + Použiť &STUN (nefunguje pre prichádzajúce TCP) + + + P&ersistent TCP connection + Tr&valé TCP spojenie + + + Keep the TCP connection established during registration open such that the SIP proxy can reuse this connection to send incoming requests. Application ping packets are sent to test if the connection is still alive. + Podržať otvorené TCP spojenie vytvorené počas registrácie tak, aby SIP proxy mohla využiť toto spojenie na vysielanie prichádzajúcich požiadaviek. Aplikácia odosiela pakety ping tak, aby sa zistilo, či je spojenie stále aktívne. + + + &Send composing indications when typing a message. + Pri písaní správ &odosielať o tomto indikáciu. + + + Twinkle sends a composing indication when you type a message. This way the recipient can see that you are typing. + Ak píšete správu, Twinkle o tomto informuje protistranu. Takto se príjemca môže dozvedieť, že niečo píšete. + + + AKA AM&F: + AKA AM&F: + + + A&KA OP: + A&KA OP: + + + Authentication management field for AKAv1-MD5 authentication. + Parametre autentizačného managementu pre AKAv1-MD5 autentizáciu. + + + Operator variant key for AKAv1-MD5 authentication. + Operátorova varianta kľúča pre autentizáciu AKAv1-MD5. + + + Prepr&ocessing + Pred&spracovanie + + + Preprocessing (improves quality at remote end) + Predspracovanie (vylepšuje kvalitu u príjemcu) + + + &Automatic gain control + &Automatické riadenie hlasitosti + + + Automatic gain control (AGC) is a feature that deals with the fact that the recording volume may vary by a large amount between different setups. The AGC provides a way to adjust a signal to a reference volume. This is useful because it removes the need for manual adjustment of the microphone gain. A secondary advantage is that by setting the microphone gain to a conservative (low) level, it is easier to avoid clipping. + Z dôvodu veľkého rozdielu hlasitostí nahrávania v rôznych konfiguráciách bola zavedená funkcia automatického riadenia hlasitosti (AGC - Automatic gain control). AGC umožňuje nastaviť úroveň signálu na prednastavenú hodnotu. Vďaka tomu nie je potrebné neustále nastavovať hlasitosť mikrofónu. Ďalšou výhodou je, že nastavenie hlasitosti mikrofónu je väčšinou na nižšej (konzervatívnej) úrovni, čím sa predchádza orezávaniu príliš hlasného zvuku. + + + Automatic gain control &level: + &Úroveň automatického riadenia hlasitosti: + + + Automatic gain control level represents percentual value of automatic gain setting of a microphone. Recommended value is about 25%. + Úroveň automatického riadenia hlasitosti predstavuje percentuálnu hodnotu maximálnej hlasitosti mikrofónu. Odporúčaná hodnota je kolem 25%. + + + &Voice activity detection + Detekcia &hlasu + + + When enabled, voice activity detection detects whether the input signal represents a speech or a silence/background noise. + Ak je táto voľba aktívna, detekcia hlasu zisťuje, či je na zvukovom vstupe hlas alebo ticho/šum na pozadí. + + + &Noise reduction + &Potlačenie šumu + + + The noise reduction can be used to reduce the amount of background noise present in the input signal. This provides higher quality speech. + Potlačenie šumu môže byť použité na zníženie okolitých rušivých zvukov vo vstupnom signále. Toto vedie k lepšej kvalite hovoreného slova. + + + Acoustic &Echo Cancellation + Potlačenie &akustickej ozveny + + + In any VoIP communication, if a speech from the remote end is played in the local loudspeaker, then it propagates in the room and is captured by the microphone. If the audio captured from the microphone is sent directly to the remote end, then the remote user hears an echo of his voice. An acoustic echo cancellation is designed to remove the acoustic echo before it is sent to the remote end. It is important to understand that the echo canceller is meant to improve the quality on the remote end. + Ak je pri VoIP komunikácii prichádzajúci zvuk prepnutý na hlasný odposluch v reproduktoroch, môže sa šíriť miestnosťou a byť snímaný mikrofónom. Ak je tento signál posielaný späť volajúcemu, stáva sa, že počuje ozvenu vlastného hlasu. Funkcia potlačenia akustickej ozveny je navrhnutá na potlačenie týchto zvukov pred tým, ako sú odoslané volajúcemu. Je dôležité si uvedomiť, že táto funkcia je určená pre zlepšenie kvality prenosu hlasu na druhej strane hovoru. + + + Variable &bit-rate + Premenlivý &dátový tok + + + Discontinuous &Transmission + Diskontinuitný &prenos + + + &Quality: + &Kvalita: + + + Speex is a lossy codec, which means that it achieves compression at the expense of fidelity of the input speech signal. Unlike some other speech codecs, it is possible to control the tradeoff made between quality and bit-rate. The Speex encoding process is controlled most of the time by a quality parameter that ranges from 0 to 10. + Speex je stratový kodek, čo znamená, že je na úkor kvality možné docieliť redukciu dátového toku. Na rozdiel od iných hlasových kodekov je možné nastaviť kompromis medzi kvalitou a dátovým tokom. Kódovací proces pri tomto kodeku je spravidla riadený nastavením parametru kvality v rozsahu od 0 do 10. + + + bytes + bajtov + + + Use tel-URI for telephone &number + Použiť tel-URI pre &telefónne číslo + + + Expand a dialed telephone number to a tel-URI instead of a sip-URI. + Rozšíriť vytáčané telefónne číslo na tel-URI miesto sip-URI. + + + Accept call &transfer request (incoming REFER) + Prijímať žiadosti o &prepojenie hovoru (prichádzajúci REFER) + + + Allow call transfer while consultation in progress + Povoliť prepojenie hovoru počas asistovaného prepojenia + + + When you perform an attended call transfer, you normally transfer the call after you established a consultation call. If you enable this option you can transfer the call while the consultation call is still in progress. This is a non-standard implementation and may not work with all SIP devices. + Ak robíte asistované prepojenie, tak obvykle prepojíte hovor po tom, čo prebehne konzultácia s protistranou. Akonáhle povolíte túto voľbu, potom môžete prepojiť hovor, kým konzultácia stále prebieha. Toto je neštandardná implementácia, ktorá nemusí správne pracovať so všetkými zariadeniami SIP. + + + Enable NAT &keep alive + Povoliť NAT &keep alive + + + Send UDP NAT keep alive packets. + Posielať UDP pakety pre udržanie spojenia cez NAT. + + + If you have enabled STUN or NAT keep alive, then Twinkle will send keep alive packets at this interval rate to keep the address bindings in your NAT device alive. + Ak máte povolený STUN alebo NAT keep alive, bude Twinkle zasielať udržovacie pakety v tomto intervale tak, aby boli udržané mapovania na vašom NATe. + + + + WizardForm + + Twinkle - Wizard + Twinkle - Sprievodca + + + The hostname, domain name or IP address of the STUN server. + Doménové meno, IP adresa alebo meno hostiteľa STUN servera. + + + S&TUN server: + S&TUN server: + + + The SIP user name given to you by your provider. It is the user part in your SIP address, <b>username</b>@domain.com This could be a telephone number. +<br><br> +This field is mandatory. + Meno používateľa, ktoré vám bolo pridelené vaším poskytovateľom SIP. Je tiež prvou časťou vašej úplnej SIP adresy <b>pouzivatel</b>@domena.com. Môže sa tiež jednať o telefónne číslo. +<br><br> +Tento údaj je povinný. + + + &Domain*: + &Doména*: + + + Choose your SIP service provider. If your SIP service provider is not in the list, then select <b>Other</b> and fill in the settings you received from your provider.<br><br> +If you select one of the predefined SIP service providers then you only have to fill in your name, user name, authentication name and password. + Vyberte vášho poskytovateľa SIP a uveďte tu vaše celé meno, vaše používateľské meno SIP, prípadne prihlasovacie meno a heslo.<br> +Ak váš poskytovateľ nie je v zozname, vyberte <b>Iný</b> a uveďte požadované údaje. + + + &Authentication name: + &Prihlasovacie meno: + + + &Your name: + Vaše &meno: + + + Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though. + Vaše prihlasovacie meno SIP. Často sa zhoduje s vaším SIP menom používateľa. Môže však byť aj iné. + + + The domain part of your SIP address, username@<b>domain.com</b>. Instead of a real domain this could also be the hostname or IP address of your <b>SIP proxy</b>. If you want direct IP phone to IP phone communications then you fill in the hostname or IP address of your computer. +<br><br> +This field is mandatory. + Doménová časť vašej úplnej SIP adresy pouzivatel@<b>domena.com</b>. Okrem skutočnej domény sa môže tiež jednať o meno hostiteľa alebo IP adresu vašej <b>SIP proxy</b>. Pre priame volania medzi IP adresami tu môžete zadať meno hostiteľa alebo IP adresu vášho počítača. +<br><br> +Tento údaj je povinný. + + + This is just your full name, e.g. John Doe. It is used as a display name. When you make a call, this display name might be shown to the called party. + Vaše celé meno, napr. Jozef Mrkva. Používa sa len pre účely zobrazenia. Akonáhle uskutočníte hovor, toto meno môže byť zobrazené volanému. + + + SIP pre&xy: + SIP pro&xy: + + + The hostname, domain name or IP address of your SIP proxy. If this is the same value as your domain, you may leave this field empty. + Doménové meno, IP adresa alebo meno vašej proxy. Ak sa zhoduje s doménou, je možné toto pole nechať prázdne. + + + &SIP service provider: + Poskytovateľ &SIP VoIP služby: + + + &Password: + &Heslo: + + + &User name*: + &Meno používateľa*: + + + Your password for authentication. + Vaše prihlasovacie heslo. + + + &OK + &OK + + + Alt+O + Alt+O + + + &Cancel + &Zrušiť + + + Alt+C + Alt+Z + + + None (direct IP to IP calls) + Žiadne (priame volanie medzi IP adresami) + + + Other + Iný + + + User profile wizard: + Sprievodca profilu používateľa: + + + You must fill in a user name for your SIP account. + Musíte zadať meno používateľa pre váš SIP účet. + + + You must fill in a domain name for your SIP account. +This could be the hostname or IP address of your PC if you want direct PC to PC dialing. + Je potrebné zadať doménové meno vášho SIP účtu (časť vpravo od symbolu "@"). +V prípade priameho volania medzi IP adresami se môže jednať o meno hostiteľa alebo IP adresu vášho PC. + + + Invalid value for SIP proxy. + Neplatná hodnota pre SIP proxy. + + + Invalid value for STUN server. + Neplatná hodnota pre STUN server. + + + + YesNoDialog + + &Yes + &Áno + + + &No + &Nie + + + + incoming_call + + Answer + Prijať + + + Reject + Odmietnuť + + + -- cgit v1.2.3 From 30eac220c69dabd715d6357d2df2f39b91b08fe2 Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Thu, 20 Feb 2020 14:20:13 +0100 Subject: Fix spelling errors --- NEWS | 4 ++-- src/gui/mphoneform.cpp | 4 ++-- src/gui/userprofileform.cpp | 42 +++++++++++++++++++++--------------------- src/gui/userprofileform.ui | 26 +++++++++++++------------- src/parser/request.cpp | 6 +++--- src/phone.cpp | 2 +- src/phone_user.cpp | 16 ++++++++-------- src/phone_user.h | 4 ++-- src/user.cpp | 20 ++++++++++---------- src/user.h | 12 ++++++------ 10 files changed, 68 insertions(+), 68 deletions(-) diff --git a/NEWS b/NEWS index 0ced74e..1b27196 100644 --- a/NEWS +++ b/NEWS @@ -267,8 +267,8 @@ Other ================= - Local address book - Message waiting indication (MWI) - * Sollicted MWI as specified by RFC 3842 - * Unsollicited MWI as implemented by Asterisk + * Solicited MWI as specified by RFC 3842 + * Unsolicited MWI as implemented by Asterisk - Voice mail speed dial - Call transfer with consultation * This is a combination of a consultation call on the other line diff --git a/src/gui/mphoneform.cpp b/src/gui/mphoneform.cpp index 6c447a8..2d4f10f 100644 --- a/src/gui/mphoneform.cpp +++ b/src/gui/mphoneform.cpp @@ -1115,7 +1115,7 @@ void MphoneForm::updateMwi() toolTip.append(tr("Unknown")); } } else { - if ((*i)->get_mwi_sollicited()) { + if ((*i)->get_mwi_solicited()) { if (mwi.get_status() == t_mwi::MWI_FAILED) { toolTip.append(tr("Failure")); mwi_failure = true; @@ -1123,7 +1123,7 @@ void MphoneForm::updateMwi() toolTip.append(tr("Unknown")); } } else { - // Unsollicited MWI + // Unsolicited MWI if (mwi.get_status() == t_mwi::MWI_KNOWN) { bool new_msgs; QString status = getMWIStatus(mwi, new_msgs); diff --git a/src/gui/userprofileform.cpp b/src/gui/userprofileform.cpp index 9ed9209..d0a94f3 100644 --- a/src/gui/userprofileform.cpp +++ b/src/gui/userprofileform.cpp @@ -102,8 +102,8 @@ #define colReplace 1 // MWI type indices -#define idxMWIUnsollicited 0 -#define idxMWISollicited 1 +#define idxMWIUnsolicited 0 +#define idxMWISolicited 1 // SIP transport protocol indices #define idxSipTransportAuto 0 @@ -383,12 +383,12 @@ void UserProfileForm::populate() // VOICE MAIL vmAddressLineEdit->setText(current_profile->get_mwi_vm_address().c_str()); - if (current_profile->get_mwi_sollicited()) { - mwiTypeComboBox->setCurrentIndex(idxMWISollicited); - mwiSollicitedGroupBox->setEnabled(true); + if (current_profile->get_mwi_solicited()) { + mwiTypeComboBox->setCurrentIndex(idxMWISolicited); + mwiSolicitedGroupBox->setEnabled(true); } else { - mwiTypeComboBox->setCurrentIndex(idxMWIUnsollicited); - mwiSollicitedGroupBox->setEnabled(false); + mwiTypeComboBox->setCurrentIndex(idxMWIUnsolicited); + mwiSolicitedGroupBox->setEnabled(false); } mwiUserLineEdit->setText(current_profile->get_mwi_user().c_str()); mwiServerLineEdit->setText(current_profile-> @@ -809,7 +809,7 @@ bool UserProfileForm::validateValues() // Validity check voice mail page - if (mwiTypeComboBox->currentIndex() == idxMWISollicited) { + if (mwiTypeComboBox->currentIndex() == idxMWISolicited) { // Mailbox user name is mandatory if (mwiUserLineEdit->text().isEmpty()) { categoryListBox->setCurrentRow(idxCatVoiceMail); @@ -921,8 +921,8 @@ bool UserProfileForm::validateValues() proxyLineEdit->clear(); } - // Clear sollicited MWI settings if unsollicited MWI is used - if (mwiTypeComboBox->currentIndex() == idxMWIUnsollicited) { + // Clear solicited MWI settings if unsolicited MWI is used + if (mwiTypeComboBox->currentIndex() == idxMWIUnsolicited) { t_user user_default; mwiUserLineEdit->clear(); mwiServerLineEdit->clear(); @@ -1002,10 +1002,10 @@ bool UserProfileForm::validateValues() current_profile->set_mwi_vm_address(vmAddressLineEdit->text().toStdString()); bool mustTriggerMWISubscribe = false; - bool mwiSollicited = (mwiTypeComboBox->currentIndex() == idxMWISollicited); - if (mwiSollicited) { - if (!current_profile->get_mwi_sollicited()) { - // Sollicited MWI now enabled. Subscribe after all MWI + bool mwiSolicited = (mwiTypeComboBox->currentIndex() == idxMWISolicited); + if (mwiSolicited) { + if (!current_profile->get_mwi_solicited()) { + // Solicited MWI now enabled. Subscribe after all MWI // settings have been changed. mustTriggerMWISubscribe = true; } else { @@ -1015,7 +1015,7 @@ bool UserProfileForm::validateValues() t_url(s.toStdString()) != current_profile->get_mwi_server() || mwiViaProxyCheckBox->isChecked() != current_profile->get_mwi_via_proxy()) { - // Sollicited MWI settings changed. Trigger unsubscribe + // Solicited MWI settings changed. Trigger unsubscribe // of current MWI subscription. emit mwiChangeUnsubscribe(current_profile); @@ -1024,14 +1024,14 @@ bool UserProfileForm::validateValues() } } } else { - if (current_profile->get_mwi_sollicited()) { - // MWI type changes to unsollicited. Trigger unsubscribe of + if (current_profile->get_mwi_solicited()) { + // MWI type changes to unsolicited. Trigger unsubscribe of // current MWI subscription. emit mwiChangeUnsubscribe(current_profile); } } - current_profile->set_mwi_sollicited(mwiSollicited); + current_profile->set_mwi_solicited(mwiSolicited); current_profile->set_mwi_user(mwiUserLineEdit->text().toStdString()); s = USER_SCHEME; s.append(':').append(mwiServerLineEdit->text()); @@ -1521,8 +1521,8 @@ void UserProfileForm::testConversion() { } void UserProfileForm::changeMWIType(int idxMWIType) { - if (idxMWIType == idxMWISollicited) { - mwiSollicitedGroupBox->setEnabled(true); + if (idxMWIType == idxMWISolicited) { + mwiSolicitedGroupBox->setEnabled(true); // Set defaults if (mwiUserLineEdit->text().isEmpty()) { @@ -1533,7 +1533,7 @@ void UserProfileForm::changeMWIType(int idxMWIType) { mwiViaProxyCheckBox->setChecked(useProxyCheckBox->isChecked()); } } else { - mwiSollicitedGroupBox->setEnabled(false); + mwiSolicitedGroupBox->setEnabled(false); } } diff --git a/src/gui/userprofileform.ui b/src/gui/userprofileform.ui index 4a11efa..ef2f900 100644 --- a/src/gui/userprofileform.ui +++ b/src/gui/userprofileform.ui @@ -2494,7 +2494,7 @@ This format is what most SIP phones use. - Indicates if the Replaces-extenstion is supported. + Indicates if the Replaces-extension is supported. Replaces @@ -2585,7 +2585,7 @@ This format is what most SIP phones use. - An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endoint. + An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endpoint. Attended refer to AoR (Address of Record) @@ -3079,7 +3079,7 @@ When you choose this option you have to create static address mappings in your N <p> -Often the format of the telphone numbers you need to dial is different from the format of the telephone numbers stored in your address book, e.g. your numbers start with a +-symbol followed by a country code, but your provider expects '00' instead of the '+', or you are at the office and all your numbers need to be prefixed with a '9' to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings. +Often the format of the telephone numbers you need to dial is different from the format of the telephone numbers stored in your address book, e.g. your numbers start with a +-symbol followed by a country code, but your provider expects '00' instead of the '+', or you are at the office and all your numbers need to be prefixed with a '9' to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings. </p> <p> For each number you dial, Twinkle will try to find a match in the list of match expressions. For the first match it finds, the number will be replaced with the format string. If no match is found, the number stays unchanged. @@ -4076,7 +4076,7 @@ The values of all SIP headers of the outgoing INVITE are passed in environment v - When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unecrypted. + When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unencrypted. &Enable ZRTP/SRTP encryption @@ -4206,23 +4206,23 @@ The values of all SIP headers of the outgoing INVITE are passed in environment v <p> If your provider offers the message waiting indication service, then Twinkle can show you when new voice mail messages are waiting. Ask your provider which type of message waiting indication is offered. </p> -<H3>Unsollicited</H3> +<H3>Unsolicited</H3> <p> -Asterisk provides unsollicited message waiting indication. +Asterisk provides unsolicited message waiting indication. </p> -<H3>Sollicited</H3> +<H3>Solicited</H3> <p> -Sollicited message waiting indication as specified by RFC 3842. +Solicited message waiting indication as specified by RFC 3842. </p> - Unsollicited + Unsolicited - Sollicited + Solicited @@ -4261,9 +4261,9 @@ Sollicited message waiting indication as specified by RFC 3842. - + - Sollicited MWI + Solicited MWI @@ -4328,7 +4328,7 @@ Sollicited message waiting indication as specified by RFC 3842. - For sollicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. + For solicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. 999999 diff --git a/src/parser/request.cpp b/src/parser/request.cpp index e20a8fb..a157a94 100644 --- a/src/parser/request.cpp +++ b/src/parser/request.cpp @@ -505,9 +505,9 @@ bool t_request::is_valid(bool &fatal, std::string &reason) const { // RFC 3265 7.2 // Subscription-State header is mandatory - // As an exception Twinkle allows an unsollicited NOTIFY for MWI + // As an exception Twinkle allows an unsolicited NOTIFY for MWI // without a Subscription-State header. Asterisk sends - // unsollicited NOTIFY requests. + // unsolicited NOTIFY requests. if (!hdr_to.tag.empty() || hdr_event.event_type != SIP_EVENT_MSG_SUMMARY) { @@ -519,7 +519,7 @@ bool t_request::is_valid(bool &fatal, std::string &reason) const { // The Subscription-State header is mandatory. // However, Asterisk uses an expired draft for sending - // unsollicitied NOTIFY messages without a Subscription-State + // unsolicitied NOTIFY messages without a Subscription-State // header. As Asterisk is popular, Twinkle allows this. break; case REFER: diff --git a/src/phone.cpp b/src/phone.cpp index 16abc38..66d6ea0 100644 --- a/src/phone.cpp +++ b/src/phone.cpp @@ -3322,7 +3322,7 @@ void t_phone::init(void) { void t_phone::init_extensions(t_user *user_config) { // Subscribe to MWI - if (user_config->get_mwi_sollicited()) { + if (user_config->get_mwi_solicited()) { pub_subscribe_mwi(user_config); } diff --git a/src/phone_user.cpp b/src/phone_user.cpp index c52f396..5cac223 100644 --- a/src/phone_user.cpp +++ b/src/phone_user.cpp @@ -769,10 +769,10 @@ void t_phone_user::handle_response_register(t_response *r, bool &re_register) { phone->start_timer(PTMR_TCP_PING, this); } - // Registration succeeded. If sollicited MWI is provisioned + // Registration succeeded. If solicited MWI is provisioned // and no MWI subscription is established yet, then subscribe // to MWI. - if (user_config->get_mwi_sollicited() && !mwi_auto_resubscribe) { + if (user_config->get_mwi_solicited() && !mwi_auto_resubscribe) { subscribe_mwi(); } @@ -978,9 +978,9 @@ bool t_phone_user::is_mwi_terminated(void) const { return mwi_dialog == NULL; } -void t_phone_user::handle_mwi_unsollicited(t_request *r, t_tid tid) { - if (user_config->get_mwi_sollicited()) { - // Unsollicited MWI is not supported +void t_phone_user::handle_mwi_unsolicited(t_request *r, t_tid tid) { + if (user_config->get_mwi_solicited()) { + // Unsolicited MWI is not supported t_response *resp = r->create_response(R_403_FORBIDDEN); phone->send_response(resp, 0, tid); MEMMAN_DELETE(resp); @@ -1186,13 +1186,13 @@ void t_phone_user::recvd_notify(t_request *r, t_tid tid) { bool partial_match = false; if (r->hdr_to.tag.empty()) { - // Unsollicited NOTIFY - handle_mwi_unsollicited(r, tid); + // Unsolicited NOTIFY + handle_mwi_unsolicited(r, tid); return; } if (mwi_dialog && mwi_dialog->match_request(r, partial_match)) { - // Sollicited NOTIFY + // Solicited NOTIFY mwi_dialog->recvd_request(r, 0, tid); cleanup_mwi_dialog(); return; diff --git a/src/phone_user.h b/src/phone_user.h index 6e76ec8..50f86d6 100644 --- a/src/phone_user.h +++ b/src/phone_user.h @@ -280,11 +280,11 @@ public: bool is_mwi_terminated(void) const; /** - * Process an unsollicited NOTIFY for MWI. + * Process an unsolicited NOTIFY for MWI. * @param r [in] The NOTIFY request. * @param tid [in] Transaction identifier of the NOTIFY transaction. */ - void handle_mwi_unsollicited(t_request *r, t_tid tid); + void handle_mwi_unsolicited(t_request *r, t_tid tid); //@} /** @name Presence */ diff --git a/src/user.cpp b/src/user.cpp index 588bb55..16a4c3b 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -163,7 +163,7 @@ extern t_phone *phone; #define FLD_ZRTP_SEND_IF_SUPPORTED "zrtp_send_if_supported" // MWI -#define FLD_MWI_SOLLICITED "mwi_sollicited" +#define FLD_MWI_SOLICITED "mwi_solicited" #define FLD_MWI_USER "mwi_user" #define FLD_MWI_SERVER "mwi_server" #define FLD_MWI_VIA_PROXY "mwi_via_proxy" @@ -459,7 +459,7 @@ t_user::t_user() { zrtp_goclear_warning = true; zrtp_sdp = true; zrtp_send_if_supported = false; - mwi_sollicited = false; + mwi_solicited = false; mwi_user.clear(); mwi_via_proxy = false; mwi_subscription_time = 3600; @@ -578,7 +578,7 @@ t_user::t_user(const t_user &u) { zrtp_goclear_warning = u.zrtp_goclear_warning; zrtp_sdp = u.zrtp_sdp; zrtp_send_if_supported = u.zrtp_send_if_supported; - mwi_sollicited = u.mwi_sollicited; + mwi_solicited = u.mwi_solicited; mwi_user = u.mwi_user; mwi_server = u.mwi_server; mwi_via_proxy = u.mwi_via_proxy; @@ -1380,10 +1380,10 @@ bool t_user::get_zrtp_send_if_supported(void) const { return result; } -bool t_user::get_mwi_sollicited(void) const { +bool t_user::get_mwi_solicited(void) const { bool result; mtx_user.lock(); - result = mwi_sollicited; + result = mwi_solicited; mtx_user.unlock(); return result; } @@ -2070,9 +2070,9 @@ void t_user::set_zrtp_send_if_supported(bool b) { mtx_user.unlock(); } -void t_user::set_mwi_sollicited(bool b) { +void t_user::set_mwi_solicited(bool b) { mtx_user.lock(); - mwi_sollicited = b; + mwi_solicited = b; mtx_user.unlock(); } @@ -2524,8 +2524,8 @@ bool t_user::read_config(const string &filename, string &error_msg) { zrtp_sdp = yesno2bool(value); } else if (parameter == FLD_ZRTP_SEND_IF_SUPPORTED) { zrtp_send_if_supported = yesno2bool(value); - } else if (parameter == FLD_MWI_SOLLICITED) { - mwi_sollicited = yesno2bool(value); + } else if (parameter == FLD_MWI_SOLICITED) { + mwi_solicited = yesno2bool(value); } else if (parameter == FLD_MWI_USER) { mwi_user = value; } else if (parameter == FLD_MWI_SERVER) { @@ -2869,7 +2869,7 @@ bool t_user::write_config(const string &filename, string &error_msg) { // Write MWI settings config << "# MWI\n"; - config << FLD_MWI_SOLLICITED << '=' << bool2yesno(mwi_sollicited) << endl; + config << FLD_MWI_SOLICITED << '=' << bool2yesno(mwi_solicited) << endl; config << FLD_MWI_USER << '=' << mwi_user << endl; if (mwi_server.is_valid()) { config << FLD_MWI_SERVER << '=' << mwi_server.encode_noscheme() << endl; diff --git a/src/user.h b/src/user.h index 93921c4..bbd33fa 100644 --- a/src/user.h +++ b/src/user.h @@ -487,10 +487,10 @@ private: bool zrtp_send_if_supported; // MWI - // Indicate if MWI is sollicited or unsollicited. - // RFC 3842 specifies that MWI must be sollicited (SUBSCRIBE). - // Asterisk however only supported non-standard unsollicited MWI. - bool mwi_sollicited; + // Indicate if MWI is solicited or unsolicited. + // RFC 3842 specifies that MWI must be solicited (SUBSCRIBE). + // Asterisk however only supported non-standard unsolicited MWI. + bool mwi_solicited; // User name for subscribing to the mailbox string mwi_user; @@ -659,7 +659,7 @@ public: bool get_zrtp_goclear_warning(void) const; bool get_zrtp_sdp(void) const; bool get_zrtp_send_if_supported(void) const; - bool get_mwi_sollicited(void) const; + bool get_mwi_solicited(void) const; string get_mwi_user(void) const; t_url get_mwi_server(void) const; bool get_mwi_via_proxy(void) const; @@ -778,7 +778,7 @@ public: void set_zrtp_goclear_warning(bool b); void set_zrtp_sdp(bool b); void set_zrtp_send_if_supported(bool b); - void set_mwi_sollicited(bool b); + void set_mwi_solicited(bool b); void set_mwi_user(const string &user); void set_mwi_server(const t_url &url); void set_mwi_via_proxy(bool b); -- cgit v1.2.3 From 918acfedfeb87f42c050e13e163f3a21766353e9 Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Fri, 21 Feb 2020 20:47:00 +0100 Subject: Run lupdate on lang files --- src/gui/lang/twinkle_cs.ts | 153 ++++++++++++++++++++++++++---- src/gui/lang/twinkle_de.ts | 4 +- src/gui/lang/twinkle_nl.ts | 155 ++++++++++++++++++++++++++---- src/gui/lang/twinkle_ru.ts | 161 ++++++++++++++++++++++++++++---- src/gui/lang/twinkle_sk.ts | 159 +++++++++++++++++++++++++++---- src/gui/lang/twinkle_sv.ts | 222 ++++++++++++++++++++++++------------------- src/gui/lang/twinkle_xx.ts | 228 ++++++++++++++++++++++++--------------------- 7 files changed, 808 insertions(+), 274 deletions(-) diff --git a/src/gui/lang/twinkle_cs.ts b/src/gui/lang/twinkle_cs.ts index 34586ae..9be2844 100644 --- a/src/gui/lang/twinkle_cs.ts +++ b/src/gui/lang/twinkle_cs.ts @@ -955,6 +955,14 @@ Zdá se, že <p><b>KAddressbook</b> neobsahuje žádné záznamy s telefonními čísly, které by Twinkle mohl načíst. Použijte prosím tento program k úpravě nebo zanesení vašich kontaktů.</p> <p>Druhou možností je používat místní adresář v Twinkle.</p> + + Are you sure you want to delete contact '%1' from the local address book? + + + + Delete contact + + GetProfileNameForm @@ -4155,11 +4163,11 @@ a na vašem NATu namapovat (UDP) porty. &Domain*: - &Doména*: + &Doména*: Or&ganization: - Or&ganizace: + Or&ganizace: The SIP user name given to you by your provider. It is the user part in your SIP address, <b>username</b>@domain.com This could be a telephone number. @@ -4233,7 +4241,7 @@ Toto pole je povinné. &Expiry: - &Platnost: + &Platnost: The registration expiry time that Twinkle will request. @@ -4635,7 +4643,7 @@ Vysílá DTMF out-of-band přes požadavek SIP INFO.</p> Max re&directions: - Max. počet &přesměrování: + Max. počet &přesměrování: The number of redirect addresses that Twinkle tries at a maximum before it gives up redirecting a request. This prevents a request from getting redirected forever. @@ -4647,7 +4655,7 @@ Vysílá DTMF out-of-band přes požadavek SIP INFO.</p> Call &Hold variant: - Způsob přidržení &hovoru: + Způsob přidržení &hovoru: RFC 2543 @@ -4904,7 +4912,7 @@ Pokud si tuto volbu vyberete, musíte rovněž na vašem NAT zařízení nasměr S&TUN server: - Adresa S&TUN serveru: + Adresa S&TUN serveru: The hostname, domain name or IP address of the STUN server. @@ -4998,7 +5006,7 @@ You are at work and all telephone numbers starting with a 0 should be prefixed w Match expression = 0[0-9]* , Replace = 9$&<br> </tt> </blockquote> - <p> + <p> Často není formát telefonních čísel, které jsou očekávány od VoIP poskytovatele, shodný s formátem čísel uložených v adresáři. Např. u čísel začínajících na "+" a národním kódem země očekává váš poskytovatel namísto "00" znak "+". Nebo jste-li napojeni na místní SIP síť a je nutné předtočit nejdříve číslo k přístupu ven. Zde je možné za použití vyhledávacích a zaměňovacích vzorů (podle způsobu regulárních výrazů a la Perl) nastavit obecně platné pravidla pro konverzi telefonních čísel. </p> @@ -5326,7 +5334,7 @@ Obsahy všech SIP hlaviček odeslaných SIP INVITE požadavků budou předány t When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unecrypted. - Pokud je aktivováno, pokusí se Twinkle při všech odchozích a příchozích hovorech zašifrovat zvuková data. Aby byl hovor opravdu zašifrován musí i protistrana podporovat šifrování ZRTP/SRTP. Jinak zůstane hovor nešifrovaný. + Pokud je aktivováno, pokusí se Twinkle při všech odchozích a příchozích hovorech zašifrovat zvuková data. Aby byl hovor opravdu zašifrován musí i protistrana podporovat šifrování ZRTP/SRTP. Jinak zůstane hovor nešifrovaný. ZRTP settings @@ -5494,7 +5502,7 @@ Pokud je deaktivováno, použije Twinkle první kodek z vlastního seznamu, kter Indicates if the Replaces-extenstion is supported. - Indikuje, zda je rozšíření Replaces podporováno. + Indikuje, zda je rozšíření Replaces podporováno. Attended refer to AoR (Address of Record) @@ -5502,7 +5510,7 @@ Pokud je deaktivováno, použije Twinkle první kodek z vlastního seznamu, kter An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endoint. - Asistované přepojení by mělo používat Contact-URI jako cílovou adresu pro sdělení nového spojení přesměrovávané protistraně. Tato adresa nemusí být ovšem globálně platná. Alternativně se může použít AoR (Address of Record). Nevýhodou je, že při více koncových zařízeních není AoR jednoznačné, zatímco URI kontaktu směřuje na jediné zařízení. + Asistované přepojení by mělo používat Contact-URI jako cílovou adresu pro sdělení nového spojení přesměrovávané protistraně. Tato adresa nemusí být ovšem globálně platná. Alternativně se může použít AoR (Address of Record). Nevýhodou je, že při více koncových zařízeních není AoR jednoznačné, zatímco URI kontaktu směřuje na jediné zařízení. Privacy @@ -5616,11 +5624,11 @@ TWINKLE_USER_PROFILE obsahuje jméno uživatelského profilu, pro který je př Unsollicited - Nevyžádané + Nevyžádané Sollicited - Vyžádané + Vyžádané <H2>Message waiting indication type</H2> @@ -5635,7 +5643,7 @@ Asterisk provides unsollicited message waiting indication. <p> Sollicited message waiting indication as specified by RFC 3842. </p> - <H2>Typ indikace čekajících zpráv</H2> + <H2>Typ indikace čekajících zpráv</H2> <p> Pokud váš SIP poskytovatel nabízí upozornění na uložené zprávy v hlasové schránce, může vás Twinkle informovat o nových i již vyslechnutých zprávách ve vaší hlasové schránce. Zeptejte se vašeho poskytovatele, jaký typ indikace čekajících zpráv je používán </p> @@ -5654,7 +5662,7 @@ Vyžádaná indikace čekajících zpráv dle RFC 3842. Sollicited MWI - Vyžádané MWI + Vyžádané MWI Subscription &duration: @@ -5670,7 +5678,7 @@ Vyžádaná indikace čekajících zpráv dle RFC 3842. For sollicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. - Dle specifikace MWI se koncové zařízení hlásí na serveru k příjmu zpráv na určitou dobu a před vypršením této doby by se přihlášení mělo znovu obnovit. + Dle specifikace MWI se koncové zařízení hlásí na serveru k příjmu zpráv na určitou dobu a před vypršením této doby by se přihlášení mělo znovu obnovit. Your user name for accessing your voice mailbox. @@ -5818,7 +5826,7 @@ Vyžádaná indikace čekajících zpráv dle RFC 3842. Use &STUN (does not work for incoming TCP) - Použít &STUN (nefunguje pro příchozí TCP) + Použít &STUN (nefunguje pro příchozí TCP) P&ersistent TCP connection @@ -5952,6 +5960,119 @@ Vyžádaná indikace čekajících zpráv dle RFC 3842. If you have enabled STUN or NAT keep alive, then Twinkle will send keep alive packets at this interval rate to keep the address bindings in your NAT device alive. Pokud máte povolený STUN nebo NAT keep alive, pak bude Twinkle zasílat udržovací pakety v tomto intervalu, aby byla udržena mapování na vašem NATu. + + Do&main*: + + + + Organi&zation: + + + + E&xpiry: + + + + Call Hold &variant: + + + + &Max redirections: + + + + Indicates if the Replaces-extension is supported. + + + + An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endpoint. + + + + Include a P-Asserted-Identity header with your identity in an INVITE request for a call with identity hiding. + + + + &Send P-Asserted-Identity header when hiding user identity + + + + Use STUN (does not wor&k for incoming TCP) + + + + STUN ser&ver: + + + + <p> +Often the format of the telephone numbers you need to dial is different from the format of the telephone numbers stored in your address book, e.g. your numbers start with a +-symbol followed by a country code, but your provider expects '00' instead of the '+', or you are at the office and all your numbers need to be prefixed with a '9' to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings. +</p> +<p> +For each number you dial, Twinkle will try to find a match in the list of match expressions. For the first match it finds, the number will be replaced with the format string. If no match is found, the number stays unchanged. +</p> +<p> +The number conversion rules are also applied to incoming calls, so the numbers are displayed in the format you want. +</p> +<h3>Example 1</h3> +<p> +Assume your country code is 31 and you have stored all numbers in your address book in full international number format, e.g. +318712345678. For dialling numbers in your own country you want to strip of the '+31' and replace it by a '0'. For dialling numbers abroad you just want to replace the '+' by '00'. +</p> +<p> +The following rules will do the trick: +</p> +<blockquote> +<tt> +Match expression = \+31([0-9]*) , Replace = 0$1<br> +Match expression = \+([0-9]*) , Replace = 00$1</br> +</tt> +</blockquote> +<h3>Example 2</h3> +<p> +You are at work and all telephone numbers starting with a 0 should be prefixed with a 9 for an outside line. +</p> +<blockquote> +<tt> +Match expression = 0[0-9]* , Replace = 9$&<br> +</tt> +</blockquote> + + + + When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unencrypted. + + + + <H2>Message waiting indication type</H2> +<p> +If your provider offers the message waiting indication service, then Twinkle can show you when new voice mail messages are waiting. Ask your provider which type of message waiting indication is offered. +</p> +<H3>Unsolicited</H3> +<p> +Asterisk provides unsolicited message waiting indication. +</p> +<H3>Solicited</H3> +<p> +Solicited message waiting indication as specified by RFC 3842. +</p> + + + + Unsolicited + + + + Solicited + + + + Solicited MWI + + + + For solicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. + + WizardForm diff --git a/src/gui/lang/twinkle_de.ts b/src/gui/lang/twinkle_de.ts index 8ab0b01..8adc278 100644 --- a/src/gui/lang/twinkle_de.ts +++ b/src/gui/lang/twinkle_de.ts @@ -1,6 +1,6 @@ - + AddressCardForm @@ -2419,7 +2419,7 @@ Um den Online-Status eines Buddies abzufragen, muss <i>dessen</i> Pr Reject - Abweisen + Abweisen &Hold diff --git a/src/gui/lang/twinkle_nl.ts b/src/gui/lang/twinkle_nl.ts index 131094e..adbf748 100644 --- a/src/gui/lang/twinkle_nl.ts +++ b/src/gui/lang/twinkle_nl.ts @@ -1,6 +1,6 @@ - + AddressCardForm @@ -1003,6 +1003,14 @@ <p>U heeft geen contacten met een telefoonnummer in <b>KAddressBook</b>, KDE's adresboek applicatie. Twinkle haalt alle contacten met een telefoonnummer uit KAdressBook. Om uw contacten te beheren, moet u KAddressbook gebruiken.</p> <p>Als alternatief kunt u het lokale adresboek van Twinkle gebruiken.</p> + + Are you sure you want to delete contact '%1' from the local address book? + + + + Delete contact + + GetProfileNameForm @@ -4237,11 +4245,11 @@ en creëer de volgende statische UDP mapping in uw NAT. &Domain*: - &Domein*: + &Domein*: Or&ganization: - Or&ganisatie: + Or&ganisatie: The SIP user name given to you by your provider. It is the user part in your SIP address, <b>username</b>@domain.com This could be a telephone number. @@ -4309,7 +4317,7 @@ Dit is een verplicht veld. &Expiry: - &Interval: + &Interval: The registration expiry time that Twinkle will request. @@ -4721,7 +4729,7 @@ Stuur DTMF out-of-band in een SIP INFO verzoek. Max re&directions: - Max &doorverwijzingen: + Max &doorverwijzingen: The number of redirect addresses that Twinkle tries at a maximum before it gives up redirecting a request. This prevents a request from getting redirected forever. @@ -4733,7 +4741,7 @@ Stuur DTMF out-of-band in een SIP INFO verzoek. Call &Hold variant: - Wac&ht variant: + Wac&ht variant: RFC 2543 @@ -4990,7 +4998,7 @@ Als u deze optie kiest, dan moet u teven een adres vertaling in uw NAT router aa S&TUN server: - S&TUN server: + S&TUN server: The hostname, domain name or IP address of the STUN server. @@ -5084,7 +5092,7 @@ You are at work and all telephone numbers starting with a 0 should be prefixed w Match expression = 0[0-9]* , Replace = 9$&<br> </tt> </blockquote> - <p> + <p> Vaak is het formaat van een telefoonnummer dat u moet draaien anders dan het formaat van het nummer in uw adresboek, bijv. uw nummers starten met een +-teken gevolgd door een landencode, maar uw provider verwacht '00' in plaats van het +-teken, of u bent op kantoor en u moet eerst een '9' draaien om naar buiten te bellen. Hier kunt u nummerformaatconversie definieren m.b.v. reguliere expressies en vervang strings (Perl syntax). </p> <p> @@ -5390,7 +5398,7 @@ De waarden van alle SIP headers van de uitgaande SIP INVITE worden via variabele When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unecrypted. - Als u ZRTP/SRTP aanzet, dan zal Twinkle proberen om het audiokanaal van uw gesprekken te versleutelen. Versleuteling lukt alleen als uw gesprekspartner ook ZRTP/SRTP ondersteunt. Als uw gesprekspartner geen ZRTP/SRTP ondersteund, dan blijft het audiokanaal onversleuteld. + Als u ZRTP/SRTP aanzet, dan zal Twinkle proberen om het audiokanaal van uw gesprekken te versleutelen. Versleuteling lukt alleen als uw gesprekspartner ook ZRTP/SRTP ondersteunt. Als uw gesprekspartner geen ZRTP/SRTP ondersteund, dan blijft het audiokanaal onversleuteld. ZRTP settings @@ -5558,7 +5566,7 @@ Als u deze optie uitschakelt, dan neemt Twinkle de eerste codec uit de actieve c Indicates if the Replaces-extenstion is supported. - Geeft aan of de Replaces-extensie ondersteund wordt. + Geeft aan of de Replaces-extensie ondersteund wordt. Attended refer to AoR (Address of Record) @@ -5566,7 +5574,7 @@ Als u deze optie uitschakelt, dan neemt Twinkle de eerste codec uit de actieve c An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endoint. - Bij begeleid doorverbinden, is de contact URI de doorverbindbestemming. Een contact URI kan echter niet globaal routeerbaar zijn. Als alternatief kan dan de AoR (Address of Record) gebruikt worden. Een nadeel van het gebruik van de AoR is dat deze routeerbaar kan zijn naar meerdere eindpunten in het geval van SIP forking. De contact URI routeert altijd naar een uniek eindpunt. + Bij begeleid doorverbinden, is de contact URI de doorverbindbestemming. Een contact URI kan echter niet globaal routeerbaar zijn. Als alternatief kan dan de AoR (Address of Record) gebruikt worden. Een nadeel van het gebruik van de AoR is dat deze routeerbaar kan zijn naar meerdere eindpunten in het geval van SIP forking. De contact URI routeert altijd naar een uniek eindpunt. Privacy @@ -5700,11 +5708,11 @@ TWINKLE_TRIGGER=in_call. SIPREQUEST_METHOD=INVITE. <b>SIPREQUEST_URI</b Unsollicited - Unsollicited + Unsollicited Sollicited - Sollicited + Sollicited <H2>Message waiting indication type</H2> @@ -5719,7 +5727,7 @@ Asterisk provides unsollicited message waiting indication. <p> Sollicited message waiting indication as specified by RFC 3842. </p> - <H2>Message waiting indication type</H2> + <H2>Message waiting indication type</H2> <p> Als uw provider de dienst aanbiedt waarmee u uw voice mail status kunt zien, dan kan Twinkle laten zien hoeveel nieuwe voice mail berichten er op u wachten. Er zijn 2 methoden waarop deze dienst kan worden aangeboden. </p> @@ -5738,7 +5746,7 @@ Sollicited message waiting indication zoals gespecificeerd in RFC 3842. Sollicited MWI - Sollicited MWI + Sollicited MWI Subscription &duration: @@ -5754,7 +5762,7 @@ Sollicited message waiting indication zoals gespecificeerd in RFC 3842. For sollicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. - Twinkle meldt zich voor een bepaalde periode aan bij de voice mailbox server. Net voordat deze periode verstrijkt, zal Twinkle zich opnieuw aanmelden. + Twinkle meldt zich voor een bepaalde periode aan bij de voice mailbox server. Net voordat deze periode verstrijkt, zal Twinkle zich opnieuw aanmelden. Your user name for accessing your voice mailbox. @@ -5922,7 +5930,7 @@ Sollicited message waiting indication zoals gespecificeerd in RFC 3842. Use &STUN (does not work for incoming TCP) - &STUN (werkt niet voor inkomend TCP verkeer) + &STUN (werkt niet voor inkomend TCP verkeer) P&ersistent TCP connection @@ -6056,6 +6064,119 @@ Sollicited message waiting indication zoals gespecificeerd in RFC 3842. If you have enabled STUN or NAT keep alive, then Twinkle will send keep alive packets at this interval rate to keep the address bindings in your NAT device alive. Als u STUN of NAT keep alive aan heeft gezet, dan zal Twinkle keep alive pakketjes sturen met deze snelheid om de adresbindingen in uw NAT router in leven te houden. + + Do&main*: + + + + Organi&zation: + + + + E&xpiry: + + + + Call Hold &variant: + + + + &Max redirections: + + + + Indicates if the Replaces-extension is supported. + + + + An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endpoint. + + + + Include a P-Asserted-Identity header with your identity in an INVITE request for a call with identity hiding. + + + + &Send P-Asserted-Identity header when hiding user identity + + + + Use STUN (does not wor&k for incoming TCP) + + + + STUN ser&ver: + + + + <p> +Often the format of the telephone numbers you need to dial is different from the format of the telephone numbers stored in your address book, e.g. your numbers start with a +-symbol followed by a country code, but your provider expects '00' instead of the '+', or you are at the office and all your numbers need to be prefixed with a '9' to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings. +</p> +<p> +For each number you dial, Twinkle will try to find a match in the list of match expressions. For the first match it finds, the number will be replaced with the format string. If no match is found, the number stays unchanged. +</p> +<p> +The number conversion rules are also applied to incoming calls, so the numbers are displayed in the format you want. +</p> +<h3>Example 1</h3> +<p> +Assume your country code is 31 and you have stored all numbers in your address book in full international number format, e.g. +318712345678. For dialling numbers in your own country you want to strip of the '+31' and replace it by a '0'. For dialling numbers abroad you just want to replace the '+' by '00'. +</p> +<p> +The following rules will do the trick: +</p> +<blockquote> +<tt> +Match expression = \+31([0-9]*) , Replace = 0$1<br> +Match expression = \+([0-9]*) , Replace = 00$1</br> +</tt> +</blockquote> +<h3>Example 2</h3> +<p> +You are at work and all telephone numbers starting with a 0 should be prefixed with a 9 for an outside line. +</p> +<blockquote> +<tt> +Match expression = 0[0-9]* , Replace = 9$&<br> +</tt> +</blockquote> + + + + When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unencrypted. + + + + <H2>Message waiting indication type</H2> +<p> +If your provider offers the message waiting indication service, then Twinkle can show you when new voice mail messages are waiting. Ask your provider which type of message waiting indication is offered. +</p> +<H3>Unsolicited</H3> +<p> +Asterisk provides unsolicited message waiting indication. +</p> +<H3>Solicited</H3> +<p> +Solicited message waiting indication as specified by RFC 3842. +</p> + + + + Unsolicited + + + + Solicited + + + + Solicited MWI + + + + For solicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. + + WizardForm diff --git a/src/gui/lang/twinkle_ru.ts b/src/gui/lang/twinkle_ru.ts index 8b60aa9..2751999 100644 --- a/src/gui/lang/twinkle_ru.ts +++ b/src/gui/lang/twinkle_ru.ts @@ -1,4 +1,6 @@ - + + + AddressCardForm @@ -917,6 +919,14 @@ <p>You seem not to have any contacts with a phone number in <b>KAddressBook</b>, KDE's address book application. Twinkle retrieves all contacts with a phone number from KAddressBook. To manage your contacts you have to use KAddressBook.<p>As an alternative you may use Twinkle's local address book.</p> <p>У Вас нет ни одного контакта с телефонным номером в <b>KAddressBook</b>(приложении KDE адресная книга). Twinkle получает все контакты с телефонными номерами из Адресной книги KDE. Для управления вашими контактами вы должны использовать KAddressBook.<p>Как альтернативу вы можете использовать локальную адресную книгу Twinkle.</p> + + Are you sure you want to delete contact '%1' from the local address book? + + + + Delete contact + + GetProfileNameForm @@ -3891,11 +3901,11 @@ STUN не работает. &Domain*: - &Домен*: + &Домен*: Or&ganization: - Ор&ганизация: + Ор&ганизация: The SIP user name given to you by your provider. It is the user part in your SIP address, <b>username</b>@domain.com This could be a telephone number. @@ -3967,7 +3977,7 @@ This field is mandatory. &Expiry: - &Устаревание: + &Устаревание: The registration expiry time that Twinkle will request. @@ -4406,7 +4416,7 @@ Send DTMF out-of-band via a SIP INFO request. Call &Hold variant: - &Вариант удержания вызова: + &Вариант удержания вызова: RFC 2543 @@ -4553,7 +4563,7 @@ This format is what most SIP phones use. Max re&directions: - &Максимум перенаправлений: + &Максимум перенаправлений: The number of redirect addresses that Twinkle tries at a maximum before it gives up redirecting a request. This prevents a request from getting redirected forever. @@ -4607,7 +4617,7 @@ This format is what most SIP phones use. Indicates if the Replaces-extenstion is supported. - Указывает, поддерживается ли расширение Replaces. + Указывает, поддерживается ли расширение Replaces. REFER @@ -4675,7 +4685,7 @@ This format is what most SIP phones use. An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endoint. - Приходящая передача вызова должна использовать URI контакта в качестве адресата для связи нового соединения, перенаправленного на контрагента. Однако этот адрес не может быть глобально действительным. В качестве альтернативы можно использовать AoR (адрес записи). Недостатком является то, что с несколькими конечными устройствами AoR однозначен, тогда как URI контакта направляется на одно устройство. + Приходящая передача вызова должна использовать URI контакта в качестве адресата для связи нового соединения, перенаправленного на контрагента. Однако этот адрес не может быть глобально действительным. В качестве альтернативы можно использовать AoR (адрес записи). Недостатком является то, что с несколькими конечными устройствами AoR однозначен, тогда как URI контакта направляется на одно устройство. Privacy @@ -4745,7 +4755,7 @@ When you choose this option you have to create static address mappings in your N Use &STUN (does not work for incoming TCP) - Использовать &STUN (не работает для входящего TCP) + Использовать &STUN (не работает для входящего TCP) Choose this option when your SIP provider offers a STUN server for NAT traversal. @@ -4753,7 +4763,7 @@ When you choose this option you have to create static address mappings in your N S&TUN server: - S&TUN сервер: + S&TUN сервер: The hostname, domain name or IP address of the STUN server. @@ -4817,7 +4827,7 @@ When you choose this option you have to create static address mappings in your N <p> -Often the format of the telphone numbers you need to dial is different from the format of the telephone numbers stored in your address book, e.g. your numbers start with a +-symbol followed by a country code, but your provider expects '00' instead of the '+', or you are at the office and all your numbers need to be prefixed with a '9' to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings. +Often the format of the telphone numbers you need to dial is different from the format of the telephone numbers stored in your address book, e.g. your numbers start with a +-symbol followed by a country code, but your provider expects '00' instead of the '+', or you are at the office and all your numbers need to be prefixed with a '9' to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings. </p> <p> For each number you dial, Twinkle will try to find a match in the list of match expressions. For the first match it finds, the number will be replaced with the format string. If no match is found, the number stays unchanged. @@ -4827,7 +4837,7 @@ The number conversion rules are also applied to incoming calls, so the numbers a </p> <h3>Example 1</h3> <p> -Assume your country code is 31 and you have stored all numbers in your address book in full international number format, e.g. +318712345678. For dialling numbers in your own country you want to strip of the '+31' and replace it by a '0'. For dialling numbers abroad you just want to replace the '+' by '00'. +Assume your country code is 31 and you have stored all numbers in your address book in full international number format, e.g. +318712345678. For dialling numbers in your own country you want to strip of the '+31' and replace it by a '0'. For dialling numbers abroad you just want to replace the '+' by '00'. </p> <p> The following rules will do the trick: @@ -4847,7 +4857,7 @@ You are at work and all telephone numbers starting with a 0 should be prefixed w Match expression = 0[0-9]* , Replace = 9$&<br> </tt> </blockquote> - <p> + <p> Часто количество телефонных номеров, ожидаемых от провайдера VoIP, не совпадает с количеством, сохранённым в каталоге. К примеру, для номеров, начинающихся с «+» и национального кода страны, ваш провайдер ожидает «+» вместо «00». Или, если вы подключены к локальной сети SIP, вам необходимо предварительно указать номер доступа. Можно установить общепринятые правила для преобразования телефонных номеров с использованием шаблонов поиска и свопинга (с помощью регулярных выражений и языка Perl). </p> @@ -5291,7 +5301,7 @@ The values of all SIP headers of the outgoing INVITE are passed in environment v When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unecrypted. - Если включено, Twinkle пытается зашифровать аудиоданные во всех исходящих и входящих вызовах. Для того, чтобы вызов был зашифрован, контрагент должен также поддерживать шифрование ZRTP / SRTP. В противном случае вызов остаётся незашифрованным. + Если включено, Twinkle пытается зашифровать аудиоданные во всех исходящих и входящих вызовах. Для того, чтобы вызов был зашифрован, контрагент должен также поддерживать шифрование ZRTP / SRTP. В противном случае вызов остаётся незашифрованным. ZRTP settings @@ -5331,11 +5341,11 @@ The values of all SIP headers of the outgoing INVITE are passed in environment v Unsollicited - Незапрошен + Незапрошен Sollicited - Запрошен + Запрошен <H2>Message waiting indication type</H2> @@ -5350,7 +5360,7 @@ Asterisk provides unsollicited message waiting indication. <p> Sollicited message waiting indication as specified by RFC 3842. </p> - <H2>Тип отображения ожидающего сообщения</H2> + <H2>Тип отображения ожидающего сообщения</H2> <p> Если ваш SIP-провайдер предлагает оповещения о сохранённых сообщениях в вашей голосовой почте, Twinkle может рассказать вам о новых и уже услышанных сообщениях в вашей голосовой почте. Спросите своего провайдера, какой тип ожидающего сообщения используется </p> @@ -5369,7 +5379,7 @@ Asterisk поддерживает нежелательные ожидающие Sollicited MWI - Запрошенный MWI + Запрошенный MWI Subscription &duration: @@ -5385,7 +5395,7 @@ Asterisk поддерживает нежелательные ожидающие For sollicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. - Согласно спецификации MWI, конечное устройство сообщает серверу о получении сообщения в течение определённого периода времени, и до истечения этого времени регистрация должна возобновиться. + Согласно спецификации MWI, конечное устройство сообщает серверу о получении сообщения в течение определённого периода времени, и до истечения этого времени регистрация должна возобновиться. Your user name for accessing your voice mailbox. @@ -5683,6 +5693,119 @@ This could be the hostname or IP address of your PC if you want direct PC to PC If you have enabled STUN or NAT keep alive, then Twinkle will send keep alive packets at this interval rate to keep the address bindings in your NAT device alive. Если у вас включен STUN или NAT, то Twinkle отправит пакеты обслуживания на этот интервал, чтобы сохранить отображение на вашем NAT. + + Do&main*: + + + + Organi&zation: + + + + E&xpiry: + + + + Call Hold &variant: + + + + &Max redirections: + + + + Indicates if the Replaces-extension is supported. + + + + An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endpoint. + + + + Include a P-Asserted-Identity header with your identity in an INVITE request for a call with identity hiding. + + + + &Send P-Asserted-Identity header when hiding user identity + + + + Use STUN (does not wor&k for incoming TCP) + + + + STUN ser&ver: + + + + <p> +Often the format of the telephone numbers you need to dial is different from the format of the telephone numbers stored in your address book, e.g. your numbers start with a +-symbol followed by a country code, but your provider expects '00' instead of the '+', or you are at the office and all your numbers need to be prefixed with a '9' to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings. +</p> +<p> +For each number you dial, Twinkle will try to find a match in the list of match expressions. For the first match it finds, the number will be replaced with the format string. If no match is found, the number stays unchanged. +</p> +<p> +The number conversion rules are also applied to incoming calls, so the numbers are displayed in the format you want. +</p> +<h3>Example 1</h3> +<p> +Assume your country code is 31 and you have stored all numbers in your address book in full international number format, e.g. +318712345678. For dialling numbers in your own country you want to strip of the '+31' and replace it by a '0'. For dialling numbers abroad you just want to replace the '+' by '00'. +</p> +<p> +The following rules will do the trick: +</p> +<blockquote> +<tt> +Match expression = \+31([0-9]*) , Replace = 0$1<br> +Match expression = \+([0-9]*) , Replace = 00$1</br> +</tt> +</blockquote> +<h3>Example 2</h3> +<p> +You are at work and all telephone numbers starting with a 0 should be prefixed with a 9 for an outside line. +</p> +<blockquote> +<tt> +Match expression = 0[0-9]* , Replace = 9$&<br> +</tt> +</blockquote> + + + + When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unencrypted. + + + + <H2>Message waiting indication type</H2> +<p> +If your provider offers the message waiting indication service, then Twinkle can show you when new voice mail messages are waiting. Ask your provider which type of message waiting indication is offered. +</p> +<H3>Unsolicited</H3> +<p> +Asterisk provides unsolicited message waiting indication. +</p> +<H3>Solicited</H3> +<p> +Solicited message waiting indication as specified by RFC 3842. +</p> + + + + Unsolicited + + + + Solicited + + + + Solicited MWI + + + + For solicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. + + WizardForm diff --git a/src/gui/lang/twinkle_sk.ts b/src/gui/lang/twinkle_sk.ts index 247de18..3bcbd69 100644 --- a/src/gui/lang/twinkle_sk.ts +++ b/src/gui/lang/twinkle_sk.ts @@ -939,6 +939,14 @@ Zdá sa, že <p><b>KAddressBook</b> neobsahuje žiadne záznamy s telefónnymi číslami, ktoré by Twinkle mohol načítať. Twinkle načítava z KAddressBook všetky kontakty s telefónnym číslom. Použite prosím tento program pre úpravu alebo pridanie vašich kontaktov.</p> <p>Druhou možnosťou je použiť miestny adresár v Twinkle.</p> + + Are you sure you want to delete contact '%1' from the local address book? + + + + Delete contact + + GetProfileNameForm @@ -3891,11 +3899,11 @@ a na vašom NATe namapujte statické (UDP) porty. &Domain*: - &Doména*: + &Doména*: Or&ganization: - Or&ganizácia: + Or&ganizácia: The SIP user name given to you by your provider. It is the user part in your SIP address, <b>username</b>@domain.com This could be a telephone number. @@ -3967,7 +3975,7 @@ Toto pole je povinné. &Expiry: - &Platnosť: + &Platnosť: The registration expiry time that Twinkle will request. @@ -4364,7 +4372,7 @@ Vysielať DTMF out-of-band prostredníctvom požiadavky SIP INFO.</p> Max re&directions: - Max. počet &presmerovaní: + Max. počet &presmerovaní: The number of redirect addresses that Twinkle tries at a maximum before it gives up redirecting a request. This prevents a request from getting redirected forever. @@ -4376,7 +4384,7 @@ Vysielať DTMF out-of-band prostredníctvom požiadavky SIP INFO.</p> Call &Hold variant: - Spôsob pridržania &hovoru: + Spôsob pridržania &hovoru: RFC 2543 @@ -4625,7 +4633,7 @@ Ak si vyberiete túto voľbu, musíte tiež na vašom zariadení NAT nasmerovať S&TUN server: - Adresa S&TUN servera: + Adresa S&TUN servera: The hostname, domain name or IP address of the STUN server. @@ -4719,7 +4727,7 @@ You are at work and all telephone numbers starting with a 0 should be prefixed w Match expression = 0[0-9]* , Replace = 9$&<br> </tt> </blockquote> - <p> + <p> Často sa formát telefónnych čísiel, ktoré očakáva poskytovateľ VoIP nezhoduje s formátom čísiel uložených v adresári. Napr. pri číslach začínajúcich na "+" a národným kódom krajiny očakáva váš poskytovateľ miesto "00" znak "+". Alebo ste pripojený na miestnu sieť SIP a je potrebné najprv zadať predvoľbu pre volania smerom von. Tu je možné pomocou vyhľadávacích a nahradzovaných vzorov (podľa štýlu regulárnych výrazov so syntaxom jazyku Perl) nastaviť všeobecne platné pravidlá pre konverziu telefónnych čísiel. </p> @@ -5038,7 +5046,7 @@ Obsahy všetkých SIP hlavičiek odosielaných SIP INVITE požiadaviek budú odo When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unecrypted. - Ak je aktivované, Twinkle sa pokúsi pri všetkých odchádzajúcich a prichádzajúcich hovoroch šifrovať zvukové dáta. Aby bol hovor naozaj zašifrovaný musí aj protistrana podporovať šifrovanie ZRTP/SRTP. Inak ostane hovor nešifrovaný. + Ak je aktivované, Twinkle sa pokúsi pri všetkých odchádzajúcich a prichádzajúcich hovoroch šifrovať zvukové dáta. Aby bol hovor naozaj zašifrovaný musí aj protistrana podporovať šifrovanie ZRTP/SRTP. Inak ostane hovor nešifrovaný. ZRTP settings @@ -5206,7 +5214,7 @@ Ak je voľba vypnutá, použije Twinkle prvý kodek vo vlastnom zozname, ktorý Indicates if the Replaces-extenstion is supported. - Indikuje, či je podporované rozšírenie Replaces. + Indikuje, či je podporované rozšírenie Replaces. Attended refer to AoR (Address of Record) @@ -5214,7 +5222,7 @@ Ak je voľba vypnutá, použije Twinkle prvý kodek vo vlastnom zozname, ktorý An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endoint. - Asistované prepojenie by malo používať Contact URI ako cieľovú adresu pre informovanie presmerovávanej strany o novom spojení. Táto adresa nemusí byť však globálne platiť. Ako alternatívu je možné použiť AoR (Address of Record). Nevýhodou je, že pri viacerých koncových zariadeniach nie je AoR jednoznačné, zatiaľčo URI kontaktu vždy ukazuje na jediné zariadenie. + Asistované prepojenie by malo používať Contact URI ako cieľovú adresu pre informovanie presmerovávanej strany o novom spojení. Táto adresa nemusí byť však globálne platiť. Ako alternatívu je možné použiť AoR (Address of Record). Nevýhodou je, že pri viacerých koncových zariadeniach nie je AoR jednoznačné, zatiaľčo URI kontaktu vždy ukazuje na jediné zariadenie. Privacy @@ -5328,11 +5336,11 @@ TWINKLE_USER_PROFILE obsahuje meno používateľského profilu, pre ktorý je pr Unsollicited - Nevyžiadané + Nevyžiadané Sollicited - Vyžiadané + Vyžiadané <H2>Message waiting indication type</H2> @@ -5347,7 +5355,7 @@ Asterisk provides unsollicited message waiting indication. <p> Sollicited message waiting indication as specified by RFC 3842. </p> - <H2>Typ indikácie čakajúcich správ</H2> + <H2>Typ indikácie čakajúcich správ</H2> <p> Ak váš poskytovateľ SIP ponúka upozornenie na uložené správy v hlasovej schránke, môže vás Twinkle informovať o nových aj už vypočutých správach vo vašej hlasovej schránke. Spýtajte sa vášho poskytovateľa, aký typ indikácie čakajúcich správ je používaný @@ -5367,7 +5375,7 @@ Vyžiadaná indikácia čakajúcich správ podľa RFC 3842. Sollicited MWI - Vyžiadané MWI + Vyžiadané MWI Subscription &duration: @@ -5383,7 +5391,7 @@ Vyžiadaná indikácia čakajúcich správ podľa RFC 3842. For sollicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. - Podľa špecifikácie MWI sa koncové zariadenie prihlási na serveri k príjmu správ na určitú dobu. Pred vypršaním tejto doby by sa prihlásenie malo znovu obnoviť. + Podľa špecifikácie MWI sa koncové zariadenie prihlási na serveri k príjmu správ na určitú dobu. Pred vypršaním tejto doby by sa prihlásenie malo znovu obnoviť. Your user name for accessing your voice mailbox. @@ -5531,7 +5539,7 @@ Vyžiadaná indikácia čakajúcich správ podľa RFC 3842. Use &STUN (does not work for incoming TCP) - Použiť &STUN (nefunguje pre prichádzajúce TCP) + Použiť &STUN (nefunguje pre prichádzajúce TCP) P&ersistent TCP connection @@ -5665,6 +5673,119 @@ Vyžiadaná indikácia čakajúcich správ podľa RFC 3842. If you have enabled STUN or NAT keep alive, then Twinkle will send keep alive packets at this interval rate to keep the address bindings in your NAT device alive. Ak máte povolený STUN alebo NAT keep alive, bude Twinkle zasielať udržovacie pakety v tomto intervale tak, aby boli udržané mapovania na vašom NATe. + + Do&main*: + + + + Organi&zation: + + + + E&xpiry: + + + + Call Hold &variant: + + + + &Max redirections: + + + + Indicates if the Replaces-extension is supported. + + + + An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endpoint. + + + + Include a P-Asserted-Identity header with your identity in an INVITE request for a call with identity hiding. + + + + &Send P-Asserted-Identity header when hiding user identity + + + + Use STUN (does not wor&k for incoming TCP) + + + + STUN ser&ver: + + + + <p> +Often the format of the telephone numbers you need to dial is different from the format of the telephone numbers stored in your address book, e.g. your numbers start with a +-symbol followed by a country code, but your provider expects '00' instead of the '+', or you are at the office and all your numbers need to be prefixed with a '9' to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings. +</p> +<p> +For each number you dial, Twinkle will try to find a match in the list of match expressions. For the first match it finds, the number will be replaced with the format string. If no match is found, the number stays unchanged. +</p> +<p> +The number conversion rules are also applied to incoming calls, so the numbers are displayed in the format you want. +</p> +<h3>Example 1</h3> +<p> +Assume your country code is 31 and you have stored all numbers in your address book in full international number format, e.g. +318712345678. For dialling numbers in your own country you want to strip of the '+31' and replace it by a '0'. For dialling numbers abroad you just want to replace the '+' by '00'. +</p> +<p> +The following rules will do the trick: +</p> +<blockquote> +<tt> +Match expression = \+31([0-9]*) , Replace = 0$1<br> +Match expression = \+([0-9]*) , Replace = 00$1</br> +</tt> +</blockquote> +<h3>Example 2</h3> +<p> +You are at work and all telephone numbers starting with a 0 should be prefixed with a 9 for an outside line. +</p> +<blockquote> +<tt> +Match expression = 0[0-9]* , Replace = 9$&<br> +</tt> +</blockquote> + + + + When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unencrypted. + + + + <H2>Message waiting indication type</H2> +<p> +If your provider offers the message waiting indication service, then Twinkle can show you when new voice mail messages are waiting. Ask your provider which type of message waiting indication is offered. +</p> +<H3>Unsolicited</H3> +<p> +Asterisk provides unsolicited message waiting indication. +</p> +<H3>Solicited</H3> +<p> +Solicited message waiting indication as specified by RFC 3842. +</p> + + + + Unsolicited + + + + Solicited + + + + Solicited MWI + + + + For solicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. + + WizardForm @@ -5724,7 +5845,7 @@ Tento údaj je povinný. SIP pre&xy: - SIP pro&xy: + SIP pro&xy: The hostname, domain name or IP address of your SIP proxy. If this is the same value as your domain, you may leave this field empty. @@ -5792,6 +5913,10 @@ V prípade priameho volania medzi IP adresami se môže jednať o meno hostiteľ Invalid value for STUN server. Neplatná hodnota pre STUN server. + + SIP pro&xy: + + YesNoDialog diff --git a/src/gui/lang/twinkle_sv.ts b/src/gui/lang/twinkle_sv.ts index d8b0df6..9d7fd83 100644 --- a/src/gui/lang/twinkle_sv.ts +++ b/src/gui/lang/twinkle_sv.ts @@ -1,6 +1,6 @@ - + AddressCardForm @@ -962,6 +962,14 @@ <p>You seem not to have any contacts with a phone number in <b>KAddressBook</b>, KDE's address book application. Twinkle retrieves all contacts with a phone number from KAddressBook. To manage your contacts you have to use KAddressBook.<p>As an alternative you may use Twinkle's local address book.</p> + + Are you sure you want to delete contact '%1' from the local address book? + + + + Delete contact + + GetProfileNameForm @@ -4080,11 +4088,11 @@ och skapa följande statiska bindningar (UDP) i din NAT. &Domain*: - &Domän*: + &Domän*: Or&ganization: - Or&ganisation: + Or&ganisation: The SIP user name given to you by your provider. It is the user part in your SIP address, <b>username</b>@domain.com This could be a telephone number. @@ -4154,10 +4162,6 @@ Detta fält är obligatoriskt. The hostname, domain name or IP address of your registrar. If you use an outbound proxy that is the same as your registrar, then you may leave this field empty and only fill in the address of the outbound proxy. - - &Expiry: - - The registration expiry time that Twinkle will request. @@ -4582,10 +4586,6 @@ Send DTMF out-of-band via a SIP INFO request. Protocol options Protokollalternativ - - Call &Hold variant: - - RFC 2543 RFC 2543 @@ -4712,10 +4712,6 @@ This format is what most SIP phones use. Indicates if Twinkle should ask the user before redirecting a request when a 3XX response is received. - - Max re&directions: - - The number of redirect addresses that Twinkle tries at a maximum before it gives up redirecting a request. This prevents a request from getting redirected forever. @@ -4759,10 +4755,6 @@ This format is what most SIP phones use. Replaces Ersätter - - Indicates if the Replaces-extenstion is supported. - - REFER REFER @@ -4827,10 +4819,6 @@ This format is what most SIP phones use. Attended refer to AoR (Address of Record) - - An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endoint. - - Privacy Integritet @@ -4874,7 +4862,7 @@ When you choose this option you have to create static address mappings in your N S&TUN server: - S&TUN-server: + S&TUN-server: The hostname, domain name or IP address of the STUN server. @@ -4936,40 +4924,6 @@ When you choose this option you have to create static address mappings in your N Replace Ersätt - - <p> -Often the format of the telphone numbers you need to dial is different from the format of the telephone numbers stored in your address book, e.g. your numbers start with a +-symbol followed by a country code, but your provider expects '00' instead of the '+', or you are at the office and all your numbers need to be prefixed with a '9' to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings. -</p> -<p> -For each number you dial, Twinkle will try to find a match in the list of match expressions. For the first match it finds, the number will be replaced with the format string. If no match is found, the number stays unchanged. -</p> -<p> -The number conversion rules are also applied to incoming calls, so the numbers are displayed in the format you want. -</p> -<h3>Example 1</h3> -<p> -Assume your country code is 31 and you have stored all numbers in your address book in full international number format, e.g. +318712345678. For dialling numbers in your own country you want to strip of the '+31' and replace it by a '0'. For dialling numbers abroad you just want to replace the '+' by '00'. -</p> -<p> -The following rules will do the trick: -</p> -<blockquote> -<tt> -Match expression = \+31([0-9]*) , Replace = 0$1<br> -Match expression = \+([0-9]*) , Replace = 00$1</br> -</tt> -</blockquote> -<h3>Example 2</h3> -<p> -You are at work and all telephone numbers starting with a 0 should be prefixed with a 9 for an outside line. -</p> -<blockquote> -<tt> -Match expression = 0[0-9]* , Replace = 9$&<br> -</tt> -</blockquote> - - Move the selected number conversion rule upwards in the list. @@ -5231,10 +5185,6 @@ The values of all SIP headers of the outgoing INVITE are passed in environment v &Enable ZRTP/SRTP encryption &Aktivera ZRTP/SRTP-kryptering - - When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unecrypted. - - ZRTP settings Inställningar för ZRTP @@ -5271,37 +5221,10 @@ The values of all SIP headers of the outgoing INVITE are passed in environment v The SIP address or telephone number to access your voice mail. - - Unsollicited - - - - Sollicited - - - - <H2>Message waiting indication type</H2> -<p> -If your provider offers the message waiting indication service, then Twinkle can show you when new voice mail messages are waiting. Ask your provider which type of message waiting indication is offered. -</p> -<H3>Unsollicited</H3> -<p> -Asterisk provides unsollicited message waiting indication. -</p> -<H3>Sollicited</H3> -<p> -Sollicited message waiting indication as specified by RFC 3842. -</p> - - &MWI type: - - Sollicited MWI - - Subscription &duration: @@ -5314,10 +5237,6 @@ Sollicited message waiting indication as specified by RFC 3842. The hostname, domain name or IP address of your voice mailbox server. - - For sollicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. - - Your user name for accessing your voice mailbox. @@ -5510,10 +5429,6 @@ Detta kan vara värdnamnet eller IP-adressen för din dator, om du vill ha direk Messages larger than the threshold are sent via TCP. Smaller messages are sent via UDP. - - Use &STUN (does not work for incoming TCP) - - P&ersistent TCP connection @@ -5690,6 +5605,119 @@ Detta kan vara värdnamnet eller IP-adressen för din dator, om du vill ha direk If you have enabled STUN or NAT keep alive, then Twinkle will send keep alive packets at this interval rate to keep the address bindings in your NAT device alive. + + Do&main*: + + + + Organi&zation: + + + + E&xpiry: + + + + Call Hold &variant: + + + + &Max redirections: + + + + Indicates if the Replaces-extension is supported. + + + + An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endpoint. + + + + Include a P-Asserted-Identity header with your identity in an INVITE request for a call with identity hiding. + + + + &Send P-Asserted-Identity header when hiding user identity + + + + Use STUN (does not wor&k for incoming TCP) + + + + STUN ser&ver: + + + + <p> +Often the format of the telephone numbers you need to dial is different from the format of the telephone numbers stored in your address book, e.g. your numbers start with a +-symbol followed by a country code, but your provider expects '00' instead of the '+', or you are at the office and all your numbers need to be prefixed with a '9' to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings. +</p> +<p> +For each number you dial, Twinkle will try to find a match in the list of match expressions. For the first match it finds, the number will be replaced with the format string. If no match is found, the number stays unchanged. +</p> +<p> +The number conversion rules are also applied to incoming calls, so the numbers are displayed in the format you want. +</p> +<h3>Example 1</h3> +<p> +Assume your country code is 31 and you have stored all numbers in your address book in full international number format, e.g. +318712345678. For dialling numbers in your own country you want to strip of the '+31' and replace it by a '0'. For dialling numbers abroad you just want to replace the '+' by '00'. +</p> +<p> +The following rules will do the trick: +</p> +<blockquote> +<tt> +Match expression = \+31([0-9]*) , Replace = 0$1<br> +Match expression = \+([0-9]*) , Replace = 00$1</br> +</tt> +</blockquote> +<h3>Example 2</h3> +<p> +You are at work and all telephone numbers starting with a 0 should be prefixed with a 9 for an outside line. +</p> +<blockquote> +<tt> +Match expression = 0[0-9]* , Replace = 9$&<br> +</tt> +</blockquote> + + + + When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unencrypted. + + + + <H2>Message waiting indication type</H2> +<p> +If your provider offers the message waiting indication service, then Twinkle can show you when new voice mail messages are waiting. Ask your provider which type of message waiting indication is offered. +</p> +<H3>Unsolicited</H3> +<p> +Asterisk provides unsolicited message waiting indication. +</p> +<H3>Solicited</H3> +<p> +Solicited message waiting indication as specified by RFC 3842. +</p> + + + + Unsolicited + + + + Solicited + + + + Solicited MWI + + + + For solicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. + + WizardForm diff --git a/src/gui/lang/twinkle_xx.ts b/src/gui/lang/twinkle_xx.ts index 067913e..1b92c88 100644 --- a/src/gui/lang/twinkle_xx.ts +++ b/src/gui/lang/twinkle_xx.ts @@ -1,6 +1,6 @@ - + AddressCardForm @@ -919,6 +919,14 @@ <p>You seem not to have any contacts with a phone number in <b>KAddressBook</b>, KDE's address book application. Twinkle retrieves all contacts with a phone number from KAddressBook. To manage your contacts you have to use KAddressBook.<p>As an alternative you may use Twinkle's local address book.</p> + + Are you sure you want to delete contact '%1' from the local address book? + + + + Delete contact + + GetProfileNameForm @@ -3854,14 +3862,6 @@ and create the following static bindings (UDP) in your NAT. &User name*: - - &Domain*: - - - - Or&ganization: - - The SIP user name given to you by your provider. It is the user part in your SIP address, <b>username</b>@domain.com This could be a telephone number. <br><br> @@ -3926,10 +3926,6 @@ This field is mandatory. The hostname, domain name or IP address of your registrar. If you use an outbound proxy that is the same as your registrar, then you may leave this field empty and only fill in the address of the outbound proxy. - - &Expiry: - - The registration expiry time that Twinkle will request. @@ -4350,10 +4346,6 @@ Send DTMF out-of-band via a SIP INFO request. Protocol options - - Call &Hold variant: - - RFC 2543 @@ -4480,10 +4472,6 @@ This format is what most SIP phones use. Indicates if Twinkle should ask the user before redirecting a request when a 3XX response is received. - - Max re&directions: - - The number of redirect addresses that Twinkle tries at a maximum before it gives up redirecting a request. This prevents a request from getting redirected forever. @@ -4527,10 +4515,6 @@ This format is what most SIP phones use. Replaces - - Indicates if the Replaces-extenstion is supported. - - REFER @@ -4595,10 +4579,6 @@ This format is what most SIP phones use. Attended refer to AoR (Address of Record) - - An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endoint. - - Privacy @@ -4664,18 +4644,10 @@ This format is what most SIP phones use. When you choose this option you have to create static address mappings in your NAT device as well. You have to map the RTP ports on the public IP address to the same ports on the private IP address of your PC. - - Use &STUN (does not work for incoming TCP) - - Choose this option when your SIP provider offers a STUN server for NAT traversal. - - S&TUN server: - - The hostname, domain name or IP address of the STUN server. @@ -4736,40 +4708,6 @@ When you choose this option you have to create static address mappings in your N Replace - - <p> -Often the format of the telphone numbers you need to dial is different from the format of the telephone numbers stored in your address book, e.g. your numbers start with a +-symbol followed by a country code, but your provider expects '00' instead of the '+', or you are at the office and all your numbers need to be prefixed with a '9' to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings. -</p> -<p> -For each number you dial, Twinkle will try to find a match in the list of match expressions. For the first match it finds, the number will be replaced with the format string. If no match is found, the number stays unchanged. -</p> -<p> -The number conversion rules are also applied to incoming calls, so the numbers are displayed in the format you want. -</p> -<h3>Example 1</h3> -<p> -Assume your country code is 31 and you have stored all numbers in your address book in full international number format, e.g. +318712345678. For dialling numbers in your own country you want to strip of the '+31' and replace it by a '0'. For dialling numbers abroad you just want to replace the '+' by '00'. -</p> -<p> -The following rules will do the trick: -</p> -<blockquote> -<tt> -Match expression = \+31([0-9]*) , Replace = 0$1<br> -Match expression = \+([0-9]*) , Replace = 00$1</br> -</tt> -</blockquote> -<h3>Example 2</h3> -<p> -You are at work and all telephone numbers starting with a 0 should be prefixed with a 9 for an outside line. -</p> -<blockquote> -<tt> -Match expression = 0[0-9]* , Replace = 9$&<br> -</tt> -</blockquote> - - Move the selected number conversion rule upwards in the list. @@ -5039,10 +4977,6 @@ The values of all SIP headers of the outgoing INVITE are passed in environment v &Enable ZRTP/SRTP encryption - - When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unecrypted. - - ZRTP settings @@ -5079,37 +5013,10 @@ The values of all SIP headers of the outgoing INVITE are passed in environment v The SIP address or telephone number to access your voice mail. - - Unsollicited - - - - Sollicited - - - - <H2>Message waiting indication type</H2> -<p> -If your provider offers the message waiting indication service, then Twinkle can show you when new voice mail messages are waiting. Ask your provider which type of message waiting indication is offered. -</p> -<H3>Unsollicited</H3> -<p> -Asterisk provides unsollicited message waiting indication. -</p> -<H3>Sollicited</H3> -<p> -Sollicited message waiting indication as specified by RFC 3842. -</p> - - &MWI type: - - Sollicited MWI - - Subscription &duration: @@ -5122,10 +5029,6 @@ Sollicited message waiting indication as specified by RFC 3842. The hostname, domain name or IP address of your voice mailbox server. - - For sollicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. - - Your user name for accessing your voice mailbox. @@ -5421,6 +5324,119 @@ This could be the hostname or IP address of your PC if you want direct PC to PC If you have enabled STUN or NAT keep alive, then Twinkle will send keep alive packets at this interval rate to keep the address bindings in your NAT device alive. + + Do&main*: + + + + Organi&zation: + + + + E&xpiry: + + + + Call Hold &variant: + + + + &Max redirections: + + + + Indicates if the Replaces-extension is supported. + + + + An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endpoint. + + + + Include a P-Asserted-Identity header with your identity in an INVITE request for a call with identity hiding. + + + + &Send P-Asserted-Identity header when hiding user identity + + + + Use STUN (does not wor&k for incoming TCP) + + + + STUN ser&ver: + + + + <p> +Often the format of the telephone numbers you need to dial is different from the format of the telephone numbers stored in your address book, e.g. your numbers start with a +-symbol followed by a country code, but your provider expects '00' instead of the '+', or you are at the office and all your numbers need to be prefixed with a '9' to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings. +</p> +<p> +For each number you dial, Twinkle will try to find a match in the list of match expressions. For the first match it finds, the number will be replaced with the format string. If no match is found, the number stays unchanged. +</p> +<p> +The number conversion rules are also applied to incoming calls, so the numbers are displayed in the format you want. +</p> +<h3>Example 1</h3> +<p> +Assume your country code is 31 and you have stored all numbers in your address book in full international number format, e.g. +318712345678. For dialling numbers in your own country you want to strip of the '+31' and replace it by a '0'. For dialling numbers abroad you just want to replace the '+' by '00'. +</p> +<p> +The following rules will do the trick: +</p> +<blockquote> +<tt> +Match expression = \+31([0-9]*) , Replace = 0$1<br> +Match expression = \+([0-9]*) , Replace = 00$1</br> +</tt> +</blockquote> +<h3>Example 2</h3> +<p> +You are at work and all telephone numbers starting with a 0 should be prefixed with a 9 for an outside line. +</p> +<blockquote> +<tt> +Match expression = 0[0-9]* , Replace = 9$&<br> +</tt> +</blockquote> + + + + When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unencrypted. + + + + <H2>Message waiting indication type</H2> +<p> +If your provider offers the message waiting indication service, then Twinkle can show you when new voice mail messages are waiting. Ask your provider which type of message waiting indication is offered. +</p> +<H3>Unsolicited</H3> +<p> +Asterisk provides unsolicited message waiting indication. +</p> +<H3>Solicited</H3> +<p> +Solicited message waiting indication as specified by RFC 3842. +</p> + + + + Unsolicited + + + + Solicited + + + + Solicited MWI + + + + For solicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. + + WizardForm -- cgit v1.2.3 From 7a201383a6d9efc8a43e7954839b7cfbbd2aefd2 Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Sat, 22 Feb 2020 17:29:39 +0100 Subject: Update and fix Czech and Slovak translations --- src/gui/lang/twinkle_cs.ts | 88 +++++++++++++++++++++++++++++++++----------- src/gui/lang/twinkle_sk.ts | 91 ++++++++++++++++++++++++++++++++++------------ 2 files changed, 134 insertions(+), 45 deletions(-) diff --git a/src/gui/lang/twinkle_cs.ts b/src/gui/lang/twinkle_cs.ts index 9be2844..5cdfd22 100644 --- a/src/gui/lang/twinkle_cs.ts +++ b/src/gui/lang/twinkle_cs.ts @@ -957,11 +957,11 @@ Are you sure you want to delete contact '%1' from the local address book? - + Smazat kontakt '%1' z místního adresáře? Delete contact - + Smazat kontakt @@ -4173,7 +4173,7 @@ a na vašem NATu namapovat (UDP) porty. The SIP user name given to you by your provider. It is the user part in your SIP address, <b>username</b>@domain.com This could be a telephone number. <br><br> This field is mandatory. - Uživatelské jméno, které vám bylo přiděleno vaším poskytovatelem,.je první částí vaší úplné SIP adresy <b>uzivatel</b>@domain.com + Uživatelské jméno, které vám bylo přiděleno vaším poskytovatelem, je první částí vaší úplné SIP adresy <b>uzivatel</b>@domain.com. Může se jednat o telefonní číslo. <br><br> Toto pole je povinné. @@ -5794,7 +5794,7 @@ Vyžádaná indikace čekajících zpráv dle RFC 3842. The q-value is a value between 0.000 and 1.000. A higher value means a higher priority. - Hodnota 'q' je mezi 0.000 and 1.000 Vyšší hodnota znamená vyšší prioritu. + Hodnota 'q' je mezi 0.000 and 1.000. Vyšší hodnota znamená vyšší prioritu. SIP transport @@ -5962,47 +5962,47 @@ Vyžádaná indikace čekajících zpráv dle RFC 3842. Do&main*: - + &Doména*: Organi&zation: - + Or&ganizace: E&xpiry: - + &Platnost: Call Hold &variant: - + Způsob přidržení &hovoru: &Max redirections: - + Max. počet &přesměrování: Indicates if the Replaces-extension is supported. - + Indikuje, zda je rozšíření Replaces podporováno. An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endpoint. - + Asistované přepojení by mělo používat Contact-URI jako cílovou adresu pro sdělení nového spojení přesměrovávané protistraně. Tato adresa nemusí být ovšem globálně platná. Alternativně se může použít AoR (Address of Record). Nevýhodou je, že při více koncových zařízeních není AoR jednoznačné, zatímco URI kontaktu směřuje na jediné zařízení. Include a P-Asserted-Identity header with your identity in an INVITE request for a call with identity hiding. - + Pokud je vybráno a je aktivována volba "skrýt odesilatele", bude spolu s údajem odesilatele odeslána při požadavku INVITE hlavička P-Preferred-Identity. &Send P-Asserted-Identity header when hiding user identity - + &Posílat hlavičku P-Preferred-Identity při skrývání identity uživatele Use STUN (does not wor&k for incoming TCP) - + Použít &STUN (nefunguje pro příchozí TCP) STUN ser&ver: - + Adresa S&TUN serveru: <p> @@ -6036,11 +6036,44 @@ You are at work and all telephone numbers starting with a 0 should be prefixed w Match expression = 0[0-9]* , Replace = 9$&<br> </tt> </blockquote> - + <p> +Často není formát telefonních čísel, které jsou očekávány od VoIP poskytovatele, shodný s formátem čísel uložených v adresáři. Např. u čísel začínajících na "+" a národním kódem země očekává váš poskytovatel namísto "00" znak "+". Nebo jste-li napojeni na místní SIP síť a je nutné předtočit nejdříve číslo k přístupu ven. +Zde je možné za použití vyhledávacích a zaměňovacích vzorů (podle způsobu regulárních výrazů a la Perl) nastavit obecně platné pravidla pro konverzi telefonních čísel. +</p> +<p> +Při každém vytáčení se Twinkle pokusí najít pro čísla z uživatelské části SIP adresy odpovídají výraz v seznamu hledaných vzorů. S prvním nalezeným vyhovujícím výrazem je provedena úprava originálního čísla, přičemž pozice v "(" ")" v hledaném výrazu (např. "([0-9]*)" pro "jakkoliv mnoho čísel") je nahrazena znaky v odpovídajících proměnných. Např. "$1" pro první pozici. Viz též `man 7 regex` nebo konqueror:"#regex". Pokud není nalezen žádný odpovídající hledaný vzor, zůstane číslo nezměněno. +</p> +<p> +Pravidla budou rovněž použita na čísla v příchozích voláních. Podle nastavených pravidel budou tato přetransformována do žádaného formátu. +</p> +<h3>1. příklad</h3> +<p> +Např. váš národní kód je "420" pro českou republiku a ve vašem adresáři máte také mnoho vnitrostátních čísel uložených v mezinárodním formátu. Např.. +420 577 2345678. Avšak VoIP poskytovatel očekává pro vnitrostátní hovor 0577 2345678. Chcete tedy nahradit '+420' za '0' a zároveň pro zahraniční hovory nahradit '+' za '00'. +</p> +<p> +K tomu jsou potřebné následující pravidla uvedená v tomto pořadí: +</p> +<blockquote> +<tt> +Hledaný výraz = \+420([0-9]*) , Náhrada = 0$1<br> +Hledaný výraz = \+([0-9]*) , Náhrada = 00$1</br> +</tt> +</blockquote> +<h3>2. příklad</h3> +<p> +Nacházíte se na telefonní ústředně a všem číslům s 0 jako první číslicí, má být předřazeno číslo 9. +</p> +<blockquote> +<tt> +Hledaný výraz = 0[0-9]* , Náhrada = 9$&<br> +</tt> +</blockquote> +( $& je speciální proměnná, do které je uloženo celé originální číslo)<br> +Poznámka: Toto pravidlo nelze nastavit jednoduše jako třetí pravidlo ke dvou pravidlům z předcházejícího příkladu. Bude totiž použito vždy jen to první, které vyhledávání vyhoví. Namísto toho by muselo být změněno nahrazování v pravidlech 1 a 2 - "57$1" a "577$1" When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unencrypted. - + Pokud je aktivováno, pokusí se Twinkle při všech odchozích a příchozích hovorech zašifrovat zvuková data. Aby byl hovor opravdu zašifrován musí i protistrana podporovat šifrování ZRTP/SRTP. Jinak zůstane hovor nešifrovaný. <H2>Message waiting indication type</H2> @@ -6055,23 +6088,34 @@ Asterisk provides unsolicited message waiting indication. <p> Solicited message waiting indication as specified by RFC 3842. </p> - + <H2>Typ indikace čekajících zpráv</H2> +<p> +Pokud váš SIP poskytovatel nabízí upozornění na uložené zprávy v hlasové schránce, může vás Twinkle informovat o nových i již vyslechnutých zprávách ve vaší hlasové schránce. Zeptejte se vašeho poskytovatele, jaký typ indikace čekajících zpráv je používán +</p> +<H3>Nevyžádané</H3> +<p> +Asterisk podporuje nevyžádané indikování čekajících zpráv. +</p> +<H3>Vyžádané</H3> +<p> +Vyžádaná indikace čekajících zpráv dle RFC 3842. +</p> Unsolicited - + Nevyžádané Solicited - + Vyžádané Solicited MWI - + Vyžádané MWI For solicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. - + Dle specifikace MWI se koncové zařízení hlásí na serveru k příjmu zpráv na určitou dobu a před vypršením této doby by se přihlášení mělo znovu obnovit. diff --git a/src/gui/lang/twinkle_sk.ts b/src/gui/lang/twinkle_sk.ts index 3bcbd69..5197faa 100644 --- a/src/gui/lang/twinkle_sk.ts +++ b/src/gui/lang/twinkle_sk.ts @@ -133,7 +133,7 @@ &User name: - Použí&vateľské meno: + Meno &používateľa: &OK @@ -941,11 +941,11 @@ Are you sure you want to delete contact '%1' from the local address book? - + Naozaj odstrániť kontakt '%1' z miestneho adresára? Delete contact - + Odstrániť kontakt @@ -2466,7 +2466,7 @@ With this option you request your SIP provider to hide your identity from the ca Select user profile(s) to run: - Vyberte používateľské profily, ktoré majú byť aktivované: + Vyberte profily používateľov, ktoré majú byť aktivované: Tick the check boxes of the user profiles that you want to run and press run. @@ -5675,47 +5675,47 @@ Vyžiadaná indikácia čakajúcich správ podľa RFC 3842. Do&main*: - + &Doména*: Organi&zation: - + Or&ganizácia: E&xpiry: - + &Platnosť: Call Hold &variant: - + Spôsob pridržania &hovoru: &Max redirections: - + Max. počet &presmerovaní: Indicates if the Replaces-extension is supported. - + Indikuje, či je podporované rozšírenie Replaces. An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endpoint. - + Asistované prepojenie by malo používať Contact URI ako cieľovú adresu pre informovanie presmerovávanej strany o novom spojení. Táto adresa nemusí však globálne platiť. Ako alternatívu je možné použiť AoR (Address of Record). Nevýhodou je, že pri viacerých koncových zariadeniach nie je AoR jednoznačné, no URI kontaktu vždy ukazuje na jediné zariadenie. Include a P-Asserted-Identity header with your identity in an INVITE request for a call with identity hiding. - + Ak je vybrané a zároveň je aktívna voľba "skryť odosielateľa", bude spolu s údajom odosielateľa odoslaná pri požiadavke INVITE hlavička P-Preferred-Identity. &Send P-Asserted-Identity header when hiding user identity - + &Posielať hlavičku P-Preferred-Identity pri skrývaní identity používateľa Use STUN (does not wor&k for incoming TCP) - + Použiť &STUN (nefunguje pre prichádzajúce TCP) STUN ser&ver: - + Adresa S&TUN servera: <p> @@ -5749,11 +5749,44 @@ You are at work and all telephone numbers starting with a 0 should be prefixed w Match expression = 0[0-9]* , Replace = 9$&<br> </tt> </blockquote> - + <p> +Často sa formát telefónnych čísiel, ktoré očakáva poskytovateľ VoIP nezhoduje s formátom čísiel uložených v adresári. Napr. pri číslach začínajúcich na "+" a národným kódom krajiny očakáva váš poskytovateľ miesto "00" znak "+". Alebo ste pripojený na miestnu sieť SIP a je potrebné najprv zadať predvoľbu pre volania smerom von. +Tu je možné pomocou vyhľadávacích a nahradzovaných vzorov (podľa štýlu regulárnych výrazov so syntaxom jazyku Perl) nastaviť všeobecne platné pravidlá pre konverziu telefónnych čísiel. +</p> +<p> +Pri každom vytáčaní sa Twinkle pokúsi nájsť pre čísla z používateľskej časti adresy SIP zodpovedajúci výraz v zozname hľadaných vzorov. S prvým nájdeným vyhovujúcim výrazom je vykonaná úprava pôvodného čísla, pričom pozícia v "(" ")" v hľadanom výraze (napr. "([0-9]*)" pre "ľubovoľný počet čísiel") je nahradená znakmi v zodpovedajúcich premenných. Napr. "$1" pre prvú pozíciu. Viď tiež `man 7 regex` alebo konqueror:"#regex". Ak nie je nájdený žiaden zodpovedajúci hľadaný vzor, zostane číslo nezmenené. +</p> +<p> +Pravidlá budú tiež použité na čísla v prichádzajúcich hovoroch. Podľa nastavených pravidiel budú pretransformované do žiadaného formátu. +</p> +<h3>1. príklad</h3> +<p> +Napr. váš národní kód je "421" pre Slovenskú republiku a vo vašom adresári máte tiež veľa vnútroštátnych čísiel uložených v medzinárodnom formáte. Napr.. +421 2 123 456. Avšak poskytovateľ VoIP očakáva pre vnútroštátny hovor číslo 02 123456. Chcete teda nahradiť '+421' číslom '0' a zároveň pre zahraničné hovory nahradiť '+' predvoľbou '00'. +</p> +<p> +Na to sú potrebné nasledujúce pravidlá uvedené v tomto poradí: +</p> +<blockquote> +<tt> +Hľadaný výraz = \+421([0-9]*) , Náhrada = 0$1<br> +Hľadaný výraz = \+([0-9]*) , Náhrada = 00$1</br> +</tt> +</blockquote> +<h3>2. príklad</h3> +<p> +Nachádzate sa na telefónnej ústredni a všetkým číslam začínajúcim nulou má byť predradené číslo 9. +</p> +<blockquote> +<tt> +Hľadaný výraz = 0[0-9]* , Náhrada = 9$&<br> +</tt> +</blockquote> +( $& je špeciálna premenná, v ktorej je uložené celé pôvodné číslo)<br> +Poznámka: Toto pravidlo nie je možné nastaviť jednoducho ako tretie pravidlo k dvom pravidlám z príkladu č. 1. Bude totiž použité vždy len prvé pravidlo, ktoré vyhľadávaniu vyhovie. Miesto toho by muselo byť zmenené nahrádzanie v pravidlách 1 a 2 When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unencrypted. - + Ak je aktivované, Twinkle sa pokúsi pri všetkých odchádzajúcich a prichádzajúcich hovoroch šifrovať zvukové dáta. Aby bol hovor naozaj zašifrovaný musí aj protistrana podporovať šifrovanie ZRTP/SRTP. Inak ostane hovor nešifrovaný. <H2>Message waiting indication type</H2> @@ -5768,23 +5801,35 @@ Asterisk provides unsolicited message waiting indication. <p> Solicited message waiting indication as specified by RFC 3842. </p> - + <H2>Typ indikácie čakajúcich správ</H2> +<p> +Ak váš poskytovateľ SIP ponúka upozornenie na uložené správy v hlasovej schránke, môže vás Twinkle informovať o nových aj už vypočutých správach vo vašej hlasovej schránke. Spýtajte sa vášho poskytovateľa, aký typ indikácie čakajúcich správ je používaný + +</p> +<H3>Nevyžiadané</H3> +<p> +Asterisk podporuje nevyžiadané indikovanie čakajúcich správ. +</p> +<H3>Vyžiadané</H3> +<p> +Vyžiadaná indikácia čakajúcich správ podľa RFC 3842. +</p> Unsolicited - + Nevyžiadané Solicited - + Vyžiadané Solicited MWI - + Vyžiadané MWI For solicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. - + Podľa špecifikácie MWI sa koncové zariadenie prihlási na serveri k príjmu správ na určitú dobu. Pred vypršaním tejto doby by sa prihlásenie malo znovu obnoviť. @@ -5915,7 +5960,7 @@ V prípade priameho volania medzi IP adresami se môže jednať o meno hostiteľ SIP pro&xy: - + SIP pro&xy: -- cgit v1.2.3 From 4101e802d817d50a34e3cb198856718b898b3c55 Mon Sep 17 00:00:00 2001 From: Jose Riha Date: Sun, 23 Feb 2020 11:23:47 +0100 Subject: Add more markdown in README.md Mostly cosmetic changes. This also solves string being invisible on github page. --- README.md | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index a6c05be..c1c33b5 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ To compile Twinkle you need the following libraries: * libsndfile * libmagic * libreadline -* Qt 5 -- more specifically, the following submodules: +* Qt 5 – more specifically, the following submodules: * base * declarative * tools @@ -44,7 +44,7 @@ All possible options are: * G.729A codec support: `-DWITH_G729=On` * Speex codec support: `-DWITH_SPEEX=On` * iLBC codec support: `-DWITH_ILBC=On` -* Diamondcard support: `-DWITH_DIAMONDCARD=On` +* Diamondcard support: `-DWITH_DIAMONDCARD=On` (currently broken) ### Build instructions @@ -74,24 +74,24 @@ The typical default value for `CMAKE_INSTALL_PREFIX` is `/usr/local`. If you want to create an application link on your desktop you can find an application icon in the shared user data directory: -* twinkle16.png (16x16 icon) -* twinkle32.png (32x32 icon) -* twinkle48.png (48x48 icon) +* `twinkle16.png` (16x16 icon) +* `twinkle32.png` (32x32 icon) +* `twinkle48.png` (48x48 icon) ## User data On first run Twinkle will create the `.twinkle` directory in your home directory. In this directory all user data will be put: -* user profiles (.cfg) -* log files (.log) -* system settings (twinkle.sys) -* call history (twinkle.ch) -* lock file (twinkle.lck) +* user profiles (`.cfg`) +* log files (`.log`) +* system settings (`twinkle.sys`) +* call history (`twinkle.ch`) +* lock file (`twinkle.lck`) ## Starting Twinkle -Give the command: twinkle +Give the command: `twinkle` `twinkle -h` will show you some command line options you may use. @@ -109,7 +109,7 @@ existing configuration file. See below for some hints on settings to be made with the profile configuration editor. If you specify a configuration file name, then Twinkle will -such for this configuration file in your .twinkle directory. +such for this configuration file in your `.twinkle` directory. If you have put your configuration file in another location you have to specify the full path name for the file, i.e. starting with a slash. @@ -161,14 +161,14 @@ to change the port forwarding rules likewise. During execution Twinkle will create the following log files in your .twinkle directory: -* twinkle.log (latest log file) -* twinkle.log.old (previous log file) +* `twinkle.log` (latest log file) +* `twinkle.log.old` (previous log file) -When twinkle.log is full (default is 5 MB) then it is moved to -twinkle.log.old and a new twinkle.log is created. +When `twinkle.log` is full (default is 5 MB) then it is moved to +`twinkle.log.old` and a new `twinkle.log` is created. -On startup an existing twinkle.log is moved to twinkle.log.old and a -new twinkle.log is created. +On startup an existing `twinkle.log` is moved to `twinkle.log.old` and a +new `twinkle.log` is created. ## User profile configuration @@ -181,11 +181,11 @@ When you create a new profile you first give it a name and then you can make the appropriate settings. The name of the profile is what later on appears in the selection box when you start Twinkle again. Or you can give the name.cfg -at the command line (-f option) to immediately start that +at the command line (`-f` option) to immediately start that profile. -The user profile is stored as '.cfg' in the .twinkle -directory where is the name you gave to the profile. +The user profile is stored as `.cfg` in the `.twinkle` +directory where `` is the name you gave to the profile. At a minimum you have to specify the following: @@ -274,10 +274,10 @@ A SIP address has the following form: Where 'user' is a user name or a phone number and 'host-part' is a domain name, FQDN or IP address -The only mandatory part for you to enter is the . Twinkle +The only mandatory part for you to enter is the ``. Twinkle will fill in the other parts if you do not provide them. For the host-part, Twinkle will fill in the value you configured -as your 'domain'. +as your `domain`. Currently `sip:` is the only addressing scheme supported by Twinkle. -- cgit v1.2.3 From 0f9563acfef37a8d8ccceb42554b110b43503ce3 Mon Sep 17 00:00:00 2001 From: glixx Date: Mon, 24 Feb 2020 03:29:23 +0300 Subject: update Russian translation --- src/gui/lang/twinkle_ru.ts | 243 +++++++++++++-------------------------------- 1 file changed, 68 insertions(+), 175 deletions(-) diff --git a/src/gui/lang/twinkle_ru.ts b/src/gui/lang/twinkle_ru.ts index 2751999..6fc4ec2 100644 --- a/src/gui/lang/twinkle_ru.ts +++ b/src/gui/lang/twinkle_ru.ts @@ -1,6 +1,4 @@ - - - + AddressCardForm @@ -921,11 +919,11 @@ Are you sure you want to delete contact '%1' from the local address book? - + Вы уверены, что хотите удалить контакт '%1' из локальной адресной книги? Delete contact - + Удалить контакт @@ -3899,14 +3897,6 @@ STUN не работает. &User name*: &Имя пользователя*: - - &Domain*: - &Домен*: - - - Or&ganization: - Ор&ганизация: - The SIP user name given to you by your provider. It is the user part in your SIP address, <b>username</b>@domain.com This could be a telephone number. <br><br> @@ -3975,10 +3965,6 @@ This field is mandatory. The hostname, domain name or IP address of your registrar. If you use an outbound proxy that is the same as your registrar, then you may leave this field empty and only fill in the address of the outbound proxy. Имя компьютера, доменное имя или IP адрес вашего регистратора. Если вы используете исходящий прокси, совпадающий с вашим регистратором, вы можете оставить его пустым. - - &Expiry: - &Устаревание: - The registration expiry time that Twinkle will request. Время устаревание регистрации, после которого Twinkle перепошлёт запрос заново. @@ -4414,10 +4400,6 @@ Send DTMF out-of-band via a SIP INFO request. Protocol options Опции протокола - - Call &Hold variant: - &Вариант удержания вызова: - RFC 2543 RFC 2543 @@ -4561,10 +4543,6 @@ This format is what most SIP phones use. Indicates if Twinkle should ask the user before redirecting a request when a 3XX response is received. Если включено, Twinkle спрашивает, запрашивает ли пользователь 3XX, чтобы исходящий вызов был перенаправлен на новый пункт назначения. - - Max re&directions: - &Максимум перенаправлений: - The number of redirect addresses that Twinkle tries at a maximum before it gives up redirecting a request. This prevents a request from getting redirected forever. Номер переадресации исходящих вызовов, после которого Twinkle прекращает попытки установить соединение. Предотвращает перегрузку при перенаправлении. @@ -4615,10 +4593,6 @@ This format is what most SIP phones use. Replaces Замены - - Indicates if the Replaces-extenstion is supported. - Указывает, поддерживается ли расширение Replaces. - REFER Рефер @@ -4683,10 +4657,6 @@ This format is what most SIP phones use. Attended refer to AoR (Address of Record) Добавлять рефера в AoR (адрес записи) - - An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endoint. - Приходящая передача вызова должна использовать URI контакта в качестве адресата для связи нового соединения, перенаправленного на контрагента. Однако этот адрес не может быть глобально действительным. В качестве альтернативы можно использовать AoR (адрес записи). Недостатком является то, что с несколькими конечными устройствами AoR однозначен, тогда как URI контакта направляется на одно устройство. - Privacy Защита @@ -4753,18 +4723,10 @@ When you choose this option you have to create static address mappings in your N Если включено, Twinkle будет использовать общедоступный IP-адрес внутри сообщений SIP (в заголовке SIP и теле SDP) вместо IP-адреса вашего сетевого интерфейса.<br><br> Если вы выберете эту опцию, вам также необходимо направить соответствующие порты RTP на ваш компьютер на устройстве NAT. - - Use &STUN (does not work for incoming TCP) - Использовать &STUN (не работает для входящего TCP) - Choose this option when your SIP provider offers a STUN server for NAT traversal. Выберите эту опцию если ваш провайдер SIP предлагает STUN-сервер для обхода NAT. - - S&TUN server: - S&TUN сервер: - The hostname, domain name or IP address of the STUN server. Имя сервера, доменное имя или IP адрес STUN сервера. @@ -4825,73 +4787,6 @@ When you choose this option you have to create static address mappings in your N Replace Замена - - <p> -Often the format of the telphone numbers you need to dial is different from the format of the telephone numbers stored in your address book, e.g. your numbers start with a +-symbol followed by a country code, but your provider expects '00' instead of the '+', or you are at the office and all your numbers need to be prefixed with a '9' to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings. -</p> -<p> -For each number you dial, Twinkle will try to find a match in the list of match expressions. For the first match it finds, the number will be replaced with the format string. If no match is found, the number stays unchanged. -</p> -<p> -The number conversion rules are also applied to incoming calls, so the numbers are displayed in the format you want. -</p> -<h3>Example 1</h3> -<p> -Assume your country code is 31 and you have stored all numbers in your address book in full international number format, e.g. +318712345678. For dialling numbers in your own country you want to strip of the '+31' and replace it by a '0'. For dialling numbers abroad you just want to replace the '+' by '00'. -</p> -<p> -The following rules will do the trick: -</p> -<blockquote> -<tt> -Match expression = \+31([0-9]*) , Replace = 0$1<br> -Match expression = \+([0-9]*) , Replace = 00$1</br> -</tt> -</blockquote> -<h3>Example 2</h3> -<p> -You are at work and all telephone numbers starting with a 0 should be prefixed with a 9 for an outside line. -</p> -<blockquote> -<tt> -Match expression = 0[0-9]* , Replace = 9$&<br> -</tt> -</blockquote> - <p> -Часто количество телефонных номеров, ожидаемых от провайдера VoIP, не совпадает с количеством, сохранённым в каталоге. К примеру, для номеров, начинающихся с «+» и национального кода страны, ваш провайдер ожидает «+» вместо «00». Или, если вы подключены к локальной сети SIP, вам необходимо предварительно указать номер доступа. -Можно установить общепринятые правила для преобразования телефонных номеров с использованием шаблонов поиска и свопинга (с помощью регулярных выражений и языка Perl). -</p> -<p> -Каждый раз, когда вы набираете номер, Twinkle пытается найти соответствующие номера в списке шаблонов поиска для чисел со стороны пользователя SIP-адреса. Первое найденное совпадающее выражение - это исходное число, а позиция в («») в поисковом выражении (например, «([0-9] *)» для «любого числа чисел» заменяется символами соответствующих переменных. К примеру, «1 доллар» для первой позиции. См. также `man 7 regex` или konqueror:«#regex». Если совпадающий шаблон не найден, число остаётся неизменным. -</p> -<p> -Правила будут также применяться к номерам входящих вызовов. В зависимости от установленных правил они будут преобразованы в нужный формат. -</p> -<h3>1. пример</h3> -<p> -К примеру, ваш национальный код «420» для Чешской Республики, и в вашем каталоге у вас также есть много национальных номеров, хранящихся в международном формате. Например, позвоните по телефону +420 777 2345678. Тем не менее, провайдер VoIP ожидает по национальному звонку 0577 2345678. Вы хотите заменить «+420» на «0» и заменить «+» на «00» на внешние вызовы. -</p> -<p> -В этом порядке требуются следующие правила: -</p> -<blockquote> -<tt> -Поисковый запрос = \ +49 ([0-9] *), Замена = 0 $ 1<br> -Поисковый запрос = \ + ([0-9] *), Замена = 00 $ 1</br> -</tt> -</blockquote> -<h3>2. пример</h3> -<p> -Вы находитесь на телефонной станции, и все номера с 0 в качестве первой цифры должны быть пронумерованы 9. -</p> -<blockquote> -<tt> -Поисковый запрос = 0 [0-9] *, Замена = 9 $ &<br> -</tt> -</blockquote> -($& - специальная переменная, в которой хранится весь исходный номер)<br> -Примечание. Это правило нельзя задать просто как третье правило для двух правил в предыдущем примере. Это будет использовать только первое, чтобы соответствовать поиску. Вместо этого замена в Правилах 1 и 2 должна быть изменена - «57$1» и «577$1», - Move the selected number conversion rule upwards in the list. Переместить выбранное правило преобразования номера вверх в списке. @@ -5299,10 +5194,6 @@ The values of all SIP headers of the outgoing INVITE are passed in environment v &Enable ZRTP/SRTP encryption &Включить ZRTP/SRTP шифрование - - When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unecrypted. - Если включено, Twinkle пытается зашифровать аудиоданные во всех исходящих и входящих вызовах. Для того, чтобы вызов был зашифрован, контрагент должен также поддерживать шифрование ZRTP / SRTP. В противном случае вызов остаётся незашифрованным. - ZRTP settings ZRTP настройки @@ -5339,48 +5230,10 @@ The values of all SIP headers of the outgoing INVITE are passed in environment v The SIP address or telephone number to access your voice mail. SIP адрес или телефонный номер для доступа к вашей голосовой почте. - - Unsollicited - Незапрошен - - - Sollicited - Запрошен - - - <H2>Message waiting indication type</H2> -<p> -If your provider offers the message waiting indication service, then Twinkle can show you when new voice mail messages are waiting. Ask your provider which type of message waiting indication is offered. -</p> -<H3>Unsollicited</H3> -<p> -Asterisk provides unsollicited message waiting indication. -</p> -<H3>Sollicited</H3> -<p> -Sollicited message waiting indication as specified by RFC 3842. -</p> - <H2>Тип отображения ожидающего сообщения</H2> -<p> -Если ваш SIP-провайдер предлагает оповещения о сохранённых сообщениях в вашей голосовой почте, Twinkle может рассказать вам о новых и уже услышанных сообщениях в вашей голосовой почте. Спросите своего провайдера, какой тип ожидающего сообщения используется -</p> -<H3>Нежелательный</H3> -<p> -Asterisk поддерживает нежелательные ожидающие сообщения. -</p> -<H3>Запрошенный</H3> -<p> -Запрошенная индикация ожидающего сообщения в соответствии с RFC 3842. -</p> - &MWI type: &MWI тип: - - Sollicited MWI - Запрошенный MWI - Subscription &duration: Продолжительность &подписки: @@ -5393,10 +5246,6 @@ Asterisk поддерживает нежелательные ожидающие The hostname, domain name or IP address of your voice mailbox server. Имя сервера, доменное имя или IP адрес вашего сервера голосовой почты. - - For sollicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. - Согласно спецификации MWI, конечное устройство сообщает серверу о получении сообщения в течение определённого периода времени, и до истечения этого времени регистрация должна возобновиться. - Your user name for accessing your voice mailbox. Ваше имя пользователя для доступа к вашей голосовой почте. @@ -5695,51 +5544,51 @@ This could be the hostname or IP address of your PC if you want direct PC to PC Do&main*: - + До&мен*: Organi&zation: - + Органи&зация: E&xpiry: - + У&старевание: Call Hold &variant: - + &Вариант удержания вызова: &Max redirections: - + &Максимум перенаправлений: Indicates if the Replaces-extension is supported. - + Указывает, поддерживается ли расширение Replaces. An attended call transfer should use the contact URI as a refer target. A contact URI may not be globally routable however. Alternatively the AoR (Address of Record) may be used. A disadvantage is that the AoR may route to multiple endpoints in case of forking whereas the contact URI routes to a single endpoint. - + Приходящая передача вызова должна использовать URI контакта в качестве адресата для связи нового соединения, перенаправленного на контрагента. Однако этот адрес не может быть глобально действительным. В качестве альтернативы можно использовать AoR (адрес записи). Недостатком является то, что с несколькими конечными устройствами AoR однозначен, тогда как URI контакта направляется на одно устройство. Include a P-Asserted-Identity header with your identity in an INVITE request for a call with identity hiding. - + Включать заголовок P-Asserted-Identity с вашей личностью в запросе INVITE для вызова со скрытием личности. &Send P-Asserted-Identity header when hiding user identity - + &Отправлять заголовок P-Asserted-Identity когда личность пользователя скрывается Use STUN (does not wor&k for incoming TCP) - + Использовать STUN (не &работает для входящего TCP) STUN ser&ver: - + STUN сер&вер: <p> -Often the format of the telephone numbers you need to dial is different from the format of the telephone numbers stored in your address book, e.g. your numbers start with a +-symbol followed by a country code, but your provider expects '00' instead of the '+', or you are at the office and all your numbers need to be prefixed with a '9' to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings. +Often the format of the telephone numbers you need to dial is different from the format of the telephone numbers stored in your address book, e.g. your numbers start with a +-symbol followed by a country code, but your provider expects '00' instead of the '+', or you are at the office and all your numbers need to be prefixed with a '9' to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings. </p> <p> For each number you dial, Twinkle will try to find a match in the list of match expressions. For the first match it finds, the number will be replaced with the format string. If no match is found, the number stays unchanged. @@ -5749,7 +5598,7 @@ The number conversion rules are also applied to incoming calls, so the numbers a </p> <h3>Example 1</h3> <p> -Assume your country code is 31 and you have stored all numbers in your address book in full international number format, e.g. +318712345678. For dialling numbers in your own country you want to strip of the '+31' and replace it by a '0'. For dialling numbers abroad you just want to replace the '+' by '00'. +Assume your country code is 31 and you have stored all numbers in your address book in full international number format, e.g. +318712345678. For dialling numbers in your own country you want to strip of the '+31' and replace it by a '0'. For dialling numbers abroad you just want to replace the '+' by '00'. </p> <p> The following rules will do the trick: @@ -5769,11 +5618,44 @@ You are at work and all telephone numbers starting with a 0 should be prefixed w Match expression = 0[0-9]* , Replace = 9$&<br> </tt> </blockquote> - + <p> +Часто количество телефонных номеров, ожидаемых от провайдера VoIP, не совпадает с количеством, сохранённым в каталоге. К примеру, для номеров, начинающихся с «+» и национального кода страны, ваш провайдер ожидает «+» вместо «00». Или, если вы подключены к локальной сети SIP, вам необходимо предварительно указать номер доступа. +Можно установить общепринятые правила для преобразования телефонных номеров с использованием шаблонов поиска и свопинга (с помощью регулярных выражений и языка Perl). +</p> +<p> +Каждый раз, когда вы набираете номер, Twinkle пытается найти соответствующие номера в списке шаблонов поиска для чисел со стороны пользователя SIP-адреса. Первое найденное совпадающее выражение - это исходное число, а позиция в («») в поисковом выражении (например, «([0-9] *)» для «любого числа чисел» заменяется символами соответствующих переменных. К примеру, «1 доллар» для первой позиции. См. также `man 7 regex` или konqueror:«#regex». Если совпадающий шаблон не найден, число остаётся неизменным. +</p> +<p> +Правила будут также применяться к номерам входящих вызовов. В зависимости от установленных правил они будут преобразованы в нужный формат. +</p> +<h3>1. пример</h3> +<p> +К примеру, ваш национальный код «420» для Чешской Республики, и в вашем каталоге у вас также есть много национальных номеров, хранящихся в международном формате. Например, позвоните по телефону +420 777 2345678. Тем не менее, провайдер VoIP ожидает по национальному звонку 0577 2345678. Вы хотите заменить «+420» на «0» и заменить «+» на «00» на внешние вызовы. +</p> +<p> +В этом порядке требуются следующие правила: +</p> +<blockquote> +<tt> +Поисковый запрос = \ +49 ([0-9] *), Замена = 0 $ 1<br> +Поисковый запрос = \ + ([0-9] *), Замена = 00 $ 1</br> +</tt> +</blockquote> +<h3>2. пример</h3> +<p> +Вы находитесь на телефонной станции, и все номера с 0 в качестве первой цифры должны быть пронумерованы 9. +</p> +<blockquote> +<tt> +Поисковый запрос = 0 [0-9] *, Замена = 9 $ &<br> +</tt> +</blockquote> +($& - специальная переменная, в которой хранится весь исходный номер)<br> +Примечание. Это правило нельзя задать просто как третье правило для двух правил в предыдущем примере. Это будет использовать только первое, чтобы соответствовать поиску. Вместо этого замена в Правилах 1 и 2 должна быть изменена - «57$1» и «577$1», When ZRTP/SRTP is enabled, then Twinkle will try to encrypt the audio of each call you originate or receive. Encryption will only succeed if the remote party has ZRTP/SRTP support enabled. If the remote party does not support ZRTP/SRTP, then the audio channel will stay unencrypted. - + Если включено, Twinkle пытается зашифровать аудиоданные во всех исходящих и входящих вызовах. Для того, чтобы вызов был зашифрован, контрагент должен также поддерживать шифрование ZRTP / SRTP. В противном случае вызов остаётся незашифрованным. <H2>Message waiting indication type</H2> @@ -5788,23 +5670,34 @@ Asterisk provides unsolicited message waiting indication. <p> Solicited message waiting indication as specified by RFC 3842. </p> - + <H2>Тип отображения ожидающего сообщения</H2> +<p> +Если ваш SIP-провайдер предлагает оповещения о сохранённых сообщениях в вашей голосовой почте, Twinkle может рассказать вам о новых и уже услышанных сообщениях в вашей голосовой почте. Спросите своего провайдера, какой тип ожидающего сообщения используется +</p> +<H3>Незапрошенный</H3> +<p> +Asterisk поддерживает незапрошенные ожидающие сообщения. +</p> +<H3>Запрошенный</H3> +<p> +Запрошенная индикация ожидающего сообщения в соответствии с RFC 3842. +</p> Unsolicited - + Незапрошенный Solicited - + Запрошенный Solicited MWI - + Запрошенный MWI For solicited MWI, an endpoint subscribes to the message status for a limited duration. Just before the duration expires, the endpoint should refresh the subscription. - + Для запрошенного MWI, конечное устройство сообщает серверу о получении сообщения в течение определённого периода времени, и до истечения этого времени регистрация должна возобновиться. @@ -5956,4 +5849,4 @@ This could be the hostname or IP address of your PC if you want direct PC to PC Отклонить - + \ No newline at end of file -- cgit v1.2.3 From 17d6bc6bdada9ca16194513542fb51337e356e64 Mon Sep 17 00:00:00 2001 From: Bart Lagerweij Date: Mon, 2 Mar 2020 15:02:34 +0100 Subject: Fix a few translation typos A few dutch translation where misspelled. --- src/gui/lang/twinkle_nl.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/gui/lang/twinkle_nl.ts b/src/gui/lang/twinkle_nl.ts index adbf748..831a2c4 100644 --- a/src/gui/lang/twinkle_nl.ts +++ b/src/gui/lang/twinkle_nl.ts @@ -111,11 +111,11 @@ &Password: - &Paswoord: + W&achtwoord: Your password for authentication. - Uw paswoord voor authenticatie. + Uw wachtwoord voor authenticatie. Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though. @@ -260,7 +260,7 @@ request failed - verzoel mislukt + verzoek mislukt Click right to add a buddy. @@ -1005,11 +1005,11 @@ Are you sure you want to delete contact '%1' from the local address book? - + Weet je zeker dat je contact '%1' wilt verwijderen van je lokale adres boek? Delete contact - + Verwijder contact @@ -1711,7 +1711,7 @@ Als de SAS aan beide kanten hetzelfde is, dan moet u die bevestigen door op het &Quit - &Aflsuiten + &Afsluiten Ctrl+Q @@ -2406,7 +2406,7 @@ Als de SAS aan beide kanten hetzelfde is, dan moet u die bevestigen door op het &Manual - &Handleinding + &Handleiding Sign up -- cgit v1.2.3 From 46bee14d3cc49d4fb49eaf36a29dbcc7a11a5ab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Sat, 6 Jul 2019 15:40:56 -0400 Subject: Add support for the new bcg729 API, introduced in version 1.0.2 Starting with version 1.0.2, bcg729 has changed its API to add support for G.729B, thus requiring us to adjust our function calls depending on which version is installed. When dealing with the new API, we merely need to add a few parameters to disable all G.729B features, namely: * On the decoder side: When `SIDFrameFlag` is not set, the decoder will behave just like before, decoding the payload as a standard G.729A voice frame (or concealing an erased frame). The other parameters, `rfc3389PayloadFlag` and `bitStreamLength`, are only of use when dealing with a SID frame sent as per RFC 3389, and are ignored if `SIDFrameFlag` is not set. * On the encoder side: When `enableVAD` is disabled, the encoder will behave just like before, producing only standard G.729A voice frames. The only API difference is the introduction of `*bitStreamLength`, to return the length of the encoded frame (0, 2 or 10 bytes). In our case, this will always be 10 bytes just like before; an assert() was added to guarantee this. Closes #104 --- CMakeLists.txt | 4 ++++ cmake/FindG729.cmake | 36 ++++++++++++++++++++++++++++++++++++ src/audio/audio_decoder.cpp | 8 ++++++++ src/audio/audio_encoder.cpp | 10 ++++++++++ twinkle_config.h.in | 1 + 5 files changed, 59 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1dafe55..7e3fde0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -116,6 +116,10 @@ if (WITH_G729) if (G729_FOUND) message(STATUS "bcg729 OK") set(HAVE_BCG729 TRUE) + + if (G729_ANNEX_B) + set(HAVE_BCG729_ANNEX_B TRUE) + endif (G729_ANNEX_B) include_directories(${G729_INCLUDE_DIR}) else (G729_FOUND) diff --git a/cmake/FindG729.cmake b/cmake/FindG729.cmake index 4a30ba0..1fbfeeb 100644 --- a/cmake/FindG729.cmake +++ b/cmake/FindG729.cmake @@ -1,14 +1,50 @@ +INCLUDE(CMakePushCheckState) +INCLUDE(CheckCSourceCompiles) + FIND_PATH(G729_INCLUDE_DIR bcg729/decoder.h) FIND_LIBRARY(G729_LIBRARY NAMES bcg729) IF(G729_INCLUDE_DIR AND G729_LIBRARY) SET(G729_FOUND TRUE) + + # The bcg729 API was changed in 1.0.2 to add support for G.729 Annex B. + # This checks whether we are dealing with the old or new API. + CMAKE_PUSH_CHECK_STATE() + SET(CMAKE_REQUIRED_INCLUDES "${INCLUDE_DIRECTORIES}" "${G729_INCLUDE_DIR}") + SET(CMAKE_REQUIRED_LIBRARIES "${G729_LIBRARY}") + SET(CMAKE_REQUIRED_QUIET TRUE) + # Try to compile something using the old (pre-1.0.2) API. + # + # We cannot do it the other way around, as initBcg729EncoderChannel() + # did not have a prototype before 1.0.2, thus compilation would not fail + # when passing it an extra argument. + CHECK_C_SOURCE_COMPILES(" + #include + + int main() { + /* This function requires an argument since 1.0.2 */ + initBcg729EncoderChannel(); + return 0; + } + " G729_OLD_API) + CMAKE_POP_CHECK_STATE() + + IF (G729_OLD_API) + SET(G729_ANNEX_B FALSE) + ELSE (G729_OLD_API) + SET(G729_ANNEX_B TRUE) + ENDIF (G729_OLD_API) ENDIF(G729_INCLUDE_DIR AND G729_LIBRARY) IF(G729_FOUND) IF (NOT G729_FIND_QUIETLY) MESSAGE(STATUS "Found bcg729 includes: ${G729_INCLUDE_DIR}/bcg729/decoder.h") MESSAGE(STATUS "Found bcg729 library: ${G729_LIBRARY}") + IF (G729_ANNEX_B) + MESSAGE(STATUS "bcg729 supports Annex B; using the new (1.0.2) API") + ELSE (G729_ANNEX_B) + MESSAGE(STATUS "bcg729 does not support Annex B; using the old (pre-1.0.2) API") + ENDIF (G729_ANNEX_B) ENDIF (NOT G729_FIND_QUIETLY) ELSE(G729_FOUND) IF (G729_FIND_REQUIRED) diff --git a/src/audio/audio_decoder.cpp b/src/audio/audio_decoder.cpp index 65935dd..c661910 100644 --- a/src/audio/audio_decoder.cpp +++ b/src/audio/audio_decoder.cpp @@ -547,7 +547,11 @@ uint16 t_g729a_audio_decoder::decode(uint8 *payload, uint16 payload_size, for (uint16 done = 0; done < payload_size; done += 10) { +#ifdef HAVE_BCG729_ANNEX_B + bcg729Decoder(_context, &payload[done], 0, false, false, false, &pcm_buf[done * 8]); +#else bcg729Decoder(_context, &payload[done], false, &pcm_buf[done * 8]); +#endif } return payload_size * 8; @@ -562,7 +566,11 @@ uint16 t_g729a_audio_decoder::conceal(int16 *pcm_buf, uint16 pcm_buf_size) { assert(pcm_buf_size >= 80); +#ifdef HAVE_BCG729_ANNEX_B + bcg729Decoder(_context, nullptr, 0, true, false, false, pcm_buf); +#else bcg729Decoder(_context, nullptr, true, pcm_buf); +#endif return 80; } diff --git a/src/audio/audio_encoder.cpp b/src/audio/audio_encoder.cpp index d6ff356..952b1ee 100644 --- a/src/audio/audio_encoder.cpp +++ b/src/audio/audio_encoder.cpp @@ -433,7 +433,11 @@ uint16 t_g726_audio_encoder::encode(int16 *sample_buf, uint16 nsamples, t_g729a_audio_encoder::t_g729a_audio_encoder(uint16 payload_id, uint16 ptime, t_user *user_config) : t_audio_encoder(payload_id, ptime, user_config) { +#ifdef HAVE_BCG729_ANNEX_B + _context = initBcg729EncoderChannel(false); +#else _context = initBcg729EncoderChannel(); +#endif } t_g729a_audio_encoder::~t_g729a_audio_encoder() @@ -451,7 +455,13 @@ uint16 t_g729a_audio_encoder::encode(int16 *sample_buf, uint16 nsamples, for (uint16 done = 0; done < nsamples; done += 80) { +#ifdef HAVE_BCG729_ANNEX_B + uint8 frame_size = 10; + bcg729Encoder(_context, &sample_buf[done], &payload[done / 8], &frame_size); + assert(frame_size == 10); +#else bcg729Encoder(_context, &sample_buf[done], &payload[done / 8]); +#endif } return nsamples / 8; diff --git a/twinkle_config.h.in b/twinkle_config.h.in index a1aa3b4..53a0426 100644 --- a/twinkle_config.h.in +++ b/twinkle_config.h.in @@ -4,6 +4,7 @@ #cmakedefine HAVE_ILBC_CPP #cmakedefine HAVE_ZRTP #cmakedefine HAVE_BCG729 +#cmakedefine HAVE_BCG729_ANNEX_B #cmakedefine HAVE_GSM #cmakedefine HAVE_UNISTD_H -- cgit v1.2.3 From 859b4233e53be71f88e54c8505dc0052e0059742 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Sun, 29 Mar 2020 15:13:01 -0400 Subject: Test building with bcg729 on Travis CI, trying both APIs --- .travis.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.travis.yml b/.travis.yml index 671a119..a406bcb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,7 @@ env: - FLAGS="-DWITH_QT5=ON -DWITH_ALSA=ON -DWITH_GSM=ON -DWITH_SPEEX=ON -DWITH_ZRTP=OFF" # (qttools5-dev-tools is explicitly included because of Debian bug #835295) - PACKAGES="libasound2-dev libgsm1-dev libspeex-dev libspeexdsp-dev qtdeclarative5-dev qttools5-dev qttools5-dev-tools" + matrix: # Test various compiler versions - PACKAGES_ADD="g++-5" MATRIX_EVAL="CC=gcc-5 && CXX=g++-5" @@ -20,9 +21,15 @@ env: - PACKAGES_ADD="clang-6.0" MATRIX_EVAL="CC=clang-6.0 && CXX=clang++-6.0" - PACKAGES_ADD="clang-7" MATRIX_EVAL="CC=clang-7 && CXX=clang++-7" - PACKAGES_ADD="clang-8" MATRIX_EVAL="CC=clang-8 && CXX=clang++-8" + # Test with all options disabled - FLAGS="-DWITH_QT5=OFF -DWITH_ALSA=OFF -DWITH_GSM=OFF -DWITH_SPEEX=OFF -DWITH_ZRTP=OFF" PACKAGES="" + # Test building with bcg729 + - BUILD_BCG729="master" FLAGS="-DWITH_QT5=OFF -DWITH_ALSA=OFF -DWITH_G729=ON" PACKAGES="git ca-certificates" + # Also test the old pre-1.0.2 API (see issue #104) + - BUILD_BCG729="1.0.1" BUILD_BCG729_AUTOTOOLS="Y" FLAGS="-DWITH_QT5=OFF -DWITH_ALSA=OFF -DWITH_G729=ON" PACKAGES="git ca-certificates pkg-config libtool automake autoconf" + # See https://docs.travis-ci.com/user/languages/cpp/#C11-C%2B%2B11-%28and-Beyond%29-and-Toolchain-Versioning before_install: - eval "${MATRIX_EVAL}" @@ -33,6 +40,8 @@ install: - sudo apt-get -y install bison cmake flex libccrtp-dev libmagic-dev libreadline-dev libsndfile1-dev libucommon-dev libxml2-dev linux-libc-dev $PACKAGES $PACKAGES_ADD script: + # Download and build bcg729 if necessary + - if [ "$BUILD_BCG729" ]; then git clone git://git.linphone.org/bcg729.git --branch "$BUILD_BCG729" && (cd bcg729 && if [ "$BUILD_BCG729_AUTOTOOLS" ]; then ./autogen.sh && ./configure; else cmake .; fi && make && sudo make install); fi - mkdir _build - cd _build - cmake -DCMAKE_INSTALL_PREFIX=../_install $FLAGS .. -- cgit v1.2.3 From ae62caebc6769f96d7ffc2e7e4f4e6e07ec0f0fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Mon, 30 Mar 2020 18:19:35 -0400 Subject: Use the first payload type number for each codec in the SDP answer It is possible for the SDP offer to feature more than one payload type number (either static or dynamic) that refer to the same codec. For example, a peer that supports ITU-T V.152 may use two payload types, with one of them marked for voice-band data use: m=audio 3456 RTP/AVP 0 98 a=rtpmap:0 PCMU/8000 a=rtpmap:98 PCMU/8000 a=gpmd:98 vbd=yes Ideally, Twinkle should use the number that was listed first in the media formats list when building the SDP answer. Closes #184 --- src/session.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/session.cpp b/src/session.cpp index ae816fa..2007791 100644 --- a/src/session.cpp +++ b/src/session.cpp @@ -44,7 +44,10 @@ void t_session::set_recvd_codecs(t_sdp *sdp) { t_audio_codec ac = sdp->get_codec(SDP_AUDIO, *i); if (ac > CODEC_UNSUPPORTED) { recvd_codecs.push_back(ac); - send_ac2payload[ac] = *i; + // Don't overwrite any previous mapping for this codec + if (!send_ac2payload.count(ac)) { + send_ac2payload[ac] = *i; + } send_payload2ac[*i] = ac; } } -- cgit v1.2.3 From 08005d2d58691dc6f6d3ddd93b87950064fa2038 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Mon, 30 Mar 2020 22:22:49 -0400 Subject: Set the windowTitle property of callToolbar The window title of a toolbar is displayed in the default context menu of the main window. Closes #195 --- src/gui/mphoneform.ui | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/mphoneform.ui b/src/gui/mphoneform.ui index 8857394..6a1f6f0 100644 --- a/src/gui/mphoneform.ui +++ b/src/gui/mphoneform.ui @@ -1015,6 +1015,9 @@ + + Main Toolbar + Qt::ToolButtonTextUnderIcon -- cgit v1.2.3 From e8c2443bbd54d47cb2d3868d454ea48428b34bf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Tue, 31 Mar 2020 14:24:28 -0400 Subject: Call GetProfileNameForm::init() in the constructor init() is responsible for setting a validator for profileLineEdit; its invocation was probably lost in the Qt4/5 transition. Closes #189 --- src/gui/getprofilenameform.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/getprofilenameform.cpp b/src/gui/getprofilenameform.cpp index 89c715e..19e3a62 100644 --- a/src/gui/getprofilenameform.cpp +++ b/src/gui/getprofilenameform.cpp @@ -16,6 +16,7 @@ GetProfileNameForm::GetProfileNameForm(QWidget* parent) : QDialog(parent) { setupUi(this); + init(); } /* -- cgit v1.2.3 From ea00ce2f9d24ade8bcf8736a31516b41511e6233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Tue, 31 Mar 2020 14:45:02 -0400 Subject: Add a note in getprofilenameform.ui listing which characters are allowed --- src/gui/getprofilenameform.ui | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/gui/getprofilenameform.ui b/src/gui/getprofilenameform.ui index 9e1ba47..417e952 100644 --- a/src/gui/getprofilenameform.ui +++ b/src/gui/getprofilenameform.ui @@ -109,6 +109,30 @@ To remember your profiles easily you could use your SIP user name as a profile n + + + + + 5 + 0 + 0 + 0 + + + + (Allowed characters: letters, digits, '-', '_', '.', '@') + + + false + + + Qt::AlignVCenter + + + false + + + -- cgit v1.2.3 From ba8292d0fb08d39b0d8b9913889ffd589821b070 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Tue, 31 Mar 2020 17:24:27 -0400 Subject: Relax GetProfileNameForm validator to only check individual characters QRegExpValidator can be somewhat user-unfriendly, as it will prevent characters from being input, or even deleted, while leaving the user in the dark as to what is going on. Retricting the set of characters allowed shouldn't pose a problem if we make a mention of this on the form. Checking for a leading "." or "@", however, is better left at submission time, with an explicit error message in that case. --- src/gui/getprofilenameform.cpp | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/gui/getprofilenameform.cpp b/src/gui/getprofilenameform.cpp index 19e3a62..f2042c5 100644 --- a/src/gui/getprofilenameform.cpp +++ b/src/gui/getprofilenameform.cpp @@ -29,8 +29,8 @@ GetProfileNameForm::~GetProfileNameForm() void GetProfileNameForm::init() { - // Letters, digits, underscore, minus - QRegExp rxFilenameChars("[\\w\\-][\\w\\-@\\.]*"); + // Letters, digits, underscore, minus, "@" and period + QRegExp rxFilenameChars("[\\w\\-@\\.]*"); // Set validators // USER @@ -39,7 +39,25 @@ void GetProfileNameForm::init() void GetProfileNameForm::validate() { - if (profileLineEdit->text().isEmpty()) return; + QString profileName = profileLineEdit->text(); + + if (profileName.isEmpty()) return; + + // Check for anything that was let through by the validator + QRegExp rxFilename("^[\\w\\-][\\w\\-@\\.]*$"); + if (!rxFilename.exactMatch(profileName)) { + QMessageBox::critical(this, PRODUCT_NAME, + tr("Invalid profile name: %1").arg(profileName) + // While this would be better suited as informativeText, + // Qt wouldn't take it into account when sizing the box + // (see http://apocalyptech.com/linux/qt/qmessagebox/) + + QString("\n\n") + tr( + "Allowed characters are: letters, digits, '-', '_', '.' and '@'.\n" + "Furthermore, the initial character cannot be '.' or '@'." + )); + + return; + } // Find the .twinkle directory in HOME QDir d = QDir::home(); @@ -49,7 +67,7 @@ void GetProfileNameForm::validate() reject(); } - QString filename = profileLineEdit->text(); + QString filename = profileName; filename.append(USER_FILE_EXT); QString fullname = d.filePath(filename); if (QFile::exists(fullname)) { -- cgit v1.2.3 From 1eb2b7e2c7659e46d4c6dd3786d457c14c5e7ddd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Tue, 31 Mar 2020 17:51:15 -0400 Subject: Give focus to profileLineEdit in GetProfileNameForm constructor Even though focus is supposed to initially go to profileLineEdit (due to its first position in the tabstops list), this doesn't seem to be the case in reality (at least for me). --- src/gui/getprofilenameform.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/getprofilenameform.cpp b/src/gui/getprofilenameform.cpp index f2042c5..854b9c2 100644 --- a/src/gui/getprofilenameform.cpp +++ b/src/gui/getprofilenameform.cpp @@ -35,6 +35,9 @@ void GetProfileNameForm::init() // Set validators // USER profileLineEdit->setValidator(new QRegExpValidator(rxFilenameChars, this)); + + // Focus seems to default to OK button, despite tab order + profileLineEdit->setFocus(); } void GetProfileNameForm::validate() -- cgit v1.2.3 From 055dfa3eab9e08f47c2c40fd2a4173c0272daff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Tue, 31 Mar 2020 19:49:08 -0400 Subject: Fix overlap of two settings in syssettingsform.ui The merging of 1e9f091 (#123) and f3d6f33 (#126) resulted in a positional conflict in syssettingsform.ui. --- src/gui/syssettingsform.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/syssettingsform.ui b/src/gui/syssettingsform.ui index 9cb084d..a0ae501 100644 --- a/src/gui/syssettingsform.ui +++ b/src/gui/syssettingsform.ui @@ -955,7 +955,7 @@ If before answering a call, the microphone or speaker appears to be invalid, a w - + -- cgit v1.2.3 From b756c8cdebc4ab6d0ed0386f3bb1d4a5074cc319 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Wed, 1 Apr 2020 08:53:00 -0400 Subject: Use HTTPS for the archive.org manual URL --- src/gui/mphoneform.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/mphoneform.cpp b/src/gui/mphoneform.cpp index abdbcda..144bbea 100644 --- a/src/gui/mphoneform.cpp +++ b/src/gui/mphoneform.cpp @@ -2297,7 +2297,7 @@ void MphoneForm::aboutQt() void MphoneForm::manual() { - ((t_gui *)ui)->open_url_in_browser("http://web.archive.org/web/20180217123024/http://www.twinklephone.com/"); + ((t_gui *)ui)->open_url_in_browser("https://web.archive.org/web/20180217123024/http://www.twinklephone.com/"); } void MphoneForm::editUserProfile() -- cgit v1.2.3 From 7f9e1d75d90c3f2934a05346568c483e2290fa4c Mon Sep 17 00:00:00 2001 From: Ralf Kilian Date: Tue, 4 Aug 2020 18:19:53 +0200 Subject: Fix typo in German language file Missing letter inside the word "Uhrzeit" --- src/gui/lang/twinkle_de.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/lang/twinkle_de.ts b/src/gui/lang/twinkle_de.ts index 8adc278..b847965 100644 --- a/src/gui/lang/twinkle_de.ts +++ b/src/gui/lang/twinkle_de.ts @@ -1010,7 +1010,7 @@ Es bietet sich an, hier Ihre SIP-Adresse als Name zu verwenden, also <b>me Time - Uhreit + Uhrzeit In/Out -- cgit v1.2.3 From 1ad8560c9b97af9e4d80d21d6e45c3c4cd4dc2fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bri=C3=A8re?= Date: Sun, 23 Aug 2020 11:47:59 -0400 Subject: Suppress deprecation warnings from Qt Starting from Qt 5.13, QT_DEPRECATED_WARNINGS is now enabled by default. Unfortunately, methods are often deprecated not long after a suitable alternative is available, meaning that getting rid of these warnings would require breaking backwards compatibility (or sprinkling QT_VERSION checks everywhere). (See QList::fromStdList() as an example, which was marked as deprecated merely a month after range constructors were made available.) This reverts things to how they were before. Getting rid of these warnings will probably be part of the job when porting to Qt 6. --- src/gui/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 85d50ee..aeff39b 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -1,5 +1,9 @@ project(twinkle-gui) +# Suppress deprecation warnings from Qt, as they often would require breaking +# backwards compatibility. +add_definitions(-DQT_NO_DEPRECATED_WARNINGS) + include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -- cgit v1.2.3