summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/address_finder.cpp123
-rw-r--r--src/gui/address_finder.h79
-rw-r--r--src/gui/addresscardform.ui234
-rw-r--r--src/gui/addresscardform.ui.h73
-rw-r--r--src/gui/addresslistviewitem.cpp41
-rw-r--r--src/gui/addresslistviewitem.h36
-rw-r--r--src/gui/authenticationform.ui340
-rw-r--r--src/gui/authenticationform.ui.h44
-rw-r--r--src/gui/buddyform.ui255
-rw-r--r--src/gui/buddyform.ui.h153
-rw-r--r--src/gui/buddylistview.cpp276
-rw-r--r--src/gui/buddylistview.h92
-rw-r--r--src/gui/command_args.h61
-rw-r--r--src/gui/core_strings.h108
-rw-r--r--src/gui/deregisterform.ui105
-rw-r--r--src/gui/deregisterform.ui.h26
-rw-r--r--src/gui/diamondcardprofileform.ui307
-rw-r--r--src/gui/diamondcardprofileform.ui.h151
-rw-r--r--src/gui/dtmfform.ui509
-rw-r--r--src/gui/dtmfform.ui.h177
-rw-r--r--src/gui/freedesksystray.cpp165
-rw-r--r--src/gui/freedesksystray.h94
-rw-r--r--src/gui/getaddressform.ui476
-rw-r--r--src/gui/getaddressform.ui.h259
-rw-r--r--src/gui/getprofilenameform.ui174
-rw-r--r--src/gui/getprofilenameform.ui.h80
-rw-r--r--src/gui/gui.cpp3057
-rw-r--r--src/gui/gui.h396
-rw-r--r--src/gui/historyform.ui475
-rw-r--r--src/gui/historyform.ui.h358
-rw-r--r--src/gui/historylistview.cpp89
-rw-r--r--src/gui/historylistview.h52
-rw-r--r--src/gui/images/1downarrow.pngbin0 -> 579 bytes
-rw-r--r--src/gui/images/1leftarrow-yellow.pngbin0 -> 657 bytes
-rw-r--r--src/gui/images/1leftarrow.pngbin0 -> 614 bytes
-rw-r--r--src/gui/images/1rightarrow.pngbin0 -> 630 bytes
-rw-r--r--src/gui/images/1uparrow.pngbin0 -> 586 bytes
-rw-r--r--src/gui/images/answer-disabled.pngbin0 -> 370 bytes
-rw-r--r--src/gui/images/answer.pngbin0 -> 381 bytes
-rw-r--r--src/gui/images/attach.pngbin0 -> 712 bytes
-rw-r--r--src/gui/images/auto_answer-disabled.pngbin0 -> 520 bytes
-rw-r--r--src/gui/images/auto_answer.pngbin0 -> 809 bytes
-rw-r--r--src/gui/images/buddy.pngbin0 -> 737 bytes
-rw-r--r--src/gui/images/bye-disabled.pngbin0 -> 389 bytes
-rw-r--r--src/gui/images/bye.pngbin0 -> 423 bytes
-rw-r--r--src/gui/images/cancel-disabled.pngbin0 -> 515 bytes
-rw-r--r--src/gui/images/cancel.pngbin0 -> 890 bytes
-rw-r--r--src/gui/images/cf-disabled.pngbin0 -> 441 bytes
-rw-r--r--src/gui/images/cf.pngbin0 -> 628 bytes
-rw-r--r--src/gui/images/clock.pngbin0 -> 2429 bytes
-rw-r--r--src/gui/images/conf-disabled.pngbin0 -> 573 bytes
-rw-r--r--src/gui/images/conf.pngbin0 -> 378 bytes
-rw-r--r--src/gui/images/conference-disabled.pngbin0 -> 375 bytes
-rw-r--r--src/gui/images/conference.pngbin0 -> 456 bytes
-rw-r--r--src/gui/images/consult-xfer.pngbin0 -> 817 bytes
-rw-r--r--src/gui/images/contexthelp.pngbin0 -> 799 bytes
-rw-r--r--src/gui/images/dtmf-0.pngbin0 -> 227 bytes
-rw-r--r--src/gui/images/dtmf-1.pngbin0 -> 155 bytes
-rw-r--r--src/gui/images/dtmf-2.pngbin0 -> 495 bytes
-rw-r--r--src/gui/images/dtmf-3.pngbin0 -> 496 bytes
-rw-r--r--src/gui/images/dtmf-4.pngbin0 -> 420 bytes
-rw-r--r--src/gui/images/dtmf-5.pngbin0 -> 393 bytes
-rw-r--r--src/gui/images/dtmf-6.pngbin0 -> 474 bytes
-rw-r--r--src/gui/images/dtmf-7.pngbin0 -> 481 bytes
-rw-r--r--src/gui/images/dtmf-8.pngbin0 -> 463 bytes
-rw-r--r--src/gui/images/dtmf-9.pngbin0 -> 627 bytes
-rw-r--r--src/gui/images/dtmf-a.pngbin0 -> 232 bytes
-rw-r--r--src/gui/images/dtmf-b.pngbin0 -> 236 bytes
-rw-r--r--src/gui/images/dtmf-c.pngbin0 -> 239 bytes
-rw-r--r--src/gui/images/dtmf-d.pngbin0 -> 223 bytes
-rw-r--r--src/gui/images/dtmf-disabled.pngbin0 -> 374 bytes
-rw-r--r--src/gui/images/dtmf-pound.pngbin0 -> 245 bytes
-rw-r--r--src/gui/images/dtmf-star.pngbin0 -> 247 bytes
-rw-r--r--src/gui/images/dtmf.pngbin0 -> 354 bytes
-rw-r--r--src/gui/images/edit.pngbin0 -> 1242 bytes
-rw-r--r--src/gui/images/edit16.pngbin0 -> 636 bytes
-rw-r--r--src/gui/images/editcopybin0 -> 268 bytes
-rw-r--r--src/gui/images/editcutbin0 -> 214 bytes
-rw-r--r--src/gui/images/editdelete.pngbin0 -> 695 bytes
-rw-r--r--src/gui/images/editpastebin0 -> 293 bytes
-rw-r--r--src/gui/images/encrypted-disabled.pngbin0 -> 481 bytes
-rw-r--r--src/gui/images/encrypted.pngbin0 -> 693 bytes
-rw-r--r--src/gui/images/encrypted32.pngbin0 -> 1583 bytes
-rw-r--r--src/gui/images/encrypted_verified.pngbin0 -> 844 bytes
-rw-r--r--src/gui/images/exit.pngbin0 -> 777 bytes
-rw-r--r--src/gui/images/favorites.pngbin0 -> 4156 bytes
-rw-r--r--src/gui/images/filenewbin0 -> 184 bytes
-rw-r--r--src/gui/images/fileopen-disabled.pngbin0 -> 495 bytes
-rw-r--r--src/gui/images/fileopen.pngbin0 -> 818 bytes
-rw-r--r--src/gui/images/filesavebin0 -> 230 bytes
-rw-r--r--src/gui/images/gear.pngbin0 -> 799 bytes
-rw-r--r--src/gui/images/hold-disabled.pngbin0 -> 329 bytes
-rw-r--r--src/gui/images/hold.pngbin0 -> 488 bytes
-rw-r--r--src/gui/images/invite-disabled.pngbin0 -> 318 bytes
-rw-r--r--src/gui/images/invite.pngbin0 -> 338 bytes
-rw-r--r--src/gui/images/kcmpci.pngbin0 -> 2404 bytes
-rw-r--r--src/gui/images/kcmpci16.pngbin0 -> 836 bytes
-rw-r--r--src/gui/images/kmix.pngbin0 -> 1942 bytes
-rw-r--r--src/gui/images/knotify.pngbin0 -> 1207 bytes
-rw-r--r--src/gui/images/kontact_contacts-disabled.pngbin0 -> 521 bytes
-rw-r--r--src/gui/images/kontact_contacts.pngbin0 -> 840 bytes
-rw-r--r--src/gui/images/kontact_contacts32.pngbin0 -> 3039 bytes
-rw-r--r--src/gui/images/log.pngbin0 -> 1067 bytes
-rw-r--r--src/gui/images/log_small.pngbin0 -> 838 bytes
-rw-r--r--src/gui/images/message.pngbin0 -> 496 bytes
-rw-r--r--src/gui/images/message32.pngbin0 -> 959 bytes
-rw-r--r--src/gui/images/mime_application.pngbin0 -> 966 bytes
-rw-r--r--src/gui/images/mime_audio.pngbin0 -> 1950 bytes
-rw-r--r--src/gui/images/mime_image.pngbin0 -> 1892 bytes
-rw-r--r--src/gui/images/mime_text.pngbin0 -> 1250 bytes
-rw-r--r--src/gui/images/mime_video.pngbin0 -> 2028 bytes
-rw-r--r--src/gui/images/missed-disabled.pngbin0 -> 411 bytes
-rw-r--r--src/gui/images/missed.pngbin0 -> 677 bytes
-rw-r--r--src/gui/images/mute-disabled.pngbin0 -> 399 bytes
-rw-r--r--src/gui/images/mute.pngbin0 -> 343 bytes
-rw-r--r--src/gui/images/mwi_failure16.pngbin0 -> 898 bytes
-rw-r--r--src/gui/images/mwi_new16.pngbin0 -> 823 bytes
-rw-r--r--src/gui/images/mwi_none.pngbin0 -> 2112 bytes
-rw-r--r--src/gui/images/mwi_none16.pngbin0 -> 790 bytes
-rw-r--r--src/gui/images/mwi_none16_dis.pngbin0 -> 793 bytes
-rw-r--r--src/gui/images/network.pngbin0 -> 2334 bytes
-rw-r--r--src/gui/images/no-indication.pngbin0 -> 444 bytes
-rw-r--r--src/gui/images/ok.pngbin0 -> 661 bytes
-rw-r--r--src/gui/images/package_network.pngbin0 -> 2052 bytes
-rw-r--r--src/gui/images/package_system.pngbin0 -> 2521 bytes
-rw-r--r--src/gui/images/password.pngbin0 -> 3302 bytes
-rw-r--r--src/gui/images/penguin-small.pngbin0 -> 964 bytes
-rw-r--r--src/gui/images/penguin.pngbin0 -> 2016 bytes
-rw-r--r--src/gui/images/penguin_big.pngbin0 -> 6775 bytes
-rw-r--r--src/gui/images/presence.pngbin0 -> 764 bytes
-rw-r--r--src/gui/images/presence_failed.pngbin0 -> 832 bytes
-rw-r--r--src/gui/images/presence_offline.pngbin0 -> 849 bytes
-rw-r--r--src/gui/images/presence_online.pngbin0 -> 848 bytes
-rw-r--r--src/gui/images/presence_rejected.pngbin0 -> 896 bytes
-rw-r--r--src/gui/images/presence_unknown.pngbin0 -> 688 bytes
-rw-r--r--src/gui/images/printbin0 -> 709 bytes
-rw-r--r--src/gui/images/qt-logo.pngbin0 -> 650 bytes
-rw-r--r--src/gui/images/redial-disabled.pngbin0 -> 385 bytes
-rw-r--r--src/gui/images/redial.pngbin0 -> 425 bytes
-rw-r--r--src/gui/images/redirect-disabled.pngbin0 -> 326 bytes
-rw-r--r--src/gui/images/redirect.pngbin0 -> 387 bytes
-rw-r--r--src/gui/images/redobin0 -> 204 bytes
-rw-r--r--src/gui/images/reg-query.pngbin0 -> 824 bytes
-rw-r--r--src/gui/images/reg_failed-disabled.pngbin0 -> 583 bytes
-rw-r--r--src/gui/images/reg_failed.pngbin0 -> 950 bytes
-rw-r--r--src/gui/images/reject-disabled.pngbin0 -> 361 bytes
-rw-r--r--src/gui/images/reject.pngbin0 -> 392 bytes
-rw-r--r--src/gui/images/save_as.pngbin0 -> 838 bytes
-rw-r--r--src/gui/images/searchfindbin0 -> 658 bytes
-rw-r--r--src/gui/images/settings.pngbin0 -> 807 bytes
-rw-r--r--src/gui/images/stat_conference.pngbin0 -> 852 bytes
-rw-r--r--src/gui/images/stat_established.pngbin0 -> 830 bytes
-rw-r--r--src/gui/images/stat_established_nomedia.pngbin0 -> 531 bytes
-rw-r--r--src/gui/images/stat_mute.pngbin0 -> 696 bytes
-rw-r--r--src/gui/images/stat_outgoing.pngbin0 -> 850 bytes
-rw-r--r--src/gui/images/stat_ringing.pngbin0 -> 581 bytes
-rw-r--r--src/gui/images/sys_auto_ans.pngbin0 -> 1468 bytes
-rw-r--r--src/gui/images/sys_auto_ans_dis.pngbin0 -> 851 bytes
-rw-r--r--src/gui/images/sys_busy_estab.pngbin0 -> 1464 bytes
-rw-r--r--src/gui/images/sys_busy_estab_dis.pngbin0 -> 861 bytes
-rw-r--r--src/gui/images/sys_busy_trans.pngbin0 -> 1338 bytes
-rw-r--r--src/gui/images/sys_busy_trans_dis.pngbin0 -> 763 bytes
-rw-r--r--src/gui/images/sys_dnd.pngbin0 -> 1463 bytes
-rw-r--r--src/gui/images/sys_dnd_dis.pngbin0 -> 815 bytes
-rw-r--r--src/gui/images/sys_encrypted.pngbin0 -> 1380 bytes
-rw-r--r--src/gui/images/sys_encrypted_dis.pngbin0 -> 813 bytes
-rw-r--r--src/gui/images/sys_encrypted_verified.pngbin0 -> 1471 bytes
-rw-r--r--src/gui/images/sys_encrypted_verified_dis.pngbin0 -> 840 bytes
-rw-r--r--src/gui/images/sys_hold.pngbin0 -> 1247 bytes
-rw-r--r--src/gui/images/sys_hold_dis.pngbin0 -> 713 bytes
-rw-r--r--src/gui/images/sys_idle.pngbin0 -> 1254 bytes
-rw-r--r--src/gui/images/sys_idle_dis.pngbin0 -> 722 bytes
-rw-r--r--src/gui/images/sys_missed.pngbin0 -> 1473 bytes
-rw-r--r--src/gui/images/sys_missed_dis.pngbin0 -> 808 bytes
-rw-r--r--src/gui/images/sys_mute.pngbin0 -> 1335 bytes
-rw-r--r--src/gui/images/sys_mute_dis.pngbin0 -> 771 bytes
-rw-r--r--src/gui/images/sys_mwi.pngbin0 -> 1422 bytes
-rw-r--r--src/gui/images/sys_mwi_dis.pngbin0 -> 1431 bytes
-rw-r--r--src/gui/images/sys_redir.pngbin0 -> 1510 bytes
-rw-r--r--src/gui/images/sys_redir_dis.pngbin0 -> 865 bytes
-rw-r--r--src/gui/images/sys_services.pngbin0 -> 1346 bytes
-rw-r--r--src/gui/images/sys_services_dis.pngbin0 -> 760 bytes
-rw-r--r--src/gui/images/telephone-hook.pngbin0 -> 616 bytes
-rw-r--r--src/gui/images/transfer-disabled.pngbin0 -> 333 bytes
-rw-r--r--src/gui/images/transfer.pngbin0 -> 424 bytes
-rw-r--r--src/gui/images/twinkle16-disabled.pngbin0 -> 449 bytes
-rw-r--r--src/gui/images/twinkle16.pngbin0 -> 669 bytes
-rw-r--r--src/gui/images/twinkle24.pngbin0 -> 1254 bytes
-rw-r--r--src/gui/images/twinkle32.pngbin0 -> 1892 bytes
-rw-r--r--src/gui/images/twinkle48.pngbin0 -> 3461 bytes
-rw-r--r--src/gui/images/undobin0 -> 212 bytes
-rw-r--r--src/gui/images/yast_PhoneTTOffhook.pngbin0 -> 2821 bytes
-rw-r--r--src/gui/images/yast_babelfish.pngbin0 -> 2177 bytes
-rw-r--r--src/gui/inviteform.ui369
-rw-r--r--src/gui/inviteform.ui.h153
-rw-r--r--src/gui/lang/Makefile.am38
-rw-r--r--src/gui/lang/twinkle_cs.ts6039
-rw-r--r--src/gui/lang/twinkle_de.ts6071
-rw-r--r--src/gui/lang/twinkle_fr.ts6038
-rw-r--r--src/gui/lang/twinkle_nl.ts6066
-rw-r--r--src/gui/lang/twinkle_ru.ts5729
-rw-r--r--src/gui/lang/twinkle_sv.ts5772
-rw-r--r--src/gui/lang/twinkle_xx.ts5669
-rw-r--r--src/gui/logviewform.ui123
-rw-r--r--src/gui/logviewform.ui.h98
-rw-r--r--src/gui/main.cpp1201
-rw-r--r--src/gui/messageform.ui325
-rw-r--r--src/gui/messageform.ui.h616
-rw-r--r--src/gui/messageformview.cpp159
-rw-r--r--src/gui/messageformview.h43
-rw-r--r--src/gui/mphoneform.ui2851
-rw-r--r--src/gui/mphoneform.ui.h3126
-rw-r--r--src/gui/numberconversionform.ui175
-rw-r--r--src/gui/numberconversionform.ui.h84
-rw-r--r--src/gui/qt_translator.h43
-rw-r--r--src/gui/redirectform.ui308
-rw-r--r--src/gui/redirectform.ui.h157
-rw-r--r--src/gui/selectnicform.ui212
-rw-r--r--src/gui/selectnicform.ui.h89
-rw-r--r--src/gui/selectprofileform.ui414
-rw-r--r--src/gui/selectprofileform.ui.h631
-rw-r--r--src/gui/selectuserform.ui206
-rw-r--r--src/gui/selectuserform.ui.h138
-rw-r--r--src/gui/sendfileform.ui217
-rw-r--r--src/gui/sendfileform.ui.h106
-rw-r--r--src/gui/srvredirectform.ui819
-rw-r--r--src/gui/srvredirectform.ui.h389
-rw-r--r--src/gui/syssettingsform.ui1854
-rw-r--r--src/gui/syssettingsform.ui.h489
-rw-r--r--src/gui/termcapform.ui241
-rw-r--r--src/gui/termcapform.ui.h101
-rw-r--r--src/gui/textbrowsernoautolink.h48
-rw-r--r--src/gui/transferform.ui270
-rw-r--r--src/gui/transferform.ui.h195
-rw-r--r--src/gui/twinkle.pro237
-rw-r--r--src/gui/twinkleapplication.cpp47
-rw-r--r--src/gui/twinkleapplication.h44
-rw-r--r--src/gui/twinklesystray.cpp38
-rw-r--r--src/gui/twinklesystray.h47
-rw-r--r--src/gui/userprofileform.ui5758
-rw-r--r--src/gui/userprofileform.ui.h1458
-rw-r--r--src/gui/wizardform.ui367
-rw-r--r--src/gui/wizardform.ui.h263
-rw-r--r--src/gui/yesnodialog.cpp86
-rw-r--r--src/gui/yesnodialog.h56
245 files changed, 74938 insertions, 0 deletions
diff --git a/src/gui/address_finder.cpp b/src/gui/address_finder.cpp
new file mode 100644
index 0000000..1e692e2
--- /dev/null
+++ b/src/gui/address_finder.cpp
@@ -0,0 +1,123 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include "address_finder.h"
+#include "gui.h"
+#include "log.h"
+
+t_address_finder *t_address_finder::instance = NULL;
+t_mutex t_address_finder::mtx_instance;
+
+t_address_finder::t_address_finder() {
+#ifdef HAVE_KDE
+ // Load KAddressbook asynchronously. An LDAP address book
+ // may take a while to load completely. This should not block
+ // an incoming call. For the first call it may happen that an
+ // address cannot be found as loading is still in progress.
+ // This is an inconvenience, but will not harm the call.
+ abook = KABC::StdAddressBook::self(true);
+ connect(abook,
+ SIGNAL(addressBookChanged(AddressBook *)),
+ this, SLOT(invalidate_cache()));
+
+ log_file->write_report("Preload KAddressbook.", "t_address_finder::t_address_finder");
+#endif
+}
+
+void t_address_finder::find_address(t_user *user_config, const t_url &u)
+{
+ if (u == last_url) return;
+
+ last_url = u;
+ last_name.clear();
+ last_photo = QImage();
+
+#ifdef HAVE_KDE
+ for (KABC::AddressBook::Iterator i = abook->begin(); i != abook->end(); i++)
+ {
+ // Normalize url using number conversion rules
+ t_url u_normalized(u);
+ u_normalized.apply_conversion_rules(user_config);
+
+ KABC::PhoneNumber::List phoneNrs = i->phoneNumbers();
+ for (KABC::PhoneNumber::List::iterator j = phoneNrs.begin();
+ j != phoneNrs.end(); j++)
+ {
+ QString phone = (*j).number();
+ string full_address = ui->expand_destination(
+ user_config, phone.ascii(), u_normalized.get_scheme());
+
+ t_url url_phone(full_address);
+ if (!url_phone.is_valid()) continue;
+
+ if (u_normalized.user_host_match(url_phone,
+ user_config->get_remove_special_phone_symbols(),
+ user_config->get_special_phone_symbols()))
+ {
+ last_name = i->realName().ascii();
+ last_photo = i->photo().data();
+ last_photo.detach(); // avoid sharing of QImage with kabc
+ return;
+ }
+ }
+ }
+#endif
+}
+
+void t_address_finder::preload(void) {
+ // The address book is preloaded on creation of the
+ // singleton instance.
+ (void)t_address_finder::get_instance();
+}
+
+t_address_finder *t_address_finder::get_instance(void) {
+ mtx_instance.lock();
+ if (!instance) {
+ instance = new t_address_finder();
+ // No MEMMAN audit as this instance will only be
+ // cleaned up by process termination.
+ }
+ mtx_instance.unlock();
+
+ return instance;
+}
+
+string t_address_finder::find_name(t_user *user_config, const t_url &u) {
+ mtx_finder.lock();
+ find_address(user_config, u);
+ string name = last_name;
+ mtx_finder.unlock();
+ return name;
+}
+
+QImage t_address_finder:: find_photo(t_user *user_config, const t_url &u) {
+ mtx_finder.lock();
+ find_address(user_config, u);
+ QImage photo = last_photo;
+ mtx_finder.unlock();
+ return photo;
+}
+
+void t_address_finder::invalidate_cache(void) {
+ mtx_finder.lock();
+ last_url.set_url("");
+ mtx_finder.unlock();
+ log_file->write_report("Address finder cache invalidated.",
+ " t_address_finder::invalidate_cache",
+ LOG_NORMAL, LOG_DEBUG);
+}
diff --git a/src/gui/address_finder.h b/src/gui/address_finder.h
new file mode 100644
index 0000000..0872728
--- /dev/null
+++ b/src/gui/address_finder.h
@@ -0,0 +1,79 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef _ADDRESS_FINDER_H
+#define _ADDRESS_FINDER_H
+
+#include "twinkle_config.h"
+
+#include <string>
+#include "user.h"
+#include "sockets/url.h"
+#include "threads/mutex.h"
+#include "qobject.h"
+#include "qimage.h"
+
+#ifdef HAVE_KDE
+#include <kabc/addressbook.h>
+#include <kabc/addressee.h>
+#include <kabc/addresseelist.h>
+#include <kabc/phonenumber.h>
+#include <kabc/stdaddressbook.h>
+#endif
+
+using namespace std;
+
+class t_address_finder : public QObject {
+private:
+ Q_OBJECT
+ static t_address_finder *instance;
+ static t_mutex mtx_instance;
+
+ t_mutex mtx_finder;
+#ifdef HAVE_KDE
+ KABC::AddressBook *abook;
+#endif
+
+ // Cached data for the last looked up URL.
+ t_url last_url;
+ string last_name;
+ QImage last_photo;
+
+ t_address_finder();
+
+ // Find the address based on a URL and put the found
+ // data in the cache.
+ void find_address(t_user *user_config, const t_url &u);
+
+public:
+ // Preload KAddressbook
+ static void preload(void);
+
+ static t_address_finder *get_instance(void);
+
+ // Find a name given a URL
+ string find_name(t_user *user_config, const t_url &u);
+
+ // Find a photo give a URL
+ QImage find_photo(t_user *user_config, const t_url &u);
+
+public slots:
+ void invalidate_cache(void);
+};
+
+#endif
diff --git a/src/gui/addresscardform.ui b/src/gui/addresscardform.ui
new file mode 100644
index 0000000..7532b11
--- /dev/null
+++ b/src/gui/addresscardform.ui
@@ -0,0 +1,234 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>AddressCardForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>AddressCardForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>604</width>
+ <height>209</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Address Card</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout73</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>remarkTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Remark:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>remarkLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>infixNameLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Infix name of contact.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>firstNameLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>First name of contact.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>firstNameTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;First name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>firstNameLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="4" column="1">
+ <property name="name">
+ <cstring>remarkLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>You may place any remark about the contact here.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>phoneTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Phone:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>phoneLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>infixNameTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Infix name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>infixNameLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>phoneLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Phone number or SIP address of contact.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>lastNameLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Last name of contact.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>lastNameTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Last name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>lastNameLineEdit</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer100</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout72</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer99</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>261</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string>Alt+O</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string>Alt+C</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>AddressCardForm</receiver>
+ <slot>validate()</slot>
+ </connection>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>AddressCardForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>firstNameLineEdit</tabstop>
+ <tabstop>infixNameLineEdit</tabstop>
+ <tabstop>lastNameLineEdit</tabstop>
+ <tabstop>phoneLineEdit</tabstop>
+ <tabstop>remarkLineEdit</tabstop>
+ <tabstop>okPushButton</tabstop>
+ <tabstop>cancelPushButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in declaration">address_book.h</include>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">addresscardform.ui.h</include>
+</includes>
+<slots>
+ <slot>validate()</slot>
+</slots>
+<functions>
+ <function returnType="int">exec( t_address_card &amp; card )</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/addresscardform.ui.h b/src/gui/addresscardform.ui.h
new file mode 100644
index 0000000..f6ff3f6
--- /dev/null
+++ b/src/gui/addresscardform.ui.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you want to add, delete, or rename functions or slots, use
+** Qt Designer to update this file, preserving your code.
+**
+** You should not define a constructor or destructor in this file.
+** Instead, write your code in functions called init() and destroy().
+** These will automatically be called by the form's constructor and
+** destructor.
+*****************************************************************************/
+
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+int AddressCardForm::exec(t_address_card &card) {
+ firstNameLineEdit->setText(card.name_first.c_str());
+ infixNameLineEdit->setText(card.name_infix.c_str());
+ lastNameLineEdit->setText(card.name_last.c_str());
+ phoneLineEdit->setText(card.sip_address.c_str());
+ remarkLineEdit->setText(card.remark.c_str());
+
+ int retval = QDialog::exec();
+
+ if (retval == QDialog::Accepted) {
+ card.name_first = firstNameLineEdit->text().stripWhiteSpace().ascii();
+ card.name_infix = infixNameLineEdit->text().stripWhiteSpace().ascii();
+ card.name_last = lastNameLineEdit->text().stripWhiteSpace().ascii();
+ card.sip_address = phoneLineEdit->text().stripWhiteSpace().ascii();
+ card.remark = remarkLineEdit->text().stripWhiteSpace().ascii();
+ }
+
+ return retval;
+}
+
+void AddressCardForm::validate()
+{
+ QString firstName = firstNameLineEdit->text().stripWhiteSpace();
+ QString infixName = infixNameLineEdit->text().stripWhiteSpace();
+ QString lastName = lastNameLineEdit->text().stripWhiteSpace();
+ QString phone = phoneLineEdit->text().stripWhiteSpace();
+
+ if (firstName.isEmpty() && infixName.isEmpty() && lastName.isEmpty()) {
+ ((t_gui *)ui)->cb_show_msg(this,
+ tr("You must fill in a name.").ascii(), MSG_CRITICAL);
+ firstNameLineEdit->setFocus();
+ return;
+ }
+
+ if (phone.isEmpty()) {
+ ((t_gui *)ui)->cb_show_msg(this,
+ tr("You must fill in a phone number or SIP address.").ascii(), MSG_CRITICAL);
+ phoneLineEdit->setFocus();
+ return;
+ }
+
+ accept();
+}
diff --git a/src/gui/addresslistviewitem.cpp b/src/gui/addresslistviewitem.cpp
new file mode 100644
index 0000000..9c927f6
--- /dev/null
+++ b/src/gui/addresslistviewitem.cpp
@@ -0,0 +1,41 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include "addresslistviewitem.h"
+
+// Columns
+#define COL_ADDR_NAME 0
+#define COL_ADDR_PHONE 1
+#define COL_ADDR_REMARK 2
+
+AddressListViewItem::AddressListViewItem(QListView *parent, const t_address_card &card) :
+ QListViewItem(parent, card.get_display_name().c_str(),
+ card.sip_address.c_str(), card.remark.c_str()),
+ address_card(card)
+{}
+
+t_address_card AddressListViewItem::getAddressCard(void) const {
+ return address_card;
+}
+
+void AddressListViewItem::update(const t_address_card &card) {
+ address_card = card;
+ setText(COL_ADDR_NAME, card.get_display_name().c_str());
+ setText(COL_ADDR_PHONE, card.sip_address.c_str());
+ setText(COL_ADDR_REMARK, card.remark.c_str());
+}
diff --git a/src/gui/addresslistviewitem.h b/src/gui/addresslistviewitem.h
new file mode 100644
index 0000000..7e1a960
--- /dev/null
+++ b/src/gui/addresslistviewitem.h
@@ -0,0 +1,36 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef _ADDRESSLISTVIEWITEM_H
+#define _ADDRESSLISTVIEWITEM_H
+
+#include "address_book.h"
+#include "qlistview.h"
+
+class AddressListViewItem : public QListViewItem {
+private:
+ t_address_card address_card;
+
+public:
+ AddressListViewItem(QListView *parent, const t_address_card &card);
+ t_address_card getAddressCard(void) const;
+ void update(const t_address_card &card);
+};
+
+
+#endif
diff --git a/src/gui/authenticationform.ui b/src/gui/authenticationform.ui
new file mode 100644
index 0000000..acd98d1
--- /dev/null
+++ b/src/gui/authenticationform.ui
@@ -0,0 +1,340 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>AuthenticationForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>AuthenticationForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>582</width>
+ <height>198</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Authentication</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="5" colspan="1">
+ <property name="name">
+ <cstring>layout33</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>authIconTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>password.png</pixmap>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer46</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>51</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>userValueTextLabel</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>0</red>
+ <green>85</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="text">
+ <string>user</string>
+ <comment>No need to translate</comment>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The user for which authentication is requested.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>profileValueTextLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>0</red>
+ <green>85</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="text">
+ <string>profile</string>
+ <comment>No need to translate</comment>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The user profile of the user for which authentication is requested.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>profileTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>User profile:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>userTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>User:</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="1">
+ <property name="name">
+ <cstring>layout10</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>passwordTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Password:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>passwordLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>passwordLineEdit</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>200</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="echoMode">
+ <enum>Password</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Your password for authentication.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>usernameLineEdit</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>200</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>usernameTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;User name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>usernameLineEdit</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="3" column="1">
+ <property name="name">
+ <cstring>spacer13</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="4" column="1">
+ <property name="name">
+ <cstring>layout22</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer12</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>101</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>layout13</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>authTextLabel</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Login required for realm:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>realmTextLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>0</red>
+ <green>85</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="text">
+ <string>realm</string>
+ <comment>No need to translate</comment>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The realm for which you need to authenticate.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>AuthenticationForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>AuthenticationForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>usernameLineEdit</tabstop>
+ <tabstop>passwordLineEdit</tabstop>
+ <tabstop>okPushButton</tabstop>
+ <tabstop>cancelPushButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in declaration">user.h</include>
+ <include location="local" impldecl="in implementation">authenticationform.ui.h</include>
+</includes>
+<functions>
+ <function returnType="int">exec( t_user * user_config, const QString &amp; realm, QString &amp; username, QString &amp; password )</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/authenticationform.ui.h b/src/gui/authenticationform.ui.h
new file mode 100644
index 0000000..a2e0905
--- /dev/null
+++ b/src/gui/authenticationform.ui.h
@@ -0,0 +1,44 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+
+int AuthenticationForm::exec(t_user *user_config, const QString &realm, QString &username,
+ QString &password)
+{
+ int retval;
+
+ profileValueTextLabel->setText(user_config->get_profile_name().c_str());
+ userValueTextLabel->setText(user_config->get_display_uri().c_str());
+ realmTextLabel->setText(realm);
+ usernameLineEdit->setText(username);
+ passwordLineEdit->setText(password);
+ if (!username.isEmpty()) passwordLineEdit->setFocus();
+ retval = QDialog::exec();
+ username = usernameLineEdit->text();
+ password = passwordLineEdit->text();
+
+ return retval;
+}
diff --git a/src/gui/buddyform.ui b/src/gui/buddyform.ui
new file mode 100644
index 0000000..16369d2
--- /dev/null
+++ b/src/gui/buddyform.ui
@@ -0,0 +1,255 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>BuddyForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>BuddyForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>484</width>
+ <height>154</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Buddy</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout12</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="1" column="2" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>spacer25</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>47</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QToolButton" row="0" column="2">
+ <property name="name">
+ <cstring>addressToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>kontact_contacts.png</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Address book</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select an address from the address book.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>phoneTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Phone:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>phoneLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>nameLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Name of your buddy.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>subscribeCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Show availability</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this option if you want to see the availability of your buddy. This will only work if your provider offers a presence agent.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>nameTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>nameLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>phoneLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>SIP address your buddy.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer14</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout54</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer13</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>131</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string>Alt+O</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string>Alt+C</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>BuddyForm</receiver>
+ <slot>validate()</slot>
+ </connection>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>BuddyForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>addressToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>BuddyForm</receiver>
+ <slot>showAddressBook()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>nameLineEdit</tabstop>
+ <tabstop>phoneLineEdit</tabstop>
+ <tabstop>subscribeCheckBox</tabstop>
+ <tabstop>addressToolButton</tabstop>
+ <tabstop>okPushButton</tabstop>
+ <tabstop>cancelPushButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in declaration">presence/buddy.h</include>
+ <include location="local" impldecl="in declaration">user.h</include>
+ <include location="local" impldecl="in declaration">qlistview.h</include>
+ <include location="local" impldecl="in declaration">getaddressform.h</include>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">sockets/url.h</include>
+ <include location="local" impldecl="in implementation">buddylistview.h</include>
+ <include location="local" impldecl="in implementation">audits/memman.h</include>
+ <include location="local" impldecl="in implementation">buddyform.ui.h</include>
+</includes>
+<variables>
+ <variable access="private">GetAddressForm *getAddressForm;</variable>
+ <variable access="private">t_user *user_config;</variable>
+ <variable access="private">bool edit_mode;</variable>
+ <variable access="private">t_buddy_list *buddy_list;</variable>
+ <variable access="private">t_buddy *edit_buddy;</variable>
+ <variable access="private">QListViewItem *profileItem;</variable>
+</variables>
+<slots>
+ <slot>showNew( t_buddy_list &amp; _buddy_list, QListViewItem * _profileItem )</slot>
+ <slot>showEdit( t_buddy &amp; buddy )</slot>
+ <slot>validate()</slot>
+ <slot>showAddressBook()</slot>
+ <slot>selectedAddress( const QString &amp; name, const QString &amp; phone )</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function access="private" specifier="non virtual">destroy()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/buddyform.ui.h b/src/gui/buddyform.ui.h
new file mode 100644
index 0000000..d7f0714
--- /dev/null
+++ b/src/gui/buddyform.ui.h
@@ -0,0 +1,153 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you want to add, delete, or rename functions or slots, use
+** Qt Designer to update this file, preserving your code.
+**
+** You should not define a constructor or destructor in this file.
+** Instead, write your code in functions called init() and destroy().
+** These will automatically be called by the form's constructor and
+** destructor.
+*****************************************************************************/
+
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+void BuddyForm::init()
+{
+ getAddressForm = 0;
+}
+
+void BuddyForm::destroy()
+{
+ if (getAddressForm) {
+ MEMMAN_DELETE(getAddressForm);
+ delete getAddressForm;
+ }
+}
+
+void BuddyForm::showNew(t_buddy_list &_buddy_list, QListViewItem *_profileItem)
+{
+ user_config = _buddy_list.get_user_profile();
+ edit_mode = false;
+ buddy_list = &_buddy_list;
+ profileItem = _profileItem;
+
+ QDialog::show();
+}
+
+void BuddyForm::showEdit(t_buddy &buddy)
+{
+ user_config = buddy.get_user_profile();
+ edit_mode = true;
+ edit_buddy = &buddy;
+ buddy_list = edit_buddy->get_buddy_list();
+
+ nameLineEdit->setText(buddy.get_name().c_str());
+ phoneLineEdit->setText(buddy.get_sip_address().c_str());
+ subscribeCheckBox->setChecked(buddy.get_may_subscribe_presence());
+
+ phoneLineEdit->setEnabled(false);
+ phoneTextLabel->setEnabled(false);
+ addressToolButton->hide();
+
+ QDialog::show();
+}
+
+void BuddyForm::validate()
+{
+ QString name = nameLineEdit->text().stripWhiteSpace();
+ QString address = phoneLineEdit->text().stripWhiteSpace();
+
+ if (name.isEmpty()) {
+ ((t_gui *)ui)->cb_show_msg(this,
+ tr("You must fill in a name.").ascii(), MSG_CRITICAL);
+ nameLineEdit->setFocus();
+ return;
+ }
+
+ string dest = ui->expand_destination(user_config, address.ascii());
+ t_url dest_url(dest);
+ if (!dest_url.is_valid()) {
+ ((t_gui *)ui)->cb_show_msg(this,
+ tr("Invalid phone.").ascii(), MSG_CRITICAL);
+ phoneLineEdit->setFocus();
+ return;
+ }
+
+ if (edit_mode) {
+ // Edit existing buddy
+ bool must_subscribe = false;
+ bool must_unsubscribe = false;
+
+ if (edit_buddy->get_may_subscribe_presence() != subscribeCheckBox->isChecked())
+ {
+ if (subscribeCheckBox->isChecked()) {
+ must_subscribe = true;;
+ } else {
+ must_unsubscribe = true;
+ }
+ }
+
+ edit_buddy->set_name(nameLineEdit->text().stripWhiteSpace().ascii());
+ edit_buddy->set_sip_address(phoneLineEdit->text().stripWhiteSpace().ascii());
+ edit_buddy->set_may_subscribe_presence(subscribeCheckBox->isChecked());
+
+ if (must_subscribe) edit_buddy->subscribe_presence();
+ if (must_unsubscribe) edit_buddy->unsubscribe_presence();
+ } else {
+ // Add a new buddy
+ t_buddy buddy;
+ buddy.set_name(nameLineEdit->text().stripWhiteSpace().ascii());
+ buddy.set_sip_address(phoneLineEdit->text().stripWhiteSpace().ascii());
+ buddy.set_may_subscribe_presence(subscribeCheckBox->isChecked());
+
+ t_buddy *new_buddy = buddy_list->add_buddy(buddy);
+ new BuddyListViewItem(profileItem, new_buddy);
+ new_buddy->subscribe_presence();
+ }
+
+ string err_msg;
+ if (!buddy_list->save(err_msg)) {
+ QString msg = tr("Failed to save buddy list: %1").arg(err_msg.c_str());
+ ((t_gui *)ui)->cb_show_msg(this, msg.ascii(), MSG_CRITICAL);
+ }
+
+ accept();
+}
+
+void BuddyForm::showAddressBook()
+{
+ if (!getAddressForm) {
+ getAddressForm = new GetAddressForm(
+ this, "select address", true);
+ MEMMAN_NEW(getAddressForm);
+ }
+
+ connect(getAddressForm,
+ SIGNAL(address(const QString &, const QString &)),
+ this, SLOT(selectedAddress(const QString &, const QString &)));
+
+ getAddressForm->show();
+}
+
+void BuddyForm::selectedAddress(const QString &name, const QString &phone)
+{
+ nameLineEdit->setText(name);
+ phoneLineEdit->setText(phone);
+}
diff --git a/src/gui/buddylistview.cpp b/src/gui/buddylistview.cpp
new file mode 100644
index 0000000..60f8ffc
--- /dev/null
+++ b/src/gui/buddylistview.cpp
@@ -0,0 +1,276 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include "buddylistview.h"
+
+#include "gui.h"
+
+#include "qapplication.h"
+#include "qfont.h"
+#include "qheader.h"
+#include "qpixmap.h"
+#include "qrect.h"
+#include "qsize.h"
+#include "qstylesheet.h"
+
+void AbstractBLVItem::set_icon(t_presence_state::t_basic_state state) {
+ switch (state) {
+ case t_presence_state::ST_BASIC_UNKNOWN:
+ setPixmap(0, QPixmap::fromMimeSource("presence_unknown.png"));
+ break;
+ case t_presence_state::ST_BASIC_CLOSED:
+ setPixmap(0, QPixmap::fromMimeSource("presence_offline.png"));
+ break;
+ case t_presence_state::ST_BASIC_OPEN:
+ setPixmap(0, QPixmap::fromMimeSource("presence_online.png"));
+ break;
+ case t_presence_state::ST_BASIC_FAILED:
+ setPixmap(0, QPixmap::fromMimeSource("presence_failed.png"));
+ break;
+ case t_presence_state::ST_BASIC_REJECTED:
+ setPixmap(0, QPixmap::fromMimeSource("presence_rejected.png"));
+ break;
+ default:
+ setPixmap(0, QPixmap::fromMimeSource("presence_unknown.png"));
+ break;
+ }
+}
+
+AbstractBLVItem::AbstractBLVItem(QListViewItem *parent, const QString &text) :
+ QListViewItem(parent, text)
+{}
+
+AbstractBLVItem::AbstractBLVItem(QListView *parent, const QString &text) :
+ QListViewItem(parent, text)
+{}
+
+AbstractBLVItem::~AbstractBLVItem() {}
+
+QString AbstractBLVItem::get_tip(void) {
+ return tip;
+}
+
+
+void BuddyListViewItem::set_icon(void) {
+ t_user *user_config = buddy->get_user_profile();
+ string url_str = ui->expand_destination(user_config, buddy->get_sip_address());
+
+ tip = "<html>";
+ tip += QStyleSheet::escape(ui->format_sip_address(user_config, buddy->get_name(), t_url(url_str)).c_str()).replace(' ', "&nbsp;");
+
+ if (!buddy->get_may_subscribe_presence()) {
+ setPixmap(0, QPixmap::fromMimeSource("buddy.png"));
+ } else {
+ QString failure;
+ t_presence_state::t_basic_state basic_state = buddy->
+ get_presence_state()->get_basic_state();
+ AbstractBLVItem::set_icon(basic_state);
+
+ tip += "<br>";
+ tip += "<b>";
+ tip += qApp->translate("BuddyList", "Availability");
+ tip += ":&nbsp;</b>";
+
+ switch (basic_state) {
+ case t_presence_state::ST_BASIC_UNKNOWN:
+ tip += qApp->translate("BuddyList", "unknown");
+ break;
+ case t_presence_state::ST_BASIC_CLOSED:
+ tip += qApp->translate("BuddyList", "offline");
+ break;
+ case t_presence_state::ST_BASIC_OPEN:
+ tip += qApp->translate("BuddyList", "online");
+ break;
+ case t_presence_state::ST_BASIC_FAILED:
+ tip += qApp->translate("BuddyList", "request failed");
+ failure = buddy->get_presence_state()->get_failure_msg().c_str();
+ if (!failure.isEmpty()) {
+ tip += QString(" (%1)").arg(failure);
+ }
+ break;
+ case t_presence_state::ST_BASIC_REJECTED:
+ tip += qApp->translate("BuddyList", "request rejected");
+ break;
+ default:
+ tip += qApp->translate("BuddyList", "unknown");
+ break;
+ }
+ }
+
+ tip += "</html>";
+ tip = tip.replace(' ', "&nbsp;");
+}
+
+BuddyListViewItem::BuddyListViewItem(QListViewItem *parent, t_buddy *_buddy) :
+ AbstractBLVItem(parent, _buddy->get_name().c_str()),
+ buddy(_buddy)
+{
+ set_icon();
+ buddy->attach(this);
+}
+
+BuddyListViewItem::~BuddyListViewItem() {
+ buddy->detach(this);
+}
+
+void BuddyListViewItem::update(void) {
+ // This method is called directly from the core, so lock the GUI
+ ui->lock();
+ set_icon();
+
+ if (buddy->get_name().c_str() != text(0)) {
+ setText(0, buddy->get_name().c_str());
+ QListViewItem::parent()->sort();
+ }
+ ui->unlock();
+}
+
+void BuddyListViewItem::subject_destroyed(void) {
+ delete this;
+}
+
+t_buddy *BuddyListViewItem::get_buddy(void) {
+ return buddy;
+}
+
+
+void BLViewUserItem::set_icon(void) {
+ t_presence_state::t_basic_state basic_state;
+ QString failure;
+ QString profile_name = presence_epa->get_user_profile()->get_profile_name().c_str();
+
+ tip = "<html>";
+ tip += QStyleSheet::escape(profile_name);
+ tip += "<br>";
+ tip += "<b>";
+ tip += qApp->translate("BuddyList", "Availability");
+ tip += ":&nbsp;</b>";
+
+ switch (presence_epa->get_epa_state()) {
+ case t_presence_epa::EPA_UNPUBLISHED:
+ tip += qApp->translate("BuddyList", "not published");
+ setPixmap(0, QPixmap::fromMimeSource("penguin-small.png"));
+ break;
+ case t_presence_epa::EPA_FAILED:
+ tip += qApp->translate("BuddyList", "failed to publish");
+ failure = presence_epa->get_failure_msg().c_str();
+ if (!failure.isEmpty()) {
+ tip += QString(" (%1)").arg(failure);
+ }
+ setPixmap(0, QPixmap::fromMimeSource("presence_failed.png"));
+ break;
+ case t_presence_epa::EPA_PUBLISHED:
+ basic_state = presence_epa->get_basic_state();
+ AbstractBLVItem::set_icon(basic_state);
+
+ switch (presence_epa->get_basic_state()) {
+ case t_presence_state::ST_BASIC_CLOSED:
+ tip += qApp->translate("BuddyList", "offline");
+ break;
+ case t_presence_state::ST_BASIC_OPEN:
+ tip += qApp->translate("BuddyList", "online");
+ break;
+ default:
+ tip += qApp->translate("BuddyList", "unknown");
+ break;
+ }
+ break;
+ default:
+ tip += qApp->translate("BuddyList", "unknown");
+ break;
+ }
+
+ tip += "<p><i>";
+ tip += qApp->translate("BuddyList", "Click right to add a buddy.");
+ tip += "<i></html>";
+ tip = tip.replace(' ', "&nbsp;");
+}
+
+BLViewUserItem::BLViewUserItem(QListView *parent, t_presence_epa *_presence_epa) :
+ AbstractBLVItem(parent, _presence_epa->get_user_profile()->get_profile_name().c_str()),
+ presence_epa(_presence_epa)
+{
+ set_icon();
+ presence_epa->attach(this);
+}
+
+BLViewUserItem::~BLViewUserItem() {
+ presence_epa->detach(this);
+}
+
+void BLViewUserItem::paintCell(QPainter *painter, const QColorGroup &cg,
+ int column, int width, int align)
+{
+ painter->save();
+ QFont font = painter->font();
+ font.setBold(true);
+ painter->setFont(font);
+ QListViewItem::paintCell(painter, cg, column, width, align);
+ painter->restore();
+}
+
+void BLViewUserItem::update(void) {
+ // This method is called directly from the core, so lock the GUI
+ ui->lock();
+ set_icon();
+
+ if (presence_epa->get_user_profile()->get_profile_name().c_str() == text(0)) {
+ setText(0, presence_epa->get_user_profile()->get_profile_name().c_str());
+ QListViewItem::listView()->sort();
+ }
+ ui->unlock();
+}
+
+void BLViewUserItem::subject_destroyed(void) {
+ delete this;
+}
+
+t_presence_epa *BLViewUserItem::get_presence_epa(void) {
+ return presence_epa;
+}
+
+
+BuddyListViewTip::BuddyListViewTip(QListView *parent) :
+ QToolTip(parent->viewport()),
+ parentListView(parent)
+{}
+
+void BuddyListViewTip::maybeTip ( const QPoint & p ) {
+ QListView *listView = parentListView;
+
+ QListViewItem *item = listView->itemAt(p);
+ if (!item) return;
+
+ AbstractBLVItem *bitem = dynamic_cast<AbstractBLVItem *>(item);
+ if (!bitem) return;
+
+ int x = listView->header()->sectionPos( listView->header()->mapToIndex( 0 ) ) +
+ listView->treeStepSize() * ( item->depth() + ( listView->rootIsDecorated() ? 1 : 0) ) +
+ listView->itemMargin();
+
+ if ( p.x() > x ||
+ p.x() < listView->header()->sectionPos( listView->header()->mapToIndex( 0 ) ) )
+ {
+ // p is not on root decoration
+ QRect tipRect = listView->itemRect(item);
+
+ // Shrink rect to exclude root decoration
+ tipRect.setX(x);
+ tip(tipRect, bitem->get_tip());
+ }
+}
diff --git a/src/gui/buddylistview.h b/src/gui/buddylistview.h
new file mode 100644
index 0000000..1345901
--- /dev/null
+++ b/src/gui/buddylistview.h
@@ -0,0 +1,92 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef BUDDYLISTVIEW_H
+#define BUDDYLISTVIEW_H
+
+#include "qlistview.h"
+#include "qpainter.h"
+#include "qtooltip.h"
+#include "presence/buddy.h"
+#include "presence/presence_epa.h"
+#include "patterns/observer.h"
+
+class AbstractBLVItem : public QListViewItem {
+protected:
+ // Text to show as a tool tip.
+ QString tip;
+
+ // Set the presence icon to reflect the presence state
+ virtual void set_icon(t_presence_state::t_basic_state state);
+
+public:
+ AbstractBLVItem(QListViewItem *parent, const QString &text);
+ AbstractBLVItem(QListView *parent, const QString &text);
+ virtual ~AbstractBLVItem();
+ virtual QString get_tip(void);
+};
+
+// List view item representing a buddy.
+class BuddyListViewItem : public AbstractBLVItem, public patterns::t_observer {
+private:
+ t_buddy *buddy;
+
+ // Set the presence icon to reflect the buddy's presence
+ void set_icon(void);
+
+public:
+ BuddyListViewItem(QListViewItem *parent, t_buddy *_buddy);
+ virtual ~BuddyListViewItem();
+
+ virtual void update(void);
+ virtual void subject_destroyed(void);
+
+ t_buddy *get_buddy(void);
+};
+
+// List view item representing a user
+class BLViewUserItem : public AbstractBLVItem, public patterns::t_observer {
+private:
+ t_presence_epa *presence_epa;
+
+ void set_icon(void);
+
+public:
+ BLViewUserItem(QListView *parent, t_presence_epa *_presence_epa);
+ virtual ~BLViewUserItem();
+
+ void paintCell(QPainter *painter, const QColorGroup &cg,
+ int column, int width, int align);
+
+ virtual void update(void);
+ virtual void subject_destroyed(void);
+
+ t_presence_epa *get_presence_epa(void);
+};
+
+class BuddyListViewTip : public QToolTip {
+private:
+ QListView *parentListView;
+
+public:
+ BuddyListViewTip(QListView *parent);
+ virtual ~BuddyListViewTip() {};
+ void maybeTip ( const QPoint & p );
+};
+
+#endif
diff --git a/src/gui/command_args.h b/src/gui/command_args.h
new file mode 100644
index 0000000..d792b4d
--- /dev/null
+++ b/src/gui/command_args.h
@@ -0,0 +1,61 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef _COMMAND_ARGS_H
+#define _COMMAND_ARGS_H
+
+#include "twinkle_config.h"
+
+/** Command arguments. */
+struct t_command_args {
+ /** SIP URI to be called passed via the --call command line parameter. */
+ QString callto_destination;
+
+ /** CLI command passed via the --cmd command line parameter. */
+ QString cli_command;
+
+ /** Indicates if the --call or --cmd must be performed immediately. */
+ bool cmd_immediate_mode;
+
+ /** Indicates the profile that should be made active before performing
+ * --call or --cmd
+ */
+ QString cmd_set_profile;
+
+ /** Indicates if the --show option was given. */
+ bool cmd_show;
+
+ /** Indicates if the --hide option was given. */
+ bool cmd_hide;
+
+ /** If a port number is passed by the user on the command line, then
+ * that port number overrides the port from the system settings.
+ */
+ unsigned short override_sip_port;
+ unsigned short override_rtp_port;
+
+ t_command_args() :
+ cmd_immediate_mode(false),
+ cmd_show(false),
+ cmd_hide(false),
+ override_sip_port(0),
+ override_rtp_port(0)
+ {}
+};
+
+#endif
diff --git a/src/gui/core_strings.h b/src/gui/core_strings.h
new file mode 100644
index 0000000..baebbaa
--- /dev/null
+++ b/src/gui/core_strings.h
@@ -0,0 +1,108 @@
+// This file is generated by translator.py
+// It contains all strings that need translation from the
+// core of Twinkle.
+
+#define _ZAP(s)
+
+// userintf.cpp
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Anonymous"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Warning:"))
+
+// log.cpp
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Failed to create log file %1 ."))
+
+// call_history.cpp
+_ZAP(QT_TRANSLATE_NOOP("CoreCallHistory", "local user"))
+_ZAP(QT_TRANSLATE_NOOP("CoreCallHistory", "remote user"))
+_ZAP(QT_TRANSLATE_NOOP("CoreCallHistory", "failure"))
+_ZAP(QT_TRANSLATE_NOOP("CoreCallHistory", "unknown"))
+_ZAP(QT_TRANSLATE_NOOP("CoreCallHistory", "in"))
+_ZAP(QT_TRANSLATE_NOOP("CoreCallHistory", "out"))
+_ZAP(QT_TRANSLATE_NOOP("CoreCallHistory", "unknown"))
+
+// sender.cpp
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Excessive number of socket errors."))
+
+// sys_settings.cpp
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Built with support for:"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Contributions:"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "This software contains the following software from 3rd parties:"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "* GSM codec from Jutta Degener and Carsten Bormann, University of Berlin"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "* G.711/G.726 codecs from Sun Microsystems (public domain)"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "* iLBC implementation from RFC 3951 (www.ilbcfreeware.org)"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "* Parts of the STUN project at http://sourceforge.net/projects/stun"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "* Parts of libsrv at http://libsrv.sourceforge.net/"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "For RTP the following dynamic libraries are linked:"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Translated to english by <your name>"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Directory %1 does not exist."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot open file %1 ."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot open file %1 ."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "%1 is not set to your home directory."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Directory %1 (%2) does not exist."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot create directory %1 ."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot create directory %1 ."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Failed to create file %1"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Failed to write data to file %1"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot create %1 ."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "%1 is already running.\nLock file %2 already exists."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot lock %1 ."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot open file for reading: %1"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "File system error while reading file %1 ."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Syntax error in file %1 ."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Failed to backup %1 to %2"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot open file for writing: %1"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "File system error while writing file %1 ."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "unknown name (device is busy)"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Default device"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot access the ring tone device (%1)."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot access the speaker (%1)."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot access the microphone (%1)."))
+
+// listener.cpp
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Excessive number of socket errors."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot receive incoming TCP connections."))
+
+// phone.cpp
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Call transfer - %1"))
+
+// audio_session.cpp
+_ZAP(QT_TRANSLATE_NOOP("CoreAudio", "Failed to open sound card"))
+_ZAP(QT_TRANSLATE_NOOP("CoreAudio", "Failed to open sound card"))
+_ZAP(QT_TRANSLATE_NOOP("CoreAudio", "Failed to open sound card"))
+_ZAP(QT_TRANSLATE_NOOP("CoreAudio", "Failed to create a UDP socket (RTP) on port %1"))
+_ZAP(QT_TRANSLATE_NOOP("CoreAudio", "Failed to create audio receiver thread."))
+_ZAP(QT_TRANSLATE_NOOP("CoreAudio", "Failed to create audio transmitter thread."))
+
+// audio_device.cpp
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Sound card cannot be set to full duplex."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot set buffer size on sound card."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Sound card cannot be set to %1 channels."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Sound card cannot be set to %1 channels."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot set sound card to 16 bits recording."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot set sound card to 16 bits playing."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot set sound card sample rate to %1"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Opening ALSA driver failed"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot open ALSA driver for PCM playback"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot open ALSA driver for PCM capture"))
+
+// msg_session.cpp
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Failed to send message."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Failed to send message."))
+
+// stun_transaction.cpp
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot resolve STUN server: %1"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "You are behind a symmetric NAT.\nSTUN will not work.\nConfigure a public IP address in the user profile\nand create the following static bindings (UDP) in your NAT."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "public IP: %1 --> private IP: %2 (SIP signaling)"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "public IP: %1-%2 --> private IP: %3-%4 (RTP/RTCP)"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot reach the STUN server: %1"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "If you are behind a firewall then you need to open the following UDP ports."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Port %1 (SIP signaling)"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Ports %1-%2 (RTP/RTCP)"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "NAT type discovery via STUN failed."))
+
+// record_file.hpp
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot open file for reading: %1"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "File system error while reading file %1 ."))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "Cannot open file for writing: %1"))
+_ZAP(QT_TRANSLATE_NOOP("TwinkleCore", "File system error while writing file %1 ."))
+
diff --git a/src/gui/deregisterform.ui b/src/gui/deregisterform.ui
new file mode 100644
index 0000000..fe70e5b
--- /dev/null
+++ b/src/gui/deregisterform.ui
@@ -0,0 +1,105 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>DeregisterForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>DeregisterForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>287</width>
+ <height>82</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Deregister</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>deregAllCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>deregister all devices</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout21</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer13</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>111</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DeregisterForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DeregisterForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">deregisterform.ui.h</include>
+</includes>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/deregisterform.ui.h b/src/gui/deregisterform.ui.h
new file mode 100644
index 0000000..2aae11c
--- /dev/null
+++ b/src/gui/deregisterform.ui.h
@@ -0,0 +1,26 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
diff --git a/src/gui/diamondcardprofileform.ui b/src/gui/diamondcardprofileform.ui
new file mode 100644
index 0000000..d74ae86
--- /dev/null
+++ b/src/gui/diamondcardprofileform.ui
@@ -0,0 +1,307 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DiamondcardProfileForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>DiamondcardProfileForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>541</width>
+ <height>433</height>
+ </rect>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Diamondcard User Profile</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>explainTextLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;p&gt;With a Diamondcard account you can make worldwide calls to regular and cell phones and send SMS messages. To sign up for a Diamondcard account click on the "sign up" link below. Once you have signed up you receive an account ID and PIN code. Enter the account ID and PIN code below to create a Twinkle user profile for your Diamondcard account.&lt;/p&gt;
+&lt;p&gt;For call rates see the sign up web page that will be shown to you when you click on the "sign up" link.&lt;/p&gt;</string>
+ </property>
+ <property name="textFormat">
+ <enum>RichText</enum>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer35</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout193</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>accountIdLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Your Diamondcard account ID.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>nameLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>accountIdTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Account ID:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>accountIdLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>pinCodeTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;PIN code:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>pinCodeLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>nameTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Your name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>nameLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>pinCodeLineEdit</cstring>
+ </property>
+ <property name="echoMode">
+ <enum>Password</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Your Diamondcard PIN code.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer27</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout63</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>signUpTextLabel</cstring>
+ </property>
+ <property name="backgroundMode">
+ <enum>PaletteBackground</enum>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>205</blue>
+ </color>
+ </property>
+ <property name="cursor">
+ <cursor>13</cursor>
+ </property>
+ <property name="text">
+ <string>&lt;p align="center"&gt;&lt;u&gt;Sign up for a Diamondcard account&lt;/u&gt;&lt;/p&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter</set>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer28</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout64</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer21</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>61</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string>Alt+O</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string>Alt+C</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DiamondcardProfileForm</receiver>
+ <slot>validate()</slot>
+ </connection>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DiamondcardProfileForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>nameLineEdit</tabstop>
+ <tabstop>accountIdLineEdit</tabstop>
+ <tabstop>pinCodeLineEdit</tabstop>
+ <tabstop>okPushButton</tabstop>
+ <tabstop>cancelPushButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in declaration">user.h</include>
+ <include location="local" impldecl="in implementation">qregexp.h</include>
+ <include location="local" impldecl="in implementation">qvalidator.h</include>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">diamondcard.h</include>
+ <include location="local" impldecl="in implementation">getprofilenameform.h</include>
+ <include location="local" impldecl="in implementation">audits/memman.h</include>
+ <include location="local" impldecl="in implementation">diamondcardprofileform.ui.h</include>
+</includes>
+<variables>
+ <variable access="private">t_user *user_config;</variable>
+ <variable access="private">bool destroy_user_config;</variable>
+</variables>
+<signals>
+ <signal>success()</signal>
+ <signal>newDiamondcardProfile(const QString&amp;)</signal>
+</signals>
+<slots>
+ <slot>destroyOldUserConfig()</slot>
+ <slot>show( t_user * user )</slot>
+ <slot>validate()</slot>
+ <slot>mouseReleaseEvent( QMouseEvent * e )</slot>
+ <slot>processLeftMouseButtonRelease( QMouseEvent * e )</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function access="private" specifier="non virtual">destroy()</function>
+ <function returnType="int">exec( t_user * user )</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/diamondcardprofileform.ui.h b/src/gui/diamondcardprofileform.ui.h
new file mode 100644
index 0000000..eedec55
--- /dev/null
+++ b/src/gui/diamondcardprofileform.ui.h
@@ -0,0 +1,151 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you want to add, delete, or rename functions or slots, use
+** Qt Designer to update this file, preserving your code.
+**
+** You should not define a constructor or destructor in this file.
+** Instead, write your code in functions called init() and destroy().
+** These will automatically be called by the form's constructor and
+** destructor.
+*****************************************************************************/
+
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+void DiamondcardProfileForm::init()
+{
+ user_config = NULL;
+ destroy_user_config = false;
+
+ QRegExp rxNoSpace("\\S*");
+ accountIdLineEdit->setValidator(new QRegExpValidator(rxNoSpace, this));
+ pinCodeLineEdit->setValidator(new QRegExpValidator(rxNoSpace, this));
+}
+
+void DiamondcardProfileForm::destroy()
+{
+ destroyOldUserConfig();
+}
+
+void DiamondcardProfileForm::destroyOldUserConfig()
+{
+ if (user_config && destroy_user_config) {
+ MEMMAN_DELETE(user_config);
+ delete user_config;
+ }
+ user_config = NULL;
+}
+
+// Show the form
+void DiamondcardProfileForm::show(t_user *user)
+{
+ destroyOldUserConfig();
+
+ if (user) {
+ user_config = user;
+ destroy_user_config = false;
+ } else {
+ user_config = new t_user();
+ MEMMAN_NEW(user_config);
+ destroy_user_config = true;
+ }
+ QDialog::show();
+}
+
+// Modal execution
+int DiamondcardProfileForm::exec(t_user *user)
+{
+ destroyOldUserConfig();
+ user_config = user;
+ destroy_user_config = false;
+ return QDialog::exec();
+}
+
+void DiamondcardProfileForm::validate()
+{
+ if (accountIdLineEdit->text().isEmpty()) {
+ ((t_gui *)ui)->cb_show_msg(this, tr("Fill in your account ID.").ascii(),
+ MSG_CRITICAL);
+ accountIdLineEdit->setFocus();
+ return;
+ }
+
+ if (pinCodeLineEdit->text().isEmpty()) {
+ ((t_gui *)ui)->cb_show_msg(this, tr("Fill in your PIN code.").ascii(),
+ MSG_CRITICAL);
+ pinCodeLineEdit->setFocus();
+ return;
+ }
+
+ QString profileName("Diamondcard-");
+ profileName.append(accountIdLineEdit->text());
+ QString filename(profileName);
+ filename.append(USER_FILE_EXT);
+
+ // Create a new user config
+ while (!user_config->set_config(filename.ascii())) {
+ ((t_gui *)ui)->cb_show_msg(this,
+ tr("A user profile with name %1 already exists.").arg(profileName).ascii(),
+ MSG_WARNING);
+
+ // Ask user for a profile name
+ GetProfileNameForm getProfileNameForm(this, "get profile name", true);
+ if (!getProfileNameForm.execNewName()) return;
+
+ profileName = getProfileNameForm.getProfileName();
+ filename = profileName;
+ filename.append(USER_FILE_EXT);
+ }
+
+ diamondcard_set_user_config(*user_config,
+ nameLineEdit->text().ascii(),
+ accountIdLineEdit->text().ascii(),
+ pinCodeLineEdit->text().ascii());
+
+ string error_msg;
+ if (!user_config->write_config(user_config->get_filename(), error_msg)) {
+ // Failed to write config file
+ ((t_gui *)ui)->cb_show_msg(this, error_msg, MSG_CRITICAL);
+ return;
+ }
+
+ emit newDiamondcardProfile(user_config->get_filename().c_str());
+ emit success();
+ accept();
+}
+
+// Handle mouse clicks on labels.
+void DiamondcardProfileForm::mouseReleaseEvent(QMouseEvent *e)
+{
+ if (e->button() == Qt::LeftButton && e->type() == QEvent::MouseButtonRelease) {
+ processLeftMouseButtonRelease(e);
+ } else {
+ e->ignore();
+ }
+}
+
+void DiamondcardProfileForm::processLeftMouseButtonRelease(QMouseEvent *e)
+{
+ if (signUpTextLabel->hasMouse()) {
+ string url = diamondcard_url(DC_ACT_SIGNUP, "", "");
+ ((t_gui *)ui)->open_url_in_browser(url.c_str());
+ } else {
+ e->ignore();
+ }
+}
diff --git a/src/gui/dtmfform.ui b/src/gui/dtmfform.ui
new file mode 100644
index 0000000..d0e683d
--- /dev/null
+++ b/src/gui/dtmfform.ui
@@ -0,0 +1,509 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DtmfForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>DtmfForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>350</width>
+ <height>302</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="caption">
+ <string>Twinkle - DTMF</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>keypadGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Keypad</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>twoPushButton</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>dtmf-2.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>2</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="2">
+ <property name="name">
+ <cstring>threePushButton</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>dtmf-3.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>3</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="3">
+ <property name="name">
+ <cstring>aPushButton</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>194</red>
+ <green>202</green>
+ <blue>210</blue>
+ </color>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>dtmf-a.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Over decadic A. Normally not needed.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="0">
+ <property name="name">
+ <cstring>fourPushButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>dtmf-4.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>4</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>fivePushButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>dtmf-5.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>5</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>sixPushButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>dtmf-6.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>6</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="3">
+ <property name="name">
+ <cstring>bPushButton</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>194</red>
+ <green>202</green>
+ <blue>210</blue>
+ </color>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>dtmf-b.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Over decadic B. Normally not needed.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="0">
+ <property name="name">
+ <cstring>sevenPushButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>dtmf-7.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>7</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>eightPushButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>dtmf-8.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>8</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="2">
+ <property name="name">
+ <cstring>ninePushButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>dtmf-9.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>9</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="3">
+ <property name="name">
+ <cstring>cPushButton</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>194</red>
+ <green>202</green>
+ <blue>210</blue>
+ </color>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>dtmf-c.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Over decadic C. Normally not needed.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="0">
+ <property name="name">
+ <cstring>starPushButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>dtmf-star.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Star (*)</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="1">
+ <property name="name">
+ <cstring>zeroPushButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>dtmf-0.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>0</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="2">
+ <property name="name">
+ <cstring>poundPushButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>dtmf-pound.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Pound (#)</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="3" column="3">
+ <property name="name">
+ <cstring>dPushButton</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>194</red>
+ <green>202</green>
+ <blue>210</blue>
+ </color>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>dtmf-d.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Over decadic D. Normally not needed.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="0" column="0">
+ <property name="name">
+ <cstring>onePushButton</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>dtmf-1.png</pixmap>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>1</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout24</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer20</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>291</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>closePushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ <property name="accel">
+ <string>Alt+C</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>closePushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DtmfForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>onePushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DtmfForm</receiver>
+ <slot>dtmf1()</slot>
+ </connection>
+ <connection>
+ <sender>twoPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DtmfForm</receiver>
+ <slot>dtmf2()</slot>
+ </connection>
+ <connection>
+ <sender>threePushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DtmfForm</receiver>
+ <slot>dtmf3()</slot>
+ </connection>
+ <connection>
+ <sender>fourPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DtmfForm</receiver>
+ <slot>dtmf4()</slot>
+ </connection>
+ <connection>
+ <sender>fivePushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DtmfForm</receiver>
+ <slot>dtmf5()</slot>
+ </connection>
+ <connection>
+ <sender>sixPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DtmfForm</receiver>
+ <slot>dtmf6()</slot>
+ </connection>
+ <connection>
+ <sender>sevenPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DtmfForm</receiver>
+ <slot>dtmf7()</slot>
+ </connection>
+ <connection>
+ <sender>eightPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DtmfForm</receiver>
+ <slot>dtmf8()</slot>
+ </connection>
+ <connection>
+ <sender>ninePushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DtmfForm</receiver>
+ <slot>dtmf9()</slot>
+ </connection>
+ <connection>
+ <sender>zeroPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DtmfForm</receiver>
+ <slot>dtmf0()</slot>
+ </connection>
+ <connection>
+ <sender>starPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DtmfForm</receiver>
+ <slot>dtmfStar()</slot>
+ </connection>
+ <connection>
+ <sender>poundPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DtmfForm</receiver>
+ <slot>dtmfPound()</slot>
+ </connection>
+ <connection>
+ <sender>aPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DtmfForm</receiver>
+ <slot>dtmfA()</slot>
+ </connection>
+ <connection>
+ <sender>bPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DtmfForm</receiver>
+ <slot>dtmfB()</slot>
+ </connection>
+ <connection>
+ <sender>cPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DtmfForm</receiver>
+ <slot>dtmfC()</slot>
+ </connection>
+ <connection>
+ <sender>dPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>DtmfForm</receiver>
+ <slot>dtmfD()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>onePushButton</tabstop>
+ <tabstop>twoPushButton</tabstop>
+ <tabstop>threePushButton</tabstop>
+ <tabstop>aPushButton</tabstop>
+ <tabstop>fourPushButton</tabstop>
+ <tabstop>fivePushButton</tabstop>
+ <tabstop>sixPushButton</tabstop>
+ <tabstop>bPushButton</tabstop>
+ <tabstop>sevenPushButton</tabstop>
+ <tabstop>eightPushButton</tabstop>
+ <tabstop>ninePushButton</tabstop>
+ <tabstop>cPushButton</tabstop>
+ <tabstop>starPushButton</tabstop>
+ <tabstop>zeroPushButton</tabstop>
+ <tabstop>poundPushButton</tabstop>
+ <tabstop>dPushButton</tabstop>
+ <tabstop>closePushButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">qregexp.h</include>
+ <include location="local" impldecl="in implementation">qvalidator.h</include>
+ <include location="local" impldecl="in implementation">qlineedit.h</include>
+ <include location="local" impldecl="in implementation">dtmfform.ui.h</include>
+</includes>
+<signals>
+ <signal>digits(const QString &amp;)</signal>
+</signals>
+<slots>
+ <slot>dtmf1()</slot>
+ <slot>dtmf2()</slot>
+ <slot>dtmf3()</slot>
+ <slot>dtmf4()</slot>
+ <slot>dtmf5()</slot>
+ <slot>dtmf6()</slot>
+ <slot>dtmf7()</slot>
+ <slot>dtmf8()</slot>
+ <slot>dtmf9()</slot>
+ <slot>dtmf0()</slot>
+ <slot>dtmfStar()</slot>
+ <slot>dtmfPound()</slot>
+ <slot>dtmfA()</slot>
+ <slot>dtmfB()</slot>
+ <slot>dtmfC()</slot>
+ <slot>dtmfD()</slot>
+ <slot>keyPressEvent( QKeyEvent * e )</slot>
+</slots>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/dtmfform.ui.h b/src/gui/dtmfform.ui.h
new file mode 100644
index 0000000..5e155a8
--- /dev/null
+++ b/src/gui/dtmfform.ui.h
@@ -0,0 +1,177 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+void DtmfForm::dtmf1()
+{
+ emit digits("1");
+}
+
+void DtmfForm::dtmf2()
+{
+ emit digits("2");
+}
+
+void DtmfForm::dtmf3()
+{
+ emit digits("3");
+}
+
+void DtmfForm::dtmf4()
+{
+ emit digits("4");
+}
+
+void DtmfForm::dtmf5()
+{
+ emit digits("5");
+}
+
+void DtmfForm::dtmf6()
+{
+ emit digits("6");
+}
+
+void DtmfForm::dtmf7()
+{
+ emit digits("7");
+}
+
+void DtmfForm::dtmf8()
+{
+ emit digits("8");
+}
+
+void DtmfForm::dtmf9()
+{
+ emit digits("9");
+}
+
+void DtmfForm::dtmf0()
+{
+ emit digits("0");
+}
+
+void DtmfForm::dtmfStar()
+{
+ emit digits("*");
+}
+
+void DtmfForm::dtmfPound()
+{
+ emit digits("#");
+}
+
+void DtmfForm::dtmfA()
+{
+ emit digits("A");
+}
+
+void DtmfForm::dtmfB()
+{
+ emit digits("B");
+}
+
+void DtmfForm::dtmfC()
+{
+ emit digits("C");
+}
+
+void DtmfForm::dtmfD()
+{
+ emit digits("D");
+}
+
+void DtmfForm::keyPressEvent(QKeyEvent *e)
+{
+ // DTMF keys
+ switch (e->key()) {
+ case Qt::Key_1:
+ dtmf1();
+ break;
+ case Qt::Key_2:
+ case Qt::Key_A:
+ case Qt::Key_B:
+ case Qt::Key_C:
+ dtmf2();
+ break;
+ case Qt::Key_3:
+ case Qt::Key_D:
+ case Qt::Key_E:
+ case Qt::Key_F:
+ dtmf3();
+ break;
+ case Qt::Key_4:
+ case Qt::Key_G:
+ case Qt::Key_H:
+ case Qt::Key_I:
+ dtmf4();
+ break;
+ case Qt::Key_5:
+ case Qt::Key_J:
+ case Qt::Key_K:
+ case Qt::Key_L:
+ dtmf5();
+ break;
+ case Qt::Key_6:
+ case Qt::Key_M:
+ case Qt::Key_N:
+ case Qt::Key_O:
+ dtmf6();
+ break;
+ case Qt::Key_7:
+ case Qt::Key_P:
+ case Qt::Key_Q:
+ case Qt::Key_R:
+ case Qt::Key_S:
+ dtmf7();
+ break;
+ case Qt::Key_8:
+ case Qt::Key_T:
+ case Qt::Key_U:
+ case Qt::Key_V:
+ dtmf8();
+ break;
+ case Qt::Key_9:
+ case Qt::Key_W:
+ case Qt::Key_X:
+ case Qt::Key_Y:
+ case Qt::Key_Z:
+ dtmf9();
+ break;
+ case Qt::Key_0:
+ case Qt::Key_Space:
+ dtmf0();
+ break;
+ case Qt::Key_Asterisk:
+ dtmfStar();
+ break;
+ case Qt::Key_NumberSign:
+ dtmfPound();
+ break;
+ default:
+ e->ignore();
+ }
+}
diff --git a/src/gui/freedesksystray.cpp b/src/gui/freedesksystray.cpp
new file mode 100644
index 0000000..caab5c6
--- /dev/null
+++ b/src/gui/freedesksystray.cpp
@@ -0,0 +1,165 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Emil Stoyanov *
+ * emosto@users.sourceforge.net *
+ * *
+ * 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, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+// 2006 Modified by Michel de Boer
+
+#include "freedesksystray.h"
+
+FreeDeskSysTray::FreeDeskSysTray ( QWidget *pParent , const char *pszName )
+ : QLabel(pParent, pszName, WMouseNoMask | WRepaintNoErase | WType_TopLevel | WStyle_Customize | WStyle_NoBorder | WStyle_StaysOnTop)
+{
+ mainWindow = pParent;
+ trayMenu = new QPopupMenu(this);
+}
+
+void FreeDeskSysTray::dock ()
+{
+ trayMenu->insertSeparator();
+ trayMenu->insertItem(tr("Show/Hide"), this, SLOT(slotMenuItemShow())) ;
+
+ QIconSet quitIcon(QPixmap::fromMimeSource("exit.png"));
+ trayMenu->insertItem(quitIcon, tr("Quit"), this, SLOT(slotMenuItemQuit())) ;
+
+ Display *dpy = QPaintDevice::x11AppDisplay();
+ WId trayWin = winId();
+
+ // System Tray Protocol Specification from freedesktop.org
+ Screen *screen = XDefaultScreenOfDisplay(dpy);
+ int iScreen = XScreenNumberOfScreen(screen);
+ char szAtom[32];
+ snprintf(szAtom, sizeof(szAtom), "_NET_SYSTEM_TRAY_S%d", iScreen);
+ Atom selectionAtom = XInternAtom(dpy, szAtom, false);
+ XGrabServer(dpy);
+ Window managerWin = XGetSelectionOwner(dpy, selectionAtom);
+ XSelectInput(dpy, managerWin, StructureNotifyMask);
+ XUngrabServer(dpy);
+ XFlush(dpy);
+ XEvent ev;
+ memset(&ev, 0, sizeof(ev));
+ ev.xclient.type = ClientMessage;
+ ev.xclient.window = managerWin;
+ ev.xclient.message_type = XInternAtom(dpy, "_NET_SYSTEM_TRAY_OPCODE", true);
+ ev.xclient.format = 32;
+ ev.xclient.data.l[0] = CurrentTime;
+ ev.xclient.data.l[1] = SYSTEM_TRAY_REQUEST_DOCK;
+ ev.xclient.data.l[2] = trayWin;
+ ev.xclient.data.l[3] = 0;
+ ev.xclient.data.l[4] = 0;
+ XSendEvent(dpy, managerWin, false, NoEventMask, &ev);
+ XSync(dpy, false);
+
+ Atom trayAtom;
+ // KDE 3
+ WId forWin = mainWindow ? mainWindow->topLevelWidget()->winId() : qt_xrootwin();
+ trayAtom = XInternAtom(dpy, "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR", false);
+ XChangeProperty(dpy, trayWin, trayAtom, XA_WINDOW, 32, PropModeReplace, (unsigned char *) &forWin, 1);
+
+ setMinimumSize(22, 22);
+ setBackgroundMode(Qt::X11ParentRelative);
+
+ // because of GNOME - needs a wait of at least 50-100 ms, otherwise width=1
+ // KDocker solves the problem so (bug?)
+ QTimer::singleShot(500, this, SLOT(show()));
+
+}
+
+void FreeDeskSysTray::undock ()
+{
+ XUnmapWindow(QPaintDevice::x11AppDisplay(), winId());
+ hide();
+}
+
+FreeDeskSysTray::~FreeDeskSysTray ()
+{}
+
+void FreeDeskSysTray::mousePressEvent ( QMouseEvent *pMouseEvent )
+{
+ if (!QLabel::rect().contains(pMouseEvent->pos()))
+ return;
+
+ switch (pMouseEvent->button())
+ {
+
+ case LeftButton:
+ slotMenuItemShow();
+ break;
+
+ case RightButton:
+ showContextMenu(pMouseEvent->globalPos());
+ break;
+
+ default:
+ break;
+ }
+}
+
+void FreeDeskSysTray::setPixmapOverlay ( const QPixmap& pmOverlay )
+{
+ QWidget *pParent = parentWidget();
+ if (pParent == 0)
+ return;
+
+ // Get base pixmap from parent widget.
+ QPixmap pm;
+ pm.convertFromImage(pParent->icon()->convertToImage().smoothScale(22, 22), 0);
+
+ // Merge with the overlay pixmap.
+ QBitmap bmMask(*pm.mask());
+ bitBlt(&bmMask, 0, 0, pmOverlay.mask(), 0, 0, -1, -1, Qt::OrROP);
+ pm.setMask(bmMask);
+ bitBlt(&pm, 0, 0, &pmOverlay);
+
+ QLabel::setPixmap(pm);
+}
+
+QPopupMenu *FreeDeskSysTray::contextMenu()
+{
+ return trayMenu;
+}
+
+ void FreeDeskSysTray::setPixmap(const QPixmap& pixmap)
+{
+ QLabel::setPixmap(pixmap);
+ repaint(true);
+}
+
+void FreeDeskSysTray::showContextMenu(const QPoint& position)
+{
+ trayMenu->popup(position,0);
+}
+
+void FreeDeskSysTray::slotMenuItemShow() {
+
+// mainWindowGeometry = mainWindow->geometry();
+// windowPos = mainWindow->frameGeometry().topLeft();
+
+ if (mainWindow->isVisible()) {
+ //mainWindow->setGeometry(mainWindowGeometry);
+ mainWindow->close();
+ } else {
+// mainWindow->move( windowPos ); // restore position
+ mainWindow->show();
+ }
+
+}
+
+void FreeDeskSysTray::slotMenuItemQuit() {
+ emit quitSelected();
+}
diff --git a/src/gui/freedesksystray.h b/src/gui/freedesksystray.h
new file mode 100644
index 0000000..cd41a1f
--- /dev/null
+++ b/src/gui/freedesksystray.h
@@ -0,0 +1,94 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Emil Stoyanov *
+ * emosto@users.sourceforge.net *
+ * *
+ * 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, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+// 2006 Modified by Michel de Boer
+
+#ifndef FREEDESKSYSTEMTRAY_H
+#define FREEDESKTSYSTEMTRAY_H
+
+#include <qlabel.h>
+#include <qpixmap.h>
+#include <qpopupmenu.h>
+#include <qwidget.h>
+#include <qapplication.h>
+#include <qpoint.h>
+#include <qsize.h>
+#include <qtooltip.h>
+#include <qbitmap.h>
+#include <qimage.h>
+#include <qtimer.h>
+#include <qrect.h>
+
+#include <string.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include <X11/Xatom.h>
+#include <X11/Xlib.h>
+
+
+// System Tray Protocol Specification opcodes.
+#define SYSTEM_TRAY_REQUEST_DOCK 0
+#define SYSTEM_TRAY_BEGIN_MESSAGE 1
+#define SYSTEM_TRAY_CANCEL_MESSAGE 2
+
+
+class FreeDeskSysTray : public QLabel
+{
+ Q_OBJECT
+
+public:
+
+ FreeDeskSysTray(QWidget *pParent = 0, const char *pszName = 0);
+ ~FreeDeskSysTray();
+
+ void setPixmapOverlay(const QPixmap& pmOverlay);
+ void showContextMenu(const QPoint& position);
+ void dock ();
+ void undock ();
+ QPopupMenu *contextMenu();
+ void setPixmap(const QPixmap& pixmap);
+
+public:
+
+ QWidget * mainWindow;
+ QPopupMenu * trayMenu;
+
+protected:
+
+ void mousePressEvent(QMouseEvent *);
+
+public slots:
+
+ void slotMenuItemShow();
+ void slotMenuItemQuit();
+
+signals:
+
+ void quitSelected();
+
+private:
+ QRect mainWindowGeometry;
+ QPoint windowPos;
+};
+
+// ifndef FREEDESKSYSTEMTRAY_H
+#endif
diff --git a/src/gui/getaddressform.ui b/src/gui/getaddressform.ui
new file mode 100644
index 0000000..153fdd1
--- /dev/null
+++ b/src/gui/getaddressform.ui
@@ -0,0 +1,476 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>GetAddressForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>GetAddressForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>655</width>
+ <height>474</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Select address</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>addressTabWidget</cstring>
+ </property>
+ <property name="tabShape">
+ <enum>Rounded</enum>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tabKABC</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;KAddressBook</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Name</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Type</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Phone</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>addressListView</cstring>
+ </property>
+ <property name="resizePolicy">
+ <enum>Manual</enum>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="showSortIndicator">
+ <bool>true</bool>
+ </property>
+ <property name="itemMargin">
+ <number>1</number>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>This list of addresses is taken from &lt;b&gt;KAddressBook&lt;/b&gt;. 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.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout17</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>sipOnlyCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Show only SIP addresses</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this option when you only want to see contacts with SIP addresses, i.e. starting with "&lt;b&gt;sip:&lt;/b&gt;".</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer16</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>201</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout69</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>reloadPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Reload</string>
+ </property>
+ <property name="accel">
+ <string>Alt+R</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Reload the list of addresses from KAddressbook.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer59</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>491</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tabLocal</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Local address book</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Name</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Phone</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Remark</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>localListView</cstring>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="showSortIndicator">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Contacts in the local address book of Twinkle.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout67</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>addPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Add</string>
+ </property>
+ <property name="accel">
+ <string>Alt+A</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Add a new contact to the local address book.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>deletePushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Delete a contact from the local address book.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>editPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Edit</string>
+ </property>
+ <property name="accel">
+ <string>Alt+E</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Edit a contact from the local address book.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer97</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>161</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout68</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>378</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string>Alt+O</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string>Alt+C</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>GetAddressForm</receiver>
+ <slot>selectAddress()</slot>
+ </connection>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>GetAddressForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>addressListView</sender>
+ <signal>doubleClicked(QListViewItem*)</signal>
+ <receiver>GetAddressForm</receiver>
+ <slot>selectKABCAddress()</slot>
+ </connection>
+ <connection>
+ <sender>sipOnlyCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>GetAddressForm</receiver>
+ <slot>toggleSipOnly(bool)</slot>
+ </connection>
+ <connection>
+ <sender>reloadPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>GetAddressForm</receiver>
+ <slot>reload()</slot>
+ </connection>
+ <connection>
+ <sender>localListView</sender>
+ <signal>doubleClicked(QListViewItem*)</signal>
+ <receiver>GetAddressForm</receiver>
+ <slot>selectLocalAddress()</slot>
+ </connection>
+ <connection>
+ <sender>addPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>GetAddressForm</receiver>
+ <slot>addLocalAddress()</slot>
+ </connection>
+ <connection>
+ <sender>deletePushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>GetAddressForm</receiver>
+ <slot>deleteLocalAddress()</slot>
+ </connection>
+ <connection>
+ <sender>editPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>GetAddressForm</receiver>
+ <slot>editLocalAddress()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>addressListView</tabstop>
+ <tabstop>sipOnlyCheckBox</tabstop>
+ <tabstop>reloadPushButton</tabstop>
+ <tabstop>addressTabWidget</tabstop>
+ <tabstop>localListView</tabstop>
+ <tabstop>addPushButton</tabstop>
+ <tabstop>deletePushButton</tabstop>
+ <tabstop>editPushButton</tabstop>
+ <tabstop>okPushButton</tabstop>
+ <tabstop>cancelPushButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in declaration">user.h</include>
+ <include location="local" impldecl="in implementation">qlistview.h</include>
+ <include location="local" impldecl="in implementation">qstring.h</include>
+ <include location="local" impldecl="in implementation">qmessagebox.h</include>
+ <include location="local" impldecl="in implementation">protocol.h</include>
+ <include location="local" impldecl="in implementation">sys_settings.h</include>
+ <include location="local" impldecl="in implementation">util.h</include>
+ <include location="local" impldecl="in implementation">qregexp.h</include>
+ <include location="local" impldecl="in implementation">sockets/url.h</include>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">address_book.h</include>
+ <include location="local" impldecl="in implementation">addresslistviewitem.h</include>
+ <include location="local" impldecl="in implementation">addresscardform.h</include>
+ <include location="local" impldecl="in implementation">getaddressform.ui.h</include>
+</includes>
+<variables>
+ <variable access="private">void *addrBook;</variable>
+</variables>
+<signals>
+ <signal>address(const QString &amp;, const QString &amp;)</signal>
+ <signal>address(const QString &amp;)</signal>
+</signals>
+<slots>
+ <slot>reload()</slot>
+ <slot>show()</slot>
+ <slot>loadAddresses()</slot>
+ <slot>loadLocalAddresses()</slot>
+ <slot>selectAddress()</slot>
+ <slot>selectKABCAddress()</slot>
+ <slot>selectLocalAddress()</slot>
+ <slot>toggleSipOnly( bool on )</slot>
+ <slot>addLocalAddress()</slot>
+ <slot>deleteLocalAddress()</slot>
+ <slot>editLocalAddress()</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/getaddressform.ui.h b/src/gui/getaddressform.ui.h
new file mode 100644
index 0000000..b1f221d
--- /dev/null
+++ b/src/gui/getaddressform.ui.h
@@ -0,0 +1,259 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you want to add, delete, or rename functions or slots, use
+** Qt Designer to update this file, preserving your code.
+**
+** You should not define a constructor or destructor in this file.
+** Instead, write your code in functions called init() and destroy().
+** These will automatically be called by the form's constructor and
+** destructor.
+*****************************************************************************/
+
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#define TAB_KABC 0
+#define TAB_LOCAL 1
+
+#ifdef HAVE_KDE
+#include <kabc/addressbook.h>
+#include <kabc/addressee.h>
+#include <kabc/addresseelist.h>
+#include <kabc/phonenumber.h>
+#include <kabc/stdaddressbook.h>
+
+#define ABOOK ((KABC::AddressBook *)addrBook)
+
+// Column numbers
+#define AB_COL_NAME 0
+#define AB_COL_PHONE 2
+#endif
+
+void GetAddressForm::init()
+{
+#ifdef HAVE_KDE
+ addrBook = (void *)KABC::StdAddressBook::self(false);
+ loadAddresses();
+
+ connect(ABOOK,
+ SIGNAL(addressBookChanged(AddressBook *)),
+ this, SLOT(loadAddresses()));
+
+ sipOnlyCheckBox->setChecked(sys_config->get_ab_show_sip_only());
+#else
+ addressTabWidget->setTabEnabled(tabKABC, false);
+ addressTabWidget->setCurrentPage(TAB_LOCAL);
+#endif
+ loadLocalAddresses();
+}
+
+void GetAddressForm::reload()
+{
+#ifdef HAVE_KDE
+ ABOOK->disconnect();
+ KABC::StdAddressBook::close();
+ addrBook = (void *)KABC::StdAddressBook::self(false);
+ loadAddresses();
+
+ connect(ABOOK,
+ SIGNAL(addressBookChanged(AddressBook *)),
+ this, SLOT(loadAddresses()));
+#endif
+}
+
+void GetAddressForm::show()
+{
+ QDialog::show();
+
+#ifdef HAVE_KDE
+ if (addressListView->childCount() == 0) {
+ if (localListView->childCount() == 0) {
+ QMessageBox::information(this, PRODUCT_NAME, tr(
+ "<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>"));
+ } else {
+ addressTabWidget->setCurrentPage(TAB_LOCAL);
+ }
+ }
+#endif
+}
+
+void GetAddressForm::loadAddresses()
+{
+#ifdef HAVE_KDE
+ // Explicit loading of address book is not needed as it is
+ // automatically loaded.
+ // if (!ABOOK->load()) return;
+
+ addressListView->clear();
+ for (KABC::AddressBook::Iterator i = ABOOK->begin(); i != ABOOK->end(); i++)
+ {
+ KABC::PhoneNumber::List phoneNrs = i->phoneNumbers();
+ for (KABC::PhoneNumber::List::iterator j = phoneNrs.begin();
+ j != phoneNrs.end(); j++)
+ {
+ QString phone = (*j).number();
+ if (!sys_config->get_ab_show_sip_only() ||
+ phone.startsWith("sip:"))
+ {
+ new QListViewItem(addressListView, i->realName(),
+ (*j).typeLabel(), phone);
+ }
+ }
+ }
+
+ QListViewItem *first = addressListView->firstChild();
+ if (first) addressListView->setSelected(first, true);
+#endif
+}
+
+void GetAddressForm::loadLocalAddresses()
+{
+ localListView->clear();
+ const list<t_address_card> &address_list = ab_local->get_address_list();
+
+ for(list<t_address_card>::const_iterator i = address_list.begin(); i != address_list.end(); i++)
+ {
+ new AddressListViewItem(localListView, *i);
+ }
+
+ QListViewItem *first = localListView->firstChild();
+ if (first) localListView->setSelected(first, true);
+}
+
+void GetAddressForm::selectAddress()
+{
+ if (addressTabWidget->currentPageIndex() == TAB_KABC) {
+ selectKABCAddress();
+ } else {
+ selectLocalAddress();
+ }
+}
+
+void GetAddressForm::selectKABCAddress()
+{
+#ifdef HAVE_KDE
+ QListViewItem *item = addressListView->selectedItem();
+ if (item) {
+ QString name(item->text(AB_COL_NAME));
+ QString phone(item->text(AB_COL_PHONE));
+ phone = phone.stripWhiteSpace();
+
+ emit address(name, phone);
+
+ // Signal display name and url combined.
+ t_display_url du(t_url(phone.ascii()), name.ascii());
+ emit address(du.encode().c_str());
+ }
+
+ accept();
+#endif
+}
+
+void GetAddressForm::selectLocalAddress()
+{
+ AddressListViewItem *item = dynamic_cast<AddressListViewItem *>(
+ localListView->selectedItem());
+ if (item) {
+ t_address_card card = item->getAddressCard();
+ emit(card.get_display_name().c_str(), card.sip_address.c_str());
+
+ // Signal display name and url combined.
+ t_display_url du(t_url(card.sip_address), card.get_display_name());
+ emit address(du.encode().c_str());
+ }
+
+ accept();
+}
+
+void GetAddressForm::toggleSipOnly(bool on)
+{
+#ifdef HAVE_KDE
+ string msg;
+
+ sys_config->set_ab_show_sip_only(on);
+
+ // Ignore write failures. If for some reason the system config
+ // could not be written, then this settings is lost after exiting Twinkle.
+ // No need to bother the user at this point.
+ (void)sys_config->write_config(msg);
+
+ loadAddresses();
+#endif
+}
+
+void GetAddressForm::addLocalAddress()
+{
+ t_address_card card;
+ AddressCardForm f;
+ if (f.exec(card)) {
+ ab_local->add_address(card);
+ new AddressListViewItem(localListView, card);
+
+ string error_msg;
+ if (!ab_local->save(error_msg)) {
+ ui->cb_show_msg(error_msg, MSG_CRITICAL);
+ }
+ }
+}
+
+void GetAddressForm::deleteLocalAddress()
+{
+ AddressListViewItem *item = dynamic_cast<AddressListViewItem *>(
+ localListView->selectedItem());
+ if (item) {
+ t_address_card card = item->getAddressCard();
+ if (ab_local->del_address(card)) {
+ delete item;
+
+ string error_msg;
+ if (!ab_local->save(error_msg)) {
+ ui->cb_show_msg(error_msg, MSG_CRITICAL);
+ }
+ }
+ }
+}
+
+void GetAddressForm::editLocalAddress()
+{
+ AddressListViewItem *item = dynamic_cast<AddressListViewItem *>(
+ localListView->selectedItem());
+ if (!item) return;
+
+ t_address_card oldCard = item->getAddressCard();
+ t_address_card newCard = oldCard;
+ AddressCardForm f;
+ if (f.exec(newCard)) {
+ if (ab_local->update_address(oldCard, newCard)) {
+ item->update(newCard);
+
+ string error_msg;
+ if (!ab_local->save(error_msg)) {
+ ui->cb_show_msg(error_msg, MSG_CRITICAL);
+ }
+ }
+ }
+}
diff --git a/src/gui/getprofilenameform.ui b/src/gui/getprofilenameform.ui
new file mode 100644
index 0000000..599d778
--- /dev/null
+++ b/src/gui/getprofilenameform.ui
@@ -0,0 +1,174 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>GetProfileNameForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>GetProfileNameForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>430</width>
+ <height>127</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Profile name</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>userIconTextLabel</cstring>
+ </property>
+ <property name="backgroundOrigin">
+ <enum>WidgetOrigin</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>penguin_big.png</pixmap>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout24</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer41</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>81</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layout26</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>profileTextLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Enter a name for your profile:</string>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>profileLineEdit</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;b&gt;The name of your profile&lt;/b&gt;
+&lt;br&gt;&lt;br&gt;
+A profile contains your user settings, e.g. your user name and password. You have to give each profile a name.
+&lt;br&gt;&lt;br&gt;
+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.
+&lt;br&gt;&lt;br&gt;
+To remember your profiles easily you could use your SIP user name as a profile name, e.g. &lt;b&gt;example@example.com&lt;/b&gt;</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>GetProfileNameForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>GetProfileNameForm</receiver>
+ <slot>validate()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>profileLineEdit</tabstop>
+ <tabstop>okPushButton</tabstop>
+ <tabstop>cancelPushButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">qlineedit.h</include>
+ <include location="local" impldecl="in implementation">qregexp.h</include>
+ <include location="local" impldecl="in implementation">qvalidator.h</include>
+ <include location="local" impldecl="in implementation">protocol.h</include>
+ <include location="local" impldecl="in implementation">qmessagebox.h</include>
+ <include location="local" impldecl="in implementation">qdir.h</include>
+ <include location="local" impldecl="in implementation">qfile.h</include>
+ <include location="local" impldecl="in implementation">user.h</include>
+ <include location="local" impldecl="in implementation">getprofilenameform.ui.h</include>
+</includes>
+<slots>
+ <slot>validate()</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function returnType="QString">getProfileName()</function>
+ <function returnType="int">execNewName()</function>
+ <function returnType="int">execRename( const QString &amp; oldName )</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/getprofilenameform.ui.h b/src/gui/getprofilenameform.ui.h
new file mode 100644
index 0000000..00c2f18
--- /dev/null
+++ b/src/gui/getprofilenameform.ui.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+
+void GetProfileNameForm::init()
+{
+ // Letters, digits, underscore, minus
+ QRegExp rxFilenameChars("[\\w\\-][\\w\\-@\\.]*");
+
+ // Set validators
+ // USER
+ profileLineEdit->setValidator(new QRegExpValidator(rxFilenameChars, this));
+}
+
+void GetProfileNameForm::validate()
+{
+ if (profileLineEdit->text().isEmpty()) return;
+
+ // Find the .twinkle directory in HOME
+ QDir d = QDir::home();
+ if (!d.cd(USER_DIR)) {
+ QMessageBox::critical(this, PRODUCT_NAME,
+ tr("Cannot find .twinkle directory in your home directory."));
+ reject();
+ }
+
+ QString filename = profileLineEdit->text();
+ filename.append(USER_FILE_EXT);
+ QString fullname = d.filePath(filename);
+ if (QFile::exists(fullname)) {
+ QMessageBox::warning(this, PRODUCT_NAME,
+ tr("Profile already exists."));
+ return;
+ }
+
+ accept();
+}
+
+QString GetProfileNameForm:: getProfileName()
+{
+ return profileLineEdit->text();
+}
+
+// Execute a dialog to get a name for a new profile
+int GetProfileNameForm::execNewName()
+{
+ profileTextLabel->setText(tr("Enter a name for your profile:"));
+ return exec();
+}
+
+// Execute this dialog to get a new name for an existing profile
+int GetProfileNameForm::execRename(const QString &oldName)
+{
+ QString s = tr("Rename profile '%1' to:").arg(oldName);
+ profileTextLabel->setText(s);
+ return exec();
+}
diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp
new file mode 100644
index 0000000..f7d836d
--- /dev/null
+++ b/src/gui/gui.cpp
@@ -0,0 +1,3057 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include "twinkle_config.h"
+
+#include <iostream>
+#include <cstdlib>
+#include <qapplication.h>
+
+#ifdef HAVE_KDE
+#include <kmimetype.h>
+#include <krun.h>
+#include <kservice.h>
+#include <ktrader.h>
+#endif
+
+// This include is needed to avoid build error when building Twinkle
+// without Qt. One of the other includes below seems to include qdir.h
+// indirectly. But by that time it probably conflicts with a macro causing
+// compilation errors reported in qdir.h Include qdir.h here avoids the
+// conflict.
+#include "qdir.h"
+
+#include "gui.h"
+#include "line.h"
+#include "log.h"
+#include "sys_settings.h"
+#include "user.h"
+#include "cmd_socket.h"
+#include "audio/rtp_telephone_event.h"
+#include "sockets/interfaces.h"
+#include "threads/thread.h"
+#include "audits/memman.h"
+#include "authenticationform.h"
+#include "mphoneform.h"
+#include "selectnicform.h"
+#include "selectprofileform.h"
+#include "messageformview.h"
+#include "twinklesystray.h"
+#include "util.h"
+#include "address_finder.h"
+#include "yesnodialog.h"
+#include "command_args.h"
+#include "im/msg_session.h"
+
+#include "qcombobox.h"
+#include "qhbox.h"
+#include "qlabel.h"
+#include "qlayout.h"
+#include "qlistbox.h"
+#include "qmessagebox.h"
+#include "qpixmap.h"
+#include "qprocess.h"
+#include "qpushbutton.h"
+#include "qsize.h"
+#include "qsizepolicy.h"
+#include "qstring.h"
+#include "qtextcodec.h"
+#include "qtextedit.h"
+#include "qtoolbar.h"
+#include "qtooltip.h"
+#include "qvbox.h"
+
+extern string user_host;
+extern pthread_t thread_id_main;
+
+// External command arguments
+extern t_command_args g_cmd_args;
+
+QString str2html(const QString &s)
+{
+ QString result(s);
+
+ result.replace('&', "&amp;");
+ result.replace('<', "&lt;");
+ result.replace('>', "&gt;");
+
+ return result;
+}
+
+void setDisabledIcon(QAction *action, const QString &icon) {
+ QIconSet i = action->iconSet();
+ i.setPixmap(QPixmap::fromMimeSource(icon),
+ QIconSet::Automatic, QIconSet::Disabled);
+ action->setIconSet(i);
+}
+
+void setDisabledIcon(QToolButton *toolButton, const QString &icon) {
+ QIconSet i = toolButton->iconSet();
+ i.setPixmap(QPixmap::fromMimeSource(icon),
+ QIconSet::Automatic, QIconSet::Disabled);
+ toolButton->setIconSet(i);
+}
+
+/////////////////////////////////////////////////
+// PRIVATE
+/////////////////////////////////////////////////
+
+void t_gui::setLineFields(int line) {
+ if (line == 0) {
+ fromLabel = mainWindow->from1Label;
+ toLabel = mainWindow->to1Label;
+ subjectLabel = mainWindow->subject1Label;
+ codecLabel = mainWindow->codec1TextLabel;
+ photoLabel = mainWindow->photo1Label;
+ } else {
+ fromLabel = mainWindow->from2Label;
+ toLabel = mainWindow->to2Label;
+ subjectLabel = mainWindow->subject2Label;
+ codecLabel = mainWindow->codec2TextLabel;
+ photoLabel = mainWindow->photo2Label;
+ }
+}
+
+void t_gui::clearLineFields(int line) {
+ if (line >= NUM_USER_LINES) return;
+
+ setLineFields(line);
+ fromLabel->clear();
+ QToolTip::remove(fromLabel);
+ toLabel->clear();
+ QToolTip::remove(toLabel);
+ subjectLabel->clear();
+ QToolTip::remove(subjectLabel);
+ codecLabel->clear();
+ photoLabel->clear();
+ photoLabel->hide();
+}
+
+void t_gui::displayTo(const QString &s) {
+ toLabel->setText(s);
+ toLabel->setCursorPosition(0);
+ QToolTip::add(toLabel, s);
+}
+
+void t_gui::displayFrom(const QString &s) {
+ fromLabel->setText(s);
+ fromLabel->setCursorPosition(0);
+ QToolTip::add(fromLabel, s);
+}
+
+void t_gui::displaySubject(const QString &s) {
+ subjectLabel->setText(s);
+ subjectLabel->setCursorPosition(0);
+ QToolTip::add(subjectLabel, s);
+}
+
+void t_gui::displayCodecInfo(int line) {
+ if (line > NUM_USER_LINES) return;
+
+ setLineFields(line);
+ codecLabel->clear();
+
+ t_call_info call_info = phone->get_call_info(line);
+
+ if (call_info.send_codec == CODEC_NULL && call_info.recv_codec == CODEC_NULL) {
+ return;
+ }
+
+ if (call_info.send_codec == CODEC_NULL) {
+ codecLabel->setText(format_codec(call_info.recv_codec).c_str());
+ return;
+ }
+
+ if (call_info.recv_codec == CODEC_NULL) {
+ codecLabel->setText(format_codec(call_info.send_codec).c_str());
+ return;
+ }
+
+ if (call_info.send_codec == call_info.recv_codec) {
+ codecLabel->setText(format_codec(call_info.send_codec).c_str());
+ return;
+ }
+
+ QString s = format_codec(call_info.send_codec).c_str();
+ s.append('/').append(format_codec(call_info.recv_codec).c_str());
+ codecLabel->setText(s);
+}
+
+void t_gui::displayPhoto(const QImage &photo) {
+ if (mainWindow->getViewCompactLineStatus()) {
+ // In compact line status mode, no photo can be shown
+ return;
+ }
+
+ if (photo.isNull()) {
+ photoLabel->hide();
+ } else {
+ QPixmap pm;
+ pm.convertFromImage(photo.smoothScale(
+ photoLabel->width(), photoLabel->height(), QImage::ScaleMin));
+ photoLabel->setPixmap(pm);
+ photoLabel->show();
+ }
+}
+
+/////////////////////////////////////////////////
+// PROTECTED
+/////////////////////////////////////////////////
+bool t_gui::do_invite(const string &destination, const string &display,
+ const string &subject, bool immediate, bool anonymous)
+{
+ lock();
+ if (mainWindow->callInvite->isEnabled()) {
+ if (immediate) {
+ t_user *user = phone->ref_user_profile(
+ mainWindow->userComboBox->currentText().ascii());
+ t_url dst_url(expand_destination(user, destination));
+ if (dst_url.is_valid()) {
+ mainWindow->do_phoneInvite(user,
+ display.c_str(), dst_url, subject.c_str(),
+ anonymous);
+ }
+ } else {
+ t_url dest_url(destination);
+ t_display_url du(dest_url, display);
+ mainWindow->phoneInvite(du.encode().c_str(), subject.c_str(),
+ anonymous);
+ }
+ }
+ unlock();
+
+ return true;
+}
+
+void t_gui::do_redial(void) {
+ lock();
+ if (mainWindow->callRedial->isEnabled()) {
+ mainWindow->phoneRedial();
+ }
+ unlock();
+}
+
+void t_gui::do_answer(void) {
+ lock();
+ if (mainWindow->callAnswer->isEnabled()) {
+ mainWindow->phoneAnswer();
+ }
+ unlock();
+}
+
+void t_gui::do_answerbye(void) {
+ lock();
+ if (mainWindow->callAnswer->isEnabled()) {
+ mainWindow->phoneAnswer();
+ } else if (mainWindow->callBye->isEnabled()) {
+ mainWindow->phoneBye();
+ }
+ unlock();
+}
+
+void t_gui::do_reject(void) {
+ lock();
+ if (mainWindow->callReject->isEnabled()) {
+ mainWindow->phoneReject();
+ }
+ unlock();
+}
+
+void t_gui::do_redirect(bool show_status, bool type_present, t_cf_type cf_type,
+ bool action_present, bool enable, int num_redirections,
+ const list<string> &dest_strlist, bool immediate)
+{
+ if (show_status) {
+ // Show status not supported in GUI
+ return;
+ }
+
+ t_user *user = phone->ref_user_profile(mainWindow->
+ userComboBox->currentText().ascii());
+
+ list<t_display_url> dest_list;
+ for (list<string>::const_iterator i = dest_strlist.begin();
+ i != dest_strlist.end(); i++)
+ {
+ t_display_url du;
+ du.url = expand_destination(user, *i);
+ du.display.clear();
+ if (!du.is_valid()) return;
+ dest_list.push_back(du);
+ }
+
+ // Enable/disable permanent redirections
+ if (type_present) {
+ lock();
+ if (enable) {
+ phone->ref_service(user)->enable_cf(cf_type, dest_list);
+ } else {
+ phone->ref_service(user)->disable_cf(cf_type);
+ }
+ mainWindow->updateServicesStatus();
+ unlock();
+
+ return;
+ } else {
+ if (action_present) {
+ if (!enable) {
+ lock();
+ phone->ref_service(user)->disable_cf(CF_ALWAYS);
+ phone->ref_service(user)->disable_cf(CF_BUSY);
+ phone->ref_service(user)->disable_cf(CF_NOANSWER);
+ mainWindow->updateServicesStatus();
+ unlock();
+ }
+
+ return;
+ }
+ }
+
+ lock();
+ if (mainWindow->callRedirect->isEnabled()) {
+ if (immediate) {
+ mainWindow->do_phoneRedirect(dest_list);
+ } else {
+ mainWindow->phoneRedirect(dest_strlist);
+ }
+ }
+ unlock();
+
+ return;
+}
+
+void t_gui::do_dnd(bool show_status, bool toggle, bool enable) {
+ if (show_status) {
+ // Show status not supported in GUI
+ return;
+ }
+
+ lock();
+ if (phone->ref_users().size() == 1) {
+ if (toggle) {
+ enable = !mainWindow->serviceDnd->isOn();
+ }
+ mainWindow->srvDnd(enable);
+ mainWindow->serviceDnd->setOn(enable);
+ } else {
+ t_user *user = phone->ref_user_profile(mainWindow->
+ userComboBox->currentText().ascii());
+ list<t_user *> l;
+ l.push_back(user);
+ if (toggle) {
+ enable = !phone->ref_service(user)->is_dnd_active();
+ }
+
+ if (enable) {
+ mainWindow->do_srvDnd_enable(l);
+ } else {
+ mainWindow->do_srvDnd_disable(l);
+ }
+ }
+ unlock();
+}
+
+void t_gui::do_auto_answer(bool show_status, bool toggle, bool enable) {
+ if (show_status) {
+ // Show status not supported in GUI
+ return;
+ }
+
+ lock();
+ if (phone->ref_users().size() == 1) {
+ if (toggle) {
+ enable = !mainWindow->serviceAutoAnswer->isOn();
+ }
+ mainWindow->srvAutoAnswer(enable);
+ mainWindow->serviceAutoAnswer->setOn(enable);
+ } else {
+ t_user *user = phone->ref_user_profile(mainWindow->
+ userComboBox->currentText().ascii());
+ list<t_user *> l;
+ l.push_back(user);
+ if (toggle) {
+ enable = !phone->ref_service(user)->
+ is_auto_answer_active();
+ }
+
+ if (enable) {
+ mainWindow->do_srvAutoAnswer_enable(l);
+ } else {
+ mainWindow->do_srvAutoAnswer_disable(l);
+ }
+ }
+ unlock();
+}
+
+void t_gui::do_bye(void) {
+ lock();
+ if (mainWindow->callBye->isEnabled()) {
+ mainWindow->phoneBye();
+ }
+ unlock();
+}
+
+void t_gui::do_hold(void) {
+ lock();
+ if (mainWindow->callHold->isEnabled() && !mainWindow->callHold->isOn()) {
+ mainWindow->phoneHold(true);
+ }
+ unlock();
+}
+
+void t_gui::do_retrieve(void) {
+ lock();
+ if (mainWindow->callHold->isEnabled() && mainWindow->callHold->isOn()) {
+ mainWindow->phoneHold(false);
+ }
+ unlock();
+}
+
+bool t_gui::do_refer(const string &destination, t_transfer_type transfer_type, bool immediate) {
+ lock();
+ if (mainWindow->callTransfer->isEnabled() &&
+ !mainWindow->callTransfer->isOn())
+ {
+ if (immediate) {
+ t_display_url du;
+ t_user *user = phone->ref_user_profile(mainWindow->
+ userComboBox->currentText().ascii());
+ du.url = expand_destination(user, destination);
+
+ if (du.is_valid() || transfer_type == TRANSFER_OTHER_LINE) {
+ mainWindow->do_phoneTransfer(du, transfer_type);
+ }
+ } else {
+ mainWindow->phoneTransfer(destination, transfer_type);
+ }
+ } else if(mainWindow->callTransfer->isEnabled() &&
+ mainWindow->callTransfer->isOn())
+ {
+ if (transfer_type != TRANSFER_CONSULT) {
+ mainWindow->do_phoneTransferLine();
+ }
+ }
+ unlock();
+
+ return true;
+}
+
+void t_gui::do_conference(void) {
+ lock();
+ if (mainWindow->callConference->isEnabled()) {
+ mainWindow->phoneConference();
+ }
+ unlock();
+}
+
+void t_gui::do_mute(bool show_status, bool toggle, bool enable) {
+ if (show_status) {
+ // Show status not supported in GUI
+ return;
+ }
+
+ lock();
+ if (mainWindow->callMute->isEnabled()) {
+ if (toggle) enable = !phone->is_line_muted(phone->get_active_line());
+ mainWindow->phoneMute(enable);
+ }
+ unlock();
+}
+
+void t_gui::do_dtmf(const string &digits) {
+ lock();
+ if (mainWindow->callDTMF->isEnabled()) {
+ mainWindow->sendDTMF(digits.c_str());
+ }
+ unlock();
+}
+
+void t_gui::do_register(bool reg_all_profiles) {
+ lock();
+ list<t_user *> l;
+
+ if (reg_all_profiles) {
+ l = phone->ref_users();
+ } else {
+ t_user *user = phone->ref_user_profile(mainWindow->
+ userComboBox->currentText().ascii());
+ l.push_back(user);
+ }
+
+ mainWindow->do_phoneRegister(l);
+ unlock();
+}
+
+void t_gui::do_deregister(bool dereg_all_profiles, bool dereg_all_devices) {
+ lock();
+ list<t_user *> l;
+
+ if (dereg_all_profiles) {
+ l = phone->ref_users();
+ } else {
+ t_user *user = phone->ref_user_profile(mainWindow->
+ userComboBox->currentText().ascii());
+ l.push_back(user);
+ }
+
+ if (dereg_all_devices) {
+ mainWindow->do_phoneDeregisterAll(l);
+ } else {
+ mainWindow->do_phoneDeregister(l);
+ }
+ unlock();
+}
+
+void t_gui::do_fetch_registrations(void) {
+ lock();
+ mainWindow->phoneShowRegistrations();
+ unlock();
+}
+
+bool t_gui::do_options(bool dest_set, const string &destination, bool immediate) {
+ lock();
+ // In-dialog OPTIONS request
+ int line = phone->get_active_line();
+ if (phone->get_line_substate(line) == LSSUB_ESTABLISHED) {
+ ((t_gui *)ui)->action_options();
+ return true;
+ }
+
+ if (immediate) {
+ t_user *user = phone->ref_user_profile(mainWindow->
+ userComboBox->currentText().ascii());
+ t_url dst_url(expand_destination(user, destination));
+
+ if (dst_url.is_valid()) {
+ mainWindow->do_phoneTermCap(user, dst_url);
+ }
+ } else {
+ mainWindow->phoneTermCap(destination.c_str());
+ }
+ unlock();
+
+ return true;
+}
+
+void t_gui::do_line(int line) {
+ // Cannot get current line number via CLI interface on GUI.
+ // So return in this case.
+ if (line == 0) return;
+
+ phone->pub_activate_line(line - 1);
+}
+
+void t_gui::do_user(const string &profile_name) {
+ lock();
+ for (int i = 0; i < mainWindow->userComboBox->count(); i++) {
+ if (mainWindow->userComboBox->text(i) == profile_name.c_str())
+ {
+ mainWindow->userComboBox->setCurrentItem(i);
+ }
+ }
+ unlock();
+}
+
+bool t_gui::do_message(const string &destination, const string &display,
+ const im::t_msg &msg)
+{
+ t_user *user = phone->ref_user_profile(mainWindow->
+ userComboBox->currentText().ascii());
+
+ t_url dest_url(expand_destination(user, destination));
+
+ if (dest_url.is_valid()) {
+ phone->pub_send_message(user, dest_url, display, msg);
+ }
+
+ return true;
+}
+
+void t_gui::do_presence(t_presence_state::t_basic_state basic_state) {
+ t_user *user = phone->ref_user_profile(mainWindow->
+ userComboBox->currentText().ascii());
+
+ phone->pub_publish_presence(user, basic_state);
+}
+
+void t_gui::do_zrtp(t_zrtp_cmd zrtp_cmd) {
+ lock();
+
+ switch (zrtp_cmd) {
+ case ZRTP_ENCRYPT:
+ mainWindow->phoneEnableZrtp(true);
+ break;
+ case ZRTP_GO_CLEAR:
+ mainWindow->phoneEnableZrtp(false);
+ break;
+ case ZRTP_CONFIRM_SAS:
+ mainWindow->phoneConfirmZrtpSas();
+ break;
+ case ZRTP_RESET_SAS:
+ mainWindow->phoneResetZrtpSasConfirmation();
+ break;
+ default:
+ assert(false);
+ }
+
+ unlock();
+}
+
+
+
+void t_gui::do_quit(void) {
+ lock();
+ mainWindow->fileExit();
+ unlock();
+}
+
+void t_gui::do_help(const list<t_command_arg> &al) {
+ // Nothing to do in GUI mode
+ return;
+}
+
+
+/////////////////////////////////////////////////
+// PUBLIC
+/////////////////////////////////////////////////
+
+t_gui::t_gui(t_phone *_phone) : t_userintf(_phone), timerUpdateMessageSessions(NULL)
+{
+ use_stdout = false;
+ lastFileBrowsePath = DIR_HOME;
+
+ mainWindow = new MphoneForm(0, 0, Qt::WType_TopLevel | Qt::WStyle_ContextHelp);
+#ifdef HAVE_KDE
+ sys_tray_popup = NULL;
+#endif
+
+ for (int i = 0; i < NUM_USER_LINES; i++) {
+ QObject::connect(&autoShowTimer[i], SIGNAL(timeout()),
+ mainWindow, SLOT(show()));
+ }
+
+ MEMMAN_NEW(mainWindow);
+ qApp->setMainWidget(mainWindow);
+}
+
+t_gui::~t_gui() {
+ destroyAllMessageSessions();
+
+ MEMMAN_DELETE(mainWindow);
+ delete mainWindow;
+}
+
+void t_gui::run(void) {
+ // Start asynchronous event processor
+ thr_process_events = new t_thread(process_events_main, NULL);
+ MEMMAN_NEW(thr_process_events);
+
+ QString s;
+ list<t_user *> user_list = phone->ref_users();
+
+ // The Qt event loop is not running yet. Explicitly take the Qt lock
+ // to avoid race conditions with other threads that may call GUI call
+ // backs.
+ // NOTE: the t_gui::lock() method cannot be used as this method
+ // will not lock from the main thread and we are running in the
+ // main thread (a bit of a kludge).
+ qApp->lock();
+
+ // Set configuration file name in titlebar
+ s = PRODUCT_NAME;
+ mainWindow->setCaption(s);
+
+ // Set user combo box
+ mainWindow->updateUserComboBox();
+
+ // Display product information
+ s = PRODUCT_NAME;
+ s.append(' ').append(PRODUCT_VERSION).append(", ");
+ s.append(sys_config->get_product_date().c_str());
+ mainWindow->display(s);
+ s = "Copyright (C) 2005-2009 ";
+ s.append(PRODUCT_AUTHOR);
+ mainWindow->display(s);
+
+ // Restore user interface state from previous session
+ restore_state();
+
+ // Initialize phone functions
+ phone->init();
+
+ // Set controls in correct status
+ mainWindow->updateState();
+ mainWindow->updateRegStatus();
+ mainWindow->updateMwi();
+ mainWindow->updateServicesStatus();
+ mainWindow->updateMissedCallStatus(0);
+ mainWindow->updateMenuStatus();
+
+ // Clear line field info fields
+ clearLineFields(0);
+ clearLineFields(1);
+
+ // Populate buddy list
+ mainWindow->populateBuddyList();
+
+ // Set width of window to width of tool bar
+ int widthToolBar = mainWindow->callToolbar->width();
+ QSize sizeMainWin = mainWindow->size();
+ sizeMainWin.setWidth(widthToolBar);
+ mainWindow->resize(sizeMainWin);
+
+ // Start QApplication/KApplication
+ if (qApp->isSessionRestored() &&
+ sys_config->get_ui_session_id() == qApp->sessionId().ascii())
+ {
+ // Restore previous session
+ restore_session_state();
+ } else {
+ if ((sys_config->get_start_hidden() && !g_cmd_args.cmd_show) ||
+ g_cmd_args.cmd_hide)
+ {
+ mainWindow->hide();
+ } else {
+ mainWindow->show();
+ }
+ }
+
+ // Activate a profile if the --set-profile option was given on the command
+ // line.
+ if (!g_cmd_args.cmd_set_profile.isEmpty()) {
+ cmdsocket::cmd_cli(string("user ") +
+ g_cmd_args.cmd_set_profile.ascii(), true);
+ }
+
+ // Execute the call command if a callto destination was specified on the
+ // command line
+ if (!g_cmd_args.callto_destination.isEmpty()) {
+ cmdsocket::cmd_call(g_cmd_args.callto_destination.ascii(),
+ g_cmd_args.cmd_immediate_mode);
+ }
+
+ // Execute a CLI command if one was given on the command line
+ if (!g_cmd_args.cli_command.isEmpty()) {
+ cmdsocket::cmd_cli(g_cmd_args.cli_command.ascii(),
+ g_cmd_args.cmd_immediate_mode);
+ }
+
+ qApp->unlock();
+
+ // Start Qt application
+ qApp->exec();
+
+ // Terminate phone functions
+ phone->terminate();
+
+ // Make user interface state persistent
+ save_state();
+}
+
+void t_gui::save_state(void) {
+ lock();
+
+ sys_config->set_last_used_profile(
+ mainWindow->userComboBox->currentText().ascii());
+
+ list<string> history;
+ for (int i = 0; i < mainWindow->callComboBox->count(); i++) {
+ history.push_back(mainWindow->callComboBox->text(i).ascii());
+ }
+ sys_config->set_dial_history(history);
+
+ sys_config->set_show_display(mainWindow->getViewDisplay());
+ sys_config->set_compact_line_status(mainWindow->getViewCompactLineStatus());
+ sys_config->set_show_buddy_list(mainWindow->getViewBuddyList());
+
+ t_userintf::save_state();
+
+ unlock();
+}
+
+void t_gui::restore_state(void) {
+ lock();
+
+ // The last used profile is selected when the userComboBox is
+ // filled by MphoneForm::updateUserComboBox
+
+ mainWindow->callComboBox->clear();
+ list<string> dial_history = sys_config->get_dial_history();
+ for (list<string>::reverse_iterator i = dial_history.rbegin(); i != dial_history.rend(); i++)
+ {
+ mainWindow->addToCallComboBox(i->c_str());
+ }
+
+ mainWindow->showDisplay(sys_config->get_show_display());
+ mainWindow->showCompactLineStatus(sys_config->get_compact_line_status());
+ mainWindow->showBuddyList(sys_config->get_show_buddy_list());
+
+ t_userintf::restore_state();
+
+ unlock();
+}
+
+void t_gui::save_session_state(void) {
+ lock();
+
+ t_win_geometry geometry(mainWindow->x(), mainWindow->y(),
+ mainWindow->width(), mainWindow->height());
+ sys_config->set_ui_session_main_geometry(geometry);
+ sys_config->set_ui_session_main_state(mainWindow->windowState());
+ sys_config->set_ui_session_main_hidden(mainWindow->isHidden());
+
+ unlock();
+}
+
+void t_gui::restore_session_state(void) {
+ lock();
+
+ t_win_geometry geometry = sys_config->get_ui_session_main_geometry();
+ mainWindow->setGeometry(geometry.x, geometry.y, geometry.width, geometry.height);
+ mainWindow->setWindowState(sys_config->get_ui_session_main_state());
+ mainWindow->setHidden(sys_config->get_ui_session_main_hidden());
+
+ unlock();
+}
+
+void t_gui::lock(void) {
+ // To synchronize actions on the Qt widget the application lock
+ // is used. The main thread running the Qt event loop takes the
+ // application lock itself already. So take the lock if this is not the
+ // main thread.
+ // If the Qt event loop has not been started yet, then the lock
+ // should also be taken from the main thread.
+ t_userintf::lock();
+ if (!t_thread::is_self(thread_id_main)) {
+ qApp->lock();
+ }
+}
+
+void t_gui::unlock(void) {
+ t_userintf::lock();
+ if (!t_thread::is_self(thread_id_main)) {
+ qApp->unlock();
+ }
+}
+
+string t_gui::select_network_intf(void) {
+ string ip;
+ list<t_interface> *l = get_interfaces();
+ // The socket routines are not under control of MEMMAN so report
+ // the allocation here.
+ MEMMAN_NEW(l);
+ if (l->size() == 0) {
+ cb_show_msg(qApp->translate("GUI",
+ "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.").ascii(),
+ MSG_WARNING);
+
+ MEMMAN_DELETE(l);
+ delete l;
+ return "127.0.0.1";
+ }
+
+ if (l->size() == 1) {
+ // There is only 1 interface
+ ip = l->front().get_ip_addr();
+ } else {
+ // There are multiple interfaces
+ SelectNicForm *sf = new SelectNicForm(NULL, "nic", true);
+ MEMMAN_NEW(sf);
+ QString item;
+ for (list<t_interface>::iterator i = l->begin(); i != l->end(); i++) {
+ item = i->name.c_str();
+ item.append(':').append(i->get_ip_addr().c_str());
+ sf->nicListBox->insertItem(
+ QPixmap::fromMimeSource("kcmpci16.png"),
+ item);
+ }
+
+ sf->nicListBox->setCurrentItem(0);
+ sf->exec();
+
+ int selection = sf->nicListBox->currentItem();
+ int num = 0;
+ for (list<t_interface>::iterator i = l->begin(); i != l->end(); i++) {
+ if (num == selection) {
+ ip = i->get_ip_addr();
+ break;
+ }
+ num++;
+ }
+
+ MEMMAN_DELETE(sf);
+ delete sf;
+ }
+
+ MEMMAN_DELETE(l);
+ delete l;
+ return ip;
+}
+
+bool t_gui::select_user_config(list<string> &config_files) {
+ SelectProfileForm f(0, "select user profile", true);
+
+ if (f.execForm()) {
+ config_files = f.selectedProfiles;
+ return true;
+ }
+
+ return false;
+}
+
+// GUI call back functions
+
+void t_gui::cb_incoming_call(t_user *user_config, int line, const t_request *r) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ setLineFields(line);
+
+ // Incoming call for to-header
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: incoming call for %2").arg(line + 1).arg(
+ format_sip_address(user_config, r->hdr_to.display, r->hdr_to.uri).c_str());
+ mainWindow->display(s);
+
+ // Is this a transferred call?
+ QString referredByParty;
+ if (r->hdr_referred_by.is_populated()) {
+ referredByParty = format_sip_address(user_config,
+ r->hdr_referred_by.display, r->hdr_referred_by.uri).c_str();
+ s = "Call transferred by ";
+ s = qApp->translate("GUI", "Call transferred by %1").arg(referredByParty);
+ mainWindow->display(s);
+ }
+
+ // From
+ QString fromParty = format_sip_address(user_config,
+ r->hdr_from.get_display_presentation(), r->hdr_from.uri).c_str();
+ s = fromParty;
+ QString organization("");
+ if (r->hdr_organization.is_populated()) {
+ organization = r->hdr_organization.name.c_str();
+ s.append(", ").append(organization);
+ }
+ displayFrom(s);
+
+ // Display photo
+ QImage fromPhoto;
+
+ if (sys_config->get_ab_lookup_photo()) {
+ t_address_finder *af = t_address_finder::get_instance();
+ fromPhoto = af->find_photo(user_config, r->hdr_from.uri);
+ }
+
+ displayPhoto(fromPhoto);
+
+ // To
+ s = "";
+ s.append(format_sip_address(user_config, r->hdr_to.display, r->hdr_to.uri).c_str());
+ displayTo(s);
+
+ // Subject
+ QString subject("");
+ if (r->hdr_subject.is_populated()) {
+ subject = r->hdr_subject.subject.c_str();
+ }
+ displaySubject(subject);
+
+ cb_notify_call(line, fromParty, organization, fromPhoto, subject, referredByParty);
+
+ unlock();
+}
+
+void t_gui::cb_call_cancelled(int line) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: far end cancelled call.").arg(line + 1);
+ mainWindow->display(s);
+
+ cb_stop_call_notification(line);
+
+ unlock();
+}
+
+void t_gui::cb_far_end_hung_up(int line) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: far end released call.").arg(line + 1);
+ mainWindow->display(s);
+
+ cb_stop_call_notification(line);
+
+ unlock();
+}
+
+void t_gui::cb_answer_timeout(int line) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+
+ cb_stop_call_notification(line);
+
+ unlock();
+}
+
+void t_gui::cb_sdp_answer_not_supported(int line, const string &reason) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: SDP answer from far end not supported.").arg(line + 1);
+ mainWindow->display(s);
+
+ s = reason.c_str();
+ mainWindow->display(s);
+
+ cb_stop_call_notification(line);
+
+ unlock();
+}
+
+void t_gui::cb_sdp_answer_missing(int line) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: SDP answer from far end missing.").arg(line + 1);
+ mainWindow->display(s);
+
+ cb_stop_call_notification(line);
+
+ unlock();
+}
+
+void t_gui::cb_unsupported_content_type(int line, const t_sip_message *r) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: Unsupported content type in answer from far end.").arg(line + 1);
+ mainWindow->display(s);
+
+ s = r->hdr_content_type.media.type.c_str();
+ s.append("/").append(r->hdr_content_type.media.subtype.c_str());
+ mainWindow->display(s);
+
+ cb_stop_call_notification(line);
+
+ unlock();
+}
+
+void t_gui::cb_ack_timeout(int line) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: no ACK received, call will be terminated.").arg(line + 1);
+ mainWindow->display(s);
+
+ cb_stop_call_notification(line);
+
+ unlock();
+}
+
+void t_gui::cb_100rel_timeout(int line) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: no PRACK received, call will be terminated.").arg(line + 1);
+ mainWindow->display(s);
+
+ cb_stop_call_notification(line);
+
+ unlock();
+}
+
+void t_gui::cb_prack_failed(int line, const t_response *r) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: PRACK failed.").arg(line + 1);
+ mainWindow->display(s);
+
+ s = QString().setNum(r->code);
+ s.append(' ').append(r->reason.c_str());
+ mainWindow->display(s);
+
+ cb_stop_call_notification(line);
+
+ unlock();
+}
+
+void t_gui::cb_provisional_resp_invite(int line, const t_response *r) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ mainWindow->updateState();
+ unlock();
+}
+
+void t_gui::cb_cancel_failed(int line, const t_response *r) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: failed to cancel call.").arg(line + 1);
+ mainWindow->display(s);
+
+ s = QString().setNum(r->code);
+ s.append(' ').append(r->reason.c_str());
+ mainWindow->display(s);
+
+ unlock();
+}
+
+void t_gui::cb_call_answered(t_user *user_config, int line, const t_response *r) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ setLineFields(line);
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: far end answered call.").arg(line + 1);
+ mainWindow->display(s);
+
+ // Put far-end party in line to-field
+ s = "";
+ s.append(format_sip_address(user_config, r->hdr_to.display, r->hdr_to.uri).c_str());
+ if (r->hdr_organization.is_populated()) {
+ s.append(", ").append(r->hdr_organization.name.c_str());
+ }
+ displayTo(s);
+
+ unlock();
+}
+
+void t_gui::cb_call_failed(t_user *user_config, int line, const t_response *r) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: call failed.").arg(line + 1);
+ mainWindow->display(s);
+
+ s = QString().setNum(r->code);
+ s.append(' ').append(r->reason.c_str());
+ mainWindow->display(s);
+
+ // Warnings
+ if (r->hdr_warning.is_populated()) {
+ list<string> l = format_warnings(r->hdr_warning);
+ for (list<string>::iterator i = l.begin(); i != l.end(); i++) {
+ mainWindow->display(i->c_str());
+ }
+ }
+
+ // Redirect response
+ if (r->get_class() == R_3XX && r->hdr_contact.is_populated()) {
+ list<t_contact_param> l = r->hdr_contact.contact_list;
+ l.sort();
+ mainWindow->display(qApp->translate("GUI",
+ "The call can be redirected to:"));
+ for (list<t_contact_param>::iterator i = l.begin();
+ i != l.end(); i++)
+ {
+ s = format_sip_address(user_config,
+ i->display, i->uri).c_str();
+ mainWindow->display(s);
+ }
+ }
+
+ // Unsupported extensions
+ if (r->code == R_420_BAD_EXTENSION) {
+ mainWindow->display(r->hdr_unsupported.encode().c_str());
+ }
+
+ unlock();
+}
+
+void t_gui::cb_stun_failed_call_ended(int line) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: call failed.").arg(line + 1);
+ mainWindow->display(s);
+
+ unlock();
+}
+
+void t_gui::cb_call_ended(int line) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: call released.").arg(line + 1);
+ mainWindow->display(s);
+
+ unlock();
+}
+
+void t_gui::cb_call_established(int line) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: call established.").arg(line + 1);
+ mainWindow->display(s);
+
+ unlock();
+}
+
+void t_gui::cb_options_response(const t_response *r) {
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Response on terminal capability request: %1 %2")
+ .arg(r->code).arg(r->reason.c_str());
+ mainWindow->display(s);
+
+ if (r->code == R_408_REQUEST_TIMEOUT) {
+ // The request timed out, so no capabilities are known.
+ unlock();
+ return;
+ }
+
+ s = qApp->translate("GUI", "Terminal capabilities of %1").arg(r->hdr_to.uri.encode().c_str());
+ mainWindow->display(s);
+
+ s = qApp->translate("GUI", "Accepted body types:").append(" ");
+ if (r->hdr_accept.is_populated()) {
+ s.append(r->hdr_accept.get_value().c_str());
+ } else {
+ s.append(qApp->translate("GUI", "unknown"));
+ }
+ mainWindow->display(s);
+
+ s = qApp->translate("GUI", "Accepted encodings:").append(" ");
+ if (r->hdr_accept_encoding.is_populated()) {
+ s.append(r->hdr_accept_encoding.get_value().c_str());
+ } else {
+ s.append(qApp->translate("GUI", "unknown"));
+ }
+ mainWindow->display(s);
+
+ s = qApp->translate("GUI", "Accepted languages:").append(" ");
+ if (r->hdr_accept_language.is_populated()) {
+ s.append(r->hdr_accept_language.get_value().c_str());
+ } else {
+ s.append(qApp->translate("GUI", "unknown"));
+ }
+ mainWindow->display(s);
+
+ s = qApp->translate("GUI", "Allowed requests:").append(" ");
+ if (r->hdr_allow.is_populated()) {
+ s.append(r->hdr_allow.get_value().c_str());
+ } else {
+ s.append(qApp->translate("GUI", "unknown"));
+ }
+ mainWindow->display(s);
+
+ s = qApp->translate("GUI", "Supported extensions:").append(" ");
+ if (r->hdr_supported.is_populated()) {
+ if (r->hdr_supported.features.empty()) {
+ s.append(qApp->translate("GUI", "none"));
+ } else {
+ s.append(r->hdr_supported.get_value().c_str());
+ }
+ } else {
+ s.append(qApp->translate("GUI", "unknown"));
+ }
+ mainWindow->display(s);
+
+ s = qApp->translate("GUI", "End point type:").append(" ");
+ if (r->hdr_server.is_populated()) {
+ s.append(r->hdr_server.get_value().c_str());
+ } else if (r->hdr_user_agent.is_populated()) {
+ // Some end-points put a User-Agent header in the response
+ // instead of a Server header.
+ s.append(r->hdr_user_agent.get_value().c_str());
+ } else {
+ s.append(qApp->translate("GUI", "unknown"));
+ }
+ mainWindow->display(s);
+
+ unlock();
+}
+
+void t_gui::cb_reinvite_success(int line, const t_response *r) {
+ // Do not bother GUI user.
+ return;
+}
+
+void t_gui::cb_reinvite_failed(int line, const t_response *r) {
+ // Do not bother GUI user.
+ return;
+}
+
+void t_gui::cb_retrieve_failed(int line, const t_response *r) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: call retrieve failed.").arg(line + 1);
+ mainWindow->display(s);
+
+ s = QString().setNum(r->code);
+ s.append(' ').append(r->reason.c_str());
+ mainWindow->display(s);
+
+ unlock();
+}
+
+
+void t_gui::cb_invalid_reg_resp(t_user *user_config, const t_response *r, const string &reason) {
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ qApp->translate("GUI", "%1, registration failed: %2 %3")
+ .arg(user_config->get_profile_name().c_str())
+ .arg(r->code)
+ .arg(r->reason.c_str());
+ mainWindow->display(s);
+ mainWindow->display(reason.c_str());
+
+ mainWindow->updateRegStatus();
+ unlock();
+}
+
+void t_gui::cb_register_success(t_user *user_config, const t_response *r, unsigned long expires,
+ bool first_success)
+{
+ lock();
+ QString s;
+
+ if (first_success) {
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "%1, registration succeeded (expires = %2 seconds)")
+ .arg(user_config->get_profile_name().c_str())
+ .arg(expires);
+ mainWindow->display(s);
+ }
+
+ mainWindow->updateRegStatus();
+ unlock();
+}
+
+void t_gui::cb_register_failed(t_user *user_config, const t_response *r, bool first_failure) {
+ lock();
+ QString s;
+
+ if (first_failure) {
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "%1, registration failed: %2 %3")
+ .arg(user_config->get_profile_name().c_str())
+ .arg(r->code)
+ .arg(r->reason.c_str());
+ mainWindow->display(s);
+ }
+
+ mainWindow->updateRegStatus();
+ unlock();
+}
+
+void t_gui::cb_register_stun_failed(t_user *user_config, bool first_failure) {
+ lock();
+ QString s;
+
+ if (first_failure) {
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "%1, registration failed: STUN failure")
+ .arg(user_config->get_profile_name().c_str());
+ mainWindow->display(s);
+ }
+
+ mainWindow->updateRegStatus();
+ unlock();
+}
+
+void t_gui::cb_deregister_success(t_user *user_config, const t_response *r) {
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "%1, de-registration succeeded: %2 %3")
+ .arg(user_config->get_profile_name().c_str())
+ .arg(r->code)
+ .arg(r->reason.c_str());
+ mainWindow->display(s);
+
+ mainWindow->updateRegStatus();
+ unlock();
+}
+
+void t_gui::cb_deregister_failed(t_user *user_config, const t_response *r) {
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "%1, de-registration failed: %2 %3")
+ .arg(user_config->get_profile_name().c_str())
+ .arg(r->code)
+ .arg(r->reason.c_str());
+ mainWindow->display(s);
+
+ mainWindow->updateRegStatus();
+ unlock();
+}
+
+void t_gui::cb_fetch_reg_failed(t_user *user_config, const t_response *r) {
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "%1, fetching registrations failed: %2 %3")
+ .arg(user_config->get_profile_name().c_str())
+ .arg(r->code)
+ .arg(r->reason.c_str());
+ mainWindow->display(s);
+
+ unlock();
+}
+
+void t_gui::cb_fetch_reg_result(t_user *user_config, const t_response *r) {
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+
+ s = user_config->get_profile_name().c_str();
+ const list<t_contact_param> &l = r->hdr_contact.contact_list;
+ if (l.size() == 0) {
+ s += qApp->translate("GUI", ": you are not registered");
+ mainWindow->display(s);
+ } else {
+ s += qApp->translate("GUI", ": you have the following registrations");
+ mainWindow->display(s);
+ for (list<t_contact_param>::const_iterator i = l.begin();
+ i != l.end(); i++)
+ {
+ mainWindow->display(i->encode().c_str());
+ }
+ }
+
+ unlock();
+}
+
+void t_gui::cb_register_inprog(t_user *user_config, t_register_type register_type) {
+ QString s;
+
+ lock();
+
+ switch(register_type) {
+ case REG_REGISTER:
+ // Do not report registration refreshments
+ if (phone->get_is_registered(user_config)) break;
+ mainWindow->statRegLabel->setPixmap(
+ QPixmap::fromMimeSource("gear.png"));
+ break;
+ case REG_DEREGISTER:
+ case REG_DEREGISTER_ALL:
+ mainWindow->statRegLabel->setPixmap(
+ QPixmap::fromMimeSource("gear.png"));
+ break;
+ case REG_QUERY:
+ mainWindow->displayHeader();
+ s = user_config->get_profile_name().c_str();
+ s += qApp->translate("GUI", ": fetching registrations...");
+ mainWindow->display(s);
+ break;
+ }
+
+ unlock();
+}
+
+void t_gui::cb_redirecting_request(t_user *user_config, int line, const t_contact_param &contact) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: redirecting request to").arg(line + 1);
+ mainWindow->display(s);
+
+ s = format_sip_address(user_config, contact.display, contact.uri).c_str();
+ mainWindow->display(s);
+
+ unlock();
+}
+
+void t_gui::cb_redirecting_request(t_user *user_config, const t_contact_param &contact) {
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Redirecting request to: %1").arg(
+ format_sip_address(user_config, contact.display, contact.uri).c_str());
+ mainWindow->display(s);
+
+ unlock();
+}
+
+void t_gui::cb_notify_call(int line, const QString &from_party, const QString &organization,
+ const QImage &photo, const QString &subject, QString &referred_by_party)
+{
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+
+ // Play ringtone if the call is received on the active line.
+ if (line == phone->get_active_line() &&
+ !phone->is_line_auto_answered(line))
+ {
+ cb_play_ringtone(line);
+ }
+
+ // Pop up sys tray balloon
+#ifdef HAVE_KDE
+ t_twinkle_sys_tray *tray = mainWindow->getSysTray();
+ if (tray && !sys_tray_popup && !phone->is_line_auto_answered(line)) {
+ QString presFromParty("");
+ if (!from_party.isEmpty()) {
+ presFromParty = dotted_truncate(from_party.ascii(), 50).c_str();
+ }
+ QString presOrganization("");
+ if (!organization.isEmpty()) {
+ presOrganization = dotted_truncate(organization.ascii(), 50).c_str();
+ }
+ QString presSubject("");
+ if (!subject.isEmpty()) {
+ presSubject = dotted_truncate(subject.ascii(), 50).c_str();
+ }
+ QString presReferredByParty("");
+ if (!referred_by_party.isEmpty()) {
+ presReferredByParty = qApp->translate("GUI", "Transferred by: %1").arg(
+ dotted_truncate(referred_by_party.ascii(), 40).c_str());
+ }
+
+ // Create photo pixmap. If no photo is available, then use
+ // the Twinkle icon.
+ QPixmap pm;
+ QFrame::Shape photoFrameShape = QFrame::NoFrame;
+ if (photo.isNull()) {
+ pm = QPixmap::fromMimeSource("twinkle32.png");
+ } else {
+ pm.convertFromImage(photo);
+ photoFrameShape = QFrame::Box;
+ }
+
+ // Create the popup view.
+ sys_tray_popup = new KPassivePopup(tray);
+ MEMMAN_NEW(sys_tray_popup);
+ sys_tray_popup->setAutoDelete(false);
+ sys_tray_popup->setTimeout(0);
+ QVBox *popup_view = new QVBox(sys_tray_popup);
+ QHBox *hb = new QHBox(popup_view);
+ hb->setSpacing(5);
+ QLabel *lblPhoto = new QLabel(hb);
+ lblPhoto->setPixmap(pm);
+ lblPhoto->setFrameShape(photoFrameShape);
+ QVBox *vb = new QVBox(hb);
+ QString captionText("<H2>");
+ captionText += qApp->translate("SysTrayPopup", "Incoming Call");
+ captionText += "</H2>";
+ QLabel *lblCaption = new QLabel(captionText, vb);
+ lblCaption->setAlignment(Qt::AlignTop | Qt::AlignLeft);
+ lblCaption->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
+ QLabel *lblFrom = new QLabel(presFromParty, vb);
+ lblFrom->setAlignment(Qt::AlignTop | Qt::AlignLeft);
+ lblFrom->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
+ QLabel *lastLabel = lblFrom;
+ if (!presOrganization.isEmpty()) {
+ QLabel *lblOrganization = new QLabel(presOrganization, vb);
+ lblOrganization->setAlignment(Qt::AlignTop | Qt::AlignLeft);
+ lblOrganization->setSizePolicy(QSizePolicy::Expanding,
+ QSizePolicy::Minimum);
+ lastLabel = lblOrganization;
+ }
+ if (!presReferredByParty.isEmpty()) {
+ QLabel *lblReferredBy = new QLabel(presReferredByParty, vb);
+ lblReferredBy->setAlignment(Qt::AlignTop | Qt::AlignLeft);
+ lblReferredBy->setSizePolicy(QSizePolicy::Expanding,
+ QSizePolicy::Minimum);
+ lastLabel = lblReferredBy;
+ }
+ if (!presSubject.isEmpty()) {
+ QLabel *lblSubject = new QLabel(presSubject, vb);
+ lblSubject->setAlignment(Qt::AlignTop | Qt::AlignLeft);
+ lblSubject->setSizePolicy(QSizePolicy::Expanding,
+ QSizePolicy::Minimum);
+ lastLabel = lblSubject;
+ }
+ lastLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+ // Answer and reject buttons
+
+ QHBox *buttonBox = new QHBox(vb);
+ QIconSet iconAnswer(QPixmap::fromMimeSource("answer.png"));
+ QPushButton *pbAnswer = new QPushButton(iconAnswer,
+ qApp->translate("SysTrayPopup", "Answer"), buttonBox);
+ QObject::connect(pbAnswer, SIGNAL(clicked()),
+ mainWindow, SLOT(phoneAnswerFromSystrayPopup()));
+ QIconSet iconReject(QPixmap::fromMimeSource("reject.png"));
+ QPushButton *pbReject = new QPushButton(iconReject,
+ qApp->translate("SysTrayPopup", "Reject"), buttonBox);
+ QObject::connect(pbReject, SIGNAL(clicked()),
+ mainWindow, SLOT(phoneRejectFromSystrayPopup()));
+
+ sys_tray_popup->setView(popup_view);
+
+ // Show the popup
+ line_sys_tray_popup = line;
+ sys_tray_popup->show();
+ QObject::connect(sys_tray_popup, SIGNAL(clicked()),
+ sys_tray_popup, SLOT(hide()));
+ }
+#endif
+
+ // Show main window after a few seconds
+ if (sys_config->get_gui_auto_show_incoming()) {
+ autoShowTimer[line].start(
+ sys_config->get_gui_auto_show_timeout() * 1000, true);
+ }
+
+ unlock();
+}
+
+void t_gui::cb_stop_call_notification(int line) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ cb_stop_tone(line);
+ autoShowTimer[line].stop();
+
+#ifdef HAVE_KDE
+ if (sys_tray_popup && line_sys_tray_popup == line) {
+ sys_tray_popup->hide();
+ MEMMAN_DELETE(sys_tray_popup);
+ delete sys_tray_popup;
+ sys_tray_popup = NULL;
+ }
+#endif
+ unlock();
+}
+
+void t_gui::cb_dtmf_detected(int line, char dtmf_event) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: DTMF detected:").arg(line + 1).append(" ");
+
+ if (VALID_DTMF_EV(dtmf_event)) {
+ s.append(dtmf_ev2char(dtmf_event));
+ } else {
+ s.append(qApp->translate("GUI", "invalid DTMF telephone event (%1)").arg(
+ (int)dtmf_event));
+ }
+
+ mainWindow->display(s);
+
+ unlock();
+}
+
+void t_gui::cb_send_dtmf(int line, char dtmf_event) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ if (!VALID_DTMF_EV(dtmf_event)) return;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: send DTMF %2").arg(line + 1).arg(
+ dtmf_ev2char(dtmf_event));
+ mainWindow->display(s);
+
+ unlock();
+}
+
+void t_gui::cb_dtmf_not_supported(int line) {
+ if (line >= NUM_USER_LINES) return;
+
+ QString s;
+
+ if (throttle_dtmf_not_supported) return;
+
+ lock();
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: far end does not support DTMF telephone events.").arg(line + 1);
+ mainWindow->display(s);
+
+ // Throttle subsequent call backs
+ throttle_dtmf_not_supported = true;
+
+ unlock();
+}
+
+void t_gui::cb_dtmf_supported(int line) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ mainWindow->updateState();
+ unlock();
+}
+
+void t_gui::cb_line_state_changed(void) {
+ lock();
+ mainWindow->updateState();
+ unlock();
+}
+
+void t_gui::cb_send_codec_changed(int line, t_audio_codec codec) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ displayCodecInfo(line);
+ unlock();
+}
+
+void t_gui::cb_recv_codec_changed(int line, t_audio_codec codec) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ displayCodecInfo(line);
+ unlock();
+}
+
+void t_gui::cb_notify_recvd(int line, const t_request *r) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: received notification.").arg(line+1);
+ mainWindow->display(s);
+
+ s = qApp->translate("GUI", "Event: %1").arg(r->hdr_event.event_type.c_str());
+ mainWindow->display(s);
+
+ s = qApp->translate("GUI", "State: %1").arg(r->hdr_subscription_state.substate.c_str());
+ mainWindow->display(s);
+
+ if (r->hdr_subscription_state.substate == SUBSTATE_TERMINATED) {
+ s = qApp->translate("GUI", "Reason: %1").arg(r->hdr_subscription_state.reason.c_str());
+ mainWindow->display(s);
+ }
+
+ t_response *sipfrag = (t_response *)((t_sip_body_sipfrag *)r->body)->sipfrag;
+ s = qApp->translate("GUI", "Progress: %1 %2").arg(sipfrag->code).arg(sipfrag->reason.c_str());
+ mainWindow->display(s);
+
+ unlock();
+}
+
+void t_gui::cb_refer_failed(int line, const t_response *r) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: call transfer failed.").arg(line + 1);
+ mainWindow->display(s);
+
+ s = QString().setNum(r->code);
+ s.append(' ').append(r->reason.c_str());
+ mainWindow->display(s);
+
+ // The refer state has changed, so update the main window.
+ mainWindow->updateState();
+
+ unlock();
+}
+
+void t_gui::cb_refer_result_success(int line) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: call succesfully transferred.").arg(line + 1);
+ mainWindow->display(s);
+
+ // The refer state has changed, so update the main window.
+ mainWindow->updateState();
+
+ unlock();
+}
+
+void t_gui::cb_refer_result_failed(int line) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: call transfer failed.").arg(line + 1);
+ mainWindow->display(s);
+
+ // The refer state has changed, so update the main window.
+ mainWindow->updateState();
+
+ unlock();
+}
+
+void t_gui::cb_refer_result_inprog(int line) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: call transfer still in progress.").arg(line + 1);
+ mainWindow->display(s);
+
+ s = qApp->translate("GUI", "No further notifications will be received.");
+ mainWindow->display(s);
+
+ // The refer state has changed, so update the main window.
+ mainWindow->updateState();
+
+ unlock();
+}
+
+void t_gui::cb_call_referred(t_user *user_config, int line, t_request *r) {
+ if (line >= NUM_USER_LINES) return;
+
+ QString s;
+
+ lock();
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: transferring call to %2").arg(line +1).arg(
+ format_sip_address(user_config,
+ r->hdr_refer_to.display, r->hdr_refer_to.uri).c_str());
+ mainWindow->display(s);
+
+ if (r->hdr_referred_by.is_populated()) {
+ s = qApp->translate("GUI", "Transfer requested by %1").arg(
+ format_sip_address(user_config,
+ r->hdr_referred_by.display,
+ r->hdr_referred_by.uri).c_str());
+ mainWindow->display(s);
+ }
+
+ setLineFields(line);
+ s = format_sip_address(user_config,
+ user_config->get_display(false), user_config->create_user_uri(false)).c_str();
+ displayFrom(s);
+ photoLabel->hide();
+
+ s = format_sip_address(user_config,
+ r->hdr_refer_to.display, r->hdr_refer_to.uri).c_str();
+ displayTo(s);
+
+ subjectLabel->clear();
+ codecLabel->clear();
+
+ unlock();
+}
+
+void t_gui::cb_retrieve_referrer(t_user *user_config, int line) {
+ if (line >= NUM_USER_LINES) return;
+
+ QString s;
+
+ lock();
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: Call transfer failed. Retrieving original call.").arg(line + 1);
+ mainWindow->display(s);
+
+ setLineFields(line);
+ const t_call_info call_info = phone->get_call_info(line);
+
+ s = format_sip_address(user_config, call_info.get_from_display_presentation(),
+ call_info.from_uri).c_str();
+ if (!call_info.from_organization.empty()) {
+ s += ", ";
+ s += call_info.from_organization.c_str();
+ }
+ displayFrom(s);
+
+ // Display photo
+ QImage fromPhoto;
+
+ if (sys_config->get_ab_lookup_photo()) {
+ t_address_finder *af = t_address_finder::get_instance();
+ fromPhoto = af->find_photo(user_config, call_info.from_uri);
+ }
+
+ displayPhoto(fromPhoto);
+
+ s = format_sip_address(user_config, call_info.to_display, call_info.to_uri).c_str();
+ if (!call_info.to_organization.empty()) {
+ s += ", ";
+ s += call_info.to_organization.c_str();
+ }
+ displayTo(s);
+
+ displaySubject(call_info.subject.c_str());
+ codecLabel->clear();
+
+ unlock();
+}
+
+void t_gui::cb_consultation_call_setup(t_user *user_config, int line) {
+ if (line >= NUM_USER_LINES) return;
+
+ QString s;
+
+ lock();
+
+ setLineFields(line);
+ const t_call_info call_info = phone->get_call_info(line);
+
+ s = format_sip_address(user_config, call_info.get_from_display_presentation(),
+ call_info.from_uri).c_str();
+ if (!call_info.from_organization.empty()) {
+ s += ", ";
+ s += call_info.from_organization.c_str();
+ }
+ displayFrom(s);
+
+ photoLabel->hide();
+
+ s = format_sip_address(user_config, call_info.to_display, call_info.to_uri).c_str();
+ if (!call_info.to_organization.empty()) {
+ s += ", ";
+ s += call_info.to_organization.c_str();
+ }
+ displayTo(s);
+
+ displaySubject(call_info.subject.c_str());
+ codecLabel->clear();
+
+ unlock();
+}
+
+void t_gui::cb_stun_failed(t_user *user_config, int err_code, const string &err_reason) {
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "%1, STUN request failed: %2 %3")
+ .arg(user_config->get_profile_name().c_str())
+ .arg(err_code).arg(err_reason.c_str());
+ mainWindow->display(s);
+
+ unlock();
+}
+
+void t_gui::cb_stun_failed(t_user *user_config) {
+ lock();
+ QString s;
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "%1, STUN request failed.")
+ .arg(user_config->get_profile_name().c_str());
+ mainWindow->display(s);
+
+ unlock();
+}
+
+bool t_gui::cb_ask_user_to_redirect_invite(t_user *user_config, const t_url &destination,
+ const string &display)
+{
+ QString s;
+ QString title;
+
+ lock();
+
+ title = PRODUCT_NAME;
+ title.append(" - ").append(qApp->translate("GUI", "Redirecting call"));
+
+ s = qApp->translate("GUI", "User profile:").append(" <b>");
+ s.append(user_config->get_profile_name().c_str());
+ s.append("</b><br>").append(qApp->translate("GUI", "User:")).append(" <b>");
+ s.append(str2html(user_config->get_display_uri().c_str()));
+ s.append("</b><br><br>");
+
+ s.append(qApp->translate("GUI", "Do you allow the call to be redirected to the following destination?"));
+ s.append("<br><br>");
+ s.append(str2html(ui->format_sip_address(user_config, display, destination).c_str()));
+ s.append("<br><br>");
+ s.append(qApp->translate("GUI",
+ "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."));
+ QMessageBox *mb = new QMessageBox(title, s,
+ QMessageBox::Warning,
+ QMessageBox::Yes,
+ QMessageBox::No,
+ QMessageBox::NoButton,
+ mainWindow);
+ MEMMAN_NEW(mb);
+ bool permission = (mb->exec() == QMessageBox::Yes);
+ MEMMAN_DELETE(mb);
+ delete mb;
+
+ unlock();
+
+ return permission;
+}
+
+bool t_gui::cb_ask_user_to_redirect_request(t_user *user_config,
+ const t_url &destination,
+ const string &display, t_method method)
+{
+ QString s;
+ QString title;
+
+ lock();
+
+ title = PRODUCT_NAME;
+ title.append(" - ").append(qApp->translate("GUI", "Redirecting request"));
+
+ s = qApp->translate("GUI", "User profile:").append(" <b>");
+ s.append(user_config->get_profile_name().c_str());
+ s.append("</b><br>").append(qApp->translate("GUI", "User:")).append(" <b>");
+ s.append(str2html(user_config->get_display_uri().c_str()));
+ s.append("</b><br><br>");
+
+ s.append(qApp->translate("GUI",
+ "Do you allow the %1 request to be redirected to the following destination?").arg(
+ method2str(method).c_str()));
+ s.append("<br><br>");
+ s.append(str2html(ui->format_sip_address(user_config, display, destination).c_str()));
+ s.append("<br><br>");
+ s.append(qApp->translate("GUI",
+ "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."));
+ QMessageBox *mb = new QMessageBox(title, s,
+ QMessageBox::Warning,
+ QMessageBox::Yes,
+ QMessageBox::No,
+ QMessageBox::NoButton,
+ mainWindow);
+ MEMMAN_NEW(mb);
+ bool permission = (mb->exec() == QMessageBox::Yes);
+ MEMMAN_DELETE(mb);
+ delete mb;
+
+ unlock();
+
+ return permission;
+}
+
+bool t_gui::cb_ask_credentials(t_user *user_config, const string &realm, string &username,
+ string &password)
+{
+ QString user(username.c_str());
+ QString passwd(password.c_str());
+
+ lock();
+
+ AuthenticationForm *af = new AuthenticationForm(mainWindow, "authentication",
+ true);
+ MEMMAN_NEW(af);
+ if (!af->exec(user_config, QString(realm.c_str()), user, passwd)) {
+ MEMMAN_DELETE(af);
+ delete af;
+ unlock();
+ return false;
+ }
+
+ username = user.ascii();
+ password = passwd.ascii();
+ MEMMAN_DELETE(af);
+ delete af;
+
+ unlock();
+ return true;
+}
+
+void t_gui::cb_ask_user_to_refer(t_user *user_config, const t_url &refer_to_uri,
+ const string &refer_to_display,
+ const t_url &referred_by_uri,
+ const string &referred_by_display)
+{
+ QString s;
+ QString title;
+
+ lock();
+
+ title = PRODUCT_NAME;
+ title.append(" - ").append(qApp->translate("GUI", "Transferring call"));
+
+ s = qApp->translate("GUI", "User profile:").append(" <b>");
+ s.append(user_config->get_profile_name().c_str());
+ s.append("</b><br>").append(qApp->translate("GUI", "User:")).append(" <b>");
+ s.append(str2html(user_config->get_display_uri().c_str()));
+ s.append("</b><br><br>");
+
+ if (referred_by_uri.is_valid()) {
+ s.append(qApp->translate("GUI","Request to transfer call received from:"));
+ s.append("<br>");
+ s.append(str2html(format_sip_address(user_config, referred_by_display,
+ referred_by_uri).c_str()));
+ s.append("<br>");
+ } else {
+ s.append(qApp->translate("GUI", "Request to transfer call received."));
+ s.append("<br>");
+ }
+ s.append("<br>");
+
+ s.append(qApp->translate("GUI",
+ "Do you allow the call to be transferred to the following destination?"));
+ s.append("<br><br>");
+ s.append(str2html(ui->format_sip_address(user_config, refer_to_display,
+ refer_to_uri).c_str()));
+ s.append("<br><br>");
+ s.append(qApp->translate("GUI",
+ "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."));
+
+ ReferPermissionDialog *dialog = new ReferPermissionDialog(mainWindow, title, s);
+ // Do not report to MEMMAN as Qt will auto destruct this dialog on close.
+ dialog->show();
+
+ unlock();
+}
+
+void t_gui::cb_show_msg(const string &msg, t_msg_priority prio) {
+ cb_show_msg(NULL, msg, prio);
+}
+
+void t_gui::cb_show_msg(QWidget *parent, const string &msg, t_msg_priority prio) {
+ lock();
+
+ switch (prio) {
+ case MSG_INFO:
+ QMessageBox::information(parent, PRODUCT_NAME, msg.c_str());
+ break;
+ case MSG_WARNING:
+ QMessageBox::warning(parent, PRODUCT_NAME, msg.c_str());
+ break;
+ case MSG_CRITICAL:
+ default:
+ QMessageBox::critical(parent, PRODUCT_NAME, msg.c_str());
+ break;
+ }
+
+ unlock();
+}
+
+bool t_gui::cb_ask_msg(const string &msg, t_msg_priority prio) {
+ return cb_ask_msg(NULL, msg, prio);
+}
+
+bool t_gui::cb_ask_msg(QWidget *parent, const string &msg, t_msg_priority prio) {
+ lock();
+
+ int button = QMessageBox::No;
+ switch (prio) {
+ case MSG_INFO:
+ button = QMessageBox::information(parent, PRODUCT_NAME, msg.c_str(),
+ QMessageBox::Yes,
+ QMessageBox::No | QMessageBox::Escape | QMessageBox::Default);
+ break;
+ case MSG_WARNING:
+ button = QMessageBox::warning(parent, PRODUCT_NAME, msg.c_str(),
+ QMessageBox::Yes,
+ QMessageBox::No | QMessageBox::Escape | QMessageBox::Default);
+ break;
+ case MSG_CRITICAL:
+ default:
+ button = QMessageBox::critical(parent, PRODUCT_NAME, msg.c_str(),
+ QMessageBox::Yes,
+ QMessageBox::No | QMessageBox::Escape | QMessageBox::Default);
+ break;
+ }
+
+ unlock();
+
+ return (button == QMessageBox::Yes);
+}
+
+void t_gui::cb_display_msg(const string &msg, t_msg_priority prio) {
+ // If this thread may not lock the UI, then push the display message on
+ // the UI event queue. The message will be display asynchronously.
+ if (is_prohibited_thread()) {
+ cb_async_display_msg(msg, prio);
+ return;
+ }
+
+ QString s;
+
+ lock();
+
+ switch (prio) {
+ case MSG_NO_PRIO:
+ break;
+ case MSG_INFO:
+ s = qApp->translate("GUI", "Info:");
+ break;
+ case MSG_WARNING:
+ s = qApp->translate("GUI", "Warning:");
+ break;
+ case MSG_CRITICAL:
+ default:
+ s = qApp->translate("GUI", "Critical:");
+ break;
+ }
+
+ if (prio == MSG_NO_PRIO) {
+ s = msg.c_str();
+ } else {
+ s.append(" ").append(msg.c_str());
+ }
+ mainWindow->displayHeader();
+ mainWindow->display(s);
+
+ unlock();
+}
+
+void t_gui::cb_log_updated(bool log_zapped) {
+ lock();
+ mainWindow->updateLog(log_zapped);
+ unlock();
+}
+
+void t_gui::cb_call_history_updated(void) {
+ lock();
+ mainWindow->updateCallHistory();
+ unlock();
+}
+
+void t_gui::cb_missed_call(int num_missed_calls) {
+ lock();
+ mainWindow->updateMissedCallStatus(num_missed_calls);
+ unlock();
+}
+
+void t_gui::cb_nat_discovery_progress_start(int num_steps) {
+ natDiscoveryProgressDialog = new QProgressDialog(
+ qApp->translate("GUI", "Firewall / NAT discovery..."),
+ qApp->translate("GUI", "Abort"),
+ num_steps, NULL,
+ "nat discovery progress", true);
+ MEMMAN_NEW(natDiscoveryProgressDialog);
+ natDiscoveryProgressDialog->setCaption(PRODUCT_NAME);
+ natDiscoveryProgressDialog->setMinimumDuration(200);
+}
+
+void t_gui::cb_nat_discovery_progress_step(int step) {
+ natDiscoveryProgressDialog->setProgress(step);
+ qApp->processEvents();
+}
+
+void t_gui::cb_nat_discovery_finished(void) {
+ MEMMAN_DELETE(natDiscoveryProgressDialog);
+ delete natDiscoveryProgressDialog;
+}
+
+bool t_gui::cb_nat_discovery_cancelled(void) {
+ return natDiscoveryProgressDialog->wasCancelled();
+}
+
+void t_gui::cb_line_encrypted(int line, bool encrypted, const string &cipher_mode) {
+ // Nothing todo in GUI
+ // Encryption state is shown by the line state updata methods on
+ // MphoneForm
+}
+
+void t_gui::cb_show_zrtp_sas(int line, const string &sas) {
+ if (line >= NUM_USER_LINES) return;
+
+ lock();
+ QString s;
+
+ setLineFields(line);
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1").arg(line + 1);
+ s.append(": SAS = ").append(sas.c_str());
+ mainWindow->display(s);
+ s = qApp->translate("GUI", "Click the padlock to confirm a correct SAS.");
+ mainWindow->display(s);
+
+ unlock();
+}
+
+void t_gui::cb_zrtp_confirm_go_clear(int line) {
+ t_user *user_config = phone->get_line_user(line);
+ if (!user_config) return;
+
+ QString msg(qApp->translate("GUI", "The remote user on line %1 disabled the encryption.")
+ .arg(line + 1));
+ if (user_config->get_zrtp_goclear_warning()) {
+ cb_show_msg(msg.ascii(), MSG_WARNING);
+ } else {
+ cb_display_msg(msg.ascii(), MSG_WARNING);
+ }
+
+ action_zrtp_go_clear_ok(line);
+}
+
+void t_gui::cb_zrtp_sas_confirmed(int line) {
+ lock();
+ QString s;
+
+ setLineFields(line);
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: SAS confirmed.").arg(line + 1);
+ mainWindow->display(s);
+
+ unlock();
+}
+
+void t_gui::cb_zrtp_sas_confirmation_reset(int line) {
+ lock();
+ QString s;
+
+ setLineFields(line);
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: SAS confirmation reset.").arg(line + 1);
+ mainWindow->display(s);
+
+ unlock();
+}
+
+void t_gui::cb_update_mwi(void) {
+ lock();
+ mainWindow->updateMwi();
+ unlock();
+}
+
+void t_gui::cb_mwi_subscribe_failed(t_user *user_config, t_response *r, bool first_failure) {
+ lock();
+ QString s;
+
+ if (first_failure) {
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "%1, voice mail status failure.")
+ .arg(user_config->get_profile_name().c_str());
+ mainWindow->display(s);
+ }
+
+ unlock();
+}
+
+void t_gui::cb_mwi_terminated(t_user *user_config, const string &reason) {
+ lock();
+ QString s;
+
+ if (reason == "EV_REASON_REJECTED") {
+ s = qApp->translate("GUI", "%1, voice mail status rejected.");
+ } else if (reason == "EV_REASON_NORESOURCE") {
+ s = qApp->translate("GUI", "%1, voice mailbox does not exist.");
+ } else {
+ s = qApp->translate("GUI", "%1, voice mail status terminated.");
+ }
+
+ mainWindow->displayHeader();
+ mainWindow->display(s.arg(user_config->get_profile_name().c_str()));
+
+ unlock();
+}
+
+bool t_gui::cb_message_request(t_user *user_config, t_request *r) {
+ string text;
+ im::t_text_format text_format = im::TXT_PLAIN;
+ bool attachment = false;
+ bool failed_to_save_attachment = false;
+ string attachment_error_msg;
+ string attachment_saved_name;
+ string attachment_save_as_name;
+
+ if (!r->body) {
+ log_file->write_report("Missing body.", "t_gui::cb_message_request",
+ LOG_NORMAL, LOG_DEBUG);
+ return true;
+ }
+
+ // Determine if message should be shown inline or as an attachment
+ if ((r->hdr_content_disp.is_populated() && r->hdr_content_disp.type == "attachment") ||
+ (r->body->get_type() == BODY_OPAQUE) ||
+ (r->hdr_content_length.is_populated() && r->hdr_content_length.length > im::MAX_INLINE_TEXT_LEN) ||
+ (r->body->encode().size() > im::MAX_INLINE_TEXT_LEN))
+ {
+ attachment = true;
+
+ string suggested_file_extension = mime2file_extension(r->hdr_content_type.media);
+
+ if (!sys_config->save_sip_body(*r, suggested_file_extension,
+ attachment_saved_name,
+ attachment_save_as_name,
+ attachment_error_msg))
+ {
+ failed_to_save_attachment = true;
+ }
+ } else if (r->body->get_type() == BODY_PLAIN_TEXT) {
+ t_sip_body_plain_text *sb = dynamic_cast<t_sip_body_plain_text *>(r->body);
+ text = sb->text;
+ text_format = im::TXT_PLAIN;
+ } else if (r->body->get_type() == BODY_HTML_TEXT) {
+ t_sip_body_html_text *sb = dynamic_cast<t_sip_body_html_text *>(r->body);
+ text = sb->text;
+ text_format = im::TXT_HTML;
+ } else {
+ log_file->write_header("t_gui::cb_message_request",
+ LOG_NORMAL, LOG_CRITICAL);
+ log_file->write_raw("Unsupported content type: ");
+ log_file->write_raw(r->body->get_type());
+ log_file->write_endl();
+ log_file->write_footer();
+ return true;
+ }
+
+ if (!text.empty()) {
+ string charset = r->hdr_content_type.media.charset;
+ if (!charset.empty() && cmp_nocase(charset, "utf-8") != 0) {
+ // Try to decode the text
+ QTextCodec *c = QTextCodec::codecForName(charset.c_str());
+ if (c) {
+ text = c->toUnicode(text.c_str());
+ } else {
+ log_file->write_header(
+ "t_gui::cb_message_request",
+ LOG_NORMAL, LOG_WARNING);
+ log_file->write_raw("Cannot decode charset: ");
+ log_file->write_raw(charset);
+ log_file->write_endl();
+ log_file->write_footer();
+ }
+ }
+ }
+
+ lock();
+
+ // Find an existing session
+ im::t_msg_session *session = getMessageSession(user_config, r->hdr_from.uri,
+ r->hdr_from.get_display_presentation());
+ if (!session) {
+ // There is no session yet.
+ if (messageSessions.size() >= user_config->get_im_max_sessions()) {
+ log_file->write_report(
+ "Maximum number of message sessions reached. Reject message",
+ "t_gui::cb_message_request");
+ unlock();
+ return false;
+ }
+
+ // Create a new session.
+ session = new im::t_msg_session(user_config, t_display_url(r->hdr_from.uri,
+ r->hdr_from.get_display_presentation()));
+ MEMMAN_NEW(session);
+ addMessageSession(session);
+ MessageFormView *view = new MessageFormView(NULL, session);
+ MEMMAN_NEW(view);
+ view->show();
+ view->raise();
+ }
+
+ // Construct message
+ im::t_msg msg;
+
+ msg.direction = im::MSG_DIR_IN;
+
+ if (r->hdr_subject.is_populated()) {
+ msg.subject = r->hdr_subject.subject;
+ }
+
+ if (!text.empty()) {
+ msg.message = text;
+ msg.format = text_format;
+ }
+
+ if (attachment && !failed_to_save_attachment) {
+ msg.has_attachment = true;
+ msg.attachment_filename = attachment_saved_name;
+ msg.attachment_save_as_name = attachment_save_as_name;
+ msg.attachment_media = r->hdr_content_type.media;
+ }
+
+ session->recv_msg(msg);
+
+ // Set error message if attachment could not be saved
+ if (failed_to_save_attachment) {
+ QString s = qApp->translate("GUI", "Failed to save message attachment: %1");
+ s.arg(attachment_error_msg.c_str());
+ session->set_error(s.ascii());
+ }
+
+ unlock();
+ return true;
+}
+
+void t_gui::cb_message_response(t_user *user_config, t_response *r, t_request *req) {
+ lock();
+
+ // Find session associated with the response
+ im::t_msg_session *session = getMessageSession(user_config, r->hdr_to.uri,
+ r->hdr_to.display);
+
+ if (session) {
+ if (!r->is_success()) {
+ string s = int2str(r->code);
+ s += ' ';
+ s += r->reason;
+ session->set_error(s);
+ } else {
+ if (r->code == R_202_ACCEPTED) {
+ string s;
+ if (r->reason == REASON_202) {
+ s = qApp->translate("GUI", "Accepted by network").ascii();
+ } else {
+ s = r->reason;
+ }
+ session->set_delivery_notification(s);
+ }
+ }
+
+ session->set_msg_in_flight(false);
+ }
+ // If there is no session anymore, then discard the response
+
+ unlock();
+}
+
+void t_gui::cb_im_iscomposing_request(t_user *user_config, t_request *r,
+ im::t_composing_state state, time_t refresh)
+{
+ lock();
+
+ // Find an existing session
+ im::t_msg_session *session = getMessageSession(user_config, r->hdr_from.uri,
+ r->hdr_from.get_display_presentation());
+ if (!session) {
+ // A composing indication does not initiate a new message session.
+ log_file->write_report(
+ "Received composing indication for unknown session.",
+ "t_gui::cb_im_iscomposing_request");
+ } else {
+ session->set_remote_composing_state(state, refresh);
+ }
+
+ unlock();
+}
+
+void t_gui::cb_im_iscomposing_not_supported(t_user *user_config, t_response *r) {
+ lock();
+
+ // Find an existing session
+ im::t_msg_session *session = getMessageSession(user_config, r->hdr_to.uri,
+ r->hdr_to.display);
+
+ if (session) session->set_send_composing_state(false);
+
+ unlock();
+}
+
+void t_gui::cmd_call(const string &destination, bool immediate) {
+ string subject;
+ string dst_no_headers;
+ t_display_url du;
+
+ t_user *user = phone->ref_user_profile(
+ mainWindow->userComboBox->currentText().ascii());
+ expand_destination(user, destination, du, subject, dst_no_headers);
+ if (!du.is_valid()) return;
+
+ lock();
+ if (immediate) {
+ mainWindow->do_phoneInvite(user, du.display.c_str(), du.url,
+ subject.c_str(), false);
+ } else {
+ mainWindow->phoneInvite(dst_no_headers.c_str(), subject.c_str(), false);
+ }
+ unlock();
+}
+
+void t_gui::cmd_quit(void) {
+ lock();
+ mainWindow->fileExit();
+ unlock();
+}
+
+void t_gui::cmd_show(void) {
+ lock();
+ if (mainWindow->isMinimized()) {
+ mainWindow->setWindowState(mainWindow->windowState() & ~Qt::WindowMinimized | Qt::WindowActive);
+ mainWindow->raise();
+ } else {
+ mainWindow->show();
+ mainWindow->raise();
+ mainWindow->setActiveWindow();
+ }
+ unlock();
+}
+
+void t_gui::cmd_hide(void) {
+ lock();
+ if (sys_config->get_gui_use_systray()) {
+ mainWindow->hide();
+ } else {
+ mainWindow->setWindowState(mainWindow->windowState() | Qt::WindowMinimized);
+ }
+ unlock();
+}
+
+string t_gui::get_name_from_abook(t_user *user_config, const t_url &u) {
+ string name;
+
+ lock();
+ // Search local address book first
+ name = t_userintf::get_name_from_abook(user_config, u);
+
+ // Search KAddressBook
+ if (name.empty()) {
+ t_address_finder *af = t_address_finder::get_instance();
+ name = af->find_name(user_config, u);
+ }
+ unlock();
+
+ return name;
+}
+
+// User invoked actions on the phone object
+
+void t_gui::action_register(list<t_user *> user_list) {
+ for (list<t_user *>::iterator i = user_list.begin(); i != user_list.end(); i++) {
+ phone->pub_registration(*i, REG_REGISTER,
+ DUR_REGISTRATION(*i));
+ }
+}
+
+void t_gui::action_deregister(list<t_user *> user_list, bool dereg_all) {
+ for (list<t_user *>::iterator i = user_list.begin(); i != user_list.end(); i++) {
+ if (dereg_all) {
+ phone->pub_registration(*i, REG_DEREGISTER_ALL);
+ } else {
+ phone->pub_registration(*i, REG_DEREGISTER);
+ }
+ }
+}
+
+void t_gui::action_show_registrations(list<t_user *> user_list) {
+ for (list<t_user *>::iterator i = user_list.begin(); i != user_list.end(); i++) {
+ phone->pub_registration(*i, REG_QUERY);
+ }
+}
+
+void t_gui::action_invite(t_user *user_config, const t_url &destination,
+ const string &display, const string &subject, bool anonymous)
+{
+ QString s;
+
+ // Call can only be made if line is idle
+ int line = phone->get_active_line();
+ if (phone->get_line_state(line) == LS_BUSY) return;
+
+ t_url vm_url(expand_destination(user_config, user_config->get_mwi_vm_address()));
+ if (destination != vm_url) {
+ // Store call info for redial
+ last_called_url = destination;
+ last_called_display = display;
+ last_called_subject = subject;
+ last_called_profile = user_config->get_profile_name();
+ last_called_hide_user = anonymous;
+ }
+
+ setLineFields(line);
+
+ // Set party and subject line fields
+ s = "";
+ s.append(format_sip_address(user_config, display, destination).c_str());
+ displayTo(s);
+
+ s = "";
+ s.append(format_sip_address(user_config, user_config->get_display(false),
+ user_config->create_user_uri(false)).c_str());
+ displayFrom(s);
+
+ displaySubject(subject.c_str());
+
+ phone->pub_invite(user_config, destination, display, subject.c_str(), anonymous);
+}
+
+void t_gui::action_answer(void) {
+ cb_stop_call_notification(phone->get_active_line());
+ phone->pub_answer();
+}
+
+void t_gui::action_bye(void) {
+ phone->pub_end_call();
+}
+
+void t_gui::action_reject(void) {
+ QString s;
+
+ cb_stop_call_notification(phone->get_active_line());
+ phone->pub_reject();
+
+ int line = phone->get_active_line();
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: call rejected.").arg(line + 1);
+ mainWindow->display(s);
+}
+
+void t_gui::action_reject(unsigned short line) {
+ QString s;
+
+ cb_stop_call_notification(line);
+ phone->pub_reject(line);
+
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: call rejected.").arg(line + 1);
+ mainWindow->display(s);
+}
+
+void t_gui::action_redirect(const list<t_display_url> &contacts) {
+ QString s;
+
+ cb_stop_call_notification(phone->get_active_line());
+ phone->pub_redirect(contacts, 302);
+
+ int line = phone->get_active_line();
+ mainWindow->displayHeader();
+ s = qApp->translate("GUI", "Line %1: call redirected.").arg(line + 1);
+ mainWindow->display(s);
+}
+
+void t_gui::action_refer(const t_url &destination, const string &display) {
+ phone->pub_refer(destination, display);
+}
+
+void t_gui::action_refer(unsigned short line_from, unsigned short line_to) {
+ phone->pub_refer(line_from, line_to);
+}
+
+void t_gui::action_setup_consultation_call(const t_url &destination, const string &display) {
+ phone->pub_setup_consultation_call(destination, display);
+}
+
+void t_gui::action_hold(void) {
+ phone->pub_hold();
+}
+
+void t_gui::action_retrieve(void) {
+ phone->pub_retrieve();
+}
+
+void t_gui::action_conference(void) {
+ if (!phone->join_3way(0, 1)) {
+ mainWindow->display(qApp->translate("GUI", "Failed to start conference."));
+ }
+}
+
+void t_gui::action_mute(bool on) {
+ phone->mute(on);
+}
+
+void t_gui::action_options(void) {
+ phone->pub_options();
+}
+
+void t_gui::action_options(t_user *user_config, const t_url &contact) {
+ phone->pub_options(user_config, contact);
+}
+
+void t_gui::action_dtmf(const string &digits) {
+ const t_call_info call_info = phone->get_call_info(phone->get_active_line());
+ throttle_dtmf_not_supported = false;
+
+ if (!call_info.dtmf_supported) return;
+
+ for (string::const_iterator i = digits.begin(); i != digits.end(); i++) {
+ if (VALID_DTMF_SYM(*i)) {
+ phone->pub_send_dtmf(*i, call_info.dtmf_inband, call_info.dtmf_info);
+ }
+ }
+}
+
+void t_gui::action_activate_line(unsigned short line) {
+ phone->pub_activate_line(line);
+}
+
+bool t_gui::action_seize(void) {
+ return phone->pub_seize();
+}
+
+void t_gui::action_unseize(void) {
+ phone->pub_unseize();
+}
+
+void t_gui::action_confirm_zrtp_sas(int line) {
+ phone->pub_confirm_zrtp_sas(line);
+}
+
+void t_gui::action_confirm_zrtp_sas() {
+ phone->pub_confirm_zrtp_sas();
+}
+
+void t_gui::action_reset_zrtp_sas_confirmation(int line) {
+ phone->pub_reset_zrtp_sas_confirmation(line);
+}
+
+void t_gui::action_reset_zrtp_sas_confirmation() {
+ phone->pub_reset_zrtp_sas_confirmation();
+}
+
+void t_gui::action_enable_zrtp(void) {
+ phone->pub_enable_zrtp();
+}
+
+void t_gui::action_zrtp_request_go_clear(void) {
+ phone->pub_zrtp_request_go_clear();
+}
+
+void t_gui::action_zrtp_go_clear_ok(unsigned short line) {
+ phone->pub_zrtp_go_clear_ok(line);
+}
+
+void t_gui::srv_dnd(list<t_user *> user_list, bool on) {
+ for (list<t_user *>::iterator i = user_list.begin(); i != user_list.end(); i++) {
+ if (on) {
+ phone->ref_service(*i)->enable_dnd();
+ } else {
+ phone->ref_service(*i)->disable_dnd();
+ }
+ }
+}
+
+void t_gui::srv_enable_cf(t_user *user_config,
+ t_cf_type cf_type, const list<t_display_url> &cf_dest)
+{
+ phone->ref_service(user_config)->enable_cf(cf_type, cf_dest);
+}
+
+void t_gui::srv_disable_cf(t_user *user_config, t_cf_type cf_type) {
+ phone->ref_service(user_config)->disable_cf(cf_type);
+}
+
+void t_gui::srv_auto_answer(list<t_user *> user_list, bool on) {
+ for (list<t_user *>::iterator i = user_list.begin(); i != user_list.end(); i++) {
+ phone->ref_service(*i)->enable_auto_answer(on);
+ }
+}
+
+void t_gui::fill_user_combo(QComboBox *cb) {
+ cb->clear();
+
+ list<t_user *> user_list = phone->ref_users();
+ for (list<t_user *>::iterator i = user_list.begin(); i != user_list.end(); i++) {
+ // OLD code: used display uri
+ // cb->insertItem((*i)->get_display_uri().c_str());
+ cb->insertItem((*i)->get_profile_name().c_str());
+ }
+
+ cb->setCurrentItem(0);
+}
+
+QString t_gui::get_last_file_browse_path(void) const {
+ return lastFileBrowsePath;
+}
+
+void t_gui::set_last_file_browse_path(QString path) {
+ lock();
+ lastFileBrowsePath = path;
+ unlock();
+}
+
+#ifdef HAVE_KDE
+unsigned short t_gui::get_line_sys_tray_popup(void) const {
+ return line_sys_tray_popup;
+}
+#endif
+
+im::t_msg_session *t_gui::getMessageSession(t_user *user_config,
+ const t_url &remote_url, const string &display) const
+{
+ for (list<im::t_msg_session *>::const_iterator it = messageSessions.begin();
+ it != messageSessions.end(); ++it)
+ {
+ if ((*it)->match(user_config, remote_url)) {
+ (*it)->set_display_if_empty(display);
+ return *it;
+ }
+ }
+
+ return NULL;
+}
+
+void t_gui::addMessageSession(im::t_msg_session *s) {
+ messageSessions.push_back(s);
+
+ if (!timerUpdateMessageSessions) {
+ timerUpdateMessageSessions = new QTimer();
+ MEMMAN_NEW(timerUpdateMessageSessions);
+
+ connect(timerUpdateMessageSessions, SIGNAL(timeout()),
+ this, SLOT(updateTimersMessageSessions()));
+ timerUpdateMessageSessions->start(1000);
+ }
+}
+
+void t_gui::removeMessageSession(im::t_msg_session *s) {
+ messageSessions.remove(s);
+
+ if (messageSessions.empty()) {
+ timerUpdateMessageSessions->stop();
+
+ MEMMAN_DELETE(timerUpdateMessageSessions);
+ delete timerUpdateMessageSessions;
+ timerUpdateMessageSessions = NULL;
+ }
+}
+
+void t_gui::destroyAllMessageSessions(void) {
+ if (timerUpdateMessageSessions) {
+ MEMMAN_DELETE(timerUpdateMessageSessions);
+ delete timerUpdateMessageSessions;
+ timerUpdateMessageSessions = NULL;
+ }
+
+ for (list<im::t_msg_session *>::iterator it = messageSessions.begin();
+ it != messageSessions.end(); ++it)
+ {
+ MEMMAN_DELETE(*it);
+ delete *it;
+ }
+
+ messageSessions.clear();
+}
+
+void t_gui::updateTimersMessageSessions() {
+ for (list<im::t_msg_session *>::iterator it = messageSessions.begin();
+ it != messageSessions.end(); ++it)
+ {
+ (*it)->dec_local_composing_timeout();
+ (*it)->dec_remote_composing_timeout();
+ }
+}
+
+string t_gui::mime2file_extension(t_media media) {
+ string extension;
+
+#ifdef HAVE_KDE
+ // If KDE is available then use KDE to retrieve the proper file
+ // extension so we nicely integrate with the desktop settings.
+ string mime = media.type + "/" + media.subtype;
+ KMimeType::Ptr pMime = KMimeType::mimeType(mime.c_str());
+ const QStringList &patterns = pMime->patterns();
+
+ if (!patterns.empty()) {
+ extension = patterns.front().ascii();
+ } else {
+ log_file->write_header("t_gui::mime2file_extension", LOG_NORMAL, LOG_DEBUG);
+ log_file->write_raw("Cannot find file extension for mime type ");
+ log_file->write_raw(mime);
+ log_file->write_footer();
+ }
+#endif
+ return extension;
+}
+
+void t_gui::open_url_in_browser(const QString &url) {
+ string sys_browser = sys_config->get_gui_browser_cmd();
+#ifdef HAVE_KDE
+ if (sys_browser.empty())
+ {
+ KTrader::OfferList offers = KTrader::self()->query("text/html", "Type == 'Application'");
+ if (!offers.empty()) {
+ KService::Ptr ptr = offers.first();
+ KURL::List lst;
+ lst.append(url);
+ KRun::run(*ptr, lst);
+
+ return;
+ }
+ }
+#endif
+ QProcess process;
+ bool process_started = false;
+
+ QStringList browsers;
+
+ if (sys_browser.empty()) {
+ browsers << "firefox" << "mozilla" << "netscape" << "opera";
+ browsers << "galeon" << "epiphany" << "konqueror";
+ } else {
+ browsers << sys_browser.c_str();
+ }
+
+ for (QStringList::Iterator it = browsers.begin(); it != browsers.end(); ++it)
+ {
+ process.setArguments(QStringList() << *it << url);
+ process_started = process.start();
+ if (process_started) break;
+ }
+
+ if (!process_started) {
+ QString msg = qApp->translate("GUI", "Cannot open web browser: %1").arg(url);
+ msg += "\n\n";
+ msg += qApp->translate("GUI", "Configure your web browser in the system settings.");
+ cb_show_msg(msg.ascii(), MSG_CRITICAL);
+ }
+}
diff --git a/src/gui/gui.h b/src/gui/gui.h
new file mode 100644
index 0000000..90c4f84
--- /dev/null
+++ b/src/gui/gui.h
@@ -0,0 +1,396 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef _GUI_H
+#define _GUI_H
+
+#include "twinkle_config.h"
+
+#include "phone.h"
+#include "userintf.h"
+#include "im/msg_session.h"
+
+#include "messageform.h"
+
+#include "qaction.h"
+#include "qcombobox.h"
+#include "qlabel.h"
+#include "qlineedit.h"
+#include "qprogressdialog.h"
+#include "qtimer.h"
+#include "qtoolbutton.h"
+#include "qwidget.h"
+
+#ifdef HAVE_KDE
+#include <kpassivepopup.h>
+#endif
+
+using namespace std;
+
+// Forward declaration
+class MphoneForm;
+
+// Length of redial list in combo boxes
+#define SIZE_REDIAL_LIST 10
+
+// Selection purpose for select user form
+enum t_select_purpose {
+ SELECT_REGISTER,
+ SELECT_DEREGISTER,
+ SELECT_DEREGISTER_ALL,
+ SELECT_DND,
+ SELECT_AUTO_ANSWER
+};
+
+QString str2html(const QString &s);
+
+void setDisabledIcon(QAction *action, const QString &icon);
+void setDisabledIcon(QToolButton *toolButton, const QString &icon);
+
+class t_gui : public QObject, public t_userintf {
+ Q_OBJECT
+private:
+ MphoneForm *mainWindow;
+
+ // List of active instant messaging session.
+ list<im::t_msg_session *> messageSessions;
+
+ // Timer to schedule updating of message sessions every second.
+ QTimer *timerUpdateMessageSessions;
+
+ // Progress dialog for FW/NAT discovery progress bar
+ QProgressDialog *natDiscoveryProgressDialog;
+
+ // Pointers to line information fields to display information
+ QLineEdit *fromLabel;
+ QLineEdit *toLabel;
+ QLineEdit *subjectLabel;
+ QLabel *codecLabel;
+ QLabel *photoLabel;
+
+ // Timers to auto show main window on incoming call
+ QTimer autoShowTimer[NUM_USER_LINES];
+
+#ifdef HAVE_KDE
+ // Popup window on system tray for incoming call notification
+ KPassivePopup *sys_tray_popup;
+ unsigned short line_sys_tray_popup; // lineno for popup
+#endif
+
+ // Last dir path browsed by the user with a file dialog
+ QString lastFileBrowsePath;
+
+ // Set the line information field pointers to the fields for 'line'
+ void setLineFields(int line);
+
+ // Set text inf from, to and subject fields
+ void displayTo(const QString &s);
+ void displayFrom(const QString &s);
+ void displaySubject(const QString &s);
+
+ // Display the codecs in use for the line
+ void displayCodecInfo(int line);
+
+ // Display a photo
+ void displayPhoto(const QImage &photo);
+
+protected:
+ // The do_* methods perform the commands parsed by the exec_* methods.
+ virtual bool do_invite(const string &destination, const string &display,
+ const string &subject, bool immediate,
+ bool anonymous);
+ virtual void do_redial(void);
+ virtual void do_answer(void);
+ virtual void do_answerbye(void);
+ virtual void do_reject(void);
+ virtual void do_redirect(bool show_status, bool type_present, t_cf_type cf_type,
+ bool action_present, bool enable, int num_redirections,
+ const list<string> &dest_strlist, bool immediate);
+ virtual void do_dnd(bool show_status, bool toggle, bool enable);
+ virtual void do_auto_answer(bool show_status, bool toggle, bool enable);
+ virtual void do_bye(void);
+ virtual void do_hold(void);
+ virtual void do_retrieve(void);
+ virtual bool do_refer(const string &destination, t_transfer_type transfer_type,
+ bool immediate);
+ virtual void do_conference(void);
+ virtual void do_mute(bool show_status, bool toggle, bool enable);
+ virtual void do_dtmf(const string &digits);
+ virtual void do_register(bool reg_all_profiles);
+ virtual void do_deregister(bool dereg_all_profiles, bool dereg_all_devices);
+ virtual void do_fetch_registrations(void);
+ virtual bool do_options(bool dest_set, const string &destination, bool immediate);
+ virtual void do_line(int line);
+ virtual void do_user(const string &profile_name);
+ virtual void do_zrtp(t_zrtp_cmd zrtp_cmd);
+ virtual bool do_message(const string &destination, const string &display,
+ const im::t_msg &msg);
+ virtual void do_presence(t_presence_state::t_basic_state basic_state);
+ virtual void do_quit(void);
+ virtual void do_help(const list<t_command_arg> &al);
+
+public:
+ t_gui(t_phone *_phone);
+ virtual ~t_gui();
+
+ // Start the GUI
+ void run(void);
+
+ // Save user interface state to system settings
+ void save_state(void);
+
+ // Restore user interface state from system settings
+ void restore_state(void);
+
+ /** Save state to restore a UI session. */
+ void save_session_state(void);
+
+ /** Restore UI session state. */
+ void restore_session_state(void);
+
+ // Lock the user interface to synchornize output
+ void lock(void);
+ void unlock(void);
+
+ // Select network interface to use.
+ string select_network_intf(void);
+
+ // Select a user configuration file. Returns false if selection failed.
+ bool select_user_config(list<string> &config_files);
+
+ // Clear the contents of the line information fields. After clearing
+ // the field pointers point to the fields for 'line'
+ void clearLineFields(int line);
+
+ // Call back functions
+ void cb_incoming_call(t_user *user_config, int line, const t_request *r);
+ void cb_call_cancelled(int line);
+ void cb_far_end_hung_up(int line);
+ void cb_answer_timeout(int line);
+ void cb_sdp_answer_not_supported(int line, const string &reason);
+ void cb_sdp_answer_missing(int line);
+ void cb_unsupported_content_type(int line, const t_sip_message *r);
+ void cb_ack_timeout(int line);
+ void cb_100rel_timeout(int line);
+ void cb_prack_failed(int line, const t_response *r);
+ void cb_provisional_resp_invite(int line, const t_response *r);
+ void cb_cancel_failed(int line, const t_response *r);
+ void cb_call_answered(t_user *user_config, int line, const t_response *r);
+ void cb_call_failed(t_user *user_config, int line, const t_response *r);
+ void cb_stun_failed_call_ended(int line);
+ void cb_call_ended(int line);
+ void cb_call_established(int line);
+ void cb_options_response(const t_response *r);
+ void cb_reinvite_success(int line, const t_response *r);
+ void cb_reinvite_failed(int line, const t_response *r);
+ void cb_retrieve_failed(int line, const t_response *r);
+ void cb_invalid_reg_resp(t_user *user_config, const t_response *r, const string &reason);
+ void cb_register_success(t_user *user_config, const t_response *r, unsigned long expires,
+ bool first_success);
+ void cb_register_failed(t_user *user_config, const t_response *r, bool first_failure);
+ void cb_register_stun_failed(t_user *user_config, bool first_failure);
+ void cb_deregister_success(t_user *user_config, const t_response *r);
+ void cb_deregister_failed(t_user *user_config, const t_response *r);
+ void cb_fetch_reg_failed(t_user *user_config, const t_response *r);
+ void cb_fetch_reg_result(t_user *user_config, const t_response *r);
+ void cb_register_inprog(t_user *user_config, t_register_type register_type);
+ void cb_redirecting_request(t_user *user_config, int line, const t_contact_param &contact);
+ void cb_redirecting_request(t_user *user_config, const t_contact_param &contact);
+ void cb_notify_call(int line, const QString &from_party, const QString &organization,
+ const QImage &photo, const QString &subject, QString &referred_by_party);
+ void cb_stop_call_notification(int line);
+ void cb_dtmf_detected(int line, char dtmf_event);
+ void cb_send_dtmf(int line, char dtmf_event);
+ void cb_dtmf_not_supported(int line);
+ void cb_dtmf_supported(int line);
+ void cb_line_state_changed(void);
+ void cb_send_codec_changed(int line, t_audio_codec codec);
+ void cb_recv_codec_changed(int line, t_audio_codec codec);
+ void cb_notify_recvd(int line, const t_request *r);
+ void cb_refer_failed(int line, const t_response *r);
+ void cb_refer_result_success(int line);
+ void cb_refer_result_failed(int line);
+ void cb_refer_result_inprog(int line);
+
+ // A call is being referred by the far end. r must be the REFER request.
+ void cb_call_referred(t_user *user_config, int line, t_request *r);
+
+ // The reference failed. Call to referrer is retrieved.
+ void cb_retrieve_referrer(t_user *user_config, int line);
+
+ // A consulation call for a call transfer is being setup.
+ void cb_consultation_call_setup(t_user *user_config, int line);
+
+ // STUN errors
+ void cb_stun_failed(t_user *user_config, int err_code, const string &err_reason);
+ void cb_stun_failed(t_user *user_config);
+
+ // Interactive call back functions
+ bool cb_ask_user_to_redirect_invite(t_user *user_config, const t_url &destination,
+ const string &display);
+ bool cb_ask_user_to_redirect_request(t_user *user_config, const t_url &destination,
+ const string &display, t_method method);
+ bool cb_ask_credentials(t_user *user_config, const string &realm, string &username,
+ string &password);
+
+ // Ask questions asynchronously.
+ void cb_ask_user_to_refer(t_user *user_config, const t_url &refer_to_uri,
+ const string &refer_to_display,
+ const t_url &referred_by_uri,
+ const string &referred_by_display);
+
+ // Show an error message to the user. Depending on the interface mode
+ // the user has to acknowledge the error before processing continues.
+ void cb_show_msg(const string &msg, t_msg_priority prio = MSG_INFO);
+ void cb_show_msg(QWidget *parent, const string &msg, t_msg_priority prio = MSG_INFO);
+
+ // Ask a yes/no question to the user.
+ // Returns true for yes and false for no.
+ bool cb_ask_msg(const string &msg, t_msg_priority prio = MSG_INFO);
+ bool cb_ask_msg(QWidget *parent, const string &msg, t_msg_priority prio = MSG_INFO);
+
+ // Display an error message.
+ void cb_display_msg(const string &msg, t_msg_priority prio = MSG_INFO);
+
+ // Log file has been updated
+ void cb_log_updated(bool log_zapped = false);
+
+ // Call history has been updated
+ void cb_call_history_updated(void);
+ void cb_missed_call(int num_missed_calls);
+
+ // Show firewall/NAT discovery progress
+ void cb_nat_discovery_progress_start(int num_steps);
+ void cb_nat_discovery_progress_step(int step);
+ void cb_nat_discovery_finished(void);
+ bool cb_nat_discovery_cancelled(void);
+
+ // ZRTP
+ void cb_line_encrypted(int line, bool encrypted, const string &cipher_mode = "");
+ void cb_show_zrtp_sas(int line, const string &sas);
+ void cb_zrtp_confirm_go_clear(int line);
+ void cb_zrtp_sas_confirmed(int line);
+ void cb_zrtp_sas_confirmation_reset(int line);
+
+ // MWI
+ void cb_update_mwi(void);
+ void cb_mwi_subscribe_failed(t_user *user_config, t_response *r, bool first_failure);
+ void cb_mwi_terminated(t_user *user_config, const string &reason);
+
+ // Instant messaging
+ bool cb_message_request(t_user *user_config, t_request *r);
+ void cb_message_response(t_user *user_config, t_response *r, t_request *req);
+ void cb_im_iscomposing_request(t_user *user_config, t_request *r,
+ im::t_composing_state state, time_t refresh);
+ void cb_im_iscomposing_not_supported(t_user *user_config, t_response *r);
+
+ // Execute external commands
+ void cmd_call(const string &destination, bool immediate);
+ void cmd_quit(void);
+ void cmd_show(void);
+ void cmd_hide(void);
+
+ // Lookup a URL in the address book
+ string get_name_from_abook(t_user *user_config, const t_url &u);
+
+ // Actions
+ void action_register(list<t_user *> user_list);
+ void action_deregister(list<t_user *> user_list, bool dereg_all);
+ void action_show_registrations(list<t_user *> user_list);
+ void action_invite(t_user *user_config,
+ const t_url &destination, const string &display,
+ const string &subject, bool anonymous);
+ void action_answer(void);
+ void action_bye(void);
+ void action_reject(void);
+ void action_reject(unsigned short line);
+ void action_redirect(const list<t_display_url> &contacts);
+ void action_refer(const t_url &destination, const string &display);
+ void action_refer(unsigned short line_from, unsigned short line_to);
+ void action_setup_consultation_call(const t_url &destination, const string &display);
+ void action_hold(void);
+ void action_retrieve(void);
+ void action_conference(void);
+ void action_mute(bool on);
+ void action_options(void);
+ void action_options(t_user *user_config, const t_url &contact);
+ void action_dtmf(const string &digits);
+ void action_activate_line(unsigned short line);
+ bool action_seize(void);
+ void action_unseize(void);
+ void action_confirm_zrtp_sas(int line);
+ void action_confirm_zrtp_sas();
+ void action_reset_zrtp_sas_confirmation(int line);
+ void action_reset_zrtp_sas_confirmation();
+ void action_enable_zrtp(void);
+ void action_zrtp_request_go_clear(void);
+ void action_zrtp_go_clear_ok(unsigned short line);
+
+ // Service (de)activation
+ void srv_dnd(list<t_user *> user_list, bool on);
+ void srv_enable_cf(t_user *user_config,
+ t_cf_type cf_type, const list<t_display_url> &cf_dest);
+ void srv_disable_cf(t_user *user_config, t_cf_type cf_type);
+ void srv_auto_answer(list<t_user *> user_list, bool on);
+
+ // Fill a combo box with user names (display, uri) of active users
+ void fill_user_combo(QComboBox *cb);
+
+ // Get/set last dir path for a file dialog browse session
+ QString get_last_file_browse_path(void) const;
+ void set_last_file_browse_path(QString path);
+
+#ifdef HAVE_KDE
+ // Get the line associated with the sys tray popup
+ unsigned short get_line_sys_tray_popup(void) const;
+#endif
+
+ // Get the message session for a dialog between the user
+ // and the remote url. If the display name was not known
+ // to the session yet, it is set to the passed display.
+ // Returns NULL if no form exists.
+ im::t_msg_session *getMessageSession(t_user *user_config,
+ const t_url &remote_url,
+ const string &display) const;
+
+ void addMessageSession(im::t_msg_session *s);
+ void removeMessageSession(im::t_msg_session *s);
+ void destroyAllMessageSessions(void);
+
+ /**
+ * Convert a mime type to a file extension.
+ * @param media [in] The mime type.
+ * @return file extension as glob expression.
+ */
+ string mime2file_extension(t_media media);
+
+ /**
+ * Open a URL in an external web browser.
+ * @param url [in] URL to open.
+ */
+ void open_url_in_browser(const QString &url);
+
+private slots:
+ /**
+ * Update timers associated with message sessions. This
+ * function should be called every second.
+ */
+ void updateTimersMessageSessions();
+};
+
+#endif
diff --git a/src/gui/historyform.ui b/src/gui/historyform.ui
new file mode 100644
index 0000000..aedf488
--- /dev/null
+++ b/src/gui/historyform.ui
@@ -0,0 +1,475 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>HistoryForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>HistoryForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>872</width>
+ <height>647</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Call History</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView" row="0" column="0">
+ <column>
+ <property name="text">
+ <string>Time</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>In/Out</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>From/To</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Subject</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Status</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>historyListView</cstring>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="showSortIndicator">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout37</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>cdrGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Call details</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTextEdit" row="0" column="0">
+ <property name="name">
+ <cstring>cdrTextEdit</cstring>
+ </property>
+ <property name="textFormat">
+ <enum>RichText</enum>
+ </property>
+ <property name="wordWrap">
+ <enum>NoWrap</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="autoFormatting">
+ <set>AutoAll</set>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Details of the selected call record.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>viewGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>View</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>inCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Incoming calls</string>
+ </property>
+ <property name="accel">
+ <string>Alt+I</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this option to show incoming calls.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>outCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Outgoing calls</string>
+ </property>
+ <property name="accel">
+ <string>Alt+O</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this option to show outgoing calls.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>successCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Answered calls</string>
+ </property>
+ <property name="accel">
+ <string>Alt+A</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this option to show answered calls.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>missedCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Missed calls</string>
+ </property>
+ <property name="accel">
+ <string>Alt+M</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this option to show missed calls.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>profileCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Current &amp;user profiles only</string>
+ </property>
+ <property name="accel">
+ <string>Alt+U</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this option to show only calls associated with this user profile.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="0">
+ <property name="name">
+ <cstring>layout39</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>clearPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>C&amp;lear</string>
+ </property>
+ <property name="accel">
+ <string>Alt+L</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;Clear the complete call history.&lt;/p&gt;
+&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; this will clear &lt;b&gt;all&lt;/b&gt; records, also records not shown depending on the checked view options.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer28</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>540</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>closePushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Clo&amp;se</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="default">
+ <bool>false</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Close this window.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>callPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Call</string>
+ </property>
+ <property name="accel">
+ <string>Alt+C</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Call selected address.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>numberlCallsTtextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Number of calls:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>numberCallsValueTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>###</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>totalDurationTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Total call duration:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>totalDurationValueTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>###</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>460</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>closePushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>HistoryForm</receiver>
+ <slot>close()</slot>
+ </connection>
+ <connection>
+ <sender>historyListView</sender>
+ <signal>currentChanged(QListViewItem*)</signal>
+ <receiver>HistoryForm</receiver>
+ <slot>showCallDetails(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>inCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>HistoryForm</receiver>
+ <slot>loadHistory()</slot>
+ </connection>
+ <connection>
+ <sender>missedCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>HistoryForm</receiver>
+ <slot>loadHistory()</slot>
+ </connection>
+ <connection>
+ <sender>outCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>HistoryForm</receiver>
+ <slot>loadHistory()</slot>
+ </connection>
+ <connection>
+ <sender>profileCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>HistoryForm</receiver>
+ <slot>loadHistory()</slot>
+ </connection>
+ <connection>
+ <sender>successCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>HistoryForm</receiver>
+ <slot>loadHistory()</slot>
+ </connection>
+ <connection>
+ <sender>historyListView</sender>
+ <signal>rightButtonPressed(QListViewItem*,const QPoint&amp;,int)</signal>
+ <receiver>HistoryForm</receiver>
+ <slot>popupMenu(QListViewItem*,const QPoint&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>historyListView</sender>
+ <signal>doubleClicked(QListViewItem*,const QPoint&amp;,int)</signal>
+ <receiver>HistoryForm</receiver>
+ <slot>call(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>clearPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>HistoryForm</receiver>
+ <slot>clearHistory()</slot>
+ </connection>
+ <connection>
+ <sender>callPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>HistoryForm</receiver>
+ <slot>call()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>historyListView</tabstop>
+ <tabstop>cdrTextEdit</tabstop>
+ <tabstop>inCheckBox</tabstop>
+ <tabstop>outCheckBox</tabstop>
+ <tabstop>successCheckBox</tabstop>
+ <tabstop>missedCheckBox</tabstop>
+ <tabstop>profileCheckBox</tabstop>
+ <tabstop>clearPushButton</tabstop>
+ <tabstop>closePushButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in declaration">user.h</include>
+ <include location="local" impldecl="in declaration">phone.h</include>
+ <include location="local" impldecl="in declaration">qpopupmenu.h</include>
+ <include location="local" impldecl="in implementation">call_history.h</include>
+ <include location="local" impldecl="in implementation">util.h</include>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">qlistview.h</include>
+ <include location="local" impldecl="in implementation">historylistview.h</include>
+ <include location="local" impldecl="in implementation">qiconset.h</include>
+ <include location="local" impldecl="in implementation">audits/memman.h</include>
+ <include location="local" impldecl="in implementation">historyform.ui.h</include>
+</includes>
+<forwards>
+ <forward>extern t_phone *phone;</forward>
+</forwards>
+<variables>
+ <variable access="private">time_t timeLastViewed;</variable>
+ <variable access="private">QPopupMenu *histPopupMenu;</variable>
+ <variable access="private">int itemCall;</variable>
+</variables>
+<signals>
+ <signal>call(t_user *, const QString &amp;, const QString &amp;, bool)</signal>
+</signals>
+<slots>
+ <slot>loadHistory()</slot>
+ <slot>update()</slot>
+ <slot>show()</slot>
+ <slot>closeEvent( QCloseEvent * e )</slot>
+ <slot>showCallDetails( QListViewItem * item )</slot>
+ <slot>popupMenu( QListViewItem * item, const QPoint &amp; pos )</slot>
+ <slot>call( QListViewItem * item )</slot>
+ <slot>call( void )</slot>
+ <slot>deleteEntry( void )</slot>
+ <slot>clearHistory()</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function access="private" specifier="non virtual">destroy()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/historyform.ui.h b/src/gui/historyform.ui.h
new file mode 100644
index 0000000..6c47540
--- /dev/null
+++ b/src/gui/historyform.ui.h
@@ -0,0 +1,358 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you want to add, delete, or rename functions or slots, use
+** Qt Designer to update this file, preserving your code.
+**
+** You should not define a constructor or destructor in this file.
+** Instead, write your code in functions called init() and destroy().
+** These will automatically be called by the form's constructor and
+** destructor.
+*****************************************************************************/
+
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+void HistoryForm::init()
+{
+ historyListView->setSorting(HISTCOL_TIMESTAMP, false);
+ historyListView->setColumnWidthMode(HISTCOL_FROMTO, QListView::Manual);
+ historyListView->setColumnWidth(HISTCOL_FROMTO, 200);
+ historyListView->setColumnWidthMode(HISTCOL_SUBJECT, QListView::Manual);
+ historyListView->setColumnWidth(HISTCOL_SUBJECT, 200);
+
+ inCheckBox->setChecked(true);
+ outCheckBox->setChecked(true);
+ successCheckBox->setChecked(true);
+ missedCheckBox->setChecked(true);
+ profileCheckBox->setChecked(true);
+
+ timeLastViewed = phone->get_startup_time();
+
+ QIconSet inviteIcon(QPixmap::fromMimeSource("invite.png"));
+ QIconSet deleteIcon(QPixmap::fromMimeSource("editdelete.png"));
+ histPopupMenu = new QPopupMenu(this);
+ MEMMAN_NEW(histPopupMenu);
+
+ itemCall = histPopupMenu->insertItem(inviteIcon, tr("Call..."), this, SLOT(call()));
+ histPopupMenu->insertItem(deleteIcon, tr("Delete"), this, SLOT(deleteEntry()));
+}
+
+void HistoryForm::destroy()
+{
+ MEMMAN_DELETE(histPopupMenu);
+ delete histPopupMenu;
+}
+
+void HistoryForm::loadHistory()
+{
+ // Create list of all active profile names
+ QStringList profile_name_list;
+ list<t_user *>user_list = phone->ref_users();
+ for (list<t_user *>::iterator i = user_list.begin(); i != user_list.end(); i++) {
+ profile_name_list.append((*i)->get_profile_name().c_str());
+ }
+
+ // Fill the history table
+ unsigned long numberOfCalls = 0;
+ unsigned long totalCallDuration = 0;
+ unsigned long totalConversationDuration = 0;
+ historyListView->clear();
+ list<t_call_record> history;
+ call_history->get_history(history);
+ for (list<t_call_record>::iterator i = history.begin(); i != history.end(); i++) {
+ if (i->direction == t_call_record::DIR_IN && !inCheckBox->isChecked()) {
+ continue;
+ }
+ if (i->direction == t_call_record::DIR_OUT && !outCheckBox->isChecked()) {
+ continue;
+ }
+ if (i->invite_resp_code < 300 && !successCheckBox->isChecked()) {
+ continue;
+ }
+ if (i->invite_resp_code >= 300 && !missedCheckBox->isChecked()) {
+ continue;
+ }
+ if (!profile_name_list.contains(i->user_profile.c_str()) &&
+ profileCheckBox->isChecked())
+ {
+ continue;
+ }
+
+ numberOfCalls++;
+
+ // Calculate total duration
+ totalCallDuration += i->time_end - i->time_start;
+ if (i->time_answer != 0) {
+ totalConversationDuration += i->time_end - i->time_answer;
+ }
+
+ t_user *user_config = phone->ref_user_profile(i->user_profile);
+
+ // If the user profile is not active, then use the
+ // first user profile for formatting
+ if (!user_config) {
+ user_config = phone->ref_users().front();
+ }
+
+ new HistoryListViewItem(historyListView,
+ *i, user_config, timeLastViewed);
+ }
+
+ numberCallsValueTextLabel->setText(QString().setNum(numberOfCalls));
+
+ // Total call duration formatting
+ QString durationText = duration2str(totalCallDuration).c_str();
+ durationText += " (";
+ durationText += tr("conversation");
+ durationText += ": ";
+ durationText += duration2str(totalConversationDuration).c_str();
+ durationText += ")";
+ totalDurationValueTextLabel->setText(durationText);
+
+ // Make the first entry the selected entry.
+ QListViewItem *first = historyListView->firstChild();
+ if (first) {
+ historyListView->setSelected(first, true);
+ showCallDetails(first);
+ } else {
+ cdrTextEdit->clear();
+ }
+}
+
+// Update history when triggered by a call back function on the user
+// interface.
+void HistoryForm::update()
+{
+ // There is no need to update the history when the window is
+ // hidden.
+ if (isShown()) loadHistory();
+}
+
+void HistoryForm::show()
+{
+ if (isShown()) {
+ raise();
+ setActiveWindow();
+ return;
+ }
+
+ loadHistory();
+ QDialog::show();
+ raise();
+}
+
+void HistoryForm::closeEvent( QCloseEvent *e )
+{
+ struct timeval t;
+
+ gettimeofday(&t, NULL);
+ timeLastViewed = t.tv_sec;
+
+ // If Twinkle is terminated while the history window is
+ // shown, then the call_history object is destroyed, before this
+ // window is closed.
+ if (call_history) {
+ call_history->clear_num_missed_calls();
+ }
+ QDialog::closeEvent(e);
+}
+
+void HistoryForm::showCallDetails(QListViewItem *item)
+{
+ QString s;
+
+ t_call_record cr = ((HistoryListViewItem *)item)->get_call_record();
+ cdrTextEdit->clear();
+
+ t_user *user_config = phone->ref_user_profile(cr.user_profile);
+ // If the user profile is not active, then use the
+ // first user profile for formatting
+ if (!user_config) {
+ user_config = phone->ref_users().front();
+ }
+
+ s = "<table>";
+
+ // Left column: header names
+ s += "<tr><td><b>";
+ s += tr("Call start:") + "<br>";
+ s += tr("Call answer:") + "<br>";
+ s += tr("Call end:") + "<br>";
+ s += tr("Call duration:") + "<br>";
+ s += tr("Direction:") + "<br>";
+ s += tr("From:") + "<br>";
+ s += tr("To:") + "<br>";
+ if (cr.reply_to_uri.is_valid()) s += tr("Reply to:") + "<br>";
+ if (cr.referred_by_uri.is_valid()) s += tr("Referred by:") + "<br>";
+ s += tr("Subject:") + "<br>";
+ s += tr("Released by:") + "<br>";
+ s += tr("Status:") + "<br>";
+ if (!cr.far_end_device.empty()) s += tr("Far end device:") + "<br>";
+ s += tr("User profile:");
+ s += "</b></td>";
+
+ // Right column: values
+ s += "<td>";
+ s += time2str(cr.time_start, "%d %b %Y %H:%M:%S").c_str();
+ s += "<br>";
+ if (cr.time_answer != 0) {
+ s += time2str(cr.time_answer, "%d %b %Y %H:%M:%S").c_str();
+ }
+ s += "<br>";
+ s += time2str(cr.time_end, "%d %b %Y %H:%M:%S").c_str();
+ s += "<br>";
+
+ s += duration2str((unsigned long)(cr.time_end - cr.time_start)).c_str();
+ if (cr.time_answer != 0) {
+ s += " (";
+ s += tr("conversation");
+ s += ": ";
+ s += duration2str((unsigned long)(cr.time_end - cr.time_answer)).c_str();
+ s += ")";
+ }
+ s += "<br>";
+
+ s += cr.get_direction().c_str();
+ s += "<br>";
+ s += str2html(ui->format_sip_address(user_config, cr.from_display, cr.from_uri).c_str());
+ if (cr.from_organization != "") {
+ s += ", ";
+ s += str2html(cr.from_organization.c_str());
+ }
+ s += "<br>";
+ s += str2html(ui->format_sip_address(user_config, cr.to_display, cr.to_uri).c_str());
+ if (cr.to_organization != "") {
+ s += ", ";
+ s += str2html(cr.to_organization.c_str());
+ }
+ s += "<br>";
+ if (cr.reply_to_uri.is_valid()) {
+ s += str2html(ui->format_sip_address(user_config,
+ cr.reply_to_display, cr.reply_to_uri).c_str());
+ s += "<br>";
+ }
+ if (cr.referred_by_uri.is_valid()) {
+ s += str2html(ui->format_sip_address(user_config,
+ cr.referred_by_display, cr.referred_by_uri).c_str());
+ s += "<br>";
+ }
+ s += str2html(cr.subject.c_str());
+ s += "<br>";
+ s += cr.get_rel_cause().c_str();
+ s += "<br>";
+ s += int2str(cr.invite_resp_code).c_str();
+ s += ' ';
+ s += str2html(cr.invite_resp_reason.c_str());
+ s += "<br>";
+ if (!cr.far_end_device.empty()) {
+ s += str2html(cr.far_end_device.c_str());
+ s += "<br>";
+ }
+ s += str2html(cr.user_profile.c_str());
+ s += "</td></tr>";
+
+ s += "</table>";
+
+ cdrTextEdit->setText(s);
+}
+
+void HistoryForm::popupMenu(QListViewItem *item, const QPoint &pos)
+{
+ if (!item) return;
+
+ HistoryListViewItem *histItem = dynamic_cast<HistoryListViewItem *>(item);
+ if (!histItem) return;
+
+ t_call_record cr = histItem->get_call_record();
+
+ // An anonymous caller cannot be called
+ bool canCall = !(cr.direction == t_call_record::DIR_IN &&
+ cr.from_uri.encode() == ANONYMOUS_URI);
+
+ histPopupMenu->setItemEnabled(itemCall, canCall);
+ histPopupMenu->popup(pos);
+}
+
+void HistoryForm::call(QListViewItem *item)
+{
+ if (!item) return;
+
+ HistoryListViewItem *histItem = (HistoryListViewItem *)item;
+ t_call_record cr = histItem->get_call_record();
+
+ t_user *user_config = phone->ref_user_profile(cr.user_profile);
+ // If the user profile is not active, then use the first profile
+ if (!user_config) {
+ user_config = phone->ref_users().front();
+ }
+
+ // Determine subject
+ QString subject;
+ if (cr.direction == t_call_record::DIR_IN) {
+ if (!cr.subject.empty()) {
+ if (cr.subject.substr(0, tr("Re:").length()) != tr("Re:").ascii()) {
+ subject = tr("Re:").append(" ");
+ subject += cr.subject.c_str();
+ } else {
+ subject = cr.subject.c_str();
+ }
+ }
+ } else {
+ subject = cr.subject.c_str();
+ }
+
+ // Send call signal
+ if (cr.direction == t_call_record::DIR_IN && cr.reply_to_uri.is_valid()) {
+ // Call to the Reply-To contact
+ emit call(user_config,
+ ui->format_sip_address(user_config,
+ cr.reply_to_display, cr.reply_to_uri).c_str(),
+ subject, false);
+ } else {
+ // For incoming calls, call to the From contact
+ // For outgoing calls, call to the To contact
+ bool hide_user = false;
+ if (cr.direction == t_call_record::DIR_OUT &&
+ cr.from_uri.encode() == ANONYMOUS_URI)
+ {
+ hide_user = true;
+ }
+ emit call(user_config, item->text(HISTCOL_FROMTO), subject, hide_user);
+ }
+}
+
+void HistoryForm::call(void)
+{
+ QListViewItem *item = historyListView->currentItem();
+ if (item) call(item);
+}
+
+void HistoryForm::deleteEntry(void)
+{
+ QListViewItem *item = historyListView->currentItem();
+ HistoryListViewItem *histItem = dynamic_cast<HistoryListViewItem *>(item);
+ if (!histItem) return;
+
+ call_history->delete_call_record(histItem->get_call_record().get_id());
+}
+
+void HistoryForm::clearHistory()
+{
+ call_history->clear();
+}
diff --git a/src/gui/historylistview.cpp b/src/gui/historylistview.cpp
new file mode 100644
index 0000000..2f9806c
--- /dev/null
+++ b/src/gui/historylistview.cpp
@@ -0,0 +1,89 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include "historylistview.h"
+#include "util.h"
+#include "userintf.h"
+
+#include "qpixmap.h"
+
+HistoryListViewItem::HistoryListViewItem( QListView * parent, const t_call_record &cr, t_user *user_config, time_t _last_viewed) :
+ QListViewItem(parent,
+ time2str(cr.time_start, "%d %b %Y %H:%M:%S").c_str(),
+ cr.get_direction().c_str(),
+ (cr.direction == t_call_record::DIR_IN ?
+ ui->format_sip_address(user_config,
+ cr.from_display, cr.from_uri).c_str() :
+ ui->format_sip_address(user_config,
+ cr.to_display, cr.to_uri).c_str()),
+ cr.subject.c_str(),
+ cr.invite_resp_reason.c_str())
+{
+ call_record = cr;
+ last_viewed = _last_viewed;
+
+ // Set direction icon
+ setPixmap(HISTCOL_DIRECTION, (cr.direction == t_call_record::DIR_IN ?
+ QPixmap::fromMimeSource("1leftarrow-yellow.png") :
+ QPixmap::fromMimeSource("1rightarrow.png")));
+
+ // Set status icon
+ setPixmap(HISTCOL_STATUS, (cr.invite_resp_code < 300 ?
+ QPixmap::fromMimeSource("ok.png") :
+ QPixmap::fromMimeSource("cancel.png")));
+}
+
+void HistoryListViewItem::paintCell(QPainter *painter, const QColorGroup &cg,
+ int column, int width, int align)
+{
+ painter->save();
+ QColorGroup grp(cg);
+ if (call_record.time_start > last_viewed &&
+ call_record.rel_cause == t_call_record::CS_FAILURE &&
+ call_record.direction == t_call_record::DIR_IN)
+ {
+ // Highlight missed calls since last view
+ grp.setColor(QColorGroup::Base, QColor("yellow"));
+ }
+ QListViewItem::paintCell(painter, grp, column, width, align);
+ painter->restore();
+}
+
+int HistoryListViewItem::compare ( QListViewItem * i, int col, bool ascending ) const
+{
+ if (col != HISTCOL_TIMESTAMP) {
+ return QListViewItem::compare(i, col, ascending);
+ }
+ if (call_record.time_start < ((HistoryListViewItem *)i)->get_time_start()) {
+ return -1;
+ }
+ if (call_record.time_start == ((HistoryListViewItem *)i)->get_time_start()) {
+ return 0;
+ }
+ return 1;
+}
+
+time_t HistoryListViewItem::get_time_start(void) const
+{
+ return call_record.time_start;
+}
+
+t_call_record HistoryListViewItem::get_call_record(void) const
+{
+ return call_record;
+}
diff --git a/src/gui/historylistview.h b/src/gui/historylistview.h
new file mode 100644
index 0000000..acde247
--- /dev/null
+++ b/src/gui/historylistview.h
@@ -0,0 +1,52 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef _HISTORYLISTVIEW_H
+#define _HISTORYLISTVIEW_H
+
+#include <sys/time.h>
+#include "qlistview.h"
+#include "qpainter.h"
+#include "call_history.h"
+#include "user.h"
+
+// Columns of the history list view
+#define HISTCOL_TIMESTAMP 0
+#define HISTCOL_DIRECTION 1
+#define HISTCOL_FROMTO 2
+#define HISTCOL_SUBJECT 3
+#define HISTCOL_STATUS 4
+
+class HistoryListViewItem : public QListViewItem {
+private:
+ t_call_record call_record;
+ time_t last_viewed;
+
+public:
+ HistoryListViewItem( QListView * parent, const t_call_record &cr, t_user *user_config,
+ time_t _last_viewed);
+
+ void paintCell(QPainter *painter, const QColorGroup &cg,
+ int column, int width, int align);
+ int compare ( QListViewItem * i, int col, bool ascending ) const;
+ time_t get_time_start(void) const;
+ t_call_record get_call_record(void) const;
+};
+
+#endif
+
diff --git a/src/gui/images/1downarrow.png b/src/gui/images/1downarrow.png
new file mode 100644
index 0000000..d769883
--- /dev/null
+++ b/src/gui/images/1downarrow.png
Binary files differ
diff --git a/src/gui/images/1leftarrow-yellow.png b/src/gui/images/1leftarrow-yellow.png
new file mode 100644
index 0000000..3e47631
--- /dev/null
+++ b/src/gui/images/1leftarrow-yellow.png
Binary files differ
diff --git a/src/gui/images/1leftarrow.png b/src/gui/images/1leftarrow.png
new file mode 100644
index 0000000..ac907ef
--- /dev/null
+++ b/src/gui/images/1leftarrow.png
Binary files differ
diff --git a/src/gui/images/1rightarrow.png b/src/gui/images/1rightarrow.png
new file mode 100644
index 0000000..d8b9df1
--- /dev/null
+++ b/src/gui/images/1rightarrow.png
Binary files differ
diff --git a/src/gui/images/1uparrow.png b/src/gui/images/1uparrow.png
new file mode 100644
index 0000000..62e9a08
--- /dev/null
+++ b/src/gui/images/1uparrow.png
Binary files differ
diff --git a/src/gui/images/answer-disabled.png b/src/gui/images/answer-disabled.png
new file mode 100644
index 0000000..de1dafd
--- /dev/null
+++ b/src/gui/images/answer-disabled.png
Binary files differ
diff --git a/src/gui/images/answer.png b/src/gui/images/answer.png
new file mode 100644
index 0000000..6ecffaf
--- /dev/null
+++ b/src/gui/images/answer.png
Binary files differ
diff --git a/src/gui/images/attach.png b/src/gui/images/attach.png
new file mode 100644
index 0000000..7b1fbf5
--- /dev/null
+++ b/src/gui/images/attach.png
Binary files differ
diff --git a/src/gui/images/auto_answer-disabled.png b/src/gui/images/auto_answer-disabled.png
new file mode 100644
index 0000000..1234c0f
--- /dev/null
+++ b/src/gui/images/auto_answer-disabled.png
Binary files differ
diff --git a/src/gui/images/auto_answer.png b/src/gui/images/auto_answer.png
new file mode 100644
index 0000000..c2fa3a4
--- /dev/null
+++ b/src/gui/images/auto_answer.png
Binary files differ
diff --git a/src/gui/images/buddy.png b/src/gui/images/buddy.png
new file mode 100644
index 0000000..f963a02
--- /dev/null
+++ b/src/gui/images/buddy.png
Binary files differ
diff --git a/src/gui/images/bye-disabled.png b/src/gui/images/bye-disabled.png
new file mode 100644
index 0000000..8d99eb1
--- /dev/null
+++ b/src/gui/images/bye-disabled.png
Binary files differ
diff --git a/src/gui/images/bye.png b/src/gui/images/bye.png
new file mode 100644
index 0000000..04cc870
--- /dev/null
+++ b/src/gui/images/bye.png
Binary files differ
diff --git a/src/gui/images/cancel-disabled.png b/src/gui/images/cancel-disabled.png
new file mode 100644
index 0000000..f874dbb
--- /dev/null
+++ b/src/gui/images/cancel-disabled.png
Binary files differ
diff --git a/src/gui/images/cancel.png b/src/gui/images/cancel.png
new file mode 100644
index 0000000..6b990a2
--- /dev/null
+++ b/src/gui/images/cancel.png
Binary files differ
diff --git a/src/gui/images/cf-disabled.png b/src/gui/images/cf-disabled.png
new file mode 100644
index 0000000..2392d44
--- /dev/null
+++ b/src/gui/images/cf-disabled.png
Binary files differ
diff --git a/src/gui/images/cf.png b/src/gui/images/cf.png
new file mode 100644
index 0000000..c0e5c8a
--- /dev/null
+++ b/src/gui/images/cf.png
Binary files differ
diff --git a/src/gui/images/clock.png b/src/gui/images/clock.png
new file mode 100644
index 0000000..332b9ec
--- /dev/null
+++ b/src/gui/images/clock.png
Binary files differ
diff --git a/src/gui/images/conf-disabled.png b/src/gui/images/conf-disabled.png
new file mode 100644
index 0000000..64fef5a
--- /dev/null
+++ b/src/gui/images/conf-disabled.png
Binary files differ
diff --git a/src/gui/images/conf.png b/src/gui/images/conf.png
new file mode 100644
index 0000000..73464c6
--- /dev/null
+++ b/src/gui/images/conf.png
Binary files differ
diff --git a/src/gui/images/conference-disabled.png b/src/gui/images/conference-disabled.png
new file mode 100644
index 0000000..ed96c6e
--- /dev/null
+++ b/src/gui/images/conference-disabled.png
Binary files differ
diff --git a/src/gui/images/conference.png b/src/gui/images/conference.png
new file mode 100644
index 0000000..ae4b0d9
--- /dev/null
+++ b/src/gui/images/conference.png
Binary files differ
diff --git a/src/gui/images/consult-xfer.png b/src/gui/images/consult-xfer.png
new file mode 100644
index 0000000..25dc786
--- /dev/null
+++ b/src/gui/images/consult-xfer.png
Binary files differ
diff --git a/src/gui/images/contexthelp.png b/src/gui/images/contexthelp.png
new file mode 100644
index 0000000..e6d8b10
--- /dev/null
+++ b/src/gui/images/contexthelp.png
Binary files differ
diff --git a/src/gui/images/dtmf-0.png b/src/gui/images/dtmf-0.png
new file mode 100644
index 0000000..a6ddee3
--- /dev/null
+++ b/src/gui/images/dtmf-0.png
Binary files differ
diff --git a/src/gui/images/dtmf-1.png b/src/gui/images/dtmf-1.png
new file mode 100644
index 0000000..7093903
--- /dev/null
+++ b/src/gui/images/dtmf-1.png
Binary files differ
diff --git a/src/gui/images/dtmf-2.png b/src/gui/images/dtmf-2.png
new file mode 100644
index 0000000..90d64e3
--- /dev/null
+++ b/src/gui/images/dtmf-2.png
Binary files differ
diff --git a/src/gui/images/dtmf-3.png b/src/gui/images/dtmf-3.png
new file mode 100644
index 0000000..a2e1c8c
--- /dev/null
+++ b/src/gui/images/dtmf-3.png
Binary files differ
diff --git a/src/gui/images/dtmf-4.png b/src/gui/images/dtmf-4.png
new file mode 100644
index 0000000..73b8b99
--- /dev/null
+++ b/src/gui/images/dtmf-4.png
Binary files differ
diff --git a/src/gui/images/dtmf-5.png b/src/gui/images/dtmf-5.png
new file mode 100644
index 0000000..1231f81
--- /dev/null
+++ b/src/gui/images/dtmf-5.png
Binary files differ
diff --git a/src/gui/images/dtmf-6.png b/src/gui/images/dtmf-6.png
new file mode 100644
index 0000000..b98cd08
--- /dev/null
+++ b/src/gui/images/dtmf-6.png
Binary files differ
diff --git a/src/gui/images/dtmf-7.png b/src/gui/images/dtmf-7.png
new file mode 100644
index 0000000..e49b7f5
--- /dev/null
+++ b/src/gui/images/dtmf-7.png
Binary files differ
diff --git a/src/gui/images/dtmf-8.png b/src/gui/images/dtmf-8.png
new file mode 100644
index 0000000..94016db
--- /dev/null
+++ b/src/gui/images/dtmf-8.png
Binary files differ
diff --git a/src/gui/images/dtmf-9.png b/src/gui/images/dtmf-9.png
new file mode 100644
index 0000000..dc797ba
--- /dev/null
+++ b/src/gui/images/dtmf-9.png
Binary files differ
diff --git a/src/gui/images/dtmf-a.png b/src/gui/images/dtmf-a.png
new file mode 100644
index 0000000..2b6f2d1
--- /dev/null
+++ b/src/gui/images/dtmf-a.png
Binary files differ
diff --git a/src/gui/images/dtmf-b.png b/src/gui/images/dtmf-b.png
new file mode 100644
index 0000000..dc499e3
--- /dev/null
+++ b/src/gui/images/dtmf-b.png
Binary files differ
diff --git a/src/gui/images/dtmf-c.png b/src/gui/images/dtmf-c.png
new file mode 100644
index 0000000..5246425
--- /dev/null
+++ b/src/gui/images/dtmf-c.png
Binary files differ
diff --git a/src/gui/images/dtmf-d.png b/src/gui/images/dtmf-d.png
new file mode 100644
index 0000000..2b48cf4
--- /dev/null
+++ b/src/gui/images/dtmf-d.png
Binary files differ
diff --git a/src/gui/images/dtmf-disabled.png b/src/gui/images/dtmf-disabled.png
new file mode 100644
index 0000000..c4a7a94
--- /dev/null
+++ b/src/gui/images/dtmf-disabled.png
Binary files differ
diff --git a/src/gui/images/dtmf-pound.png b/src/gui/images/dtmf-pound.png
new file mode 100644
index 0000000..ab1344b
--- /dev/null
+++ b/src/gui/images/dtmf-pound.png
Binary files differ
diff --git a/src/gui/images/dtmf-star.png b/src/gui/images/dtmf-star.png
new file mode 100644
index 0000000..b9ec145
--- /dev/null
+++ b/src/gui/images/dtmf-star.png
Binary files differ
diff --git a/src/gui/images/dtmf.png b/src/gui/images/dtmf.png
new file mode 100644
index 0000000..92df50f
--- /dev/null
+++ b/src/gui/images/dtmf.png
Binary files differ
diff --git a/src/gui/images/edit.png b/src/gui/images/edit.png
new file mode 100644
index 0000000..4afccb2
--- /dev/null
+++ b/src/gui/images/edit.png
Binary files differ
diff --git a/src/gui/images/edit16.png b/src/gui/images/edit16.png
new file mode 100644
index 0000000..be9ac1c
--- /dev/null
+++ b/src/gui/images/edit16.png
Binary files differ
diff --git a/src/gui/images/editcopy b/src/gui/images/editcopy
new file mode 100644
index 0000000..7b334ca
--- /dev/null
+++ b/src/gui/images/editcopy
Binary files differ
diff --git a/src/gui/images/editcut b/src/gui/images/editcut
new file mode 100644
index 0000000..60abc58
--- /dev/null
+++ b/src/gui/images/editcut
Binary files differ
diff --git a/src/gui/images/editdelete.png b/src/gui/images/editdelete.png
new file mode 100644
index 0000000..f617a3d
--- /dev/null
+++ b/src/gui/images/editdelete.png
Binary files differ
diff --git a/src/gui/images/editpaste b/src/gui/images/editpaste
new file mode 100644
index 0000000..19c2fec
--- /dev/null
+++ b/src/gui/images/editpaste
Binary files differ
diff --git a/src/gui/images/encrypted-disabled.png b/src/gui/images/encrypted-disabled.png
new file mode 100644
index 0000000..96d39cb
--- /dev/null
+++ b/src/gui/images/encrypted-disabled.png
Binary files differ
diff --git a/src/gui/images/encrypted.png b/src/gui/images/encrypted.png
new file mode 100644
index 0000000..cd638f0
--- /dev/null
+++ b/src/gui/images/encrypted.png
Binary files differ
diff --git a/src/gui/images/encrypted32.png b/src/gui/images/encrypted32.png
new file mode 100644
index 0000000..f6db914
--- /dev/null
+++ b/src/gui/images/encrypted32.png
Binary files differ
diff --git a/src/gui/images/encrypted_verified.png b/src/gui/images/encrypted_verified.png
new file mode 100644
index 0000000..71d6734
--- /dev/null
+++ b/src/gui/images/encrypted_verified.png
Binary files differ
diff --git a/src/gui/images/exit.png b/src/gui/images/exit.png
new file mode 100644
index 0000000..4ce275d
--- /dev/null
+++ b/src/gui/images/exit.png
Binary files differ
diff --git a/src/gui/images/favorites.png b/src/gui/images/favorites.png
new file mode 100644
index 0000000..7e02468
--- /dev/null
+++ b/src/gui/images/favorites.png
Binary files differ
diff --git a/src/gui/images/filenew b/src/gui/images/filenew
new file mode 100644
index 0000000..9de6e83
--- /dev/null
+++ b/src/gui/images/filenew
Binary files differ
diff --git a/src/gui/images/fileopen-disabled.png b/src/gui/images/fileopen-disabled.png
new file mode 100644
index 0000000..96dbb4c
--- /dev/null
+++ b/src/gui/images/fileopen-disabled.png
Binary files differ
diff --git a/src/gui/images/fileopen.png b/src/gui/images/fileopen.png
new file mode 100644
index 0000000..b56225a
--- /dev/null
+++ b/src/gui/images/fileopen.png
Binary files differ
diff --git a/src/gui/images/filesave b/src/gui/images/filesave
new file mode 100644
index 0000000..f6d9af9
--- /dev/null
+++ b/src/gui/images/filesave
Binary files differ
diff --git a/src/gui/images/gear.png b/src/gui/images/gear.png
new file mode 100644
index 0000000..401549d
--- /dev/null
+++ b/src/gui/images/gear.png
Binary files differ
diff --git a/src/gui/images/hold-disabled.png b/src/gui/images/hold-disabled.png
new file mode 100644
index 0000000..1f8f5de
--- /dev/null
+++ b/src/gui/images/hold-disabled.png
Binary files differ
diff --git a/src/gui/images/hold.png b/src/gui/images/hold.png
new file mode 100644
index 0000000..6cd6db7
--- /dev/null
+++ b/src/gui/images/hold.png
Binary files differ
diff --git a/src/gui/images/invite-disabled.png b/src/gui/images/invite-disabled.png
new file mode 100644
index 0000000..6197d2f
--- /dev/null
+++ b/src/gui/images/invite-disabled.png
Binary files differ
diff --git a/src/gui/images/invite.png b/src/gui/images/invite.png
new file mode 100644
index 0000000..765f253
--- /dev/null
+++ b/src/gui/images/invite.png
Binary files differ
diff --git a/src/gui/images/kcmpci.png b/src/gui/images/kcmpci.png
new file mode 100644
index 0000000..a3ddf40
--- /dev/null
+++ b/src/gui/images/kcmpci.png
Binary files differ
diff --git a/src/gui/images/kcmpci16.png b/src/gui/images/kcmpci16.png
new file mode 100644
index 0000000..0ac401c
--- /dev/null
+++ b/src/gui/images/kcmpci16.png
Binary files differ
diff --git a/src/gui/images/kmix.png b/src/gui/images/kmix.png
new file mode 100644
index 0000000..ba400b7
--- /dev/null
+++ b/src/gui/images/kmix.png
Binary files differ
diff --git a/src/gui/images/knotify.png b/src/gui/images/knotify.png
new file mode 100644
index 0000000..e5b0cad
--- /dev/null
+++ b/src/gui/images/knotify.png
Binary files differ
diff --git a/src/gui/images/kontact_contacts-disabled.png b/src/gui/images/kontact_contacts-disabled.png
new file mode 100644
index 0000000..a86b960
--- /dev/null
+++ b/src/gui/images/kontact_contacts-disabled.png
Binary files differ
diff --git a/src/gui/images/kontact_contacts.png b/src/gui/images/kontact_contacts.png
new file mode 100644
index 0000000..68c6582
--- /dev/null
+++ b/src/gui/images/kontact_contacts.png
Binary files differ
diff --git a/src/gui/images/kontact_contacts32.png b/src/gui/images/kontact_contacts32.png
new file mode 100644
index 0000000..8f8b460
--- /dev/null
+++ b/src/gui/images/kontact_contacts32.png
Binary files differ
diff --git a/src/gui/images/log.png b/src/gui/images/log.png
new file mode 100644
index 0000000..29d8214
--- /dev/null
+++ b/src/gui/images/log.png
Binary files differ
diff --git a/src/gui/images/log_small.png b/src/gui/images/log_small.png
new file mode 100644
index 0000000..41b3f43
--- /dev/null
+++ b/src/gui/images/log_small.png
Binary files differ
diff --git a/src/gui/images/message.png b/src/gui/images/message.png
new file mode 100644
index 0000000..744c451
--- /dev/null
+++ b/src/gui/images/message.png
Binary files differ
diff --git a/src/gui/images/message32.png b/src/gui/images/message32.png
new file mode 100644
index 0000000..602f1e0
--- /dev/null
+++ b/src/gui/images/message32.png
Binary files differ
diff --git a/src/gui/images/mime_application.png b/src/gui/images/mime_application.png
new file mode 100644
index 0000000..f274fd4
--- /dev/null
+++ b/src/gui/images/mime_application.png
Binary files differ
diff --git a/src/gui/images/mime_audio.png b/src/gui/images/mime_audio.png
new file mode 100644
index 0000000..9fefada
--- /dev/null
+++ b/src/gui/images/mime_audio.png
Binary files differ
diff --git a/src/gui/images/mime_image.png b/src/gui/images/mime_image.png
new file mode 100644
index 0000000..d6a9bc3
--- /dev/null
+++ b/src/gui/images/mime_image.png
Binary files differ
diff --git a/src/gui/images/mime_text.png b/src/gui/images/mime_text.png
new file mode 100644
index 0000000..c17e3c8
--- /dev/null
+++ b/src/gui/images/mime_text.png
Binary files differ
diff --git a/src/gui/images/mime_video.png b/src/gui/images/mime_video.png
new file mode 100644
index 0000000..de00f0e
--- /dev/null
+++ b/src/gui/images/mime_video.png
Binary files differ
diff --git a/src/gui/images/missed-disabled.png b/src/gui/images/missed-disabled.png
new file mode 100644
index 0000000..a95583a
--- /dev/null
+++ b/src/gui/images/missed-disabled.png
Binary files differ
diff --git a/src/gui/images/missed.png b/src/gui/images/missed.png
new file mode 100644
index 0000000..30e38f2
--- /dev/null
+++ b/src/gui/images/missed.png
Binary files differ
diff --git a/src/gui/images/mute-disabled.png b/src/gui/images/mute-disabled.png
new file mode 100644
index 0000000..3f35181
--- /dev/null
+++ b/src/gui/images/mute-disabled.png
Binary files differ
diff --git a/src/gui/images/mute.png b/src/gui/images/mute.png
new file mode 100644
index 0000000..f721deb
--- /dev/null
+++ b/src/gui/images/mute.png
Binary files differ
diff --git a/src/gui/images/mwi_failure16.png b/src/gui/images/mwi_failure16.png
new file mode 100644
index 0000000..4cd5f7f
--- /dev/null
+++ b/src/gui/images/mwi_failure16.png
Binary files differ
diff --git a/src/gui/images/mwi_new16.png b/src/gui/images/mwi_new16.png
new file mode 100644
index 0000000..3affbd0
--- /dev/null
+++ b/src/gui/images/mwi_new16.png
Binary files differ
diff --git a/src/gui/images/mwi_none.png b/src/gui/images/mwi_none.png
new file mode 100644
index 0000000..39151d6
--- /dev/null
+++ b/src/gui/images/mwi_none.png
Binary files differ
diff --git a/src/gui/images/mwi_none16.png b/src/gui/images/mwi_none16.png
new file mode 100644
index 0000000..d69df60
--- /dev/null
+++ b/src/gui/images/mwi_none16.png
Binary files differ
diff --git a/src/gui/images/mwi_none16_dis.png b/src/gui/images/mwi_none16_dis.png
new file mode 100644
index 0000000..bf12682
--- /dev/null
+++ b/src/gui/images/mwi_none16_dis.png
Binary files differ
diff --git a/src/gui/images/network.png b/src/gui/images/network.png
new file mode 100644
index 0000000..fcdbed0
--- /dev/null
+++ b/src/gui/images/network.png
Binary files differ
diff --git a/src/gui/images/no-indication.png b/src/gui/images/no-indication.png
new file mode 100644
index 0000000..0656c4e
--- /dev/null
+++ b/src/gui/images/no-indication.png
Binary files differ
diff --git a/src/gui/images/ok.png b/src/gui/images/ok.png
new file mode 100644
index 0000000..543710f
--- /dev/null
+++ b/src/gui/images/ok.png
Binary files differ
diff --git a/src/gui/images/package_network.png b/src/gui/images/package_network.png
new file mode 100644
index 0000000..556e8ff
--- /dev/null
+++ b/src/gui/images/package_network.png
Binary files differ
diff --git a/src/gui/images/package_system.png b/src/gui/images/package_system.png
new file mode 100644
index 0000000..a5d6213
--- /dev/null
+++ b/src/gui/images/package_system.png
Binary files differ
diff --git a/src/gui/images/password.png b/src/gui/images/password.png
new file mode 100644
index 0000000..9df4840
--- /dev/null
+++ b/src/gui/images/password.png
Binary files differ
diff --git a/src/gui/images/penguin-small.png b/src/gui/images/penguin-small.png
new file mode 100644
index 0000000..a99e611
--- /dev/null
+++ b/src/gui/images/penguin-small.png
Binary files differ
diff --git a/src/gui/images/penguin.png b/src/gui/images/penguin.png
new file mode 100644
index 0000000..3d7aa52
--- /dev/null
+++ b/src/gui/images/penguin.png
Binary files differ
diff --git a/src/gui/images/penguin_big.png b/src/gui/images/penguin_big.png
new file mode 100644
index 0000000..1dc2da6
--- /dev/null
+++ b/src/gui/images/penguin_big.png
Binary files differ
diff --git a/src/gui/images/presence.png b/src/gui/images/presence.png
new file mode 100644
index 0000000..3d9c866
--- /dev/null
+++ b/src/gui/images/presence.png
Binary files differ
diff --git a/src/gui/images/presence_failed.png b/src/gui/images/presence_failed.png
new file mode 100644
index 0000000..c4e28d6
--- /dev/null
+++ b/src/gui/images/presence_failed.png
Binary files differ
diff --git a/src/gui/images/presence_offline.png b/src/gui/images/presence_offline.png
new file mode 100644
index 0000000..28a3738
--- /dev/null
+++ b/src/gui/images/presence_offline.png
Binary files differ
diff --git a/src/gui/images/presence_online.png b/src/gui/images/presence_online.png
new file mode 100644
index 0000000..f42ff86
--- /dev/null
+++ b/src/gui/images/presence_online.png
Binary files differ
diff --git a/src/gui/images/presence_rejected.png b/src/gui/images/presence_rejected.png
new file mode 100644
index 0000000..4979190
--- /dev/null
+++ b/src/gui/images/presence_rejected.png
Binary files differ
diff --git a/src/gui/images/presence_unknown.png b/src/gui/images/presence_unknown.png
new file mode 100644
index 0000000..fb225c7
--- /dev/null
+++ b/src/gui/images/presence_unknown.png
Binary files differ
diff --git a/src/gui/images/print b/src/gui/images/print
new file mode 100644
index 0000000..1812266
--- /dev/null
+++ b/src/gui/images/print
Binary files differ
diff --git a/src/gui/images/qt-logo.png b/src/gui/images/qt-logo.png
new file mode 100644
index 0000000..50a79e1
--- /dev/null
+++ b/src/gui/images/qt-logo.png
Binary files differ
diff --git a/src/gui/images/redial-disabled.png b/src/gui/images/redial-disabled.png
new file mode 100644
index 0000000..5bfbf9b
--- /dev/null
+++ b/src/gui/images/redial-disabled.png
Binary files differ
diff --git a/src/gui/images/redial.png b/src/gui/images/redial.png
new file mode 100644
index 0000000..2e273cf
--- /dev/null
+++ b/src/gui/images/redial.png
Binary files differ
diff --git a/src/gui/images/redirect-disabled.png b/src/gui/images/redirect-disabled.png
new file mode 100644
index 0000000..04348d5
--- /dev/null
+++ b/src/gui/images/redirect-disabled.png
Binary files differ
diff --git a/src/gui/images/redirect.png b/src/gui/images/redirect.png
new file mode 100644
index 0000000..e99e1b8
--- /dev/null
+++ b/src/gui/images/redirect.png
Binary files differ
diff --git a/src/gui/images/redo b/src/gui/images/redo
new file mode 100644
index 0000000..f4b348e
--- /dev/null
+++ b/src/gui/images/redo
Binary files differ
diff --git a/src/gui/images/reg-query.png b/src/gui/images/reg-query.png
new file mode 100644
index 0000000..2d0ad1a
--- /dev/null
+++ b/src/gui/images/reg-query.png
Binary files differ
diff --git a/src/gui/images/reg_failed-disabled.png b/src/gui/images/reg_failed-disabled.png
new file mode 100644
index 0000000..b14498a
--- /dev/null
+++ b/src/gui/images/reg_failed-disabled.png
Binary files differ
diff --git a/src/gui/images/reg_failed.png b/src/gui/images/reg_failed.png
new file mode 100644
index 0000000..7042871
--- /dev/null
+++ b/src/gui/images/reg_failed.png
Binary files differ
diff --git a/src/gui/images/reject-disabled.png b/src/gui/images/reject-disabled.png
new file mode 100644
index 0000000..da19ffd
--- /dev/null
+++ b/src/gui/images/reject-disabled.png
Binary files differ
diff --git a/src/gui/images/reject.png b/src/gui/images/reject.png
new file mode 100644
index 0000000..dbffecd
--- /dev/null
+++ b/src/gui/images/reject.png
Binary files differ
diff --git a/src/gui/images/save_as.png b/src/gui/images/save_as.png
new file mode 100644
index 0000000..41b3f43
--- /dev/null
+++ b/src/gui/images/save_as.png
Binary files differ
diff --git a/src/gui/images/searchfind b/src/gui/images/searchfind
new file mode 100644
index 0000000..7aaefe2
--- /dev/null
+++ b/src/gui/images/searchfind
Binary files differ
diff --git a/src/gui/images/settings.png b/src/gui/images/settings.png
new file mode 100644
index 0000000..8bc9a0f
--- /dev/null
+++ b/src/gui/images/settings.png
Binary files differ
diff --git a/src/gui/images/stat_conference.png b/src/gui/images/stat_conference.png
new file mode 100644
index 0000000..8006127
--- /dev/null
+++ b/src/gui/images/stat_conference.png
Binary files differ
diff --git a/src/gui/images/stat_established.png b/src/gui/images/stat_established.png
new file mode 100644
index 0000000..a27c899
--- /dev/null
+++ b/src/gui/images/stat_established.png
Binary files differ
diff --git a/src/gui/images/stat_established_nomedia.png b/src/gui/images/stat_established_nomedia.png
new file mode 100644
index 0000000..e278c45
--- /dev/null
+++ b/src/gui/images/stat_established_nomedia.png
Binary files differ
diff --git a/src/gui/images/stat_mute.png b/src/gui/images/stat_mute.png
new file mode 100644
index 0000000..2729b10
--- /dev/null
+++ b/src/gui/images/stat_mute.png
Binary files differ
diff --git a/src/gui/images/stat_outgoing.png b/src/gui/images/stat_outgoing.png
new file mode 100644
index 0000000..5b5e8b5
--- /dev/null
+++ b/src/gui/images/stat_outgoing.png
Binary files differ
diff --git a/src/gui/images/stat_ringing.png b/src/gui/images/stat_ringing.png
new file mode 100644
index 0000000..9a615fa
--- /dev/null
+++ b/src/gui/images/stat_ringing.png
Binary files differ
diff --git a/src/gui/images/sys_auto_ans.png b/src/gui/images/sys_auto_ans.png
new file mode 100644
index 0000000..55a653a
--- /dev/null
+++ b/src/gui/images/sys_auto_ans.png
Binary files differ
diff --git a/src/gui/images/sys_auto_ans_dis.png b/src/gui/images/sys_auto_ans_dis.png
new file mode 100644
index 0000000..ce3449a
--- /dev/null
+++ b/src/gui/images/sys_auto_ans_dis.png
Binary files differ
diff --git a/src/gui/images/sys_busy_estab.png b/src/gui/images/sys_busy_estab.png
new file mode 100644
index 0000000..828385a
--- /dev/null
+++ b/src/gui/images/sys_busy_estab.png
Binary files differ
diff --git a/src/gui/images/sys_busy_estab_dis.png b/src/gui/images/sys_busy_estab_dis.png
new file mode 100644
index 0000000..07a00b2
--- /dev/null
+++ b/src/gui/images/sys_busy_estab_dis.png
Binary files differ
diff --git a/src/gui/images/sys_busy_trans.png b/src/gui/images/sys_busy_trans.png
new file mode 100644
index 0000000..ab89a47
--- /dev/null
+++ b/src/gui/images/sys_busy_trans.png
Binary files differ
diff --git a/src/gui/images/sys_busy_trans_dis.png b/src/gui/images/sys_busy_trans_dis.png
new file mode 100644
index 0000000..22daf77
--- /dev/null
+++ b/src/gui/images/sys_busy_trans_dis.png
Binary files differ
diff --git a/src/gui/images/sys_dnd.png b/src/gui/images/sys_dnd.png
new file mode 100644
index 0000000..dbb7526
--- /dev/null
+++ b/src/gui/images/sys_dnd.png
Binary files differ
diff --git a/src/gui/images/sys_dnd_dis.png b/src/gui/images/sys_dnd_dis.png
new file mode 100644
index 0000000..4d3cd2c
--- /dev/null
+++ b/src/gui/images/sys_dnd_dis.png
Binary files differ
diff --git a/src/gui/images/sys_encrypted.png b/src/gui/images/sys_encrypted.png
new file mode 100644
index 0000000..00d549b
--- /dev/null
+++ b/src/gui/images/sys_encrypted.png
Binary files differ
diff --git a/src/gui/images/sys_encrypted_dis.png b/src/gui/images/sys_encrypted_dis.png
new file mode 100644
index 0000000..9572071
--- /dev/null
+++ b/src/gui/images/sys_encrypted_dis.png
Binary files differ
diff --git a/src/gui/images/sys_encrypted_verified.png b/src/gui/images/sys_encrypted_verified.png
new file mode 100644
index 0000000..a390812
--- /dev/null
+++ b/src/gui/images/sys_encrypted_verified.png
Binary files differ
diff --git a/src/gui/images/sys_encrypted_verified_dis.png b/src/gui/images/sys_encrypted_verified_dis.png
new file mode 100644
index 0000000..1e727b1
--- /dev/null
+++ b/src/gui/images/sys_encrypted_verified_dis.png
Binary files differ
diff --git a/src/gui/images/sys_hold.png b/src/gui/images/sys_hold.png
new file mode 100644
index 0000000..f1001c1
--- /dev/null
+++ b/src/gui/images/sys_hold.png
Binary files differ
diff --git a/src/gui/images/sys_hold_dis.png b/src/gui/images/sys_hold_dis.png
new file mode 100644
index 0000000..893fef6
--- /dev/null
+++ b/src/gui/images/sys_hold_dis.png
Binary files differ
diff --git a/src/gui/images/sys_idle.png b/src/gui/images/sys_idle.png
new file mode 100644
index 0000000..a7d1c5b
--- /dev/null
+++ b/src/gui/images/sys_idle.png
Binary files differ
diff --git a/src/gui/images/sys_idle_dis.png b/src/gui/images/sys_idle_dis.png
new file mode 100644
index 0000000..ffa865c
--- /dev/null
+++ b/src/gui/images/sys_idle_dis.png
Binary files differ
diff --git a/src/gui/images/sys_missed.png b/src/gui/images/sys_missed.png
new file mode 100644
index 0000000..c7c7703
--- /dev/null
+++ b/src/gui/images/sys_missed.png
Binary files differ
diff --git a/src/gui/images/sys_missed_dis.png b/src/gui/images/sys_missed_dis.png
new file mode 100644
index 0000000..454c707
--- /dev/null
+++ b/src/gui/images/sys_missed_dis.png
Binary files differ
diff --git a/src/gui/images/sys_mute.png b/src/gui/images/sys_mute.png
new file mode 100644
index 0000000..1055d71
--- /dev/null
+++ b/src/gui/images/sys_mute.png
Binary files differ
diff --git a/src/gui/images/sys_mute_dis.png b/src/gui/images/sys_mute_dis.png
new file mode 100644
index 0000000..7b1d6f1
--- /dev/null
+++ b/src/gui/images/sys_mute_dis.png
Binary files differ
diff --git a/src/gui/images/sys_mwi.png b/src/gui/images/sys_mwi.png
new file mode 100644
index 0000000..e038be6
--- /dev/null
+++ b/src/gui/images/sys_mwi.png
Binary files differ
diff --git a/src/gui/images/sys_mwi_dis.png b/src/gui/images/sys_mwi_dis.png
new file mode 100644
index 0000000..037829c
--- /dev/null
+++ b/src/gui/images/sys_mwi_dis.png
Binary files differ
diff --git a/src/gui/images/sys_redir.png b/src/gui/images/sys_redir.png
new file mode 100644
index 0000000..db694b8
--- /dev/null
+++ b/src/gui/images/sys_redir.png
Binary files differ
diff --git a/src/gui/images/sys_redir_dis.png b/src/gui/images/sys_redir_dis.png
new file mode 100644
index 0000000..09a4453
--- /dev/null
+++ b/src/gui/images/sys_redir_dis.png
Binary files differ
diff --git a/src/gui/images/sys_services.png b/src/gui/images/sys_services.png
new file mode 100644
index 0000000..1f076e9
--- /dev/null
+++ b/src/gui/images/sys_services.png
Binary files differ
diff --git a/src/gui/images/sys_services_dis.png b/src/gui/images/sys_services_dis.png
new file mode 100644
index 0000000..94e30cc
--- /dev/null
+++ b/src/gui/images/sys_services_dis.png
Binary files differ
diff --git a/src/gui/images/telephone-hook.png b/src/gui/images/telephone-hook.png
new file mode 100644
index 0000000..91d8489
--- /dev/null
+++ b/src/gui/images/telephone-hook.png
Binary files differ
diff --git a/src/gui/images/transfer-disabled.png b/src/gui/images/transfer-disabled.png
new file mode 100644
index 0000000..79a62ef
--- /dev/null
+++ b/src/gui/images/transfer-disabled.png
Binary files differ
diff --git a/src/gui/images/transfer.png b/src/gui/images/transfer.png
new file mode 100644
index 0000000..77f296d
--- /dev/null
+++ b/src/gui/images/transfer.png
Binary files differ
diff --git a/src/gui/images/twinkle16-disabled.png b/src/gui/images/twinkle16-disabled.png
new file mode 100644
index 0000000..ea445f7
--- /dev/null
+++ b/src/gui/images/twinkle16-disabled.png
Binary files differ
diff --git a/src/gui/images/twinkle16.png b/src/gui/images/twinkle16.png
new file mode 100644
index 0000000..c929c95
--- /dev/null
+++ b/src/gui/images/twinkle16.png
Binary files differ
diff --git a/src/gui/images/twinkle24.png b/src/gui/images/twinkle24.png
new file mode 100644
index 0000000..a7d1c5b
--- /dev/null
+++ b/src/gui/images/twinkle24.png
Binary files differ
diff --git a/src/gui/images/twinkle32.png b/src/gui/images/twinkle32.png
new file mode 100644
index 0000000..8f8fc3a
--- /dev/null
+++ b/src/gui/images/twinkle32.png
Binary files differ
diff --git a/src/gui/images/twinkle48.png b/src/gui/images/twinkle48.png
new file mode 100644
index 0000000..def423d
--- /dev/null
+++ b/src/gui/images/twinkle48.png
Binary files differ
diff --git a/src/gui/images/undo b/src/gui/images/undo
new file mode 100644
index 0000000..7d59658
--- /dev/null
+++ b/src/gui/images/undo
Binary files differ
diff --git a/src/gui/images/yast_PhoneTTOffhook.png b/src/gui/images/yast_PhoneTTOffhook.png
new file mode 100644
index 0000000..193d3ad
--- /dev/null
+++ b/src/gui/images/yast_PhoneTTOffhook.png
Binary files differ
diff --git a/src/gui/images/yast_babelfish.png b/src/gui/images/yast_babelfish.png
new file mode 100644
index 0000000..39b7dee
--- /dev/null
+++ b/src/gui/images/yast_babelfish.png
Binary files differ
diff --git a/src/gui/inviteform.ui b/src/gui/inviteform.ui
new file mode 100644
index 0000000..b0d7d63
--- /dev/null
+++ b/src/gui/inviteform.ui
@@ -0,0 +1,369 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>InviteForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>InviteForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>592</width>
+ <height>203</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Call</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout40</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>inviteTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;To:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>inviteComboBox</cstring>
+ </property>
+ </widget>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>23</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>subjectLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Optionally you can provide a subject here. This might be shown to the callee.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="1" column="2">
+ <property name="name">
+ <cstring>addressToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>F10</string>
+ </property>
+ <property name="iconSet">
+ <iconset>kontact_contacts.png</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Address book</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select an address from the address book.</string>
+ </property>
+ </widget>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>spacer24</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QComboBox" row="1" column="1">
+ <property name="name">
+ <cstring>inviteComboBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ <property name="maxCount">
+ <number>10</number>
+ </property>
+ <property name="insertionPolicy">
+ <enum>NoInsertion</enum>
+ </property>
+ <property name="autoCompletion">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The address that you want to call. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>fromComboBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The user that will make the call.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>subjectTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Subject:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>subjectLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>fromTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;From:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>fromComboBox</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout13</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>hideUserCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Hide identity</string>
+ </property>
+ <property name="accel">
+ <string>Alt+H</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+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 &lt;b&gt;not&lt;/b&gt; hide your IP address.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Warning:&lt;/b&gt; not all providers support identity hiding.
+&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>181</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer12</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout20</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>91</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>InviteForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>InviteForm</receiver>
+ <slot>validate()</slot>
+ </connection>
+ <connection>
+ <sender>addressToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>InviteForm</receiver>
+ <slot>showAddressBook()</slot>
+ </connection>
+ <connection>
+ <sender>hideUserCheckBox</sender>
+ <signal>clicked()</signal>
+ <receiver>InviteForm</receiver>
+ <slot>warnHideUser()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>inviteComboBox</tabstop>
+ <tabstop>subjectLineEdit</tabstop>
+ <tabstop>hideUserCheckBox</tabstop>
+ <tabstop>addressToolButton</tabstop>
+ <tabstop>okPushButton</tabstop>
+ <tabstop>cancelPushButton</tabstop>
+ <tabstop>fromComboBox</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in declaration">qstring.h</include>
+ <include location="local" impldecl="in declaration">sockets/url.h</include>
+ <include location="local" impldecl="in declaration">getaddressform.h</include>
+ <include location="local" impldecl="in declaration">user.h</include>
+ <include location="local" impldecl="in declaration">phone.h</include>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">util.h</include>
+ <include location="local" impldecl="in implementation">audits/memman.h</include>
+ <include location="local" impldecl="in implementation">sys_settings.h</include>
+ <include location="local" impldecl="in implementation">qregexp.h</include>
+ <include location="local" impldecl="in implementation">qvalidator.h</include>
+ <include location="local" impldecl="in implementation">inviteform.ui.h</include>
+</includes>
+<forwards>
+ <forward>extern t_phone *phone;</forward>
+</forwards>
+<variables>
+ <variable access="private">GetAddressForm *getAddressForm;</variable>
+</variables>
+<signals>
+ <signal>destination(t_user *, const QString &amp;, const t_url &amp;, const QString &amp;, bool)</signal>
+ <signal>raw_destination(const QString &amp;)</signal>
+</signals>
+<slots>
+ <slot>clear()</slot>
+ <slot>show( t_user * user_config, const QString &amp; dest, const QString &amp; subject, bool anonymous )</slot>
+ <slot>validate()</slot>
+ <slot>addToInviteComboBox( const QString &amp; destination )</slot>
+ <slot>reject()</slot>
+ <slot>closeEvent( QCloseEvent * )</slot>
+ <slot>showAddressBook()</slot>
+ <slot>selectedAddress( const QString &amp; address )</slot>
+ <slot>warnHideUser( void )</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function access="private" specifier="non virtual">destroy()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/inviteform.ui.h b/src/gui/inviteform.ui.h
new file mode 100644
index 0000000..6e0b6d4
--- /dev/null
+++ b/src/gui/inviteform.ui.h
@@ -0,0 +1,153 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+void InviteForm::init()
+{
+ getAddressForm = 0;
+
+ // Set toolbutton icons for disabled options.
+ setDisabledIcon(addressToolButton, "kontact_contacts-disabled.png");
+
+ // A QComboBox accepts a new line through copy/paste.
+ QRegExp rxNoNewLine("[^\\n\\r]*");
+ inviteComboBox->setValidator(new QRegExpValidator(rxNoNewLine, this));
+}
+
+void InviteForm::destroy()
+{
+ if (getAddressForm) {
+ MEMMAN_DELETE(getAddressForm);
+ delete getAddressForm;
+ }
+}
+
+void InviteForm::clear()
+{
+ inviteComboBox->clearEdit();
+ subjectLineEdit->clear();
+ hideUserCheckBox->setChecked(false);
+ inviteComboBox->setFocus();
+}
+
+void InviteForm::show(t_user *user_config, const QString &dest, const QString &subject,
+ bool anonymous)
+{
+ ((t_gui *)ui)->fill_user_combo(fromComboBox);
+
+ // Select from user
+ if (user_config) {
+ for (int i = 0; i < fromComboBox->count(); i++) {
+ if (fromComboBox->text(i) ==
+ user_config->get_profile_name().c_str())
+ {
+ fromComboBox->setCurrentItem(i);
+ break;
+ }
+ }
+ }
+
+ inviteComboBox->setEditText(dest);
+ subjectLineEdit->setText(subject);
+ hideUserCheckBox->setChecked(anonymous);
+ QDialog::show();
+}
+
+void InviteForm::validate()
+{
+ string display, dest_str;
+ t_user *from_user = phone->ref_user_profile(
+ fromComboBox->currentText().ascii());
+
+ ui->expand_destination(from_user,
+ inviteComboBox->currentText().stripWhiteSpace().ascii(),
+ display, dest_str);
+ t_url dest(dest_str);
+
+ if (dest.is_valid()) {
+ addToInviteComboBox(inviteComboBox->currentText());
+ emit raw_destination(inviteComboBox->currentText());
+ emit destination(from_user, display.c_str(), dest, subjectLineEdit->text(),
+ hideUserCheckBox->isChecked());
+ accept();
+ } else {
+ inviteComboBox->setFocus();
+ inviteComboBox->lineEdit()->selectAll();
+ }
+}
+
+// Add a destination to the history list of inviteComboBox
+void InviteForm::addToInviteComboBox(const QString &destination)
+{
+ inviteComboBox->insertItem(destination, 0);
+ if (inviteComboBox->count() > SIZE_REDIAL_LIST) {
+ inviteComboBox->removeItem(inviteComboBox->count() - 1);
+ }
+}
+
+
+void InviteForm::reject()
+{
+ // Unseize the line
+ ((t_gui *)ui)->action_unseize();
+ QDialog::reject();
+}
+
+void InviteForm::closeEvent(QCloseEvent *)
+{
+ reject();
+}
+
+void InviteForm::showAddressBook()
+{
+ if (!getAddressForm) {
+ getAddressForm = new GetAddressForm(
+ this, "select address", true);
+ MEMMAN_NEW(getAddressForm);
+ }
+
+ connect(getAddressForm,
+ SIGNAL(address(const QString &)),
+ this, SLOT(selectedAddress(const QString &)));
+
+ getAddressForm->show();
+}
+
+void InviteForm::selectedAddress(const QString &address)
+{
+ inviteComboBox->setEditText(address);
+}
+
+void InviteForm::warnHideUser(void) {
+ // Warn only once
+ if (!sys_config->get_warn_hide_user()) return;
+
+ QString msg = tr("Not all SIP providers support identity hiding. Make sure your SIP provider "
+ "supports it if you really need it.");
+ ((t_gui *)ui)->cb_show_msg(this, msg.ascii(), MSG_WARNING);
+
+ // Do not warn again
+ sys_config->set_warn_hide_user(false);
+}
diff --git a/src/gui/lang/Makefile.am b/src/gui/lang/Makefile.am
new file mode 100644
index 0000000..c8b4d40
--- /dev/null
+++ b/src/gui/lang/Makefile.am
@@ -0,0 +1,38 @@
+pkglangdir = $(pkgdatadir)/lang
+
+pkglang_DATA = \
+ twinkle_nl.qm \
+ twinkle_de.qm \
+ twinkle_cs.qm \
+ twinkle_fr.qm \
+ twinkle_ru.qm \
+ twinkle_sv.qm
+
+CLEANFILES = $(pkglang_DATA)
+
+EXTRA_DIST = \
+ twinkle_nl.ts \
+ twinkle_de.ts \
+ twinkle_cs.ts \
+ twinkle_fr.ts \
+ twinkle_ru.ts \
+ twinkle_sv.ts \
+ twinkle_xx.ts
+
+twinkle_nl.qm: $(top_builddir)/src/gui/twinkle $(top_srcdir)/src/gui/twinkle.pro
+ lrelease $(LRELEASEOPTION) $(srcdir)/twinkle_nl.ts -qm $@
+
+twinkle_de.qm: $(top_builddir)/src/gui/twinkle $(top_srcdir)/src/gui/twinkle.pro
+ lrelease $(LRELEASEOPTION) $(srcdir)/twinkle_de.ts -qm $@
+
+twinkle_cs.qm: $(top_builddir)/src/gui/twinkle $(top_srcdir)/src/gui/twinkle.pro
+ lrelease $(LRELEASEOPTION) $(srcdir)/twinkle_cs.ts -qm $@
+
+twinkle_fr.qm: $(top_builddir)/src/gui/twinkle $(top_srcdir)/src/gui/twinkle.pro
+ lrelease $(LRELEASEOPTION) $(srcdir)/twinkle_fr.ts -qm $@
+
+twinkle_ru.qm: $(top_builddir)/src/gui/twinkle $(top_srcdir)/src/gui/twinkle.pro
+ lrelease $(LRELEASEOPTION) $(srcdir)/twinkle_ru.ts -qm $@
+
+twinkle_sv.qm: $(top_builddir)/src/gui/twinkle $(top_srcdir)/src/gui/twinkle.pro
+ lrelease $(LRELEASEOPTION) $(srcdir)/twinkle_sv.ts -qm $@
diff --git a/src/gui/lang/twinkle_cs.ts b/src/gui/lang/twinkle_cs.ts
new file mode 100644
index 0000000..ad71d31
--- /dev/null
+++ b/src/gui/lang/twinkle_cs.ts
@@ -0,0 +1,6039 @@
+<!DOCTYPE TS><TS>
+<defaultcodec></defaultcodec>
+<context>
+ <name>AddressCardForm</name>
+ <message>
+ <source>Twinkle - Address Card</source>
+ <translation>Twinkle - Adresářový záznam</translation>
+ </message>
+ <message>
+ <source>&amp;Remark:</source>
+ <translation>P&amp;oznámka:</translation>
+ </message>
+ <message>
+ <source>Infix name of contact.</source>
+ <translation>Prostřední jméno nebo titul.</translation>
+ </message>
+ <message>
+ <source>First name of contact.</source>
+ <translation>Křestní jméno nebo jakékoliv jiné jméno. Bude třídicím klíčem.</translation>
+ </message>
+ <message>
+ <source>&amp;First name:</source>
+ <translation>&amp;Křestní jméno:</translation>
+ </message>
+ <message>
+ <source>You may place any remark about the contact here.</source>
+ <translation>Políčko pro libovolné poznámky.</translation>
+ </message>
+ <message>
+ <source>&amp;Phone:</source>
+ <translation>&amp;Telefon:</translation>
+ </message>
+ <message>
+ <source>&amp;Infix name:</source>
+ <translation>&amp;Titul:</translation>
+ </message>
+ <message>
+ <source>Phone number or SIP address of contact.</source>
+ <translation>Telefonní číslo nebo SIP adresa kontaktu.</translation>
+ </message>
+ <message>
+ <source>Last name of contact.</source>
+ <translation>Příjmení. </translation>
+ </message>
+ <message>
+ <source>&amp;Last name:</source>
+ <translation>&amp;Příjmení:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Zrušit (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>You must fill in a name.</source>
+ <translation>Musíte zadat jméno.</translation>
+ </message>
+ <message>
+ <source>You must fill in a phone number or SIP address.</source>
+ <translation>Musíte zadat jméno nebo SIP adresu.</translation>
+ </message>
+</context>
+<context>
+ <name>AuthenticationForm</name>
+ <message>
+ <source>Twinkle - Authentication</source>
+ <translation>Twinkle - Přihlášení</translation>
+ </message>
+ <message>
+ <source>user</source>
+ <comment>No need to translate</comment>
+ <translation>user</translation>
+ </message>
+ <message>
+ <source>The user for which authentication is requested.</source>
+ <translation>Uživatel, který má být přihlášen.</translation>
+ </message>
+ <message>
+ <source>profile</source>
+ <comment>No need to translate</comment>
+ <translation>profile</translation>
+ </message>
+ <message>
+ <source>The user profile of the user for which authentication is requested.</source>
+ <translation>Profil uživatele, pro kterého je přihlášení vyžadováno.</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Uživatelský profil:</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Uživatel:</translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>&amp;Heslo:</translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation>Vaše přijhlašovací heslo.</translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation>Vaše přihlašovací SIP jméno. Často je identické s vaším uživatelským SIP jménem. Pokud ne, zeptejte se na něj vašeho VoIP poskytovatele.</translation>
+ </message>
+ <message>
+ <source>&amp;User name:</source>
+ <translation>Uži&amp;vatelské jméno:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Zrušit (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Login required for realm:</source>
+ <translation>Pro Realm je nutné přihlášení:</translation>
+ </message>
+ <message>
+ <source>realm</source>
+ <comment>No need to translate</comment>
+ <translation>realm</translation>
+ </message>
+ <message>
+ <source>The realm for which you need to authenticate.</source>
+ <translation>Realm, ke kterému se musíte přihlásit.</translation>
+ </message>
+</context>
+<context>
+ <name>BuddyForm</name>
+ <message>
+ <source>Twinkle - Buddy</source>
+ <translation>Twinkle - Buddy</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adresář</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>vybrat adresu z adresáře .</translation>
+ </message>
+ <message>
+ <source>&amp;Phone:</source>
+ <translation>&amp;Telefon:</translation>
+ </message>
+ <message>
+ <source>Name of your buddy.</source>
+ <translation>Jméno vašeho Buddy.</translation>
+ </message>
+ <message>
+ <source>&amp;Show availability</source>
+ <translation>&amp;Ukázat dostupnost</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>Check this option if you want to see the availability of your buddy. This will only work if your provider offers a presence agent.</source>
+ <translation>Vybrat tuto volbu pokud chcete vidět dostupnost vašeho buddy. Toto bude fungovat pouze pokud váš VoIP poskytovatel nabízí funkci &quot;prezenčního agenta&quot;.</translation>
+ </message>
+ <message>
+ <source>&amp;Name:</source>
+ <translation>&amp;Jméno:</translation>
+ </message>
+ <message>
+ <source>SIP address your buddy.</source>
+ <translation>SIP adresa vašeho buddy.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Zrušit (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>You must fill in a name.</source>
+ <translation>Musíte zadat jméno.</translation>
+ </message>
+ <message>
+ <source>Invalid phone.</source>
+ <translation>neplatné telefonní číslo.</translation>
+ </message>
+ <message>
+ <source>Failed to save buddy list: %1</source>
+ <translation>Nepodařilo se uložit buddy seznam: %1</translation>
+ </message>
+</context>
+<context>
+ <name>BuddyList</name>
+ <message>
+ <source>Availability</source>
+ <translation>Dostupnost</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>neznámý</translation>
+ </message>
+ <message>
+ <source>offline</source>
+ <translation>offline</translation>
+ </message>
+ <message>
+ <source>online</source>
+ <translation>online</translation>
+ </message>
+ <message>
+ <source>request rejected</source>
+ <translation>požadavek odmítnut</translation>
+ </message>
+ <message>
+ <source>not published</source>
+ <translation>nepublikováno</translation>
+ </message>
+ <message>
+ <source>failed to publish</source>
+ <translation>publikování selhalho</translation>
+ </message>
+ <message>
+ <source>request failed</source>
+ <translation>požadavek selhal</translation>
+ </message>
+ <message>
+ <source>Click right to add a buddy.</source>
+ <translation>pravým kliknutím přidat buddyho.</translation>
+ </message>
+</context>
+<context>
+ <name>CoreAudio</name>
+ <message>
+ <source>Failed to open sound card</source>
+ <translation>Nepodařilo se získat přístup ke zvukové kartě</translation>
+ </message>
+ <message>
+ <source>Failed to create a UDP socket (RTP) on port %1</source>
+ <translation>Nepodařilo se vytvořit UDP socket (RTP) na portu %1</translation>
+ </message>
+ <message>
+ <source>Failed to create audio receiver thread.</source>
+ <translation>Nepodařilo se vytvořit proces pro audio příjem.</translation>
+ </message>
+ <message>
+ <source>Failed to create audio transmitter thread.</source>
+ <translation>Nepodařilo se vytvořit proces pro audio přenos.</translation>
+ </message>
+</context>
+<context>
+ <name>CoreCallHistory</name>
+ <message>
+ <source>local user</source>
+ <translation>lokální uživatel</translation>
+ </message>
+ <message>
+ <source>remote user</source>
+ <translation>vzdálený uživatel</translation>
+ </message>
+ <message>
+ <source>failure</source>
+ <translation>Chyba</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>neznámý</translation>
+ </message>
+ <message>
+ <source>in</source>
+ <translation>příchozí</translation>
+ </message>
+ <message>
+ <source>out</source>
+ <translation>odchozí</translation>
+ </message>
+</context>
+<context>
+ <name>DeregisterForm</name>
+ <message>
+ <source>Twinkle - Deregister</source>
+ <translation>Twinkle - Odhlášení</translation>
+ </message>
+ <message>
+ <source>deregister all devices</source>
+ <translation>Odhlásit všechny koncové přístroje</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Zrušit (Es&amp;c)</translation>
+ </message>
+</context>
+<context>
+ <name>DiamondcardProfileForm</name>
+ <message>
+ <source>Twinkle - Diamondcard User Profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your Diamondcard account ID.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Account ID:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;PIN code:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p align=&quot;center&quot;&gt;&lt;u&gt;Sign up for a Diamondcard account&lt;/u&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">Zrušit (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fill in your account ID.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fill in your PIN code.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A user profile with name %1 already exists.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your Diamondcard PIN code.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;With a Diamondcard account you can make worldwide calls to regular and cell phones and send SMS messages. To sign up for a Diamondcard account click on the &quot;sign up&quot; link below. Once you have signed up you receive an account ID and PIN code. Enter the account ID and PIN code below to create a Twinkle user profile for your Diamondcard account.&lt;/p&gt;
+&lt;p&gt;For call rates see the sign up web page that will be shown to you when you click on the &quot;sign up&quot; link.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DtmfForm</name>
+ <message>
+ <source>Twinkle - DTMF</source>
+ <translation>Twinkle - DTMF</translation>
+ </message>
+ <message>
+ <source>Keypad</source>
+ <translation>Klávesnice</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>Over decadic A. Normally not needed.</source>
+ <translation>Funkční klávesa A. Normálně nepoužívaná.</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>Over decadic B. Normally not needed.</source>
+ <translation>Funkční klávesa B. Používaná zřídka používaná.</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>Over decadic C. Normally not needed.</source>
+ <translation>Funkční klávesa C. Používaná zřídka.</translation>
+ </message>
+ <message>
+ <source>Star (*)</source>
+ <translation>Hvězdička (*)</translation>
+ </message>
+ <message>
+ <source>0</source>
+ <translation>0</translation>
+ </message>
+ <message>
+ <source>Pound (#)</source>
+ <translation>Křížek (#)</translation>
+ </message>
+ <message>
+ <source>Over decadic D. Normally not needed.</source>
+ <translation>Funční klávesa D. Používaná zřídka.</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>Za&amp;vřít</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+</context>
+<context>
+ <name>FreeDeskSysTray</name>
+ <message>
+ <source>Show/Hide</source>
+ <translation>Ukázat/Zminimalizovat</translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation>Ukončit</translation>
+ </message>
+</context>
+<context>
+ <name>GUI</name>
+ <message>
+ <source>Failed to create a UDP socket (SIP) on port %1</source>
+ <translation type="obsolete">Chyba při otevírání UDP socketu (SIP) na portu %1</translation>
+ </message>
+ <message>
+ <source>The following profiles are both for user %1</source>
+ <translation>Následující uživatelské profily používají stejnou SIP Adresu %1</translation>
+ </message>
+ <message>
+ <source>You can only run multiple profiles for different users.</source>
+ <translation>Na jeden SIP účet si nemůžete aktivovat současně více profilů.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Twinkle nemůže najít žádné aktivní síťové rozhraní a používá nyní 127.0.0.1 jako svoji lokální IP adresu.
+Pokud se připojíte k nějaké síti později, musíte Twinkle spustit znovu. Tím umožníte nalezení nové a funkční síťové adresy.</translation>
+ </message>
+ <message>
+ <source>Line %1: incoming call for %2</source>
+ <translation>Linka %1: příchozí hovor pro %2</translation>
+ </message>
+ <message>
+ <source>Call transferred by %1</source>
+ <translation>Volání přepojeno uživatelem %1</translation>
+ </message>
+ <message>
+ <source>Line %1: far end cancelled call.</source>
+ <translation>Linka %1: Protistrana přerušila hovor.</translation>
+ </message>
+ <message>
+ <source>Line %1: far end released call.</source>
+ <translation>Linka %1: hovor ukončen protistranou.</translation>
+ </message>
+ <message>
+ <source>Line %1: SDP answer from far end not supported.</source>
+ <translation>Linka %1: SDP odpověď protistrany není podporována.</translation>
+ </message>
+ <message>
+ <source>Line %1: SDP answer from far end missing.</source>
+ <translation>Linka %1: žádná SDP odpověď protistrany.</translation>
+ </message>
+ <message>
+ <source>Line %1: Unsupported content type in answer from far end.</source>
+ <translation>Linka %1: Typ obsahu v odpovědi protistrany není podporována.</translation>
+ </message>
+ <message>
+ <source>Line %1: no ACK received, call will be terminated.</source>
+ <translation>Linka %1: žádný ACK od protistrany, volání ukončeno.</translation>
+ </message>
+ <message>
+ <source>Line %1: no PRACK received, call will be terminated.</source>
+ <translation>Linka %1: žádný PRACK od protistrany, volání bude ukončeno.</translation>
+ </message>
+ <message>
+ <source>Line %1: PRACK failed.</source>
+ <translation>Linka %1: PRACK chyba.</translation>
+ </message>
+ <message>
+ <source>Line %1: failed to cancel call.</source>
+ <translation>Linka %1: Chyba při pokusu o ukončení hovoru.</translation>
+ </message>
+ <message>
+ <source>Line %1: far end answered call.</source>
+ <translation>Linka %1: Protistrana odpověděla na volání.</translation>
+ </message>
+ <message>
+ <source>Line %1: call failed.</source>
+ <translation>Linka %1: Volání selhalo.</translation>
+ </message>
+ <message>
+ <source>The call can be redirected to:</source>
+ <translation>Hovor může být přepojen na:</translation>
+ </message>
+ <message>
+ <source>Line %1: call released.</source>
+ <translation>Linka %1: Hovor ukončen.</translation>
+ </message>
+ <message>
+ <source>Line %1: call established.</source>
+ <translation>Linka %1: Spojení navázáno.</translation>
+ </message>
+ <message>
+ <source>Response on terminal capability request: %1 %2</source>
+ <translation>Odpověď protistrany na dotaz o výpis možností: %1 %2</translation>
+ </message>
+ <message>
+ <source>Terminal capabilities of %1</source>
+ <translation>Schopnosti protistrany %1</translation>
+ </message>
+ <message>
+ <source>Accepted body types:</source>
+ <translation>Akceptované &quot;body types&quot;:</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>neznámý</translation>
+ </message>
+ <message>
+ <source>Accepted encodings:</source>
+ <translation>Akceptovaná &quot;encodings&quot;:</translation>
+ </message>
+ <message>
+ <source>Accepted languages:</source>
+ <translation>Akceptované jazyky:</translation>
+ </message>
+ <message>
+ <source>Allowed requests:</source>
+ <translation>Povolené &quot;requests&quot;:</translation>
+ </message>
+ <message>
+ <source>Supported extensions:</source>
+ <translation>Podporované &quot;extensions&quot;:</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation>žádný</translation>
+ </message>
+ <message>
+ <source>End point type:</source>
+ <translation>Typ koncového zařízení:</translation>
+ </message>
+ <message>
+ <source>Line %1: call retrieve failed.</source>
+ <translation>Linka %1: Chyba při pokusu o znovunavázání hovoru.</translation>
+ </message>
+ <message>
+ <source>%1, registration failed: %2 %3</source>
+ <translation>%1, Neúspěšné přihlášení: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, registration succeeded (expires = %2 seconds)</source>
+ <translation>%1, Přihlášení úspěšné (platné na %2 Sek.)</translation>
+ </message>
+ <message>
+ <source>%1, registration failed: STUN failure</source>
+ <translation>%1, Přihlášení neúspěšné: STUN chyba</translation>
+ </message>
+ <message>
+ <source>%1, de-registration succeeded: %2 %3</source>
+ <translation>%1, Odhlášení proběhlo: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, fetching registrations failed: %2 %3</source>
+ <translation>%1, Chyba při dotazu na registraci: %2 %3</translation>
+ </message>
+ <message>
+ <source>: you are not registered</source>
+ <translation>: Nejste přihlášen</translation>
+ </message>
+ <message>
+ <source>: you have the following registrations</source>
+ <translation>: jsou aktivní následující přihlášení</translation>
+ </message>
+ <message>
+ <source>: fetching registrations...</source>
+ <translation>: probíhá dotaz na přihlášení...</translation>
+ </message>
+ <message>
+ <source>Line %1: redirecting request to</source>
+ <translation>Linka %1: převést dotaz na </translation>
+ </message>
+ <message>
+ <source>Redirecting request to: %1</source>
+ <translation>Převést dotaz na: %1</translation>
+ </message>
+ <message>
+ <source>Line %1: DTMF detected:</source>
+ <translation>Linka %1: detekováno DTMF: </translation>
+ </message>
+ <message>
+ <source>invalid DTMF telephone event (%1)</source>
+ <translation>Neplatné vyhodnocení DTMF (%1)</translation>
+ </message>
+ <message>
+ <source>Line %1: send DTMF %2</source>
+ <translation>Linka %1: vyšli DTMF %2</translation>
+ </message>
+ <message>
+ <source>Line %1: far end does not support DTMF telephone events.</source>
+ <translation>Linka %1: Protistrana nepodporuje žádný DTMF dotaz.</translation>
+ </message>
+ <message>
+ <source>Line %1: received notification.</source>
+ <translation>Linka %1: Oznámení přijato.</translation>
+ </message>
+ <message>
+ <source>Event: %1</source>
+ <translation>Událost: %1</translation>
+ </message>
+ <message>
+ <source>State: %1</source>
+ <translation>Stav: %1</translation>
+ </message>
+ <message>
+ <source>Reason: %1</source>
+ <translation>Příčina: %1</translation>
+ </message>
+ <message>
+ <source>Progress: %1 %2</source>
+ <translation>Postup: %1 %2</translation>
+ </message>
+ <message>
+ <source>Line %1: call transfer failed.</source>
+ <translation>Linka %1: Přesměrování hovoru selhalo.</translation>
+ </message>
+ <message>
+ <source>Line %1: call succesfully transferred.</source>
+ <translation>Linka %1: Hovor byl přesměrován.</translation>
+ </message>
+ <message>
+ <source>Line %1: call transfer still in progress.</source>
+ <translation>Linka %1: Přesměrování hovoru probíhá.</translation>
+ </message>
+ <message>
+ <source>No further notifications will be received.</source>
+ <translation>Protistrana zastavila zasílání zpráv.</translation>
+ </message>
+ <message>
+ <source>Line %1: transferring call to %2</source>
+ <translation>Linka %1: Přesměrování hovoru na %2</translation>
+ </message>
+ <message>
+ <source>Transfer requested by %1</source>
+ <translation>Přesněrování hovoru vyžádáno od %1</translation>
+ </message>
+ <message>
+ <source>Line %1: Call transfer failed. Retrieving original call.</source>
+ <translation>Linka %1: Přesměrování hovoru bylo neúspěšné. V původním hovoru bude pokračováno.</translation>
+ </message>
+ <message>
+ <source>Redirecting call</source>
+ <translation>Hovor bude přesměrován</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Uživatelský profil:</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Uživatel:</translation>
+ </message>
+ <message>
+ <source>Do you allow the call to be redirected to the following destination?</source>
+ <translation>Chcete dovolit aby hovor byl přesměrován na následující cíl?</translation>
+ </message>
+ <message>
+ <source>If you don&apos;t want to be asked this anymore, then you must change the settings in the SIP protocol section of the user profile.</source>
+ <translation>Pokud nechcete, aby jste zde byl neustále dotazován, musíte změnit nastavení v sekci SIP protokol v uživatelském profilu.</translation>
+ </message>
+ <message>
+ <source>Redirecting request</source>
+ <translation>Přesměrovat dotaz</translation>
+ </message>
+ <message>
+ <source>Do you allow the %1 request to be redirected to the following destination?</source>
+ <translation>Má být požadavek %1 přesměrován na následující destinaci?</translation>
+ </message>
+ <message>
+ <source>Transferring call</source>
+ <translation>Přesměrování hovoru</translation>
+ </message>
+ <message>
+ <source>Request to transfer call received from:</source>
+ <translation>Požadavek na přesměrování hovoru přijat od:</translation>
+ </message>
+ <message>
+ <source>Do you allow the call to be transferred to the following destination?</source>
+ <translation>Povolit přesměrování hovoru k následujícímu cíli?</translation>
+ </message>
+ <message>
+ <source>Info:</source>
+ <translation>Info:</translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation>Upozornění:</translation>
+ </message>
+ <message>
+ <source>Critical:</source>
+ <translation>Kritické:</translation>
+ </message>
+ <message>
+ <source>Firewall / NAT discovery...</source>
+ <translation>Firewall / NAT Analýza...</translation>
+ </message>
+ <message>
+ <source>Abort</source>
+ <translation>Přerušit</translation>
+ </message>
+ <message>
+ <source>Line %1</source>
+ <translation>Linka %1</translation>
+ </message>
+ <message>
+ <source>Click the padlock to confirm a correct SAS.</source>
+ <translation>Pro potvrzení správného SAS hesla klikněte na symbol zámečku.</translation>
+ </message>
+ <message>
+ <source>The remote user on line %1 disabled the encryption.</source>
+ <translation>protistrana na lince %1 vypnula zašifrování.</translation>
+ </message>
+ <message>
+ <source>Line %1: SAS confirmed.</source>
+ <translation>Linka %1: SAS potvrzeno.</translation>
+ </message>
+ <message>
+ <source>Line %1: SAS confirmation reset.</source>
+ <translation>Linka %1: SAS potvrzení smazáno.</translation>
+ </message>
+ <message>
+ <source>Line %1: call rejected.</source>
+ <translation>Linka %1: hovor odmítnut.</translation>
+ </message>
+ <message>
+ <source>Line %1: call redirected.</source>
+ <translation>Linka %1: Hovor přesměrován.</translation>
+ </message>
+ <message>
+ <source>Failed to start conference.</source>
+ <translation>Nepodařilo se otevřít konferenci.</translation>
+ </message>
+ <message>
+ <source>Override lock file and start anyway?</source>
+ <translation>Ignorovat blokovací soubor a přesto spustit?</translation>
+ </message>
+ <message>
+ <source>%1, STUN request failed: %2 %3</source>
+ <translation>%1, STUN dotaz selhal: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, STUN request failed.</source>
+ <translation>%1, STUN diatz selhal.</translation>
+ </message>
+ <message>
+ <source>%1, voice mail status failure.</source>
+ <translation>%1, Chyba stavu hlasové schránky.</translation>
+ </message>
+ <message>
+ <source>%1, voice mail status rejected.</source>
+ <translation>%1, odmítnut stav hlasové schránky.</translation>
+ </message>
+ <message>
+ <source>%1, voice mailbox does not exist.</source>
+ <translation>%1, hlasová schránka neexistuje.</translation>
+ </message>
+ <message>
+ <source>%1, voice mail status terminated.</source>
+ <translation>%1, ukončen přenos z hlasové schránky. </translation>
+ </message>
+ <message>
+ <source>%1, de-registration failed: %2 %3</source>
+ <translation>%1, Neúspěšné odhlášení: %2 %3</translation>
+ </message>
+ <message>
+ <source>Request to transfer call received.</source>
+ <translation>Protistrana si vyžádala přenos.</translation>
+ </message>
+ <message>
+ <source>If these are users for different domains, then enable the following option in your user profile (SIP protocol)</source>
+ <translation>Pokud jsou toto uživatelé pro různé domény, potom aktivujte následující volbu ve vašem uživatelském profilu (SIP protocol)</translation>
+ </message>
+ <message>
+ <source>Use domain name to create a unique contact header</source>
+ <translation>Použijte doménové jméno k vytvoření jedinečné kontaktní hlavičky</translation>
+ </message>
+ <message>
+ <source>Failed to create a %1 socket (SIP) on port %2</source>
+ <translation>Selhalo vytvoření %1 socketu (SIP) na portu %2</translation>
+ </message>
+ <message>
+ <source>Accepted by network</source>
+ <translation>Akceptováno sítí</translation>
+ </message>
+ <message>
+ <source>Failed to save message attachment: %1</source>
+ <translation>Selhalo uložení přílohy zprávy: %1</translation>
+ </message>
+ <message>
+ <source>Transferred by: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot open web browser: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Configure your web browser in the system settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>GetAddressForm</name>
+ <message>
+ <source>Twinkle - Select address</source>
+ <translation>Twinkle - Výběr adres</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Jméno</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Typ</translation>
+ </message>
+ <message>
+ <source>Phone</source>
+ <translation>Telefon</translation>
+ </message>
+ <message>
+ <source>&amp;Show only SIP addresses</source>
+ <translation>Zobrazit pouze &amp;SIP adresy</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>Check this option when you only want to see contacts with SIP addresses, i.e. starting with &quot;&lt;b&gt;sip:&lt;/b&gt;&quot;.</source>
+ <translation>Pokud je aktivováno, budou zobrazeny pouze kontakty, které obsahují platnou SIP adresu (začínající na &lt;b&gt;sip:&lt;/b&gt;).</translation>
+ </message>
+ <message>
+ <source>&amp;Reload</source>
+ <translation>Aktua&amp;lizovat</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt+R</translation>
+ </message>
+ <message>
+ <source>Reload the list of addresses from KAddressbook.</source>
+ <translation>Znovu načíst seznam adres z KAddressbook.
+Zavření a opětovné otevření okna &lt;i&gt;nevede&lt;/i&gt; k novému načtení. Změny v adresáři budou v Twinkle viditelné až po aktivaci &quot;Aktualizace&quot;.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Zrušit (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>&amp;KAddressBook</source>
+ <translation>&amp;KAddressBook</translation>
+ </message>
+ <message>
+ <source>This list of addresses is taken from &lt;b&gt;KAddressBook&lt;/b&gt;. 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.</source>
+ <translation>Tento seznam kontaktů pochází z &lt;b&gt;KAddressbook&lt;/b&gt;. Kontakty, které neobsahují telefonní číslo nebo SIP adresu zde nejsou uvedeny.
+K vytvoření nebo úpravě kontaktů použijte program KAddressbook.</translation>
+ </message>
+ <message>
+ <source>&amp;Local address book</source>
+ <translation>&amp;Lokální adresář</translation>
+ </message>
+ <message>
+ <source>Remark</source>
+ <translation>Poznámka</translation>
+ </message>
+ <message>
+ <source>Contacts in the local address book of Twinkle.</source>
+ <translation>Kontakty v lokálním adresáři Twinkle.</translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation>&amp;Přidat</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Add a new contact to the local address book.</source>
+ <translation>Založit v lokálním adresáři nový kontakt.</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Smazat</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation>Alt+D</translation>
+ </message>
+ <message>
+ <source>Delete a contact from the local address book.</source>
+ <translation>Smazat vybraný kontakt z lokálního adresáře.</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Upravit</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation>Alt+E</translation>
+ </message>
+ <message>
+ <source>Edit a contact from the local address book.</source>
+ <translation>Upavit vybraný kontakt z lokálního adresáře.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You seem not to have any contacts with a phone number in &lt;b&gt;KAddressBook&lt;/b&gt;, KDE&apos;s address book application. Twinkle retrieves all contacts with a phone number from KAddressBook. To manage your contacts you have to use KAddressBook.&lt;p&gt;As an alternative you may use Twinkle&apos;s local address book.&lt;/p&gt;</source>
+ <translation>Zdá se, že &lt;p&gt;&lt;b&gt;KAddressbook&lt;/b&gt; 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ů.&lt;/p&gt;
+&lt;p&gt;Jako alternativa je vám k dispozici lokální adresář Twinkles, bez nutnosti mít výše jmenovaný program.&lt;/p&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>GetProfileNameForm</name>
+ <message>
+ <source>Twinkle - Profile name</source>
+ <translation>Twinkle - Jméno uživatelského programu</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Zrušit (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Enter a name for your profile:</source>
+ <translation>Vložte jméno pro nový profil:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The name of your profile&lt;/b&gt;
+&lt;br&gt;&lt;br&gt;
+A profile contains your user settings, e.g. your user name and password. You have to give each profile a name.
+&lt;br&gt;&lt;br&gt;
+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.
+&lt;br&gt;&lt;br&gt;
+To remember your profiles easily you could use your SIP user name as a profile name, e.g. &lt;b&gt;example@example.com&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Jméno pod kterým bude založen nový profil&lt;/b&gt;
+&lt;br&gt;&lt;br&gt;
+Profil obsahuje všechna uživateslká nastavení jako je VoIP poskytovatel, uživatelské jméno SIP, Heslo atd. Pokus spustíte Twinkle bude zobrazen seznam všech profilů, ze kterého si lze vybrat ten se kterým má být pracováno.
+&lt;br&gt;&lt;br&gt;
+Ke snadnému zapamatování si profilu je možné použít k označení profilu uživatelské jméno. Např. &lt;b&gt;example@example.com&lt;/b&gt;
+&lt;p&gt;Před založením prvního profilu je vhodné si nejprve vyřídit registraci u vašeho SIP poskytovatele a poznačit si jaké &lt;b&gt;SIP přístupové parametry&lt;/b&gt; jsou k přihlášení potřebné.
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Cannot find .twinkle directory in your home directory.</source>
+ <translation>Nelze najít adresář &quot;.twinkle&quot; ve vašem domovském adresáři (&quot;/home/vase-jmeno/&quot;).</translation>
+ </message>
+ <message>
+ <source>Profile already exists.</source>
+ <translation>Profil s tímto jménem již existuje.</translation>
+ </message>
+ <message>
+ <source>Rename profile &apos;%1&apos; to:</source>
+ <translation>Profil &quot;%1&quot; přejmenovat na:</translation>
+ </message>
+</context>
+<context>
+ <name>HistoryForm</name>
+ <message>
+ <source>Twinkle - Call History</source>
+ <translation>Twinkle - Seznam volání</translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation>Čas</translation>
+ </message>
+ <message>
+ <source>In/Out</source>
+ <translation>Příchozí/Odchozí</translation>
+ </message>
+ <message>
+ <source>From/To</source>
+ <translation>Protistrana</translation>
+ </message>
+ <message>
+ <source>Subject</source>
+ <translation>Předmět</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Stav</translation>
+ </message>
+ <message>
+ <source>Call details</source>
+ <translation>Detaily hovoru</translation>
+ </message>
+ <message>
+ <source>Details of the selected call record.</source>
+ <translation>Detaily k vybranému hovoru.</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation>Zobrazit</translation>
+ </message>
+ <message>
+ <source>&amp;Incoming calls</source>
+ <translation>&amp;Příchozí hovory</translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation>Alt+I</translation>
+ </message>
+ <message>
+ <source>Check this option to show incoming calls.</source>
+ <translation>Zaškrtnut tuto volbu, pokud mají být signalizovány příchozí hovory.</translation>
+ </message>
+ <message>
+ <source>&amp;Outgoing calls</source>
+ <translation>&amp;Odchozí hovory</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>Check this option to show outgoing calls.</source>
+ <translation>Pokud je aktivováno, budou zobrazeny jen odchozí hovory.</translation>
+ </message>
+ <message>
+ <source>&amp;Answered calls</source>
+ <translation>&amp;Přijaté hovory</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Check this option to show answered calls.</source>
+ <translation>Pokud je aktivováno, budou zobrazeny jen přijaté hovory.</translation>
+ </message>
+ <message>
+ <source>&amp;Missed calls</source>
+ <translation>&amp;Zmeškaná volání</translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation>Alt+M</translation>
+ </message>
+ <message>
+ <source>Check this option to show missed calls.</source>
+ <translation>Pokud je aktivováno, budou zobrazeny jen zmeškaná volání.</translation>
+ </message>
+ <message>
+ <source>Current &amp;user profiles only</source>
+ <translation>&amp;Pouze aktivní uživatelské profily</translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>Check this option to show only calls associated with this user profile.</source>
+ <translation>Pokud je aktivováno, budou zobrazeny jen hovory, které byly provedeny pod právě aktivovním uživatelským profilem.</translation>
+ </message>
+ <message>
+ <source>C&amp;lear</source>
+ <translation>&amp;Smazat seznam</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+L</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;Clear the complete call history.&lt;/p&gt;
+&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; this will clear &lt;b&gt;all&lt;/b&gt; records, also records not shown depending on the checked view options.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Smazat celý protokol volání.&lt;/p&gt;
+&lt;p&gt;&lt;b&gt;Poznámka:&lt;/b&gt; Tímto dojde ke smazání všech záznamů. Včetně těch, které nejsou zobrazeny dle zvolených parametrů v nastavení.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>Close this window.</source>
+ <translation>Zavřít toto okno.</translation>
+ </message>
+ <message>
+ <source>Call start:</source>
+ <translation>Volání zahájeno:</translation>
+ </message>
+ <message>
+ <source>Call answer:</source>
+ <translation>Na volání odpovězeno:</translation>
+ </message>
+ <message>
+ <source>Call end:</source>
+ <translation>Hovor ukončen:</translation>
+ </message>
+ <message>
+ <source>Call duration:</source>
+ <translation>Délka hovoru:</translation>
+ </message>
+ <message>
+ <source>Direction:</source>
+ <translation>Směr:</translation>
+ </message>
+ <message>
+ <source>From:</source>
+ <translation>Od:</translation>
+ </message>
+ <message>
+ <source>To:</source>
+ <translation>Komu:</translation>
+ </message>
+ <message>
+ <source>Reply to:</source>
+ <translation>Odpovědět na:</translation>
+ </message>
+ <message>
+ <source>Referred by:</source>
+ <translation>Přes:</translation>
+ </message>
+ <message>
+ <source>Subject:</source>
+ <translation>Název:</translation>
+ </message>
+ <message>
+ <source>Released by:</source>
+ <translation>Ukončeno:</translation>
+ </message>
+ <message>
+ <source>Status:</source>
+ <translation>Status:</translation>
+ </message>
+ <message>
+ <source>Far end device:</source>
+ <translation>Zařízení protistrany:</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Uživatelský profil:</translation>
+ </message>
+ <message>
+ <source>conversation</source>
+ <translation>Rozhovor</translation>
+ </message>
+ <message>
+ <source>Call...</source>
+ <translation>Volat (dvojitý klik)...</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Smazat záznam</translation>
+ </message>
+ <message>
+ <source>Re:</source>
+ <translation>Odp:</translation>
+ </message>
+ <message>
+ <source>Clo&amp;se</source>
+ <translation>Za&amp;vřít</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>&amp;Call</source>
+ <translation>&amp;Volat</translation>
+ </message>
+ <message>
+ <source>Call selected address.</source>
+ <translation>Volat vybranou adresu.</translation>
+ </message>
+ <message>
+ <source>Number of calls:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>###</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Total call duration:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>InviteForm</name>
+ <message>
+ <source>Twinkle - Call</source>
+ <translation>Twinkle - Volání</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>Komu (&amp;Telnr):</translation>
+ </message>
+ <message>
+ <source>Optionally you can provide a subject here. This might be shown to the callee.</source>
+ <translation>Zde můžete zadat nějaký název, který bude spolu s vaším jménem zobrazen na volané stanici.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adresář</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Vybrat adresu z KDE-Adressbook.</translation>
+ </message>
+ <message>
+ <source>The address that you want to call. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Adresu, kterou chcete volat. Toto může být plnohodnotná SIP adresa jako např. &lt;b&gt;sip:example@example.com&lt;/b&gt; nebo jen pouze telefonní číslo. Pokud není zadaná kompletní adresa twinkle ji doplní o doménové jméno aktuálního uživatelského profilu.</translation>
+ </message>
+ <message>
+ <source>The user that will make the call.</source>
+ <translation>Uživatelský profil a současně i VoIP poskytovatel, se kterým bylo volání iniciováno.</translation>
+ </message>
+ <message>
+ <source>&amp;Subject:</source>
+ <translation>&amp;Předmět:</translation>
+ </message>
+ <message>
+ <source>&amp;From:</source>
+ <translation>&amp;Od:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Zrušit (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>&amp;Hide identity</source>
+ <translation>&amp;skrýt identitu volajícího</translation>
+ </message>
+ <message>
+ <source>Alt+H</source>
+ <translation>Alt+H</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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 &lt;b&gt;not&lt;/b&gt; hide your IP address.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Warning:&lt;/b&gt; not all providers support identity hiding.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;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ě &lt;b&gt;vždy&lt;/b&gt; sdělena.&lt;/p&gt;
+&lt;p&gt;&lt;b&gt;Upozornění: &lt;/b&gt;Tuto možnost nenenabízejí všichni VoIP poskytovatelé!&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Not all SIP providers support identity hiding. Make sure your SIP provider supports it if you really need it.</source>
+ <translation>Ne všichni VoIP poskytovatelé umožňují skrytí identity. Ujistěte se o tom, pokud se na tuto funkci chcete spolehnout.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished">F10</translation>
+ </message>
+</context>
+<context>
+ <name>LogViewForm</name>
+ <message>
+ <source>Twinkle - Log</source>
+ <translation>Twinkle - Log</translation>
+ </message>
+ <message>
+ <source>Contents of the current log file (~/.twinkle/twinkle.log)</source>
+ <translation>Obsah aktuálního protokolovacího souboru (~/.twinkle/twinkle.log)</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>&amp;Zavřít</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>C&amp;lear</source>
+ <translation>&amp;Smazat</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+L</translation>
+ </message>
+ <message>
+ <source>Clear the log window. This does &lt;b&gt;not&lt;/b&gt; clear the log file itself.</source>
+ <translation>Smazat protokolovací okno. Obsah samotného souboru s protokolem smazán &lt;b&gt;nebude&lt;/b&gt;.</translation>
+ </message>
+</context>
+<context>
+ <name>MessageForm</name>
+ <message>
+ <source>Twinkle - Instant message</source>
+ <translation>Twinkle - instantní zpráva</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;Komu:</translation>
+ </message>
+ <message>
+ <source>The user that will send the message.</source>
+ <translation>Uživatel, který pošle zprávu.</translation>
+ </message>
+ <message>
+ <source>The address of the user that you want to send a message. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Adresa uživatele, kterému má být zpráva poslána. To může být buď SIP adresa, jako např. &lt;b&gt;sip:example@example.com&lt;/b&gt; nebo telefonní číslo z kompletní adresy uživatele. Pokud se neuvede celá adresa, Twinkle doplni adresu hodnotou &quot;Domain&quot; z nastaveni uživatele v uživatelského profilu.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adresář</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Výběr adresy z adresáře.</translation>
+ </message>
+ <message>
+ <source>&amp;User profile:</source>
+ <translation>&amp;Uživatelský profil:</translation>
+ </message>
+ <message>
+ <source>Conversation</source>
+ <translation>Konverzace</translation>
+ </message>
+ <message>
+ <source>Type your message here and then press &quot;send&quot; to send it.</source>
+ <translation>Sem napsat zprávu a poté pro odeslání stisknout &quot;Odeslat&quot;. </translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation>&amp;Odeslat</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Send the message.</source>
+ <translation>Odeslat zprávu.</translation>
+ </message>
+ <message>
+ <source>Delivery failure</source>
+ <translation>Doručení selhalo</translation>
+ </message>
+ <message>
+ <source>Delivery notification</source>
+ <translation>Potvrzení o doručení</translation>
+ </message>
+ <message>
+ <source>Instant message toolbar</source>
+ <translation>Lišta s instantními zprávami</translation>
+ </message>
+ <message>
+ <source>Send file...</source>
+ <translation>Odeslat soubor...</translation>
+ </message>
+ <message>
+ <source>Send file</source>
+ <translation>Odeslat soubor</translation>
+ </message>
+ <message>
+ <source>image size is scaled down in preview</source>
+ <translation>obrázek je v náhledu zmenšen</translation>
+ </message>
+ <message>
+ <source>Open with %1...</source>
+ <translation>Otevřít s %1...</translation>
+ </message>
+ <message>
+ <source>Open with...</source>
+ <translation>Otevřít s...</translation>
+ </message>
+ <message>
+ <source>Save attachment as...</source>
+ <translation>Uložit přílohu jako...</translation>
+ </message>
+ <message>
+ <source>File already exists. Do you want to overwrite this file?</source>
+ <translation>Soubor již existuje. Chcete přepsat tento soubor?</translation>
+ </message>
+ <message>
+ <source>Failed to save attachment.</source>
+ <translation>Selhalo uložení přílohy.</translation>
+ </message>
+ <message>
+ <source>%1 is typing a message.</source>
+ <translation>%1 píše zprávu.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished">F10</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MessageFormView</name>
+ <message>
+ <source>sending message</source>
+ <translation>odesílání zprávy</translation>
+ </message>
+</context>
+<context>
+ <name>MphoneForm</name>
+ <message>
+ <source>Twinkle</source>
+ <translation>Twinkle</translation>
+ </message>
+ <message>
+ <source>&amp;Call:</source>
+ <comment>Label in front of combobox to enter address</comment>
+ <translation>&amp;Volané číslo:</translation>
+ </message>
+ <message>
+ <source>The address that you want to call. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Adresa protistrany, kterou chcete volat. Může to být kompletní SIP adresa ve formě &lt;b&gt;sip:example@example.com&lt;/b&gt; nebo také telefonní číslo, popř. uživatelské část SIP adresy. Pokud není zadána celá adresa, twinkle doplní chybějící část doménovým jménem aktivního uživatelského profilu.</translation>
+ </message>
+ <message>
+ <source>The user that will make the call.</source>
+ <translation>Uživatel, který zahájí volání.</translation>
+ </message>
+ <message>
+ <source>&amp;User:</source>
+ <translation>&amp;Profil:</translation>
+ </message>
+ <message>
+ <source>Dial</source>
+ <translation>Volat</translation>
+ </message>
+ <message>
+ <source>Dial the address.</source>
+ <translation>Volat adresu.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adresář</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Vybrat volané číslo nebo SIP adresu z adresáře.</translation>
+ </message>
+ <message>
+ <source>Auto answer indication.</source>
+ <translation>Zobrazení a nastavení služby &quot;Automatické přijmutí hovoru&quot;.</translation>
+ </message>
+ <message>
+ <source>Call redirect indication.</source>
+ <translation>Zobrazení a nastavení služby &quot;Přesměrování hovoru&quot;.</translation>
+ </message>
+ <message>
+ <source>Do not disturb indication.</source>
+ <translation>Zobrazení a nastavení služby &quot;Nerušit&quot;.</translation>
+ </message>
+ <message>
+ <source>Missed call indication.</source>
+ <translation>Zobrazení &quot;Volání v nepřítomnosti&quot; a otevření seznamu volání.</translation>
+ </message>
+ <message>
+ <source>Registration status.</source>
+ <translation>Zobrazení stavu přihlášení.</translation>
+ </message>
+ <message>
+ <source>Display</source>
+ <translation>Stavové hlášky</translation>
+ </message>
+ <message>
+ <source>Line status</source>
+ <translation>Stav linky</translation>
+ </message>
+ <message>
+ <source>Line &amp;1:</source>
+ <translation>Linka &amp;1:</translation>
+ </message>
+ <message>
+ <source>Alt+1</source>
+ <translation>Alt+1</translation>
+ </message>
+ <message>
+ <source>Click to switch to line 1.</source>
+ <translation>Zde klikněte pro přepnutí na linku 1.</translation>
+ </message>
+ <message>
+ <source>From:</source>
+ <translation>Od:</translation>
+ </message>
+ <message>
+ <source>To:</source>
+ <translation>Komu:</translation>
+ </message>
+ <message>
+ <source>Subject:</source>
+ <translation>Předmět:</translation>
+ </message>
+ <message>
+ <source>Visual indication of line state.</source>
+ <translation>Optické zobrazení stavu linky.</translation>
+ </message>
+ <message>
+ <source>idle</source>
+ <comment>No need to translate</comment>
+ <translation>idle</translation>
+ </message>
+ <message>
+ <source>Call is on hold</source>
+ <translation>Hovor je podržen</translation>
+ </message>
+ <message>
+ <source>Voice is muted</source>
+ <translation>Hovor je ztišen</translation>
+ </message>
+ <message>
+ <source>Conference call</source>
+ <translation>Konferenční hovor</translation>
+ </message>
+ <message>
+ <source>Transferring call</source>
+ <translation>Hovor bude přesměrován</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+The padlock indicates that your voice is encrypted during transport over the network.
+&lt;/p&gt;
+&lt;h3&gt;SAS - Short Authentication String&lt;/h3&gt;
+&lt;p&gt;
+Both ends of an encrypted voice channel receive the same SAS on the first call. If the SAS is different at each end, your voice channel may be compromised by a man-in-the-middle attack (MitM).
+&lt;/p&gt;
+&lt;p&gt;
+If the SAS is equal at both ends, then you should confirm it by clicking this padlock for stronger security of future calls to the same destination. For subsequent calls to the same destination, you don&apos;t have to confirm the SAS again. The padlock will show a check symbol when the SAS has been confirmed.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;
+Symbol zámečku se zobrazí pokud je volání přenášeno pomocí šifrování a není možné ho odposlouchávat.
+&lt;/p&gt;
+&lt;h3&gt;SAS - Short Authentication String&lt;/h3&gt;
+&lt;p&gt;
+Oběma účastníkům zašifrovaného hovoru bude při prvním kontaktu doručena tzv. SAS značka. Porovnáním této značky při každém dalším volání s toutéž protistranou lze zjistit, v případě že by se kód změnil, že dochází k odposlouchávání hovoru. Šlo by o tzv. &quot;man-in-the-middle attack&quot;.
+&lt;/p&gt;
+&lt;p&gt;
+Pokud je SAS shodný na obou stranách, klikněte na ikonku zámečku. Lze se o tom přesvědčit dotazem na tuto značku u volaného. Při každém dalším volání na takto označený kontakt bude jeho identita automaticky ověřena a výsledek bude zobrazen ve formě zatržítka na symbolu zámečku.
+&lt;/p&gt;
+&lt;p&gt;Opětovným kliknutím na ikonku zámečku se zatržítkem dojde ke smazání ověřovací značky SAS a k její nové aktivaci je nutné provést její nové vygenerování.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>sas</source>
+ <comment>No need to translate</comment>
+ <translation>sas</translation>
+ </message>
+ <message>
+ <source>Short authentication string</source>
+ <translation>SAS - značka (Short authentication string)</translation>
+ </message>
+ <message>
+ <source>g711a/g711a</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Audio codec</source>
+ <translation>Audio kodek</translation>
+ </message>
+ <message>
+ <source>0:00:00</source>
+ <translation>0:00:00</translation>
+ </message>
+ <message>
+ <source>Call duration</source>
+ <translation>Doba trvání hovoru</translation>
+ </message>
+ <message>
+ <source>sip:from</source>
+ <comment>No need to translate</comment>
+ <translation>sip:od</translation>
+ </message>
+ <message>
+ <source>sip:to</source>
+ <comment>No need to translate</comment>
+ <translation>sip:komu</translation>
+ </message>
+ <message>
+ <source>subject</source>
+ <comment>No need to translate</comment>
+ <translation>předmět</translation>
+ </message>
+ <message>
+ <source>photo</source>
+ <comment>No need to translate</comment>
+ <translation>foto</translation>
+ </message>
+ <message>
+ <source>Line &amp;2:</source>
+ <translation>Linka &amp;2:
+</translation>
+ </message>
+ <message>
+ <source>Alt+2</source>
+ <translation>Alt+2</translation>
+ </message>
+ <message>
+ <source>Click to switch to line 2.</source>
+ <translation>Naklikněte k přepojení na linku 2 (nebo Alt+2).</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;Soubor</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Upravit</translation>
+ </message>
+ <message>
+ <source>C&amp;all</source>
+ <translation>&amp;Hovor</translation>
+ </message>
+ <message>
+ <source>Activate line</source>
+ <translation>Vybrat linku</translation>
+ </message>
+ <message>
+ <source>&amp;Registration</source>
+ <translation>&amp;Přihlášení</translation>
+ </message>
+ <message>
+ <source>&amp;Services</source>
+ <translation>&amp;Služby</translation>
+ </message>
+ <message>
+ <source>&amp;View</source>
+ <translation>&amp;Zobrazit</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Nápověda</translation>
+ </message>
+ <message>
+ <source>Call Toolbar</source>
+ <translation>Lišta volání</translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation>Ukončit</translation>
+ </message>
+ <message>
+ <source>&amp;Quit</source>
+ <translation>&amp;Ukončit</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <source>About Twinkle</source>
+ <translation>O programu Twinkle</translation>
+ </message>
+ <message>
+ <source>&amp;About Twinkle</source>
+ <translation>O &amp;programu Twinkle</translation>
+ </message>
+ <message>
+ <source>Call someone</source>
+ <translation>Volat - rozšířené zadávání čísel</translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation>F5</translation>
+ </message>
+ <message>
+ <source>Answer incoming call</source>
+ <translation>Přijmout příchozí hovor</translation>
+ </message>
+ <message>
+ <source>F6</source>
+ <translation>F6</translation>
+ </message>
+ <message>
+ <source>Release call</source>
+ <translation>Ukončit hovor</translation>
+ </message>
+ <message>
+ <source>Reject incoming call</source>
+ <translation>Odmítnout příchozí hovor</translation>
+ </message>
+ <message>
+ <source>F8</source>
+ <translation>F8</translation>
+ </message>
+ <message>
+ <source>Put a call on hold, or retrieve a held call</source>
+ <translation>Podržet hovor nebo pokračovat v podrženém hovoru</translation>
+ </message>
+ <message>
+ <source>Redirect incoming call without answering</source>
+ <translation>Přesměrovat příchozí hovor bez přijmutí hovoru</translation>
+ </message>
+ <message>
+ <source>Open keypad to enter digits for voice menu&apos;s</source>
+ <translation>Otevřít numerickou klávesnici pro zadávání tónových příkazů (např. ovládání telefonních záznamníků)</translation>
+ </message>
+ <message>
+ <source>Register</source>
+ <translation>Přihlásit se</translation>
+ </message>
+ <message>
+ <source>&amp;Register</source>
+ <translation>&amp;Přihlásit se</translation>
+ </message>
+ <message>
+ <source>Deregister</source>
+ <translation>Odhlásit se</translation>
+ </message>
+ <message>
+ <source>&amp;Deregister</source>
+ <translation>&amp;Odhlásit se</translation>
+ </message>
+ <message>
+ <source>Deregister this device</source>
+ <translation>Odhlásit tento telefon</translation>
+ </message>
+ <message>
+ <source>Show registrations</source>
+ <translation>Zobrazit přihlášení</translation>
+ </message>
+ <message>
+ <source>&amp;Show registrations</source>
+ <translation>&amp;Zobrazit přihlášení</translation>
+ </message>
+ <message>
+ <source>Terminal capabilities</source>
+ <translation>Parametry protistrany</translation>
+ </message>
+ <message>
+ <source>Request terminal capabilities from someone</source>
+ <translation>Dotaz na parametry protistrany</translation>
+ </message>
+ <message>
+ <source>Do not disturb</source>
+ <translation>Prosím nerušit</translation>
+ </message>
+ <message>
+ <source>&amp;Do not disturb</source>
+ <translation>&amp;Prosím nerušit</translation>
+ </message>
+ <message>
+ <source>Call redirection</source>
+ <translation>Přesměrování hovoru</translation>
+ </message>
+ <message>
+ <source>Call &amp;redirection...</source>
+ <translation>&amp;Přesměrování hovoru...</translation>
+ </message>
+ <message>
+ <source>Repeat last call</source>
+ <translation>Opakované vytáčení</translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation>F12</translation>
+ </message>
+ <message>
+ <source>About Qt</source>
+ <translation>O prostředí Qt</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation>O prostředí &amp;Qt</translation>
+ </message>
+ <message>
+ <source>User profile</source>
+ <translation>Uživatelský profil</translation>
+ </message>
+ <message>
+ <source>&amp;User profile...</source>
+ <translation>&amp;Uživatelský profil...</translation>
+ </message>
+ <message>
+ <source>Join two calls in a 3-way conference</source>
+ <translation>Připojit se ke konferenčnímu hovoru 2 uživatelů</translation>
+ </message>
+ <message>
+ <source>Mute a call</source>
+ <translation>Vypnout/zapnout mikrofon</translation>
+ </message>
+ <message>
+ <source>Transfer call</source>
+ <translation>Přesměrování hovoru</translation>
+ </message>
+ <message>
+ <source>System settings</source>
+ <translation>Systémová nastavení</translation>
+ </message>
+ <message>
+ <source>&amp;System settings...</source>
+ <translation>&amp;Systémová nastavení...</translation>
+ </message>
+ <message>
+ <source>Deregister all</source>
+ <translation>Odhlásit se od všech účtů</translation>
+ </message>
+ <message>
+ <source>Deregister &amp;all</source>
+ <translation>&amp;Odhlásit se od všech účtů</translation>
+ </message>
+ <message>
+ <source>Deregister all your registered devices</source>
+ <translation>Odhlásit všechny zařízení pod tímto uživatelským profilem</translation>
+ </message>
+ <message>
+ <source>Auto answer</source>
+ <translation>Automaticky přijmout volání</translation>
+ </message>
+ <message>
+ <source>&amp;Auto answer</source>
+ <translation>&amp;Automaticky přijmout volání</translation>
+ </message>
+ <message>
+ <source>Log</source>
+ <translation>Protokol</translation>
+ </message>
+ <message>
+ <source>&amp;Log...</source>
+ <translation>&amp;Protokol...</translation>
+ </message>
+ <message>
+ <source>Call history</source>
+ <translation>Seznam všech volání</translation>
+ </message>
+ <message>
+ <source>Call &amp;history...</source>
+ <translation>&amp;Seznam všech volání...</translation>
+ </message>
+ <message>
+ <source>F9</source>
+ <translation>F9</translation>
+ </message>
+ <message>
+ <source>Change user ...</source>
+ <translation>Změnit uživatelský profil ...</translation>
+ </message>
+ <message>
+ <source>&amp;Change user ...</source>
+ <translation>&amp;Změnit uživatelský profil ...</translation>
+ </message>
+ <message>
+ <source>Activate or de-activate users</source>
+ <translation>Aktivovat/deaktivovat uživatelský profil</translation>
+ </message>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation>Co je toto?</translation>
+ </message>
+ <message>
+ <source>What&apos;s &amp;This?</source>
+ <translation>Co je &amp;toto?</translation>
+ </message>
+ <message>
+ <source>Shift+F1</source>
+ <translation>Shift+F1</translation>
+ </message>
+ <message>
+ <source>Line 1</source>
+ <translation>Linka 1</translation>
+ </message>
+ <message>
+ <source>Line 2</source>
+ <translation>Linka 2
+</translation>
+ </message>
+ <message>
+ <source>idle</source>
+ <translation>volná</translation>
+ </message>
+ <message>
+ <source>dialing</source>
+ <translation>vytáčení</translation>
+ </message>
+ <message>
+ <source>attempting call, please wait</source>
+ <translation>pokus o navázání spojení, prosím čekejte</translation>
+ </message>
+ <message>
+ <source>incoming call</source>
+ <translation>Příchozí volání</translation>
+ </message>
+ <message>
+ <source>establishing call, please wait</source>
+ <translation>Pokus o spojení, prosím čekejte</translation>
+ </message>
+ <message>
+ <source>established</source>
+ <translation>Spojení navázáno</translation>
+ </message>
+ <message>
+ <source>established (waiting for media)</source>
+ <translation>Spojení navázáno (čeká se na data)</translation>
+ </message>
+ <message>
+ <source>releasing call, please wait</source>
+ <translation>Odpojení spojení, prosím čekejte</translation>
+ </message>
+ <message>
+ <source>unknown state</source>
+ <translation>neznámý stav</translation>
+ </message>
+ <message>
+ <source>Voice is encrypted</source>
+ <translation>Přenos hovoru je zašifrován</translation>
+ </message>
+ <message>
+ <source>Click to confirm SAS.</source>
+ <translation>Potvrdit značku SAS.</translation>
+ </message>
+ <message>
+ <source>Click to clear SAS verification.</source>
+ <translation>Smazat SAS potvrzení.</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Uživatel:</translation>
+ </message>
+ <message>
+ <source>Call:</source>
+ <translation>Hovor:</translation>
+ </message>
+ <message>
+ <source>Registration status:</source>
+ <translation>Stav VOIP registrace:</translation>
+ </message>
+ <message>
+ <source>Registered</source>
+ <translation>Registrováno</translation>
+ </message>
+ <message>
+ <source>Failed</source>
+ <translation>Nezdařilo se</translation>
+ </message>
+ <message>
+ <source>Not registered</source>
+ <translation>Neregistrován</translation>
+ </message>
+ <message>
+ <source>No users are registered.</source>
+ <translation>Nepřihlášen žádný uživatel.</translation>
+ </message>
+ <message>
+ <source>Do not disturb active for:</source>
+ <translation>&quot;Nerušit&quot; aktivováno pro:</translation>
+ </message>
+ <message>
+ <source>Redirection active for:</source>
+ <translation>Přsměrování aktivováno pro:</translation>
+ </message>
+ <message>
+ <source>Auto answer active for:</source>
+ <translation>&quot;Automaticky přijmout&quot; aktivováno pro:</translation>
+ </message>
+ <message>
+ <source>Do not disturb is not active.</source>
+ <translation>&quot;Nerušit&quot; není aktivní.</translation>
+ </message>
+ <message>
+ <source>Redirection is not active.</source>
+ <translation>Přesměrování volání není aktivováno.</translation>
+ </message>
+ <message>
+ <source>Auto answer is not active.</source>
+ <translation>&quot;Automaticky přijmout&quot; není aktivováno.</translation>
+ </message>
+ <message>
+ <source>You have no missed calls.</source>
+ <translation>Žádná volání v nepřítomnosti.</translation>
+ </message>
+ <message>
+ <source>You missed 1 call.</source>
+ <translation>1 zmeškané volání v nepřítomnosti.</translation>
+ </message>
+ <message>
+ <source>You missed %1 calls.</source>
+ <translation>%1 volání v nepřítomnosti.</translation>
+ </message>
+ <message>
+ <source>Click to see call history for details.</source>
+ <translation>Kliknutím se otevře detailní záznam hovorů.</translation>
+ </message>
+ <message>
+ <source>Starting user profiles...</source>
+ <translation>Otevřít uživatelský profil...</translation>
+ </message>
+ <message>
+ <source>The following profiles are both for user %1</source>
+ <translation>Následující uživatelské profily používají stejnou SIP adresu %1</translation>
+ </message>
+ <message>
+ <source>You can only run multiple profiles for different users.</source>
+ <translation>Na jeden SIP účet je možné aktivovat pouze jeden uživatelský profil.</translation>
+ </message>
+ <message>
+ <source>You have changed the SIP UDP port. This setting will only become active when you restart Twinkle.</source>
+ <translation>Byl změněn SIP UDP port. Toto nastavení bude aktivní až při příštím spuštění programu Twinkle.</translation>
+ </message>
+ <message>
+ <source>Esc</source>
+ <translation>Esc</translation>
+ </message>
+ <message>
+ <source>Transfer consultation</source>
+ <translation>Zpětný dotaz</translation>
+ </message>
+ <message>
+ <source>Hide identity</source>
+ <translation>Skrýt identitu</translation>
+ </message>
+ <message>
+ <source>Click to show registrations.</source>
+ <translation>Kliknutím se zobrazí VOIP registrace.</translation>
+ </message>
+ <message>
+ <source>%1 new, 1 old message</source>
+ <translation>%1 nová, 1 stará zpráva</translation>
+ </message>
+ <message>
+ <source>%1 new, %2 old messages</source>
+ <translation>%1 nové, %2 staré zprávy</translation>
+ </message>
+ <message>
+ <source>1 new message</source>
+ <translation>1 nová zpráva</translation>
+ </message>
+ <message>
+ <source>%1 new messages</source>
+ <translation>%1 nových zpráv</translation>
+ </message>
+ <message>
+ <source>1 old message</source>
+ <translation>1 stará zpráva</translation>
+ </message>
+ <message>
+ <source>%1 old messages</source>
+ <translation>%1 starých zpráv</translation>
+ </message>
+ <message>
+ <source>Messages waiting</source>
+ <translation>Přijatých zpráv</translation>
+ </message>
+ <message>
+ <source>No messages</source>
+ <translation>Žádné zprávy</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Voice mail status:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Stav hlasové schránky:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Failure</source>
+ <translation>Chyba</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>Neznámý</translation>
+ </message>
+ <message>
+ <source>Click to access voice mail.</source>
+ <translation>Kliknutím se vstoupí do hlasové schránky.</translation>
+ </message>
+ <message>
+ <source>Click to activate/deactivate</source>
+ <translation>Kliknutím aktivovat / deaktivovat</translation>
+ </message>
+ <message>
+ <source>Click to activate</source>
+ <translation>Kliknutím aktivovat</translation>
+ </message>
+ <message>
+ <source>not provisioned</source>
+ <translation>nezanesený</translation>
+ </message>
+ <message>
+ <source>You must provision your voice mail address in your user profile, before you can access it.</source>
+ <translation>Předtím než může být hlasová schránka používána, je nutné ji nastavit ve vašem uživatelském profilu.</translation>
+ </message>
+ <message>
+ <source>The line is busy. Cannot access voice mail.</source>
+ <translation>Hlasovou schránku nelze otevřít - linka je obsazená.</translation>
+ </message>
+ <message>
+ <source>The voice mail address %1 is an invalid address. Please provision a valid address in your user profile.</source>
+ <translation>Adresa hlasové schránky &quot;%1&quot; je neplatná. Zkontrolujte nastavení ve vašem uživatelském profilu.</translation>
+ </message>
+ <message>
+ <source>Call</source>
+ <comment>toolbar text</comment>
+ <translation>Volat</translation>
+ </message>
+ <message>
+ <source>&amp;Call...</source>
+ <comment>call menu text</comment>
+ <translation>Volat (&amp;Call)...</translation>
+ </message>
+ <message>
+ <source>Answer</source>
+ <comment>toolbar text</comment>
+ <translation>Odpovědět</translation>
+ </message>
+ <message>
+ <source>&amp;Answer</source>
+ <comment>menu text</comment>
+ <translation>&amp;Odpovědět</translation>
+ </message>
+ <message>
+ <source>Bye</source>
+ <comment>toolbar text</comment>
+ <translation>Zavěsit</translation>
+ </message>
+ <message>
+ <source>&amp;Bye</source>
+ <comment>menu text</comment>
+ <translation>Zavěsit (&amp;Bye)</translation>
+ </message>
+ <message>
+ <source>Reject</source>
+ <comment>toolbar text</comment>
+ <translation>Odmítnout</translation>
+ </message>
+ <message>
+ <source>&amp;Reject</source>
+ <comment>menu text</comment>
+ <translation>&amp;Odmítnout</translation>
+ </message>
+ <message>
+ <source>Hold</source>
+ <comment>toolbar text</comment>
+ <translation>Podržet</translation>
+ </message>
+ <message>
+ <source>&amp;Hold</source>
+ <comment>menu text</comment>
+ <translation>&amp;Podržet</translation>
+ </message>
+ <message>
+ <source>Redirect</source>
+ <comment>toolbar text</comment>
+ <translation>Přesměrovat</translation>
+ </message>
+ <message>
+ <source>R&amp;edirect...</source>
+ <comment>menu text</comment>
+ <translation>&amp;Přesměrovat...</translation>
+ </message>
+ <message>
+ <source>Dtmf</source>
+ <comment>toolbar text</comment>
+ <translation>DTMF</translation>
+ </message>
+ <message>
+ <source>&amp;Dtmf...</source>
+ <comment>menu text</comment>
+ <translation>&amp;DTMF...</translation>
+ </message>
+ <message>
+ <source>&amp;Terminal capabilities...</source>
+ <comment>menu text</comment>
+ <translation>&amp;Parametry protistrany...</translation>
+ </message>
+ <message>
+ <source>Redial</source>
+ <comment>toolbar text</comment>
+ <translation>Opakovat</translation>
+ </message>
+ <message>
+ <source>&amp;Redial</source>
+ <comment>menu text</comment>
+ <translation>&amp;Opakovat</translation>
+ </message>
+ <message>
+ <source>Conf</source>
+ <comment>toolbar text</comment>
+ <translation>Konference</translation>
+ </message>
+ <message>
+ <source>&amp;Conference</source>
+ <comment>menu text</comment>
+ <translation>&amp;Konference</translation>
+ </message>
+ <message>
+ <source>Mute</source>
+ <comment>toolbar text</comment>
+ <translation>Ztišit</translation>
+ </message>
+ <message>
+ <source>&amp;Mute</source>
+ <comment>menu text</comment>
+ <translation>&amp;Ztišit</translation>
+ </message>
+ <message>
+ <source>Xfer</source>
+ <comment>toolbar text</comment>
+ <translation>Zprostředkovat</translation>
+ </message>
+ <message>
+ <source>Trans&amp;fer...</source>
+ <comment>menu text</comment>
+ <translation>&amp;Zprostředkovat...</translation>
+ </message>
+ <message>
+ <source>Message waiting indication.</source>
+ <translation>Zobrazení čekání na zprávu.</translation>
+ </message>
+ <message>
+ <source>Voice mail</source>
+ <translation>Hlasový záznamník</translation>
+ </message>
+ <message>
+ <source>&amp;Voice mail</source>
+ <translation>&amp;Hlasový záznamník</translation>
+ </message>
+ <message>
+ <source>Access voice mail</source>
+ <translation>Přístup na zvukový záznamník</translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Buddy list</source>
+ <translation>Buddy seznam</translation>
+ </message>
+ <message>
+ <source>&amp;Message</source>
+ <translation>&amp;Zpráva</translation>
+ </message>
+ <message>
+ <source>Msg</source>
+ <translation>Msg</translation>
+ </message>
+ <message>
+ <source>Instant &amp;message...</source>
+ <translation>Instantní &amp;zpráva...</translation>
+ </message>
+ <message>
+ <source>Instant message</source>
+ <translation>Instantní zpráva</translation>
+ </message>
+ <message>
+ <source>&amp;Call...</source>
+ <translation>Volat (&amp;Call)...</translation>
+ </message>
+ <message>
+ <source>&amp;Edit...</source>
+ <translation>&amp;Upravit...</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Smazat</translation>
+ </message>
+ <message>
+ <source>O&amp;ffline</source>
+ <translation>O&amp;ffline</translation>
+ </message>
+ <message>
+ <source>&amp;Online</source>
+ <translation>&amp;Online</translation>
+ </message>
+ <message>
+ <source>&amp;Change availability</source>
+ <translation>&amp;Změnit dostupnost</translation>
+ </message>
+ <message>
+ <source>&amp;Add buddy...</source>
+ <translation>&amp;Přidat buddy...</translation>
+ </message>
+ <message>
+ <source>Failed to save buddy list: %1</source>
+ <translation>Selhalo uložení seznamu s buddy: %1</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Je možné vytvořit oddělený buddy seznam pro každý uživatelský profil. Dostupnost vaších buddy a dostupnost vlastní lze zjistit a využívat jen pokud VoIP poskytovatel provozuje prezenční server.</translation>
+ </message>
+ <message>
+ <source>&amp;Buddy list</source>
+ <translation>&amp;Buddy seznam</translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation>&amp;Stavové hlášky</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished">F10</translation>
+ </message>
+ <message>
+ <source>Diamondcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sign up</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Sign up...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recharge...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Balance history...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call history...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Admin center...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recharge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Balance history</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Admin center</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>NumberConversionForm</name>
+ <message>
+ <source>Twinkle - Number conversion</source>
+ <translation>Twinkle - konverze tel. čísla</translation>
+ </message>
+ <message>
+ <source>&amp;Match expression:</source>
+ <translation>&amp;Hledaný výraz:</translation>
+ </message>
+ <message>
+ <source>&amp;Replace:</source>
+ <translation>&amp;Nahradit:</translation>
+ </message>
+ <message>
+ <source>Perl style format string for the replacement number.</source>
+ <translation>Perl formát řetězce pro nahrazované tel. číslo.</translation>
+ </message>
+ <message>
+ <source>Perl style regular expression matching the number format you want to modify.</source>
+ <translation>Regulární výraz (Perl regex) pro nahrazované tel. číslo. </translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Zrušit (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>Match expression may not be empty.</source>
+ <translation>Hledaný výraz nesmí být prázdný.</translation>
+ </message>
+ <message>
+ <source>Replace value may not be empty.</source>
+ <translation>Nahrazovaná hodnota nesmí být prázdná.</translation>
+ </message>
+ <message>
+ <source>Invalid regular expression.</source>
+ <translation>Neplatný regulární výraz.</translation>
+ </message>
+</context>
+<context>
+ <name>RedirectForm</name>
+ <message>
+ <source>Twinkle - Redirect</source>
+ <translation>Twinkle - Přesměrování volání</translation>
+ </message>
+ <message>
+ <source>Redirect incoming call to</source>
+ <translation>Příchozí hovor přeměrovat na</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Pro přesměrování volání lze zadat max. 3 čísla. Pokud nebude hovor přijat prvním cílem, dojde k pokusu o přesměrování na druhý cíl atd.</translation>
+ </message>
+ <message>
+ <source>&amp;3rd choice destination:</source>
+ <translation>&amp;3. Cíl:</translation>
+ </message>
+ <message>
+ <source>&amp;2nd choice destination:</source>
+ <translation>&amp;2. Cíl:</translation>
+ </message>
+ <message>
+ <source>&amp;1st choice destination:</source>
+ <translation>&amp;1. Cíl:</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adresář</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Vybrat tel. číslo / SIP adresu z adresáře.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Zrušit (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished">F10</translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation type="unfinished">F12</translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation type="unfinished">F11</translation>
+ </message>
+</context>
+<context>
+ <name>SelectNicForm</name>
+ <message>
+ <source>Twinkle - Select NIC</source>
+ <translation>Twinkle - výběr síťového připojení</translation>
+ </message>
+ <message>
+ <source>Select the network interface/IP address that you want to use:</source>
+ <translation>Vyberte síťové rozhraní / IP adresu, kterou chcete použít:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Na vašem počítači je k dispozici více IP adres. Vyberte tu, pod kterou je váš počítač dostupný z internetu nebo pokud jste připojení na router vaši IP adresu v lokální síti. Tuto adresu bude Twinkle používat uvnitř datových SIP paketů jako adresu odesilatele.</translation>
+ </message>
+ <message>
+ <source>Set as default &amp;IP</source>
+ <translation>&amp;Nastavit jako standardní IP adresu</translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation>Alt+I</translation>
+ </message>
+ <message>
+ <source>Make the selected IP address the default IP address. The next time you start Twinkle, this IP address will be automatically selected.</source>
+ <translation>Nastavit vybranou IP Adresu jako standardní. Při přístím startu Twinkle bude zvolena automaticky tato adresa.</translation>
+ </message>
+ <message>
+ <source>Set as default &amp;NIC</source>
+ <translation>Nastavit jako &amp;standardní připojení</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation>Alt+N</translation>
+ </message>
+ <message>
+ <source>Make the selected network interface the default interface. The next time you start Twinkle, this interface will be automatically selected.</source>
+ <translation>Nastavit vybrané síťové rozhraní jako standardní. Při příštím startu Twinkle bude toto rozhraní automaticky zvoleno.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>If you want to remove or change the default at a later time, you can do that via the system settings.</source>
+ <translation>Standardní nastavení je možné změnit kdykoliv později v konfiguraci systému.</translation>
+ </message>
+</context>
+<context>
+ <name>SelectProfileForm</name>
+ <message>
+ <source>Twinkle - Select user profile</source>
+ <translation>Twinkle - výběr uživatelského profilu</translation>
+ </message>
+ <message>
+ <source>Select user profile(s) to run:</source>
+ <translation>Výběr uživatelského profilu (popř. profilů), které mají být aktivovány:</translation>
+ </message>
+ <message>
+ <source>User profile</source>
+ <translation>Uživatelský profil</translation>
+ </message>
+ <message>
+ <source>Tick the check boxes of the user profiles that you want to run and press run.</source>
+ <translation>Označte uživatelský profil, se kterým by měl Twinkle pracovat a stiskněte potom &quot;Použít&quot;.</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;nový</translation>
+ </message>
+ <message>
+ <source>Create a new profile with the profile editor.</source>
+ <translation>Pomocí editoru profilu založit nový uživatelský profil.</translation>
+ </message>
+ <message>
+ <source>&amp;Wizard</source>
+ <translation>&amp;Wizard</translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Create a new profile with the wizard.</source>
+ <translation>Pomocí wizardu založit nový uživatelský profil.</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>U&amp;pravit</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Edit the highlighted profile.</source>
+ <translation>Upravit vybraný uživatelský profil.</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Smazat</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation>Alt+L</translation>
+ </message>
+ <message>
+ <source>Delete the highlighted profile.</source>
+ <translation>Smazat vybraný uživatelský profil.</translation>
+ </message>
+ <message>
+ <source>Ren&amp;ame</source>
+ <translation>&amp;Přejmenovat</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>Rename the highlighted profile.</source>
+ <translation>Das ausgewählte Benutzerprofil umbenennen.</translation>
+ </message>
+ <message>
+ <source>&amp;Set as default</source>
+ <translation>Nastavit jako &amp;výchozí</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Make the selected profiles the default profiles. The next time you start Twinkle, these profiles will be automatically run.</source>
+ <translation>Použít vybrané profily jako standardní. Twinkle je použije automaticky při příštím startu.</translation>
+ </message>
+ <message>
+ <source>&amp;Run</source>
+ <translation>&amp;Spustit</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Run Twinkle with the selected profiles.</source>
+ <translation>Spustit twinkle s označenými uživatelskými profily.</translation>
+ </message>
+ <message>
+ <source>S&amp;ystem settings</source>
+ <translation>S&amp;ystémová nastavení</translation>
+ </message>
+ <message>
+ <source>Alt+Y</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Edit the system settings.</source>
+ <translation>Upravit systémová nastavení.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Zrušit (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;Before you can use Twinkle, you must create a user profile.&lt;br&gt;Click OK to create a profile.&lt;/html&gt;</source>
+ <translation>&lt;html&gt;Předtím než můžete Twinkle začít používat, musíte založit aspoň jeden uživatelský profil.&lt;br&gt;Klikněte OK pro založení nového profilu.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;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.&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;Choose what method you wish to use.&lt;/html&gt;</source>
+ <translation type="obsolete">&lt;html&gt;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.&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;Nápovědu získáte kdekoliv v Twinkle stiskem klávesové ombinace &quot;Shift + F1&quot;, přes kontextovou nápovědu pomocí stisku pravého tlačítka na myši nebo stiskem na symbol &quot;?&quot; v pravém horním rohu okna.&lt;br&gt;&lt;br&gt;Vyberte si jakým způsobem má být uživatelský profil založen.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;Next you may adjust the system settings. You can change these settings always at a later time.&lt;br&gt;&lt;br&gt;Click OK to view and adjust the system settings.&lt;/html&gt;</source>
+ <translation>&lt;html&gt;V dalším kroku byste si měli překontrolovat a popřípadě upravit systémová nastavení. Obzvláště potom, zda-li v oblasti Audio je v pořádku nastavení mikrofonu a reproduktorů.&lt;br&gt;&lt;br&gt;Klikněte na OK pro přístup k systémovým nastavením. Systémová nastavení můžete upravit i kdykoliv později.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>You did not select any user profile to run.
+Please select a profile.</source>
+ <translation>Nevybrali jste k použití žádný uživatelský profil. Vyberte prosím aspoň jeden profil.</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete profile &apos;%1&apos;?</source>
+ <translation>Opravdu smazat uživatelský profil %1 ?</translation>
+ </message>
+ <message>
+ <source>Delete profile</source>
+ <translation>Smazat uživatelský profil</translation>
+ </message>
+ <message>
+ <source>Failed to delete profile.</source>
+ <translation>Chyba při mazání uživatelského profilu.</translation>
+ </message>
+ <message>
+ <source>Failed to rename profile.</source>
+ <translation>Chyba při přejmenování uživatelského profilu.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;If you want to remove or change the default at a later time, you can do that via the system settings.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Standardní nastavení je možné kdykoliv smazat nebo změnit v systémovém nastavení. &lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Cannot find .twinkle directory in your home directory.</source>
+ <translation>Nelze nalézt skrytý adresář &quot;.twinkle&quot; ve vašem domovském adresáři (&quot;/home/vasejmeno/&quot;) .</translation>
+ </message>
+ <message>
+ <source>&amp;Profile editor</source>
+ <translation>&amp;Editor profilu</translation>
+ </message>
+ <message>
+ <source>Create profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ed&amp;itor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dia&amp;mondcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modify profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Startup profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Diamondcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;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.&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;You can create a Diamondcard account to make worldwide calls to regular and cell phones and send SMS messages.&lt;br&gt;&lt;br&gt;Choose what method you wish to use.&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SelectUserForm</name>
+ <message>
+ <source>Twinkle - Select user</source>
+ <translation>Twinkle - Výběr uživatelského profilu</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Zrušit (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>&amp;Select all</source>
+ <translation>Vybrat &amp;vše</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>C&amp;lear all</source>
+ <translation>Vybrat &amp;vše</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+L</translation>
+ </message>
+ <message>
+ <source>purpose</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation>Uživatel</translation>
+ </message>
+ <message>
+ <source>Register</source>
+ <translation>Přihlásit se</translation>
+ </message>
+ <message>
+ <source>Select users that you want to register.</source>
+ <translation>Vybrat uživatelský profil k přihlášení.</translation>
+ </message>
+ <message>
+ <source>Deregister</source>
+ <translation>Odhlásit</translation>
+ </message>
+ <message>
+ <source>Select users that you want to deregister.</source>
+ <translation>Vybrat uživatelský profil k odhlášení.</translation>
+ </message>
+ <message>
+ <source>Deregister all devices</source>
+ <translation>Odhlásit všechny zařízení</translation>
+ </message>
+ <message>
+ <source>Select users for which you want to deregister all devices.</source>
+ <translation>Vybrat uživatelský profil od něhož mají být odhlášena všechna zařízení.</translation>
+ </message>
+ <message>
+ <source>Do not disturb</source>
+ <translation>Prosím nerušit</translation>
+ </message>
+ <message>
+ <source>Select users for which you want to enable &apos;do not disturb&apos;.</source>
+ <translation>Vybrat uživatelský profil, pro který má být aktivován režim &quot;Nerušit&quot;.</translation>
+ </message>
+ <message>
+ <source>Auto answer</source>
+ <translation>Automaticky přijmout volání</translation>
+ </message>
+ <message>
+ <source>Select users for which you want to enable &apos;auto answer&apos;.</source>
+ <translation>Vybrat uživatelský profil, pro který má být aktivován režim &quot;Automaticky vzít volání&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>SendFileForm</name>
+ <message>
+ <source>Twinkle - Send File</source>
+ <translation>Twinkle - Odeslat soubor</translation>
+ </message>
+ <message>
+ <source>Select file to send.</source>
+ <translation>Výběr souboru k odeslání.</translation>
+ </message>
+ <message>
+ <source>&amp;File:</source>
+ <translation>&amp;Soubor:</translation>
+ </message>
+ <message>
+ <source>&amp;Subject:</source>
+ <translation>&amp;Předmět:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Zrušit (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>File does not exist.</source>
+ <translation>Soubor neexistuje.</translation>
+ </message>
+ <message>
+ <source>Send file...</source>
+ <translation>Odeslat soubor...</translation>
+ </message>
+</context>
+<context>
+ <name>SrvRedirectForm</name>
+ <message>
+ <source>Twinkle - Call Redirection</source>
+ <translation>Twinkle - Přesměrování hovoru</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Uživatel:</translation>
+ </message>
+ <message>
+ <source>There are 3 redirect services:&lt;p&gt;
+&lt;b&gt;Unconditional:&lt;/b&gt; redirect all calls
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Busy:&lt;/b&gt; redirect a call if both lines are busy
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;No answer:&lt;/b&gt; redirect a call when the no-answer timer expires
+&lt;/p&gt;</source>
+ <translation>Existují 3 způsoby přesměrování volání:&lt;p&gt;
+&lt;b&gt;Trvale:&lt;/b&gt; přesměrovat všechny hovory
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Obsazeno:&lt;/b&gt; Přesměrovat hovor, pokud jsou obě linky obsazené
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Žádná odpověď:&lt;/b&gt; Přesměrovat volání po uplynutí čekací prodlevy
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Unconditional</source>
+ <translation>&amp;Trvale</translation>
+ </message>
+ <message>
+ <source>&amp;Redirect all calls</source>
+ <translation>&amp;Přesměrovat všechna volání
+</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt-R</translation>
+ </message>
+ <message>
+ <source>Activate the unconditional redirection service.</source>
+ <translation>Aktivovat službu &quot;přesměrovat všechna volání&quot;.</translation>
+ </message>
+ <message>
+ <source>Redirect to</source>
+ <translation>Přesměrovat na</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Mohou být zadány až 3 cíle pro přesměrování volání. Pokud nebude hovor přebrán prvním cílem, bude použit druhý, popřípadě třetí.</translation>
+ </message>
+ <message>
+ <source>&amp;3rd choice destination:</source>
+ <translation>&amp;3. Cíl:</translation>
+ </message>
+ <message>
+ <source>&amp;2nd choice destination:</source>
+ <translation>&amp;2. Cíl:</translation>
+ </message>
+ <message>
+ <source>&amp;1st choice destination:</source>
+ <translation>&amp;1. Cíl:</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adresář</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Vybrat z adresáře volané číslo / SIP adresu.</translation>
+ </message>
+ <message>
+ <source>&amp;Busy</source>
+ <translation>&amp;Obsazeno</translation>
+ </message>
+ <message>
+ <source>&amp;Redirect calls when I am busy</source>
+ <translation>&amp;Přesměrovat volání, pokud jsou všechny linky obsazené</translation>
+ </message>
+ <message>
+ <source>Activate the redirection when busy service.</source>
+ <translation>Aktivovat přesměrovaní, pokud je linka nedostupná.</translation>
+ </message>
+ <message>
+ <source>&amp;No answer</source>
+ <translation>&amp;Žádná odpověď</translation>
+ </message>
+ <message>
+ <source>&amp;Redirect calls when I do not answer</source>
+ <translation>&amp;Přesměrovat volání, pokud uživatel neodpovídá</translation>
+ </message>
+ <message>
+ <source>Activate the redirection on no answer service.</source>
+ <translation>Aktivovat službu &quot;Přesměrovat v nepřítomnosti&quot;.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Accept and save all changes.</source>
+ <translation>Uložit změny.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Zrušit (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Undo your changes and close the window.</source>
+ <translation>Neukládat provedené změny a zavřít okno.</translation>
+ </message>
+ <message>
+ <source>You have entered an invalid destination.</source>
+ <translation>Neplatná cílová adresa.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished">F10</translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation type="unfinished">F11</translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation type="unfinished">F12</translation>
+ </message>
+</context>
+<context>
+ <name>SysSettingsForm</name>
+ <message>
+ <source>Twinkle - System Settings</source>
+ <translation>Twinkle - Systémová nastavení</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Obecné</translation>
+ </message>
+ <message>
+ <source>Audio</source>
+ <translation>Audio</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <translation>Vyzváněcí tóny</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adresář</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Síť</translation>
+ </message>
+ <message>
+ <source>Log</source>
+ <translation>Log</translation>
+ </message>
+ <message>
+ <source>Select a category for which you want to see or modify the settings.</source>
+ <translation>Vybrat skupinu vlastností u které chcete změnit nastavení.</translation>
+ </message>
+ <message>
+ <source>Sound Card</source>
+ <translation>Zvuková karta</translation>
+ </message>
+ <message>
+ <source>Select the sound card for playing the ring tone for incoming calls.</source>
+ <translation>Vybrat audio připojení pro přehrávání vyzváněcího tónu příchozího volání.</translation>
+ </message>
+ <message>
+ <source>Select the sound card to which your microphone is connected.</source>
+ <translation>Vybrat audio připojení pro mikrofon.</translation>
+ </message>
+ <message>
+ <source>Select the sound card for the speaker function during a call.</source>
+ <translation>Vybrat audio připojení pro sluchátka/reproduktoru. Může být shodné s audio připojením pro vyzváněcí tón.</translation>
+ </message>
+ <message>
+ <source>&amp;Speaker:</source>
+ <translation>&amp;Sluchátka/Reproduktor:</translation>
+ </message>
+ <message>
+ <source>&amp;Ring tone:</source>
+ <translation>&amp;Vyzváněcí tón:</translation>
+ </message>
+ <message>
+ <source>Other device:</source>
+ <translation>Jiné připojení:</translation>
+ </message>
+ <message>
+ <source>&amp;Microphone:</source>
+ <translation>&amp;Mikrofon:</translation>
+ </message>
+ <message>
+ <source>When using ALSA, it is not recommended to use the default device for the microphone as it gives poor sound quality.</source>
+ <translation type="obsolete">Při použítí ALSA rozhraní není doporučeno mít nastaveno pro mikrofon &quot;standardní zařízení&quot;. Může to být příčinou špatné kvality zvuku.</translation>
+ </message>
+ <message>
+ <source>Reduce &amp;noise from the microphone</source>
+ <translation type="obsolete">Speciální potlačení &amp;rušení z mikrofonu</translation>
+ </message>
+ <message>
+ <source>Recordings from the microphone can contain noise. This could be annoying to the person on the other side of your call. This option removes soft noise coming from the microphone.
+The noise reduction algorithm is very simplistic. Sound is captured as 16 bits signed linear PCM samples. All samples between -50 and 50 are truncated to 0.</source>
+ <translation type="obsolete">Zvuk z mikrofonu může obsahovat rušení. Tato volba se ho snaží odstranit. Zavedena byla po zkušenosti s vadnými A/D převodníky u některých Provider Gateways.
+Algoritmus je velmi jednoduchý. Zvuk je navzorkován jako 16 bitový PCM vzorek a poté jsou všechny vzorky s hodnotou mezi -50 až 50 nastaveny na 0.</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Pokročilé nastavení</translation>
+ </message>
+ <message>
+ <source>OSS &amp;fragment size:</source>
+ <translation>Velikost OSS &amp;fragmentů:</translation>
+ </message>
+ <message>
+ <source>16</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>32</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>64</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>128</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>256</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>ALSA play perioda ovlivňuje zjednodušeně řečeno velikost paketů, pomocí kterých jsou posílána data na zvukovou kartu. Hodně malých paketů zatěžuje více procesor, ale ztráta nějakého paketu není tolik vážná. Při problémech s vypadáváním nebo přeskakováním zvuku je možné zaexperimentovat s jinými hodnotami.</translation>
+ </message>
+ <message>
+ <source>ALSA &amp;play period size:</source>
+ <translation>Velikost ALSA &amp;play (LS) periody:</translation>
+ </message>
+ <message>
+ <source>&amp;ALSA capture period size:</source>
+ <translation>Velikost &amp;ALSA capture (MIC) periody:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>OSS fragment size ovlivňuje zjednodušeně řečeno velikost paketů, pomocí kterých jsou posílána data na zvukovou kartu. Hodně malých paketů zatěžuje více procesor, ale ztráta nějakého paketu není tolik vážná. Při problémech s vypadáváním nebo přeskakováním zvuku je možně zaexperimentovat s jinými hodnotami.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Velikost capture periody ovlivňuje zjednodušeně řečeno velikost paketů, pomocí kterých jsou posílána data na zvukovou kartu. Hodně malých paketů zatěžuje více procesor, ale ztráta nějakého paketu není tolik vážná. Při problémech s vypadáváním nebo přeskakováním zvuku je možně zaexperimentovat s jinými hodnotami.</translation>
+ </message>
+ <message>
+ <source>&amp;Max log size:</source>
+ <translation>&amp;Maximální velikost systémového logu:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Systémový log je používán experty pro hledání problémů. Zde je možné nastavit jeho maximální velikost. Při dosažení logu této velikosti je twinkle.log přejmenováno na twinkle.old Pokud již soubor twinkle.old existuje, je přepsán.</translation>
+ </message>
+ <message>
+ <source>MB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Log &amp;debug reports</source>
+ <translation>Zapsat i &apos;&amp;debug&apos; hlášky</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if reports marked as &quot;debug&quot; will be logged.</source>
+ <translation>Aktivuje zápis &quot;debug&quot; výstupů.</translation>
+ </message>
+ <message>
+ <source>Log &amp;SIP reports</source>
+ <translation>Zapsat &amp;SIP hlášky</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if SIP messages will be logged.</source>
+ <translation>Aktivuje zápis SIP stavů.</translation>
+ </message>
+ <message>
+ <source>Log S&amp;TUN reports</source>
+ <translation>Zapsat S&amp;TUN hlášky</translation>
+ </message>
+ <message>
+ <source>Alt+T</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if STUN messages will be logged.</source>
+ <translation>Aktivuje zápis STUN stavů.</translation>
+ </message>
+ <message>
+ <source>Log m&amp;emory reports</source>
+ <translation>Zapsat hlášky ohl&amp;edně paměti</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if reports concerning memory management will be logged.</source>
+ <translation>Aktivuje zápis protokolů o přidělení/uvolnění RAM paměti.</translation>
+ </message>
+ <message>
+ <source>System tray</source>
+ <translation>Systémová lišta</translation>
+ </message>
+ <message>
+ <source>Create &amp;system tray icon on startup</source>
+ <translation>Při spuštění vytvořit &amp;ikonku v systémové liště</translation>
+ </message>
+ <message>
+ <source>Enable this option if you want a system tray icon for Twinkle. The system tray icon is created when you start Twinkle.</source>
+ <translation>S touto volbou vytvoří Twinkle při startu v systémové liště symbol hvězdičky. Přes tento lze kdykoliv program vyvolat do popředí. Rovněž je přes jeho vzhled signalizován aktuální stav telefonní linky.</translation>
+ </message>
+ <message>
+ <source>&amp;Hide in system tray when closing main window</source>
+ <translation>Přesunout do systémové lišty při zavření &amp;hlavního okna programu</translation>
+ </message>
+ <message>
+ <source>Alt+H</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Enable this option if you want Twinkle to hide in the system tray when you close the main window.</source>
+ <translation>Pokud je aktivováno, je twinkle při zavření hlavního okna přesunuto do systémové lišty. K úplnému ukončení programu je nutné vybrat volbu &quot;ukončit&quot; v menu &quot;Soubor&quot; nebo v kontextovém menu symbolu Twinkle v systémové liště.</translation>
+ </message>
+ <message>
+ <source>Startup</source>
+ <translation>Start programu</translation>
+ </message>
+ <message>
+ <source>Next time you start Twinkle, this IP address will be automatically selected. This is only useful when your computer has multiple and static IP addresses.</source>
+ <translation type="obsolete">Zde uvedená IP adresa bude automaticky vybrána při příštím startu programu. To má smysl jen pokud má tento počítač vícero síťových připojení a jen jedno je s přístupem do internetu.</translation>
+ </message>
+ <message>
+ <source>Default &amp;IP address:</source>
+ <translation type="obsolete">Standardní &amp;IP adresa:</translation>
+ </message>
+ <message>
+ <source>Next time you start Twinkle, the IP address of this network interface be automatically selected. This is only useful when your computer has multiple network devices.</source>
+ <translation type="obsolete">Pokud má tento počítač vícero síťových připojení, je zde možné uvést, které má být zvoleno. Při příštím startu programu již na toto nebude dotazováno.</translation>
+ </message>
+ <message>
+ <source>Default &amp;network interface:</source>
+ <translation type="obsolete">Standardní síťové &amp;rozhraní:</translation>
+ </message>
+ <message>
+ <source>S&amp;tartup hidden in system tray</source>
+ <translation>Spustit zminimalizované do &amp;systémové lišty</translation>
+ </message>
+ <message>
+ <source>Next time you start Twinkle it will immediately hide in the system tray. This works best when you also select a default user profile.</source>
+ <translation>Při startu Twinkle neotevírat hlavní okno, nýbrž spustit zminimalizované do systémové lišty. Měl by být rovněž přednastaven standarní profil, jinak dojde k vyvolání okna s výběrem profilu.</translation>
+ </message>
+ <message>
+ <source>Default user profiles</source>
+ <translation>Standardní uživatelský profil</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Zde nastavené uživatelské profily budou při startu programu automaticky aktivovány. Kdykoliv je můžete přes &quot;Soubor&quot; -&gt; &quot;Změnit uživatelské profily&quot; aktivovat nebo deaktivovat.</translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation>Služby</translation>
+ </message>
+ <message>
+ <source>Call &amp;waiting</source>
+ <translation>Detekce &amp;příchozího hovoru</translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Pokud je aktivována funkce &quot;Detekce příchozího hovoru&quot;, může být v případě obsazené linky volání přesměrováno na druhou linku. Pokud je funkce deaktivována, je volajícímu signalizováno &quot;obsazeno&quot;.</translation>
+ </message>
+ <message>
+ <source>Hang up &amp;both lines when ending a 3-way conference call.</source>
+ <translation>Při ukončení konferenčního hovoru budou &amp;obě linky &quot;zavěšeny&quot;.</translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Pokud je aktivováno budou při &quot;zavěšení&quot; odpojeny obě linky. Jinak dojde jen k ukončení volání na aktivní lince a je možné pokračovat v hovoru na druhé lince.</translation>
+ </message>
+ <message>
+ <source>&amp;Maximum calls in call history:</source>
+ <translation>&amp;Maximální počet záznamů v seznamu volání:</translation>
+ </message>
+ <message>
+ <source>The maximum number of calls that will be kept in the call history.</source>
+ <translation>Délka seznamu volání bude omezena na zde zadaný počet záznamů. Starší záznamy budou automaticky odstraněny.</translation>
+ </message>
+ <message>
+ <source>&amp;Auto show main window on incoming call after</source>
+ <translation>Při hovoru &amp;otevřít automaticky hlavní okno</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>When the main window is hidden, it will be automatically shown on an incoming call after the number of specified seconds.</source>
+ <translation>Pokud je hlavní okno programu skryto, bude při příchozím hovoru po zadaném počtu sekund zobrazeno do popředí.</translation>
+ </message>
+ <message>
+ <source>Number of seconds after which the main window should be shown.</source>
+ <translation>Čas v sekundách po kterém bude hlavní okno programu obnoveno do popředí.</translation>
+ </message>
+ <message>
+ <source>secs</source>
+ <translation>Sekund</translation>
+ </message>
+ <message>
+ <source>The UDP port used for sending and receiving SIP messages.</source>
+ <translation type="obsolete">UDP Port pro SIP Protokoll. Standardně je to 5060. Nicméně váš VoIP provider může vyžadovat jiný port.</translation>
+ </message>
+ <message>
+ <source>&amp;RTP port:</source>
+ <translation>&amp;RTP port:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>První port přes který běží datový přenos hovoru. Současně vedený hovor na druhé lince používá port o 2 čísla vyšší. Zprostředkování hovoru potom další 2 porty. Např. 1. linka: 8000(+8001), 2. linka: 8002(+8003), Zprostředkování: 8004(+8005). Standardně je to většinou 8000 nebo 5004. Je to však závislé od konkrétního poskytovatele VoIP připojení. Při větším množství SIP telefonů připojených na jedno internetové připojení, potřebuje každý vyhrazenou vlastní skupinu portů! Tedy druhý telefon např. 8006 a výše.</translation>
+ </message>
+ <message>
+ <source>&amp;SIP UDP port:</source>
+ <translation type="obsolete">&amp;SIP UDP port:</translation>
+ </message>
+ <message>
+ <source>Ring tone</source>
+ <translation>Vyzváněcí tón</translation>
+ </message>
+ <message>
+ <source>&amp;Play ring tone on incoming call</source>
+ <translation>Při příchozím volání &amp;spustit vyzváněcí tón</translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if a ring tone should be played when a call comes in.</source>
+ <translation>Pokud je aktivováno, spustí Twinkle při příchozím volání vyzváněcí tón přes přednastavené audio připojení.</translation>
+ </message>
+ <message>
+ <source>&amp;Default ring tone</source>
+ <translation>&amp;Standardní vyzváněcí tón</translation>
+ </message>
+ <message>
+ <source>Play the default ring tone when a call comes in.</source>
+ <translation>Spustí standardní vyzváněcí tón při příchozím volání.</translation>
+ </message>
+ <message>
+ <source>C&amp;ustom ring tone</source>
+ <translation>individuální vyzváněcí &amp;tón</translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Play a custom ring tone when a call comes in.</source>
+ <translation>Při příchozím volání přehrávat vlastní vyzváněcí tón.</translation>
+ </message>
+ <message>
+ <source>Specify the file name of a .wav file that you want to be played as ring tone.</source>
+ <translation>Zadejte jméno .wav souboru pro vlastní vyzváněcí tón.</translation>
+ </message>
+ <message>
+ <source>Ring back tone</source>
+ <translation>Tón pro signalizaci vyzvánění u volaného</translation>
+ </message>
+ <message>
+ <source>P&amp;lay ring back tone when network does not play ring back tone</source>
+ <translation>Přehrát tón pro &amp;vyzvánění u volaného, pokud telefonní síť žádný tón neposkytuje</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Play ring back tone while you are waiting for the far-end to answer your call.
+&lt;/p&gt;
+&lt;p&gt;
+Depending on your SIP provider the network might provide ring back tone or an announcement.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Přehrát tón pro vyzvánění u volaného, pokud telefonní síť žádný takový tón neposkytuje.&lt;/p&gt;
+
+&lt;p&gt;Tento tón je závislý od vašeho SIP poskytovatele.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>D&amp;efault ring back tone</source>
+ <translation>&amp;Standardní tón pro vyzvánění u volaného</translation>
+ </message>
+ <message>
+ <source>Play the default ring back tone.</source>
+ <translation>Přehrávat standardní tón vyzvánění u volaného.</translation>
+ </message>
+ <message>
+ <source>Cu&amp;stom ring back tone</source>
+ <translation>&amp;Individuální tón vyzvánění u volaného</translation>
+ </message>
+ <message>
+ <source>Play a custom ring back tone.</source>
+ <translation>Použít individuální vyzváněcí tón u volaného. </translation>
+ </message>
+ <message>
+ <source>Specify the file name of a .wav file that you want to be played as ring back tone.</source>
+ <translation>Zadat jméno .wav souboru pro váš indiviuální tón vyzvánění u volaného.</translation>
+ </message>
+ <message>
+ <source>&amp;Lookup name for incoming call</source>
+ <translation>Podle čísla &amp;zjistit volajícího</translation>
+ </message>
+ <message>
+ <source>Ove&amp;rride received display name</source>
+ <translation>&amp;Přepisovat jméno volajícího</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Volající protistrana může posílat vlastní jméno. Při aktivaci této volby bude zobrazované jméno vzato z vašeho lokálního adresáře.</translation>
+ </message>
+ <message>
+ <source>Lookup &amp;photo for incoming call</source>
+ <translation>Hledat &amp;fotografii volajícího</translation>
+ </message>
+ <message>
+ <source>Lookup the photo of a caller in your address book and display it on an incoming call.</source>
+ <translation>Hledat fotografii ve vašem lokálním adresáři a zobrazit při příchozím volání.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Accept and save your changes.</source>
+ <translation>Převzít změny a uložit.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Zrušit (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Undo all your changes and close the window.</source>
+ <translation>Vrátit zpět všechny změny a uzavřít.</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <comment>This is the &apos;none&apos; in default IP address combo</comment>
+ <translation type="obsolete">auto</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <comment>This is the &apos;none&apos; in default network interface combo</comment>
+ <translation type="obsolete">auto</translation>
+ </message>
+ <message>
+ <source>Either choose a default IP address or a default network interface.</source>
+ <translation type="obsolete">Vybrat buď standardní IP adresu nebo standardní síťové rozhraní.</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Vyzváněcí tóny</translation>
+ </message>
+ <message>
+ <source>Choose ring tone</source>
+ <translation>Vybrat vyzváněcí tón</translation>
+ </message>
+ <message>
+ <source>Ring back tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Tón vyzvánění u volaného</translation>
+ </message>
+ <message>
+ <source>Choose ring back tone</source>
+ <translation>Vybrat tón pro signalizaci volné linky</translation>
+ </message>
+ <message>
+ <source>&amp;Validate devices before usage</source>
+ <translation>Ověřit audio nasta&amp;vení před prvním použití</translation>
+ </message>
+ <message>
+ <source>Alt+V</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Twinkle validates the audio devices before usage to avoid an established call without an audio channel.
+&lt;p&gt;
+On startup of Twinkle a warning is given if an audio device is inaccessible.
+&lt;p&gt;
+If before making a call, the microphone or speaker appears to be invalid, a warning is given and no call can be made.
+&lt;p&gt;
+If before answering a call, the microphone or speaker appears to be invalid, a warning is given and the call will not be answered.</source>
+ <translation>&lt;p&gt;Pokud je aktivováno, Twinkle při startu zkontroluje zdali je zadané audio zařízení přístupné.&lt;/p&gt;
+&lt;p&gt;Pokud se zdá, že mikrofon nebo reproduktory/sluchátko nejsou v pořádku, bude zobrazeno varovné hlášení a žádné volání nebude dovoleno.&lt;/p&gt;
+&lt;p&gt;Rovněž v případě, že je detekováno příchozí volání a audio zařízení není v pořádku, zobrazí se varování a hovor nebude možné přijmout.
+</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Při příchozím volání se Twinkle bude pokoušet najít k volajícímu v lokálním adresáři odpovídající záznam. Pokud se to podaří, bude jeho jméno zobrazeno.</translation>
+ </message>
+ <message>
+ <source>Select ring tone file.</source>
+ <translation>Výběr souboru s vyzváněcím tónem.</translation>
+ </message>
+ <message>
+ <source>Select ring back tone file.</source>
+ <translation>Výběr souboru pro vyzváněcí tón u protistrany.</translation>
+ </message>
+ <message>
+ <source>Maximum allowed size (0-65535) in bytes of an incoming SIP message over UDP.</source>
+ <translation>Maximálně povolená velikost příchozí SIP zprávy přes UDP, v Bajtech (0-65535).</translation>
+ </message>
+ <message>
+ <source>&amp;SIP port:</source>
+ <translation>&amp;SIP port:</translation>
+ </message>
+ <message>
+ <source>Max. SIP message size (&amp;TCP):</source>
+ <translation>Max. velikost SIP zprávy (&amp;TCP):</translation>
+ </message>
+ <message>
+ <source>The UDP/TCP port used for sending and receiving SIP messages.</source>
+ <translation>UDP/TCP port použitý pro odesílání a přijímání SIP zpráv.</translation>
+ </message>
+ <message>
+ <source>Max. SIP message size (&amp;UDP):</source>
+ <translation>Max. velikost SIP zprávy (&amp;UDP):</translation>
+ </message>
+ <message>
+ <source>Maximum allowed size (0-4294967295) in bytes of an incoming SIP message over TCP.</source>
+ <translation>Maximálně povolená velikost příchozí SIP zprávy přes TCP, v Bajtech (0-4294967295).</translation>
+ </message>
+ <message>
+ <source>W&amp;eb browser command:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Command to start your web browser. If you leave this field empty Twinkle will try to figure out your default web browser.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SysTrayPopup</name>
+ <message>
+ <source>Answer</source>
+ <translation>Přijmout</translation>
+ </message>
+ <message>
+ <source>Reject</source>
+ <translation>Odmítnout</translation>
+ </message>
+ <message>
+ <source>Incoming Call</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TermCapForm</name>
+ <message>
+ <source>Twinkle - Terminal Capabilities</source>
+ <translation>Twinkle - parametry protistrany</translation>
+ </message>
+ <message>
+ <source>&amp;From:</source>
+ <translation>&amp;Od:</translation>
+ </message>
+ <message>
+ <source>Get terminal capabilities of</source>
+ <translation>Dotázat se na parametry následující protistrany</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;Adresa:</translation>
+ </message>
+ <message>
+ <source>The address that you want to query for capabilities (OPTION request). This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Adresa nebo číslo protistrany jejíž parametry se mají zjistit (OPTION request). Může to být kompletní SIP adresa ve formátu &lt;b&gt;sip:example@example.com&lt;/b&gt; nebo jen telefonní číslo celé adresy. Pokud není adresa kompletní, Twinkle doplní jméno domény podle standardního uživatelského profilu.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adresář</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Vybrat z adresáře volané číslo nebo SIP adresu.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Zrušit (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished">F10</translation>
+ </message>
+</context>
+<context>
+ <name>TransferForm</name>
+ <message>
+ <source>Twinkle - Transfer</source>
+ <translation>Twinkle - převedení</translation>
+ </message>
+ <message>
+ <source>Transfer call to</source>
+ <translation>Převést hovor na</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;Na:</translation>
+ </message>
+ <message>
+ <source>The address of the person you want to transfer the call to. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Adresa nebo číslo protistrany, na které má být hovor přesměrován. Může to být kompletní SIP adresa jako např. &lt;b&gt;sip:example@example.com&lt;/b&gt; nebo jen telefonní číslo. Pokud není zadána plná SIP adresa, Twinkle doplní adresu jménem domény aktivního uživatelského profilu.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adresář</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Vybrat z adresáře volané číslo nebo SIP adresu.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Zrušit (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Type of transfer</source>
+ <translation>Typ přesměrování</translation>
+ </message>
+ <message>
+ <source>&amp;Blind transfer</source>
+ <translation>&amp;Bez zpětného přesměrování</translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Transfer the call to a third party without contacting that third party yourself.</source>
+ <translation>Hovor přímo přesměrovat na nového účastníka, aniž by bylo nutné ho nejdříve kontaktovat.</translation>
+ </message>
+ <message>
+ <source>T&amp;ransfer with consultation</source>
+ <translation>Přesměrovat se &amp;zpětným dotazem</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Before transferring the call to a third party, first consult the party yourself.</source>
+ <translation>Před přesměrováním hovoru nejprve kontaktovat nového účastníka a volajícího ohlásit.</translation>
+ </message>
+ <message>
+ <source>Transfer to other &amp;line</source>
+ <translation>Přesměrovat na jinou &amp;linku</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Connect the remote party on the active line with the remote party on the other line.</source>
+ <translation>Propojit obě protistrany na lince 1 a 2. Protistrana, která je právě na aktivní lince bude ta, která bude hovor přesměrovat.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished">F10</translation>
+ </message>
+</context>
+<context>
+ <name>TwinkleCore</name>
+ <message>
+ <source>Failed to create log file %1 .</source>
+ <translation>Chyba při vytvoření logového souboru &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot open file for reading: %1</source>
+ <translation>Nelze otevřít ke čtení soubor &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <source>File system error while reading file %1 .</source>
+ <translation>Systémová chyba při čtení souboru &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot open file for writing: %1</source>
+ <translation>Nelze otevřít k zápisu soubor &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <source>File system error while writing file %1 .</source>
+ <translation>Systémová chyba při zápisu do &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Excessive number of socket errors.</source>
+ <translation>Příliš velký počet socketových chyb.</translation>
+ </message>
+ <message>
+ <source>Built with support for:</source>
+ <translation>Vytvořeno s podporou pro:</translation>
+ </message>
+ <message>
+ <source>Contributions:</source>
+ <translation>Pomocní vývojáři:</translation>
+ </message>
+ <message>
+ <source>This software contains the following software from 3rd parties:</source>
+ <translation>Tento program obsahuje softwarové části těchto třetích stran:</translation>
+ </message>
+ <message>
+ <source>* GSM codec from Jutta Degener and Carsten Bormann, University of Berlin</source>
+ <translation>* GSM kodek od Jutta Degener a Carsten Bormann, University of Berlin</translation>
+ </message>
+ <message>
+ <source>* G.711/G.726 codecs from Sun Microsystems (public domain)</source>
+ <translation>* G.711/G.726 kodeky od Sun Microsystems (public domain)</translation>
+ </message>
+ <message>
+ <source>* iLBC implementation from RFC 3951 (www.ilbcfreeware.org)</source>
+ <translation>* iLBC implementace RFC 3951 (www.ilbcfreeware.org)</translation>
+ </message>
+ <message>
+ <source>* Parts of the STUN project at http://sourceforge.net/projects/stun</source>
+ <translation>* Části ze STUN projektu na http://sourceforge.net/projects/stun</translation>
+ </message>
+ <message>
+ <source>* Parts of libsrv at http://libsrv.sourceforge.net/</source>
+ <translation>* Části z libsrv na http://libsrv.sourceforge.net/</translation>
+ </message>
+ <message>
+ <source>For RTP the following dynamic libraries are linked:</source>
+ <translation>Pro RTP jsou linkovány následující dynamické knihovny:</translation>
+ </message>
+ <message>
+ <source>Translated to english by &lt;your name&gt;</source>
+ <translation type="unfinished">Český překlad vypracoval Marek Straka, ©20090701, (http://marek.straka.info)</translation>
+ </message>
+ <message>
+ <source>Directory %1 does not exist.</source>
+ <translation>Složka &quot;%1&quot; nenalezena.</translation>
+ </message>
+ <message>
+ <source>Cannot open file %1 .</source>
+ <translation>Soubor &quot;%1&quot; nelze otevřít.</translation>
+ </message>
+ <message>
+ <source>%1 is not set to your home directory.</source>
+ <translation>&quot;%1&quot; neukazuje na vaši domovskou složku.</translation>
+ </message>
+ <message>
+ <source>Directory %1 (%2) does not exist.</source>
+ <translation>Složka &quot;%1&quot; (%2) neexistuje.</translation>
+ </message>
+ <message>
+ <source>Cannot create directory %1 .</source>
+ <translation>Složku &quot;%1&quot; nelze vytvořit.</translation>
+ </message>
+ <message>
+ <source>Lock file %1 already exist, but cannot be opened.</source>
+ <translation type="obsolete">Zamykací soubor &quot;%1&quot; již existuje, ale nemůže být otevřen.</translation>
+ </message>
+ <message>
+ <source>%1 is already running.
+Lock file %2 already exists.</source>
+ <translation>&quot;%1&quot; již běží.
+Zamykací soubor &quot;%2&quot; již existuje.</translation>
+ </message>
+ <message>
+ <source>Cannot create %1 .</source>
+ <translation>Nelze vytvořit &quot;%1&quot; .</translation>
+ </message>
+ <message>
+ <source>Cannot write to %1 .</source>
+ <translation type="obsolete">Nelze zapisovat do &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Syntax error in file %1 .</source>
+ <translation>Syntaktická chyba v souboru &quot;%1&quot; .</translation>
+ </message>
+ <message>
+ <source>Failed to backup %1 to %2</source>
+ <translation>Chyba při záloze z &quot;%1&quot; do &quot;%2&quot;</translation>
+ </message>
+ <message>
+ <source>unknown name (device is busy)</source>
+ <translation>Neznámé zařízení nebo je již obsazené </translation>
+ </message>
+ <message>
+ <source>Default device</source>
+ <translation>Standardní zařízení</translation>
+ </message>
+ <message>
+ <source>Anonymous</source>
+ <translation>Anonymní</translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation>Upozornění:</translation>
+ </message>
+ <message>
+ <source>Call transfer - %1</source>
+ <translation>Přesměrování - %1</translation>
+ </message>
+ <message>
+ <source>Sound card cannot be set to full duplex.</source>
+ <translation>Audio zařízení nelze nastavit na &quot;voll duplex&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot set buffer size on sound card.</source>
+ <translation>Nelze nastavit velikost bufferu na zvukové kartě.</translation>
+ </message>
+ <message>
+ <source>Sound card cannot be set to %1 channels.</source>
+ <translation>Zvukové zařízení neze nastavit na %1 kanálů.</translation>
+ </message>
+ <message>
+ <source>Cannot set sound card to 16 bits recording.</source>
+ <translation>Audio zařízení nelze nastavit na 16 bitový záznam.</translation>
+ </message>
+ <message>
+ <source>Cannot set sound card to 16 bits playing.</source>
+ <translation>Audio zařízení nelze nastavit na 16 bitové přehrávání.</translation>
+ </message>
+ <message>
+ <source>Cannot set sound card sample rate to %1</source>
+ <translation>Nelze nastavit vzorkovací frekvenci audio zařízení na %1 </translation>
+ </message>
+ <message>
+ <source>Opening ALSA driver failed</source>
+ <translation>Chyba při otevírání ALSA ovladačů</translation>
+ </message>
+ <message>
+ <source>Cannot open ALSA driver for PCM playback</source>
+ <translation>Nelze otevřít ALSA ovladač pro PCM přehrávání</translation>
+ </message>
+ <message>
+ <source>Cannot resolve STUN server: %1</source>
+ <translation>Nelze identifikovat URL STUN serveru: %1</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Nacházíte se za &quot;symetric NAT&quot;.
+STUN nebude fungovat.
+Je nutné nastavit v uživatelském profilu veřejně dostupnou IP adresu
+a na vašem routeru/firewallu/NATu vytvořit veřejně přístupné porty
+nasměrované na lokální porty na vašem počítači.</translation>
+ </message>
+ <message>
+ <source>public IP: %1 --&gt; private IP: %2 (SIP signaling)</source>
+ <translation>veřejná IP: %1 --&gt; privátní IP: %2 (SIP Protokol)</translation>
+ </message>
+ <message>
+ <source>public IP: %1-%2 --&gt; private IP: %3-%4 (RTP/RTCP)</source>
+ <translation>Veřejná IP: %1 - %2 --&gt; privátní IP: %3 - %4 (RTP/RTCP)</translation>
+ </message>
+ <message>
+ <source>Cannot reach the STUN server: %1</source>
+ <translation>Nelze připojit na STUN server: &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <source>Port %1 (SIP signaling)</source>
+ <translation>Port %1 (SIP Protokol)</translation>
+ </message>
+ <message>
+ <source>NAT type discovery via STUN failed.</source>
+ <translation>Analýza NAT pomocí STUN selhala.</translation>
+ </message>
+ <message>
+ <source>If you are behind a firewall then you need to open the following UDP ports.</source>
+ <translation>Pokud se nacházíte za firewallem, je nutné otevřít následující UDP porty.</translation>
+ </message>
+ <message>
+ <source>Ports %1-%2 (RTP/RTCP)</source>
+ <translation>Porty %1-%2 (RTP/RTCP)</translation>
+ </message>
+ <message>
+ <source>Cannot access the ring tone device (%1).</source>
+ <translation>Audio zařízení &quot;%1&quot; pro vyzváněcí tón není přístupné.</translation>
+ </message>
+ <message>
+ <source>Cannot access the speaker (%1).</source>
+ <translation>Audio zařízení &quot;%1&quot; pro reproduktory/sluchátka není přístupné.</translation>
+ </message>
+ <message>
+ <source>Cannot access the microphone (%1).</source>
+ <translation>Audio zařízení &quot;%1&quot; pro mikrofon není přístupné.</translation>
+ </message>
+ <message>
+ <source>Cannot open ALSA driver for PCM capture</source>
+ <translation type="unfinished">Nelze otevřít ALSA ovladač pro PCM nahrávání</translation>
+ </message>
+ <message>
+ <source>Cannot receive incoming TCP connections.</source>
+ <translation>Nelze přijmout příchozí TCP spojení.</translation>
+ </message>
+ <message>
+ <source>Failed to create file %1</source>
+ <translation>selhalo vytvoření souboru %1</translation>
+ </message>
+ <message>
+ <source>Failed to write data to file %1</source>
+ <translation>Selhal zápis dat do souboru %1</translation>
+ </message>
+ <message>
+ <source>Failed to send message.</source>
+ <translation>Selhalo odeslání zprávy.</translation>
+ </message>
+ <message>
+ <source>Cannot lock %1 .</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UserProfileForm</name>
+ <message>
+ <source>Twinkle - User Profile</source>
+ <translation>Twinkle - uživatelský profil</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Uživatelský profil:</translation>
+ </message>
+ <message>
+ <source>Select which profile you want to edit.</source>
+ <translation>Vybrat profil k úpravě.</translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation>Uživatel</translation>
+ </message>
+ <message>
+ <source>SIP server</source>
+ <translation>SIP Server</translation>
+ </message>
+ <message>
+ <source>RTP audio</source>
+ <translation>RTP Audio</translation>
+ </message>
+ <message>
+ <source>SIP protocol</source>
+ <translation>SIP protokol</translation>
+ </message>
+ <message>
+ <source>NAT</source>
+ <translation type="obsolete">NAT (překlad adres)</translation>
+ </message>
+ <message>
+ <source>Address format</source>
+ <translation>Formát adresy</translation>
+ </message>
+ <message>
+ <source>Timers</source>
+ <translation>Časovač</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <translation>Vyzváněcí tóny</translation>
+ </message>
+ <message>
+ <source>Scripts</source>
+ <translation>Skripty</translation>
+ </message>
+ <message>
+ <source>Security</source>
+ <translation>Zabezpečení</translation>
+ </message>
+ <message>
+ <source>Select a category for which you want to see or modify the settings.</source>
+ <translation>Vybrat oblast, ve které mají být provedeny změny nastavení.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Accept and save your changes.</source>
+ <translation>Akceptovat a uložit změny v nastavení.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Zrušit (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Undo all your changes and close the window.</source>
+ <translation>Vrátit zpět všechny změny a zavřít okno.</translation>
+ </message>
+ <message>
+ <source>SIP account</source>
+ <translation>Údaje SIP účtu</translation>
+ </message>
+ <message>
+ <source>&amp;User name*:</source>
+ <translation>Uživatelské &amp;jméno *:</translation>
+ </message>
+ <message>
+ <source>&amp;Domain*:</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Or&amp;ganization:</source>
+ <translation>Or&amp;ganizace:</translation>
+ </message>
+ <message>
+ <source>The SIP user name given to you by your provider. It is the user part in your SIP address, &lt;b&gt;username&lt;/b&gt;@domain.com This could be a telephone number.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>Uživatelské jméno, které vám bylo přiděleno vaším VoIP poskytovatelem. Je první částí vaší kompletní SIP adresy &lt;b&gt;uzivatel&lt;/b&gt;@domain.com
+Mnozí VoIP poskytovatelé toto označují jako telefonní číslo.
+&lt;br&gt;&lt;br&gt;
+*ÚDAJE V TOMTO ŘÁDKU JSOU POVINNÉ.</translation>
+ </message>
+ <message>
+ <source>The domain part of your SIP address, username@&lt;b&gt;domain.com&lt;/b&gt;. Instead of a real domain this could also be the hostname or IP address of your &lt;b&gt;SIP proxy&lt;/b&gt;. If you want direct IP phone to IP phone communications then you fill in the hostname or IP address of your computer.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>Doména nebo IP adresa, pod kterou jste vedeni u vašeho VoIP poskytovatele, popř. dosažitelný v internetu. Je to druhá část vaší kompletní SIP adresy uzivatel@&lt;b&gt;domain.com&lt;/b&gt;, popř. doména vaší SIP proxy.
+U mnohých VoIP poskytovatelů je totožná s doménou poskytovatele.
+Pro přímé propojení IP-to-IP se zde uvede jméno nebo IP, pod kterým je váš počítač dosažitelný v internetu.
+&lt;br&gt;&lt;br&gt;
+*ÚDAJE V TOMTO ŘÁDKU JSOU POVINNÉ.</translation>
+ </message>
+ <message>
+ <source>You may fill in the name of your organization. When you make a call, this might be shown to the called party.</source>
+ <translation>Zde je možné uvést jméno vaší organizace. Pokud někomu voláte, může být tento údaj zobrazen protistraně.
+Není bezpodmínečně nutné.
+Vyhněte se písmenům s diakritikou. Některé VoIP přístroje s tím mohou mít problémy.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Vaše jméno nebo přezdívka. Tato položka je volané protistraně zobrazována jako jméno volajícího.
+Údaj není nutný.
+Vyhněte se používání písmen s diakritrikou. Některé VoIP přístroje s tím mohou mít problémy.</translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation>&amp;Jméno:</translation>
+ </message>
+ <message>
+ <source>SIP authentication</source>
+ <translation>SIP přihlašovací údaje</translation>
+ </message>
+ <message>
+ <source>&amp;Realm:</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Authentication &amp;name:</source>
+ <translation>Přihlašovací &amp;jméno:</translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>&amp;Heslo:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>&quot;Realm&quot; hodnota pro přihlášení. Možné přeložit jako &quot;oblast&quot;. Tento údaj vám poskytne váš SIP poskytovatel. Pokud zůstane pole prázdné, pokusí se Twinkle při každém Realm dotazu o přihlášení s vaším uživatelským jménem a heslem.</translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation>Vaše přihlašovací SIP jméno. Je často identické s vaším uživatelským SIP jménem. Potom jej lze vynechat. Pokud tomu tak není, poskytne vám ho váš SIP poskytovatel.</translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation>Vaše přihlašovací SIP heslo. Pokud toto políčko zůstane nevyplněné, je nutné heslo zadat vždy při spuštění programu při navázání kontaktu. </translation>
+ </message>
+ <message>
+ <source>Registrar</source>
+ <translation>Registrar (přihlašovací server) </translation>
+ </message>
+ <message>
+ <source>&amp;Registrar:</source>
+ <translation>&amp;Registrar:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Doména, IP adresa nebo jméno vašeho SIP přihlašovacího serveru. Pokud použijete outbond proxy, která je totožná s vaším SIP poskytovatelem, lze toto políčko nechat prázdné a vyplnit pouze adresu outbond proxy.</translation>
+ </message>
+ <message>
+ <source>&amp;Expiry:</source>
+ <translation>&amp;Platnost:</translation>
+ </message>
+ <message>
+ <source>The registration expiry time that Twinkle will request.</source>
+ <translation>Doba platnosti přihlášení v sekundách, kterou si Twinkle při přihlášení vyžádá. Po uplynutí této doby se Twinkle přihlásí automaticky znovu. Pokud tak neučiní, váš poskytovatel to vyhodnotí jako stav, že je váš telefon offline a tedy nedostupný pro volání. Také změny vaší IP adresy, např. po odpojení a opětovném připojení do sítě s přidělením nové IP adresy jsou brány do úvahy až po uplynutí této doby.
+Hodnoty pod 120 nejsou doporučeny. Standardně: 3600 (=1h).</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>sekund</translation>
+ </message>
+ <message>
+ <source>Re&amp;gister at startup</source>
+ <translation>Přihlásit při spuštění &amp;profilu</translation>
+ </message>
+ <message>
+ <source>Alt+G</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Pokud je aktivováno, Twinkle se při otevření tohoto uživatelského profilu automaticky pokouší přihlásit k vašemu poskytovateli. Přesněji řečeno k přihlašovacímu SIP serveru.
+Pro přímé propojení telefonů IP-to-IP neexistuje žádný poskytovatel a tato volba by měla být vypnutá.</translation>
+ </message>
+ <message>
+ <source>Outbound Proxy</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Use outbound proxy</source>
+ <translation>&amp;Použít Outbound-Proxy</translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Pokud je aktivováno, použije Twinkle outbound proxy pro odcházející volání na kterou budou zasílány SIP dotazy. Outbond proxy je možno přeložit jako &quot;zprostředkovatele&quot;. Toto může být např. SIP gateway vaší firemní sítě.
+Bez uvedení outbound proxy se Twinkle sám pokusí zjistit IP adresu k volané telefonnímu číslu/adrese.</translation>
+ </message>
+ <message>
+ <source>Outbound &amp;proxy:</source>
+ <translation>Outbound &amp;proxy:</translation>
+ </message>
+ <message>
+ <source>&amp;Send in-dialog requests to proxy</source>
+ <translation>Poslat In-&amp;Dialog dotaz na proxy</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Pokud je aktivováno, jsou SIP dotazy posílány &lt;b&gt;vždy&lt;/b&gt; na Outbound-Proxy. Normálně totiž Twinkle posílá SIP dotazy během SIP dialogu (t.j během probíhajícího hovoru) na adresu obdrženou na počátku volání v kontaktní hlavičce. Tedy přímo protistraně.</translation>
+ </message>
+ <message>
+ <source>&amp;Don&apos;t send a request to proxy if its destination can be resolved locally.</source>
+ <translation>&amp;Neposílat SIP dotazy na proxy, pokud tato není dosažitelná. Dotazy poslat přímo.</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.)</source>
+ <translation>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 dotaz bude v tomto případě poslán na proxy, jen pokud je aktivována předchozí volba)</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of your outbound proxy.</source>
+ <translation>Doménové jméno, IP adresa nebo jméno vaší outbound proxy.</translation>
+ </message>
+ <message>
+ <source>Co&amp;decs</source>
+ <translation>Ko&amp;deky</translation>
+ </message>
+ <message>
+ <source>Codecs</source>
+ <translation>kodeky</translation>
+ </message>
+ <message>
+ <source>Available codecs:</source>
+ <translation>Dostupné kodeky:</translation>
+ </message>
+ <message>
+ <source>G.711 A-law</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>G.711 u-law</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>GSM</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>speex-nb (8 kHz)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>speex-wb (16 kHz)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>speex-uwb (32 kHz)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>List of available codecs.</source>
+ <translation>Seznam dostupných, neaktivovaných kodeků.
+V závislosti od nastavení při kompilaci mohou být některé kodeky nepřístupné.</translation>
+ </message>
+ <message>
+ <source>Move a codec from the list of available codecs to the list of active codecs.</source>
+ <translation>Přesunout kodek ze seznamu dostupných kodeků do seznamu aktivních kodeků.</translation>
+ </message>
+ <message>
+ <source>Move a codec from the list of active codecs to the list of available codecs.</source>
+ <translation>Deaktivovat kodek.</translation>
+ </message>
+ <message>
+ <source>Active codecs:</source>
+ <translation>Aktivní kodeky:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Seznam aktivních kodeků. Tyto budou použity při navázání spojení s protistranou. Pořadí zde uvedených kodeků je zároveň pořadím v jakém budou kodeky upřednostňovány v použití.</translation>
+ </message>
+ <message>
+ <source>Move a codec upwards in the list of active codecs, i.e. increase its preference of use.</source>
+ <translation>Přesunout tento kodek směrem nahoru v seznamu kodeků. Tzn. zvýšit jeho prioritu pro použií při navázání spojení.</translation>
+ </message>
+ <message>
+ <source>Move a codec downwards in the list of active codecs, i.e. decrease its preference of use.</source>
+ <translation>Přesunout tento kodek směrem dolů v seznamu kodeků. Tzn. znížit jeho prioritu pro použií při navázání spojení.</translation>
+ </message>
+ <message>
+ <source>&amp;G.711/G.726 payload size:</source>
+ <translation>&amp;G.711/G.726 payload hodnota:</translation>
+ </message>
+ <message>
+ <source>The preferred payload size for the G.711 and G.726 codecs.</source>
+ <translation>Upřednostňovaná payload hodnota pro kodeky G.711 a G.726.</translation>
+ </message>
+ <message>
+ <source>ms</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;iLBC</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>iLBC</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>i&amp;LBC payload type:</source>
+ <translation>i&amp;LBC payload type:</translation>
+ </message>
+ <message>
+ <source>iLBC &amp;payload size (ms):</source>
+ <translation>iLBC &amp;payload &amp;hodnota (ms):</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for iLBC.</source>
+ <translation>Typ dynamické hodnoty pro použití v iLBC (96 nebo více).</translation>
+ </message>
+ <message>
+ <source>20</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>30</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>The preferred payload size for iLBC.</source>
+ <translation>Upřednostňovaná velikost payload hodnot RTP paketu pro iLBC.</translation>
+ </message>
+ <message>
+ <source>&amp;Speex</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Speex</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Perceptual &amp;enhancement</source>
+ <translation>Vylepšení &amp;kvality zvuku</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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).</source>
+ <translation>&quot;Vylepšení kvality zvuku&quot; (anglicky: perceptual enhancement) jsou určité funkce daného kodeku, které mají zajistit potlačení šumu při přihlédnutí k vlastnostem lidského sluchu. Ačkoliv dojde při použití těchto funkcí z hlediska technických parametrů přenosu k jeho zhoršení (S/N odstup šumu) a odchýlení se od originálu, je nakonec pociťováno zlepšení kvality zvuku.</translation>
+ </message>
+ <message>
+ <source>&amp;Ultra wide band payload type:</source>
+ <translation>&amp;Ultra wide band payload type:</translation>
+ </message>
+ <message>
+ <source>Alt+V</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>When enabled, voice activity detection detects whether the audio being encoded is speech or silence/background noise. VAD is always implicitly activated when encoding in VBR, so the option is only useful in non-VBR operation. In this case, Speex detects non-speech periods and encode them with just enough bits to reproduce the background noise. This is called &quot;comfort noise generation&quot; (CNG).</source>
+ <translation type="obsolete">Pokud je aktivováno, testuje systém VAD (Voice Activity Detection), jestli je právě mluveno nebo je v hovoru pauza. Zvuky které nejsou rozpoznány jako hovor jsou nahrazeny jen několika málo bity napodobující šum pozadí. To vede k redukci přenášených dat.
+Systém VAD je vždy aktivován, pokud je nastaveno kódováni s VBR.</translation>
+ </message>
+ <message>
+ <source>&amp;Wide band payload type:</source>
+ <translation>&amp;Wide band payload type:</translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Variable bit-rate (VBR) allows a codec to change its bit-rate dynamically to adapt to the &quot;difficulty&quot; 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&apos;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.</source>
+ <translation>Proměnná vzorkovací frekvence (VBR) umožní danému kodeku přizpůsobit množství dat potřebných k přenosu hovoru charakteru audio signálu. Zatímco např. některé ostré samohlásky nebo velmi proměnné pasáže potřebují velkou vzorkovací frekvenci a tím velký datový tok, tak měkké souhlásky a zvláště přestávky v hovoru (viz VAD) vystačí s malým datovým tokem. Díky VBR tak lze při dané datové rychlosti docílit lepší kvality zvuku. Anebo při dané kvalitě hovoru vystačit s nižším datovým tokem. Nevýhodou je, že při zadané kvalitě nelze předpovědět jaký velký datový tok bude ve skutečnosti. A také, že v aplikacích pracujících v reálném čase (jako je právě VoIP) je rozhodující maximální vzorkovací frekvence a ne průměrná.</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for speex wide band.</source>
+ <translation>Dynamická typová hodnota pro speex wide band (ne méně než 96).</translation>
+ </message>
+ <message>
+ <source>Co&amp;mplexity:</source>
+ <translation>Ko&amp;mplexita:</translation>
+ </message>
+ <message>
+ <source>Discontinuous transmission is an addition to VAD/VBR operation, that allows to stop transmitting completely when the background noise is stationary.</source>
+ <translation>Discontinuous transmission, přeloženo jako nesouvislý datový přenos, je rozšíření VAD/VBR přenosu. Při neměnícím se audio signálu (především v odmlkách mezi slovy) nejsou odesílána stále stejná data nýbrž dojde k úplnému přerušení posílání dat. Vede to k částečnému snížení průměrného datového toku. Při nekvalitním přenosu však tato volba může vést k poruchám zvuku, jako např. k zaseknutí určitého tónu nebo různým zkreslením.</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for speex narrow band.</source>
+ <translation>Dynamická hodnota pro speex narrow band (ne méně než 96).</translation>
+ </message>
+ <message>
+ <source>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&apos;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.</source>
+ <translation>S použitím funkce Speex může být určena komplexita (přesnost) pro daný kodek. Slouží to k zadání hloubky hledání v rozsahu od 1 do 10. Podobný princip je zaveden v kompresních programech gzip a bzip2 s volbou -1 až -9 . Za normálních podmínek je odstup šumu při komplexitě 1 o 1 až 2dB vyšší než při komplexitě 10. Nicméně CPU vytížení je asi 5x vyšší než při komplexitě 1. V praxi se osvědčilo nastavení mezi 2 až 4. Vyšší nastavení jsou vhodné přenos DTMF signálů nebo hudebního signálu.</translation>
+ </message>
+ <message>
+ <source>&amp;Narrow band payload type:</source>
+ <translation>&amp;Narrow band payload type:</translation>
+ </message>
+ <message>
+ <source>G.726</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>G.726 &amp;40 kbps payload type:</source>
+ <translation>payload type hodnota pro G.726 &amp;40 kb/s :</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 40 kbps.</source>
+ <translation>Dynamická typová hodnota pro G.726 40 kb/s (ne méně než 96).</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 32 kbps.</source>
+ <translation>Dynamická typová hodnota pro G.726 32 kb/s (ne méně než 96).</translation>
+ </message>
+ <message>
+ <source>G.726 &amp;24 kbps payload type:</source>
+ <translation>Payload hodnota pro G.726 &amp;24 kb/s :</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 24 kbps.</source>
+ <translation>Dynamická typová hodnota pro G.726 24 kb/s (ne méně než 96).</translation>
+ </message>
+ <message>
+ <source>G.726 &amp;32 kbps payload type:</source>
+ <translation>Payload type hodnota pro G.726 &amp;32 kb/s :</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 16 kbps.</source>
+ <translation>Dynamická typová hodnota pro G.726 16 kb/s (ne méně než 96).</translation>
+ </message>
+ <message>
+ <source>G.726 &amp;16 kbps payload type:</source>
+ <translation>Payload type hodnota pro G.726 &amp;16 kb/s :</translation>
+ </message>
+ <message>
+ <source>DT&amp;MF</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>DTMF</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for DTMF events (RFC 2833).</source>
+ <translation>Dynamická typová hodnota pro (RFC2833) (ne méně než 96).</translation>
+ </message>
+ <message>
+ <source>DTMF vo&amp;lume:</source>
+ <translation>DTMF &amp;hlasitost:</translation>
+ </message>
+ <message>
+ <source>The power level of the DTMF tone in dB.</source>
+ <translation>Hlasitost vysílaných DTMF tónů v dB. Jak pro reálné tóny tak i pro rozpoznávání hladiny úrovní dle RFC2833. Měla by být mezi -10 až -6.</translation>
+ </message>
+ <message>
+ <source>The pause after a DTMF tone.</source>
+ <translation>Doba prodlevy mezi dvěmi DTMF tóny. Příliš malé hodnoty mohou vést k tomu, že dva po sobě následující stejné tóny mohou splynout a nebudou rozpoznány jako dvě stejná čísla. Vyšší hodnoty nejsou na závadu, pokud ovšem není žádáno co nejrychlejší přenos DTMF signálů.</translation>
+ </message>
+ <message>
+ <source>DTMF &amp;duration:</source>
+ <translation>DTMF &amp;trvání: </translation>
+ </message>
+ <message>
+ <source>DTMF payload &amp;type:</source>
+ <translation>DTMF payload &amp;type:</translation>
+ </message>
+ <message>
+ <source>DTMF &amp;pause:</source>
+ <translation>DTMF &amp;pauza:</translation>
+ </message>
+ <message>
+ <source>dB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Duration of a DTMF tone.</source>
+ <translation>Doba trvání jednoho DTMF tónu v milisekundách. Při příliš malé hodnotě nemusí přijímací stanice odpovídající &quot;hodnoty&quot; správně rozpoznat. Hodnota 200 by měla vyhovovat u většiny i starších přístrojů.</translation>
+ </message>
+ <message>
+ <source>DTMF t&amp;ransport:</source>
+ <translation>DTMF &amp;režim:</translation>
+ </message>
+ <message>
+ <source>Auto</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>RFC 2833</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Inband</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Out-of-band (SIP INFO)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&lt;h2&gt;RFC 2833&lt;/h2&gt;
+&lt;p&gt;Send DTMF tones as RFC 2833 telephone events.&lt;/p&gt;
+&lt;h2&gt;Inband&lt;/h2&gt;
+&lt;p&gt;Send DTMF inband.&lt;/p&gt;
+&lt;h2&gt;Auto&lt;/h2&gt;
+&lt;p&gt;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.
+&lt;/p&gt;
+&lt;h2&gt;Out-of-band (SIP INFO)&lt;/h2&gt;
+&lt;p&gt;
+Send DTMF out-of-band via a SIP INFO request.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;&lt;h3&gt;RFC 2833&lt;/h3&gt;
+Vysílá DTMF tóny jako RFC 2833 telefonní signály (symboly v RTP datovém audio toku).&lt;/p&gt;
+&lt;p&gt;&lt;h3&gt;Inband&lt;/h3&gt;
+Vysílá DTMF inband (skutečné tóny, které Twinkle přimíchá do audio signálu).&lt;/p&gt;
+&lt;p&gt;&lt;h3&gt;Auto&lt;/h3&gt;
+Pokud protistrana podporuje RFC 2833 jsou použity DTMF tóny dle RFC 2833 standardu, jinak jako Inband.&lt;/p&gt;
+&lt;p&gt;&lt;h3&gt;Out-of-band (SIP INFO)&lt;/h3&gt;
+Vysílá DTMF out-of-band pouze přes SIP INFO požadavek.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Obecné</translation>
+ </message>
+ <message>
+ <source>Redirection</source>
+ <translation>Přesměrování pro odchozí volání</translation>
+ </message>
+ <message>
+ <source>&amp;Allow redirection</source>
+ <translation>Povolit &amp;přesměrování</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should redirect a request if a 3XX response is received.</source>
+ <translation>Pokud je aktivováno, Twinkle sleduje zda volaná protistrana vyšle požadavek (3XX). Pokud ano, dojde k přesměrování.</translation>
+ </message>
+ <message>
+ <source>Ask user &amp;permission to redirect</source>
+ <translation>Dotázat se uživatele před &amp;přesměrováním</translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation>Alt+W</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should ask the user before redirecting a request when a 3XX response is received.</source>
+ <translation>Pokud je aktivováno, dotáže se Twinkle při přijmutí požadavku 3XX uživatele, zdali má být odchozí volání přesměrováno na nový cíl.</translation>
+ </message>
+ <message>
+ <source>Max re&amp;directions:</source>
+ <translation>Max. počet &amp;přesměrování:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Počet přesměrování odchozího volání (z A do B do C atd.), po kterém Twinkle ukončí pokusy navázat spojení. Zabraňuje zacyklení při přesměrování (A -&gt; B -&gt; A...).</translation>
+ </message>
+ <message>
+ <source>Protocol options</source>
+ <translation>Nastavení SIP protokolu</translation>
+ </message>
+ <message>
+ <source>Call &amp;Hold variant:</source>
+ <translation>Standard volání a &amp;podržení volání:</translation>
+ </message>
+ <message>
+ <source>RFC 2543</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>RFC 3264</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Výběr zdali bude k podržení hovoru použito RFC 2543 (set media IP address in SDP to 0.0.0.0) nebo RFC 3264 (use direction attributes in SDP).</translation>
+ </message>
+ <message>
+ <source>Allow m&amp;issing Contact header in 200 OK on REGISTER</source>
+ <translation>Povolit chybějící kontaktní hlavičku v 200 OK při REG&amp;ISTER</translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Odpověď &quot;200 OK&quot; na požadavek &quot;REGISTER&quot; musí obsahovat kontaktní hlavičku. Někteří poskytovatelé buď neposílají kontaktní hlavičku anebo posílají chybnou kontaktní hlavičku. Pokud je aktivováno, pokusí se Twinkle tuto chybu opravit.</translation>
+ </message>
+ <message>
+ <source>&amp;Max-Forwards header is mandatory</source>
+ <translation>&amp;Max-Forwards-Header je vyžadován</translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Podle RFC3261 je Max-Forwards header povinný. Často však není posílán. Pokud je aktivováno, odmítne Twinkle SIP požadavky, které neobsahují Max-Forwards header.</translation>
+ </message>
+ <message>
+ <source>Put &amp;registration expiry time in contact header</source>
+ <translation>Vložit do kontaktní hlavičky dobu platnosti při&amp;hlášení</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Doba vypršení platnosti přihlášení v REGISTER požadavku může být přenášena jak v Contact-Header tak i v Expires-Header. Pokud je aktivováno, posílá ji Twinkle v Contact-header. Jinak v Expires-header.</translation>
+ </message>
+ <message>
+ <source>&amp;Use compact header names</source>
+ <translation>Použít &amp;kompaktní jména hlaviček</translation>
+ </message>
+ <message>
+ <source>Indicates if compact header names should be used for headers that have a compact form.</source>
+ <translation>Pokud je aktivováno, bude pro jména hlaviček použita krátká forma (pokud existuje).</translation>
+ </message>
+ <message>
+ <source>Allow SDP change during call setup</source>
+ <translation>Povolit SDP změny při navázání volání</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;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.&lt;/p&gt;
+&lt;p&gt;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.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;SIP UAS může odesílat SDP v 1XX odpovědi na &quot;early media&quot;, např. &quot;vyzváněcí tón&quot;. Pokud bude volání přijmuto, měl by poslat SIP UAS to samé SDP v odpovědí &quot;200 OK&quot;. Po přijmutí SDP by měly být všechny následující SDP odpovědi ignorovány. Takto je to definováno v RFC 3261.&lt;/p&gt;
+&lt;p&gt;Pokud je povoleno, že se SDP během navázání hovoru může změnit, Twinkle neignoruje v následujících odpovědích SDP, nýbrž změní požadovaným způsobem vlastnosti RTP média streamu (např. kodek). Změněné SDP musí mít v &quot;o=&quot; řádku nové číslo verze.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Twinkle creates a unique contact header value by combining the SIP user name and domain:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;tt&gt;&amp;nbsp;user_domain@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+This way 2 user profiles, having the same user name but different domain names, have unique contact addresses and hence can be activated simultaneously.
+&lt;/p&gt;
+&lt;p&gt;
+Some proxies do not handle a contact header value like this. You can disable this option to get a contact header value like this:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;tt&gt;&amp;nbsp;user@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+This format is what most SIP phones use.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Pokud je aktivováno, vytvoří Twinkle jednoznačnou hodnotu kontaktní hlavičky pomocí kombinace uživatelského SIP jména a doménového jména:
+&lt;br&gt;
+&lt;tt&gt;&amp;nbsp;user_domain@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+Je tím umožněno vytvoření vícera uživatelských profilů se stejným uživatelským SIP jménem ale s rozdílnými kontaktními adresami v doméně. Tyto profily lze potom použít současně.
+&lt;/p&gt;
+&lt;p&gt;
+Mnohé proxy nemusí s takovýmito kontaktními hlavičkami umět zacházet. Pokud je tato volba deaktivována, posílá Twinkle kontaktní hlavičku v následujícím formátu:
+&lt;br&gt;
+&lt;tt&gt;&amp;nbsp;user@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+Tento formát je používán téměř všemi SIP telefony.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Používejte tuto volbu jen pokud ji skutečně potřebujete! Tedy pokud máte vícero profilů se stejným uživatelským jménem.&lt;/b&gt;&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Encode Via, Route, Record-Route as list</source>
+ <translation>Via, Route a Record-Route poslat jako &amp;seznam</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>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 zvláštní hlavičce.</translation>
+ </message>
+ <message>
+ <source>SIP extensions</source>
+ <translation>SIP rozšíření</translation>
+ </message>
+ <message>
+ <source>&amp;100 rel (PRACK):</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>disabled</source>
+ <translation>deaktivováno</translation>
+ </message>
+ <message>
+ <source>supported</source>
+ <translation>podporováno</translation>
+ </message>
+ <message>
+ <source>required</source>
+ <translation>vyžadováno</translation>
+ </message>
+ <message>
+ <source>preferred</source>
+ <translation>upřednostňováno</translation>
+ </message>
+ <message>
+ <source>Indicates if the 100rel extension (PRACK) is supported:&lt;br&gt;&lt;br&gt;
+&lt;b&gt;disabled&lt;/b&gt;: 100rel extension is disabled
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;supported&lt;/b&gt;: 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.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;required&lt;/b&gt;: 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.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;preferred&lt;/b&gt;: 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.</source>
+ <translation>Definuje způsob podpory 100rel extension (PRACK):&lt;br&gt;&lt;br&gt;
+&lt;b&gt;deaktivováno&lt;/b&gt;: 100rel rozšíření není podporováno
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;povoleno&lt;/b&gt;: 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ěď.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;vyžadováno&lt;/b&gt;: 100rel je vyžádán. Požadavek je vložen do hlavičky &quot;require header&quot; v odchozím INVITE. Pokud protistrana pošle INVITE (=zavolá) a následně signalizuje, že je 100rel podporován, Twinkle si vyžádá PRACK při zasílání odpovědi 1xx. Pokud protistrana 100rel nepodporuje, nedojde k navázání spojení.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;Upřednostňováno&lt;/b&gt;: Podobně jako &quot;vyžadováno&quot;, kromě toho, že dojde k navázání hovoru i když protistrana 100rel nepodporuje.
+
+Toto nastavení ovlivňuje chování při &quot;early media&quot; (např. při znaku &quot;volné linky&quot;).</translation>
+ </message>
+ <message>
+ <source>REFER</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Call transfer (REFER)</source>
+ <translation>Přesměrování volání (REFER)</translation>
+ </message>
+ <message>
+ <source>Allow call &amp;transfer (incoming REFER)</source>
+ <translation type="obsolete">Povolit protistraně přesměrování &amp;volání (příchozí REFER)</translation>
+ </message>
+ <message>
+ <source>Alt+T</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should transfer a call if a REFER request is received.</source>
+ <translation>Pokud je aktivováno, Twinkle následuje požadavek protistrany (REFER) přesměrovat volání na jinou adresu. Při tomto vám mohou vzniknout dodatečné finanční výdaje.</translation>
+ </message>
+ <message>
+ <source>As&amp;k user permission to transfer</source>
+ <translation>Dotázat se uživatele na &amp;povolení</translation>
+ </message>
+ <message>
+ <source>Alt+K</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should ask the user before transferring a call when a REFER request is received.</source>
+ <translation>Pokud je aktivováno, dotazuje se Twinkle při příchozím (REFER) požadavku na povolení přesměrování. Oproti pevné nebo GSM síti nepřebírá náklady hovoru ten, kdo volání přesměrovává, nýbrž ten kdo volání iniciuje.</translation>
+ </message>
+ <message>
+ <source>Hold call &amp;with referrer while setting up call to transfer target</source>
+ <translation>T&amp;winkle mezitím co zprostředkuje přesměrování, podrží hovor</translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should put the current call on hold when a REFER request to transfer a call is received.</source>
+ <translation>Pokud je aktivováno, Twinkle při příchozím požadavku REFER na přesměrování podrží stávající hovor. Normálně by to měla provést zprostředkovávající protistrana. Viz následující volbu. Standardně je to vypnuto.</translation>
+ </message>
+ <message>
+ <source>Ho&amp;ld call with referee before sending REFER</source>
+ <translation>Twink&amp;le předtím než pošle signál REFER, podrží hovor jako zprostředkovatel</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should put the current call on hold when you transfer a call.</source>
+ <translation>Pokud je aktivováno, Twinkle jako zprostředkovatel, předtím než pošle protistraně požadavek REFER o přesměrování, přepne stávající hovor do stavu podržení. Viz předchozí volba.
+Standardně: aktivováno.</translation>
+ </message>
+ <message>
+ <source>Auto re&amp;fresh subscription to refer event while call transfer is not finished</source>
+ <translation>Automaticky obnovovat registraci &amp;pro REFER signál, dokud není přesměrování dokončeno</translation>
+ </message>
+ <message>
+ <source>Alt+F</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Během přesměrování hovoru posílá zprostředkovatel přesměrování zprávy NOTIFY o postupu přesměrování na toho, jehož volání je přesměrováváno. Ovšem jen po krátkou dobu. Tu určí ten, kdo je přesměrováván. Pokud je tato volba aktivována, posílá zprostředkovatel (Twinkle) automaticky SUBCRIBEs tak, aby došlo k prodloužení tohoto času, dokud není proces přesměrování ukončen.</translation>
+ </message>
+ <message>
+ <source>NAT traversal</source>
+ <translation>NAT traversal</translation>
+ </message>
+ <message>
+ <source>&amp;NAT traversal not needed</source>
+ <translation>&amp;NAT traversal není nutný</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Choose this option when there is no NAT device between you and your SIP proxy or when your SIP provider offers hosted NAT traversal.</source>
+ <translation>Vybrat tuto volbu, pokud se mezi Twinkle a vaší SIP proxy nenachází žádný NAT (router).
+Anebo pokud sice NAT existuje, ale je konfigurovaný tak, že potřebné porty jsou již na vás přesměrované. Popřípadě pokud váš SIP poskytovatel podporuje &quot;hosted NAT traversal&quot; (způsob jak VoIP poskytovatelé dokáží obejít problémy s NAT).</translation>
+ </message>
+ <message>
+ <source>&amp;Use statically configured public IP address inside SIP messages</source>
+ <translation>V SIP telegramech použít &amp;pevně nastavenou IP adresu</translation>
+ </message>
+ <message>
+ <source>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.&lt;br&gt;&lt;br&gt;
+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.</source>
+ <translation>Pokud je aktivováno, Twinkle použije uvnitř SIP zpráv (v SIP hlavičce a SDP obsahu) veřejnou IP adresu, namísto IP adresy vašeho síťového rozhraní.
+
+Pokud si tuto volbu vyberete, musíte rovněž na vašem NAT zařízení nasměrovat odpovídající RTP porty na váš počítač.</translation>
+ </message>
+ <message>
+ <source>Use &amp;STUN</source>
+ <translation type="obsolete">Použít &amp;STUN</translation>
+ </message>
+ <message>
+ <source>Choose this option when your SIP provider offers a STUN server for NAT traversal.</source>
+ <translation>Vybrat tuto volbu, pokud váš SIP poskytovatel nabízí STUN server k přemostění vaší NAT.</translation>
+ </message>
+ <message>
+ <source>S&amp;TUN server:</source>
+ <translation>Adresa S&amp;TUN serveru:</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of the STUN server.</source>
+ <translation>Doménové jméno, IP adresa nebo jméno STUN serveru (podle potřeby též včetně &quot;:&lt;portnr&gt;&quot;, např. &quot;stunsrv.cz:10000&quot;).</translation>
+ </message>
+ <message>
+ <source>&amp;Public IP address:</source>
+ <translation>Veřejná &amp;adresa:</translation>
+ </message>
+ <message>
+ <source>The public IP address of your NAT.</source>
+ <translation>Veřejná adresa (IP, DynDNS-doména), pod kterou je váš NAT (realizovaný např. na vám nejbližším routeru) dosažitelný v internetu. Tato volba má smysl jen při neměnné adrese.</translation>
+ </message>
+ <message>
+ <source>Telephone numbers</source>
+ <translation>Telefonní čísla</translation>
+ </message>
+ <message>
+ <source>Only &amp;display user part of URI for telephone number</source>
+ <translation>U telefonních čísel zobrazit jen uživatelskou část &amp;URI</translation>
+ </message>
+ <message>
+ <source>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 &quot;123456&quot; to the user. A URI indicates a telephone number if it contains the &quot;user=phone&quot; parameter or when it has a numerical user part and you ticked the next option.</source>
+ <translation>Pokud URI zjistí telefonní číslo, zobrazí se jen uživatelská část adresy. Např. pokud přijde volání od sip:12345@voipprovider.com, ukáže Twinkle jako adresu jen &quot;12345&quot;. URI je považováno jako &quot;Telefonní číslo&quot;, pokud obsahuje parametr &quot;user=phone&quot; nebo pokud je aktivní následující volba a uživatelská část adresy je numerická.</translation>
+ </message>
+ <message>
+ <source>&amp;URI with numerical user part is a telephone number</source>
+ <translation>&amp;URI s numerickou uživatelskou částí je telefonní číslo</translation>
+ </message>
+ <message>
+ <source>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 &quot;user=phone&quot; parameter to such a URI.</source>
+ <translation>Pokud je aktivováno, považuje Twinkle každou SIP adresu jako &quot;Telefonní číslo&quot;, které může mít v uživatelské části pouze číslice, *, #, + a zvláštní znaky (viz výše). V odchozím SIP zprávách označí Twinkle takové adresy parametrem &quot;user=phone&quot;.
+Pozor: Např. poskytovatel Sipgate měnil/mění výrazně své chování v mnohých funkcích, jakmile je tento parametr detekován.</translation>
+ </message>
+ <message>
+ <source>&amp;Remove special symbols from numerical dial strings</source>
+ <translation>&amp;Odstranit z vytáčecího řetězce zvláštní znaky</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Aby byla telefonní čísla snázeji čitelná, bývají často zadána s použitím zvláštních znaků jako např. &quot;(&quot;, &quot;)&quot;, &quot; &quot;(prázdný znak), &quot;-&quot;. Při vytáčení, obzvláště nějaké SIP adresy, nesmí být tyto znaky vysílány. Aby bylo možné zjednodušit vytáčení pomocí copy/paste nebo přímým nakliknutím v adresáři, lze Twinkle zadat seznam nepřípustných znaků. Ty budou před samotným vytáčením automaticky z adresy odstraněny.</translation>
+ </message>
+ <message>
+ <source>&amp;Special symbols:</source>
+ <translation>nepřípustné &amp;zvláštní znaky:</translation>
+ </message>
+ <message>
+ <source>The special symbols that may be part of a telephone number for nice formatting, but must be removed when dialing.</source>
+ <translation>Seznam všech zvláštních znaků, které má Twinkle z vytáčených čísel odstranit.</translation>
+ </message>
+ <message>
+ <source>Number conversion</source>
+ <translation>Převod čísel</translation>
+ </message>
+ <message>
+ <source>Match expression</source>
+ <translation>Vyhledávaný výraz</translation>
+ </message>
+ <message>
+ <source>Replace</source>
+ <translation>Nahradit</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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 &apos;00&apos; instead of the &apos;+&apos;, or you are at the office and all your numbers need to be prefixed with a &apos;9&apos; to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings.
+&lt;/p&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;p&gt;
+The number conversion rules are also applied to incoming calls, so the numbers are displayed in the format you want.
+&lt;/p&gt;
+&lt;h3&gt;Example 1&lt;/h3&gt;
+&lt;p&gt;
+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 &apos;+31&apos; and replace it by a &apos;0&apos;. For dialling numbers abroad you just want to replace the &apos;+&apos; by &apos;00&apos;.
+&lt;/p&gt;
+&lt;p&gt;
+The following rules will do the trick:
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expression = \+31([0-9]*) , Replace = 0$1&lt;br&gt;
+Match expression = \+([0-9]*) , Replace = 00$1&lt;/br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;h3&gt;Example 2&lt;/h3&gt;
+&lt;p&gt;
+You are at work and all telephone numbers starting with a 0 should be prefixed with a 9 for an outside line.
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expression = 0[0-9]* , Replace = 9$&amp;&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;</source>
+ <translation>&lt;p&gt;
+Č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 &quot;+&quot; a národním kódem země očekává váš poskytovatel namísto &quot;00&quot; znak &quot;+&quot;. 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.
+&lt;/p&gt;
+&lt;p&gt;
+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 &quot;(&quot; &quot;)&quot; v hledaném výrazu (např. &quot;([0-9]*)&quot; pro &quot;jakkoliv mnoho čísel&quot;) je nahrazena znaky v odpovídajících proměnných. Např. &quot;$1&quot; pro první pozici. Viz též `man 7 regex` nebo konqueror:&quot;#regex&quot;. Pokud není nalezen žádný odpovídající hledaný vzor, zůstane číslo nezměněno.
+&lt;/p&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;h3&gt;1. příklad&lt;/h3&gt;
+&lt;p&gt;
+Např. váš národní kód je &quot;420&quot; 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 &apos;+420&apos; za &apos;0&apos; a zároveň pro zahraniční hovory nahradit &apos;+&apos; za &apos;00&apos;.
+&lt;/p&gt;
+&lt;p&gt;
+K tomu jsou potřebné následující pravidla uvedená v tomto pořadí:
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Hledaný výraz = \+49([0-9]*) , Náhrada = 0$1&lt;br&gt;
+Hledaný výraz = \+([0-9]*) , Náhrada = 00$1&lt;/br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;h3&gt;2. příklad&lt;/h3&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Hledaný výraz = 0[0-9]* , Náhrada = 9$&amp;&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+( $&amp; je speciální proměnná, do které je uloženo celé originální číslo)&lt;br&gt;
+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 - &quot;57$1&quot; a &quot;577$1&quot;</translation>
+ </message>
+ <message>
+ <source>Move the selected number conversion rule upwards in the list.</source>
+ <translation>Posunout vybrané pravidlo konverze na vyšší pozici.</translation>
+ </message>
+ <message>
+ <source>Move the selected number conversion rule downwards in the list.</source>
+ <translation>Posunout vybrané pravidlo konverze na nižší pozici.</translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation>&amp;Nové</translation>
+ </message>
+ <message>
+ <source>Add a number conversion rule.</source>
+ <translation>Vytvořit nové konverzní pravidlo.</translation>
+ </message>
+ <message>
+ <source>Re&amp;move</source>
+ <translation>&amp;Odstranit</translation>
+ </message>
+ <message>
+ <source>Remove the selected number conversion rule.</source>
+ <translation>Smazat vybrané konverzní pravidlo.</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>U&amp;pravit</translation>
+ </message>
+ <message>
+ <source>Edit the selected number conversion rule.</source>
+ <translation>Upravit vybrané konverzní pravidlo.</translation>
+ </message>
+ <message>
+ <source>Type a telephone number here an press the Test button to see how it is converted by the list of number conversion rules.</source>
+ <translation>Pro ověření funkčnosti vytvořeného konverzního pravidla, napište zde zkušební telefonní číslo a stiskněte &quot;Test&quot;.</translation>
+ </message>
+ <message>
+ <source>&amp;Test</source>
+ <translation>&amp;Otestovat</translation>
+ </message>
+ <message>
+ <source>Test how a number is converted by the number conversion rules.</source>
+ <translation>Otestovat jak bude číslo převedeno konverzními pravidly.</translation>
+ </message>
+ <message>
+ <source>for STUN</source>
+ <translation type="obsolete">pro STUN</translation>
+ </message>
+ <message>
+ <source>Keep alive timer for the STUN protocol. If you have enabled STUN, then Twinkle will send keep alive packets at this interval rate to keep the address bindings in your NAT device alive.</source>
+ <translation type="obsolete">Časový signál pro STUN protokol. Pokud je STUN aktivován, bude Twinkle posílat pravidelně v zadaném časovém odstupu datové STUN-keep-alive pakety. Cílem je, aby nedošlo na routeru ke smazání příslušnosti mezi externí a interní IP adresou z adresní NAT tabulky a docházelo k pravidelnému prodlužování platnosti záznamu. Tato hodnota je proto závislá od konkrétního NATu a neměla by být příliš velká.</translation>
+ </message>
+ <message>
+ <source>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 &quot;480 User Not Responding&quot;.</source>
+ <translation>Pokud je detekováno příchozí volání, spustí se tento časovač. Pokud nebude volání do konce vypršení časové prodlevy přijato, vyšle Twinkle signál &quot;480 User Not Responding&quot; a hovor odmítne.</translation>
+ </message>
+ <message>
+ <source>NAT &amp;keep alive:</source>
+ <translation>&amp;STUN NAT-keep-alive:</translation>
+ </message>
+ <message>
+ <source>&amp;No answer:</source>
+ <translation>&quot;&amp;Nedostupný&quot; po:</translation>
+ </message>
+ <message>
+ <source>Ring &amp;back tone:</source>
+ <translation>Tón &amp;volné linky:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Specify the file name of a .wav file that you want to be played as ring back tone for this user.
+&lt;/p&gt;
+&lt;p&gt;
+This ring back tone overrides the ring back tone settings in the system settings.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Zadejte zde jméno .wav souboru pro signál volné linky v tomto uživatelském profilu.&lt;/p&gt;
+
+&lt;p&gt;Tento tón nahrazuje tón volné linky ze systémového nastavení.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Specify the file name of a .wav file that you want to be played as ring tone for this user.
+&lt;/p&gt;
+&lt;p&gt;
+This ring tone overrides the ring tone settings in the system settings.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Zadejte zde jméno .wav souboru pro vyzváněcí tón v tomto uživatelském profilu.&lt;/p&gt;
+
+&lt;p&gt;Toto nastavení nahrazuje vyzváněcí tón ze systémového nastavení.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Ring tone:</source>
+ <translation>&amp;Vyzváněcí tón:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you release a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing SIP BYE request are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=local_release&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the BYE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Tento skript bude spuštěn, pokud je nějaký hovor ukončen z vaší strany.
+&lt;/p&gt;
+&lt;h3&gt;Systémové proměnné&lt;/h3&gt;
+&lt;p&gt;
+Obsahy všech SIP hlaviček odesílaných SIP BYE požadavků budou předány tomuto skriptu pomocí následujících systémových proměnných:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=local_release&lt;/b&gt;.
+&lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;.
+&lt;b&gt;SIPREQUEST_URI&lt;/b&gt; obsahuje request-URI metody BYE.
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; obsahuje jméno aktivního uživatelského profilu.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when an incoming call fails.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing SIP failure response are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_failed&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; contains the status code of the failure response. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Tento skript bude spuštěn, pokud nebude příchozí hovor přijat. Tzn. ukončí se vyzvánění aniž by byl &quot;zvednuto&quot;.
+&lt;/p&gt;
+&lt;h3&gt;Systémové proměnné&lt;/h3&gt;
+&lt;p&gt;
+Obsahy všech SIP hlaviček odesílaných SIP failure odpovědí budou předány tomuto skriptu pomocí následujících systémových proměnných:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_failed&lt;/b&gt;.
+&lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; obsahuje stavový kód odesílané SIP failure odpovědi.
+&lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; obsahuje &quot;reason phrase&quot;, tedy chybovou příčinu pomocí obyčejného textu.
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; obsahuje jméno aktivního uživatelského profilu.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when the remote party releases a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming SIP BYE request are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=remote_release&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the BYE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Tento skript je spuštěn, pokud je hovor ukončen protistranou.
+&lt;/p&gt;
+&lt;h3&gt;Systémové proměnné&lt;/h3&gt;
+&lt;p&gt;
+Obsahy všech SIP hlaviček příchozích SIP BYE požadavků budou předány tomuto skriptu pomocí následujících systémových proměnných:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=remote_release&lt;/b&gt;.
+&lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;.
+&lt;b&gt;SIPREQUEST_URI&lt;/b&gt; obsahuje request-URI signálu BYE.
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; obsahuje jméno aktivního uživatelského profilu.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when the remote party answers your call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming 200 OK are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_answered&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Tento skript bude spuštěn, pokud bude protistranou volání přijato.
+&lt;/p&gt;
+&lt;h3&gt;Systémové proměnné&lt;/h3&gt;
+&lt;p&gt;
+Obsahy všech SIP hlaviček příchozích &quot;200 OK&quot; hlášek budou předány tomuto skriptu pomocí následujících systémových proměnných:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_answered&lt;/b&gt;.
+&lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;.
+&lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; obsahuje &quot;reason phrase&quot;
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; obsahuje jméno aktivního uživatelského profilu.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you answer an incoming call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing 200 OK are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_answered&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Tento skript bude spuštěn, pokud bude příchozí hovor přijmut.
+&lt;/p&gt;
+&lt;h3&gt;Systémové proměnné&lt;/h3&gt;
+&lt;p&gt;
+Obsahy všech SIP hlaviček odchozích &quot;200 OK&quot; odpovědí budou předány tomuto skriptu pomocí následujících systémových proměnných:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_answered&lt;/b&gt;.
+&lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;.
+&lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; obsahuje &quot;reason phrase&quot;
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; obsahuje jméno aktivního uživatelského profilu.</translation>
+ </message>
+ <message>
+ <source>Call released locall&amp;y:</source>
+ <translation>Lokální &amp;ukončení hovoru:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when an outgoing call fails.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming SIP failure response are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_failed&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; contains the status code of the failure response. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Tento skript bude spuštěn, pokud odchozí volání nebude moci býti realizováno. Např kvůli timeout, DND atd.
+&lt;/p&gt;
+&lt;h3&gt;Systémové proměnné&lt;/h3&gt;
+&lt;p&gt;
+Obsah všech SIP hlaviček přijatých SIP failure odpovědí bude předán tomuto skriptu pomocí následujících systémových proměnných:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_failed&lt;/b&gt;.
+&lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; obsahuje stavový kód odeslané SIP failure odpovědi.
+&lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; obsahuje &quot;reason phrase&quot;, tedy chybovou hlášku ve formě jednoduchého textu.
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; obsahuje jméno aktivního uživatelského profilu.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you make a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing INVITE are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=INVITE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the INVITE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Tento skript bude spuštěn, pokud bude zahájeno nějaké volání.
+&lt;/p&gt;
+&lt;h3&gt;Systémové proměnné&lt;/h3&gt;
+&lt;p&gt;
+Obsahy všech SIP hlaviček odeslaných SIP INVITE požadavků budou předány tomuto skriptu pomocí následujících systémových proměnných:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call&lt;/b&gt;.
+&lt;b&gt;SIPREQUEST_METHOD=INVITE&lt;/b&gt;.
+&lt;b&gt;SIPREQUEST_URI&lt;/b&gt; obsahuje request-URI signálu INVITE.
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; obsahuje jméno aktivního uživatelského profilu.</translation>
+ </message>
+ <message>
+ <source>Outgoing call a&amp;nswered:</source>
+ <translation>Volání &amp;přijato protistranou:</translation>
+ </message>
+ <message>
+ <source>Incoming call &amp;failed:</source>
+ <translation>Příchozí volání bylo &amp;neúspěšné:</translation>
+ </message>
+ <message>
+ <source>&amp;Incoming call:</source>
+ <translation>&amp;Příchozí volání:</translation>
+ </message>
+ <message>
+ <source>Call released &amp;remotely:</source>
+ <translation>Ukončení &amp;hovoru protistranou: </translation>
+ </message>
+ <message>
+ <source>Incoming call &amp;answered:</source>
+ <translation>Příchozí volání &amp;přijato:</translation>
+ </message>
+ <message>
+ <source>O&amp;utgoing call:</source>
+ <translation>Odchozí &amp;volání:</translation>
+ </message>
+ <message>
+ <source>Out&amp;going call failed:</source>
+ <translation>Od&amp;chozí volání bylo neúspěšné:</translation>
+ </message>
+ <message>
+ <source>&amp;Enable ZRTP/SRTP encryption</source>
+ <translation>Aktivovat ZRTP/SRTP &amp;šifrování</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>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 nezakódován.</translation>
+ </message>
+ <message>
+ <source>ZRTP settings</source>
+ <translation>ZRTP nastavení</translation>
+ </message>
+ <message>
+ <source>O&amp;nly encrypt audio if remote party indicated ZRTP support in SDP</source>
+ <translation>&amp;Zašifrovat jen pokud protistrana potvrdí podporu ZRTP </translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Protistrana schopná ZRTP může toto oznámit již na začátku navázání rozhovoru. Pokud je aktivována tato volba, pokusí se Twinkle v takových případech použít zašifrovaného přenosu hovoru.</translation>
+ </message>
+ <message>
+ <source>&amp;Indicate ZRTP support in SDP</source>
+ <translation>ZRTP podporu ohlašovat &amp;v SDP</translation>
+ </message>
+ <message>
+ <source>Twinkle will indicate ZRTP support during call setup in its signalling.</source>
+ <translation>Pokud je aktivováno, hlásí Twinkle protistraně při navázání hovoru pomocí SDP, že podporuje ZRTP.</translation>
+ </message>
+ <message>
+ <source>&amp;Popup warning when remote party disables encryption during call</source>
+ <translation>&amp;Upozornit, pokud protistrana přepne na nešifrovaný přenos hovoru</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Protistrana může během zašifrovaného hovoru vyslat příkaz ZRTP-go-clear a tím šifrování zrušit. Pokud je tato volba aktivována, Twinkle na tento bezpečnostní problém okamžitě upozorní.</translation>
+ </message>
+ <message>
+ <source>Dynamic payload type %1 is used more than once.</source>
+ <translation>Dynamický payload typ %1 je použit vícekrát.</translation>
+ </message>
+ <message>
+ <source>You must fill in a user name for your SIP account.</source>
+ <translation>Je nutné zadat uživatelské jméno pro váš SIP účet.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>K vašemu SIP účtu musíte vyplnit doménové jméno. (část vpravo od znaku @)
+Často je shodné s doménovým jménem vašeho SIP poskytovatele.
+
+Pro přímé IP-to-IP spojení, tedy bez SIP poskytovatele, je to doménové jméno nebo veřejná IP adresa vašeho počítače. </translation>
+ </message>
+ <message>
+ <source>Invalid user name.</source>
+ <translation>Chybné uživatelské jméno.</translation>
+ </message>
+ <message>
+ <source>Invalid domain.</source>
+ <translation>Chybné jméno domény.</translation>
+ </message>
+ <message>
+ <source>Invalid value for registrar.</source>
+ <translation>Chybné jméno registrátora.</translation>
+ </message>
+ <message>
+ <source>Invalid value for outbound proxy.</source>
+ <translation>Chybné jméno outbound proxy.</translation>
+ </message>
+ <message>
+ <source>Value for public IP address missing.</source>
+ <translation>Chybí veřejná IP adresa.</translation>
+ </message>
+ <message>
+ <source>Invalid value for STUN server.</source>
+ <translation>Chybný údaj STUN serveru.</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Vyzváněcí tóny</translation>
+ </message>
+ <message>
+ <source>Choose ring tone</source>
+ <translation>Výběr vyzváněcího tónu</translation>
+ </message>
+ <message>
+ <source>Ring back tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Tón pro signalizaci vyzvánění u protistrany</translation>
+ </message>
+ <message>
+ <source>All files</source>
+ <translation>Všechny soubory</translation>
+ </message>
+ <message>
+ <source>Choose incoming call script</source>
+ <translation>Výběr skriptu ke spuštění při &quot;příchozím volání&quot;</translation>
+ </message>
+ <message>
+ <source>Choose incoming call answered script</source>
+ <translation>Výběr skriptu ke spuštění po &quot;přijetí příchozího volání&quot;</translation>
+ </message>
+ <message>
+ <source>Choose incoming call failed script</source>
+ <translation>Výběr skriptu ke spuštění po selhání příchozího volání</translation>
+ </message>
+ <message>
+ <source>Choose outgoing call script</source>
+ <translation>Výběr skriptu ke spuštění při odchozím volání</translation>
+ </message>
+ <message>
+ <source>Choose outgoing call answered script</source>
+ <translation>Výběr skriptu ke spuštění při přijetí volání protistranou</translation>
+ </message>
+ <message>
+ <source>Choose outgoing call failed script</source>
+ <translation>Výběr skriptu ke spuštění při selhání odchozího volání</translation>
+ </message>
+ <message>
+ <source>Choose local release script</source>
+ <translation>Výběr skriptu ke spuštění při vlastním ukončení hovoru</translation>
+ </message>
+ <message>
+ <source>Choose remote release script</source>
+ <translation>Výběr skriptu ke spuštění při ukončení hovoru protistranou</translation>
+ </message>
+ <message>
+ <source>Voice mail</source>
+ <translation>Záznamník hovorů</translation>
+ </message>
+ <message>
+ <source>&amp;Follow codec preference from far end on incoming calls</source>
+ <translation>Kodeky pro přenos hlasu při příchozím volání &amp;vybere protistrana</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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.
+&lt;p&gt;
+If you disable this option, then the first codec from the active codecs that is also in the SDP offer is picked.</source>
+ <translation>Pokud je aktivováno, Twinkle upřednostní při příchozím volání povolené kodeky protistrany (SDP offer). Konkrétně bude použit první kodek, který je protistranou nabízen a rovněž se nachází v seznamu lokálních Twinkle kodeků.
+Pokud je deaktivováno, použije Twinkle první kodek ve vlastním seznamu, který je rovněž podporován protistranou.</translation>
+ </message>
+ <message>
+ <source>Follow codec &amp;preference from far end on outgoing calls</source>
+ <translation>Následovat &amp;upřednostněné kodeky protistranou při odchozím volání</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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.
+&lt;p&gt;
+If you disable this option, then the first codec from the active codecs that is also in the SDP answer is picked.</source>
+ <translation>Pokud je aktivováno bude Twinkle při odchozím volání řídit seznamem upřednostňovaných kodeků u protistrany (SDP answer). Konkrétně bude použit první kodek na seznamu upřednostňovaných kodeků protistrany, který je rovněž podporován v aktuálním lokálním nastavení Twinkle.
+Pokud je deaktivováno, použije Twinkle první kodek z vlastního seznamu, který je rovněž podporován protistranou. Tzn. je uveden v SDP-Answer seznamu.</translation>
+ </message>
+ <message>
+ <source>Codeword &amp;packing order:</source>
+ <translation>Datové pořadí (codeword &amp;packing order):</translation>
+ </message>
+ <message>
+ <source>RFC 3551</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>ATM AAL2</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Existují dvě metody zařazení datových paketů G.726 do RTP paketu. Standardně je to RFC 3551. Někteří SIP poskytovatelé používají ovšem ATM AAL2. Pokud je přenos zvuku při použití kodeku G.726 zarušen, je možné zde zkusit jiné nastavení.</translation>
+ </message>
+ <message>
+ <source>Replaces</source>
+ <translation>Nahrazení</translation>
+ </message>
+ <message>
+ <source>Indicates if the Replaces-extenstion is supported.</source>
+ <translation>Pokud je aktivováno, podporuje Twinkle Replaces-Extension u metody PRACK.</translation>
+ </message>
+ <message>
+ <source>Attended refer to AoR (Address of Record)</source>
+ <translation>Přesměrování se zpětným dotazem použije &quot;Address of Record&quot;</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Přesměrování se zpětným dotazem 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á. Může být tzv. &quot;neroutovatelná&quot;. Přesměrované volání se pak nemusí dostat k cíli.
+Alternativně může Twinkle použít AoR (Address of Record). Nevýhodou je, že při více uživatelských SIP účtech nejsou přihlášená koncová zařízení jednoznačně určená. Tzn. že přeměrovávací protistranou (vlastně SIP poskytovatelem) budou oslovena všechna koncová zařízení a budou signalizovat příchozí volání.</translation>
+ </message>
+ <message>
+ <source>Privacy</source>
+ <translation>Ochrana soukromých data</translation>
+ </message>
+ <message>
+ <source>Privacy options</source>
+ <translation>Nastavení ochrany soukromých dat</translation>
+ </message>
+ <message>
+ <source>&amp;Send P-Preferred-Identity header when hiding user identity</source>
+ <translation>&amp;Posílat &quot;P-Preferred-Identity Header&quot; při skrytí identity uživatele</translation>
+ </message>
+ <message>
+ <source>Include a P-Preferred-Identity header with your identity in an INVITE request for a call with identity hiding.</source>
+ <translation>Pokud je vybráno a je aktivována volba &quot;skrýt odesilatele&quot;, bude spolu s údajem odesilatele odeslán při požadavku INVITE &quot;P-Preferred-Identity Header&quot;.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+You can customize the way Twinkle handles incoming calls. Twinkle can call a script when a call comes in. Based on the ouput 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.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Note:&lt;/b&gt; 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 &lt;b&gt;end&lt;/b&gt; and keep on running. Twinkle will continue when it receives the &lt;b&gt;end&lt;/b&gt; parameter.
+&lt;/p&gt;
+&lt;p&gt;
+With your script you can customize call handling by outputing one or more of the following parameters to stdout. Each parameter should be on a separate line.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+action=[ continue | reject | dnd | redirect | autoanswer ]&lt;br&gt;
+reason=&amp;lt;string&amp;gt;&lt;br&gt;
+contact=&amp;lt;address to redirect to&amp;gt;&lt;br&gt;
+caller_name=&amp;lt;name of caller to display&amp;gt;&lt;br&gt;
+ringtone=&amp;lt;file name of .wav file&amp;gt;&lt;br&gt;
+display_msg=&amp;lt;message to show on display&amp;gt;&lt;br&gt;
+end&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;/p&gt;
+&lt;h2&gt;Parameters&lt;/h2&gt;
+&lt;h3&gt;action&lt;/h3&gt;
+&lt;p&gt;
+&lt;b&gt;continue&lt;/b&gt; - continue call handling as usual&lt;br&gt;
+&lt;b&gt;reject&lt;/b&gt; - reject call&lt;br&gt;
+&lt;b&gt;dnd&lt;/b&gt; - deny call with do not disturb indication&lt;br&gt;
+&lt;b&gt;redirect&lt;/b&gt; - redirect call to address specified by &lt;b&gt;contact&lt;/b&gt;&lt;br&gt;
+&lt;b&gt;autoanswer&lt;/b&gt; - automatically answer a call&lt;br&gt;
+&lt;/p&gt;
+&lt;p&gt;
+When the script does not write an action to stdout, then the default action is continue.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;reason: &lt;/b&gt;
+With the reason parameter you can set the reason string for reject or dnd. This might be shown to the far-end user.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;caller_name: &lt;/b&gt;
+This parameter will override the display name of the caller.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;ringtone: &lt;/b&gt;
+The ringtone parameter specifies the .wav file that will be played as ring tone when action is continue.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+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 &lt;b&gt;SIP_&amp;lt;HEADER_NAME&amp;gt;&lt;/b&gt; E.g. SIP_FROM contains the value of the from header.
+&lt;/p&gt;
+&lt;p&gt;
+TWINKLE_TRIGGER=in_call. SIPREQUEST_METHOD=INVITE. The request-URI of the INVITE will be passed in &lt;b&gt;SIPREQUEST_URI&lt;/b&gt;. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Tento skript bude vyvolán, pokud bude detekován požadavek INVITE (volání). &lt;br&gt;
+Prostudujte si prosím příručku v &quot;/usr/share/doc/packages/twinkle/...&quot; nebo podrobnou dokumentaci na &quot;http://twinklephone.com&quot; !
+&lt;/p&gt;
+&lt;h3&gt;Vrácené hodnoty&lt;/h3&gt; - print po STDOUT (např. `echo &quot;action=dnd&quot;`), jedna hodnota na řádek: &lt;br&gt;
+&lt;tt&gt;action=[ continue | reject | dnd | redirect | autoanswer ]&lt;br&gt;&lt;/tt&gt;
+&lt;blockquote&gt;
+&lt;i&gt;continue&lt;/i&gt; - pokračovat v normálním zpracování volání (default)&lt;br&gt;
+&lt;i&gt;reject&lt;/i&gt; - odmítnout volání&lt;br&gt;
+&lt;i&gt;dnd&lt;/i&gt; - odmítnout volání s poznámkou &quot;do not disturb&quot;&lt;br&gt;
+&lt;i&gt;redirect&lt;/i&gt; - přesměrovat volání na &lt;tt&gt;contact&lt;/tt&gt; (viz tam)&lt;br&gt;
+&lt;i&gt;autoanswer&lt;/i&gt; - volání &quot;automaticky&quot; přijmout&lt;br&gt;
+&lt;/blockquote&gt;
+&lt;br&gt;
+&lt;tt&gt;reason=&amp;lt;string&amp;gt; &lt;/tt&gt;pro dnd a reject (zobrazení u protistrany)&lt;br&gt;
+&lt;tt&gt;contact=&amp;lt;přesměrovací adresa&amp;gt; &lt;/tt&gt;pro přesměrování&lt;br&gt;
+&lt;tt&gt;caller_name=&amp;lt;nové zobrazované jméno volajícího&amp;gt; &lt;/tt&gt;nahrazuje pro zobrazení eventuálně již existující jméno z INVITE&lt;br&gt;
+&lt;tt&gt;ringtone=&amp;lt;jméno .wav souboru&amp;gt; &lt;/tt&gt;vyzváněcí tón speciálně pro toto volání (jen při &lt;i&gt;continue&lt;/i&gt; ;-)&lt;br&gt;
+&lt;tt&gt;display_msg=&amp;lt;libovolná poznámka pro podrobné zobrazení v hlavním okně&amp;gt;&lt;/tt&gt;&lt;br&gt;
+&lt;tt&gt;end &lt;/tt&gt;Twinkle vyhodnotí všechny vrácené hodnoty, uzavře STDOUT skriptu(!) a pokračuje dále&lt;br&gt;
+&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+&lt;h3&gt;Systémové proměnné&lt;/h3&gt;
+&lt;p&gt;
+Hodnoty všech SIP hlaviček příchozího INVITE budou předány tomuto skriptu. Struktura proměnných: &lt;b&gt;SIP_&amp;lt;HEADER_NAME&amp;gt;&lt;/b&gt; - např. SIP_FROM obsahuje hodnotu &quot;from header&quot;.
+&lt;/p&gt;
+&lt;p&gt;
+TWINKLE_TRIGGER=in_call. &lt;br&gt;
+SIPREQUEST_METHOD=INVITE. &lt;br&gt;
+SIPREQUEST_URI obsahuje request-URI signálu INVITE.&lt;br&gt;
+TWINKLE_USER_PROFILE obsahuje jméno uživatelského profilu, pro který je příchozí volání určeno.</translation>
+ </message>
+ <message>
+ <source>&amp;Voice mail address:</source>
+ <translation>&amp;Adresa záznamníku hovorů:</translation>
+ </message>
+ <message>
+ <source>The SIP address or telephone number to access your voice mail.</source>
+ <translation>SIP adresa nebo telefonní číslo, pod kterým je dosažitelný záznamník hovorů vašeho SIP poskytovatele. Někdy jsou dána dvě čísla. Jedno pro přístup z libovolného telefonu, např. &quot;00420 211 58000111&quot;) a jedno SIP číslo, např. &quot;50000&quot;. Potom by zde mělo být uvedeno SIP číslo.</translation>
+ </message>
+ <message>
+ <source>Unsollicited</source>
+ <translation>Asterisk režim</translation>
+ </message>
+ <message>
+ <source>Sollicited</source>
+ <translation>RFC 3842</translation>
+ </message>
+ <message>
+ <source>&lt;H2&gt;Message waiting indication type&lt;/H2&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;H3&gt;Unsollicited&lt;/H3&gt;
+&lt;p&gt;
+Asterisk provides unsollicited message waiting indication.
+&lt;/p&gt;
+&lt;H3&gt;Sollicited&lt;/H3&gt;
+&lt;p&gt;
+Sollicited message waiting indication as specified by RFC 3842.
+&lt;/p&gt;</source>
+ <translation>&lt;H2&gt;Message waiting indication Typ&lt;/H2&gt;
+&lt;p&gt;
+Pokud váš SIP poskytovatel nabízí &quot;message waiting indication&quot; = upozornění na uložené zprávy v záznamníku, může vás Twinkle informovat o nových i již vyslechnutých zprávách na vašem SIP záznamníku. V závisloti od vašeho poskytovatele, popř. jím používaným typem záznamníkové služby, je nutné zde nastavit jednu z náledujících metod přístupu:
+&lt;/p&gt;
+&lt;H3&gt;Asterisk&lt;/H3&gt;
+&lt;p&gt;
+Asterisk podporuje &quot;unsollicited message waiting indication&quot;.
+&lt;/p&gt;
+&lt;H3&gt;RFC 3842&lt;/H3&gt;
+&lt;p&gt;
+&quot;Sollicited message waiting indication&quot; dle specifikace RFC 3842.
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;MWI type:</source>
+ <translation>&amp;MWI Typ:</translation>
+ </message>
+ <message>
+ <source>Sollicited MWI</source>
+ <translation>RFC 3842</translation>
+ </message>
+ <message>
+ <source>Subscription &amp;duration:</source>
+ <translation>Doba &amp;platnosti přihlášení:</translation>
+ </message>
+ <message>
+ <source>Mailbox &amp;user name:</source>
+ <translation>Uživatelské jméno &amp;mailboxu:</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of your voice mailbox server.</source>
+ <translation>Síťové jméno stanice, doménové jméno nebo IP adresa hlasového Voice-Mailbox serveru. Pokud vám váš poskytovatel k záznamníku neposkytl žádné údaje, zkuste jméno domény vašeho uživatelského účtu.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Ve specifikaci RFC 3842 MWI se koncové zařízení (Twinkle) hlásí na serveru k příjmu zpráv (SUBSCRIBE) na určitou dobu a před vypršením této doby by se přihlášení mělo znovu obnovit. Podobně jako &quot;expiry time&quot; / &quot;doba platnosti&quot; pro REGISTER. Viz SIP server.</translation>
+ </message>
+ <message>
+ <source>Your user name for accessing your voice mailbox.</source>
+ <translation>Uživatelské jméno k přístupu na váš Voice-Mailbox (záznamník hovorů). Pokud vám váš poskytovatel toto nesdělí, zkuste to s vaším SIP jménem.</translation>
+ </message>
+ <message>
+ <source>Mailbox &amp;server:</source>
+ <translation>Mailbox &amp;server:</translation>
+ </message>
+ <message>
+ <source>Via outbound &amp;proxy</source>
+ <translation>Přes Outbound &amp;proxy</translation>
+ </message>
+ <message>
+ <source>Check this option if Twinkle should send SIP messages to the mailbox server via the outbound proxy.</source>
+ <translation>Pokud je aktivováno, zasílá Twinkle SIP požadavky na Mailbox přes outbound proxy.</translation>
+ </message>
+ <message>
+ <source>You must fill in a mailbox user name.</source>
+ <translation>Musíte zadat uživatelské jméno pro Mailbox.</translation>
+ </message>
+ <message>
+ <source>You must fill in a mailbox server</source>
+ <translation>Musíte zadat Mailbox-Server</translation>
+ </message>
+ <message>
+ <source>Invalid mailbox server.</source>
+ <translation>Neplatné jméno pro Mailbox-Server.</translation>
+ </message>
+ <message>
+ <source>Invalid mailbox user name.</source>
+ <translation>Nepřípustné jméno Mailboxu.</translation>
+ </message>
+ <message>
+ <source>Use domain &amp;name to create a unique contact header value</source>
+ <translation>Použít doménové &amp;jméno pro vytvoření jednoznačné kontaktní hlavičky</translation>
+ </message>
+ <message>
+ <source>Select ring back tone file.</source>
+ <translation>Výběr souboru pro vyzváněcí tón u protistrany.</translation>
+ </message>
+ <message>
+ <source>Select ring tone file.</source>
+ <translation>Výběr souboru pro vyzváněcí tón.</translation>
+ </message>
+ <message>
+ <source>Select script file.</source>
+ <translation>Výběr souboru se skriptem.</translation>
+ </message>
+ <message>
+ <source>%1 converts to %2</source>
+ <translation>%1 převést na %2</translation>
+ </message>
+ <message>
+ <source>Instant message</source>
+ <translation>Instantní zpráva</translation>
+ </message>
+ <message>
+ <source>Presence</source>
+ <translation>Přítomnost</translation>
+ </message>
+ <message>
+ <source>&amp;Maximum number of sessions:</source>
+ <translation>&amp;Maximální počet seancí:</translation>
+ </message>
+ <message>
+ <source>When you have this number of instant message sessions open, new incoming message sessions will be rejected.</source>
+ <translation>Pokud je již otevřen tento počet seancí s instantními zprávami, nově příchozí seance budou odmítnuty.</translation>
+ </message>
+ <message>
+ <source>Your presence</source>
+ <translation>Vaše přítomnost</translation>
+ </message>
+ <message>
+ <source>&amp;Publish availability at startup</source>
+ <translation>&amp;Publikovat dostupnost při startu</translation>
+ </message>
+ <message>
+ <source>Publish your availability at startup.</source>
+ <translation>Publikovat vaši dostupnost při startu.</translation>
+ </message>
+ <message>
+ <source>Buddy presence</source>
+ <translation>Přítomnost buddyho</translation>
+ </message>
+ <message>
+ <source>Publication &amp;refresh interval (sec):</source>
+ <translation>Interval &amp;obnovení publikování (sec):</translation>
+ </message>
+ <message>
+ <source>Refresh rate of presence publications.</source>
+ <translation>Obnovovací frekvence publikování.</translation>
+ </message>
+ <message>
+ <source>&amp;Subscription refresh interval (sec):</source>
+ <translation>&amp;Interval obnovení přihlášení (sec):</translation>
+ </message>
+ <message>
+ <source>Refresh rate of presence subscriptions.</source>
+ <translation>Obnovovací frekvence přihlášení o přítomnosti.</translation>
+ </message>
+ <message>
+ <source>Transport/NAT</source>
+ <translation type="unfinished">Transport/NAT</translation>
+ </message>
+ <message>
+ <source>Add q-value to registration</source>
+ <translation>Přidat q-hodnotu k registraci</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Hodnota &apos;q&apos; určuje prioritu vašeho zaregistrovaného zařízení. Pokud je mimo Twinkle k VoIP účtu zaregistrováno jiné SIP zařízení, může síť využít těchto hodnot k určení zařízení, které bude přednostně osloveno pro obsloužení hovoru.</translation>
+ </message>
+ <message>
+ <source>The q-value is a value between 0.000 and 1.000. A higher value means a higher priority.</source>
+ <translation>Hodnota &apos;q&apos; je mezi 0.000 and 1.000 Vyšší hodnota znamená vyšší prioritu.</translation>
+ </message>
+ <message>
+ <source>SIP transport</source>
+ <translation>SIP transport</translation>
+ </message>
+ <message>
+ <source>UDP</source>
+ <translation>UDP</translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <translation>TCP</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Transportní mód pro SIP. V auto módu je velikost zpráv určena tím, jaký transportní protokol je použit. Zprávy větší než UDP threshold jsou posílány přes TCP. Menší zprávy jsou posílány přes UDP.</translation>
+ </message>
+ <message>
+ <source>T&amp;ransport protocol:</source>
+ <translation>T&amp;ransportní protokol:</translation>
+ </message>
+ <message>
+ <source>UDP t&amp;hreshold:</source>
+ <translation>UDP t&amp;hreshold:</translation>
+ </message>
+ <message>
+ <source>Messages larger than the threshold are sent via TCP. Smaller messages are sent via UDP.</source>
+ <translation>Zprávy větší než threshold jsou odeslány přes TCP. Menší zprávy přes UDP.</translation>
+ </message>
+ <message>
+ <source>Use &amp;STUN (does not work for incoming TCP)</source>
+ <translation>Použít &amp;STUN (nefunguje pro příchozí TCP)</translation>
+ </message>
+ <message>
+ <source>P&amp;ersistent TCP connection</source>
+ <translation>Tr&amp;valé TCP spojení</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Podržet otevřené TCP spojení vytvořené během registrace tak, aby SIP Proxy mohla využít tohoto spojení k vysílání příchozích požadavků. Aplikací jsou vysílány ping pakety aby se testovalo, zda-li je spojení stále aktivní.</translation>
+ </message>
+ <message>
+ <source>&amp;Send composing indications when typing a message.</source>
+ <translation>Při psaní zprávy vždy &amp;vysílat příznaky editace.</translation>
+ </message>
+ <message>
+ <source>Twinkle sends a composing indication when you type a message. This way the recipient can see that you are typing.</source>
+ <translation>Twinkle vysílá při psaní zprávy příznak editace. Díky tomu je příjemce informován o tom, že je připravována nějaká zpráva.</translation>
+ </message>
+ <message>
+ <source>AKA AM&amp;F:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A&amp;KA OP:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Authentication management field for AKAv1-MD5 authentication.</source>
+ <translation type="unfinished">Parametry autentizačního managementu pro AKAv1-MD5 autentizaci.</translation>
+ </message>
+ <message>
+ <source>Operator variant key for AKAv1-MD5 authentication.</source>
+ <translation type="unfinished">Operátorová varianta klíče pro AKAv1-MD5 autentizaci.</translation>
+ </message>
+ <message>
+ <source>Prepr&amp;ocessing</source>
+ <translation>Před&amp;zpracování</translation>
+ </message>
+ <message>
+ <source>Preprocessing (improves quality at remote end)</source>
+ <translation>Předzpracování (vylepšuje kvalitu u příjemce)</translation>
+ </message>
+ <message>
+ <source>&amp;Automatic gain control</source>
+ <translation>&amp;Automatické řízení hlasitosti</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Z důvodu velkého rozdílu hlasitosti nahrávání v různých nastavení byla zavedena funkce &amp;Automatického řízení hlasitosti (AGC - Automatic gain control). AGC umožňuje nastavit úroveň signálu na přednastavenou hodnotu. Díky tomu není nutné pokaždé manuálně nastavovat hlasitost mikrofonu. Další výhodou je, že nastavení hlasitosti mikrofonu je většinou na nižší (konzervativní) úrovni, čímž se předchází zpětnovazebnímu efektům.</translation>
+ </message>
+ <message>
+ <source>Automatic gain control &amp;level:</source>
+ <translation>&amp;Úroveň automatického řízení hlasitosti:</translation>
+ </message>
+ <message>
+ <source>Automatic gain control level represents percentual value of automatic gain setting of a microphone. Recommended value is about 25%.</source>
+ <translation>Úroveň automatického řízení hlasitosti představuje procentuální hodnotu maximální hlasitosti mikrofonu. Doporučená hodnota je kolem 25%.</translation>
+ </message>
+ <message>
+ <source>&amp;Voice activity detection</source>
+ <translation>Detekce &amp;hlasové aktivity</translation>
+ </message>
+ <message>
+ <source>When enabled, voice activity detection detects whether the input signal represents a speech or a silence/background noise.</source>
+ <translation>Pokud je aktivováno testuje funkce detekce hlasové aktivity zdali je vstupní signál hovor (hlas) nebo rušivé okolní zvuky.</translation>
+ </message>
+ <message>
+ <source>&amp;Noise reduction</source>
+ <translation>&amp;Potlačení šumu</translation>
+ </message>
+ <message>
+ <source>The noise reduction can be used to reduce the amount of background noise present in the input signal. This provides higher quality speech.</source>
+ <translation>Potlačení šumu může být použito k snížení okolních rušivých zvuků ve vstupním signálu. Vede to k lepší kvalitě mluveného slova.</translation>
+ </message>
+ <message>
+ <source>Acoustic &amp;Echo Cancellation</source>
+ <translation>Potlačení &amp;akustické ozvěny</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Pokud je při VoIP komunikaci příchozí zvuk přehráván v reproduktorech může se šířit v místnosti a dostávat se zpět do mikrofonu. Pokud je tento signál poslán zpět volajícímu stává se, že slyší dozvuk vlastního hlasu. Funkce potlačení &amp;akustické ozvěny je navržena k potlačení těchto zvuků před tím než jsou odeslány volajícímu. Je důležité si uvědomit, že tato funkce je určena pro zlepšení kvality přenosu hlasu na straně volajícího. Nikoliv na vlastní straně.</translation>
+ </message>
+ <message>
+ <source>Variable &amp;bit-rate</source>
+ <translation>Proměnná &amp;vzorkovaci frekvence</translation>
+ </message>
+ <message>
+ <source>Discontinuous &amp;Transmission</source>
+ <translation>Diskontinuitní &amp;přenos</translation>
+ </message>
+ <message>
+ <source>&amp;Quality:</source>
+ <translation>&amp;Kvalita:</translation>
+ </message>
+ <message>
+ <source>Speex is a lossy codec, which means that it achives 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.</source>
+ <translation>Speex je ztrátový kodek. To znamená, že na úkor kvality je možné docílit redukce datového toku. Na rozdíl od jiných hlasových kodeků je možné nastavit kompromis mezi kvalitou a vzorkovací frekvencí. Kódovací proces u tohoto kodeku je po většinu doby řízen nastavením parametru kvality v rozsahu od 0 do 10.</translation>
+ </message>
+ <message>
+ <source>bytes</source>
+ <translation>bajtů</translation>
+ </message>
+ <message>
+ <source>Use tel-URI for telephone &amp;number</source>
+ <translation>Použít tel-URI pro &amp;telefonní číslo</translation>
+ </message>
+ <message>
+ <source>Expand a dialed telephone number to a tel-URI instead of a sip-URI.</source>
+ <translation>Rozšířit vytáčené telefonní číslo o tel-URI namísto sip-URI.</translation>
+ </message>
+ <message>
+ <source>Accept call &amp;transfer request (incoming REFER)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allow call transfer while consultation in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable NAT &amp;keep alive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send UDP NAT keep alive packets.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WizardForm</name>
+ <message>
+ <source>Twinkle - Wizard</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of the STUN server.</source>
+ <translation>Doménové jméno, IP adresa nebo jméno STUN serveru.
+
+Twinkle se pokouší pod touto doménou zjistit u DNS serveru potřebné údaje (RFC 2782).
+Stačí proto u poskytovatelů internetové připojení, kteří toto podporují, uvést doménové jméno přihlašovacího serveru.</translation>
+ </message>
+ <message>
+ <source>S&amp;TUN server:</source>
+ <translation>S&amp;TUN server:</translation>
+ </message>
+ <message>
+ <source>The SIP user name given to you by your provider. It is the user part in your SIP address, &lt;b&gt;username&lt;/b&gt;@domain.com This could be a telephone number.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>Uživatelské jméno, které vám bylo přiděleno vaším VoIP poskytovatelem. Je také první částí vaší kompletní SIP adresy &lt;b&gt;uzivatel&lt;/b&gt;@domain.com U mnohých VoIp poskytovatelů to bývá označeno jako telefonní číslo.
+&lt;br&gt;&lt;br&gt;
+*TYTO ÚDAJE JSOU POVINNÉ.</translation>
+ </message>
+ <message>
+ <source>&amp;Domain*:</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Choose your SIP service provider. If your SIP service provider is not in the list, then select &lt;b&gt;Other&lt;/b&gt; and fill in the settings you received from your provider.&lt;br&gt;&lt;br&gt;
+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.</source>
+ <translation>Vyberte vašeho SIP poskytovatele a uveďte zde vaše plné jméno, vaše uživatelské SIP jméno, popřípadě přihlašovací jméno a heslo.&lt;br&gt;
+Pokud váš SIP poskytovatel není v seznamu, vyberte &lt;b&gt;Jiný&lt;/b&gt; a uveďte požadované údaje.
+&lt;p&gt;
+Prakticky kdekoliv v Twinkle lze pomocí klávesové kombinace &lt;b&gt;Shift-F1&lt;/b&gt; nebo &lt;b&gt;pravým tlačítkem myši&lt;/b&gt; vyvolat nápovědu k jednotlivým políčkům nebo tlačítkům.</translation>
+ </message>
+ <message>
+ <source>&amp;Authentication name:</source>
+ <translation>&amp;Přihlašovací jméno:</translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation>Vaše &amp;jméno:</translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation>Vaše přihlašovací SIP jméno. Často shodné s vaším uživatelským SIP jménem. Nicméně může být i jiné. Dostanete ho od vašeho VoIP poskytovatele.</translation>
+ </message>
+ <message>
+ <source>The domain part of your SIP address, username@&lt;b&gt;domain.com&lt;/b&gt;. Instead of a real domain this could also be the hostname or IP address of your &lt;b&gt;SIP proxy&lt;/b&gt;. If you want direct IP phone to IP phone communications then you fill in the hostname or IP address of your computer.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>Doména nebo IP adresa, pod kterou je v internetu dostupný váš VoIP poskytovatel. Je to druhá část vaší úplné SIP adresy uzivatel@&lt;b&gt;domain.com&lt;/b&gt;. U mnohých poskytovatelů je shodná s vlastní doménou poskytovatele.
+Pro přímé spojení IP-to-IP (viz uživ. příručka) se zde uvede adresa (DynDNS nebo IP), pod kterou je &lt;b&gt;váš počítač&lt;/b&gt; dostupný.
+&lt;br&gt;&lt;br&gt;
+*TYTO ÚDAJE JSOU POVINNÉ.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Vaše plné jméno nebo přezdívka. Tento údaj je jednou z částí, které jsou přenášeny při volání protistraně a eventuálně tam zobrazeny. Může být uvedeno cokoliv a není nutně vyžadováno.</translation>
+ </message>
+ <message>
+ <source>SIP pro&amp;xy:</source>
+ <translation>SIP pro&amp;xy:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Doménové jméno, IP adresa nebo jméno vaší proxy. Pokud je shodné s adresou vašeho počítače je možné tento údaj vynechat.</translation>
+ </message>
+ <message>
+ <source>&amp;SIP service provider:</source>
+ <translation>&amp;SIP VoIP poskytovatel (Shift-F1 pro nápovědu):</translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>&amp;Heslo:</translation>
+ </message>
+ <message>
+ <source>&amp;User name*:</source>
+ <translation>&amp;Uživatelské jméno *:</translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation>Vaše přihlašovací heslo. Pokud necháte toto políčko prázdné, musíte heslo při každém přihlášení vyplnit do objevivšího se dialogového okna. </translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Zrušit (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>None (direct IP to IP calls)</source>
+ <translation>Žádné (přímé IP to IP volání)</translation>
+ </message>
+ <message>
+ <source>Other</source>
+ <translation>Jiný</translation>
+ </message>
+ <message>
+ <source>User profile wizard:</source>
+ <translation>Průvodce uživatelským profilem: </translation>
+ </message>
+ <message>
+ <source>You must fill in a user name for your SIP account.</source>
+ <translation>Musíte zadat uživatelské jméno vašeho SIP účtu.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Je nutné zadat doménové jméno vašeho SIP účtu (část vpravo od symbolu &quot;@&quot;).
+Často je shodné s doménovým jménem vašeho SIP poskytovatele.
+
+Pro přímé spojení IP-to-IP, tedy bez SIP poskytovatele, je to doménové jméno nebo veřejná IP vašeho počítače.</translation>
+ </message>
+ <message>
+ <source>Invalid value for SIP proxy.</source>
+ <translation>Nepřípustná hodnota pro SIP proxy.</translation>
+ </message>
+ <message>
+ <source>Invalid value for STUN server.</source>
+ <translation>Nepřípustná hodnota pro STUN server.</translation>
+ </message>
+</context>
+<context>
+ <name>YesNoDialog</name>
+ <message>
+ <source>&amp;Yes</source>
+ <translation>&amp;Ano</translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation>&amp;Ne</translation>
+ </message>
+</context>
+</TS>
diff --git a/src/gui/lang/twinkle_de.ts b/src/gui/lang/twinkle_de.ts
new file mode 100644
index 0000000..5dd02ad
--- /dev/null
+++ b/src/gui/lang/twinkle_de.ts
@@ -0,0 +1,6071 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name>AddressCardForm</name>
+ <message>
+ <source>Twinkle - Address Card</source>
+ <translation>Twinkle - Adresseintrag</translation>
+ </message>
+ <message>
+ <source>&amp;Remark:</source>
+ <translation>Anme&amp;rkung:</translation>
+ </message>
+ <message>
+ <source>Infix name of contact.</source>
+ <translation>Mittlerer Name oder Titel.</translation>
+ </message>
+ <message>
+ <source>First name of contact.</source>
+ <translation>Vorname oder allg. linker Namensbestandteil. Sortierschlüssel!</translation>
+ </message>
+ <message>
+ <source>&amp;First name:</source>
+ <translation>&amp;Vorname:</translation>
+ </message>
+ <message>
+ <source>You may place any remark about the contact here.</source>
+ <translation>Feld für beliebige Anmerkungen. Eigene Spalte, nach der sortiert werden kann - klicken Sie hierzu einfach auf den Spaltenkopf in der Adressliste.</translation>
+ </message>
+ <message>
+ <source>&amp;Phone:</source>
+ <translation>&amp;Telefon:</translation>
+ </message>
+ <message>
+ <source>&amp;Infix name:</source>
+ <translation>&amp;Titel:</translation>
+ </message>
+ <message>
+ <source>Phone number or SIP address of contact.</source>
+ <translation>Telefonnummer oder SIP-Adresse des Kontakts.</translation>
+ </message>
+ <message>
+ <source>Last name of contact.</source>
+ <translation>Nachname oder allg. rechter Namensbestandteil. </translation>
+ </message>
+ <message>
+ <source>&amp;Last name:</source>
+ <translation>&amp;Nachname:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Abbruch (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>You must fill in a name.</source>
+ <translation>Sie müssen einen Namen angeben.</translation>
+ </message>
+ <message>
+ <source>You must fill in a phone number or SIP address.</source>
+ <translation>Sie müssen eine Nummer oder SIP-Adresse angeben.</translation>
+ </message>
+</context>
+<context>
+ <name>AuthenticationForm</name>
+ <message>
+ <source>Twinkle - Authentication</source>
+ <translation>Twinkle - Anmeldung</translation>
+ </message>
+ <message>
+ <source>user</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>The user for which authentication is requested.</source>
+ <translation>Der anzumeldende Benutzer.</translation>
+ </message>
+ <message>
+ <source>profile</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>The user profile of the user for which authentication is requested.</source>
+ <translation>Das anzumeldende Benutzerprofil.</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Benutzerprofil:</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Benutzer:</translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>&amp;Passwort:</translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation>Ihr Anmeldepasswort.</translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation>Ihr SIP-Anmeldename. Häufig identisch mit Ihrem SIP-Nutzernamen, dann leerlassen. Falls nicht, wird Ihr Provider dies mitteilen.</translation>
+ </message>
+ <message>
+ <source>&amp;User name:</source>
+ <translation>N&amp;utzername :</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Abbruch (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Login required for realm:</source>
+ <translation>Login nötig für Realm:</translation>
+ </message>
+ <message>
+ <source>realm</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>The realm for which you need to authenticate.</source>
+ <translation>Der Realm, für den Sie sich anmelden müssen.</translation>
+ </message>
+</context>
+<context>
+ <name>BuddyForm</name>
+ <message>
+ <source>Twinkle - Buddy</source>
+ <translation>Twinkle - Buddy</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adressbuch</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Name und Rufnummer/SIP-Adresse aus Adressbuch kopieren.</translation>
+ </message>
+ <message>
+ <source>&amp;Phone:</source>
+ <translation>&amp;Telefon:</translation>
+ </message>
+ <message>
+ <source>Name of your buddy.</source>
+ <translation>Lokaler Name für Buddy-Eintrag.</translation>
+ </message>
+ <message>
+ <source>&amp;Show availability</source>
+ <translation>Online-&amp;Status anzeigen</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>Check this option if you want to see the availability of your buddy. This will only work if your provider offers a presence agent.</source>
+ <translation>Wenn aktiviert, erfragt Twinkle den Online-Status (Erreichbarkeit) des Buddy. Diese Funktion muss vom Provider des Buddy und gegebenenfalls auch von Ihrem Provider durch bereitstellen eines &quot;presence agent&quot; im Netz unterstützt werden, um zu funktionieren.</translation>
+ </message>
+ <message>
+ <source>&amp;Name:</source>
+ <translation>&amp;Name:</translation>
+ </message>
+ <message>
+ <source>SIP address your buddy.</source>
+ <translation>SIP-Adresse des Buddy.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Abbruch (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>You must fill in a name.</source>
+ <translation>Sie müssen einen Namen angeben.</translation>
+ </message>
+ <message>
+ <source>Invalid phone.</source>
+ <translation>Unzulässige SIP-Adresse.</translation>
+ </message>
+ <message>
+ <source>Failed to save buddy list: %1</source>
+ <translation>Fehler beim Speichern der Buddyliste: &quot;%1&quot;</translation>
+ </message>
+</context>
+<context>
+ <name>BuddyList</name>
+ <message>
+ <source>Availability</source>
+ <translation>Online-Status</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>unbekannt</translation>
+ </message>
+ <message>
+ <source>offline</source>
+ <translation>offline</translation>
+ </message>
+ <message>
+ <source>online</source>
+ <translation>online</translation>
+ </message>
+ <message>
+ <source>request rejected</source>
+ <translation>Abfrage nicht angenommen</translation>
+ </message>
+ <message>
+ <source>not published</source>
+ <translation>nicht bekanntgegeben</translation>
+ </message>
+ <message>
+ <source>failed to publish</source>
+ <translation>Bekanntgeben nicht möglich</translation>
+ </message>
+ <message>
+ <source>request failed</source>
+ <translation>Abfrage fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>Click right to add a buddy.</source>
+ <translation>Mit Rechtsklick Buddy hinzufügen.</translation>
+ </message>
+</context>
+<context>
+ <name>CoreAudio</name>
+ <message>
+ <source>Failed to open sound card</source>
+ <translation>Fehler beim Öffnen Soundkarte</translation>
+ </message>
+ <message>
+ <source>Failed to create a UDP socket (RTP) on port %1</source>
+ <translation>Fehler beim Erzeugen des UDP socket (RTP) für Port %1</translation>
+ </message>
+ <message>
+ <source>Failed to create audio receiver thread.</source>
+ <translation>Fehler beim Erzeugen &quot;audio receiver thread&quot;.</translation>
+ </message>
+ <message>
+ <source>Failed to create audio transmitter thread.</source>
+ <translation>Fehler beim Erzeugen &quot;audio transmitter thread&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>CoreCallHistory</name>
+ <message>
+ <source>local user</source>
+ <translation>lokal</translation>
+ </message>
+ <message>
+ <source>remote user</source>
+ <translation>Gegenstelle</translation>
+ </message>
+ <message>
+ <source>failure</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>unbekannt</translation>
+ </message>
+ <message>
+ <source>in</source>
+ <translation>kommend</translation>
+ </message>
+ <message>
+ <source>out</source>
+ <translation>gehend</translation>
+ </message>
+</context>
+<context>
+ <name>DeregisterForm</name>
+ <message>
+ <source>Twinkle - Deregister</source>
+ <translation>Twinkle - Abmelden</translation>
+ </message>
+ <message>
+ <source>deregister all devices</source>
+ <translation>alle Endgeräte abmelden</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Abbruch (Es&amp;c)</translation>
+ </message>
+</context>
+<context>
+ <name>DiamondcardProfileForm</name>
+ <message>
+ <source>Twinkle - Diamondcard User Profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your Diamondcard account ID.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Account ID:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;PIN code:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p align=&quot;center&quot;&gt;&lt;u&gt;Sign up for a Diamondcard account&lt;/u&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">Abbruch (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fill in your account ID.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fill in your PIN code.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A user profile with name %1 already exists.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your Diamondcard PIN code.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;With a Diamondcard account you can make worldwide calls to regular and cell phones and send SMS messages. To sign up for a Diamondcard account click on the &quot;sign up&quot; link below. Once you have signed up you receive an account ID and PIN code. Enter the account ID and PIN code below to create a Twinkle user profile for your Diamondcard account.&lt;/p&gt;
+&lt;p&gt;For call rates see the sign up web page that will be shown to you when you click on the &quot;sign up&quot; link.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DtmfForm</name>
+ <message>
+ <source>Twinkle - DTMF</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Keypad</source>
+ <translation>Tastatur</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Over decadic A. Normally not needed.</source>
+ <translation>Funktionstaste A. Selten benötigt.</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Over decadic B. Normally not needed.</source>
+ <translation>Funktionstaste B. Selten benötigt.</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Over decadic C. Normally not needed.</source>
+ <translation>Funktionstaste C. Selten benötigt.</translation>
+ </message>
+ <message>
+ <source>Star (*)</source>
+ <translation>Stern (*)</translation>
+ </message>
+ <message>
+ <source>0</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Pound (#)</source>
+ <translation>Raute (#)</translation>
+ </message>
+ <message>
+ <source>Over decadic D. Normally not needed.</source>
+ <translation>Funktionstaste D. Selten benötigt.</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>S&amp;chliessen</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+</context>
+<context>
+ <name>FreeDeskSysTray</name>
+ <message>
+ <source>Show/Hide</source>
+ <translation>Wiederherstellen/Minimieren</translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation>Beenden</translation>
+ </message>
+</context>
+<context>
+ <name>GUI</name>
+ <message>
+ <source>Failed to create a UDP socket (SIP) on port %1</source>
+ <translation type="obsolete">Fehler beim Erzeugen des UDP socket (SIP) für Port %1</translation>
+ </message>
+ <message>
+ <source>The following profiles are both for user %1</source>
+ <translation>Die folgenden Benutzerprofile verwenden den gleichen SIP-Benutzernamen &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <source>You can only run multiple profiles for different users.</source>
+ <translation>Gleichzeitig aktive Benutzerprofile müssen eindeutige SIP-Benutzernamen haben.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Twinkle kann kein aktives Netzwerk-Interface finden, und nutzt nun 127.0.0.1 als lokale IP-Adresse. Wenn Sie später eine Netzwerkverbindung herstellen, müssen Sie Twinkle neu starten, damit es die korrekte Netzadresse finden und funktionieren kann.</translation>
+ </message>
+ <message>
+ <source>Line %1: incoming call for %2</source>
+ <translation>Leitung %1: eingehender Ruf für %2</translation>
+ </message>
+ <message>
+ <source>Call transferred by %1</source>
+ <translation>Ruf weitervermittelt durch %1</translation>
+ </message>
+ <message>
+ <source>Line %1: far end cancelled call.</source>
+ <translation>Leitung %1: Gegenstelle hat Ruf abgebrochen.</translation>
+ </message>
+ <message>
+ <source>Line %1: far end released call.</source>
+ <translation>Leitung %1: beendet durch Gegenstelle.</translation>
+ </message>
+ <message>
+ <source>Line %1: SDP answer from far end not supported.</source>
+ <translation>Leitung %1: SDP Antwort der GgSt. nicht unterstützt.</translation>
+ </message>
+ <message>
+ <source>Line %1: SDP answer from far end missing.</source>
+ <translation>Leitung %1: keine SDP Antwort der Gegenstelle.</translation>
+ </message>
+ <message>
+ <source>Line %1: Unsupported content type in answer from far end.</source>
+ <translation>Leitung %1: Inhaltstyp in Antwort der Ggst nicht unterstützt.</translation>
+ </message>
+ <message>
+ <source>Line %1: no ACK received, call will be terminated.</source>
+ <translation>Leitung %1: kein ACK von Ggst, Ruf wird beendet.</translation>
+ </message>
+ <message>
+ <source>Line %1: no PRACK received, call will be terminated.</source>
+ <translation>Leitung %1: kein PRACK von Ggst, Ruf wird beendet.</translation>
+ </message>
+ <message>
+ <source>Line %1: PRACK failed.</source>
+ <translation>Leitung %1: PRACK Fehler.</translation>
+ </message>
+ <message>
+ <source>Line %1: failed to cancel call.</source>
+ <translation>Leitung %1: Fehler bei Ruf beenden.</translation>
+ </message>
+ <message>
+ <source>Line %1: far end answered call.</source>
+ <translation>Leitung %1: Ggst hat angenommen.</translation>
+ </message>
+ <message>
+ <source>Line %1: call failed.</source>
+ <translation>Leitung %1: Ruf erfolglos.</translation>
+ </message>
+ <message>
+ <source>The call can be redirected to:</source>
+ <translation>Der Ruf kann umgeleitet werden nach:</translation>
+ </message>
+ <message>
+ <source>Line %1: call released.</source>
+ <translation>Leitung %1: Anruf beendet.</translation>
+ </message>
+ <message>
+ <source>Line %1: call established.</source>
+ <translation>Leitung %1: Verbindung hergestellt.</translation>
+ </message>
+ <message>
+ <source>Response on terminal capability request: %1 %2</source>
+ <translation>Antwort GgSt auf Abfrage der Eigenschaften: %1 %2</translation>
+ </message>
+ <message>
+ <source>Terminal capabilities of %1</source>
+ <translation>Fähigkeiten Gegenstelle %1</translation>
+ </message>
+ <message>
+ <source>Accepted body types:</source>
+ <translation>Erlaubte &quot;body types&quot;:</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>unbekannt</translation>
+ </message>
+ <message>
+ <source>Accepted encodings:</source>
+ <translation>Erlaubte &quot;encodings&quot;:</translation>
+ </message>
+ <message>
+ <source>Accepted languages:</source>
+ <translation>Erlaubte Sprachen:</translation>
+ </message>
+ <message>
+ <source>Allowed requests:</source>
+ <translation>Erlaubte &quot;requests&quot;:</translation>
+ </message>
+ <message>
+ <source>Supported extensions:</source>
+ <translation>Unterstützte &quot;extensions&quot;:</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation>keine</translation>
+ </message>
+ <message>
+ <source>End point type:</source>
+ <translation>Endgeräte-Typ:</translation>
+ </message>
+ <message>
+ <source>Line %1: call retrieve failed.</source>
+ <translation>Leitung %1: Fehler bei &quot;Gespräch fortsetzen&quot;.</translation>
+ </message>
+ <message>
+ <source>%1, registration failed: %2 %3</source>
+ <translation>%1, Anmeldung erfolglos: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, registration succeeded (expires = %2 seconds)</source>
+ <translation>%1, Anmeldung erfolgreich (gültig %2 Sek.)</translation>
+ </message>
+ <message>
+ <source>%1, registration failed: STUN failure</source>
+ <translation>%1, Anmeldung erfolglos: STUN Fehler</translation>
+ </message>
+ <message>
+ <source>%1, de-registration succeeded: %2 %3</source>
+ <translation>%1, Abmeldung erfolgreich: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, fetching registrations failed: %2 %3</source>
+ <translation>%1, Fehler bei Abfrage Anmeldungen: %2 %3</translation>
+ </message>
+ <message>
+ <source>: you are not registered</source>
+ <translation>: Sie sind nicht angemeldet</translation>
+ </message>
+ <message>
+ <source>: you have the following registrations</source>
+ <translation>: folgende Anmeldungen aktiv</translation>
+ </message>
+ <message>
+ <source>: fetching registrations...</source>
+ <translation>: Abfrage Anmeldungen läuft...</translation>
+ </message>
+ <message>
+ <source>Line %1: redirecting request to</source>
+ <translation>Leitung %1: leite Anfrage um nach </translation>
+ </message>
+ <message>
+ <source>Redirecting request to: %1</source>
+ <translation>Leite Anfrage um nach: %1</translation>
+ </message>
+ <message>
+ <source>Line %1: DTMF detected:</source>
+ <translation>Leitung %1: DTMF empfangen: </translation>
+ </message>
+ <message>
+ <source>invalid DTMF telephone event (%1)</source>
+ <translation>Ungültiges DTMF-Ereignis (%1)</translation>
+ </message>
+ <message>
+ <source>Line %1: send DTMF %2</source>
+ <translation>Leitung %1: sende DTMF %2</translation>
+ </message>
+ <message>
+ <source>Line %1: far end does not support DTMF telephone events.</source>
+ <translation>Leitung %1: GgSt unterstützt keine DTMF-Ereignisse.</translation>
+ </message>
+ <message>
+ <source>Line %1: received notification.</source>
+ <translation>Leitung %1: Mitteilung empfangen.</translation>
+ </message>
+ <message>
+ <source>Event: %1</source>
+ <translation>Ereignis: %1</translation>
+ </message>
+ <message>
+ <source>State: %1</source>
+ <translation>Status: %1</translation>
+ </message>
+ <message>
+ <source>Reason: %1</source>
+ <translation>Ursache: %1</translation>
+ </message>
+ <message>
+ <source>Progress: %1 %2</source>
+ <translation>Fortschritt: %1 %2</translation>
+ </message>
+ <message>
+ <source>Line %1: call transfer failed.</source>
+ <translation>Leitung %1: Rufweitervermittlung erfolglos.</translation>
+ </message>
+ <message>
+ <source>Line %1: call succesfully transferred.</source>
+ <translation>Leitung %1: Ruf wurde weitervermittelt.</translation>
+ </message>
+ <message>
+ <source>Line %1: call transfer still in progress.</source>
+ <translation>Leitung %1: Rufweitervermittlung läuft...</translation>
+ </message>
+ <message>
+ <source>No further notifications will be received.</source>
+ <translation>Gegenstelle stoppt Mitteilungsversand.</translation>
+ </message>
+ <message>
+ <source>Line %1: transferring call to %2</source>
+ <translation>Leitung %1: Rufweitervermittlung an %2</translation>
+ </message>
+ <message>
+ <source>Transfer requested by %1</source>
+ <translation>Rufweitervermittlung angefordert von %1</translation>
+ </message>
+ <message>
+ <source>Line %1: Call transfer failed. Retrieving original call.</source>
+ <translation>Leitung %1: Rufweitervermittlung erfolglos. Ursprüngliches Gespräch wird fortgesetzt.</translation>
+ </message>
+ <message>
+ <source>Redirecting call</source>
+ <translation>Ruf wird umgeleitet</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Benutzerprofil:</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Benutzer:</translation>
+ </message>
+ <message>
+ <source>Do you allow the call to be redirected to the following destination?</source>
+ <translation>Möchten Sie Rufumleitung zu folgendem Ziel gestatten?</translation>
+ </message>
+ <message>
+ <source>If you don&apos;t want to be asked this anymore, then you must change the settings in the SIP protocol section of the user profile.</source>
+ <translation>In den Benutzerprofil-Einstellungen unter &quot;SIP-Protokoll&quot; können Sie festlegen, ob diese Frage angezeigt wird oder nicht.</translation>
+ </message>
+ <message>
+ <source>Redirecting request</source>
+ <translation>Leite Anfrage um</translation>
+ </message>
+ <message>
+ <source>Do you allow the %1 request to be redirected to the following destination?</source>
+ <translation>Möchten Sie die Umleitung der %1-Anforderung zu folgendem Ziel gestatten?</translation>
+ </message>
+ <message>
+ <source>Transferring call</source>
+ <translation>Ruf wird weitervermittelt</translation>
+ </message>
+ <message>
+ <source>Request to transfer call received from:</source>
+ <translation>Weitervermittlung angefordert durch:</translation>
+ </message>
+ <message>
+ <source>Do you allow the call to be transferred to the following destination?</source>
+ <translation>Möchten Sie Rufweitervermittlung zu folgendem Ziel gestatten?</translation>
+ </message>
+ <message>
+ <source>Info:</source>
+ <translation>Info:</translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation>Warnung:</translation>
+ </message>
+ <message>
+ <source>Critical:</source>
+ <translation>Kritisch:</translation>
+ </message>
+ <message>
+ <source>Firewall / NAT discovery...</source>
+ <translation>Firewall / NAT Analyse...</translation>
+ </message>
+ <message>
+ <source>Abort</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <source>Line %1</source>
+ <translation>Leitung %1</translation>
+ </message>
+ <message>
+ <source>Click the padlock to confirm a correct SAS.</source>
+ <translation>Klicken Sie auf das Vorhängeschloss, um korrektes SAS-Geheimwort zu bestätigen.</translation>
+ </message>
+ <message>
+ <source>The remote user on line %1 disabled the encryption.</source>
+ <translation>Die Gegenstelle an Leitung %1 hat Verschlüsselung abgeschaltet.</translation>
+ </message>
+ <message>
+ <source>Line %1: SAS confirmed.</source>
+ <translation>Leitung %1: SAS bestätigt.</translation>
+ </message>
+ <message>
+ <source>Line %1: SAS confirmation reset.</source>
+ <translation>Leitung %1: SAS Bestätigung gelöscht.</translation>
+ </message>
+ <message>
+ <source>Line %1: call rejected.</source>
+ <translation>Leitung %1: Ruf abgelehnt.</translation>
+ </message>
+ <message>
+ <source>Line %1: call redirected.</source>
+ <translation>Leitung %1: Ruf umgeleitet.</translation>
+ </message>
+ <message>
+ <source>Failed to start conference.</source>
+ <translation>Konferenz konnte nicht geschaltet werden.</translation>
+ </message>
+ <message>
+ <source>Override lock file and start anyway?</source>
+ <translation>Sperrdatei ignorieren und trotzdem starten?</translation>
+ </message>
+ <message>
+ <source>%1, STUN request failed: %2 %3</source>
+ <translation>%1, STUN Anfrage fehlgeschlagen: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, STUN request failed.</source>
+ <translation>%1, STUN Anfrage fehlgeschlagen.</translation>
+ </message>
+ <message>
+ <source>%1, voice mail status failure.</source>
+ <translation>%1, Fehler Voice-Mail Status.</translation>
+ </message>
+ <message>
+ <source>%1, voice mail status rejected.</source>
+ <translation>%1, Voice-Mail Status abgelehnt.</translation>
+ </message>
+ <message>
+ <source>%1, voice mailbox does not exist.</source>
+ <translation>%1, Voice-Mailbox existiert nicht.</translation>
+ </message>
+ <message>
+ <source>%1, voice mail status terminated.</source>
+ <translation>%1, keine weitere Voice-Mail Statusübermittlung. </translation>
+ </message>
+ <message>
+ <source>%1, de-registration failed: %2 %3</source>
+ <translation>%1, Abmeldung erfolglos: %2 %3</translation>
+ </message>
+ <message>
+ <source>Request to transfer call received.</source>
+ <translation>GgSt fordert Vermittlung an.</translation>
+ </message>
+ <message>
+ <source>If these are users for different domains, then enable the following option in your user profile (SIP protocol)</source>
+ <translation>Wenn diese Profile unterschiedliche Domains verwenden, bitte in einem unter SIP-Protololl folgende Option aktivieren </translation>
+ </message>
+ <message>
+ <source>Use domain name to create a unique contact header</source>
+ <translation>Domain-Name benutzen für eindeutigen Contact-Header</translation>
+ </message>
+ <message>
+ <source>Failed to create a %1 socket (SIP) on port %2</source>
+ <translation>Fehler beim Anlegen: %1 socket (SIP) auf port %2</translation>
+ </message>
+ <message>
+ <source>Accepted by network</source>
+ <translation>Akzeptiert durch Netzwerk</translation>
+ </message>
+ <message>
+ <source>Failed to save message attachment: %1</source>
+ <translation>Fehler beim Speichern des Nachrichtenanhangs: &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <source>Transferred by: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot open web browser: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Configure your web browser in the system settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>GetAddressForm</name>
+ <message>
+ <source>Twinkle - Select address</source>
+ <translation>Twinkle - Auswahl Adresse</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Name</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Typ</translation>
+ </message>
+ <message>
+ <source>Phone</source>
+ <translation>Telefon</translation>
+ </message>
+ <message>
+ <source>&amp;Show only SIP addresses</source>
+ <translation>Nur &amp;SIP-Adressen zeigen</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>Check this option when you only want to see contacts with SIP addresses, i.e. starting with &quot;&lt;b&gt;sip:&lt;/b&gt;&quot;.</source>
+ <translation>Wenn aktiviert, werden nur Kontakte angezeigt, die eine gültige SIP-Adresse enthalten, also beginnend mit &quot;&lt;b&gt;sip:&lt;/b&gt;&quot;.</translation>
+ </message>
+ <message>
+ <source>&amp;Reload</source>
+ <translation>Aktualisie&amp;ren</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt+R</translation>
+ </message>
+ <message>
+ <source>Reload the list of addresses from KAddressbook.</source>
+ <translation>Adressliste aus KAddressbook erneut einlesen.&lt;br&gt;
+Ein Schliessen und erneutes Öffnen des Fensters führt &lt;i&gt;nicht&lt;/i&gt; zum Neueinlesen.&lt;br&gt;
+Änderungen im Adressbestand werden erst durch &quot;Aktualisieren&quot; in Twinkle sichtbar.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Abbruch (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>&amp;KAddressBook</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>This list of addresses is taken from &lt;b&gt;KAddressBook&lt;/b&gt;. 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.</source>
+ <translation>Diese Adressliste stammt aus &lt;b&gt;KAddressbook&lt;/b&gt; (bzw Kontact). Adressen/Kontakte, die keine Telefonnr oder SIP-Adresse enthalten, sind nicht aufgeführt.
+Nutzen Sie zum Anlegen und Bearbeiten Ihrer systemweiten Adressinformationen das Programm KAddressbook bzw Kontact.</translation>
+ </message>
+ <message>
+ <source>&amp;Local address book</source>
+ <translation>&amp;Lokales Adressbuch</translation>
+ </message>
+ <message>
+ <source>Remark</source>
+ <translation>Anmerkung</translation>
+ </message>
+ <message>
+ <source>Contacts in the local address book of Twinkle.</source>
+ <translation>Kontakte des lokalen Twinkle-Adressbuchs.</translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation>&amp;Neu</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+N</translation>
+ </message>
+ <message>
+ <source>Add a new contact to the local address book.</source>
+ <translation>Neuen Kontakt im lokalen Adressbuch anlegen.</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Löschen</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation>Alt+L</translation>
+ </message>
+ <message>
+ <source>Delete a contact from the local address book.</source>
+ <translation>Ausgewählten Kontakt aus dem lokalen Adressbuch löschen.</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>B&amp;earbeiten</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation>Alt+E</translation>
+ </message>
+ <message>
+ <source>Edit a contact from the local address book.</source>
+ <translation>Ausgewählten Kontakt im lokalen Adressbuch bearbeiten.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You seem not to have any contacts with a phone number in &lt;b&gt;KAddressBook&lt;/b&gt;, KDE&apos;s address book application. Twinkle retrieves all contacts with a phone number from KAddressBook. To manage your contacts you have to use KAddressBook.&lt;p&gt;As an alternative you may use Twinkle&apos;s local address book.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;&lt;b&gt;KAddressbook&lt;/b&gt; bzw &lt;b&gt;Kontact&lt;/b&gt; scheint keine Einträge mit Telefonnr zu enthalten, die Twinkle dort auslesen könnte. Bitte nutzen Sie eines dieser Programme, um Ihre Adressdaten zu bearbeiten.&lt;/p&gt;
+&lt;p&gt;Weiterhin steht Ihnen Twinkles lokales Adressbuch unabhängig von o.g. Programmen zur Verfügung.&lt;/p&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>GetProfileNameForm</name>
+ <message>
+ <source>Twinkle - Profile name</source>
+ <translation>Twinkle - Name Benutzerprofil</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Abbruch (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Enter a name for your profile:</source>
+ <translation>Name für das neue Profil:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The name of your profile&lt;/b&gt;
+&lt;br&gt;&lt;br&gt;
+A profile contains your user settings, e.g. your user name and password. You have to give each profile a name.
+&lt;br&gt;&lt;br&gt;
+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.
+&lt;br&gt;&lt;br&gt;
+To remember your profiles easily you could use your SIP user name as a profile name, e.g. &lt;b&gt;example@example.com&lt;/b&gt;</source>
+ <translation>Der &lt;b&gt;Name, unter dem das neue Profil angelegt&lt;/b&gt; wird, in dem dann alle zusammengehörenden Daten wie Provider, SIP-Nutzername, Passwort usw gespeichert werden. (entsprechend z.B. einer &quot;Identität&quot; unter KMail)&lt;br&gt;&lt;br&gt;
+Da Sie bei Twinkle mehrere Benutzerprofile anlegen können, z.B. um mehrere SIP-Provider zu nutzen, muss jedes Profil einen Namen erhalten. Unter diesem Namen finden Sie es später in Auswahllisten, Meldungen usw.&lt;br&gt;
+Es bietet sich an, hier Ihre SIP-Adresse als Name zu verwenden, also &lt;b&gt;meinname@meinprovider.de&lt;/b&gt;, aber Sie können letztendlich beliebige Namen wählen.&lt;br&gt;
+&lt;p&gt;
+&lt;b&gt;Bevor Sie hier Ihr erstes SIP-Profil anlegen, sollten Sie sich bei einem SIP-Provider (vertraglich) angemeldet haben&lt;/b&gt; und sich notieren, welche &lt;b&gt;SIP-Zugangsdaten&lt;/b&gt; dieser für Sie zur Verfügung gestellt hat.
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Cannot find .twinkle directory in your home directory.</source>
+ <translation>Kann den Ordner &quot;.twinkle&quot; in Ihrem home-Ordner (&quot;/home/ihrname/&quot;) nicht finden.</translation>
+ </message>
+ <message>
+ <source>Profile already exists.</source>
+ <translation>Profil mit diesem Namen existiert bereits.</translation>
+ </message>
+ <message>
+ <source>Rename profile &apos;%1&apos; to:</source>
+ <translation>Profil &quot;%1&quot; umbenennen in:</translation>
+ </message>
+</context>
+<context>
+ <name>HistoryForm</name>
+ <message>
+ <source>Twinkle - Call History</source>
+ <translation>Twinkle - Liste Anrufe</translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation>Uhreit</translation>
+ </message>
+ <message>
+ <source>In/Out</source>
+ <translation>Ank/Abg</translation>
+ </message>
+ <message>
+ <source>From/To</source>
+ <translation>Gegenstelle</translation>
+ </message>
+ <message>
+ <source>Subject</source>
+ <translation>Betreff</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Status</translation>
+ </message>
+ <message>
+ <source>Call details</source>
+ <translation>Details</translation>
+ </message>
+ <message>
+ <source>Details of the selected call record.</source>
+ <translation>Details zum ausgewählten Anruf.</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation>Anzeigen</translation>
+ </message>
+ <message>
+ <source>&amp;Incoming calls</source>
+ <translation>E&amp;ingehende Anrufe</translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation>Alt+I</translation>
+ </message>
+ <message>
+ <source>Check this option to show incoming calls.</source>
+ <translation>Wenn aktiviert, werden Anrufe angezeigt bei denen Sie von jemand angerufen wurden.</translation>
+ </message>
+ <message>
+ <source>&amp;Outgoing calls</source>
+ <translation>Ab&amp;gehende Anrufe</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+G</translation>
+ </message>
+ <message>
+ <source>Check this option to show outgoing calls.</source>
+ <translation>Wenn aktiviert, werden Anrufe angezeigt die Sie selbst getätigt haben.</translation>
+ </message>
+ <message>
+ <source>&amp;Answered calls</source>
+ <translation>Be&amp;antwortete Anrufe</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Check this option to show answered calls.</source>
+ <translation>Wenn aktiviert, werden Anrufe angezeigt die zustande kamen.</translation>
+ </message>
+ <message>
+ <source>&amp;Missed calls</source>
+ <translation>A&amp;nrufversuche</translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation>Alt+N</translation>
+ </message>
+ <message>
+ <source>Check this option to show missed calls.</source>
+ <translation>Wenn aktiviert, werden Anrufe angezeigt die nicht zustande kamen.</translation>
+ </message>
+ <message>
+ <source>Current &amp;user profiles only</source>
+ <translation>N&amp;ur aktive Benutzerprofile</translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>Check this option to show only calls associated with this user profile.</source>
+ <translation>Wenn aktiviert, nur Anrufe zeigen, die mit/zu einem der aktuell aktivierten Benutzerprofile getätigt wurden.</translation>
+ </message>
+ <message>
+ <source>C&amp;lear</source>
+ <translation>&amp;Liste löschen</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+L</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;Clear the complete call history.&lt;/p&gt;
+&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; this will clear &lt;b&gt;all&lt;/b&gt; records, also records not shown depending on the checked view options.&lt;/p&gt;</source>
+ <translation>Löscht das gesamte Anrufe-Protokoll,&lt;br&gt;
+&lt;b&gt;inklusive&lt;/b&gt; aller evtl gerade über &quot;Anzeigen&quot; &lt;b&gt;ausgeblendeten Einträge.&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+E</translation>
+ </message>
+ <message>
+ <source>Close this window.</source>
+ <translation>Fenster schliessen.</translation>
+ </message>
+ <message>
+ <source>Call start:</source>
+ <translation>Anruf Start:</translation>
+ </message>
+ <message>
+ <source>Call answer:</source>
+ <translation>Angenommen:</translation>
+ </message>
+ <message>
+ <source>Call end:</source>
+ <translation>Anruf Ende:</translation>
+ </message>
+ <message>
+ <source>Call duration:</source>
+ <translation>Anrufdauer:</translation>
+ </message>
+ <message>
+ <source>Direction:</source>
+ <translation>Richtung:</translation>
+ </message>
+ <message>
+ <source>From:</source>
+ <translation>Von:</translation>
+ </message>
+ <message>
+ <source>To:</source>
+ <translation>An:</translation>
+ </message>
+ <message>
+ <source>Reply to:</source>
+ <translation>Antwort auf:</translation>
+ </message>
+ <message>
+ <source>Referred by:</source>
+ <translation>Über:</translation>
+ </message>
+ <message>
+ <source>Subject:</source>
+ <translation>Betreff:</translation>
+ </message>
+ <message>
+ <source>Released by:</source>
+ <translation>Beendet von:</translation>
+ </message>
+ <message>
+ <source>Status:</source>
+ <translation>Status:</translation>
+ </message>
+ <message>
+ <source>Far end device:</source>
+ <translation>Typ Gegenstelle:</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Benutzerprofil:</translation>
+ </message>
+ <message>
+ <source>conversation</source>
+ <translation>Gespräch</translation>
+ </message>
+ <message>
+ <source>Call...</source>
+ <translation>Anrufen... (Doppelklick)</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Eintrag löschen</translation>
+ </message>
+ <message>
+ <source>Re:</source>
+ <translation>Aw:</translation>
+ </message>
+ <message>
+ <source>Call selected address.</source>
+ <translation>Markierte Adresse/Nummer anrufen.</translation>
+ </message>
+ <message>
+ <source>Clo&amp;se</source>
+ <translation>&amp;Schliessen (Esc)</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>&amp;Call</source>
+ <translation>Anrufen (&amp;Enter)</translation>
+ </message>
+ <message>
+ <source>Number of calls:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>###</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Total call duration:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>InviteForm</name>
+ <message>
+ <source>Twinkle - Call</source>
+ <translation>Twinkle - Anrufen</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>An (&amp;Telnr):</translation>
+ </message>
+ <message>
+ <source>Optionally you can provide a subject here. This might be shown to the callee.</source>
+ <translation>Sie können hier einen Betreff angeben, der ebenso wie Ihr Displayname von der Gegenstelle angezeigt werden kann.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adressbuch</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Adresse/Nr aus dem KDE-Adressbuch auswählen.</translation>
+ </message>
+ <message>
+ <source>The address that you want to call. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Der Anschluss, den Sie anrufen möchten. Dies kann eine vollständige SIP-Adresse sein, wie &lt;b&gt;sip:example@example.com&lt;/b&gt;, oder auch nur eine Telephonnummer bzw. der Benutzername einer SIP-Adresse, dann ergänzt Twinkle sie mit der im Benutzerprofil eingetragenen Domain zur vollständigen SIP-Adresse.</translation>
+ </message>
+ <message>
+ <source>The user that will make the call.</source>
+ <translation>Das Benutzerprofil -und damit der Provider- mit dem der Ruf gestartet wird.</translation>
+ </message>
+ <message>
+ <source>&amp;Subject:</source>
+ <translation>&amp;Betreff:</translation>
+ </message>
+ <message>
+ <source>&amp;From:</source>
+ <translation>&amp;Von:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Abbruch (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>&amp;Hide identity</source>
+ <translation>Absenderangaben &amp;unterdrücken</translation>
+ </message>
+ <message>
+ <source>Alt+H</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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 &lt;b&gt;not&lt;/b&gt; hide your IP address.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Warning:&lt;/b&gt; not all providers support identity hiding.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Mit dieser Option weisen Sie Ihren SIP-Provider an, Ihre Absenderangaben (z.B. Telefonnr, SIP-Adresse) nicht an die Gegenstelle weiterzuleiten. Prinzipbedingt wird Ihre IP-Adresse &lt;b&gt;immer&lt;/b&gt; der Gegenstelle mitgeteilt.&lt;/p&gt;
+&lt;p&gt;&lt;b&gt;Achtung: &lt;/b&gt;Nicht alle Provider unterstützen diese Funktion!&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Not all SIP providers support identity hiding. Make sure your SIP provider supports it if you really need it.</source>
+ <translation>Nicht alle SIP-Provider unterstützen die Funktion &quot;Absenderangaben unterdrücken&quot;. Bitte vergewissern Sie sich, bevor Sie sich auf diese Funktion verlassen.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LogViewForm</name>
+ <message>
+ <source>Twinkle - Log</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Contents of the current log file (~/.twinkle/twinkle.log)</source>
+ <translation>Inhalt der aktuellen Logdatei (~/.twinkle/twinkle.log)</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>S&amp;chliessen</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>C&amp;lear</source>
+ <translation>&amp;Löschen</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+L</translation>
+ </message>
+ <message>
+ <source>Clear the log window. This does &lt;b&gt;not&lt;/b&gt; clear the log file itself.</source>
+ <translation>Die Anzeige des Fensters löschen. Die Logdatei selbst wird &lt;b&gt;nicht&lt;/b&gt; gelöscht oder geleert.</translation>
+ </message>
+</context>
+<context>
+ <name>MessageForm</name>
+ <message>
+ <source>Twinkle - Instant message</source>
+ <translation>Twinkle - Instant Message</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;An (Adr):</translation>
+ </message>
+ <message>
+ <source>The user that will send the message.</source>
+ <translation>Als Absender verwendetes Benutzerprofil.</translation>
+ </message>
+ <message>
+ <source>The address of the user that you want to send a message. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Die Adresse/Nummer der Gegenstelle, an die Sie eine Instant Message senden möchten. Wie immer bei Twinkle kann dies eine vollständige Adresse oder ein Username sein. Wenn Sie nur den Usernamen angeben, ergänzt Twinkle die Domain aus dem verwendeten Absender-Benutzerprofil.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adressbuch</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Adresse/Nr aus dem KDE-Adressbuch auswählen.</translation>
+ </message>
+ <message>
+ <source>&amp;User profile:</source>
+ <translation>Ben&amp;utzerprofil:</translation>
+ </message>
+ <message>
+ <source>Conversation</source>
+ <translation>Dialog</translation>
+ </message>
+ <message>
+ <source>The exchanged messages.</source>
+ <translation type="obsolete">Die gesendeten und empfangenen Nachrichten. Gesendete schwarz, empfangene blau.</translation>
+ </message>
+ <message>
+ <source>Type your message here and then press &quot;send&quot; to send it.</source>
+ <translation>Schreiben Sie hier Ihre Nachricht und klicken Sie &quot;senden&quot; oder drücken Sie &quot;Enter&quot; zum abschicken.</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation>&amp;Senden</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>Send the message.</source>
+ <translation>Nachricht senden.</translation>
+ </message>
+ <message>
+ <source>Delivery failure</source>
+ <translation>Übertragungsfehler</translation>
+ </message>
+ <message>
+ <source>Delivery notification</source>
+ <translation>Übertragungsbestätigung</translation>
+ </message>
+ <message>
+ <source>Instant message toolbar</source>
+ <translation>Instant Message Werkzeugleiste</translation>
+ </message>
+ <message>
+ <source>Send file...</source>
+ <translation>Sende Datei...</translation>
+ </message>
+ <message>
+ <source>Send file</source>
+ <translation>Sende Datei</translation>
+ </message>
+ <message>
+ <source>image size is scaled down in preview</source>
+ <translation>Bild in Vorschau verkleinert</translation>
+ </message>
+ <message>
+ <source>Open with %1...</source>
+ <translation>Öffnen mit %1...</translation>
+ </message>
+ <message>
+ <source>Open with...</source>
+ <translation>Öffnen mit...</translation>
+ </message>
+ <message>
+ <source>Save attachment as...</source>
+ <translation>Anhang speichern unter...</translation>
+ </message>
+ <message>
+ <source>File already exists. Do you want to overwrite this file?</source>
+ <translation>Datei dieses Namens existiert bereits! Löschen und durch neue Datei ersetzen?</translation>
+ </message>
+ <message>
+ <source>Failed to save attachment.</source>
+ <translation>Fehler beim Speichern des Anhangs.</translation>
+ </message>
+ <message>
+ <source>%1 is typing a message.</source>
+ <translation>%1 schreibt gerade eine Nachricht.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MessageFormView</name>
+ <message>
+ <source>sending message</source>
+ <translation>Nachricht wird gesendet</translation>
+ </message>
+</context>
+<context>
+ <name>MphoneForm</name>
+ <message>
+ <source>Twinkle</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Call:</source>
+ <comment>Label in front of combobox to enter address</comment>
+ <translation>&amp;Nummer:</translation>
+ </message>
+ <message>
+ <source>The address that you want to call. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Der Anschluss, den Sie anrufen möchten. Dies kann eine vollständige SIP-Adresse sein, wie &lt;b&gt;sip:example@example.com&lt;/b&gt;, oder auch nur eine Telephonnummer bzw. der Benutzername einer SIP-Adresse, dann ergänzt Twinkle sie mit der im Benutzerprofil eingetragenen Domain zur vollständigen SIP-Adresse.</translation>
+ </message>
+ <message>
+ <source>The user that will make the call.</source>
+ <translation>Das Benutzerprofil -und damit der Provider- mit dem der Ruf gestartet wird.</translation>
+ </message>
+ <message>
+ <source>&amp;User:</source>
+ <translation>&amp;Profil:</translation>
+ </message>
+ <message>
+ <source>Dial</source>
+ <translation>Wählen</translation>
+ </message>
+ <message>
+ <source>Dial the address.</source>
+ <translation>Startet den Anruf .</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adressbuch</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Rufnummer/SIP-Adresse aus Adressbuch wählen.</translation>
+ </message>
+ <message>
+ <source>Auto answer indication.</source>
+ <translation>Anzeige und Einstellen des Dienstes &quot;Automatisch annehmen&quot;.</translation>
+ </message>
+ <message>
+ <source>Message waiting indication.</source>
+ <translation>Anzeige der Nachrichten auf Voice-Mailboxen; Anklicken zum Abhören der Nachrichten.</translation>
+ </message>
+ <message>
+ <source>Call redirect indication.</source>
+ <translation>Anzeige und Einstellen des Dienstes &quot;Rufumleitung&quot;.</translation>
+ </message>
+ <message>
+ <source>Do not disturb indication.</source>
+ <translation>Anzeige und Einstellen des Dienstes &quot;Bitte nicht stören&quot;.</translation>
+ </message>
+ <message>
+ <source>Missed call indication.</source>
+ <translation>Anzeige &quot;Anrufe in Abwesenheit&quot; und Öffnen der Anruferliste.</translation>
+ </message>
+ <message>
+ <source>Registration status.</source>
+ <translation>Anzeige und Abruf der Anmeldezustände. Die Ergebnisse des Abrufs werden in der Detailanzeige dargestellt.</translation>
+ </message>
+ <message>
+ <source>Display</source>
+ <translation>Detailanzeige</translation>
+ </message>
+ <message>
+ <source>Line status</source>
+ <translation>Leitungsstatus</translation>
+ </message>
+ <message>
+ <source>Line &amp;1:</source>
+ <translation>Leitung &amp;1:</translation>
+ </message>
+ <message>
+ <source>Alt+1</source>
+ <translation>Alt+1</translation>
+ </message>
+ <message>
+ <source>Click to switch to line 1.</source>
+ <translation>Anklicken (oder Alt+1), um auf Leitung 1 zu schalten.</translation>
+ </message>
+ <message>
+ <source>From:</source>
+ <translation>Von:</translation>
+ </message>
+ <message>
+ <source>To:</source>
+ <translation>An:</translation>
+ </message>
+ <message>
+ <source>Subject:</source>
+ <translation>Betreff:</translation>
+ </message>
+ <message>
+ <source>Visual indication of line state.</source>
+ <translation>Optische Anzeige des Leitungsstatus.</translation>
+ </message>
+ <message>
+ <source>idle</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Call is on hold</source>
+ <translation>Anruf gehalten</translation>
+ </message>
+ <message>
+ <source>Voice is muted</source>
+ <translation>stummgeschaltet</translation>
+ </message>
+ <message>
+ <source>Conference call</source>
+ <translation>Konferenz</translation>
+ </message>
+ <message>
+ <source>Transferring call</source>
+ <translation>Ruf wird weitervermittelt</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+The padlock indicates that your voice is encrypted during transport over the network.
+&lt;/p&gt;
+&lt;h3&gt;SAS - Short Authentication String&lt;/h3&gt;
+&lt;p&gt;
+Both ends of an encrypted voice channel receive the same SAS on the first call. If the SAS is different at each end, your voice channel may be compromised by a man-in-the-middle attack (MitM).
+&lt;/p&gt;
+&lt;p&gt;
+If the SAS is equal at both ends, then you should confirm it by clicking this padlock for stronger security of future calls to the same destination. For subsequent calls to the same destination, you don&apos;t have to confirm the SAS again. The padlock will show a check symbol when the SAS has been confirmed.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;
+Das Vorhängeschloss erscheint, wenn eine abhörsicher verschüsselte Verbindung zur Übertragung der Sprachdaten aufgebaut werden konnte.
+&lt;/p&gt;
+&lt;h3&gt;SAS - Short Authentication String&lt;/h3&gt;
+&lt;p&gt;
+Beide Teilnehmer eines verschlüsselten Gesprächs bekommen bei der ersten Kontaktaufnahme den SAS angezeigt, einen nicht fälschbaren eindeutigen &quot;Fingerabdruck&quot; der ausgehandelten Verschlüsselung. Durch Vergleich dieses SAS können Sie und Ihr Gesprächspartner sicherstellen, dass Sie tatsächlich &lt;i&gt;direkt&lt;/i&gt; miteinander verbunden sind. Stichwort &quot;man-in-the-middle attack&quot; (MitM).
+&lt;/p&gt;
+&lt;p&gt;
+Da ein Angreifer schlecht mitten im Gespräch die Stimme Ihres Gesprächspartners imitieren kann, reicht es völlig, beim ersten Telefonat den SAS vorzulesen.
+Bei Übereinstimmung klicken Sie auf das Vorhängeschloss, und Twinkle merkt sich die (den &quot;Ausweis&quot; der) Gegenstelle als &quot;persönlich bekannt&quot; und lässt sich bei zukünftigen Anrufen von/zu dieser GgSt nicht täuschen (&quot;Ausweiskontrolle&quot;). Das Schloss wird mit einem Häkchen dargestellt, und signalisiert so, dass die GgSt auf ihre Identität überprüft und eindeutig erkannt wurde, und also eine direkte Verbindung besteht.
+&lt;/p&gt;
+&lt;p&gt;Klick auf ein Schloss &lt;i&gt;mit&lt;/i&gt; Häkchen löscht die Vertrauensbeziehung und Sie können/müssen den SAS neu vergleichen&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>sas</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Short authentication string</source>
+ <translation>SAS - Geheimwort (Short authentication string)</translation>
+ </message>
+ <message>
+ <source>g711a/g711a</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Audio codec</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>0:00:00</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Call duration</source>
+ <translation>Anrufdauer</translation>
+ </message>
+ <message>
+ <source>sip:from</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>sip:to</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>subject</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>photo</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Line &amp;2:</source>
+ <translation>Leitung &amp;2:
+</translation>
+ </message>
+ <message>
+ <source>Alt+2</source>
+ <translation>Alt+2</translation>
+ </message>
+ <message>
+ <source>Click to switch to line 2.</source>
+ <translation>Anklicken (oder Alt+2), um auf Leitung 2 zu schalten.</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;Datei</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>B&amp;earbeiten</translation>
+ </message>
+ <message>
+ <source>C&amp;all</source>
+ <translation>&amp;Anruf</translation>
+ </message>
+ <message>
+ <source>Activate line</source>
+ <translation>Leitung auswählen</translation>
+ </message>
+ <message>
+ <source>&amp;Registration</source>
+ <translation>A&amp;nmeldung</translation>
+ </message>
+ <message>
+ <source>&amp;Services</source>
+ <translation>Dien&amp;ste</translation>
+ </message>
+ <message>
+ <source>&amp;View</source>
+ <translation>Ans&amp;icht</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Hilfe</translation>
+ </message>
+ <message>
+ <source>Call Toolbar</source>
+ <translation>Anruf Werkzeugleiste</translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation>Abmelden und Twinkle beenden</translation>
+ </message>
+ <message>
+ <source>&amp;Quit</source>
+ <translation>B&amp;eenden</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>About Twinkle</source>
+ <translation>Über Twinkle</translation>
+ </message>
+ <message>
+ <source>&amp;About Twinkle</source>
+ <translation>Ü&amp;ber Twinkle</translation>
+ </message>
+ <message>
+ <source>Call someone</source>
+ <translation>Anrufen - erweiterte Nummerneingabe, Betreff...</translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Answer incoming call</source>
+ <translation>Anruf entgegennehmen - landläufig &quot;Abheben&quot;</translation>
+ </message>
+ <message>
+ <source>F6</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Release call</source>
+ <translation>Anruf beenden</translation>
+ </message>
+ <message>
+ <source>Reject incoming call</source>
+ <translation>Eingehenden Ruf ablehnen</translation>
+ </message>
+ <message>
+ <source>F8</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Put a call on hold, or retrieve a held call</source>
+ <translation>Ein Gespräch halten, oder ein gehaltenes fortsetzen</translation>
+ </message>
+ <message>
+ <source>Redirect incoming call without answering</source>
+ <translation>Eingehenden Ruf umleiten ohne Gesprächsannahme</translation>
+ </message>
+ <message>
+ <source>Open keypad to enter digits for voice menu&apos;s</source>
+ <translation>Öffnet eine Wähltastatur zur Eingabe von Tastenbefehlen - für Steuerung von zB. Anrufbeantwortern</translation>
+ </message>
+ <message>
+ <source>Register</source>
+ <translation>Anmelden beim SIP-Sever</translation>
+ </message>
+ <message>
+ <source>&amp;Register</source>
+ <translation>An&amp;melden</translation>
+ </message>
+ <message>
+ <source>Deregister</source>
+ <translation>Abmelden</translation>
+ </message>
+ <message>
+ <source>&amp;Deregister</source>
+ <translation>Abmel&amp;den</translation>
+ </message>
+ <message>
+ <source>Deregister this device</source>
+ <translation>Dieses Telefon abmelden</translation>
+ </message>
+ <message>
+ <source>Show registrations</source>
+ <translation>Anmeldungen bei den Servern abfragen</translation>
+ </message>
+ <message>
+ <source>&amp;Show registrations</source>
+ <translation>Anmeldungen &amp;zeigen</translation>
+ </message>
+ <message>
+ <source>Terminal capabilities</source>
+ <translation>Fähigkeiten Gegenstelle</translation>
+ </message>
+ <message>
+ <source>Request terminal capabilities from someone</source>
+ <translation>Abfrage der &quot;terminal capabilities&quot;, der Eigenschaften einer Gegenstelle</translation>
+ </message>
+ <message>
+ <source>Do not disturb</source>
+ <translation>Bitte nicht stören</translation>
+ </message>
+ <message>
+ <source>&amp;Do not disturb</source>
+ <translation>&amp;Bitte nicht stören</translation>
+ </message>
+ <message>
+ <source>Call redirection</source>
+ <translation>Rufumleitung</translation>
+ </message>
+ <message>
+ <source>Call &amp;redirection...</source>
+ <translation>&amp;Rufumleitung...</translation>
+ </message>
+ <message>
+ <source>Repeat last call</source>
+ <translation>Wahlwiederholung, wählt letzten Ruf erneut</translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>About Qt</source>
+ <translation>Über Qt</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation>Über &amp;Qt</translation>
+ </message>
+ <message>
+ <source>User profile</source>
+ <translation>Benutzerprofil bearbeiten</translation>
+ </message>
+ <message>
+ <source>&amp;User profile...</source>
+ <translation>Ben&amp;utzerprofil...</translation>
+ </message>
+ <message>
+ <source>Join two calls in a 3-way conference</source>
+ <translation>Leitung1, 2 und lokal zu einer 3er Konferenz zusammenschalten</translation>
+ </message>
+ <message>
+ <source>Mute a call</source>
+ <translation>Das Mikrofon für diese Leitung ab- oder wieder anschalten</translation>
+ </message>
+ <message>
+ <source>Transfer call</source>
+ <translation>Gespräch weitervermitteln</translation>
+ </message>
+ <message>
+ <source>System settings</source>
+ <translation>Systemeinstellungen bearbeiten</translation>
+ </message>
+ <message>
+ <source>&amp;System settings...</source>
+ <translation>&amp;Systemeinstellungen...</translation>
+ </message>
+ <message>
+ <source>Deregister all</source>
+ <translation>Abmelden alle Endg</translation>
+ </message>
+ <message>
+ <source>Deregister &amp;all</source>
+ <translation>&amp;Abmelden alle Endger.</translation>
+ </message>
+ <message>
+ <source>Deregister all your registered devices</source>
+ <translation>Abmelden aller Geräte unter dieser Benutzerkennung</translation>
+ </message>
+ <message>
+ <source>Auto answer</source>
+ <translation>Autom. Annehmen</translation>
+ </message>
+ <message>
+ <source>&amp;Auto answer</source>
+ <translation>&amp;Autom. Annehmen</translation>
+ </message>
+ <message>
+ <source>Log</source>
+ <translation>SystemLog anzeigen</translation>
+ </message>
+ <message>
+ <source>&amp;Log...</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Call history</source>
+ <translation>Liste der letzen Anrufe anzeigen</translation>
+ </message>
+ <message>
+ <source>Call &amp;history...</source>
+ <translation>Liste aller Anru&amp;fe...</translation>
+ </message>
+ <message>
+ <source>F9</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Change user ...</source>
+ <translation>Benutzerprofile ...</translation>
+ </message>
+ <message>
+ <source>&amp;Change user ...</source>
+ <translation>&amp;Benutzerprofile ...</translation>
+ </message>
+ <message>
+ <source>Activate or de-activate users</source>
+ <translation>Benutzerprofile de/aktivieren, bearbeiten usw.</translation>
+ </message>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation>&quot;Was ist das?&quot;-Kontexthilfe</translation>
+ </message>
+ <message>
+ <source>What&apos;s &amp;This?</source>
+ <translation>Was ist &amp;das?</translation>
+ </message>
+ <message>
+ <source>Shift+F1</source>
+ <translation>Shift+F1</translation>
+ </message>
+ <message>
+ <source>Line 1</source>
+ <translation>Leitung 1</translation>
+ </message>
+ <message>
+ <source>Line 2</source>
+ <translation>Leitung 2
+</translation>
+ </message>
+ <message>
+ <source>idle</source>
+ <translation>frei</translation>
+ </message>
+ <message>
+ <source>dialing</source>
+ <translation>wählt</translation>
+ </message>
+ <message>
+ <source>attempting call, please wait</source>
+ <translation>versuche Rufaufbau, bitte warten</translation>
+ </message>
+ <message>
+ <source>incoming call</source>
+ <translation>ankommender Ruf</translation>
+ </message>
+ <message>
+ <source>establishing call, please wait</source>
+ <translation>Verbindungsaufbau, bitte warten</translation>
+ </message>
+ <message>
+ <source>established</source>
+ <translation>Verbindung hergestellt</translation>
+ </message>
+ <message>
+ <source>established (waiting for media)</source>
+ <translation>Verbindung hergestellt (warte auf Daten)</translation>
+ </message>
+ <message>
+ <source>releasing call, please wait</source>
+ <translation>trenne Verbindung, bitte warten</translation>
+ </message>
+ <message>
+ <source>unknown state</source>
+ <translation>unbekannter Status</translation>
+ </message>
+ <message>
+ <source>Voice is encrypted</source>
+ <translation>Sprachübertragung verschlüsselt</translation>
+ </message>
+ <message>
+ <source>Click to confirm SAS.</source>
+ <translation>SAS bestätigen.</translation>
+ </message>
+ <message>
+ <source>Click to clear SAS verification.</source>
+ <translation>SAS Bestätigung löschen.</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Benutzer:</translation>
+ </message>
+ <message>
+ <source>Call:</source>
+ <translation>Ruf:</translation>
+ </message>
+ <message>
+ <source>Registration status:</source>
+ <translation>Anmeldungsstatus:</translation>
+ </message>
+ <message>
+ <source>Registered</source>
+ <translation>angemeldet</translation>
+ </message>
+ <message>
+ <source>Failed</source>
+ <translation>fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>Not registered</source>
+ <translation>nicht angemeldet</translation>
+ </message>
+ <message>
+ <source>No users are registered.</source>
+ <translation>Kein Benutzer angemeldet.</translation>
+ </message>
+ <message>
+ <source>Do not disturb active for:</source>
+ <translation>&quot;Bitte nicht stören&quot; aktiviert für:</translation>
+ </message>
+ <message>
+ <source>Redirection active for:</source>
+ <translation>Rufumleitung aktiviert für:</translation>
+ </message>
+ <message>
+ <source>Auto answer active for:</source>
+ <translation>&quot;Automatisch annehmen&quot; aktiviert für:</translation>
+ </message>
+ <message>
+ <source>Do not disturb is not active.</source>
+ <translation>&quot;Bitte nicht stören&quot; nicht aktiviert.</translation>
+ </message>
+ <message>
+ <source>Redirection is not active.</source>
+ <translation>Rufumleitung nicht aktiviert.</translation>
+ </message>
+ <message>
+ <source>Auto answer is not active.</source>
+ <translation>&quot;Automatisch annehmen&quot; nicht aktiviert.</translation>
+ </message>
+ <message>
+ <source>You have no missed calls.</source>
+ <translation>Keine Anrufe in Abwesenheit.</translation>
+ </message>
+ <message>
+ <source>You missed 1 call.</source>
+ <translation>1 Anruf in Abwesenheit.</translation>
+ </message>
+ <message>
+ <source>You missed %1 calls.</source>
+ <translation>%1 Anrufe in Abwesenheit.</translation>
+ </message>
+ <message>
+ <source>Click to see call history for details.</source>
+ <translation>Anklicken öffnet Anrufliste mit Details .</translation>
+ </message>
+ <message>
+ <source>Starting user profiles...</source>
+ <translation>Starte Benutzerprofile...</translation>
+ </message>
+ <message>
+ <source>The following profiles are both for user %1</source>
+ <translation>Die folgenden Benutzerprofile verwenden die gleiche SIP-Adresse %1</translation>
+ </message>
+ <message>
+ <source>You can only run multiple profiles for different users.</source>
+ <translation>Sie können nicht für einen SIP-Account gleichzeitig mehrere Profile aktivieren.</translation>
+ </message>
+ <message>
+ <source>You have changed the SIP UDP port. This setting will only become active when you restart Twinkle.</source>
+ <translation>Der SIP UDP port wurde geändert, dies wird erst beim nächsten Start von Twinkle wirksam.</translation>
+ </message>
+ <message>
+ <source>Esc</source>
+ <translation>Esc</translation>
+ </message>
+ <message>
+ <source>Transfer consultation</source>
+ <translation>Rückfrage</translation>
+ </message>
+ <message>
+ <source>Hide identity</source>
+ <translation>Absenderangaben unterdrücken</translation>
+ </message>
+ <message>
+ <source>Click to show registrations.</source>
+ <translation>Anklicken: Anmeldungen abfragen.</translation>
+ </message>
+ <message>
+ <source>%1 new, 1 old message</source>
+ <translation>%1 neue, 1 alte Mitteilung</translation>
+ </message>
+ <message>
+ <source>%1 new, %2 old messages</source>
+ <translation>%1 neue, %2 alte Mitteilungen</translation>
+ </message>
+ <message>
+ <source>1 new message</source>
+ <translation>1 neue Mitteilung</translation>
+ </message>
+ <message>
+ <source>%1 new messages</source>
+ <translation>%1 neue Mitteilungen</translation>
+ </message>
+ <message>
+ <source>1 old message</source>
+ <translation>1 alte Mitteilung</translation>
+ </message>
+ <message>
+ <source>%1 old messages</source>
+ <translation>%1 alte Mitteilungen</translation>
+ </message>
+ <message>
+ <source>Messages waiting</source>
+ <translation>Mitteilungen da</translation>
+ </message>
+ <message>
+ <source>No messages</source>
+ <translation>Keine Mitteilungen</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Voice mail status:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Voice-Mail Status:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Failure</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>Unbekannt</translation>
+ </message>
+ <message>
+ <source>Click to access voice mail.</source>
+ <translation>Anklicken: Voice-Mail abrufen.</translation>
+ </message>
+ <message>
+ <source>Click to activate/deactivate</source>
+ <translation>Anklicken: (de/)aktivieren</translation>
+ </message>
+ <message>
+ <source>Click to activate</source>
+ <translation>Anklicken: aktivieren</translation>
+ </message>
+ <message>
+ <source>not provisioned</source>
+ <translation>nicht eingetragen</translation>
+ </message>
+ <message>
+ <source>You must provision your voice mail address in your user profile, before you can access it.</source>
+ <translation>Sie müssen die Adresse/Nr Ihres Anrufbeantworters im Profil eintragen, damit dies geht.</translation>
+ </message>
+ <message>
+ <source>The line is busy. Cannot access voice mail.</source>
+ <translation>Kann Voice-Mail nicht abrufen - Leitung belegt.</translation>
+ </message>
+ <message>
+ <source>The voice mail address %1 is an invalid address. Please provision a valid address in your user profile.</source>
+ <translation>Die Voice-Mail-Adresse &quot;%1&quot; is ungültig. Bitte korregieren Sie die Einstellungen im Benutzerprofil.</translation>
+ </message>
+ <message>
+ <source>Call</source>
+ <comment>toolbar text</comment>
+ <translation>Anruf+</translation>
+ </message>
+ <message>
+ <source>&amp;Call...</source>
+ <comment>call menu text</comment>
+ <translation>Anruf+... (&amp;Call)</translation>
+ </message>
+ <message>
+ <source>Answer</source>
+ <comment>toolbar text</comment>
+ <translation>Ja?</translation>
+ </message>
+ <message>
+ <source>&amp;Answer</source>
+ <comment>menu text</comment>
+ <translation>&amp;Annehmen</translation>
+ </message>
+ <message>
+ <source>Bye</source>
+ <comment>toolbar text</comment>
+ <translation>Ende</translation>
+ </message>
+ <message>
+ <source>&amp;Bye</source>
+ <comment>menu text</comment>
+ <translation>Auflegen (&amp;Bye)</translation>
+ </message>
+ <message>
+ <source>Reject</source>
+ <comment>toolbar text</comment>
+ <translation>Nein!</translation>
+ </message>
+ <message>
+ <source>&amp;Reject</source>
+ <comment>menu text</comment>
+ <translation>Ab&amp;weisen</translation>
+ </message>
+ <message>
+ <source>Hold</source>
+ <comment>toolbar text</comment>
+ <translation>Halten</translation>
+ </message>
+ <message>
+ <source>&amp;Hold</source>
+ <comment>menu text</comment>
+ <translation>&amp;Halten</translation>
+ </message>
+ <message>
+ <source>Redirect</source>
+ <comment>toolbar text</comment>
+ <translation>Umleit</translation>
+ </message>
+ <message>
+ <source>R&amp;edirect...</source>
+ <comment>menu text</comment>
+ <translation>Uml&amp;eiten...</translation>
+ </message>
+ <message>
+ <source>Dtmf</source>
+ <comment>toolbar text</comment>
+ <translation>DTMF</translation>
+ </message>
+ <message>
+ <source>&amp;Dtmf...</source>
+ <comment>menu text</comment>
+ <translation>&amp;DTMF...</translation>
+ </message>
+ <message>
+ <source>&amp;Terminal capabilities...</source>
+ <comment>menu text</comment>
+ <translation>&amp;Fähigkeiten Gegenstelle...</translation>
+ </message>
+ <message>
+ <source>Redial</source>
+ <comment>toolbar text</comment>
+ <translation>-&gt; -&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Redial</source>
+ <comment>menu text</comment>
+ <translation>Wahlwiederholun&amp;g</translation>
+ </message>
+ <message>
+ <source>Conf</source>
+ <comment>toolbar text</comment>
+ <translation>3er-K.</translation>
+ </message>
+ <message>
+ <source>&amp;Conference</source>
+ <comment>menu text</comment>
+ <translation>Konferen&amp;z</translation>
+ </message>
+ <message>
+ <source>Mute</source>
+ <comment>toolbar text</comment>
+ <translation>Stumm</translation>
+ </message>
+ <message>
+ <source>&amp;Mute</source>
+ <comment>menu text</comment>
+ <translation>Stu&amp;mm
+</translation>
+ </message>
+ <message>
+ <source>Xfer</source>
+ <comment>toolbar text</comment>
+ <translation>Vmtlg</translation>
+ </message>
+ <message>
+ <source>Trans&amp;fer...</source>
+ <comment>menu text</comment>
+ <translation>Vermitte&amp;ln...</translation>
+ </message>
+ <message>
+ <source>Voice mail</source>
+ <translation>Anrufbeantworter</translation>
+ </message>
+ <message>
+ <source>&amp;Voice mail</source>
+ <translation>A&amp;nrufbeantworter</translation>
+ </message>
+ <message>
+ <source>Access voice mail</source>
+ <translation>Voice-Mailbox abfragen</translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Buddy list</source>
+ <translation>Buddyliste</translation>
+ </message>
+ <message>
+ <source>&amp;Message</source>
+ <translation>&amp;Mitteilung</translation>
+ </message>
+ <message>
+ <source>Msg</source>
+ <translation>Msg</translation>
+ </message>
+ <message>
+ <source>Instant &amp;message...</source>
+ <translation>Instant &amp;Message...</translation>
+ </message>
+ <message>
+ <source>Instant message</source>
+ <translation>Instant Message senden</translation>
+ </message>
+ <message>
+ <source>&amp;Call...</source>
+ <translation>Anrufen (&amp;Call)...</translation>
+ </message>
+ <message>
+ <source>&amp;Edit...</source>
+ <translation>B&amp;earbeiten...</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Löschen</translation>
+ </message>
+ <message>
+ <source>O&amp;ffline</source>
+ <translation>O&amp;ffline</translation>
+ </message>
+ <message>
+ <source>&amp;Online</source>
+ <translation>&amp;Online</translation>
+ </message>
+ <message>
+ <source>&amp;Change availability</source>
+ <translation>Online-&amp;Status ändern</translation>
+ </message>
+ <message>
+ <source>&amp;Add buddy...</source>
+ <translation>Neuen Buddy &amp;anlegen...</translation>
+ </message>
+ <message>
+ <source>Failed to save buddy list: %1</source>
+ <translation>Fehler beim Speichern der Buddyliste: &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Die Liste Ihrer &lt;b&gt;Benutzerprofile (fett)&lt;/b&gt; und Buddies &lt;i&gt;(deutsch: &quot;Kumpels&quot;. Ihre wichtigen Kontakte)&lt;/i&gt; für die einzelnen Profile.&lt;br&gt;
+Über das Kontextmenü des einzelnen Benutzerprofils erzeugen Sie neue Buddy-Einträge und stellen Ihren eigenen Online-Status ein.&lt;br&gt;
+Der Online-Status der Buddies wird durch gelbe (=online) und graue (=offline) Icons dargestellt. Details erscheinen, wenn Sie den Cursor über das Icon stellen.&lt;br&gt;
+&lt;br&gt;
+Um Ihren eigenen Online-Status zu veröffentlichen, brauchen Sie die Unterstützung durch einen öffentlichen &quot;presence server&quot; &lt;i&gt;Ihres&lt;/i&gt; Providers.&lt;br&gt;
+Um den Online-Status eines Buddies abzufragen, muss &lt;i&gt;dessen&lt;/i&gt; Provider einen &quot;presence server&quot; im Netz ereichbar halten, und dieser muss Ihre Abfrage gestatten. Es ist daher sinnvoll, Buddies mit einem bestimmten Provider (thomas@&lt;b&gt;DerProvider.de&lt;/b&gt;) unter einem gültigen eigenen Benutzerprofil mit dem selben Provider (ich.selber@&lt;b&gt;DerProvider.de&lt;/b&gt;) anzulegen, da viele &quot;presence server&quot; nur dann die Abfrage gestatten.</translation>
+ </message>
+ <message>
+ <source>&amp;Buddy list</source>
+ <translation>&amp;Buddyliste </translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation>&amp;Detailanzeige</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Diamondcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sign up</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Sign up...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recharge...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Balance history...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call history...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Admin center...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recharge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Balance history</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Admin center</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>NumberConversionForm</name>
+ <message>
+ <source>Twinkle - Number conversion</source>
+ <translation>Twinkle - Umwandlung Rufnummer</translation>
+ </message>
+ <message>
+ <source>&amp;Match expression:</source>
+ <translation>&amp;Suchausdruck:</translation>
+ </message>
+ <message>
+ <source>&amp;Replace:</source>
+ <translation>&amp;Ersetzung:</translation>
+ </message>
+ <message>
+ <source>Perl style format string for the replacement number.</source>
+ <translation>Formatstring wie in Perl für die Ersetzung der Nummer.</translation>
+ </message>
+ <message>
+ <source>Perl style regular expression matching the number format you want to modify.</source>
+ <translation>Regulärer Ausdruck (Perl regex), der die zu ändernde Rufnummer beschreibt. </translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Abbruch (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>Match expression may not be empty.</source>
+ <translation>Leerer Suchausdruck ist ungültig.</translation>
+ </message>
+ <message>
+ <source>Replace value may not be empty.</source>
+ <translation>Leerer Ersetzungsausdruck ist ungültig.</translation>
+ </message>
+ <message>
+ <source>Invalid regular expression.</source>
+ <translation>Ungültige regular expression.</translation>
+ </message>
+</context>
+<context>
+ <name>RedirectForm</name>
+ <message>
+ <source>Twinkle - Redirect</source>
+ <translation>Twinkle - Rufumleitung</translation>
+ </message>
+ <message>
+ <source>Redirect incoming call to</source>
+ <translation>Ankommenden Ruf umleiten nach</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Es können bis zu 3 Ziele für die Rufumleitung angegeben werden. Wird der Ruf vom ersten Ziel nicht angenommen, werden das zweite und dann das dritte verwendet.</translation>
+ </message>
+ <message>
+ <source>&amp;3rd choice destination:</source>
+ <translation>&amp;3. Ziel:</translation>
+ </message>
+ <message>
+ <source>&amp;2nd choice destination:</source>
+ <translation>&amp;2. Ziel:</translation>
+ </message>
+ <message>
+ <source>&amp;1st choice destination:</source>
+ <translation>&amp;1. Ziel:</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adressbuch</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Rufnummer/SIP-Adresse aus Adressbuch wählen.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Abbruch (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SelectNicForm</name>
+ <message>
+ <source>Twinkle - Select NIC</source>
+ <translation>Twinkle - Netzwerkanschluss wählen</translation>
+ </message>
+ <message>
+ <source>Select the network interface/IP address that you want to use:</source>
+ <translation>Bitte wählen Sie den zu verwendenden Anschluss / IP-Adr.:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Auf Ihrem Rechner sind mehrere IP-Adressen verfügbar. Bitte wählen Sie diejenige, unter der Ihr Rechner aus dem Internet bzw -wenn Sie einen Router verwenden- in ihrem lokalen Netz erreichbar ist. Diese IP-Adresse verwendet Twinkle dann in den SIP-Datenpaketen als Absenderangabe.</translation>
+ </message>
+ <message>
+ <source>Set as default &amp;IP</source>
+ <translation>&amp;IP-Adr. als Standard</translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation>Alt+I</translation>
+ </message>
+ <message>
+ <source>Make the selected IP address the default IP address. The next time you start Twinkle, this IP address will be automatically selected.</source>
+ <translation>Die ausgewählte IP-Adresse als default setzen. In Zukunft verwendet Twinkle beim Start automatisch diese Adresse.</translation>
+ </message>
+ <message>
+ <source>Set as default &amp;NIC</source>
+ <translation>A&amp;nschl. als Standard</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation>Alt+N</translation>
+ </message>
+ <message>
+ <source>Make the selected network interface the default interface. The next time you start Twinkle, this interface will be automatically selected.</source>
+ <translation>Den ausgewählten Netzwerkanschluss als default setzen. In Zukunft verwendet Twinkle beim Start automatisch diesen Anschluss.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>If you want to remove or change the default at a later time, you can do that via the system settings.</source>
+ <translation>Die Defaulteinstellungen für IP bzw. Anschluss lassen sich jederzeit in den Systemeinstellungen löschen oder ändern.</translation>
+ </message>
+</context>
+<context>
+ <name>SelectProfileForm</name>
+ <message>
+ <source>Twinkle - Select user profile</source>
+ <translation>Twinkle - Auswahl Benutzerprofil</translation>
+ </message>
+ <message>
+ <source>Select user profile(s) to run:</source>
+ <translation>Wählen Sie die Benutzerprofile, die verwendet werden sollen:</translation>
+ </message>
+ <message>
+ <source>User profile</source>
+ <translation>Benutzerprofil</translation>
+ </message>
+ <message>
+ <source>Tick the check boxes of the user profiles that you want to run and press run.</source>
+ <translation>Markieren Sie die Benutzerprofile, mit denen Twinkle arbeiten soll und drücken Sie dann &quot;Anwenden&quot;.</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Neu</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation type="obsolete">Alt+N</translation>
+ </message>
+ <message>
+ <source>Create a new profile with the profile editor.</source>
+ <translation>Anlegen eines neuen Benutzerprofils mit dem Profil-Editor.</translation>
+ </message>
+ <message>
+ <source>&amp;Wizard</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation>Alt+W</translation>
+ </message>
+ <message>
+ <source>Create a new profile with the wizard.</source>
+ <translation>Anlegen eines neuen Benutzerprofils mit dem Wizard.</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>Änd&amp;ern</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation>Alt+E</translation>
+ </message>
+ <message>
+ <source>Edit the highlighted profile.</source>
+ <translation>Das ausgewählte Benutzerprofil bearbeiten.</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Löschen</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation>Alt+L</translation>
+ </message>
+ <message>
+ <source>Delete the highlighted profile.</source>
+ <translation>Das ausgewählte Benutzerprofil löschen.</translation>
+ </message>
+ <message>
+ <source>Ren&amp;ame</source>
+ <translation>&amp;Umbenennen</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>Rename the highlighted profile.</source>
+ <translation>Das ausgewählte Benutzerprofil umbenennen.</translation>
+ </message>
+ <message>
+ <source>&amp;Set as default</source>
+ <translation>Als &amp;Standard</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>Make the selected profiles the default profiles. The next time you start Twinkle, these profiles will be automatically run.</source>
+ <translation>Die ausgewählten Profile als default verwenden. In Zukunft verwendet Twinkle beim Start automatisch diese Benutzerprofile.</translation>
+ </message>
+ <message>
+ <source>&amp;Run</source>
+ <translation>&amp;Anwenden</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Run Twinkle with the selected profiles.</source>
+ <translation>Twinkle startet die markierten Benutzerprofile.</translation>
+ </message>
+ <message>
+ <source>S&amp;ystem settings</source>
+ <translation>S&amp;ystemeinstellungen</translation>
+ </message>
+ <message>
+ <source>Alt+Y</source>
+ <translation>Alt+Y</translation>
+ </message>
+ <message>
+ <source>Edit the system settings.</source>
+ <translation>Systemeinstellungen bearbeiten.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Abbruch (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;Before you can use Twinkle, you must create a user profile.&lt;br&gt;Click OK to create a profile.&lt;/html&gt;</source>
+ <translation>&lt;html&gt;Bevor Sie Twinkle benutzen können, müssen Sie ein Benutzerprofil anlegen.&lt;br&gt;Klicken Sie OK um ein neues Profil anzulegen.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;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.&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;Choose what method you wish to use.&lt;/html&gt;</source>
+ <translation type="obsolete">&lt;html&gt;Sie können zum Erzeugen des Benutzerprofils den Profileditor verwenden. Dieser erlaubt detailierte Einstellungen für SIP-Protokoll, RTP sowie viele weitere Bereiche.&lt;br&gt;&lt;br&gt;Oder Sie nutzen den Wizard, um schnell und einfach die wichtigsten Einstellungen für ein Benutzerprofil vorzunehmen. Der Wizard erfragt von Ihnen nur die absolut notwendigen Daten, die Sie von Ihrem SIP-Provider bei der Anmeldung mitgeteilt bekommen haben sollten. Für einige Provider werden Ihnen sogar viele dieser Daten vorgeschlagen. Wenn Sie den Wizard nutzen, können Sie später immer noch alle Details mit Hilfe des Editors nach Wunsch ändern und ergänzen.&lt;br&gt;&lt;br&gt;Hilfe erhalten Sie überall in Twinkle entweder durch Drücken von &quot;Umschalt + F1&quot;, über das Kontextmenü via rechten Mausknopf, oder durch Anklicken des &quot;?&quot; oben rechts am Fensterrand.&lt;br&gt;&lt;br&gt;Bitte wählen Sie, wie Sie das Benutzerprofil anlegen wollen.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;Next you may adjust the system settings. You can change these settings always at a later time.&lt;br&gt;&lt;br&gt;Click OK to view and adjust the system settings.&lt;/html&gt;</source>
+ <translation>&lt;html&gt;Als nächstes können und sollten Sie die Systemeinstellungen kontrollieren und anpassen. Insbesondere die Einstellung zu Mikrophon und Lautsprecher im Bereich Audio sollte zu der in Ihrem Rechner vorhandenen Hardware passen&lt;br&gt;&lt;br&gt;Klicken Sie OK um in die Systemeinstellungen zu gelangen. Sie können auch später jederzeit alle Systemeinstellungen ändern&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>You did not select any user profile to run.
+Please select a profile.</source>
+ <translation>Sie haben kein Benutzerprofil zur Verwendung ausgewählt. Bitte wählen Sie mindestens ein Profil.</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete profile &apos;%1&apos;?</source>
+ <translation>Benutzerprofil %1 wirklich löschen?</translation>
+ </message>
+ <message>
+ <source>Delete profile</source>
+ <translation>Benutzerprofil löschen</translation>
+ </message>
+ <message>
+ <source>Failed to delete profile.</source>
+ <translation>Fehler beim Löschen des Benutzerprofils.</translation>
+ </message>
+ <message>
+ <source>Failed to rename profile.</source>
+ <translation>Fehler beim Umbenennen des Benutzerprofils.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;If you want to remove or change the default at a later time, you can do that via the system settings.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Die Defaulteinstellungen lassen sich jederzeit in den Systemeinstellungen löschen oder ändern. &lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Cannot find .twinkle directory in your home directory.</source>
+ <translation>Kann den Ordner &quot;.twinkle&quot; in Ihrem home-Ordner (&quot;/home/ihrname/&quot;) nicht finden.</translation>
+ </message>
+ <message>
+ <source>&amp;Profile editor</source>
+ <translation>&amp;Profil-Editor</translation>
+ </message>
+ <message>
+ <source>Create profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ed&amp;itor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation type="unfinished">Alt+I</translation>
+ </message>
+ <message>
+ <source>Dia&amp;mondcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modify profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Startup profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Diamondcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;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.&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;You can create a Diamondcard account to make worldwide calls to regular and cell phones and send SMS messages.&lt;br&gt;&lt;br&gt;Choose what method you wish to use.&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SelectUserForm</name>
+ <message>
+ <source>Twinkle - Select user</source>
+ <translation>Twinkle - Auswahl Benutzerprofile</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Abbruch (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>&amp;Select all</source>
+ <translation>Alle au&amp;swählen</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>C&amp;lear all</source>
+ <translation>Alle abwäh&amp;len</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+L</translation>
+ </message>
+ <message>
+ <source>purpose</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation>Benutzer</translation>
+ </message>
+ <message>
+ <source>Register</source>
+ <translation>Anmelden</translation>
+ </message>
+ <message>
+ <source>Select users that you want to register.</source>
+ <translation>Benutzerprofile zum Anmelden wählen.</translation>
+ </message>
+ <message>
+ <source>Deregister</source>
+ <translation>Abmelden</translation>
+ </message>
+ <message>
+ <source>Select users that you want to deregister.</source>
+ <translation>Benutzerprofile zum Abmelden wählen.</translation>
+ </message>
+ <message>
+ <source>Deregister all devices</source>
+ <translation>Abmelden aller Geräte</translation>
+ </message>
+ <message>
+ <source>Select users for which you want to deregister all devices.</source>
+ <translation>Benutzerprofile zum Abmelden (alle Geräte) wählen.</translation>
+ </message>
+ <message>
+ <source>Do not disturb</source>
+ <translation>Bitte nicht stören</translation>
+ </message>
+ <message>
+ <source>Select users for which you want to enable &apos;do not disturb&apos;.</source>
+ <translation>Benutzerprofile wählen, für die der Dienst &quot;Bitte nicht stören&quot; aktiviert werden soll.</translation>
+ </message>
+ <message>
+ <source>Auto answer</source>
+ <translation>Autom. Annehmen</translation>
+ </message>
+ <message>
+ <source>Select users for which you want to enable &apos;auto answer&apos;.</source>
+ <translation>Benutzerprofile wählen, für die der Dienst &quot;Automatisch Annehmen&quot; aktiviert werden soll.</translation>
+ </message>
+</context>
+<context>
+ <name>SendFileForm</name>
+ <message>
+ <source>Twinkle - Send File</source>
+ <translation>Twinkle - Sende Datei</translation>
+ </message>
+ <message>
+ <source>Select file to send.</source>
+ <translation>Dateiauswahl für Senden.</translation>
+ </message>
+ <message>
+ <source>&amp;File:</source>
+ <translation>&amp;Datei:</translation>
+ </message>
+ <message>
+ <source>&amp;Subject:</source>
+ <translation>&amp;Betreff:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Abbruch (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>File does not exist.</source>
+ <translation>Datei existiert nicht.</translation>
+ </message>
+ <message>
+ <source>Send file...</source>
+ <translation>Sende Datei...</translation>
+ </message>
+</context>
+<context>
+ <name>SrvRedirectForm</name>
+ <message>
+ <source>Twinkle - Call Redirection</source>
+ <translation>Twinkle - Rufumleitung</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Benutzer:</translation>
+ </message>
+ <message>
+ <source>There are 3 redirect services:&lt;p&gt;
+&lt;b&gt;Unconditional:&lt;/b&gt; redirect all calls
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Busy:&lt;/b&gt; redirect a call if both lines are busy
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;No answer:&lt;/b&gt; redirect a call when the no-answer timer expires
+&lt;/p&gt;</source>
+ <translation>Es gibt 3 Arten von Rufumleitung:&lt;p&gt;
+&lt;b&gt;Immer:&lt;/b&gt; alle Anrufe umleiten
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Besetzt:&lt;/b&gt; Anruf umleiten, wenn beide Leitungen besetzt
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Keine Antwort:&lt;/b&gt; Anruf nach Ablauf der &quot;keine-Antwort&quot;-Zeit umleiten
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Unconditional</source>
+ <translation>&amp;Immer</translation>
+ </message>
+ <message>
+ <source>&amp;Redirect all calls</source>
+ <translation>&amp;Alle Anrufe umleiten</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Activate the unconditional redirection service.</source>
+ <translation>Den Dienst &quot;alle Anrufe umleiten&quot; aktivieren.</translation>
+ </message>
+ <message>
+ <source>Redirect to</source>
+ <translation>Umleiten nach</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Es können bis zu 3 Ziele für die Rufumleitung angegeben werden. Wird der Ruf vom ersten Ziel nicht angenommen, werden das zweite und dann das dritte verwendet.</translation>
+ </message>
+ <message>
+ <source>&amp;3rd choice destination:</source>
+ <translation>&amp;3. Ziel:</translation>
+ </message>
+ <message>
+ <source>&amp;2nd choice destination:</source>
+ <translation>&amp;2. Ziel:</translation>
+ </message>
+ <message>
+ <source>&amp;1st choice destination:</source>
+ <translation>&amp;1. Ziel:</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adressbuch</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Rufnummer/SIP-Adresse aus Adressbuch wählen.</translation>
+ </message>
+ <message>
+ <source>&amp;Busy</source>
+ <translation>&amp;Besetzt</translation>
+ </message>
+ <message>
+ <source>&amp;Redirect calls when I am busy</source>
+ <translation>&amp;Anrufe umleiten, wenn alle Leitungen besetzt</translation>
+ </message>
+ <message>
+ <source>Activate the redirection when busy service.</source>
+ <translation>Den Dienst &quot;Umleiten, wenn besetzt&quot; aktivieren.</translation>
+ </message>
+ <message>
+ <source>&amp;No answer</source>
+ <translation>&amp;keine Antwort</translation>
+ </message>
+ <message>
+ <source>&amp;Redirect calls when I do not answer</source>
+ <translation>&amp;Anrufe umleiten, wenn Benutzer nicht reagiert</translation>
+ </message>
+ <message>
+ <source>Activate the redirection on no answer service.</source>
+ <translation>Den Dienst &quot;Umleiten, wenn keine Antwort&quot; aktivieren.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>Accept and save all changes.</source>
+ <translation>Änderungen speichern.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Abbruch (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>Undo your changes and close the window.</source>
+ <translation>Änderungen verwerfen und Fenster schliessen.</translation>
+ </message>
+ <message>
+ <source>You have entered an invalid destination.</source>
+ <translation>Ungültige Zieladresse eingegeben.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SysSettingsForm</name>
+ <message>
+ <source>Twinkle - System Settings</source>
+ <translation>Twinkle - Systemeinstellungen</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Allgemein</translation>
+ </message>
+ <message>
+ <source>Audio</source>
+ <translation>Audio</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <translation>Klingeltöne</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adressbuch</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Netzwerk</translation>
+ </message>
+ <message>
+ <source>Log</source>
+ <translation>Log</translation>
+ </message>
+ <message>
+ <source>Select a category for which you want to see or modify the settings.</source>
+ <translation>Bereich wählen, den Sie ändern wollen.</translation>
+ </message>
+ <message>
+ <source>Sound Card</source>
+ <translation>Audiogeräte</translation>
+ </message>
+ <message>
+ <source>Select the sound card for playing the ring tone for incoming calls.</source>
+ <translation>Audioanschluss wählen, über den der Klingelton abgespielt werden soll. Darf identisch mit Kopfhörer-Anschluss sein.</translation>
+ </message>
+ <message>
+ <source>Select the sound card to which your microphone is connected.</source>
+ <translation>Audioanschluss für Mikrofon wählen.</translation>
+ </message>
+ <message>
+ <source>Select the sound card for the speaker function during a call.</source>
+ <translation>Audioanschluss für Kopfhörer(/Lautsprecher) wählen. Darf identisch mit Anschluss für Klingelton sein.</translation>
+ </message>
+ <message>
+ <source>&amp;Speaker:</source>
+ <translation>&amp;Kopfhörer:</translation>
+ </message>
+ <message>
+ <source>&amp;Ring tone:</source>
+ <translation>&amp;Klingelton:</translation>
+ </message>
+ <message>
+ <source>Other device:</source>
+ <translation>Anderer Anschluss:</translation>
+ </message>
+ <message>
+ <source>&amp;Microphone:</source>
+ <translation>&amp;Mikrofon:</translation>
+ </message>
+ <message>
+ <source>When using ALSA, it is not recommended to use the default device for the microphone as it gives poor sound quality.</source>
+ <translation type="obsolete">Wenn Ihr Gesprächspartner schlechte Tonqualität beklagt, versuchen Sie für ALSA ein anderes Gerät statt &quot;default&quot;.</translation>
+ </message>
+ <message>
+ <source>Reduce &amp;noise from the microphone</source>
+ <translation type="obsolete">Spezielle Störgeräusch-U&amp;nterdrückung für manche defekte Gateways</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation type="obsolete">Alt+N</translation>
+ </message>
+ <message>
+ <source>Recordings from the microphone can contain noise. This could be annoying to the person on the other side of your call. This option removes soft noise coming from the microphone.
+
+The noise reduction algorithm is very simplistic. Sound is captured as 16 bits signed linear PCM samples. All samples between -50 and 50 are truncated to 0.</source>
+ <translation type="obsolete">Diese Option setzt alle Tonsamples mit -50 &lt; Messwert &lt; 50 auf 0.
+Michel hat diesen Hack entwickelt, als er mit fehlerhaften A/D-Wandlern in einigen Provider-Gateways konfrontiert war.
+Im Normalfall führt das Aktivieren eher zu einer kaum bemerkbaren Verschlechterung der Tonqualität.</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Spezielle Einstellungen</translation>
+ </message>
+ <message>
+ <source>OSS &amp;fragment size:</source>
+ <translation>OSS &amp;Fragmentgrösse:</translation>
+ </message>
+ <message>
+ <source>16</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>32</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>64</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>128</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>256</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Die play period size bestimmt vereinfacht gesagt die Grösse der Pakete, in denen die Soundkarte die Daten geliefert bekommt. Viele kleine Pakete belasten den Prozessor mehr, aber der Verlust eines Pakets stört dann weniger. Bei Problemen mit Aussetzern oder Rattern im Ton sollten Sie hier mit anderen Werten ein wenig experimentieren.</translation>
+ </message>
+ <message>
+ <source>ALSA &amp;play period size:</source>
+ <translation>ALSA &amp;play (LS) period size:</translation>
+ </message>
+ <message>
+ <source>&amp;ALSA capture period size:</source>
+ <translation>&amp;ALSA capture (MIC) period size:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Die OSS period size bestimmt vereinfacht gesagt die Grösse der Pakete, in denen die Soundkarte die Daten geliefert bekommt/liefert. Viele kleine Pakete belasten den Prozessor mehr, aber der Verlust eines Pakets stört dann weniger. Bei Problemen mit Aussetzern oder Rattern im Ton sollten Sie hier mit anderen Werten ein wenig experimentieren.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Die capture period size bestimmt vereinfacht gesagt die Grösse der Pakete, in denen die Soundkarte die Daten des Mikrofons liefert. Viele kleine Pakete belasten den Prozessor mehr, aber der Verlust eines Pakets stört dann weniger. Bei Klagen der Gegenstelle über Aussetzer oder Rattern im Ton sollten Sie hier mit anderen Werten ein wenig experimentieren.</translation>
+ </message>
+ <message>
+ <source>&amp;Max log size:</source>
+ <translation>&amp;Max. Grösse System-Log:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Das SystemLog wird nur von Experten zur Fehlersuche benötigt. Dieser Wert legt die maximale Grösse fest, die die Logbuch-Datei annehmen kann. Bei Erreichen dieser Grösse wird sie von twinkle.log in twinkle.log.old umbenannt, wobei eine schon existierende ältere Datei gleichen Namens gelöscht wird. Das Log wird in eine neue leere Datei twinkle.log fortgesetzt. Im Normalfall reicht hier 1MB völlig aus.</translation>
+ </message>
+ <message>
+ <source>MB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Log &amp;debug reports</source>
+ <translation>&amp;Debug-Meldungen loggen</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation>Alt+D</translation>
+ </message>
+ <message>
+ <source>Indicates if reports marked as &quot;debug&quot; will be logged.</source>
+ <translation>Aktiviert das Loggen von &quot;debug&quot;-Ausgaben.</translation>
+ </message>
+ <message>
+ <source>Log &amp;SIP reports</source>
+ <translation>&amp;SIP-Meldungen loggen</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>Indicates if SIP messages will be logged.</source>
+ <translation>Aktiviert das Loggen von Ausgaben für SIP-Ereignisse.</translation>
+ </message>
+ <message>
+ <source>Log S&amp;TUN reports</source>
+ <translation>S&amp;TUN-Meldungen loggen</translation>
+ </message>
+ <message>
+ <source>Alt+T</source>
+ <translation>Alt+T</translation>
+ </message>
+ <message>
+ <source>Indicates if STUN messages will be logged.</source>
+ <translation>Aktiviert das Loggen von Ausgaben für STUN-Ereignisse.</translation>
+ </message>
+ <message>
+ <source>Log m&amp;emory reports</source>
+ <translation>Sp&amp;eicher-Meldungen loggen</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation>Alt+E</translation>
+ </message>
+ <message>
+ <source>Indicates if reports concerning memory management will be logged.</source>
+ <translation>Aktiviert das Loggen von RAM-Anforderungs/Freigabe Protokollen.</translation>
+ </message>
+ <message>
+ <source>System tray</source>
+ <translation>Systemabschnitt</translation>
+ </message>
+ <message>
+ <source>Create &amp;system tray icon on startup</source>
+ <translation>Bei &amp;Start Icon in Systemabschnitt erzeugen</translation>
+ </message>
+ <message>
+ <source>Enable this option if you want a system tray icon for Twinkle. The system tray icon is created when you start Twinkle.</source>
+ <translation>Mit dieser Option erzeugt Twinkle beim Start ein Twinkle-Sternchen im Systemabschnitt , über das Sie jederzeit auf Twinkle zugreifen können und eingehende Rufe gemeldet bekommen.</translation>
+ </message>
+ <message>
+ <source>&amp;Hide in system tray when closing main window</source>
+ <translation>Bei &quot;Fenster sc&amp;hliessen&quot; in Systemabschnitt minimieren</translation>
+ </message>
+ <message>
+ <source>Alt+H</source>
+ <translation>Alt+H</translation>
+ </message>
+ <message>
+ <source>Enable this option if you want Twinkle to hide in the system tray when you close the main window.</source>
+ <translation>Wenn aktiviert, wird Twinkle durch Schliessen des Hauptfensters nicht beendet, sondern erzeugt das Sternchen im Systemabschnitt. Zum Beenden müssen Sie dann &quot;Beenden&quot; im Menü &quot;Datei&quot; oder im Kontextmenü des Sternchens wählen.</translation>
+ </message>
+ <message>
+ <source>Startup</source>
+ <translation>Programmstart</translation>
+ </message>
+ <message>
+ <source>Next time you start Twinkle, this IP address will be automatically selected. This is only useful when your computer has multiple and static IP addresses.</source>
+ <translation type="obsolete">Eine hier eingetragene IP-Adresse wird beim Start des Programms automatisch verwendet. Nur sinnvoll, wenn Ihr Rechner mehrere Netzwerkanschlüsse und für den Internetzugang eine unveränderliche IP-Adresse hat.</translation>
+ </message>
+ <message>
+ <source>Default &amp;IP address:</source>
+ <translation type="obsolete">Default &amp;IP-Addresse:</translation>
+ </message>
+ <message>
+ <source>Next time you start Twinkle, the IP address of this network interface be automatically selected. This is only useful when your computer has multiple network devices.</source>
+ <translation type="obsolete">Wenn Ihr Rechner mehrere Netzwerkanschlüsse hat, können Sie hier festlegen, welchen davon Twinkle beim Start verwenden soll. Sie werden dann nicht beim Start nach dem zu verwendenden Anschluss gefragt.</translation>
+ </message>
+ <message>
+ <source>Default &amp;network interface:</source>
+ <translation type="obsolete">Default &amp;Netzwerkanschluss:</translation>
+ </message>
+ <message>
+ <source>S&amp;tartup hidden in system tray</source>
+ <translation>Minimiert im Sys&amp;temabschnitt starten</translation>
+ </message>
+ <message>
+ <source>Next time you start Twinkle it will immediately hide in the system tray. This works best when you also select a default user profile.</source>
+ <translation>Twinkle öffnet beim Start kein Fenster, sondern startet minimiert im Systemabschnitt - also in Form des Sternchens. Dafür sollten Sie auch ein Default-Benutzerprofil einstellen, sonst erscheint doch ein Auswahlfenster beim Start.</translation>
+ </message>
+ <message>
+ <source>Default user profiles</source>
+ <translation>Default Benutzerprofile</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Die hier eingestellten Benutzerprofile werden beim Programmstart automatisch aktiviert. Sie können trotzdem jederzeit über &quot;Datei&quot; &quot;Benutzerprofile...&quot; Profile aktivieren/deaktivieren.</translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation>Dienste</translation>
+ </message>
+ <message>
+ <source>Call &amp;waiting</source>
+ <translation>&amp;Anklopfen</translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Wenn &quot;Anklopfen&quot; aktiviert ist, kann bei einer belegten Leitung über die zweite ein weiterer Anrufer klingeln. Wenn deaktiviert, bekommt er &quot;besetzt&quot;.</translation>
+ </message>
+ <message>
+ <source>Hang up &amp;both lines when ending a 3-way conference call.</source>
+ <translation>Bei Beenden 3er-Konferenz &amp;beide Leitungen auflegen.</translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation>Alt+B</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Wenn aktiviert, werden durch &quot;Auflegen&quot; beide Verbindungen getrennt. Sonst trennt &quot;Auflegen&quot; nur die aktive Leitung, das Gespräch auf der anderen Leitung kann weitergeführt werden.</translation>
+ </message>
+ <message>
+ <source>&amp;Maximum calls in call history:</source>
+ <translation>&amp;max. Anzahl Einträge in Anrufliste:</translation>
+ </message>
+ <message>
+ <source>The maximum number of calls that will be kept in the call history.</source>
+ <translation>Die Länge der Anrufliste wird auf die hier angegebene Anzahl Einträge begrenzt. Ältere Eintäge werden automatisch entfernt.</translation>
+ </message>
+ <message>
+ <source>&amp;Auto show main window on incoming call after</source>
+ <translation>Bei &amp;Anruf Hauptfenster öffnen nach</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>When the main window is hidden, it will be automatically shown on an incoming call after the number of specified seconds.</source>
+ <translation>Wenn das Twinkle-Hauptfenster geschlossen oder minimiert ist, wird es bei eingehendem Ruf nach der angegebenen Sekundenzahl automatisch wiederhergestellt.</translation>
+ </message>
+ <message>
+ <source>Number of seconds after which the main window should be shown.</source>
+ <translation>Zeit in Sekunden, nach der das Fenster wiederhergestellt wird.</translation>
+ </message>
+ <message>
+ <source>secs</source>
+ <translation>Sekunden</translation>
+ </message>
+ <message>
+ <source>The UDP port used for sending and receiving SIP messages.</source>
+ <translation type="obsolete">Der UDP Port, über den das SIP-Protokoll läuft. Standard:5060, ihr Provider kann aber einen anderen Port vorschreiben.</translation>
+ </message>
+ <message>
+ <source>&amp;RTP port:</source>
+ <translation>&amp;RTP-Port:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Der erste UDP Port, über den das RTP-Protokoll zur Sprachdatenübertragung läuft. Ein zeitgleich geführtes 2. Gespräch nutzt einen um 2 höheren Port. Rufvermittlung weitere 2. Also beispielsweise: 1.Ltg:8000(+8001), 2.Ltg:8002(+8003), Vermitteln:8004(+8005). Standard: abhängig vom Provider meist 8000 oder 5004. Bei mehreren an einem Anschluss betriebenen SIP-fons braucht jedes seinen eigenen Bereich Ports! Also das 2. Twinkle z.B. dann 8006. </translation>
+ </message>
+ <message>
+ <source>&amp;SIP UDP port:</source>
+ <translation type="obsolete">&amp;SIP UDP Port:</translation>
+ </message>
+ <message>
+ <source>Ring tone</source>
+ <translation>Klingelton</translation>
+ </message>
+ <message>
+ <source>&amp;Play ring tone on incoming call</source>
+ <translation>Bei eingeh. Ruf Klingelton s&amp;pielen</translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation>Alt+P</translation>
+ </message>
+ <message>
+ <source>Indicates if a ring tone should be played when a call comes in.</source>
+ <translation>Wenn aktiviert, spielt Twinkle bei eingehenden Anrufen einen Klingelton über den dafür eingestellten Audioanschluss ab.</translation>
+ </message>
+ <message>
+ <source>&amp;Default ring tone</source>
+ <translation>&amp;Default Klingelton</translation>
+ </message>
+ <message>
+ <source>Play the default ring tone when a call comes in.</source>
+ <translation>Spielt den Standard-Klingelton, wenn Anruf ankommt.</translation>
+ </message>
+ <message>
+ <source>C&amp;ustom ring tone</source>
+ <translation>individueller &amp;Ton</translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation>Alt+T</translation>
+ </message>
+ <message>
+ <source>Play a custom ring tone when a call comes in.</source>
+ <translation>Selbst ausgewählten Klingelton abspielen bei eingehendem Anruf.</translation>
+ </message>
+ <message>
+ <source>Specify the file name of a .wav file that you want to be played as ring tone.</source>
+ <translation>Geben Sie hier den Namen der .wav-Datei für Ihren individuellen Klingelton an.</translation>
+ </message>
+ <message>
+ <source>Ring back tone</source>
+ <translation>Freizeichen</translation>
+ </message>
+ <message>
+ <source>P&amp;lay ring back tone when network does not play ring back tone</source>
+ <translation>Freizeichen (Rufton) abspie&amp;len, wenn Tel-netz keinen liefert</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+L</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Play ring back tone while you are waiting for the far-end to answer your call.
+&lt;/p&gt;
+&lt;p&gt;
+Depending on your SIP provider the network might provide ring back tone or an announcement.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Freizeichen abspielen, wenn die Telefongesellschaft nicht selber eines einspielt. &lt;/p&gt;
+&lt;p&gt;Das Freizeichen ist in D das &quot;tuuut tuuut&quot;&quot;, welches dem Anrufer das Klingeln beim Gerufenen anzeigt. &lt;/p&gt;
+&lt;p&gt;Twinkle spielt dann den eigenen &quot;call back tone&quot; ab, falls nicht eine der beteiligten Vermittlungsstellen selber einen entsprechenden Signalton oder eine Ansage liefert.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>D&amp;efault ring back tone</source>
+ <translation>D&amp;efault Freizeichen</translation>
+ </message>
+ <message>
+ <source>Play the default ring back tone.</source>
+ <translation>Den Standard-Signalton für Rückmeldung des Klingelns bein Angerufenen (=Freizeichen) verwenden.</translation>
+ </message>
+ <message>
+ <source>Cu&amp;stom ring back tone</source>
+ <translation>Individuelle&amp;s Freizeichen</translation>
+ </message>
+ <message>
+ <source>Play a custom ring back tone.</source>
+ <translation>Individuellen Signalton für Rückmeldung des Klingelns bein Angerufenen (=Freizeichen) verwenden. </translation>
+ </message>
+ <message>
+ <source>Specify the file name of a .wav file that you want to be played as ring back tone.</source>
+ <translation>Geben Sie hier den Namen der .wav-Datei für Ihr individuelles Freizeichen an.</translation>
+ </message>
+ <message>
+ <source>&amp;Lookup name for incoming call</source>
+ <translation>Zu Nummer der Gegenstelle Name ermitte&amp;ln</translation>
+ </message>
+ <message>
+ <source>Ove&amp;rride received display name</source>
+ <translation>Gemeldeten An&amp;rufernamen ersetzen</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt+R</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Die Gegenstelle kann selber einen Namen (displayname) mitschicken. Aktivieren sie diese Option, wenn Sie lieber den aus der Nummer/Adresse ermittelten Eintrag aus Ihrem Adressbuch angezeigt bekommen möchten.</translation>
+ </message>
+ <message>
+ <source>Lookup &amp;photo for incoming call</source>
+ <translation>Nach &amp;Foto für Gegenstelle suchen</translation>
+ </message>
+ <message>
+ <source>Lookup the photo of a caller in your address book and display it on an incoming call.</source>
+ <translation>Wenn aufgrund der Nummer/Adresse der Gegenstelle ein Datensatz in Ihrem Adressbuch gefunden wird, zeigt Twinkle ein dort gegebenenfalls hinterlegtes Foto an.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>Accept and save your changes.</source>
+ <translation>Änderungen übernehmen und speichern.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Abbruch (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>Undo all your changes and close the window.</source>
+ <translation>Fenster schliessen ohne Änderungen zu übernehmen.</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <comment>This is the &apos;none&apos; in default IP address combo</comment>
+ <translation type="obsolete">auto</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <comment>This is the &apos;none&apos; in default network interface combo</comment>
+ <translation type="obsolete">auto</translation>
+ </message>
+ <message>
+ <source>Either choose a default IP address or a default network interface.</source>
+ <translation type="obsolete">Sie dürfen nur entweder einen Default-Anschluss oder eine Default-IP-Adresse angeben.</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Klingeltöne</translation>
+ </message>
+ <message>
+ <source>Choose ring tone</source>
+ <translation>Auswahl Klingelton</translation>
+ </message>
+ <message>
+ <source>Ring back tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Signaltöne</translation>
+ </message>
+ <message>
+ <source>Choose ring back tone</source>
+ <translation>Auswahl Freizeichen</translation>
+ </message>
+ <message>
+ <source>&amp;Validate devices before usage</source>
+ <translation>Audioeinstellungen prüfen &amp;vor Benutzung</translation>
+ </message>
+ <message>
+ <source>Alt+V</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Twinkle validates the audio devices before usage to avoid an established call without an audio channel.
+&lt;p&gt;
+On startup of Twinkle a warning is given if an audio device is inaccessible.
+&lt;p&gt;
+If before making a call, the microphone or speaker appears to be invalid, a warning is given and no call can be made.
+&lt;p&gt;
+If before answering a call, the microphone or speaker appears to be invalid, a warning is given and the call will not be answered.</source>
+ <translation>&lt;p&gt;Wenn aktiviert, prüft Twinkle die eingestellten Audiodevices, um zu verhindern dass eine Verbindung ohne entsprechende Ton-Ein/Ausgabe aufgebaut wird.&lt;/p&gt;
+&lt;p&gt;Bein Programmstart warnt Twinkle, falls eines der Audiodevices nicht verfügbar ist.&lt;br&gt;
+Bei Anrufen werden Mikrofon- und Lautsprecherdevice geprüft.&lt;/p&gt;
+&lt;p&gt;Versuche, einen abgehenden Ruf zu tätigen, werden bei gefundenen Audio-Problemen abgebrochen,&lt;br&gt;
+eingehende Rufe werden nicht entgegengenommen. &lt;br&gt;
+Stattdessen zeigt Twinkle in beiden Fällen eine Warnung.&lt;/p&gt;
+</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Twinkle versucht, einen zur Nummer/Adresse der Gegenstelle passenden Eintrag im Adressbuch zu finden. Die Details dieses Eintrags werden dann angezeigt.</translation>
+ </message>
+ <message>
+ <source>Select ring tone file.</source>
+ <translation>Dateiauswahl Klingelton.</translation>
+ </message>
+ <message>
+ <source>Select ring back tone file.</source>
+ <translation>Dateiauswahl Freizeichen.</translation>
+ </message>
+ <message>
+ <source>Maximum allowed size (0-65535) in bytes of an incoming SIP message over UDP.</source>
+ <translation>Max. zulässige Größe in Byte (0-65535) für ankommende SIP-Nachrichten über UDP.</translation>
+ </message>
+ <message>
+ <source>&amp;SIP port:</source>
+ <translation>&amp;SIP port:</translation>
+ </message>
+ <message>
+ <source>Max. SIP message size (&amp;TCP):</source>
+ <translation>Max. SIP-Nachrichtengröße (&amp;TCP):</translation>
+ </message>
+ <message>
+ <source>The UDP/TCP port used for sending and receiving SIP messages.</source>
+ <translation>Die Portnummer, über die SIP-Nachrichten sowohl per UDP als auch TCP gesendet und empfangen werden.</translation>
+ </message>
+ <message>
+ <source>Max. SIP message size (&amp;UDP):</source>
+ <translation>Max. SIP-Nachrichtengröße (&amp;UDP):</translation>
+ </message>
+ <message>
+ <source>Maximum allowed size (0-4294967295) in bytes of an incoming SIP message over TCP.</source>
+ <translation>Max. zulässige Größe in Byte (0-4294967295) für ankommende SIP-Nachrichten über TCP.</translation>
+ </message>
+ <message>
+ <source>W&amp;eb browser command:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Command to start your web browser. If you leave this field empty Twinkle will try to figure out your default web browser.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SysTrayPopup</name>
+ <message>
+ <source>Answer</source>
+ <translation>Annehmen</translation>
+ </message>
+ <message>
+ <source>Reject</source>
+ <translation>Abweisen</translation>
+ </message>
+ <message>
+ <source>Incoming Call</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TermCapForm</name>
+ <message>
+ <source>Twinkle - Terminal Capabilities</source>
+ <translation>Twinkle - Fähigkeiten Gegenstelle</translation>
+ </message>
+ <message>
+ <source>&amp;From:</source>
+ <translation>&amp;Von:</translation>
+ </message>
+ <message>
+ <source>Get terminal capabilities of</source>
+ <translation>Fähigkeiten folgender Gegenstelle abfragen</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;Adr:</translation>
+ </message>
+ <message>
+ <source>The address that you want to query for capabilities (OPTION request). This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Die Adresse/Nummer der Gegenstelle, deren Fähigkeiten Sie erfragen möchten (OPTION request). Wie immer bei Twinkle kann dies eine vollständige Adresse oder ein Username sein.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adressbuch</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Rufnummer/SIP-Adresse aus Adressbuch wählen.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Abbruch (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferForm</name>
+ <message>
+ <source>Twinkle - Transfer</source>
+ <translation>Twinkle - Vermitteln</translation>
+ </message>
+ <message>
+ <source>Transfer call to</source>
+ <translation>Ruf weitervermitteln an</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;Adr:</translation>
+ </message>
+ <message>
+ <source>The address of the person you want to transfer the call to. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Die Adresse/Nummer der Gegenstelle, an die Sie weitervermitteln möchten. Wie immer bei Twinkle kann dies eine vollständige Adresse oder ein Username sein.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adressbuch</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Rufnummer/SIP-Adresse aus Adressbuch wählen.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Abbruch (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Type of transfer</source>
+ <translation>Art der Vermittlung</translation>
+ </message>
+ <message>
+ <source>&amp;Blind transfer</source>
+ <translation>&amp;Ohne Rücksprache</translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>Transfer the call to a third party without contacting that third party yourself.</source>
+ <translation>Das Gespräch wird an den dritten, neuen Teilnehmer umgelenkt, ohne dass Sie vorher mit diesem Rücksprache halten. D.h. wenn der neue Teilnehmer abhebt, ist er sofort mit Ihrem bisherigen Gesprächspartner verbunden. </translation>
+ </message>
+ <message>
+ <source>T&amp;ransfer with consultation</source>
+ <translation>Mit &amp;Rücksprache</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt+R</translation>
+ </message>
+ <message>
+ <source>Before transferring the call to a third party, first consult the party yourself.</source>
+ <translation>Sie können mit dem neuen Teilnehmer sprechen und den vermittelten Gesprächspartner ankündigen. Nach Ende dieser Rücksprache wird Ihr bisheriger Gesprächspartner mit der neuen Gegenstelle verbunden.</translation>
+ </message>
+ <message>
+ <source>Transfer to other &amp;line</source>
+ <translation>Vermitteln an andere &amp;Leitung</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+L</translation>
+ </message>
+ <message>
+ <source>Connect the remote party on the active line with the remote party on the other line.</source>
+ <translation>Die beiden GgSt an Leitung 1 und 2 zueinander vermitteln. Hierbei ist die GgSt der gerade aktiven Ltg die vermittelte, also den Ruf aufbauende.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TwinkleCore</name>
+ <message>
+ <source>Failed to create log file %1 .</source>
+ <translation>Fehler beim Anlegen der Logdatei &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot open file for reading: %1</source>
+ <translation>Kann Datei &quot;%1&quot; nicht zum Lesen öffnen</translation>
+ </message>
+ <message>
+ <source>File system error while reading file %1 .</source>
+ <translation>Dateisystem-Fehler beim Lesen aus &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Cannot open file for writing: %1</source>
+ <translation>Kann Datei &quot;%1&quot; nicht zum Schreiben öffnen</translation>
+ </message>
+ <message>
+ <source>File system error while writing file %1 .</source>
+ <translation>Dateisystem-Fehler beim Schreiben in &quot;%1&quot;.</translation>
+ </message>
+ <message>
+ <source>Excessive number of socket errors.</source>
+ <translation>Zu hohe Anzahl von socket-Fehlern.</translation>
+ </message>
+ <message>
+ <source>Built with support for:</source>
+ <translation>Erstellt mit Unterstützung für:</translation>
+ </message>
+ <message>
+ <source>Contributions:</source>
+ <translation>Beiträge:</translation>
+ </message>
+ <message>
+ <source>This software contains the following software from 3rd parties:</source>
+ <translation>Diese Software enthält folgende Teile Dritter:</translation>
+ </message>
+ <message>
+ <source>* GSM codec from Jutta Degener and Carsten Bormann, University of Berlin</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>* G.711/G.726 codecs from Sun Microsystems (public domain)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>* iLBC implementation from RFC 3951 (www.ilbcfreeware.org)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>* Parts of the STUN project at http://sourceforge.net/projects/stun</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>* Parts of libsrv at http://libsrv.sourceforge.net/</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>For RTP the following dynamic libraries are linked:</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Translated to english by &lt;your name&gt;</source>
+ <translation>Deutsche Übersetzung: ©left 20080810-0830 Reisenweber tech+it-consult&lt;br&gt;
+joerg.twinklephone(AT)gmx.de</translation>
+ </message>
+ <message>
+ <source>Directory %1 does not exist.</source>
+ <translation>Ordner &quot;%1&quot; nicht gefunden.</translation>
+ </message>
+ <message>
+ <source>Cannot open file %1 .</source>
+ <translation>Datei &quot;%1&quot; nicht zugreifbar. (nicht vorhanden / schreibgeschützt?).</translation>
+ </message>
+ <message>
+ <source>%1 is not set to your home directory.</source>
+ <translation>&quot;%1&quot; zeigt nicht auf Ihren home-Ordner.</translation>
+ </message>
+ <message>
+ <source>Directory %1 (%2) does not exist.</source>
+ <translation>Ordner &quot;%1&quot; (%2) existiert nicht.</translation>
+ </message>
+ <message>
+ <source>Cannot create directory %1 .</source>
+ <translation>Ordner &quot;%1&quot; kann nicht erstellt werden.</translation>
+ </message>
+ <message>
+ <source>Lock file %1 already exist, but cannot be opened.</source>
+ <translation type="obsolete">Sperrdatei &quot;%1&quot; existiert schon, kann aber nicht geöffnet werden.</translation>
+ </message>
+ <message>
+ <source>%1 is already running.
+Lock file %2 already exists.</source>
+ <translation>&quot;%1&quot; ist offenbar schon gestartet.
+Sperrdatei &quot;%2&quot; existiert schon.</translation>
+ </message>
+ <message>
+ <source>Cannot create %1 .</source>
+ <translation>&quot;%1&quot; kann nicht angelegt werden.</translation>
+ </message>
+ <message>
+ <source>Cannot write to %1 .</source>
+ <translation type="obsolete">Kann in &quot;%1&quot; nicht schreiben.</translation>
+ </message>
+ <message>
+ <source>Syntax error in file %1 .</source>
+ <translation>Syntaktische Struktur in Datei &quot;%1&quot; fehlerhaft.</translation>
+ </message>
+ <message>
+ <source>Failed to backup %1 to %2</source>
+ <translation>Fehler beim Backup von &quot;%1&quot; nach &quot;%2&quot;</translation>
+ </message>
+ <message>
+ <source>unknown name (device is busy)</source>
+ <translation>Gerät unbekannt oder schon belegt </translation>
+ </message>
+ <message>
+ <source>Default device</source>
+ <translation>Standard Anschluss</translation>
+ </message>
+ <message>
+ <source>Anonymous</source>
+ <translation>Anonym</translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation>Warnung:</translation>
+ </message>
+ <message>
+ <source>Call transfer - %1</source>
+ <translation>Vermittlung - %1</translation>
+ </message>
+ <message>
+ <source>Sound card cannot be set to full duplex.</source>
+ <translation>Audiodevice kann nicht auf &quot;voll duplex&quot; eingestellt werden.</translation>
+ </message>
+ <message>
+ <source>Cannot set buffer size on sound card.</source>
+ <translation>Puffergrösse f. Audiodevice kann nicht eingestellt werden.</translation>
+ </message>
+ <message>
+ <source>Sound card cannot be set to %1 channels.</source>
+ <translation>Audiodevice kann nicht auf %1 Kanäle eingestellt werden.</translation>
+ </message>
+ <message>
+ <source>Cannot set sound card to 16 bits recording.</source>
+ <translation>Audiodevice kann nicht auf 16Bit-Aufnahme eingestellt werden.</translation>
+ </message>
+ <message>
+ <source>Cannot set sound card to 16 bits playing.</source>
+ <translation>Audiodevice kann nicht auf 16Bit-Wiedergabe eingestellt werden.</translation>
+ </message>
+ <message>
+ <source>Cannot set sound card sample rate to %1</source>
+ <translation>Audio Samplerate kann nicht auf %1 eingestellt werden.</translation>
+ </message>
+ <message>
+ <source>Opening ALSA driver failed</source>
+ <translation>Fehler beim Öffnen des ALSA-Treibers</translation>
+ </message>
+ <message>
+ <source>Cannot open ALSA driver for PCM playback</source>
+ <translation>ALSA-Treiber kann nicht f. PCM-Wiederg. geöffnet werden.</translation>
+ </message>
+ <message>
+ <source>Cannot resolve STUN server: %1</source>
+ <translation>Kann URL d. STUN-Servers nicht auflösen: %1</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Sie befinden sich hinter einer &quot;symetric NAT&quot;.
+STUN kann hier nicht funktionieren.
+Sie müssen in Twinkles Benutzerprofil/NAT eine &quot;fest voreingestellte Adresse&quot; einstellen.
+In Ihrem Router/Firewall/NAT leiten Sie bitte folgende öffentliche Ports auf lokale Ports zum Twinkle-PC weiter:</translation>
+ </message>
+ <message>
+ <source>public IP: %1 --&gt; private IP: %2 (SIP signaling)</source>
+ <translation>IP öffentl.: %1 --&gt; IP lokal: %2 (SIP Protokoll)</translation>
+ </message>
+ <message>
+ <source>public IP: %1-%2 --&gt; private IP: %3-%4 (RTP/RTCP)</source>
+ <translation>IP öff.: %1 - %2 --&gt; IP lok.: %3 - %4 (RTP/RTCP)</translation>
+ </message>
+ <message>
+ <source>Cannot reach the STUN server: %1</source>
+ <translation>Kann STUN-Server &quot;%1&quot; nicht erreichen.</translation>
+ </message>
+ <message>
+ <source>Port %1 (SIP signaling)</source>
+ <translation>Port %1 (SIP Protokoll)</translation>
+ </message>
+ <message>
+ <source>NAT type discovery via STUN failed.</source>
+ <translation>NAT Analyse mittels STUN fehlgeschlagen.</translation>
+ </message>
+ <message>
+ <source>If you are behind a firewall then you need to open the following UDP ports.</source>
+ <translation>Wenn Sie sich hinter einer Firewall befinden, müssen Sie folgende Ports öffnen:</translation>
+ </message>
+ <message>
+ <source>Ports %1-%2 (RTP/RTCP)</source>
+ <translation>Ports %1-%2 (RTP/RTCP)</translation>
+ </message>
+ <message>
+ <source>Cannot access the ring tone device (%1).</source>
+ <translation>&quot;%1&quot;, Audiodevice f. Klingelton nicht zugreifbar.</translation>
+ </message>
+ <message>
+ <source>Cannot access the speaker (%1).</source>
+ <translation>&quot;%1&quot;, Audiodevice f. Lautsprecher nicht zugreifbar.</translation>
+ </message>
+ <message>
+ <source>Cannot access the microphone (%1).</source>
+ <translation>&quot;%1&quot;, Audiodevice f. Mikrofon nicht zugreifbar.</translation>
+ </message>
+ <message>
+ <source>Cannot open ALSA driver for PCM capture</source>
+ <translation>ALSA-Treiber kann nicht für PCM-Aufnahme geöffnet werden</translation>
+ </message>
+ <message>
+ <source>Cannot receive incoming TCP connections.</source>
+ <translation>Kann eingehende TCP-Verbindungen nicht annehmen.</translation>
+ </message>
+ <message>
+ <source>Failed to create file %1</source>
+ <translation>Fehler beim Anlegen der Datei &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <source>Failed to write data to file %1</source>
+ <translation>Fehler beim Schreiben in Datei &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <source>Failed to send message.</source>
+ <translation>Fehler beim Senden der Nachricht.</translation>
+ </message>
+ <message>
+ <source>Cannot lock %1 .</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UserProfileForm</name>
+ <message>
+ <source>Twinkle - User Profile</source>
+ <translation>Twinkle - Benutzerprofil</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Benutzerprofil:</translation>
+ </message>
+ <message>
+ <source>Select which profile you want to edit.</source>
+ <translation>Zu bearbeitendes Benutzerprofil wählen.</translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation>Benutzer</translation>
+ </message>
+ <message>
+ <source>SIP server</source>
+ <translation>SIP Server</translation>
+ </message>
+ <message>
+ <source>RTP audio</source>
+ <translation>RTP Audio</translation>
+ </message>
+ <message>
+ <source>SIP protocol</source>
+ <translation>SIP-Protokoll</translation>
+ </message>
+ <message>
+ <source>Address format</source>
+ <translation>Adress-Format</translation>
+ </message>
+ <message>
+ <source>Timers</source>
+ <translation>Zeitgeber</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <translation>Signaltöne</translation>
+ </message>
+ <message>
+ <source>Scripts</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Security</source>
+ <translation>Sicherheit</translation>
+ </message>
+ <message>
+ <source>Select a category for which you want to see or modify the settings.</source>
+ <translation>Bereich wählen, den Sie ändern wollen.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>Accept and save your changes.</source>
+ <translation>Änderungen übernehmen und speichern.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Abbruch (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>Undo all your changes and close the window.</source>
+ <translation>Fenster schliessen ohne Änderungen zu übernehmen.</translation>
+ </message>
+ <message>
+ <source>SIP account</source>
+ <translation>SIP-Provider Benutzerdaten</translation>
+ </message>
+ <message>
+ <source>&amp;User name*:</source>
+ <translation>N&amp;utzername *:</translation>
+ </message>
+ <message>
+ <source>&amp;Domain*:</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Or&amp;ganization:</source>
+ <translation>Or&amp;ganisation:</translation>
+ </message>
+ <message>
+ <source>The SIP user name given to you by your provider. It is the user part in your SIP address, &lt;b&gt;username&lt;/b&gt;@domain.com This could be a telephone number.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>Der Nutzername, den Sie von Ihrem Provider zugewiesen bekommen haben. Dieser ist der erste Teil ihrer vollständigen SIP-Adresse &lt;b&gt;nutzername&lt;/b&gt;@domain.com .
+Viele Provider bezeichnen diesen -eigentlich falsch- als Telefonnummer.
+&lt;br&gt;&lt;br&gt;
+*DATEN FÜR DIESES FELD SIND ZWINGEND NOTWENDIG.</translation>
+ </message>
+ <message>
+ <source>The domain part of your SIP address, username@&lt;b&gt;domain.com&lt;/b&gt;. Instead of a real domain this could also be the hostname or IP address of your &lt;b&gt;SIP proxy&lt;/b&gt;. If you want direct IP phone to IP phone communications then you fill in the hostname or IP address of your computer.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>Die Domain oder IP-Adresse, unter der Sie von Ihrem Provider geführt werden bzw. im Internet erreichbar sind. Dies ist der zweite Teil ihrer vollständigen SIP-Adresse nutzername@&lt;b&gt;domain.com&lt;/b&gt;, bzw. die Domain Ihres SIP-Proxys.
+Bei vielen Providern identisch mit der Domain des Providers.
+Für direct-IP-to-IP (siehe Handbuch) ist hier die Adresse (DynDNS oder IP) einzutragen, unter der &lt;b&gt;Ihr Rechner&lt;/b&gt; zu erreichen ist.
+&lt;br&gt;&lt;br&gt;
+*DATEN FÜR DIESES FELD SIND ZWINGEND NOTWENDIG.</translation>
+ </message>
+ <message>
+ <source>You may fill in the name of your organization. When you make a call, this might be shown to the called party.</source>
+ <translation>In deutsch etwa Firma. Dieses Feld wird nur als Teil der Absenderangaben zur angerufenen/rufenden Gegenstelle übertragen und dort evtl angezeigt.
+Beliebige Angabe, nicht zwingend erforderlich.
+Vermeiden Sie moeglichst Umlaute und Sonderzeichen, manche Gegenstellen haben damit Probleme.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Ihr Absendername oder Pseudonym. Dieses Feld wird nur als Teil der Absenderangaben (display name) zur angerufenen/rufenden Gegernstelle übertragen und dort evtl angezeigt.
+Beliebige Angabe, nicht zwingend erforderlich.
+Vermeiden Sie moeglichst Umlaute und Sonderzeichen, manche Gegenstellen haben damit Probleme.</translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation>&amp;Absender:</translation>
+ </message>
+ <message>
+ <source>SIP authentication</source>
+ <translation>SIP-Anmeldedaten</translation>
+ </message>
+ <message>
+ <source>&amp;Realm:</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Authentication &amp;name:</source>
+ <translation>Anmelde&amp;name:</translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>&amp;Passwort:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Der &quot;Realm&quot;-Wert (deutsch etwa: Bereich) zur Anmeldung. Wird Ihnen, falls notwendig, gegebenfalls von Ihrem SIP-Provider mitgeteilt. Wenn leer, verwendet Twinkle SIP-Anmeldename und Passwort bei jeder Realm-Anfrage.</translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation>Ihr SIP-Anmeldename. Häufig identisch mit Ihrem SIP-Nutzernamen, dann leerlassen. Falls nicht, wird Ihr Provider dies mitteilen.</translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation>Ihr SIP-Anmeldepasswort. Wenn Sie dieses Feld leerlassen, müssen Sie das Passwort bei jeder Anmeldung in den dann erscheinenden Requester eintragen (hilfreich zum anfänglichen Testen!). </translation>
+ </message>
+ <message>
+ <source>Registrar</source>
+ <translation>Registrar (Anmelde-Server) </translation>
+ </message>
+ <message>
+ <source>&amp;Registrar:</source>
+ <translation>&amp;Registrar:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Die Domain, IP oder Hostname Ihres SIP-Anmelde-Servers. Für die meisten SIP-Provider einfach leer lassen. Wenn unten ein Outbound-Proxy eingetragen ist, wird dieser bei leerem Feld auch hier verwendet. Ohne Outbound-Proxy gilt für beides die Benutzer-SIP-Domain.</translation>
+ </message>
+ <message>
+ <source>&amp;Expiry:</source>
+ <translation>&amp;haltbar:</translation>
+ </message>
+ <message>
+ <source>The registration expiry time that Twinkle will request.</source>
+ <translation>Die Gültigkeitsdauer in Sekunden, die Twinkle bei der Anmeldung anfordert. Nach dieser Zeit meldet sich Twinkle automatisch neu an. Unterbleibt dies, bemerkt der Provider nach dieser Zeit, dass Sie offline sind. Auch Änderungen Ihrer IP -z.B. durch Zwangstrennung- werden u.U. erst nach dieser Zeit berücksichtigt.
+Werte kleiner 120 sind nicht zu empfehlen. Standard: 3600 (=1h).</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>Sekunden</translation>
+ </message>
+ <message>
+ <source>Re&amp;gister at startup</source>
+ <translation>Bei &amp;Profilstart anmelden</translation>
+ </message>
+ <message>
+ <source>Alt+G</source>
+ <translation>Alt+P</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Wenn aktiviert, versucht Twinkle, dieses Benutzerprofil bei seiner Aktivierung automatisch beim Provider (genauer SIP-Anmelde-Server / Registrar) anzumelden.
+Für direct-IP-to-IP gibt es keinen Provider, also dann nicht aktivieren.</translation>
+ </message>
+ <message>
+ <source>Outbound Proxy</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Use outbound proxy</source>
+ <translation>Outbound-Proxy ben&amp;utzen</translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Wenn aktiviert, verwendet Twinkle einen Outbound-Proxy (deutsch etwa: Stellvertreter/Vermittlung für abgehende Rufe), an den alle SIP-Anfragen gesendet werden. Dies kann z.B. ein SIP-Gateway ihres Firmen-LAN sein.
+Ohne Outbound-Proxy (Normalfall) versucht Twinkle selbst, die zu rufende Adresse zu einer IP aufzulösen, und sendet die SIP-Anfrage für den Anruf direkt dorthin.</translation>
+ </message>
+ <message>
+ <source>Outbound &amp;proxy:</source>
+ <translation>Outbound-&amp;Proxy: </translation>
+ </message>
+ <message>
+ <source>&amp;Send in-dialog requests to proxy</source>
+ <translation>In-Dialog-Anfragen an Proxy &amp;senden</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Wenn aktiviert, SIP-Anfragen &lt;b&gt;immer&lt;/b&gt; an den Outbound-Proxy senden. Twinkle sendet normalerweise SIP-Anfragen während eines laufenden SIP-Dialogs (d.h. während eines Gesprächs) an die Adresse im zu Gesprächsbeginn erhaltenen Contact-Header, also direkt an die Gegenstelle. </translation>
+ </message>
+ <message>
+ <source>&amp;Don&apos;t send a request to proxy if its destination can be resolved locally.</source>
+ <translation>SIP-Anfragen mit lokal auflösbarer A&amp;dresse nicht an Proxy, sondern direkt senden.</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation>Alt+D</translation>
+ </message>
+ <message>
+ <source>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.)</source>
+ <translation>Wenn aktiviert, versucht Twinkle zunächst selbst, die Zieladresse zu einer gültigen IP-Adresse aufzulösen und die SIP-Anfrage direkt dorthin zu schicken. Gelingt die Adressauflösung nicht, wird die Anfrage trotzdem an den Proxy geschickt, wie bei nicht aktivierter Option (Beachten Sie: In-Dialog-Anfragen werden in diesem Fall nur an den Proxy gesendet, wenn auch die vorherige Option aktiviert ist)</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of your outbound proxy.</source>
+ <translation>Der Domainname, IP-Adresse oder Hostname Ihres Outbound-Proxy.</translation>
+ </message>
+ <message>
+ <source>Co&amp;decs</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Codecs</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Available codecs:</source>
+ <translation>Verfügbare Codecs:</translation>
+ </message>
+ <message>
+ <source>G.711 A-law</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>G.711 u-law</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>GSM</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>speex-nb (8 kHz)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>speex-wb (16 kHz)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>speex-uwb (32 kHz)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>List of available codecs.</source>
+ <translation>Liste der verfügbaren, nicht aktivierten Codecs.
+Abhängig von den Compile-options können manche Codecs nicht verfügbar sein.</translation>
+ </message>
+ <message>
+ <source>Move a codec from the list of available codecs to the list of active codecs.</source>
+ <translation>Codec aktivieren.</translation>
+ </message>
+ <message>
+ <source>Move a codec from the list of active codecs to the list of available codecs.</source>
+ <translation>Codec deaktivieren.</translation>
+ </message>
+ <message>
+ <source>Active codecs:</source>
+ <translation>Aktive Codecs:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Liste der aktiven Codecs. Diese werden beim Gesprächsaufbau der Gegenstelle zur Benutzung angeboten bzw. akzeptiert. Es wird bevorzugt der am weitesten oben in der Liste stehende Codec genutzt, auf den sich die beiden Endgeräte einigen können.</translation>
+ </message>
+ <message>
+ <source>Move a codec upwards in the list of active codecs, i.e. increase its preference of use.</source>
+ <translation>Codec in der Liste nach oben verschieben, d.h. höheren Vorrang für Benutzung einräumen.</translation>
+ </message>
+ <message>
+ <source>Move a codec downwards in the list of active codecs, i.e. decrease its preference of use.</source>
+ <translation>Codec in der Liste nach unten verschieben, d.h. niedrigeren Vorrang für Benutzung einräumen.</translation>
+ </message>
+ <message>
+ <source>&amp;G.711/G.726 payload size:</source>
+ <translation>&amp;G.711/G.726 Nutzdatengrösse:</translation>
+ </message>
+ <message>
+ <source>The preferred payload size for the G.711 and G.726 codecs.</source>
+ <translation>Die bevorzugte Grösse der Nutzdaten pro RTP-Paket für G.711 and G.726 Codecs.</translation>
+ </message>
+ <message>
+ <source>ms</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;iLBC</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>iLBC</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>i&amp;LBC payload type:</source>
+ <translation>i&amp;LBC Nutzdaten-Typ:</translation>
+ </message>
+ <message>
+ <source>iLBC &amp;payload size (ms):</source>
+ <translation>iLBC &amp;Nutzdatengrösse:</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for iLBC.</source>
+ <translation>Die für iLBC verwendete dynamische Nutzdatentypkennung (nicht kleiner 96).</translation>
+ </message>
+ <message>
+ <source>20</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>30</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>The preferred payload size for iLBC.</source>
+ <translation>Die bevorzugte Grösse der Nutzdaten pro RTP-Paket für iLBC.</translation>
+ </message>
+ <message>
+ <source>&amp;Speex</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Speex</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Perceptual &amp;enhancement</source>
+ <translation>Tonqualität v&amp;erbessern</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation>Alt+E</translation>
+ </message>
+ <message>
+ <source>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).</source>
+ <translation>&quot;Tonqualität verbessern&quot; (engl: perceptual enhancement) ist eine Sammlung von Funktionen des Codecs, die den Ton unter Beachtung der Eigenschaften des menschlichen Hörens so bearbeiten, dass weniger Störgeräusche wahrgenommen werden. Obwohl sich die Übertragung bei Anwendung dieser Funktionen unter messtechnischen Gesichtspunkten (S/N Rauschabstand) verschlechtert und weniger dem Original gleicht, ist letztendlich doch die empfundene Tonqualität besser.</translation>
+ </message>
+ <message>
+ <source>&amp;Ultra wide band payload type:</source>
+ <translation>&amp;Ultra wide band Nutzdaten-Typ:</translation>
+ </message>
+ <message>
+ <source>Alt+V</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>When enabled, voice activity detection detects whether the audio being encoded is speech or silence/background noise. VAD is always implicitly activated when encoding in VBR, so the option is only useful in non-VBR operation. In this case, Speex detects non-speech periods and encode them with just enough bits to reproduce the background noise. This is called &quot;comfort noise generation&quot; (CNG).</source>
+ <translation type="obsolete">Wenn aktiviert, prüft VAD (Voice Activity Detection, deutsch etwa: Sprache/Pause-Erkennung), ob gerade gesprochen wird. Nicht als Sprache erkannte Geräusche werden nicht übertragen, sondern es wird stattdessen ein wesentlich weniger Daten-Bandbreite benötigendes &quot;Pausesignal&quot; oder (siehe DTX) gar nichts gesendet.
+VBR (siehe dort) macht VAD unnötig.</translation>
+ </message>
+ <message>
+ <source>&amp;Wide band payload type:</source>
+ <translation>&amp;wide band Nutzdaten-Kennung:</translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation>Alt+B</translation>
+ </message>
+ <message>
+ <source>Variable bit-rate (VBR) allows a codec to change its bit-rate dynamically to adapt to the &quot;difficulty&quot; 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&apos;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.</source>
+ <translation>Variable Bit-Rate (VBR) erlaubt es dem Codec, die Menge der übertragenen Daten entsprechend der Komplexität des Audiosignals anzupassen. Zischlaute wie &quot;s&quot;, &quot;f&quot; z.B. und besonders Sprechpausen (siehe VAD) können mit wenigen Daten qualitativ gut beschrieben werden, während für Laute mit starken Änderungen im zeitlichen Verlauf (&quot;p&quot;, &quot;k&quot;, &quot;r&quot;...) vergleichsweise hohe Datenmengen nötig sind. Durch VBR kann bei gegebener Datenrate also insgesamt bessere Tonqualität erreicht werden, oder niedrigere Datenraten für gleiche Qualität. Allerdings ist bei Festlegung einer bestimmten einzuhaltenden Qualität nicht mehr vorhersagbar, welche Datenrate dafür ausreichend sein wird. Bei Echtzeitanwendungen wie VoIP ist aber gerade die maximal benötigte und nicht die durchschnittliche Datenrate kritisch.</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for speex wide band.</source>
+ <translation>Die für speex wide band verwendete dynamische Nutzdatentyp-Kennung (nicht kleine 96).</translation>
+ </message>
+ <message>
+ <source>Co&amp;mplexity:</source>
+ <translation>Ko&amp;mplexität:</translation>
+ </message>
+ <message>
+ <source>Alt+X</source>
+ <translation type="obsolete">Alt+X</translation>
+ </message>
+ <message>
+ <source>Discontinuous transmission is an addition to VAD/VBR operation, that allows to stop transmitting completely when the background noise is stationary.</source>
+ <translation>Discontinuous transmission (deutsch etwa: nicht kontinuierliche Datenübertragung) ist eine Erweiterung der VAD/VBR-Übertragung. Bei gleichbleibenden Audiosignal (insbesondere bei erkannten Sprechpausen) wird statt ständig der gleichen Nutzdaten einfach gar nichts übertragen. Senkt die durchschnittliche Datenrate etwas. Bei Störungen auf dem Übertragungsweg kann diese Option zu den von Mobiltelefonen der Anfangszeit bekannten absurden Tonstörungen (hängenbleiben des Tons, Artefakte) führen.</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for speex narrow band.</source>
+ <translation>Die für speex narrow band verwendete dynamische Nutzdatentyp-Kennung (nicht kleiner 96).</translation>
+ </message>
+ <message>
+ <source>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&apos;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.</source>
+ <translation>Bei Speex kann die Komplexität (=Genauigkeit) festgelegt werden, mit der der Codec arbeitet. Hierzu wird die Tiefe des Suchvorgangs mit einem Wert von 1 bis 10 gesteuert, ähnlich der -1 bis -9 Option von gzip und bzip2. Im Normalbetrieb ist bei 1 der Rauschabstand 1 bis 2dB schlechter und die CPU-Auslastung nur 10-20% im Vergleich zu 10. In der Praxis bewährt sich für Sprache eine Einstellung von 2 - 4, Inband-DTMF z.B. und andere technische Signale, oder auch Musik, profitieren u.U. von höheren Einstellungen.</translation>
+ </message>
+ <message>
+ <source>&amp;Narrow band payload type:</source>
+ <translation>&amp;Narrow band Nutzdatentyp-Kennung:</translation>
+ </message>
+ <message>
+ <source>G.726</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>G.726 &amp;40 kbps payload type:</source>
+ <translation>G.726 &amp;40 kb/s Nutzdatentyp-Kennung:</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 40 kbps.</source>
+ <translation>Die für G.726 40 kb/s verwendete dynamische Nutzdatentypkennung (nicht kleiner 96).</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 32 kbps.</source>
+ <translation>Die für G.726 32 kb/s verwendete dynamische Nutzdatentypkennung (nicht kleiner 96).</translation>
+ </message>
+ <message>
+ <source>G.726 &amp;24 kbps payload type:</source>
+ <translation>G.726 &amp;24 kb/s Nutzdatentyp-Kennung:</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 24 kbps.</source>
+ <translation>Die für G.726 24 kb/s verwendete dynamische Nutzdatentypkennung (nicht kleiner 96).</translation>
+ </message>
+ <message>
+ <source>G.726 &amp;32 kbps payload type:</source>
+ <translation>G.726 &amp;32 kb/s Nutzdatentyp-Kennung:</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 16 kbps.</source>
+ <translation>Die für G.726 16 kb/s verwendete dynamische Nutzdatentypkennung (nicht kleiner 96).</translation>
+ </message>
+ <message>
+ <source>G.726 &amp;16 kbps payload type:</source>
+ <translation>G.726 &amp;16 kb/s Nutzdatentyp-Kennung:</translation>
+ </message>
+ <message>
+ <source>DT&amp;MF</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>DTMF</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for DTMF events (RFC 2833).</source>
+ <translation>Die für DTMF (RFC2833) verwendete dynamische Nutzdatentypkennung (nicht kleiner 96).</translation>
+ </message>
+ <message>
+ <source>DTMF vo&amp;lume:</source>
+ <translation>DTMF &amp;Lautstärke:</translation>
+ </message>
+ <message>
+ <source>The power level of the DTMF tone in dB.</source>
+ <translation>Die Lautstärke der gesendeten DTMF-Töne in dB, sowohl für reale Töne inband als auch Pegelkennung bei RFC2833. Sollte -10 bis -6 sein.</translation>
+ </message>
+ <message>
+ <source>The pause after a DTMF tone.</source>
+ <translation>Dauer der Pause zwischen 2 DTMF-Tönen. Zu kleine Werte können dazu führen, dass Folgen von gleichen &quot;Ziffern&quot; vom gesteuerten Gerät nicht mehr getrennt und als nur eine erkannt werden. Hohe Werte sind unschädlich, sofern Sie es nicht eilig haben.</translation>
+ </message>
+ <message>
+ <source>DTMF &amp;duration:</source>
+ <translation>DTMF-&amp;Dauer: </translation>
+ </message>
+ <message>
+ <source>DTMF payload &amp;type:</source>
+ <translation>D&amp;TMF Nutzdatentyp-Kennung:</translation>
+ </message>
+ <message>
+ <source>DTMF &amp;pause:</source>
+ <translation>DTMF-&amp;Pause:</translation>
+ </message>
+ <message>
+ <source>dB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Duration of a DTMF tone.</source>
+ <translation>Dauer eines DTMF-Tons in Millisekunden. Bei zu kleinem Wert kann das gesteuerte Gerät die &quot;Ziffer&quot; nicht mehr erkennen. 200 klappt meist auch mit alten Geräten.</translation>
+ </message>
+ <message>
+ <source>DTMF t&amp;ransport:</source>
+ <translation>DTMF &amp;Methode:</translation>
+ </message>
+ <message>
+ <source>Auto</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>RFC 2833</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Inband</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Out-of-band (SIP INFO)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&lt;h2&gt;RFC 2833&lt;/h2&gt;
+&lt;p&gt;Send DTMF tones as RFC 2833 telephone events.&lt;/p&gt;
+&lt;h2&gt;Inband&lt;/h2&gt;
+&lt;p&gt;Send DTMF inband.&lt;/p&gt;
+&lt;h2&gt;Auto&lt;/h2&gt;
+&lt;p&gt;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.
+&lt;/p&gt;
+&lt;h2&gt;Out-of-band (SIP INFO)&lt;/h2&gt;
+&lt;p&gt;
+Send DTMF out-of-band via a SIP INFO request.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;&lt;h3&gt;RFC 2833&lt;/h3&gt;
+Sende DTMF-Töne als RFC 2833 telephone events (Symbole im RTP-Audiodatenstrom).&lt;/p&gt;
+&lt;p&gt;&lt;h3&gt;Inband&lt;/h3&gt;
+Sende DTMF inband (tatsächliche Töne, die Twinkle ins Tonsignal einmischt).&lt;/p&gt;
+&lt;p&gt;&lt;h3&gt;Auto&lt;/h3&gt;
+Wenn die Gegenstelle RFC 2833 unterstützt, dann DTMF-Töne als RFC 2833 telephone events senden, ansonsten inband.&lt;/p&gt;
+&lt;p&gt;&lt;h3&gt;Out-of-band (SIP INFO)&lt;/h3&gt;
+Sende DTMF nur out-of-band via SIP INFO request.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Allgemein</translation>
+ </message>
+ <message>
+ <source>Redirection</source>
+ <translation>Rufweiterleitung abgehende Rufe</translation>
+ </message>
+ <message>
+ <source>&amp;Allow redirection</source>
+ <translation>Rufweiterleitung erl&amp;auben</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should redirect a request if a 3XX response is received.</source>
+ <translation>Wenn aktiviert, befolgt Twinkle die Anforderung (3XX) der gerufenen Gegenstelle, wenn dort Rufumleitung aktiviert wurde.</translation>
+ </message>
+ <message>
+ <source>Ask user &amp;permission to redirect</source>
+ <translation>Benutzer vor &amp;Weiterleitung fragen</translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation>Alt+W</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should ask the user before redirecting a request when a 3XX response is received.</source>
+ <translation>Wenn aktiviert, fragt Twinkle bei Empfang einer 3XX-Anfrage, ob der abgehende Ruf auf ein alternatves Ziel umgeleitet werden darf.</translation>
+ </message>
+ <message>
+ <source>Max re&amp;directions:</source>
+ <translation>Max. Anz. &amp;Umleit.:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Die Anzahl von Weiterleitungen eines abgehenden Rufes (von A nach B nach C...), nach der Twinkle aufgibt. Verhindert Endlosweiterleitungen im Kreis (A -&gt; B -&gt; A...).</translation>
+ </message>
+ <message>
+ <source>Protocol options</source>
+ <translation>Protokoll-Optionen</translation>
+ </message>
+ <message>
+ <source>Call &amp;Hold variant:</source>
+ <translation>Gespräch-&amp;halten Variante: </translation>
+ </message>
+ <message>
+ <source>RFC 2543</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>RFC 3264</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Auswahl, ob RFC 2543 (set media IP address in SDP to 0.0.0.0) oder RFC 3264 (use direction attributes in SDP) benutzt wird, um ein Gespräch zu halten.</translation>
+ </message>
+ <message>
+ <source>Allow m&amp;issing Contact header in 200 OK on REGISTER</source>
+ <translation>Erlaube fehlenden Contact header in 200 OK bei REG&amp;ISTER</translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation>Alt+I</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Eine &quot;200 OK&quot;-Antwort auf ein &quot;REGISTER&quot; muss einen Contact header enthalten. Einige Provider schicken trotzdem keinen oder einen fehlerhaften. Wenn aktiviert, wird Twinkle versuchen, diesen Fehler auszugleichen.</translation>
+ </message>
+ <message>
+ <source>&amp;Max-Forwards header is mandatory</source>
+ <translation>&amp;Max-Forwards-Header verlangen</translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation>Alt+M</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Nach RFC3261 ist der Max-Forwards header vorgeschrieben, wird aber oft trotzdem nicht gesendet. Wenn aktiviert, lehnt Twinkle SIP-Anfragen ohne Max-Forwards header ab.</translation>
+ </message>
+ <message>
+ <source>Put &amp;registration expiry time in contact header</source>
+ <translation>Anmeldedaue&amp;r im Contact-Header übertragen</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt+R</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>In einer REGISTER-Anfrage kann die Ablaufzeit (expiry, &quot;haltbar:&quot;) der Anmeldung sowohl im Contact-Header als auch im Expires-Header übertragen werden. Wenn aktiviert, sendet Twinkle im Contact-header, sonst im Expires-header.</translation>
+ </message>
+ <message>
+ <source>&amp;Use compact header names</source>
+ <translation>&amp;kompakte Headernamen</translation>
+ </message>
+ <message>
+ <source>Indicates if compact header names should be used for headers that have a compact form.</source>
+ <translation>Wenn aktiviert, für Headernamen die kurze Form verwenden, soweit eine existiert.</translation>
+ </message>
+ <message>
+ <source>Allow SDP change during call setup</source>
+ <translation>Erlaube SDP-Änderungen beim Rufaufbau</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;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.&lt;/p&gt;
+&lt;p&gt;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.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Ein SIP UAS kann ein SDP in einer 1XX Antwort für early media, z.B. bei &quot;Freizeichen&quot;, senden. Wenn das Gespräch aufgebaut wird, sollte der SIP UAS das selbe SDP in der &quot;200 OK&quot;-Antwort senden. Nach Empfang eines SDP sollten alle folgenden verworfen werden. Soweit die reine Lehre nach RFC 3261.&lt;/p&gt;
+&lt;p&gt;Wenn erlaubt wird, dass sich SDP wahrend des Gesprächsaufbaus ändert, verwirft Twinkle SDPs in Folgeantworten nicht, sondern ändert die Eigenschaften des RTP-Mediastreams (z.B. codec) entsprechend. Ein geändertes SDP muss eine neue Versionsnummer in der &quot;o=&quot;-Zeile haben.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Twinkle creates a unique contact header value by combining the SIP user name and domain:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;tt&gt;&amp;nbsp;user_domain@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+This way 2 user profiles, having the same user name but different domain names, have unique contact addresses and hence can be activated simultaneously.
+&lt;/p&gt;
+&lt;p&gt;
+Some proxies do not handle a contact header value like this. You can disable this option to get a contact header value like this:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;tt&gt;&amp;nbsp;user@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+This format is what most SIP phones use.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Wenn aktiviert, erzeugt Twinkle einen eindeutigen contact header Wert durch Kombination des SIP-Nutzernamens und der Domain:
+&lt;br&gt;
+&lt;tt&gt;&amp;nbsp;user_domain@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+So haben 2 Benutzerprofile mit selbem SIP-Nutzernamen aber unterschiedlicher Domain eindeutige contact Adressen und können so gleichzeitig aktiviert werden.
+&lt;/p&gt;
+&lt;p&gt;
+Viele Proxies können mit solchen contact header Werten nicht umgehen. Wenn diese Option deaktiviert ist, sendet Twinkle contact header in folgendem Format:
+&lt;br&gt;
+&lt;tt&gt;&amp;nbsp;user@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+Dieses Format wird von fast allen SIP-Telefonen verwendet.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Nutzen Sie diese Option nur, wenn Sie sie wirklich brauchen! Also wenn Sie mehrere Profile mit gleichem SIP-Benutzernamen haben.&lt;/b&gt;&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Encode Via, Route, Record-Route as list</source>
+ <translation>Via, Route, Record-Route als List&amp;e senden</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Die Via-, Route- und Record-Route-Header können als Liste von durch Komma getrennten Werten oder als einzelne Werte übertragen werden.</translation>
+ </message>
+ <message>
+ <source>SIP extensions</source>
+ <translation>SIP Erweiterungen</translation>
+ </message>
+ <message>
+ <source>&amp;100 rel (PRACK):</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>disabled</source>
+ <translation>deaktiviert</translation>
+ </message>
+ <message>
+ <source>supported</source>
+ <translation>erlaubt</translation>
+ </message>
+ <message>
+ <source>required</source>
+ <translation>erforderlich</translation>
+ </message>
+ <message>
+ <source>preferred</source>
+ <translation>bevorzugt</translation>
+ </message>
+ <message>
+ <source>Indicates if the 100rel extension (PRACK) is supported:&lt;br&gt;&lt;br&gt;
+&lt;b&gt;disabled&lt;/b&gt;: 100rel extension is disabled
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;supported&lt;/b&gt;: 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.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;required&lt;/b&gt;: 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.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;preferred&lt;/b&gt;: 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.</source>
+ <translation>Definiert die Art der Unterstützung für 100rel extension (PRACK):&lt;br&gt;&lt;br&gt;
+&lt;b&gt;deaktiviert&lt;/b&gt;: 100rel extension wird nicht unterstützt
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;erlaubt&lt;/b&gt;: 100rel wird unterstützt (wird im &quot;supported header&quot; abgehender INVITEs übertragen). Eine Gegenstelle kann dann ein PRACK auf eine 1xx Antwort anfordern.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;erforderlich&lt;/b&gt;: 100rel wird angefordert (wird im &quot;require header&quot; abgehender INVITEs übertragen). Wenn die Gegenstelle ein INVITE sendet (=anruft) und darin signalisiert, dass sie 100rel unterstützt, dann fordert Twinkle beim senden einer 1xx-Antwort PRACK an. Unterstützt die Gwegenstelle 100rel nicht, kommt die Verbindung nicht zustande.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;bevorzugt&lt;/b&gt;: Wie &quot;erforderlich&quot;, ausser dass auch dann ein Gespräch zustande kommt, wenn die Gegenstelle 100rel nicht unterstützt.
+
+Diese Einstellung beeinflusst das Verhalten bei &quot;early media&quot; (z.B. &quot;Freizeichen&quot;). </translation>
+ </message>
+ <message>
+ <source>REFER</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Call transfer (REFER)</source>
+ <translation>Rufweitervermittlung (REFER)</translation>
+ </message>
+ <message>
+ <source>Allow call &amp;transfer (incoming REFER)</source>
+ <translation type="obsolete">GgSt darf vermi&amp;tteln (eingehender REFER)</translation>
+ </message>
+ <message>
+ <source>Alt+T</source>
+ <translation>Alt+T</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should transfer a call if a REFER request is received.</source>
+ <translation>Wenn aktiviert, befolgt Twinkle die Anfrage der Gegenstelle (REFER), Sie zu einer anderen Gegenstelle weiterzuvermitteln. Dies kann für Sie Kosten verursachen.</translation>
+ </message>
+ <message>
+ <source>As&amp;k user permission to transfer</source>
+ <translation>Benutzer vor &amp;Vermittlung fragen</translation>
+ </message>
+ <message>
+ <source>Alt+K</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should ask the user before transferring a call when a REFER request is received.</source>
+ <translation>Wenn aktiviert, fragt Twinkle bei eingehender Vermittlungsanfrage (REFER) vor Abbau der bisherigen und Anwählen der neuen Verbindung. Im Gegensatz zum Fest- und GSM-Netz trägt bei SIP nicht der Vermittler, sondern der &quot;Anrufende&quot; (also der, der an die neue Gegenstelle weitervermittelt wird) die eventuellen Kosten für das neue vermittelte Gespräch.</translation>
+ </message>
+ <message>
+ <source>Hold call &amp;with referrer while setting up call to transfer target</source>
+ <translation>T&amp;winkle hält Gespräch als Vermittelter</translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation>Alt+W</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should put the current call on hold when a REFER request to transfer a call is received.</source>
+ <translation>Wenn aktiviert, übernimmt bei eingehender Vermittlungsaufforderung Twinkle es, den bisherigen Anruf zu halten. Normalerweise sollte die vermittelnde Gegenstelle dies tun. Siehe folgende Option. Standard: deaktiviert.</translation>
+ </message>
+ <message>
+ <source>Ho&amp;ld call with referee before sending REFER</source>
+ <translation>Twink&amp;le hält Gespräch als Vermittler </translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+L</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should put the current call on hold when you transfer a call.</source>
+ <translation>Wenn aktiviert, schaltet Twinkle als Vermittler das bisherige Gespräch in den Gehalten-Zustand, bevor es der Gegenstelle ein REFER schickt. So muss die Gegenstelle dies nicht tun - siehe vorherige Option.
+Standard: aktiviert.</translation>
+ </message>
+ <message>
+ <source>Auto re&amp;fresh subscription to refer event while call transfer is not finished</source>
+ <translation>Subscription &amp;für REFER automatisch erneuern, bis Vermittlung beendet</translation>
+ </message>
+ <message>
+ <source>Alt+F</source>
+ <translation>Alt+F</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Während eines Vermittlungvorgangs sendet der Vermittelte NOTIFY-Mitteilungen über den Fortgang des Gesprächsaufbaus an den Vermittler, allerdings nur für eine kurze Zeitspanne, die der Vermittelte festlegt. Wenn aktiviert, sendet der Vermittler (Twinkle) automatisch SUBCRIBEs, um diese Zeit zu verlängern bis der Vermittlungsvorgang abgeschlossen ist.</translation>
+ </message>
+ <message>
+ <source>NAT traversal</source>
+ <translation>NAT Durchtunnelung</translation>
+ </message>
+ <message>
+ <source>&amp;NAT traversal not needed</source>
+ <translation>&amp;NAT Durchtunnelung unnötig</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation>Alt+N</translation>
+ </message>
+ <message>
+ <source>Choose this option when there is no NAT device between you and your SIP proxy or when your SIP provider offers hosted NAT traversal.</source>
+ <translation>Wählen Sie diese Option,
+wenn sich zwischen Twinkle und Ihrem SIP-Proxy keine NAT (Router) befindet,
+wenn zwar eine NAT existiert, aber ein Application Level Gateway (ALG) im Router den SIP-Betrieb unterstützt, oder
+wenn Ihr SIP-Provider &quot;hosted NAT traversal&quot; unterstützt (ein Weg, wie der Provider Probleme mit NAT umgehen kann).
+Im Zweifelsfall sollten Sie zuerst versuchen, ob diese Einstellung bei Ihnen funktioniert, auch wenn Sie einen Router / NAT haben.</translation>
+ </message>
+ <message>
+ <source>&amp;Use statically configured public IP address inside SIP messages</source>
+ <translation>Fest voreingestellte &amp;Adresse in SIP-Telegrammen verwenden</translation>
+ </message>
+ <message>
+ <source>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.&lt;br&gt;&lt;br&gt;
+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.</source>
+ <translation>Wenn aktiviert, verwendet Twinkle in SIP-Telegrammen, also Headern und Body, die im nächsten Feld angegebene öffentliche Adresse anstatt der automatisch ermittelten Adresse Ihres Netzwerkanschlusses.&lt;br&gt;&lt;br&gt;
+Wenn Sie diese Option verwenden, müssen Sie auch in Ihrer NAT die entsprechenden RTP-Ports auf Ihren Rechner durchleiten.</translation>
+ </message>
+ <message>
+ <source>Use &amp;STUN</source>
+ <translation type="obsolete">&amp;STUN aktivieren</translation>
+ </message>
+ <message>
+ <source>Choose this option when your SIP provider offers a STUN server for NAT traversal.</source>
+ <translation>Aktivieren Sie diese Option, wenn Ihr SIP-Provider einen STUN-Server zum Durchtunneln der NAT anbietet.</translation>
+ </message>
+ <message>
+ <source>S&amp;TUN server:</source>
+ <translation>S&amp;TUN-Server:</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of the STUN server.</source>
+ <translation>Der Domainname, IP-Adresse oder Hostname des STUN-Servers (gegebenenfalls incl &quot;:&lt;portnr&gt;&quot;, also z.B. &quot;stunsrv.de:10000&quot;).</translation>
+ </message>
+ <message>
+ <source>&amp;Public IP address:</source>
+ <translation>Öffentl. &amp;Adresse:</translation>
+ </message>
+ <message>
+ <source>The public IP address of your NAT.</source>
+ <translation>Die öffentliche Adresse (IP, DynDNS-domain), unter der Ihre NAT(/Router) im Internet erreichbar ist. Diese Option ist nur bei unveränderlicher Adresse sinnvoll.</translation>
+ </message>
+ <message>
+ <source>Telephone numbers</source>
+ <translation>Telefonnummern</translation>
+ </message>
+ <message>
+ <source>Only &amp;display user part of URI for telephone number</source>
+ <translation>Bei Telefonnumern nur User-Teil &amp;der URI anzeigen</translation>
+ </message>
+ <message>
+ <source>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 &quot;123456&quot; to the user. A URI indicates a telephone number if it contains the &quot;user=phone&quot; parameter or when it has a numerical user part and you ticked the next option.</source>
+ <translation>Wenn eine URI eine Telefonnummer darstellt, dann nur den User-Teil anzeigen. Kommt z.B. ein Anruf von sip:12345@einprovider.com, dann zeigt Twinkle nur &quot;12345&quot; als Adresse. Twinkle betrachtet eine URI als &quot;Telefonnummer&quot;, wenn sie entweder den Zusatz &quot;user=phone&quot; enthält, oder wenn die nächste Option aktiv ist und Twinkle den User-Teil als Nummer einschätzt.</translation>
+ </message>
+ <message>
+ <source>&amp;URI with numerical user part is a telephone number</source>
+ <translation>&amp;URI mit numerischem User-Teil ist Telefonnummer</translation>
+ </message>
+ <message>
+ <source>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 &quot;user=phone&quot; parameter to such a URI.</source>
+ <translation>Wenn aktiviert, betrachtet Twinkle jede SIP-Adresse als &quot;Telefonnummer&quot;, die nur Ziffern, *, #, + und Sonderzeichen (s.o.) im User-Teil hat. In abgehenden SIP-Mitteilungen hängt Twinkle an solche Adressen den Parameter &quot;user=phone&quot; an.
+Achtung: z.B. sipgate verändert(e) subtil sein Verhalten bei manchen Funktionen, sobald dieser Parameter mitgesendet wird.</translation>
+ </message>
+ <message>
+ <source>&amp;Remove special symbols from numerical dial strings</source>
+ <translation>Sonde&amp;rzeichen aus Wählstring entfernen</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Telefonnumern werden oft unter Verwendung von Sonderzeichen wie &quot;(&quot;, &quot;)&quot;, &quot; &quot;(Leerzeichen), &quot;-&quot; usw. angegeben, um sie für Menschen leichter lesbar zu gestalten. Beim Wählen, insbesondere einer SIP-Adresse, dürfen diese Zeichen nicht mit angegeben werden. Um das Wählen durch Kopieren und Einfügen, direktes Anklicken im Adressbuch usw. zu vereinfachen, kann man Twinkle eine Liste mit unzulässigen Zeichen angeben, die vor dem eigentlichen Wählen automatisch zu löschen sind.</translation>
+ </message>
+ <message>
+ <source>&amp;Special symbols:</source>
+ <translation>unzul. &amp;Sonderzeichen:</translation>
+ </message>
+ <message>
+ <source>The special symbols that may be part of a telephone number for nice formatting, but must be removed when dialing.</source>
+ <translation>Liste aller Sonderzeichen, die Twinkle aus den zu wählenden Nummern entfernen soll.</translation>
+ </message>
+ <message>
+ <source>Number conversion</source>
+ <translation>Nummernkonvertierung</translation>
+ </message>
+ <message>
+ <source>Match expression</source>
+ <translation>Suchausdruck</translation>
+ </message>
+ <message>
+ <source>Replace</source>
+ <translation>Ersetzung</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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 &apos;00&apos; instead of the &apos;+&apos;, or you are at the office and all your numbers need to be prefixed with a &apos;9&apos; to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings.
+&lt;/p&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;p&gt;
+The number conversion rules are also applied to incoming calls, so the numbers are displayed in the format you want.
+&lt;/p&gt;
+&lt;h3&gt;Example 1&lt;/h3&gt;
+&lt;p&gt;
+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 &apos;+31&apos; and replace it by a &apos;0&apos;. For dialling numbers abroad you just want to replace the &apos;+&apos; by &apos;00&apos;.
+&lt;/p&gt;
+&lt;p&gt;
+The following rules will do the trick:
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expression = \+31([0-9]*) , Replace = 0$1&lt;br&gt;
+Match expression = \+([0-9]*) , Replace = 00$1&lt;/br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;h3&gt;Example 2&lt;/h3&gt;
+&lt;p&gt;
+You are at work and all telephone numbers starting with a 0 should be prefixed with a 9 for an outside line.
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expression = 0[0-9]* , Replace = 9$&amp;&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;</source>
+ <translation>&lt;p&gt;
+Oftmals ist das Format der Telefonnummern, das z.B. der Provider erwartet, nicht identisch mit dem Format der im Adressbuch gespeicherten Nummern. Beispielsweise könnten Ihre Nummern mit &quot;+&quot; und dem Ländercode beginnen, Ihr Provider erwartet aber &quot;00&quot; statt des &quot;+&quot;. Oder Sie sind an die lokale SIP-Installation in Ihrer Firma angeschlossen und müssen eine Amtsholziffer vorwählen.
+Hier können Sie unter Verwendung von Such- und Ersetzungs-Mustern (nach Art regulärer Ausdrücke a la Perl) allgemeingültige Regeln zur Umwandlung von Telefonnummern einrichten.
+&lt;/p&gt;
+&lt;p&gt;
+Bei jeden Wahlversuch versucht Twinkle, für die zu wählende Nummer (den User-Teil der vollen SIP-Adresse) einen passenden Ausdruck in der Liste der Suchmuster zu finden. Der zum ersten passenden Suchmuster gehörende Ersetzungsausdruck ersetzt die Original-Nummer, wobei durch &quot;(&quot; &quot;)&quot; umschlossene Platzhalter im Suchausdruck (z.B. &quot;([0-9]*)&quot; für &quot;beliebig viele Ziffern&quot;) die durch sie &quot;geschluckten&quot; Zeichen zur entsprechenden Variablen (z.B. &quot;$1&quot; für den ersten Platzhalter) im Ersetzungsausdruck transportieren (siehe `man 7 regex` oder konqueror:&quot;#regex&quot;). Wird kein passendes Suchmuster gefunden, bleibt die Nummer unverändert.
+&lt;/p&gt;
+&lt;p&gt;
+Die Regeln werden auch auf die Absenderangaben eingehender Rufe angewendet, um diese Nummern gleich in das von Ihnen gewünschte Format zu wandeln. (!!! &lt;i&gt;[bug? Amtsziffer 0. d.Üs.]&lt;/i&gt; )
+&lt;/p&gt;
+&lt;h3&gt;Beispiel 1&lt;/h3&gt;
+&lt;p&gt;
+Angenommen Ihr Ländercode ist &quot;49&quot; für Deutschland, und Sie haben auch viele Inlandnummern in Ihrem Adressbuch in internationalem Nummernformat gespeichert, also z.B. +49 911 2345678. Ihr Provider erwartet für innerdeutsche Gespräche aber 0911 2345678. Also möchten Sie die &apos;+49&apos; durch &apos;0&apos; ersetzen. Für Auslandsgespräche möchten Sie &apos;+&apos; durch &apos;00&apos; ersetzen.
+&lt;/p&gt;
+&lt;p&gt;
+Sie benötigen hierzu folgende Regeln, in dieser Reihenfolge:
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Suchausdruck = \+49([0-9]*) , Ersetzung =0$1&lt;br&gt;
+Suchausdruck = \+([0-9]*) , Ersetzung = 00$1&lt;/br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;h3&gt;Beispiel 2&lt;/h3&gt;
+&lt;p&gt;
+Sie befinden sich an einer Telefonanlage und alle Nummern mit 0 als erste Ziffer sollen die Amtsholziffer 9 vorangestellt bekommen.
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Suchausdruck = 0[0-9]* , Ersetzung = 9$&amp;&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+( $&amp; ist eine spezielle Variable, die die gesamte Originalnummer überträgt)&lt;br&gt;
+Anmerkung: Sie können diese Regel nicht einfach nur als dritte nach denen aus Beispiel 1 angeben, denn es wird immer nur die erste zutreffende Regel angewendet. Stattdessen müssten die Ersetzungen der Regeln 1 und 2 in &quot;90$1&quot; u. &quot;900$1&quot; geändert werden</translation>
+ </message>
+ <message>
+ <source>Move the selected number conversion rule upwards in the list.</source>
+ <translation>Regel in der Liste nach oben verschieben.</translation>
+ </message>
+ <message>
+ <source>Move the selected number conversion rule downwards in the list.</source>
+ <translation>Regel in der Liste nach unten verschieben.</translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation>&amp;Neu</translation>
+ </message>
+ <message>
+ <source>Add a number conversion rule.</source>
+ <translation>Neue Regel erzeugen.</translation>
+ </message>
+ <message>
+ <source>Re&amp;move</source>
+ <translation>&amp;Löschen</translation>
+ </message>
+ <message>
+ <source>Remove the selected number conversion rule.</source>
+ <translation>Die ausgewählte Regel löschen.</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>B&amp;earbeiten</translation>
+ </message>
+ <message>
+ <source>Edit the selected number conversion rule.</source>
+ <translation>Die ausgewählte Regel ändern.</translation>
+ </message>
+ <message>
+ <source>Type a telephone number here an press the Test button to see how it is converted by the list of number conversion rules.</source>
+ <translation>Tippen Sie eine Nummer und klicken Sie &quot;Test&quot;, um das Ergebnis der Umwandlung durch die Regeln zu sehen.</translation>
+ </message>
+ <message>
+ <source>&amp;Test</source>
+ <translation>&amp;Testen</translation>
+ </message>
+ <message>
+ <source>Test how a number is converted by the number conversion rules.</source>
+ <translation>Die Regeln mit der Nummer links testen und Resultat anzeigen. </translation>
+ </message>
+ <message>
+ <source>for STUN</source>
+ <translation type="obsolete">Sekunden</translation>
+ </message>
+ <message>
+ <source>Keep alive timer for the STUN protocol. If you have enabled STUN, then Twinkle will send keep alive packets at this interval rate to keep the address bindings in your NAT device alive.</source>
+ <translation type="obsolete">Zeitgeber für das STUN-Protokoll. Wenn STUN aktiviert ist, werden die STUN-keep-alive Datenpakete in diesem Zeitabstand von Twinkle gesendet. Damit der Router die Zuordnung zwischen interner und externer Adresse nicht aus der NAT-Adresstabelle löscht, frischen diese keep-alive-Pakete die Zuordnung in der NAT rechtzeitig auf. Dieser Wert ist daher von der eingesetzten NAT abhängig und sollte nicht zu gross gezählt werden.</translation>
+ </message>
+ <message>
+ <source>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 &quot;480 User Not Responding&quot;.</source>
+ <translation>Wenn ein Anruf eingeht, beginnt dieser Zeitgeber abzulaufen. Wird der Ruf bis zum Ende der Zeitspanne nicht angenommen, sendet Twinkle &quot;480 User Not Responding&quot; und weist so den Anruf ab.</translation>
+ </message>
+ <message>
+ <source>NAT &amp;keep alive:</source>
+ <translation>&amp;STUN NAT-keep-alive alle:</translation>
+ </message>
+ <message>
+ <source>&amp;No answer:</source>
+ <translation>&quot;&amp;Nicht erreichbar&quot; nach:</translation>
+ </message>
+ <message>
+ <source>Ring &amp;back tone:</source>
+ <translation>&amp;Freizeichen:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Specify the file name of a .wav file that you want to be played as ring back tone for this user.
+&lt;/p&gt;
+&lt;p&gt;
+This ring back tone overrides the ring back tone settings in the system settings.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Geben Sie hier den Namen der .wav-Datei für das Freizeichen dieses Benutzerprofils an.&lt;/p&gt;
+
+&lt;p&gt;Diese Einstellung ersetzt bei abgehendem Ruf von diesem Benutzerprofil die Auswahl für &quot;Freizeichen&quot; aus den Systemeinstellungen.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Specify the file name of a .wav file that you want to be played as ring tone for this user.
+&lt;/p&gt;
+&lt;p&gt;
+This ring tone overrides the ring tone settings in the system settings.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Geben Sie hier den Namen der .wav-Datei für den Klingelton dieses Benutzerprofils (=&quot;Nummer&quot;) an.&lt;/p&gt;
+
+&lt;p&gt;Diese Einstellung ersetzt bei Anrufen an dieses Benutzerprofil die Auswahl &quot;Klingelton&quot; aus den Systemeinstellungen.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Ring tone:</source>
+ <translation>&amp;Klingelton:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you release a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing SIP BYE request are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=local_release&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the BYE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Dieses Script wird gestartet, wenn ein Gespräch durch Sie beendet wird.
+&lt;/p&gt;
+&lt;h3&gt;Environment Variablen&lt;/h3&gt;
+&lt;p&gt;
+Die Inhalte aller SIP header der abgesendeten SIP BYE Anforderung werden in Environment Variablen ans Script übergeben.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=local_release&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPREQUEST_URI&lt;/b&gt; enthält die request-URI des BYE. &lt;br&gt;
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; enthält den Namen des aktuell genutzten Benutzerprofils.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when an incoming call fails.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing SIP failure response are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_failed&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; contains the status code of the failure response. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Dieses Script wird gestartet, wenn ein eingehender Ruf nicht zustande kommt, also das Klingeln endet ohne dass &quot;abgehoben&quot; wurde.
+&lt;/p&gt;
+&lt;h3&gt;Environment Variablen&lt;/h3&gt;
+&lt;p&gt;
+Die Inhalte aller SIP header der abgesendeten SIP failure Antwort werden in Environment Variablen ans Script übergeben.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_failed&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; enthält den Statuscode der abgesendeten SIP failure Antwort. &lt;br&gt;
+&lt;b&gt;SIPSTATUS_REASON&lt;/b&gt;enthält &quot;reason phrase&quot;, also die &quot;Fehler&quot;ursache in Klartext.&lt;br&gt;
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; enthält den Namen des aktuell genutzten Benutzerprofils.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when the remote party releases a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming SIP BYE request are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=remote_release&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the BYE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Dieses Script wird gestartet, wenn ein Gespräch durch die Gegenstelle beendet wird.
+&lt;/p&gt;
+&lt;h3&gt;Environment Variablen&lt;/h3&gt;
+&lt;p&gt;
+Die Inhalte aller SIP header der eingehenden SIP BYE Anforderung werden in Environment Variablen ans Script übergeben.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=remote_release&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPREQUEST_URI&lt;/b&gt; enthält die request-URI des BYE. &lt;br&gt;
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; enthält den Namen des aktuell genutzten Benutzerprofils.
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when the remote party answers your call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming 200 OK are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_answered&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Dieses Script wird gestartet, wenn das Gespräch durch die Gegenstelle angenommen wird.
+&lt;/p&gt;
+&lt;h3&gt;Environment Variablen&lt;/h3&gt;
+&lt;p&gt;
+Die Inhalte aller SIP header der eingehenden &quot;200 OK&quot; Mitteilung werden in Environment Variablen ans Script übergeben.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_answered&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; enthält &quot;reason phrase&quot;&lt;br&gt;
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; enthält den Namen des aktuell genutzten Benutzerprofils.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you answer an incoming call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing 200 OK are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_answered&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Dieses Script wird gestartet, wenn Sie einen Anruf entgegennehmen.
+&lt;/p&gt;
+&lt;h3&gt;Environment Variablen&lt;/h3&gt;
+&lt;p&gt;
+Die Inhalte aller SIP header der gesendeten &quot;200 OK&quot; Antwort werden in Environment Variablen ans Script übergeben.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_answered&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; enthält &quot;reason phrase&quot;&lt;br&gt;
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; enthält den Namen des aktuell genutzten Benutzerprofils.</translation>
+ </message>
+ <message>
+ <source>Call released locall&amp;y:</source>
+ <translation>Gespräch &amp;lokal beendet:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when an outgoing call fails.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming SIP failure response are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_failed&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; contains the status code of the failure response. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Dieses Script wird gestartet, wenn ein abgehender Anruf nicht zustande kommt, z.B. wegen timeout, DND usw.
+&lt;/p&gt;
+&lt;h3&gt;Environment Variablen&lt;/h3&gt;
+&lt;p&gt;
+Die Inhalte aller SIP header der empfangenen SIP failure Antwort werden in Environment Variablen ans Script übergeben.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_failed&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; enthält den Statuscode der abgesendeten SIP failure Antwort.&lt;br&gt;
+&lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; enthält &quot;reason phrase&quot;, also die &quot;Fehler&quot;ursache in Klartext.&lt;br&gt;
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; enthält den Namen des aktuell genutzten Benutzerprofils.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you make a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing INVITE are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=INVITE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the INVITE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Dieses Script wird gestartet, wenn Sie einen Anruf tätigen.
+&lt;/p&gt;
+&lt;h3&gt;Environment Variablen&lt;/h3&gt;
+&lt;p&gt;
+Die Inhalte aller SIP header der abgesendeten SIP INVITE Anforderung werden in Environment Variablen ans Script übergeben.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call&lt;/b&gt;.&lt;br&gt;
+&lt;b&gt;SIPREQUEST_METHOD=INVITE&lt;/b&gt;.&lt;br&gt;
+&lt;b&gt;SIPREQUEST_URI&lt;/b&gt; enthält die request-URI des INVITE.&lt;br&gt;
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; enthält den Namen des aktuell genutzten Benutzerprofils.</translation>
+ </message>
+ <message>
+ <source>Outgoing call a&amp;nswered:</source>
+ <translation>Abgehe&amp;nder Ruf angenommen:</translation>
+ </message>
+ <message>
+ <source>Incoming call &amp;failed:</source>
+ <translation>Eingehender Ruf er&amp;folglos:</translation>
+ </message>
+ <message>
+ <source>&amp;Incoming call:</source>
+ <translation>E&amp;ingehender Ruf:</translation>
+ </message>
+ <message>
+ <source>Call released &amp;remotely:</source>
+ <translation>Gesp&amp;rächsende durch Gegenstelle: </translation>
+ </message>
+ <message>
+ <source>Incoming call &amp;answered:</source>
+ <translation>Eingehender Ruf &amp;angenommen:</translation>
+ </message>
+ <message>
+ <source>O&amp;utgoing call:</source>
+ <translation>Abgehender R&amp;uf:</translation>
+ </message>
+ <message>
+ <source>Out&amp;going call failed:</source>
+ <translation>Ab&amp;gehender Ruf erfolglos:</translation>
+ </message>
+ <message>
+ <source>&amp;Enable ZRTP/SRTP encryption</source>
+ <translation>ZRTP/SRTP V&amp;erschlüsselung</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Wenn aktiviert, versucht Twinkle bei allen abgehenden und ankommenden Geprächen die Sprachdaten zu verschlüsseln. Hierzu muss natürlich die Gegenstelle ebenfalls ZRTP/SRTP unterstützen, andernfalls bleibt das Gespräch unverschlüsselt.</translation>
+ </message>
+ <message>
+ <source>ZRTP settings</source>
+ <translation>ZRTP Einstellungen</translation>
+ </message>
+ <message>
+ <source>O&amp;nly encrypt audio if remote party indicated ZRTP support in SDP</source>
+ <translation>&amp;Nur verschlüsseln, wenn Gegenstelle ZRTP-Unterstützung im SDP meldet </translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Eine ZRTP-fähige SIP-Gegenstelle kann diese Fähigkeit schon während des Gesprächsaufbaus mitteilen. Wenn aktiviert, versucht Twinkle nur bei solchen Gegenstellen, eine Verschlüsselung auszuhandeln.</translation>
+ </message>
+ <message>
+ <source>&amp;Indicate ZRTP support in SDP</source>
+ <translation>ZRTP-Unterstützung &amp;im SDP mitteilen</translation>
+ </message>
+ <message>
+ <source>Twinkle will indicate ZRTP support during call setup in its signalling.</source>
+ <translation>Wenn aktiviert, meldet Twinkle der Gegenstelle beim Gesprächsaufbau im SDP, dass es ZRTP unterstützt.</translation>
+ </message>
+ <message>
+ <source>&amp;Popup warning when remote party disables encryption during call</source>
+ <translation>&amp;Warnen, wenn Gegenstelle auf unverschlüsselt umschaltet</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Die Gegenstelle kann während eines verschlüsselten Gesprächs ein ZRTP-go-clear Komando senden und damit die Verschlüsselung stoppen. Wenn aktiviert, macht Twinkle in diesem Fall mit einer Warnmeldung auf das Sicherheitsproblem aufmerksam.</translation>
+ </message>
+ <message>
+ <source>Dynamic payload type %1 is used more than once.</source>
+ <translation>Dynamische Nutzdatenkennung %1 mehrfach vergeben.</translation>
+ </message>
+ <message>
+ <source>You must fill in a user name for your SIP account.</source>
+ <translation>Sie müssen den Namensteil Ihrer SIP-Benutzerkennung angeben.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Sie müssen den domain-Teil (den Teil rechts nach @) Ihrer SIP-Benutzerkennung angeben.
+Häufig identisch mit der Domain Ihres SIP-Providers.
+
+Für direct-IP-to-IP, also ohne SIP-Provider, ist dies der (dyndns-)Name oder die öffentliche IP Ihres PC. </translation>
+ </message>
+ <message>
+ <source>Invalid user name.</source>
+ <translation>Unzulässiger Benutzername.</translation>
+ </message>
+ <message>
+ <source>Invalid domain.</source>
+ <translation>Unzulässige Benutzerdomain.</translation>
+ </message>
+ <message>
+ <source>Invalid value for registrar.</source>
+ <translation>Unzulässiger Wert für Registrar.</translation>
+ </message>
+ <message>
+ <source>Invalid value for outbound proxy.</source>
+ <translation>Unzulässiger Wert für outbound proxy.</translation>
+ </message>
+ <message>
+ <source>Value for public IP address missing.</source>
+ <translation>Keine öffentliche Adresse angegeben.</translation>
+ </message>
+ <message>
+ <source>Invalid value for STUN server.</source>
+ <translation>Unzulässiger Wert für STUN-Server.</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Signaltöne</translation>
+ </message>
+ <message>
+ <source>Choose ring tone</source>
+ <translation>Auswahl Klingelton</translation>
+ </message>
+ <message>
+ <source>Ring back tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Signaltöne</translation>
+ </message>
+ <message>
+ <source>All files</source>
+ <translation>Alle Dateien</translation>
+ </message>
+ <message>
+ <source>Choose incoming call script</source>
+ <translation>Auswahl Script bei &quot;eingehendem Ruf&quot;</translation>
+ </message>
+ <message>
+ <source>Choose incoming call answered script</source>
+ <translation>Auswahl Script bei &quot;eingehender Ruf angenommen&quot;</translation>
+ </message>
+ <message>
+ <source>Choose incoming call failed script</source>
+ <translation>Auswahl Script bei &quot;eingehender Ruf erfolglos&quot;</translation>
+ </message>
+ <message>
+ <source>Choose outgoing call script</source>
+ <translation>Auswahl Script bei &quot;abgehendem Ruf&quot;</translation>
+ </message>
+ <message>
+ <source>Choose outgoing call answered script</source>
+ <translation>Auswahl Script bei &quot;abgehender Ruf angenommen&quot;</translation>
+ </message>
+ <message>
+ <source>Choose outgoing call failed script</source>
+ <translation>Auswahl Script bei &quot;abgehender Ruf erfolglos&quot;</translation>
+ </message>
+ <message>
+ <source>Choose local release script</source>
+ <translation>Auswahl Script bei &quot;Gespräch lokal beendet&quot;</translation>
+ </message>
+ <message>
+ <source>Choose remote release script</source>
+ <translation>Auswahl Script bei &quot;Gespräch durch Gegenstelle beendet&quot;</translation>
+ </message>
+ <message>
+ <source>Voice mail</source>
+ <translation>Anrufbeantworter</translation>
+ </message>
+ <message>
+ <source>&amp;Follow codec preference from far end on incoming calls</source>
+ <translation>Gegenstelle wählt Codecs bei eingehendem Ru&amp;f</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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.
+&lt;p&gt;
+If you disable this option, then the first codec from the active codecs that is also in the SDP offer is picked.</source>
+ <translation>Wenn aktiviert: Bei ankomendem Anruf richtet sich Twinkle bevorzugt nach der Liste erlaubter Codecs von der Gegenstelle (SDP offer). Konkret wird der erste Codec der Ggst.-Wunschliste verwendet, der auch von Twinkle in der aktuellen Einstellung unterstützt wird.
+Wenn deaktiviert, verwendet Twinkle den ertsen Codec der eigenen Liste, der auch von der GgSt. untersützt wird.</translation>
+ </message>
+ <message>
+ <source>Follow codec &amp;preference from far end on outgoing calls</source>
+ <translation>Gegenstelle wählt Codecs bei a&amp;bgehendem Ruf</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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.
+&lt;p&gt;
+If you disable this option, then the first codec from the active codecs that is also in the SDP answer is picked.</source>
+ <translation>Wenn aktiviert: Bei abgehendem Ruf richtet sich Twinkle bevorzugt nach der Liste erlaubter Codecs von der Gegenstelle (SDP answer). Konkret wird der erste Codec der Ggst.-Wunschliste verwendet, der auch von Twinkle in der aktuellen Einstellung unterstützt wird.
+Wenn deaktiviert, verwendet Twinkle den ertsen Codec der eigenen Liste, der auch von der GgSt. untersützt wird, also in der SDP-Answer-Liste steht.</translation>
+ </message>
+ <message>
+ <source>Codeword &amp;packing order:</source>
+ <translation>Datenanordnung (codeword &amp;packing order):</translation>
+ </message>
+ <message>
+ <source>RFC 3551</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>ATM AAL2</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Es gibt 2 Methoden, die G.726 codewords in ein RTP-Paket anzuordnen. Standard ist RFC 3551. Einige SIP-Provider nutzen allerdings ATM AAL2. Wenn die Tonübertragung bei Verwendung des G.726-Codecs gestört ist, versuchen Sie hier die andere Einstellung.</translation>
+ </message>
+ <message>
+ <source>Replaces</source>
+ <translation>Replaces</translation>
+ </message>
+ <message>
+ <source>Indicates if the Replaces-extenstion is supported.</source>
+ <translation>Wenn aktiviert, unterstützt Twinkle Replaces-Extension bei PRACK.</translation>
+ </message>
+ <message>
+ <source>Attended refer to AoR (Address of Record)</source>
+ <translation>Vermittlung mit Rückfrage verwendet &quot;Address of Record&quot;</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Eine Vermittlung mit Rückfrage sollte die Contact-URI als Zieladresse nutzen, um der vermittelten GgSt die neu zu schaltende Verbindung mitzuteilen. Diese Adresse kann allerdings evtl. nicht global gültig d.h. &quot;route-&quot;bar sein. Das vermittelte Gespräch kommt dann beim neuen Ziel nicht an.
+Alternativ kann Twinkle die AoR (Address of Record) nutzen. Nachteil hierbei: diese ist bei mehreren unter gleichem SIP-Benutzerkonto angemeldeten Endgeräten nicht eindeutig, so dass von der vermittelten GgSt (eigentlich vom Provider) alle Endgeräte angesprochen werden und einen Anuf signalisieren.</translation>
+ </message>
+ <message>
+ <source>Privacy</source>
+ <translation>Datenschutz</translation>
+ </message>
+ <message>
+ <source>Privacy options</source>
+ <translation>Datenschutz-Einstellungen</translation>
+ </message>
+ <message>
+ <source>&amp;Send P-Preferred-Identity header when hiding user identity</source>
+ <translation>&amp;Sende &quot;P-Preferred-Identity Header&quot; bei &quot;Absender verbergen&quot;</translation>
+ </message>
+ <message>
+ <source>Include a P-Preferred-Identity header with your identity in an INVITE request for a call with identity hiding.</source>
+ <translation>Wenn aktiviert, wird zusammen mit der Absenderangabe ein &quot;P-Preferred-Identity Header&quot; beim INVITE gesendet, falls &quot;Absender verbergen&quot; aktiv ist.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+You can customize the way Twinkle handles incoming calls. Twinkle can call a script when a call comes in. Based on the ouput 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.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Note:&lt;/b&gt; 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 &lt;b&gt;end&lt;/b&gt; and keep on running. Twinkle will continue when it receives the &lt;b&gt;end&lt;/b&gt; parameter.
+&lt;/p&gt;
+&lt;p&gt;
+With your script you can customize call handling by outputing one or more of the following parameters to stdout. Each parameter should be on a separate line.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+action=[ continue | reject | dnd | redirect | autoanswer ]&lt;br&gt;
+reason=&amp;lt;string&amp;gt;&lt;br&gt;
+contact=&amp;lt;address to redirect to&amp;gt;&lt;br&gt;
+caller_name=&amp;lt;name of caller to display&amp;gt;&lt;br&gt;
+ringtone=&amp;lt;file name of .wav file&amp;gt;&lt;br&gt;
+display_msg=&amp;lt;message to show on display&amp;gt;&lt;br&gt;
+end&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;/p&gt;
+&lt;h2&gt;Parameters&lt;/h2&gt;
+&lt;h3&gt;action&lt;/h3&gt;
+&lt;p&gt;
+&lt;b&gt;continue&lt;/b&gt; - continue call handling as usual&lt;br&gt;
+&lt;b&gt;reject&lt;/b&gt; - reject call&lt;br&gt;
+&lt;b&gt;dnd&lt;/b&gt; - deny call with do not disturb indication&lt;br&gt;
+&lt;b&gt;redirect&lt;/b&gt; - redirect call to address specified by &lt;b&gt;contact&lt;/b&gt;&lt;br&gt;
+&lt;b&gt;autoanswer&lt;/b&gt; - automatically answer a call&lt;br&gt;
+&lt;/p&gt;
+&lt;p&gt;
+When the script does not write an action to stdout, then the default action is continue.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;reason: &lt;/b&gt;
+With the reason parameter you can set the reason string for reject or dnd. This might be shown to the far-end user.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;caller_name: &lt;/b&gt;
+This parameter will override the display name of the caller.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;ringtone: &lt;/b&gt;
+The ringtone parameter specifies the .wav file that will be played as ring tone when action is continue.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+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 &lt;b&gt;SIP_&amp;lt;HEADER_NAME&amp;gt;&lt;/b&gt; E.g. SIP_FROM contains the value of the from header.
+&lt;/p&gt;
+&lt;p&gt;
+TWINKLE_TRIGGER=in_call. SIPREQUEST_METHOD=INVITE. The request-URI of the INVITE will be passed in &lt;b&gt;SIPREQUEST_URI&lt;/b&gt;. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Dieses Script wird gerufen, wenn ein INVITE (Anruf) ankommt. &lt;br&gt;
+Bitte lesen Sie im Handbuch unter &quot;/usr/share/doc/packages/twinkle/...&quot; oder &quot;http://twinklephone.com&quot; die ausführliche Beschreibung!
+&lt;/p&gt;
+&lt;h3&gt;Rückgabewerte&lt;/h3&gt; - print nach STDOUT (z.B. `echo &quot;action=dnd&quot;`), ein Wert pro Zeile: &lt;br&gt;
+&lt;tt&gt;action=[ continue | reject | dnd | redirect | autoanswer ]&lt;br&gt;&lt;/tt&gt;
+&lt;blockquote&gt;
+&lt;i&gt;continue&lt;/i&gt; - Anrufverarbeitung normal fortsetzen (default)&lt;br&gt;
+&lt;i&gt;reject&lt;/i&gt; - Ruf abweisen&lt;br&gt;
+&lt;i&gt;dnd&lt;/i&gt; - Ruf ablehnen mit Hinweis &quot;do not disturb&quot;&lt;br&gt;
+&lt;i&gt;redirect&lt;/i&gt; - Ruf umleiten nach &lt;tt&gt;contact&lt;/tt&gt; (siehe dort)&lt;br&gt;
+&lt;i&gt;autoanswer&lt;/i&gt; - Ruf &quot;automatisch&quot; annehmen&lt;br&gt;
+&lt;/blockquote&gt;
+&lt;br&gt;
+&lt;tt&gt;reason=&amp;lt;string&amp;gt; &lt;/tt&gt;für dnd und reject (Anzeige bei GgSt)&lt;br&gt;
+&lt;tt&gt;contact=&amp;lt;Umleitadresse&amp;gt; &lt;/tt&gt;für redirect&lt;br&gt;
+&lt;tt&gt;caller_name=&amp;lt;neuer Displayname des Anrufers&amp;gt; &lt;/tt&gt;ersetzt evtl. vorh. displayname aus INVITE&lt;br&gt;
+&lt;tt&gt;ringtone=&amp;lt;Dateiname des .wav file&amp;gt; &lt;/tt&gt;Klingelton, speziell f. diesen Anruf (nur bei &lt;i&gt;continue&lt;/i&gt; ;-)&lt;br&gt;
+&lt;tt&gt;display_msg=&amp;lt;belieb. Hinweis für Detailanzeige Hauptfenster&amp;gt;&lt;/tt&gt;&lt;br&gt;
+&lt;tt&gt;end &lt;/tt&gt;Twinkle wertet alle Rückgaben aus, schliesst STDOUT des Scripts(!), und arbeitet weiter&lt;br&gt;
+&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+&lt;h3&gt;Environment Variablen&lt;/h3&gt;
+&lt;p&gt;
+Die Werte aller SIP header des eingehenden INVITE werden in Environmentvariablen ans Script übergeben. Aufbau der Variablennamen: &lt;b&gt;SIP_&amp;lt;HEADER_NAME&amp;gt;&lt;/b&gt; - z.B. SIP_FROM enthält Wert des &quot;from header&quot;.
+&lt;/p&gt;
+&lt;p&gt;
+TWINKLE_TRIGGER=in_call. &lt;br&gt;
+SIPREQUEST_METHOD=INVITE. &lt;br&gt;
+SIPREQUEST_URI enthält request-URI des INVITE.&lt;br&gt;
+TWINKLE_USER_PROFILE enthält Name des Benutzerprofils, für das der Ruf einging.</translation>
+ </message>
+ <message>
+ <source>&amp;Voice mail address:</source>
+ <translation>Anrufbeantworter Nr/Adr:</translation>
+ </message>
+ <message>
+ <source>The SIP address or telephone number to access your voice mail.</source>
+ <translation>Die SIP-Adresse bzw. Telefonnr., unter der Ihr vom Provider zur Verfügung gestellter Anrufbeantworter abrufbar ist. Oft gibt der Provider zwei Nummern an, eine zum Abruf über beliebige Telefone (zB. &quot;0049 211 58000111&quot;) und eine zum SIP-Abruf (zB. &quot;50000&quot;) - dann sollte hier die SIP-Nummer angegeben werden.</translation>
+ </message>
+ <message>
+ <source>Unsollicited</source>
+ <translation>Asterisk-Modus</translation>
+ </message>
+ <message>
+ <source>Sollicited</source>
+ <translation>RFC 3842</translation>
+ </message>
+ <message>
+ <source>&lt;H2&gt;Message waiting indication type&lt;/H2&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;H3&gt;Unsollicited&lt;/H3&gt;
+&lt;p&gt;
+Asterisk provides unsollicited message waiting indication.
+&lt;/p&gt;
+&lt;H3&gt;Sollicited&lt;/H3&gt;
+&lt;p&gt;
+Sollicited message waiting indication as specified by RFC 3842.
+&lt;/p&gt;</source>
+ <translation>&lt;H2&gt;Message waiting indication Typ&lt;/H2&gt;
+&lt;p&gt;
+Wenn Ihr SIP-Provider &quot;message waiting indication&quot; (MWI, Benachrichtigung über aufgezeichnete Nachrichten) anbietet, kann Twinkle Sie über neue und schon abgehörte Nachrichten auf Ihrem SIP-Anrufbeantworter informieren. Abhängig von Ihrem Provider bzw. dem von Ihnen genutzten Anrufbeantworterdienst müssen Sie hier eines der folgenden Verfahren einstellen:
+&lt;/p&gt;
+&lt;H3&gt;Asterisk&lt;/H3&gt;
+&lt;p&gt;
+Asterisk unterstützt im allg. &quot;unsollicited message waiting indication&quot;.
+&lt;/p&gt;
+&lt;H3&gt;RFC 3842&lt;/H3&gt;
+&lt;p&gt;
+&quot;Sollicited message waiting indication&quot; entsprechend RFC 3842 Spezifikation (z.B. für &quot;sipgate.de&quot;).
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;MWI type:</source>
+ <translation>&amp;MWI Typ:</translation>
+ </message>
+ <message>
+ <source>Sollicited MWI</source>
+ <translation>RFC 3842</translation>
+ </message>
+ <message>
+ <source>Subscription &amp;duration:</source>
+ <translation>Anmel&amp;dung gültig:</translation>
+ </message>
+ <message>
+ <source>Mailbox &amp;user name:</source>
+ <translation>Mailbox Ben&amp;utzername:</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of your voice mailbox server.</source>
+ <translation>Der Domainname, IP-Adresse oder Hostname des Voice-Mailbox-Servers. Versuchen Sie die Voreinstellung (=Domain Ihres Benutzernamens), falls Ihr Provider nichts anderes mitgeteilt hat.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Bei RFC 3842 MWI meldet sich das Endgerät (Twinkle) für eine gewisse Dauer beim Server zum Empfang von Benachrichtigungen an (SUBSCRIBE), und sollte diese Anmeldung vor Ablauf erneuern. Ähnlich der &quot;expiry time&quot; / &quot;haltbar&quot; für REGISTER, siehe SIP-Server.</translation>
+ </message>
+ <message>
+ <source>Your user name for accessing your voice mailbox.</source>
+ <translation>Ihr Benutzername zum Zugriff auf Ihre Voice-Mailbox (Anrufbeantworter). Wenn Ihr Provider nichts anderes mitteilt, versuchen Sie die Vorgabe (=Ihr SIP-Benutzername).</translation>
+ </message>
+ <message>
+ <source>Mailbox &amp;server:</source>
+ <translation>Mailbox-&amp;Server:</translation>
+ </message>
+ <message>
+ <source>Via outbound &amp;proxy</source>
+ <translation>Via Outbound-&amp;Proxy:</translation>
+ </message>
+ <message>
+ <source>Check this option if Twinkle should send SIP messages to the mailbox server via the outbound proxy.</source>
+ <translation>Wenn aktiviert, sendet Twinkle SIP-Anfragen an die Mailbox über den Outbound-Proxy.</translation>
+ </message>
+ <message>
+ <source>You must fill in a mailbox user name.</source>
+ <translation>Sie müssen einen Mailbox-Benutzernamen angeben.</translation>
+ </message>
+ <message>
+ <source>You must fill in a mailbox server</source>
+ <translation>Sie müssen den Mailbox-Server angeben.</translation>
+ </message>
+ <message>
+ <source>Invalid mailbox server.</source>
+ <translation>Unzulässiger Name für Mailbox-Server.</translation>
+ </message>
+ <message>
+ <source>Invalid mailbox user name.</source>
+ <translation>Unzulässiger Mailbox-Benutzername.</translation>
+ </message>
+ <message>
+ <source>Use domain &amp;name to create a unique contact header value</source>
+ <translation>Domain-&amp;Name benutzen für eindeutigen Contact-Header</translation>
+ </message>
+ <message>
+ <source>Select ring back tone file.</source>
+ <translation>Dateiauswahl Freizeichen.</translation>
+ </message>
+ <message>
+ <source>Select ring tone file.</source>
+ <translation>Dateiauswahl Klingelton.</translation>
+ </message>
+ <message>
+ <source>Select script file.</source>
+ <translation>Dateiauswahl Scriptfile / Programm.</translation>
+ </message>
+ <message>
+ <source>%1 converts to %2</source>
+ <translation>Vor Konvertierung: &lt;b&gt;%1&lt;/b&gt;&lt;br&gt;
+Nach Konvertierung: &lt;b&gt;%2&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Instant message</source>
+ <translation>Instant Message</translation>
+ </message>
+ <message>
+ <source>Presence</source>
+ <translation>Online-Status</translation>
+ </message>
+ <message>
+ <source>&amp;Maximum number of sessions:</source>
+ <translation>&amp;Max. Anzahl IM-Fenster:</translation>
+ </message>
+ <message>
+ <source>When you have this number of instant message sessions open, new incoming message sessions will be rejected.</source>
+ <translation>Hier können Sie die Anzahl gleichzeitig offener IM-Fenster für dieses Benutzerprofil als Empfänger begrenzen.&lt;br&gt;
+Bei Erreichen der Obergrenze erhält jeder weitere Absender einer Instant Message den Hinweis &quot;468 Besetzt&quot;. &lt;br&gt;
+Sie können diese Einstellung auf 0 setzen, wenn Sie keine ankommenden Instant Messages wünschen.</translation>
+ </message>
+ <message>
+ <source>Your presence</source>
+ <translation>Ihr Online-Status</translation>
+ </message>
+ <message>
+ <source>&amp;Publish availability at startup</source>
+ <translation>Erreichbarkeit beim Start &amp;veröffentlichen</translation>
+ </message>
+ <message>
+ <source>Publish your availability at startup.</source>
+ <translation>Wenn aktiviert, veröffentlicht Twinkle Ihren Online-Status als &quot;online&quot;, sobald das Benutzerprofil aktivieren. Beachten Sie, dass Sie trotz allem solange nicht erreichbar sind, bis Sie sich bei, SIP-Server angemeldet haben - siehe Menü &quot;Anmeldung&quot;, sowie hier &quot;SIP Server&quot; &quot;Bei Profilstart anmelden&quot;.</translation>
+ </message>
+ <message>
+ <source>Buddy presence</source>
+ <translation>Buddy Online-Status</translation>
+ </message>
+ <message>
+ <source>Publication &amp;refresh interval (sec):</source>
+ <translation>Erneut ve&amp;röffentlichen nach (Sek.):</translation>
+ </message>
+ <message>
+ <source>Refresh rate of presence publications.</source>
+ <translation>Die Refreshzeit für die Veröffentlichung des Online-Status in Sekunden. Damit der &quot;presence server&quot; z.B. eine unterbrochene Verbindung schnell bemerkt, kann es sinnvoll sein, hier wesentlich kürzere Werte als den Standard &quot;3600&quot; einzutragen.</translation>
+ </message>
+ <message>
+ <source>&amp;Subscription refresh interval (sec):</source>
+ <translation>&quot;&amp;Subscribe&quot; erneut nach (Sek.):</translation>
+ </message>
+ <message>
+ <source>Refresh rate of presence subscriptions.</source>
+ <translation>Die Refreshzeit für die Anmeldung durch &quot;SUBSCRIBE&quot; zum Erhalten von Online-Status-Mitteilungen über die Ereichbarkeit der Buddies unter diesem Benutzerprofil. Standard &quot;3600&quot;.</translation>
+ </message>
+ <message>
+ <source>Transport/NAT</source>
+ <translation>Übertragung/NAT</translation>
+ </message>
+ <message>
+ <source>Add q-value to registration</source>
+ <translation>Verwende q-Wert bei der Anmeldung</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Falls mehrere Geräte auf die gleiche SIP-Benutzerkennung angemeldet werden, kann der Provider den q-Wert dazu verwenden, die Reihenfolge festzulegen, in der ein eingehender Ruf an die Geräte zugetellt wird.</translation>
+ </message>
+ <message>
+ <source>The q-value is a value between 0.000 and 1.000. A higher value means a higher priority.</source>
+ <translation>Der q-Wert darf zwischen 0,000 und 1,000 liegen. Ein höherer Wert bedeutet höhere Priorität. Das Gerät mit der höchsten Priorität wird als erstes angesprochen.</translation>
+ </message>
+ <message>
+ <source>SIP transport</source>
+ <translation>SIP Übertragung</translation>
+ </message>
+ <message>
+ <source>UDP</source>
+ <translation>UDP</translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <translation>TCP</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Übertragungsmodus (TCP oder UDP) für SIP. Bei &quot;Automatisch&quot; wird TCP verwendet, falls die Größe der zu übertragenden Nachricht das Limit für UDP übersteigt.</translation>
+ </message>
+ <message>
+ <source>T&amp;ransport protocol:</source>
+ <translation>Übe&amp;rtragungsprotokoll:</translation>
+ </message>
+ <message>
+ <source>UDP t&amp;hreshold:</source>
+ <translation>UDP &amp;Grenzwert:</translation>
+ </message>
+ <message>
+ <source> bytes</source>
+ <translation type="obsolete"> Bytes</translation>
+ </message>
+ <message>
+ <source>Messages larger than the threshold are sent via TCP. Smaller messages are sent via UDP.</source>
+ <translation>Nachrichten, die größer sind als der Grenzwert, werden über TCP gesendet, kleinere über UDP.</translation>
+ </message>
+ <message>
+ <source>Use &amp;STUN (does not work for incoming TCP)</source>
+ <translation>&amp;STUN benutzen (wirkungslos für eingehende TCP-Verbindungen)</translation>
+ </message>
+ <message>
+ <source>P&amp;ersistent TCP connection</source>
+ <translation>TCP-V&amp;erbindung aufrecht erhalten</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Wenn aktiviert: Twinkle hält die TCP-Verbindung aufrecht, die bei der Registrierung verwendet wurde. So kann der SIP-Proxy diese Verbindung weiterhin benutzen, um ankommende Anfragen an Twinkle weiterzuleiten. Durch Senden von &quot;Application ping Paketen&quot; wird ständig überprüft, ob die Verbindung weiterhin besteht.</translation>
+ </message>
+ <message>
+ <source>&amp;Send composing indications when typing a message.</source>
+ <translation>&amp;Sende &quot;compositing indication&quot; beim Schreiben einer Nachricht.</translation>
+ </message>
+ <message>
+ <source>Twinkle sends a composing indication when you type a message. This way the recipient can see that you are typing.</source>
+ <translation>Wenn aktiviert, sendet Twinkle eine &quot;compositing indication&quot; wenn Sie eine Nachricht tippen. So kann der Empfänger erkennen, dass Sie gerade dabei sind, eine Nachricht zu verfassen.</translation>
+ </message>
+ <message>
+ <source>AKA AM&amp;F:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A&amp;KA OP:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Authentication management field for AKAv1-MD5 authentication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Operator variant key for AKAv1-MD5 authentication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Prepr&amp;ocessing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preprocessing (improves quality at remote end)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Automatic gain control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automatic gain control &amp;level:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automatic gain control level represents percentual value of automatic gain setting of a microphone. Recommended value is about 25%.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Voice activity detection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When enabled, voice activity detection detects whether the input signal represents a speech or a silence/background noise.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Noise reduction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The noise reduction can be used to reduce the amount of background noise present in the input signal. This provides higher quality speech.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Acoustic &amp;Echo Cancellation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Variable &amp;bit-rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Discontinuous &amp;Transmission</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Quality:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Speex is a lossy codec, which means that it achives 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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>bytes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use tel-URI for telephone &amp;number</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Expand a dialed telephone number to a tel-URI instead of a sip-URI.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Accept call &amp;transfer request (incoming REFER)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allow call transfer while consultation in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable NAT &amp;keep alive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send UDP NAT keep alive packets.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WizardForm</name>
+ <message>
+ <source>Twinkle - Wizard</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of the STUN server.</source>
+ <translation>Der Domainname, IP-Adresse oder Hostname des STUN-Servers.
+
+Twinkle versucht, unter der hier genannten Domain die korrekten Daten beim DNS-Server zu erfragen (RFC 2782).
+Daher genügt bei Providern, die dies unterstützen, die Domain des Anmeldeservers als Angabe.</translation>
+ </message>
+ <message>
+ <source>S&amp;TUN server:</source>
+ <translation>S&amp;TUN-Server:</translation>
+ </message>
+ <message>
+ <source>The SIP user name given to you by your provider. It is the user part in your SIP address, &lt;b&gt;username&lt;/b&gt;@domain.com This could be a telephone number.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>Der Nutzername, den Sie von Ihrem Provider zugewiesen bekommen haben. Dieser ist der erste Teil Ihrer vollständigen SIP-Adresse &lt;b&gt;nutzername&lt;/b&gt;@domain.com . Bei vielen Providern wird dieser -eigentlich falsch- als Telefonnummer bezeichnet.
+&lt;br&gt;&lt;br&gt;
+*DATEN FÜR DIESES FELD SIND ZWINGEND NOTWENDIG.</translation>
+ </message>
+ <message>
+ <source>&amp;Domain*:</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Choose your SIP service provider. If your SIP service provider is not in the list, then select &lt;b&gt;Other&lt;/b&gt; and fill in the settings you received from your provider.&lt;br&gt;&lt;br&gt;
+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.</source>
+ <translation>Wählen Sie Ihren SIP-Provider aus, und tragen Sie dann Ihren SIP-Benutzernamen, gegebenenfalls Absendernamen, Anmeldenamen und Passwort ein.&lt;br&gt;
+Wenn Ihr SIP-Provider nicht in der Liste erscheint, wählen Sie &lt;b&gt;Anderer&lt;/b&gt; und tragen Sie die Angaben entsprechend der von Ihrem Provider erhaltenen Daten ein.
+&lt;p&gt;
+Praktisch überall in Twinkle bekommen Sie mit &lt;b&gt;Umschalt-F1&lt;/b&gt; oder &lt;b&gt;rechtem Mausklick&lt;/b&gt; Hilfetexte wie diesen zu den einzelnen Feldern und Knöpfen.
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Authentication name:</source>
+ <translation>&amp;Anmeldename:</translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation>Ihr &amp;Absendername:</translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation>Ihr SIP-Anmeldename. Häufig identisch mit Ihrem SIP-Nutzernamen, dann leerlassen. Falls nicht, wird Ihr Provider dies mitteilen.</translation>
+ </message>
+ <message>
+ <source>The domain part of your SIP address, username@&lt;b&gt;domain.com&lt;/b&gt;. Instead of a real domain this could also be the hostname or IP address of your &lt;b&gt;SIP proxy&lt;/b&gt;. If you want direct IP phone to IP phone communications then you fill in the hostname or IP address of your computer.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>Die Domain oder IP-Adresse, unter der Sie von Ihrem Provider geführt werden bzw. im Internet erreichbar sind. Dies ist der zweite Teil ihrer vollständigen SIP-Adresse nutzername@&lt;b&gt;domain.com&lt;/b&gt;. Bei vielen Providern identisch mit der Domain des Providers.
+Für direct-IP-to-IP (siehe Handbuch) ist hier die Adresse (DynDNS oder IP) einzutragen, unter der &lt;b&gt;Ihr Rechner&lt;/b&gt; zu erreichen ist.
+&lt;br&gt;&lt;br&gt;
+*DATEN FÜR DIESES FELD SIND ZWINGEND NOTWENDIG.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Ihr Absendername oder Pseudonym. Dieses Feld wird nur als Teil der Absenderangaben zur angerufenen/rufenden Gegernstelle übertragen und dort evtl angezeigt. Beliebige Angabe, nicht zwingend erforderlich.</translation>
+ </message>
+ <message>
+ <source>SIP pro&amp;xy:</source>
+ <translation>SIP-Pro&amp;xy:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Die Domain, IP-Adresse oder Hostname Ihres SIP-Proxy. Wenn dieser mit Ihrer Benutzerdomain identisch ist, lassen Sie dieses Feld leer.</translation>
+ </message>
+ <message>
+ <source>&amp;SIP service provider:</source>
+ <translation>&amp;SIP Service Provider (Umschalt-F1 für Hilfe):</translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>&amp;Passwort:</translation>
+ </message>
+ <message>
+ <source>&amp;User name*:</source>
+ <translation>N&amp;utzername *:</translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation>Ihr Anmeldepasswort. Wenn Sie dieses Feld leerlassen, müssen Sie das Passwort bei jeder Anmeldung in den dann erscheinenden Requester eintragen. </translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Abbruch (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>None (direct IP to IP calls)</source>
+ <translation>Keiner (direkt IP zu IP)</translation>
+ </message>
+ <message>
+ <source>Other</source>
+ <translation>Anderer</translation>
+ </message>
+ <message>
+ <source>User profile wizard:</source>
+ <translation>Benutzerprofil Wizard: </translation>
+ </message>
+ <message>
+ <source>You must fill in a user name for your SIP account.</source>
+ <translation>Sie müssen den Namensteil Ihrer SIP-Benutzerkennung angeben.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Sie müssen den domain-Teil (den Teil rechts nach @) Ihrer SIP-Benutzerkennung angeben.
+Häufig identisch mit der Domain Ihres SIP-Providers.
+
+Für direct-IP-to-IP, also ohne SIP-Provider, ist dies der (dyndns-)Name oder die öffentliche IP Ihres PC. </translation>
+ </message>
+ <message>
+ <source>Invalid value for SIP proxy.</source>
+ <translation>Unzulässiger Wert für SIP-Proxy.</translation>
+ </message>
+ <message>
+ <source>Invalid value for STUN server.</source>
+ <translation>Unzulässiger Wert für STUN-Server.</translation>
+ </message>
+</context>
+<context>
+ <name>YesNoDialog</name>
+ <message>
+ <source>&amp;Yes</source>
+ <translation>&amp;Ja</translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation>&amp;Nein</translation>
+ </message>
+</context>
+</TS>
diff --git a/src/gui/lang/twinkle_fr.ts b/src/gui/lang/twinkle_fr.ts
new file mode 100644
index 0000000..2a58c53
--- /dev/null
+++ b/src/gui/lang/twinkle_fr.ts
@@ -0,0 +1,6038 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name>AddressCardForm</name>
+ <message>
+ <source>Twinkle - Address Card</source>
+ <translation>Twinkle - Fiche de contact</translation>
+ </message>
+ <message>
+ <source>&amp;Remark:</source>
+ <translation>&amp;Remarque:</translation>
+ </message>
+ <message>
+ <source>Infix name of contact.</source>
+ <translation>Titre du contact.</translation>
+ </message>
+ <message>
+ <source>First name of contact.</source>
+ <translation>Prénom du contact.</translation>
+ </message>
+ <message>
+ <source>&amp;First name:</source>
+ <translation>&amp;Prénom:</translation>
+ </message>
+ <message>
+ <source>You may place any remark about the contact here.</source>
+ <translation>Vous pouvez saisir une remarque sur le contact ici.</translation>
+ </message>
+ <message>
+ <source>&amp;Phone:</source>
+ <translation>&amp;Téléphone:</translation>
+ </message>
+ <message>
+ <source>&amp;Infix name:</source>
+ <translation>T&amp;itre:</translation>
+ </message>
+ <message>
+ <source>Phone number or SIP address of contact.</source>
+ <translation>Numéro de téléphone ou une adresse SIP du contact.</translation>
+ </message>
+ <message>
+ <source>Last name of contact.</source>
+ <translation>Nom du contact. </translation>
+ </message>
+ <message>
+ <source>&amp;Last name:</source>
+ <translation>&amp;Nom:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Annuler (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>You must fill in a name.</source>
+ <translation>Vous devez saisir un nom.</translation>
+ </message>
+ <message>
+ <source>You must fill in a phone number or SIP address.</source>
+ <translation>Vous devez saisir un numéro de téléphone ou une adresse SIP.</translation>
+ </message>
+</context>
+<context>
+ <name>AuthenticationForm</name>
+ <message>
+ <source>Twinkle - Authentication</source>
+ <translation>Twinkle - Authentification</translation>
+ </message>
+ <message>
+ <source>user</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>The user for which authentication is requested.</source>
+ <translation>L&apos;utilisateur dont l&apos;identification est requise.</translation>
+ </message>
+ <message>
+ <source>profile</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>The user profile of the user for which authentication is requested.</source>
+ <translation>Le profil d&apos;utilisateur dont l&apos;identification est requise.</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Profil d&apos;utilisateur:</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Utilisateur:</translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>Mot de &amp;passe:</translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation>Votre mot de passe pour authentification.</translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation>Votre nom d&apos;authentification SIP. Souvent il est le même que votre nom d&apos;utilisateur SIP. Cependant, il peut être différent.</translation>
+ </message>
+ <message>
+ <source>&amp;User name:</source>
+ <translation>&amp;Utilisateur:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Annuler (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Login required for realm:</source>
+ <translation>Login nécessaire pour Realm:</translation>
+ </message>
+ <message>
+ <source>realm</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>The realm for which you need to authenticate.</source>
+ <translation>Le Realm pour lequel vous devez vous identifier.</translation>
+ </message>
+</context>
+<context>
+ <name>BuddyForm</name>
+ <message>
+ <source>Twinkle - Buddy</source>
+ <translation>Twinkle - Avatar</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Carnet d&apos;adresse</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Sélectionner une adresse du carnet d&apos;adresse.</translation>
+ </message>
+ <message>
+ <source>&amp;Phone:</source>
+ <translation>&amp;Téléphone:</translation>
+ </message>
+ <message>
+ <source>Name of your buddy.</source>
+ <translation>Nom de votre avatar.</translation>
+ </message>
+ <message>
+ <source>&amp;Show availability</source>
+ <translation>&amp;Montrer la disponibilité</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+M</translation>
+ </message>
+ <message>
+ <source>Check this option if you want to see the availability of your buddy. This will only work if your provider offers a presence agent.</source>
+ <translation>Cochez cette case si vous voulez voir la disponibilité de votre avatar. Ceci fonctionnera uniquement si votre fournisseur d&apos;accès offre un service de présence.</translation>
+ </message>
+ <message>
+ <source>&amp;Name:</source>
+ <translation>&amp;Nom:</translation>
+ </message>
+ <message>
+ <source>SIP address your buddy.</source>
+ <translation>Adresse SIP de votre avatar.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Annuler (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>You must fill in a name.</source>
+ <translation>Vous devez saisir un nom.</translation>
+ </message>
+ <message>
+ <source>Invalid phone.</source>
+ <translation>Téléphone invalide.</translation>
+ </message>
+ <message>
+ <source>Failed to save buddy list: %1</source>
+ <translation>Echec de la sauvegarde de la liste d&apos;avatars: %1</translation>
+ </message>
+</context>
+<context>
+ <name>BuddyList</name>
+ <message>
+ <source>Availability</source>
+ <translation>Disponobilité</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>inconnu</translation>
+ </message>
+ <message>
+ <source>offline</source>
+ <translation>déconnecté</translation>
+ </message>
+ <message>
+ <source>online</source>
+ <translation>connecté</translation>
+ </message>
+ <message>
+ <source>request rejected</source>
+ <translation>demande rejetée</translation>
+ </message>
+ <message>
+ <source>not published</source>
+ <translation>non publié</translation>
+ </message>
+ <message>
+ <source>failed to publish</source>
+ <translation>impossible de publier</translation>
+ </message>
+ <message>
+ <source>request failed</source>
+ <translation>demande échouée</translation>
+ </message>
+ <message>
+ <source>Click right to add a buddy.</source>
+ <translation>Cliquez à droite pour ajouter un avatar.</translation>
+ </message>
+</context>
+<context>
+ <name>CoreAudio</name>
+ <message>
+ <source>Failed to open sound card</source>
+ <translation>Echec de l&apos;accès à la carte son</translation>
+ </message>
+ <message>
+ <source>Failed to create a UDP socket (RTP) on port %1</source>
+ <translation>Echec de la création de la socket UDP (RTP) sur le port %1</translation>
+ </message>
+ <message>
+ <source>Failed to create audio receiver thread.</source>
+ <translation>Echec de la création de &quot;audio receiver thread&quot;.</translation>
+ </message>
+ <message>
+ <source>Failed to create audio transmitter thread.</source>
+ <translation>Echec de la création de &quot;audio transmitter thread&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>CoreCallHistory</name>
+ <message>
+ <source>local user</source>
+ <translation>utilisateur local</translation>
+ </message>
+ <message>
+ <source>remote user</source>
+ <translation>utilisateur distant</translation>
+ </message>
+ <message>
+ <source>failure</source>
+ <translation>échec</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>inconnu</translation>
+ </message>
+ <message>
+ <source>in</source>
+ <translation>entrant</translation>
+ </message>
+ <message>
+ <source>out</source>
+ <translation>sortant</translation>
+ </message>
+</context>
+<context>
+ <name>DeregisterForm</name>
+ <message>
+ <source>Twinkle - Deregister</source>
+ <translation>Twinkle - Déconnexion</translation>
+ </message>
+ <message>
+ <source>deregister all devices</source>
+ <translation>déconnecter toutes les interfaces</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Annuler (Es&amp;c)</translation>
+ </message>
+</context>
+<context>
+ <name>DiamondcardProfileForm</name>
+ <message>
+ <source>Twinkle - Diamondcard User Profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your Diamondcard account ID.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished">C&apos;est simplement votre nom complet, ex: Pierre Dupond. Il est utilisé pour l&apos;affichage. Quand vous ferez un appel, ceci sera montré à votre correspondant.</translation>
+ </message>
+ <message>
+ <source>&amp;Account ID:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;PIN code:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation type="unfinished">&amp;Votre nom:</translation>
+ </message>
+ <message>
+ <source>&lt;p align=&quot;center&quot;&gt;&lt;u&gt;Sign up for a Diamondcard account&lt;/u&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">Annuler (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fill in your account ID.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fill in your PIN code.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A user profile with name %1 already exists.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your Diamondcard PIN code.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;With a Diamondcard account you can make worldwide calls to regular and cell phones and send SMS messages. To sign up for a Diamondcard account click on the &quot;sign up&quot; link below. Once you have signed up you receive an account ID and PIN code. Enter the account ID and PIN code below to create a Twinkle user profile for your Diamondcard account.&lt;/p&gt;
+&lt;p&gt;For call rates see the sign up web page that will be shown to you when you click on the &quot;sign up&quot; link.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DtmfForm</name>
+ <message>
+ <source>Twinkle - DTMF</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Keypad</source>
+ <translation>Clavier</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Over decadic A. Normally not needed.</source>
+ <translation>Touche de fonction A. Normalement pas nécessaire.</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Over decadic B. Normally not needed.</source>
+ <translation>Touche de fonction B. Normalement pas nécessaire.</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Over decadic C. Normally not needed.</source>
+ <translation>Touche de fonction C. Normalement pas nécessaire.</translation>
+ </message>
+ <message>
+ <source>Star (*)</source>
+ <translation>Etoile (*)</translation>
+ </message>
+ <message>
+ <source>0</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Pound (#)</source>
+ <translation>Point (#)</translation>
+ </message>
+ <message>
+ <source>Over decadic D. Normally not needed.</source>
+ <translation>Touche de fonction D. Normalement pas nécessaire.</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>&amp;Fermer</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>FreeDeskSysTray</name>
+ <message>
+ <source>Show/Hide</source>
+ <translation>Montrer/Cacher</translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation>Quitter</translation>
+ </message>
+</context>
+<context>
+ <name>GUI</name>
+ <message>
+ <source>Failed to create a UDP socket (SIP) on port %1</source>
+ <translation type="obsolete">Impossible de créer un socket UDP (SIP) sur le port %1</translation>
+ </message>
+ <message>
+ <source>The following profiles are both for user %1</source>
+ <translation>Les profils suivant sont pour l&apos;utilisateur %1</translation>
+ </message>
+ <message>
+ <source>You can only run multiple profiles for different users.</source>
+ <translation>Des utilisateurs différents doivent avoir des profils différents.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Impossible de trouver une interface réseau. Twinkle utilisera 127.0.0.1 comme adresse IP locale. Quand vous vous connecterez au réseeau vous devrez redémarrer Twinkle pour utiliser la bonne adresse IP.</translation>
+ </message>
+ <message>
+ <source>Line %1: incoming call for %2</source>
+ <translation>Ligne %1: appel entrant pour %2</translation>
+ </message>
+ <message>
+ <source>Call transferred by %1</source>
+ <translation>Appel tranféré par %1</translation>
+ </message>
+ <message>
+ <source>Line %1: far end cancelled call.</source>
+ <translation>Ligne %1: appel annulé par le correspondant.</translation>
+ </message>
+ <message>
+ <source>Line %1: far end released call.</source>
+ <translation>Ligne %1: Le correspondant a raccroché.</translation>
+ </message>
+ <message>
+ <source>Line %1: SDP answer from far end not supported.</source>
+ <translation>Ligne %1: réponse SDP du correspondant non supportée.</translation>
+ </message>
+ <message>
+ <source>Line %1: SDP answer from far end missing.</source>
+ <translation>Ligne %1: réponse SDP du correspondant manquante.</translation>
+ </message>
+ <message>
+ <source>Line %1: Unsupported content type in answer from far end.</source>
+ <translation>Ligne %1: Contenu entrant non supporté.</translation>
+ </message>
+ <message>
+ <source>Line %1: no ACK received, call will be terminated.</source>
+ <translation>Ligne %1: ACK non reçu, l&apos;appel sera annulé.</translation>
+ </message>
+ <message>
+ <source>Line %1: no PRACK received, call will be terminated.</source>
+ <translation>Ligne %1: PRACK non reçu, l&apos;appel sera annulé.</translation>
+ </message>
+ <message>
+ <source>Line %1: PRACK failed.</source>
+ <translation>Ligne %1: PRACK échoué.</translation>
+ </message>
+ <message>
+ <source>Line %1: failed to cancel call.</source>
+ <translation>Ligne %1: impossible d&apos;annuler l&apos;appel.</translation>
+ </message>
+ <message>
+ <source>Line %1: far end answered call.</source>
+ <translation>Ligne %1: Le correspondant a répondu.</translation>
+ </message>
+ <message>
+ <source>Line %1: call failed.</source>
+ <translation>Ligne %1: appel échoué.</translation>
+ </message>
+ <message>
+ <source>The call can be redirected to:</source>
+ <translation>L&apos;appel peut être redirigé vers:</translation>
+ </message>
+ <message>
+ <source>Line %1: call released.</source>
+ <translation>Ligne %1: fin d&apos;appel.</translation>
+ </message>
+ <message>
+ <source>Line %1: call established.</source>
+ <translation>Leitung %1: appel établi.</translation>
+ </message>
+ <message>
+ <source>Response on terminal capability request: %1 %2</source>
+ <translation>Réponse à la demande des capacités du correspondant: %1 %2</translation>
+ </message>
+ <message>
+ <source>Terminal capabilities of %1</source>
+ <translation>Capacités du correspondant %1</translation>
+ </message>
+ <message>
+ <source>Accepted body types:</source>
+ <translation>Types de corps acceptés:</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>inconnu</translation>
+ </message>
+ <message>
+ <source>Accepted encodings:</source>
+ <translation>Encodage accepté:</translation>
+ </message>
+ <message>
+ <source>Accepted languages:</source>
+ <translation>Langages accepté:</translation>
+ </message>
+ <message>
+ <source>Allowed requests:</source>
+ <translation>Demandes authorisées:</translation>
+ </message>
+ <message>
+ <source>Supported extensions:</source>
+ <translation>Extensions supportées:</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation>aucun</translation>
+ </message>
+ <message>
+ <source>End point type:</source>
+ <translation>Type de correspondant:</translation>
+ </message>
+ <message>
+ <source>Line %1: call retrieve failed.</source>
+ <translation>Ligne %1: récupération de l&apos;appel échoué.</translation>
+ </message>
+ <message>
+ <source>%1, registration failed: %2 %3</source>
+ <translation>%1, connexion échouée: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, registration succeeded (expires = %2 seconds)</source>
+ <translation>%1, connexion réussie (expire %2 sec.)</translation>
+ </message>
+ <message>
+ <source>%1, registration failed: STUN failure</source>
+ <translation>%1, enregistrement échoué: echec STUN</translation>
+ </message>
+ <message>
+ <source>%1, de-registration succeeded: %2 %3</source>
+ <translation>%1, déconnexion réussie: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, fetching registrations failed: %2 %3</source>
+ <translation>%1, recherche des connexions échouée: %2 %3</translation>
+ </message>
+ <message>
+ <source>: you are not registered</source>
+ <translation>: vous n&apos;êtes pas connecté</translation>
+ </message>
+ <message>
+ <source>: you have the following registrations</source>
+ <translation>: voici la liste des connexions</translation>
+ </message>
+ <message>
+ <source>: fetching registrations...</source>
+ <translation>: recherche des connexions...</translation>
+ </message>
+ <message>
+ <source>Line %1: redirecting request to</source>
+ <translation>Ligne %1: rediriger la demande à </translation>
+ </message>
+ <message>
+ <source>Redirecting request to: %1</source>
+ <translation>Redirection de la demande à : %1</translation>
+ </message>
+ <message>
+ <source>Line %1: DTMF detected:</source>
+ <translation>Ligne %1: DTMF détecté: </translation>
+ </message>
+ <message>
+ <source>invalid DTMF telephone event (%1)</source>
+ <translation>Evénnement DTMF invalid (%1)</translation>
+ </message>
+ <message>
+ <source>Line %1: send DTMF %2</source>
+ <translation>Ligne %1: envoi DTMF %2</translation>
+ </message>
+ <message>
+ <source>Line %1: far end does not support DTMF telephone events.</source>
+ <translation>Ligne %1: le correspondant ne supporte pas les événnements DTMF.</translation>
+ </message>
+ <message>
+ <source>Line %1: received notification.</source>
+ <translation>Ligne %1: notification reçue.</translation>
+ </message>
+ <message>
+ <source>Event: %1</source>
+ <translation>Evénnement: %1</translation>
+ </message>
+ <message>
+ <source>State: %1</source>
+ <translation>Statut: %1</translation>
+ </message>
+ <message>
+ <source>Reason: %1</source>
+ <translation>Raison: %1</translation>
+ </message>
+ <message>
+ <source>Progress: %1 %2</source>
+ <translation>Progression: %1 %2</translation>
+ </message>
+ <message>
+ <source>Line %1: call transfer failed.</source>
+ <translation>Ligne %1: transfert d&apos;appel échoué.</translation>
+ </message>
+ <message>
+ <source>Line %1: call succesfully transferred.</source>
+ <translation>Ligne %1: transfert d&apos;appel réussi.</translation>
+ </message>
+ <message>
+ <source>Line %1: call transfer still in progress.</source>
+ <translation>Ligne %1: transfert d&apos;appel en cours.</translation>
+ </message>
+ <message>
+ <source>No further notifications will be received.</source>
+ <translation>Aucune nouvelle notification ne sera reçue.</translation>
+ </message>
+ <message>
+ <source>Line %1: transferring call to %2</source>
+ <translation>Ligne %1: transfert d&apos;appel vers %2</translation>
+ </message>
+ <message>
+ <source>Transfer requested by %1</source>
+ <translation>Demande de transfert de %1</translation>
+ </message>
+ <message>
+ <source>Line %1: Call transfer failed. Retrieving original call.</source>
+ <translation>Ligne %1: Transfert d&apos;appel échoué. Recherche de l&apos;appel original.</translation>
+ </message>
+ <message>
+ <source>Redirecting call</source>
+ <translation>Redirection d&apos;appel</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Profil utilisateur:</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Utilisateur:</translation>
+ </message>
+ <message>
+ <source>Do you allow the call to be redirected to the following destination?</source>
+ <translation>Authorisez vous la redirection de l&apos;appel vers la destination suivante?</translation>
+ </message>
+ <message>
+ <source>If you don&apos;t want to be asked this anymore, then you must change the settings in the SIP protocol section of the user profile.</source>
+ <translation>Si vous ne voulez plus qu&apos;on vous pose cette question, vous devez modifier les paramètres dans la section &quot;protocole SIP&quot; du profil d&apos;utilisateur.</translation>
+ </message>
+ <message>
+ <source>Redirecting request</source>
+ <translation>Demande de redirection</translation>
+ </message>
+ <message>
+ <source>Do you allow the %1 request to be redirected to the following destination?</source>
+ <translation>Authorisez-vous la redirection de la demande %1 vers la destination suivante?</translation>
+ </message>
+ <message>
+ <source>Transferring call</source>
+ <translation>Transfert d&apos;appel</translation>
+ </message>
+ <message>
+ <source>Request to transfer call received from:</source>
+ <translation>Demande de transfert d&apos;appel reçue depuis:</translation>
+ </message>
+ <message>
+ <source>Do you allow the call to be transferred to the following destination?</source>
+ <translation>Authorisez-vous le transfert de l&apos;appel vers la destination suivante?</translation>
+ </message>
+ <message>
+ <source>Info:</source>
+ <translation>Info:</translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation>Attention:</translation>
+ </message>
+ <message>
+ <source>Critical:</source>
+ <translation>Critique:</translation>
+ </message>
+ <message>
+ <source>Firewall / NAT discovery...</source>
+ <translation>Firewall / NAT Analyse...</translation>
+ </message>
+ <message>
+ <source>Abort</source>
+ <translation>Annuler</translation>
+ </message>
+ <message>
+ <source>Line %1</source>
+ <translation>Ligne %1</translation>
+ </message>
+ <message>
+ <source>Click the padlock to confirm a correct SAS.</source>
+ <translation>Cliquez sur &quot;Verr Num&quot; pour confirmer un SAS correcte.</translation>
+ </message>
+ <message>
+ <source>The remote user on line %1 disabled the encryption.</source>
+ <translation>L&apos;utilisateur distant sur la ligne %1 a invalidé la cryptographie.</translation>
+ </message>
+ <message>
+ <source>Line %1: SAS confirmed.</source>
+ <translation>Ligne %1: SAS confirmé.</translation>
+ </message>
+ <message>
+ <source>Line %1: SAS confirmation reset.</source>
+ <translation>Ligne %1: SAS confiirmation de la remise à zéro.</translation>
+ </message>
+ <message>
+ <source>Line %1: call rejected.</source>
+ <translation>Ligne %1: appel rejeté.</translation>
+ </message>
+ <message>
+ <source>Line %1: call redirected.</source>
+ <translation>Ligne %1: appel redirigé.</translation>
+ </message>
+ <message>
+ <source>Failed to start conference.</source>
+ <translation>Lancement de la conférence échoué.</translation>
+ </message>
+ <message>
+ <source>Override lock file and start anyway?</source>
+ <translation>Outre-passer le fichier de vérouillage et démarrer quand-même?</translation>
+ </message>
+ <message>
+ <source>%1, STUN request failed: %2 %3</source>
+ <translation>%1, STUN demande rejetée: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, STUN request failed.</source>
+ <translation>%1, STUN demande échouée.</translation>
+ </message>
+ <message>
+ <source>%1, voice mail status failure.</source>
+ <translation>%1, echec du statut du message vocal.</translation>
+ </message>
+ <message>
+ <source>%1, voice mail status rejected.</source>
+ <translation>%1, rejet du statut du message vocal.</translation>
+ </message>
+ <message>
+ <source>%1, voice mailbox does not exist.</source>
+ <translation>%1, la boîte vocale n&apos;existe pas.</translation>
+ </message>
+ <message>
+ <source>%1, voice mail status terminated.</source>
+ <translation>%1, statut du message vocal terminé. </translation>
+ </message>
+ <message>
+ <source>%1, de-registration failed: %2 %3</source>
+ <translation>%1, déconnexion échouée: %2 %3</translation>
+ </message>
+ <message>
+ <source>Request to transfer call received.</source>
+ <translation>Demande de transfert d&apos;appel reçue.</translation>
+ </message>
+ <message>
+ <source>If these are users for different domains, then enable the following option in your user profile (SIP protocol)</source>
+ <translation>S&apos;il y a des utilisateurs de différents domaines, activez cette option dans votre profil d&apos;utilisateur (protcole SIP)</translation>
+ </message>
+ <message>
+ <source>Use domain name to create a unique contact header</source>
+ <translation>Utilisez le nom de domaine pour créer une entête de contact unique</translation>
+ </message>
+ <message>
+ <source>Failed to create a %1 socket (SIP) on port %2</source>
+ <translation>Impossible de créer un socket %1 (SIP) sur le port %2</translation>
+ </message>
+ <message>
+ <source>Accepted by network</source>
+ <translation>Accepté par le réseau</translation>
+ </message>
+ <message>
+ <source>Failed to save message attachment: %1</source>
+ <translation>Echec de l&apos;enregistrement de la pièce jointe: %1</translation>
+ </message>
+ <message>
+ <source>Transferred by: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot open web browser: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Configure your web browser in the system settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>GetAddressForm</name>
+ <message>
+ <source>Twinkle - Select address</source>
+ <translation>Twinkle - Selection d&apos;adresse</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Nom</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Type</translation>
+ </message>
+ <message>
+ <source>Phone</source>
+ <translation>Téléphone</translation>
+ </message>
+ <message>
+ <source>&amp;Show only SIP addresses</source>
+ <translation>Montrer uniquement les adresses &amp;SIP</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Check this option when you only want to see contacts with SIP addresses, i.e. starting with &quot;&lt;b&gt;sip:&lt;/b&gt;&quot;.</source>
+ <translation>Cochez cette case quand vous voulez uniquement voir les contacts avec une adresse SIP, i.e. commençant par: &quot;&lt;b&gt;sip:&lt;/b&gt;&quot;.</translation>
+ </message>
+ <message>
+ <source>&amp;Reload</source>
+ <translation>&amp;Recharger</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Reload the list of addresses from KAddressbook.</source>
+ <translation>Recharge la liste d&apos;adresse de KAddressbook.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Annuler (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;KAddressBook</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>This list of addresses is taken from &lt;b&gt;KAddressBook&lt;/b&gt;. 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.</source>
+ <translation>La liste d&apos;adresse est tiré de &lt;b&gt;KAddressBook&lt;/b&gt;. Les contacts pour lesquels vous n&apos;avez pas renseignés de numéro de téléphone ne sont pas montrés ici.
+Pour ajouter, supprimer, ou modifier une information de contact, vous devez utiliser KaddressBook.</translation>
+ </message>
+ <message>
+ <source>&amp;Local address book</source>
+ <translation>Carnet d&apos;adresse &amp;local</translation>
+ </message>
+ <message>
+ <source>Remark</source>
+ <translation>Remarque</translation>
+ </message>
+ <message>
+ <source>Contacts in the local address book of Twinkle.</source>
+ <translation>Contacts dans le carnet d&apos;adresses local de Twinkle.</translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation>&amp;Ajouter</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Add a new contact to the local address book.</source>
+ <translation>Ajouter un nouveau contact au carnet d&apos;adresse local.</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Supprimer</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>Delete a contact from the local address book.</source>
+ <translation>Supprimer un contact du carnet d&apos;adresse local.</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Editer</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Edit a contact from the local address book.</source>
+ <translation>Editer un contact du carnet d&apos;adresse local.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You seem not to have any contacts with a phone number in &lt;b&gt;KAddressBook&lt;/b&gt;, KDE&apos;s address book application. Twinkle retrieves all contacts with a phone number from KAddressBook. To manage your contacts you have to use KAddressBook.&lt;p&gt;As an alternative you may use Twinkle&apos;s local address book.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Il semble qu&apos;il n&apos;y ait aucun contact avec un numéro de téléphone dans &lt;b&gt;KAddressBook&lt;/b&gt;, le carnet d&apos;adresse de KDE. Twinkle récupère tous les contacts avec un numéro de téléphone de KAddressBook. Pour gérer vos contacts utilisez KadressBook.&lt;/p&gt;
+&lt;p&gt;Comme alternative, vous pouvez utiliser le carnet d&apos;adresse local de Twinkle.&lt;/p&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>GetProfileNameForm</name>
+ <message>
+ <source>Twinkle - Profile name</source>
+ <translation>Twinkle - Nom du profil</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Annuler (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Enter a name for your profile:</source>
+ <translation>Saisissez un nom de profil:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The name of your profile&lt;/b&gt;
+&lt;br&gt;&lt;br&gt;
+A profile contains your user settings, e.g. your user name and password. You have to give each profile a name.
+&lt;br&gt;&lt;br&gt;
+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.
+&lt;br&gt;&lt;br&gt;
+To remember your profiles easily you could use your SIP user name as a profile name, e.g. &lt;b&gt;example@example.com&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Le nom de votre profil&lt;/b&gt;
+&lt;br&gt;&lt;br&gt;
+Un profil contient vos parmêtres utilisateur, ex: votre nom d&apos;utilisateur et mot de passe. Vous devez donner un nom à chaque profil.
+&lt;br&gt;&lt;br&gt;
+Si vous avez plusieurs comptes SIP, vous pouvez créer différents profils. Quand vous lancez Twinkle, il vous proposera la liste des profils pour sélectionner celuique vous voulez utiliser.
+&lt;br&gt;&lt;br&gt;
+Pour vous rappeler facilement de vos profils, vous pouvez utiliser votre nom d&apos;utilisateur SIP comme nom de profil. ex: &lt;b&gt;exemple@exemple.com&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Cannot find .twinkle directory in your home directory.</source>
+ <translation>Impossible de trouver le dossier .twinkle dans votre dossier home.</translation>
+ </message>
+ <message>
+ <source>Profile already exists.</source>
+ <translation>Ce profil existe déjà.</translation>
+ </message>
+ <message>
+ <source>Rename profile &apos;%1&apos; to:</source>
+ <translation>Renomer le profil %1 en:</translation>
+ </message>
+</context>
+<context>
+ <name>HistoryForm</name>
+ <message>
+ <source>Twinkle - Call History</source>
+ <translation>Twinkle - Historique des appels</translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation>Heure</translation>
+ </message>
+ <message>
+ <source>In/Out</source>
+ <translation>Ent/Sort</translation>
+ </message>
+ <message>
+ <source>From/To</source>
+ <translation>de/à</translation>
+ </message>
+ <message>
+ <source>Subject</source>
+ <translation>Sujet</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Statut</translation>
+ </message>
+ <message>
+ <source>Call details</source>
+ <translation>Détails</translation>
+ </message>
+ <message>
+ <source>Details of the selected call record.</source>
+ <translation>Détails de l&apos;appel sélectionné.</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation>Voir</translation>
+ </message>
+ <message>
+ <source>&amp;Incoming calls</source>
+ <translation>Appels &amp;entrants</translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation>Alt+E</translation>
+ </message>
+ <message>
+ <source>Check this option to show incoming calls.</source>
+ <translation>Sélectionnez cette option pour voir les appels entrants.</translation>
+ </message>
+ <message>
+ <source>&amp;Outgoing calls</source>
+ <translation>Appels &amp;sortants</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>Check this option to show outgoing calls.</source>
+ <translation>Sélectionnez cette option pour voir les appels sortants.</translation>
+ </message>
+ <message>
+ <source>&amp;Answered calls</source>
+ <translation>Appels &amp;répondus</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+R</translation>
+ </message>
+ <message>
+ <source>Check this option to show answered calls.</source>
+ <translation>Sélectionnez cette option pour voir les appels répondus.</translation>
+ </message>
+ <message>
+ <source>&amp;Missed calls</source>
+ <translation>Appels en &amp;absence</translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Check this option to show missed calls.</source>
+ <translation>Sélectionnez cette option pour voir les appels en absence.</translation>
+ </message>
+ <message>
+ <source>Current &amp;user profiles only</source>
+ <translation>Seulement l&apos;&amp;utilisateur actif</translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Check this option to show only calls associated with this user profile.</source>
+ <translation>Sélectionnez cette option pour voir seulement les appels de cet utilisateur.</translation>
+ </message>
+ <message>
+ <source>C&amp;lear</source>
+ <translation>&amp;Vider</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;Clear the complete call history.&lt;/p&gt;
+&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; this will clear &lt;b&gt;all&lt;/b&gt; records, also records not shown depending on the checked view options.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Vider la totalité de l&apos;historique.&lt;/p&gt;
+&lt;p&gt;&lt;b&gt;Nota:&lt;/b&gt; ceci supprimera &lt;b&gt;tous&lt;/b&gt; les enregistrements, y compris les enregistrements non affichés en fonction des options sélectionnées.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Close this window.</source>
+ <translation>Fermer cette fenêtre.</translation>
+ </message>
+ <message>
+ <source>Call start:</source>
+ <translation>Début de l&apos;appel:</translation>
+ </message>
+ <message>
+ <source>Call answer:</source>
+ <translation>Appel abouti:</translation>
+ </message>
+ <message>
+ <source>Call end:</source>
+ <translation>Fin de l&apos;appel:</translation>
+ </message>
+ <message>
+ <source>Call duration:</source>
+ <translation>Durée de l&apos;appel:</translation>
+ </message>
+ <message>
+ <source>Direction:</source>
+ <translation>Direction:</translation>
+ </message>
+ <message>
+ <source>From:</source>
+ <translation>de:</translation>
+ </message>
+ <message>
+ <source>To:</source>
+ <translation>à:</translation>
+ </message>
+ <message>
+ <source>Reply to:</source>
+ <translation>Répondre à:</translation>
+ </message>
+ <message>
+ <source>Referred by:</source>
+ <translation>Demandé par:</translation>
+ </message>
+ <message>
+ <source>Subject:</source>
+ <translation>Sujet:</translation>
+ </message>
+ <message>
+ <source>Released by:</source>
+ <translation>Terminé par:</translation>
+ </message>
+ <message>
+ <source>Status:</source>
+ <translation>Statut:</translation>
+ </message>
+ <message>
+ <source>Far end device:</source>
+ <translation>Interface de l&apos;utilisateur distant:</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Profil d&apos;utilisateur:</translation>
+ </message>
+ <message>
+ <source>conversation</source>
+ <translation>conversation</translation>
+ </message>
+ <message>
+ <source>Call...</source>
+ <translation>Appel...</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Suppression</translation>
+ </message>
+ <message>
+ <source>Re:</source>
+ <translation>Re:</translation>
+ </message>
+ <message>
+ <source>Call selected address.</source>
+ <translation>Adresse des appels sélectionnés.</translation>
+ </message>
+ <message>
+ <source>Clo&amp;se</source>
+ <translation>&amp;Fermer (Esc)</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+F</translation>
+ </message>
+ <message>
+ <source>&amp;Call</source>
+ <translation>Appel (&amp;Enter)</translation>
+ </message>
+ <message>
+ <source>Number of calls:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>###</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Total call duration:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>InviteForm</name>
+ <message>
+ <source>Twinkle - Call</source>
+ <translation>Twinkle - Appel</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;à:</translation>
+ </message>
+ <message>
+ <source>Optionally you can provide a subject here. This might be shown to the callee.</source>
+ <translation>Vous pouvez renseigner un sujet ici (optionnel). Il peut être montré à l&apos;appelant.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Carnet d&apos;adresse</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Sélectionner une adresse du carnet d&apos;adresse.</translation>
+ </message>
+ <message>
+ <source>The address that you want to call. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>L&apos;adresse de la personne vers que vous voulez appeler. Ceci peut être une adresse SIP comme &lt;b&gt;sip:exemple@exemple.com&lt;/b&gt; ou uniquement la partie utilisateur ou le numéro de téléphone d&apos;une adresse complète. Quand vous ne spécifiez pas une adresse complète, Twinkle complètera cette adresse en utilisant le domaine défini dans votre profil utilisateur.</translation>
+ </message>
+ <message>
+ <source>The user that will make the call.</source>
+ <translation>L&apos;utilisateur qui fera l&apos;appel.</translation>
+ </message>
+ <message>
+ <source>&amp;Subject:</source>
+ <translation>&amp;Sujet:</translation>
+ </message>
+ <message>
+ <source>&amp;From:</source>
+ <translation>&amp;De:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Annuler (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>&amp;Hide identity</source>
+ <translation>Cacher l&apos;&amp;identité</translation>
+ </message>
+ <message>
+ <source>Alt+H</source>
+ <translation>Alt+I</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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 &lt;b&gt;not&lt;/b&gt; hide your IP address.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Warning:&lt;/b&gt; not all providers support identity hiding.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Par cette option, vous demandez à votre fournisseur de services SIP de cacher votre identité vis à vis de votre correspondant. Ceci ne cachera que votre identité c&apos;est à dire votre adresse SIP et numéro de téléphone. Ceci &lt;/b&gt;ne&lt;b&gt; cache &lt;b&gt;pas&lt;/b&gt; votre &lt;b&gt;adresse IP&lt;/p&gt;.
+&lt;p&gt;&lt;b&gt;Attention: &lt;/b&gt;Tous les fournisseurs de services SIP ne supportent pas cette fonctionnalité !&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Not all SIP providers support identity hiding. Make sure your SIP provider supports it if you really need it.</source>
+ <translation>Tous les fournisseurs de services SIP ne supportent pas la fonctionnalité &quot;cacher l&apos;identité&quot;. Assurez vous que votre fournisseur de services SIP l&apos;authorise si vous en avez vraîment besoin.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LogViewForm</name>
+ <message>
+ <source>Twinkle - Log</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Contents of the current log file (~/.twinkle/twinkle.log)</source>
+ <translation>Contenu du fichier de log (~/.twinkle/twinkle.log)</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>&amp;Fermer</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+F</translation>
+ </message>
+ <message>
+ <source>C&amp;lear</source>
+ <translation>&amp;Supprimer</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Clear the log window. This does &lt;b&gt;not&lt;/b&gt; clear the log file itself.</source>
+ <translation>Fermer la fenêtre de log. Ceci &lt;b&gt;ne&lt;/b&gt; supprime &lt;b&gt;pas&lt;/b&gt; le fichier de log lui-même.</translation>
+ </message>
+</context>
+<context>
+ <name>MessageForm</name>
+ <message>
+ <source>Twinkle - Instant message</source>
+ <translation>Twinkle - Messagerie instantanée</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;à:</translation>
+ </message>
+ <message>
+ <source>The user that will send the message.</source>
+ <translation>L&apos;utilisateur qui enverra le message.</translation>
+ </message>
+ <message>
+ <source>The address of the user that you want to send a message. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>L&apos;adresse de la personne à qui vous voulez envoyer un message. Ceci peut être une adresse SIP comme &lt;b&gt;sip:exemple@exemple.com&lt;/b&gt; ou uniquement la partie utilisateur ou le numéro de téléphone d&apos;une adresse complète. Quand vous ne spécifiez pas une adresse complète, Twinkle complètera cette adresse en utilisant le domaine défini dans votre profil utilisateur.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Carnet d&apos;adresse</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Sélectionner une adresse du carnet d&apos;adresse.</translation>
+ </message>
+ <message>
+ <source>&amp;User profile:</source>
+ <translation>Profil &amp;utilisateur:</translation>
+ </message>
+ <message>
+ <source>Conversation</source>
+ <translation>Conversation</translation>
+ </message>
+ <message>
+ <source>The exchanged messages.</source>
+ <translation type="obsolete">Les messages échangés.</translation>
+ </message>
+ <message>
+ <source>Type your message here and then press &quot;send&quot; to send it.</source>
+ <translation>Saisissez votre message ici, puis appuyer sure &quot;Envoyer&quot; pour l&apos;envoyer.</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation>&amp;Envoyer</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+E</translation>
+ </message>
+ <message>
+ <source>Send the message.</source>
+ <translation>Envoyer le message.</translation>
+ </message>
+ <message>
+ <source>Delivery failure</source>
+ <translation>Echec de l&apos;envoi</translation>
+ </message>
+ <message>
+ <source>Delivery notification</source>
+ <translation>Notification de la réception</translation>
+ </message>
+ <message>
+ <source>Instant message toolbar</source>
+ <translation>Barre d&apos;outil de la messagerie instantanée</translation>
+ </message>
+ <message>
+ <source>Send file...</source>
+ <translation>Envoi de fichier...</translation>
+ </message>
+ <message>
+ <source>Send file</source>
+ <translation>Envoyer un fichier</translation>
+ </message>
+ <message>
+ <source>image size is scaled down in preview</source>
+ <translation>La taille de l&apos;image est réduite en prévisualisation</translation>
+ </message>
+ <message>
+ <source>Open with %1...</source>
+ <translation>Ouvrir avec %1...</translation>
+ </message>
+ <message>
+ <source>Open with...</source>
+ <translation>Ouvrir avec...</translation>
+ </message>
+ <message>
+ <source>Save attachment as...</source>
+ <translation>Enregistrer la pièce jointe sous...</translation>
+ </message>
+ <message>
+ <source>File already exists. Do you want to overwrite this file?</source>
+ <translation>Le fichier existe déjà. Voulez-vous le remplacer ?</translation>
+ </message>
+ <message>
+ <source>Failed to save attachment.</source>
+ <translation>Impossible d&apos;enregistrer la pièce jointe.</translation>
+ </message>
+ <message>
+ <source>%1 is typing a message.</source>
+ <translation>%1 est un message texte.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MessageFormView</name>
+ <message>
+ <source>sending message</source>
+ <translation>Envoi du message</translation>
+ </message>
+</context>
+<context>
+ <name>MphoneForm</name>
+ <message>
+ <source>Twinkle</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Call:</source>
+ <comment>Label in front of combobox to enter address</comment>
+ <translation>&amp;Numéro:</translation>
+ </message>
+ <message>
+ <source>The address that you want to call. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>L&apos;adresse de la personne vers que vous voulez appeler. Ceci peut être une adresse SIP comme &lt;b&gt;sip:exemple@exemple.com&lt;/b&gt; ou uniquement la partie utilisateur ou le numéro de téléphone d&apos;une adresse complète. Quand vous ne spécifiez pas une adresse complète, Twinkle complètera cette adresse en utilisant le domaine défini dans votre profil utilisateur.</translation>
+ </message>
+ <message>
+ <source>The user that will make the call.</source>
+ <translation>L&apos;utilisateur qui émettera l&apos;appel.</translation>
+ </message>
+ <message>
+ <source>&amp;User:</source>
+ <translation>&amp;Utilisateur:</translation>
+ </message>
+ <message>
+ <source>Dial</source>
+ <translation>Appeler</translation>
+ </message>
+ <message>
+ <source>Dial the address.</source>
+ <translation>Appeler l&apos;appel.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Carnet d&apos;adresse</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Sélectionner une adresse du carnet d&apos;adresse.</translation>
+ </message>
+ <message>
+ <source>Auto answer indication.</source>
+ <translation>Indication de réponse automatique.</translation>
+ </message>
+ <message>
+ <source>Message waiting indication.</source>
+ <translation>Indication de message en attente.</translation>
+ </message>
+ <message>
+ <source>Call redirect indication.</source>
+ <translation>Indication de redirection d&apos;appel.</translation>
+ </message>
+ <message>
+ <source>Do not disturb indication.</source>
+ <translation>Indication &quot;ne pas déranger&quot;.</translation>
+ </message>
+ <message>
+ <source>Missed call indication.</source>
+ <translation>Indication d&apos;appel en absence.</translation>
+ </message>
+ <message>
+ <source>Registration status.</source>
+ <translation>Statut de la connexion.</translation>
+ </message>
+ <message>
+ <source>Display</source>
+ <translation>Affichage</translation>
+ </message>
+ <message>
+ <source>Line status</source>
+ <translation>Statut de la ligne</translation>
+ </message>
+ <message>
+ <source>Line &amp;1:</source>
+ <translation>Ligne &amp;1:</translation>
+ </message>
+ <message>
+ <source>Alt+1</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Click to switch to line 1.</source>
+ <translation>Cliquez pour basculer sur la ligne 1.</translation>
+ </message>
+ <message>
+ <source>From:</source>
+ <translation>De:</translation>
+ </message>
+ <message>
+ <source>To:</source>
+ <translation>à:</translation>
+ </message>
+ <message>
+ <source>Subject:</source>
+ <translation>Sujet:</translation>
+ </message>
+ <message>
+ <source>Visual indication of line state.</source>
+ <translation>Indication visuelle de l&apos;état de la ligne.</translation>
+ </message>
+ <message>
+ <source>idle</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Call is on hold</source>
+ <translation>Appel en attente</translation>
+ </message>
+ <message>
+ <source>Voice is muted</source>
+ <translation>Voix coupée</translation>
+ </message>
+ <message>
+ <source>Conference call</source>
+ <translation>Conférence</translation>
+ </message>
+ <message>
+ <source>Transferring call</source>
+ <translation>Transfert d&apos;appel</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+The padlock indicates that your voice is encrypted during transport over the network.
+&lt;/p&gt;
+&lt;h3&gt;SAS - Short Authentication String&lt;/h3&gt;
+&lt;p&gt;
+Both ends of an encrypted voice channel receive the same SAS on the first call. If the SAS is different at each end, your voice channel may be compromised by a man-in-the-middle attack (MitM).
+&lt;/p&gt;
+&lt;p&gt;
+If the SAS is equal at both ends, then you should confirm it by clicking this padlock for stronger security of future calls to the same destination. For subsequent calls to the same destination, you don&apos;t have to confirm the SAS again. The padlock will show a check symbol when the SAS has been confirmed.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;
+Le clavier indique que votre voix est encrypté sur le réseau.
+&lt;/p&gt;
+&lt;h3&gt;SAS - Short Authentication String (chaine d&apos;authentification courte)&lt;/h3&gt;
+&lt;p&gt;
+Les deux correspondants d&apos;une ligne encrypté reçoivent le même SAS lors du premier appel. Si le SAS est différent, votre ligne est compromise.
+&lt;/p&gt;
+&lt;p&gt;
+Si le SAS est égal, vous devez le confirmer en cliquant sur le clavier pour une meilleure sécurité des futurs appels vers cette même destination. Vous n&apos;aurez plus à confirmer le SAS pour cette même destination. Le clavier affichera un symbol de confirmation quand le SAS est confirmé.
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>sas</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Short authentication string</source>
+ <translation>SAS - Short authentication string</translation>
+ </message>
+ <message>
+ <source>g711a/g711a</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Audio codec</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>0:00:00</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Call duration</source>
+ <translation>Durée de l&apos;appel</translation>
+ </message>
+ <message>
+ <source>sip:from</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>sip:to</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>subject</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>photo</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Line &amp;2:</source>
+ <translation>Ligne &amp;2:
+</translation>
+ </message>
+ <message>
+ <source>Alt+2</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Click to switch to line 2.</source>
+ <translation>Cliquez pour basculer sur la ligne 2.</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;Fichier</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Edition</translation>
+ </message>
+ <message>
+ <source>C&amp;all</source>
+ <translation>&amp;Appel</translation>
+ </message>
+ <message>
+ <source>Activate line</source>
+ <translation>Activer la ligne</translation>
+ </message>
+ <message>
+ <source>&amp;Registration</source>
+ <translation>&amp;Connexion</translation>
+ </message>
+ <message>
+ <source>&amp;Services</source>
+ <translation>&amp;Services</translation>
+ </message>
+ <message>
+ <source>&amp;View</source>
+ <translation>&amp;Vue</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>Ai&amp;de</translation>
+ </message>
+ <message>
+ <source>Call Toolbar</source>
+ <translation>Barre d&apos;outil d&apos;appel</translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation>Quitter</translation>
+ </message>
+ <message>
+ <source>&amp;Quit</source>
+ <translation>&amp;Quitter</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>About Twinkle</source>
+ <translation>A propos de Twinkle</translation>
+ </message>
+ <message>
+ <source>&amp;About Twinkle</source>
+ <translation>A propos de &amp;Twinkle</translation>
+ </message>
+ <message>
+ <source>Call someone</source>
+ <translation>Appeler</translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Answer incoming call</source>
+ <translation>Répondre à l&apos;apppel entrant</translation>
+ </message>
+ <message>
+ <source>F6</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Release call</source>
+ <translation>Raccrocher</translation>
+ </message>
+ <message>
+ <source>Reject incoming call</source>
+ <translation>Rejeter l&apos;appel entrant</translation>
+ </message>
+ <message>
+ <source>F8</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Put a call on hold, or retrieve a held call</source>
+ <translation>Mettre un appel en attente, ou reprendre un appel en attente</translation>
+ </message>
+ <message>
+ <source>Redirect incoming call without answering</source>
+ <translation>Redirection d&apos;appel entrant sans répondre</translation>
+ </message>
+ <message>
+ <source>Open keypad to enter digits for voice menu&apos;s</source>
+ <translation>Ouvrir le clavier pour siasir des digits du menu vocal</translation>
+ </message>
+ <message>
+ <source>Register</source>
+ <translation>Se connecter</translation>
+ </message>
+ <message>
+ <source>&amp;Register</source>
+ <translation>Se &amp;connecter</translation>
+ </message>
+ <message>
+ <source>Deregister</source>
+ <translation>Se déconnecter</translation>
+ </message>
+ <message>
+ <source>&amp;Deregister</source>
+ <translation>Se &amp;déconnecté</translation>
+ </message>
+ <message>
+ <source>Deregister this device</source>
+ <translation>Déconnecter cette interface</translation>
+ </message>
+ <message>
+ <source>Show registrations</source>
+ <translation>Montrer les connexions</translation>
+ </message>
+ <message>
+ <source>&amp;Show registrations</source>
+ <translation>&amp;Montrer les connexions</translation>
+ </message>
+ <message>
+ <source>Terminal capabilities</source>
+ <translation>Possibilités du terminal</translation>
+ </message>
+ <message>
+ <source>Request terminal capabilities from someone</source>
+ <translation>Demande les capacités du terminal d&apos;un correspondant</translation>
+ </message>
+ <message>
+ <source>Do not disturb</source>
+ <translation>Ne pas déranger</translation>
+ </message>
+ <message>
+ <source>&amp;Do not disturb</source>
+ <translation>Ne pas &amp;déranger</translation>
+ </message>
+ <message>
+ <source>Call redirection</source>
+ <translation>Redirection d&apos;appel</translation>
+ </message>
+ <message>
+ <source>Call &amp;redirection...</source>
+ <translation>&amp;Redirection d&apos;appel...</translation>
+ </message>
+ <message>
+ <source>Repeat last call</source>
+ <translation>Wahlwiederholung, wählt letzten Ruf erneut</translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>About Qt</source>
+ <translation>A propos de Qt</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation>&amp;A propos de Qt</translation>
+ </message>
+ <message>
+ <source>User profile</source>
+ <translation>Profil utilisateur</translation>
+ </message>
+ <message>
+ <source>&amp;User profile...</source>
+ <translation>Profil &amp;utilisateur...</translation>
+ </message>
+ <message>
+ <source>Join two calls in a 3-way conference</source>
+ <translation>Joindre une conférence 3 parties</translation>
+ </message>
+ <message>
+ <source>Mute a call</source>
+ <translation>Rendre muet</translation>
+ </message>
+ <message>
+ <source>Transfer call</source>
+ <translation>Transfert d&apos;appel</translation>
+ </message>
+ <message>
+ <source>System settings</source>
+ <translation>Paramètres système</translation>
+ </message>
+ <message>
+ <source>&amp;System settings...</source>
+ <translation>Paramètres &amp;système...</translation>
+ </message>
+ <message>
+ <source>Deregister all</source>
+ <translation>Tout déconnecter</translation>
+ </message>
+ <message>
+ <source>Deregister &amp;all</source>
+ <translation>&amp;Tout déconnecter</translation>
+ </message>
+ <message>
+ <source>Deregister all your registered devices</source>
+ <translation>Déconnecter toutes les interfaces connectées</translation>
+ </message>
+ <message>
+ <source>Auto answer</source>
+ <translation>Réponse automatique</translation>
+ </message>
+ <message>
+ <source>&amp;Auto answer</source>
+ <translation>Réponse &amp;automatique</translation>
+ </message>
+ <message>
+ <source>Log</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Log...</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Call history</source>
+ <translation>Historique d&apos;appel</translation>
+ </message>
+ <message>
+ <source>Call &amp;history...</source>
+ <translation>&amp;Historique d&apos;appel...</translation>
+ </message>
+ <message>
+ <source>F9</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Change user ...</source>
+ <translation>Changer d&apos;utilisateur ...</translation>
+ </message>
+ <message>
+ <source>&amp;Change user ...</source>
+ <translation>&amp;Changer d&apos;utilisateur ...</translation>
+ </message>
+ <message>
+ <source>Activate or de-activate users</source>
+ <translation>Activer ou désactiver des utilisateurs</translation>
+ </message>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation>Qu&apos;est-ce que c&apos;est?</translation>
+ </message>
+ <message>
+ <source>What&apos;s &amp;This?</source>
+ <translation>&amp;Qu&apos;est-ce que c&apos;est?</translation>
+ </message>
+ <message>
+ <source>Shift+F1</source>
+ <translation>Shift+F1</translation>
+ </message>
+ <message>
+ <source>Line 1</source>
+ <translation>Ligne 1</translation>
+ </message>
+ <message>
+ <source>Line 2</source>
+ <translation>Ligne 2
+</translation>
+ </message>
+ <message>
+ <source>idle</source>
+ <translation>libre</translation>
+ </message>
+ <message>
+ <source>dialing</source>
+ <translation>numérotation</translation>
+ </message>
+ <message>
+ <source>attempting call, please wait</source>
+ <translation>appel en cours, merci de patienter</translation>
+ </message>
+ <message>
+ <source>incoming call</source>
+ <translation>appel entrant</translation>
+ </message>
+ <message>
+ <source>establishing call, please wait</source>
+ <translation>établissement de l&apos;appel, merci de patienter</translation>
+ </message>
+ <message>
+ <source>established</source>
+ <translation>établi</translation>
+ </message>
+ <message>
+ <source>established (waiting for media)</source>
+ <translation>établi (attente de données)</translation>
+ </message>
+ <message>
+ <source>releasing call, please wait</source>
+ <translation>Raccrochage en cours, merci de patienter</translation>
+ </message>
+ <message>
+ <source>unknown state</source>
+ <translation>Etat inconnu</translation>
+ </message>
+ <message>
+ <source>Voice is encrypted</source>
+ <translation>Voix encryptée</translation>
+ </message>
+ <message>
+ <source>Click to confirm SAS.</source>
+ <translation>Cliquez pour confirmer SAS.</translation>
+ </message>
+ <message>
+ <source>Click to clear SAS verification.</source>
+ <translation>Cliquez pour annuler la vérification SAS.</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Utilisateur:</translation>
+ </message>
+ <message>
+ <source>Call:</source>
+ <translation>Appel:</translation>
+ </message>
+ <message>
+ <source>Registration status:</source>
+ <translation>Statut de la connexion:</translation>
+ </message>
+ <message>
+ <source>Registered</source>
+ <translation>Connecté</translation>
+ </message>
+ <message>
+ <source>Failed</source>
+ <translation>Echoué</translation>
+ </message>
+ <message>
+ <source>Not registered</source>
+ <translation>Non connecté</translation>
+ </message>
+ <message>
+ <source>No users are registered.</source>
+ <translation>Aucun utilisteur n&apos;est connecté.</translation>
+ </message>
+ <message>
+ <source>Do not disturb active for:</source>
+ <translation>&quot;Ne pas dérangé&quot; activé pour:</translation>
+ </message>
+ <message>
+ <source>Redirection active for:</source>
+ <translation>Redirection activée pour:</translation>
+ </message>
+ <message>
+ <source>Auto answer active for:</source>
+ <translation>&quot;Réponse automatique&quot; activée pour:</translation>
+ </message>
+ <message>
+ <source>Do not disturb is not active.</source>
+ <translation>&quot;Ne pas dérangé&quot; n&apos;est pas actif.</translation>
+ </message>
+ <message>
+ <source>Redirection is not active.</source>
+ <translation>La redirection n&apos;est pas active.</translation>
+ </message>
+ <message>
+ <source>Auto answer is not active.</source>
+ <translation>la réponse automatique n&apos;est pas active.</translation>
+ </message>
+ <message>
+ <source>You have no missed calls.</source>
+ <translation>Vous n&apos;avez pas d&apos;appel en absence.</translation>
+ </message>
+ <message>
+ <source>You missed 1 call.</source>
+ <translation>1 appel en absence.</translation>
+ </message>
+ <message>
+ <source>You missed %1 calls.</source>
+ <translation>%1 appels en absence.</translation>
+ </message>
+ <message>
+ <source>Click to see call history for details.</source>
+ <translation>Cliquez pour plus de détails .</translation>
+ </message>
+ <message>
+ <source>Starting user profiles...</source>
+ <translation>Démarrage des profiles d&apos;utilisateurs...</translation>
+ </message>
+ <message>
+ <source>The following profiles are both for user %1</source>
+ <translation>Les profils suivant sont pour l&apos;utilisateur %1</translation>
+ </message>
+ <message>
+ <source>You can only run multiple profiles for different users.</source>
+ <translation>Voius pouvez seulement executer plusieurs profils pour différents utilisateurs.</translation>
+ </message>
+ <message>
+ <source>You have changed the SIP UDP port. This setting will only become active when you restart Twinkle.</source>
+ <translation>Vous avez chazngé le port UDP de SIP. Pour prendre en compte les modifications, il est nécessaire de redémarrer Twinkle.</translation>
+ </message>
+ <message>
+ <source>Esc</source>
+ <translation>Esc</translation>
+ </message>
+ <message>
+ <source>Transfer consultation</source>
+ <translation>Consultation du transfert</translation>
+ </message>
+ <message>
+ <source>Hide identity</source>
+ <translation>Cacher l&apos;identité</translation>
+ </message>
+ <message>
+ <source>Click to show registrations.</source>
+ <translation>Cliquez pour montrer les connexions.</translation>
+ </message>
+ <message>
+ <source>%1 new, 1 old message</source>
+ <translation>%1 nouveau, 1 ancien message</translation>
+ </message>
+ <message>
+ <source>%1 new, %2 old messages</source>
+ <translation>%1 nouveau, %2 ancien messages</translation>
+ </message>
+ <message>
+ <source>1 new message</source>
+ <translation>1 nouveau message</translation>
+ </message>
+ <message>
+ <source>%1 new messages</source>
+ <translation>%1 nouveau messages</translation>
+ </message>
+ <message>
+ <source>1 old message</source>
+ <translation>1 ancien message</translation>
+ </message>
+ <message>
+ <source>%1 old messages</source>
+ <translation>%1 anciens messages</translation>
+ </message>
+ <message>
+ <source>Messages waiting</source>
+ <translation>Messages reçus</translation>
+ </message>
+ <message>
+ <source>No messages</source>
+ <translation>Pas de messages</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Voice mail status:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Statut de la boîte vocale:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Failure</source>
+ <translation>Echec</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>Inconnu</translation>
+ </message>
+ <message>
+ <source>Click to access voice mail.</source>
+ <translation>Cliquez pour accéder à la boîte vocale.</translation>
+ </message>
+ <message>
+ <source>Click to activate/deactivate</source>
+ <translation>Cliquez pour activer/désactiver</translation>
+ </message>
+ <message>
+ <source>Click to activate</source>
+ <translation>Cliquez pour activer</translation>
+ </message>
+ <message>
+ <source>not provisioned</source>
+ <translation>non enregistré</translation>
+ </message>
+ <message>
+ <source>You must provision your voice mail address in your user profile, before you can access it.</source>
+ <translation>Vous devez enregistrer votre numéro de boîte vocale dans votre profil d&apos;utilisateur avant de pouvoir y accéder.</translation>
+ </message>
+ <message>
+ <source>The line is busy. Cannot access voice mail.</source>
+ <translation>La ligne est occupée. Impossible d&apos;accéder à la boîte vocale.</translation>
+ </message>
+ <message>
+ <source>The voice mail address %1 is an invalid address. Please provision a valid address in your user profile.</source>
+ <translation>Le numéro %1 de boîte vocale est invalide. Merci d&apos;enregistrer un numéro valide dans votre profil d&apos;utilisateur.</translation>
+ </message>
+ <message>
+ <source>Call</source>
+ <comment>toolbar text</comment>
+ <translation>Appel</translation>
+ </message>
+ <message>
+ <source>&amp;Call...</source>
+ <comment>call menu text</comment>
+ <translation>&amp;Appel...</translation>
+ </message>
+ <message>
+ <source>Answer</source>
+ <comment>toolbar text</comment>
+ <translation>Répondre</translation>
+ </message>
+ <message>
+ <source>&amp;Answer</source>
+ <comment>menu text</comment>
+ <translation>&amp;Répondre</translation>
+ </message>
+ <message>
+ <source>Bye</source>
+ <comment>toolbar text</comment>
+ <translation>Fin</translation>
+ </message>
+ <message>
+ <source>&amp;Bye</source>
+ <comment>menu text</comment>
+ <translation>&amp;Fin</translation>
+ </message>
+ <message>
+ <source>Reject</source>
+ <comment>toolbar text</comment>
+ <translation>Refuser</translation>
+ </message>
+ <message>
+ <source>&amp;Reject</source>
+ <comment>menu text</comment>
+ <translation>R&amp;efuser</translation>
+ </message>
+ <message>
+ <source>Hold</source>
+ <comment>toolbar text</comment>
+ <translation>Attente</translation>
+ </message>
+ <message>
+ <source>&amp;Hold</source>
+ <comment>menu text</comment>
+ <translation>Atte&amp;nte</translation>
+ </message>
+ <message>
+ <source>Redirect</source>
+ <comment>toolbar text</comment>
+ <translation>Redirect</translation>
+ </message>
+ <message>
+ <source>R&amp;edirect...</source>
+ <comment>menu text</comment>
+ <translation>Re&amp;direction...</translation>
+ </message>
+ <message>
+ <source>Dtmf</source>
+ <comment>toolbar text</comment>
+ <translation>Dtmf</translation>
+ </message>
+ <message>
+ <source>&amp;Dtmf...</source>
+ <comment>menu text</comment>
+ <translation>Dt&amp;mf...</translation>
+ </message>
+ <message>
+ <source>&amp;Terminal capabilities...</source>
+ <comment>menu text</comment>
+ <translation>Possibilités du &amp;terminal...</translation>
+ </message>
+ <message>
+ <source>Redial</source>
+ <comment>toolbar text</comment>
+ <translation>Rappeler</translation>
+ </message>
+ <message>
+ <source>&amp;Redial</source>
+ <comment>menu text</comment>
+ <translation>&amp;Rappeler</translation>
+ </message>
+ <message>
+ <source>Conf</source>
+ <comment>toolbar text</comment>
+ <translation>Conf</translation>
+ </message>
+ <message>
+ <source>&amp;Conference</source>
+ <comment>menu text</comment>
+ <translation>&amp;Conférence</translation>
+ </message>
+ <message>
+ <source>Mute</source>
+ <comment>toolbar text</comment>
+ <translation>Muet</translation>
+ </message>
+ <message>
+ <source>&amp;Mute</source>
+ <comment>menu text</comment>
+ <translation>M&amp;uet
+</translation>
+ </message>
+ <message>
+ <source>Xfer</source>
+ <comment>toolbar text</comment>
+ <translation>Transfert</translation>
+ </message>
+ <message>
+ <source>Trans&amp;fer...</source>
+ <comment>menu text</comment>
+ <translation>&amp;Transfert...</translation>
+ </message>
+ <message>
+ <source>Voice mail</source>
+ <translation>Boîte vocale</translation>
+ </message>
+ <message>
+ <source>&amp;Voice mail</source>
+ <translation>&amp;Boîte vocale</translation>
+ </message>
+ <message>
+ <source>Access voice mail</source>
+ <translation>Accès boîte vocale</translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Buddy list</source>
+ <translation>Liste d&apos;avatars</translation>
+ </message>
+ <message>
+ <source>&amp;Message</source>
+ <translation>&amp;Message</translation>
+ </message>
+ <message>
+ <source>Msg</source>
+ <translation>Msg</translation>
+ </message>
+ <message>
+ <source>Instant &amp;message...</source>
+ <translation>&amp;Message instantané...</translation>
+ </message>
+ <message>
+ <source>Instant message</source>
+ <translation>Message instantané</translation>
+ </message>
+ <message>
+ <source>&amp;Call...</source>
+ <translation>&amp;Appel...</translation>
+ </message>
+ <message>
+ <source>&amp;Edit...</source>
+ <translation>&amp;Editer...</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Supprimer</translation>
+ </message>
+ <message>
+ <source>O&amp;ffline</source>
+ <translation>Déc&amp;onnecté</translation>
+ </message>
+ <message>
+ <source>&amp;Online</source>
+ <translation>&amp;Connecté</translation>
+ </message>
+ <message>
+ <source>&amp;Change availability</source>
+ <translation>Mod&amp;ifier la disponibilité</translation>
+ </message>
+ <message>
+ <source>&amp;Add buddy...</source>
+ <translation>&amp;Ajouter un avatar...</translation>
+ </message>
+ <message>
+ <source>Failed to save buddy list: %1</source>
+ <translation>Echec de la sauvegarde de la liste d&apos;avatars: %1</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Vous pouvez créer une liste d&apos;avatar pour chaque profil. Vous ne pouvez voir la disponibilité de vos avatars et publier la votre que si votre fournisseur de service dispose d&apos;un serveur de présence.</translation>
+ </message>
+ <message>
+ <source>&amp;Buddy list</source>
+ <translation>&amp;Liste d&apos;avatars</translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation>&amp;Affichage</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Diamondcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sign up</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Sign up...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recharge...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Balance history...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call history...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Admin center...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recharge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Balance history</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Admin center</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>NumberConversionForm</name>
+ <message>
+ <source>Twinkle - Number conversion</source>
+ <translation>Twinkle - Conversion de numéro</translation>
+ </message>
+ <message>
+ <source>&amp;Match expression:</source>
+ <translation>&amp;Expression de recherche:</translation>
+ </message>
+ <message>
+ <source>&amp;Replace:</source>
+ <translation>&amp;Remplacer:</translation>
+ </message>
+ <message>
+ <source>Perl style format string for the replacement number.</source>
+ <translation>Chaine au format Perl pour le remplacement du numéro.</translation>
+ </message>
+ <message>
+ <source>Perl style regular expression matching the number format you want to modify.</source>
+ <translation>Expression réguliuère au format Perl pour la vérification du format du numéro que vous voulez modifier.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Annuler (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Match expression may not be empty.</source>
+ <translation>L&apos;expression de vérification ne doit pas être vide.</translation>
+ </message>
+ <message>
+ <source>Replace value may not be empty.</source>
+ <translation>La valeur de remplacement ne doit pas être vide.</translation>
+ </message>
+ <message>
+ <source>Invalid regular expression.</source>
+ <translation>Expression régulière invalide.</translation>
+ </message>
+</context>
+<context>
+ <name>RedirectForm</name>
+ <message>
+ <source>Twinkle - Redirect</source>
+ <translation>Twinkle - Redirection</translation>
+ </message>
+ <message>
+ <source>Redirect incoming call to</source>
+ <translation>Rediriger les appels entrants vers</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Vous pouvez sélectionner jusqu&apos;a 3 destinations vers lesquelles rediriger l&apos;appel. Si la première destionationne répond pas, la deuxième sera essayée et ainsi de suite.</translation>
+ </message>
+ <message>
+ <source>&amp;3rd choice destination:</source>
+ <translation>&amp;3ème destination:</translation>
+ </message>
+ <message>
+ <source>&amp;2nd choice destination:</source>
+ <translation>&amp;2ème destination:</translation>
+ </message>
+ <message>
+ <source>&amp;1st choice destination:</source>
+ <translation>&amp;1ère destination:</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Carnet d&apos;adresse</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Sélectionner une adresse du carnet d&apos;adresse.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Annuler (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SelectNicForm</name>
+ <message>
+ <source>Twinkle - Select NIC</source>
+ <translation>Twinkle - Selection de l&apos;interface réseau</translation>
+ </message>
+ <message>
+ <source>Select the network interface/IP address that you want to use:</source>
+ <translation>Selectionnez l&apos;interface réseau/adresse IP que vous voulez utiliser:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Vous avez plusieurs adresses IP. Vous devez sélectionner ici l&apos;adresse IP qui doit être utilisée. Cette adresse IP sera incluse dans les messages SIP.</translation>
+ </message>
+ <message>
+ <source>Set as default &amp;IP</source>
+ <translation>Activer comme &amp;IP par défaut</translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Make the selected IP address the default IP address. The next time you start Twinkle, this IP address will be automatically selected.</source>
+ <translation>Utiliser l&apos;adresse IP sélectionnée comme adresse IP par défaut. La prochaine fois que vous démarrerez Twinkle, cette adresse IP sera automatiquement utilisée.</translation>
+ </message>
+ <message>
+ <source>Set as default &amp;NIC</source>
+ <translation>Activer comme interface &amp;réseau par défaut</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation>Alt+R</translation>
+ </message>
+ <message>
+ <source>Make the selected network interface the default interface. The next time you start Twinkle, this interface will be automatically selected.</source>
+ <translation>Utiliser l&apos;interface réseau sélectionné comme interface réseau par défaut. La prochaine fois que vous démarrerez Twinkle, cette interface sera automatiquement utilisée.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>If you want to remove or change the default at a later time, you can do that via the system settings.</source>
+ <translation>Si vous voulez supprimer ou modifier les paramètres par défaut, vous pourrez le faire par les paramètres système.</translation>
+ </message>
+</context>
+<context>
+ <name>SelectProfileForm</name>
+ <message>
+ <source>Twinkle - Select user profile</source>
+ <translation>Twinkle -Sélectionner un profil utilisateur</translation>
+ </message>
+ <message>
+ <source>Select user profile(s) to run:</source>
+ <translation>Sélectionner le(s) profil(s) à démarrer:</translation>
+ </message>
+ <message>
+ <source>User profile</source>
+ <translation>Profil utilisateur</translation>
+ </message>
+ <message>
+ <source>Tick the check boxes of the user profiles that you want to run and press run.</source>
+ <translation>Cochez les cases des profils utilisateurs que vous voulez utilisez et appuyer sur &quot;Démarrer&quot;.</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Nouveau</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation type="obsolete">Alt+N</translation>
+ </message>
+ <message>
+ <source>Create a new profile with the profile editor.</source>
+ <translation>Créer un nouveau profil avec l&apos;éditeur de profil.</translation>
+ </message>
+ <message>
+ <source>&amp;Wizard</source>
+ <translation>&amp;Assistant</translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Create a new profile with the wizard.</source>
+ <translation>Créer un nouveau profil avec l&apos;assistant de création de profil.</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Editer</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation>Alt+E</translation>
+ </message>
+ <message>
+ <source>Edit the highlighted profile.</source>
+ <translation>Editer le profil sélectionné.</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Supprimer</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>Delete the highlighted profile.</source>
+ <translation>Supprimer le profil sélectionné.</translation>
+ </message>
+ <message>
+ <source>Ren&amp;ame</source>
+ <translation>Ren&amp;ommer</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>Rename the highlighted profile.</source>
+ <translation>Renommer le profil sélectionné.</translation>
+ </message>
+ <message>
+ <source>&amp;Set as default</source>
+ <translation>&amp;Utiliser par défaut</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>Make the selected profiles the default profiles. The next time you start Twinkle, these profiles will be automatically run.</source>
+ <translation>Utiliser le profil sélectionné comme profil par défaut. La prochaine fois que vous démarrerez Twinkle, ces profils seront automatiquement démarrés.</translation>
+ </message>
+ <message>
+ <source>&amp;Run</source>
+ <translation>&amp;Démarrer</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt+D</translation>
+ </message>
+ <message>
+ <source>Run Twinkle with the selected profiles.</source>
+ <translation>Démarrer Twinkle avec le profil sélectionné.</translation>
+ </message>
+ <message>
+ <source>S&amp;ystem settings</source>
+ <translation>Paramètres s&amp;ystème</translation>
+ </message>
+ <message>
+ <source>Alt+Y</source>
+ <translation>Alt+Y</translation>
+ </message>
+ <message>
+ <source>Edit the system settings.</source>
+ <translation>Editer les paramètres système.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Annuler (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;Before you can use Twinkle, you must create a user profile.&lt;br&gt;Click OK to create a profile.&lt;/html&gt;</source>
+ <translation>&lt;html&gt;Avant d&apos;utiliser Twinkle, vous devez créer un profil utilisateur.&lt;br&gt;Cliquez sur OK pour créer un profil.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;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.&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;Choose what method you wish to use.&lt;/html&gt;</source>
+ <translation type="obsolete">&lt;html&gt;Vous pouvez utiliser l&apos;éditeur de profil pour créer un profil. Avec l&apos;éditeur de profil vous pouvez modifier beaucoup de paramètres SIP, RTP et autres.&lt;br&gt;&lt;br&gt;Vous pouvez également utiliser l&apos;assistant pour créer un profil plus rapidement. Il vous proposera seulement quelques paramètres essentiels. Vous pourrez éditer ce profil plus tard en utilisant l&apos;éditeur de profil.&lt;br&gt;&lt;br&gt;Sélectionnez la méthode que vous préférez (débutants: l&apos;assistant est conseillé).&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;Next you may adjust the system settings. You can change these settings always at a later time.&lt;br&gt;&lt;br&gt;Click OK to view and adjust the system settings.&lt;/html&gt;</source>
+ <translation>&lt;html&gt;Vous devrez ajuster les paramètres systèmes. Vous pouvez changer ces parmètres à tout moment.&lt;br&gt;&lt;br&gt;Cliquez sur OK pour voir et modifier les paramètres systèmes&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>You did not select any user profile to run.
+Please select a profile.</source>
+ <translation>Vous n&apos;avez sélectionné aucun profil à démarrer.
+Merci de sélectionner un profil.</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete profile &apos;%1&apos;?</source>
+ <translation>Etes-vous sûr de vouloir supprimer le profil &apos;%1&apos; ?</translation>
+ </message>
+ <message>
+ <source>Delete profile</source>
+ <translation>Supprimer un profil</translation>
+ </message>
+ <message>
+ <source>Failed to delete profile.</source>
+ <translation>Echec de la suppression de profil.</translation>
+ </message>
+ <message>
+ <source>Failed to rename profile.</source>
+ <translation>Echec du changement de nom de profil.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;If you want to remove or change the default at a later time, you can do that via the system settings.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Si vous voulez supprimer ou modifier le profil par défaut, vous pourrez le faire par les paramètres système. &lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Cannot find .twinkle directory in your home directory.</source>
+ <translation>Impossible de trouver le dossier .twinkle dans le dossier home.</translation>
+ </message>
+ <message>
+ <source>&amp;Profile editor</source>
+ <translation>Editeur de &amp;profil</translation>
+ </message>
+ <message>
+ <source>Create profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ed&amp;itor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dia&amp;mondcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modify profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Startup profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Diamondcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;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.&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;You can create a Diamondcard account to make worldwide calls to regular and cell phones and send SMS messages.&lt;br&gt;&lt;br&gt;Choose what method you wish to use.&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SelectUserForm</name>
+ <message>
+ <source>Twinkle - Select user</source>
+ <translation>Twinkle - Selection d&apos;utilisateur</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Annuler (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Select all</source>
+ <translation>Tout &amp;sélectionner</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>C&amp;lear all</source>
+ <translation>Tout &amp;désélectionner</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>purpose</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation>Utilisateur</translation>
+ </message>
+ <message>
+ <source>Register</source>
+ <translation>Se connecter</translation>
+ </message>
+ <message>
+ <source>Select users that you want to register.</source>
+ <translation>Sélectionnez le profil que vous voulez connecter.</translation>
+ </message>
+ <message>
+ <source>Deregister</source>
+ <translation>Se déconnecter</translation>
+ </message>
+ <message>
+ <source>Select users that you want to deregister.</source>
+ <translation>Sélectionnez le profil que vous voulez déconnecter.</translation>
+ </message>
+ <message>
+ <source>Deregister all devices</source>
+ <translation>Déconnecter toutes les interfaces</translation>
+ </message>
+ <message>
+ <source>Select users for which you want to deregister all devices.</source>
+ <translation>Sélectionnez le profil dont vous voulez déconnecter toutes les interfaces.</translation>
+ </message>
+ <message>
+ <source>Do not disturb</source>
+ <translation>Ne pas déranger</translation>
+ </message>
+ <message>
+ <source>Select users for which you want to enable &apos;do not disturb&apos;.</source>
+ <translation>Sélectionnez le profil dont vous voulez activer &quot;ne pas déranger&quot;.</translation>
+ </message>
+ <message>
+ <source>Auto answer</source>
+ <translation>Réponse automatique</translation>
+ </message>
+ <message>
+ <source>Select users for which you want to enable &apos;auto answer&apos;.</source>
+ <translation>Sélectionnez le profil dont vous voulez activer la réponse automatique.</translation>
+ </message>
+</context>
+<context>
+ <name>SendFileForm</name>
+ <message>
+ <source>Twinkle - Send File</source>
+ <translation>Twinkle - Envoi de fichier</translation>
+ </message>
+ <message>
+ <source>Select file to send.</source>
+ <translation>Choisir le fichier à envoyer.</translation>
+ </message>
+ <message>
+ <source>&amp;File:</source>
+ <translation>&amp;Fichier:</translation>
+ </message>
+ <message>
+ <source>&amp;Subject:</source>
+ <translation>&amp;Sujet:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Annuler (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>File does not exist.</source>
+ <translation>Le fichier n&apos;existe pas.</translation>
+ </message>
+ <message>
+ <source>Send file...</source>
+ <translation>Envoi de fichier...</translation>
+ </message>
+</context>
+<context>
+ <name>SrvRedirectForm</name>
+ <message>
+ <source>Twinkle - Call Redirection</source>
+ <translation>Twinkle - Redirection d&apos;appel</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Utilisateur:</translation>
+ </message>
+ <message>
+ <source>There are 3 redirect services:&lt;p&gt;
+&lt;b&gt;Unconditional:&lt;/b&gt; redirect all calls
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Busy:&lt;/b&gt; redirect a call if both lines are busy
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;No answer:&lt;/b&gt; redirect a call when the no-answer timer expires
+&lt;/p&gt;</source>
+ <translation>Il y a 3 srvices de redirection:&lt;p&gt;
+&lt;b&gt;Inconditionnel:&lt;/b&gt; tous les appels sont redirigés&lt;p&gt;
+&lt;p&gt;
+&lt;b&gt;Occupé:&lt;/b&gt; Rediriger l&apos;appel si les 2 lignes sont occupées
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Pas de réponse:&lt;/b&gt; redirige un appel quand le décompte &quot;pas de réponse&quot; expire.
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Unconditional</source>
+ <translation>&amp;Inconditionnel</translation>
+ </message>
+ <message>
+ <source>&amp;Redirect all calls</source>
+ <translation>&amp;Rediriger tous les appels</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt-A</translation>
+ </message>
+ <message>
+ <source>Activate the unconditional redirection service.</source>
+ <translation>Active le service de redirection inconditionelle.</translation>
+ </message>
+ <message>
+ <source>Redirect to</source>
+ <translation>Rediriger vers</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Vous pouvez sélectionner jusqu&apos;a 3 destinations vers lesquelles rediriger l&apos;appel. Si la première destionationne répond pas, la deuxième sera essayée et ainsi de suite.</translation>
+ </message>
+ <message>
+ <source>&amp;3rd choice destination:</source>
+ <translation>&amp;3ème destination:</translation>
+ </message>
+ <message>
+ <source>&amp;2nd choice destination:</source>
+ <translation>&amp;2ème destination:</translation>
+ </message>
+ <message>
+ <source>&amp;1st choice destination:</source>
+ <translation>&amp;1ère destination:</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Carnet d&apos;adresse</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Sélectionner une adresse du carnet d&apos;adresse.</translation>
+ </message>
+ <message>
+ <source>&amp;Busy</source>
+ <translation>&amp;Occupé</translation>
+ </message>
+ <message>
+ <source>&amp;Redirect calls when I am busy</source>
+ <translation>&amp;Rediriger les appels quand je suis occupé</translation>
+ </message>
+ <message>
+ <source>Activate the redirection when busy service.</source>
+ <translation>Active le service de redirection &quot;occupé&quot;.</translation>
+ </message>
+ <message>
+ <source>&amp;No answer</source>
+ <translation>&amp;Pas de réponse</translation>
+ </message>
+ <message>
+ <source>&amp;Redirect calls when I do not answer</source>
+ <translation>&amp;Rediriger les appels quand je ne réponds pas</translation>
+ </message>
+ <message>
+ <source>Activate the redirection on no answer service.</source>
+ <translation>Active le service de redirection sans réponse.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Accept and save all changes.</source>
+ <translation>Accepter et enregistrer les modifications.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Annuler (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Undo your changes and close the window.</source>
+ <translation>Annuler tous les changements et fermer la fenêtre.</translation>
+ </message>
+ <message>
+ <source>You have entered an invalid destination.</source>
+ <translation>Vous avez saisi une destination invalide.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SysSettingsForm</name>
+ <message>
+ <source>Twinkle - System Settings</source>
+ <translation>Twinkle - Paramètres du système</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Général</translation>
+ </message>
+ <message>
+ <source>Audio</source>
+ <translation>Audio</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <translation>Sonneries</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Carnet d&apos;adresse</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Réseau</translation>
+ </message>
+ <message>
+ <source>Log</source>
+ <translation>Log</translation>
+ </message>
+ <message>
+ <source>Select a category for which you want to see or modify the settings.</source>
+ <translation>Sélectionnez la catégorie dont vous voulez voir ou modifier les paramètres.</translation>
+ </message>
+ <message>
+ <source>Sound Card</source>
+ <translation>Carte son</translation>
+ </message>
+ <message>
+ <source>Select the sound card for playing the ring tone for incoming calls.</source>
+ <translation>Sélectionnez la carte son qui jouera la sonnerie des appels entrants.</translation>
+ </message>
+ <message>
+ <source>Select the sound card to which your microphone is connected.</source>
+ <translation>Sélectionnez la carte son à laquelle est connecté le microphone.</translation>
+ </message>
+ <message>
+ <source>Select the sound card for the speaker function during a call.</source>
+ <translation>Sélectionnez la carte son à laquelle est connecté le haut parleur.</translation>
+ </message>
+ <message>
+ <source>&amp;Speaker:</source>
+ <translation>&amp;Haut-parleur:</translation>
+ </message>
+ <message>
+ <source>&amp;Ring tone:</source>
+ <translation>&amp;Sonnerie:</translation>
+ </message>
+ <message>
+ <source>Other device:</source>
+ <translation>Autre interface:</translation>
+ </message>
+ <message>
+ <source>&amp;Microphone:</source>
+ <translation>&amp;Microphone:</translation>
+ </message>
+ <message>
+ <source>When using ALSA, it is not recommended to use the default device for the microphone as it gives poor sound quality.</source>
+ <translation type="obsolete">Avec ALSA, il n&apos;est pas recommandé d&apos;utiliser l&apos;interface par défaut pour le microphone car ceci dégrade la qualité du son.</translation>
+ </message>
+ <message>
+ <source>Reduce &amp;noise from the microphone</source>
+ <translation type="obsolete">Réduire le &amp;bruit du microphone</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation type="obsolete">Alt+B</translation>
+ </message>
+ <message>
+ <source>Recordings from the microphone can contain noise. This could be annoying to the person on the other side of your call. This option removes soft noise coming from the microphone.
+
+The noise reduction algorithm is very simplistic. Sound is captured as 16 bits signed linear PCM samples. All samples between -50 and 50 are truncated to 0.</source>
+ <translation type="obsolete">L&apos;enregistrement par l&apos;intermédiaire d&apos;un microphone peut contenir du bruit. Ceci peut être génant pour le correspondant. Cette option supprime ce bruit.
+L&apos;algoritme de réduction de bruit est très simple. Le son est enregistré en échantillons PCM 16 bits linéaires signés. Tous les échantillons entre -50 et 50 sont ramenés à zéro.</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Avancé</translation>
+ </message>
+ <message>
+ <source>OSS &amp;fragment size:</source>
+ <translation>OSS taille du &amp;fragment:</translation>
+ </message>
+ <message>
+ <source>16</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>32</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>64</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>128</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>256</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>La période de lecture ALSA influence le comportement en temps réel de votre carte son. Si votre son disparait fréquemment en utilisant ALSA, vous devriez essayer différentes valeurs.</translation>
+ </message>
+ <message>
+ <source>ALSA &amp;play period size:</source>
+ <translation>ALSA période de &amp;lecture (LS):</translation>
+ </message>
+ <message>
+ <source>&amp;ALSA capture period size:</source>
+ <translation>ALSA période de &amp;capture (MIC):</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>La taille du fragment OSS influence le comportement en temps réel de votre carte son. Si votre son disparait fréquemment en utilisant OSS, vous devriez essayer différentes valeurs.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>La période de capture ALSA influence le comportement en temps réel de votre carte son. Si votre son disparait fréquemment en utilisant ALSA, vous devriez essayer différentes valeurs.</translation>
+ </message>
+ <message>
+ <source>&amp;Max log size:</source>
+ <translation>Taille &amp;max. du fichier de log:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>La taille maximum du fichier de log en Mo. Quand le fichier de log excède cette taille, une sauvegarde de ce fichier est effectué et le fichier est supprimé. Seulement un fichier de sauvegarde est conservé.</translation>
+ </message>
+ <message>
+ <source>MB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Log &amp;debug reports</source>
+ <translation>Sauvegarder les rapports de &amp;debug</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if reports marked as &quot;debug&quot; will be logged.</source>
+ <translation>Indique si les rapports marqués &quot;débug&quot; seront archivés.</translation>
+ </message>
+ <message>
+ <source>Log &amp;SIP reports</source>
+ <translation>Sauvegarder les rapports &amp;SIP</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if SIP messages will be logged.</source>
+ <translation>Indique si les messages SIP douvent être sauvegardés.</translation>
+ </message>
+ <message>
+ <source>Log S&amp;TUN reports</source>
+ <translation>Sauvegarder les rapports S&amp;TUN</translation>
+ </message>
+ <message>
+ <source>Alt+T</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if STUN messages will be logged.</source>
+ <translation>Indique si les messages STUN douvent être sauvegardés.</translation>
+ </message>
+ <message>
+ <source>Log m&amp;emory reports</source>
+ <translation>Sauvegarder les rapports &amp;mémoire</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation>Alt+M</translation>
+ </message>
+ <message>
+ <source>Indicates if reports concerning memory management will be logged.</source>
+ <translation>Indique si les rapports concernant la gestion mémoire seront archivés.</translation>
+ </message>
+ <message>
+ <source>System tray</source>
+ <translation>Tableau de bord</translation>
+ </message>
+ <message>
+ <source>Create &amp;system tray icon on startup</source>
+ <translation>Créer une icone dans le &amp;tableau de bord au démarrage</translation>
+ </message>
+ <message>
+ <source>Enable this option if you want a system tray icon for Twinkle. The system tray icon is created when you start Twinkle.</source>
+ <translation>Cochez cette case si vous voulez une icone dans le tableau de bord pour Twinkle. Cette icone est créée au démarrage de Twinkle.</translation>
+ </message>
+ <message>
+ <source>&amp;Hide in system tray when closing main window</source>
+ <translation>&amp;Rabattre dans le &amp;tableau de bord à la fermeture de la fenêtre principale</translation>
+ </message>
+ <message>
+ <source>Alt+H</source>
+ <translation>Alt+R</translation>
+ </message>
+ <message>
+ <source>Enable this option if you want Twinkle to hide in the system tray when you close the main window.</source>
+ <translation>Cochez cette case si vous voulez rabattre Twinkle dans le tableau de bord quand vous fermez la fenêtre principale.</translation>
+ </message>
+ <message>
+ <source>Startup</source>
+ <translation>Démarrage</translation>
+ </message>
+ <message>
+ <source>Next time you start Twinkle, this IP address will be automatically selected. This is only useful when your computer has multiple and static IP addresses.</source>
+ <translation type="obsolete">La prochaine fois que vous lancerez Twinkle, cette adresse IP sera automatiquement sélectionnée. Ceci est utile uniquement si votre ordinateur à plusieurs IP statiques.</translation>
+ </message>
+ <message>
+ <source>Default &amp;IP address:</source>
+ <translation type="obsolete">Adresse &amp;IP par défaut:</translation>
+ </message>
+ <message>
+ <source>Next time you start Twinkle, the IP address of this network interface be automatically selected. This is only useful when your computer has multiple network devices.</source>
+ <translation type="obsolete">La prochaine fois que vous lancerez Twinkle, l&apos;adresse IP de cette interface réseau sera automatiquement sélectionnée. Ceci est utile uniquement si votre ordinateur à plusieurs interfaces réseau.</translation>
+ </message>
+ <message>
+ <source>Default &amp;network interface:</source>
+ <translation type="obsolete">&amp;Réseau par défaut:</translation>
+ </message>
+ <message>
+ <source>S&amp;tartup hidden in system tray</source>
+ <translation>&amp;Démarrer rabattu dans le tableau de bord</translation>
+ </message>
+ <message>
+ <source>Next time you start Twinkle it will immediately hide in the system tray. This works best when you also select a default user profile.</source>
+ <translation>La prochaine fois que vous lancerez Twinkle, il sera immédiatement rabattu dans le tableau de bord. Ceci fonctionne mieux si vous sélectionnez également un utilisateur par défaut.</translation>
+ </message>
+ <message>
+ <source>Default user profiles</source>
+ <translation>Profil utilisateur par défaut</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Si vous utilisez toujours le(s) même(s) profile(s), vous pouvez le(s) définir comme &quot;défaut&quot;. La prochaine fois que vous lancerai Twinkle, vous n&apos;aurez pas à sélectionner de profil. Les profils par défaut seront lancés automatiquement.</translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation>Services</translation>
+ </message>
+ <message>
+ <source>Call &amp;waiting</source>
+ <translation>Mise en &amp;attente</translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Avec cette option, un appel entrant sera accepté si une ligne est occupée. Si vous désactivez la mise en attente d&apos;appel, un appel entrant sera refusé quand une ligne est occupée.</translation>
+ </message>
+ <message>
+ <source>Hang up &amp;both lines when ending a 3-way conference call.</source>
+ <translation>Raccrocher les deux lignes à la fin d&apos;une &amp;conférence.</translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation>Alt+C</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Raccroche les deux lignes quand vous clickez sur le bouton &quot;Fin&quot; lors d&apos;une conférence. Quand cette option est désactivée, seule la ligne active est raccrochée et vous pourvez continuer à parler avec le correspondante de l&apos;autre ligne.</translation>
+ </message>
+ <message>
+ <source>&amp;Maximum calls in call history:</source>
+ <translation>Nombre d&apos;appels &amp;maximum dans l&apos;historique des appels:</translation>
+ </message>
+ <message>
+ <source>The maximum number of calls that will be kept in the call history.</source>
+ <translation>Le nombre d&apos;appels maximum qui seront enregistrés dans l&apos;historique des appels.</translation>
+ </message>
+ <message>
+ <source>&amp;Auto show main window on incoming call after</source>
+ <translation>Affichage &amp;automatiquement de la fenêtre principale lors d&apos;un appel</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>When the main window is hidden, it will be automatically shown on an incoming call after the number of specified seconds.</source>
+ <translation>Quand la fenêtre principale est cachée, elle sera automatiqument affichée lors d&apos;un appel entrant après le nombre de secondes spécifié.</translation>
+ </message>
+ <message>
+ <source>Number of seconds after which the main window should be shown.</source>
+ <translation>Délai d&apos;affichage automatique sur appel entrant.</translation>
+ </message>
+ <message>
+ <source>secs</source>
+ <translation>secs</translation>
+ </message>
+ <message>
+ <source>The UDP port used for sending and receiving SIP messages.</source>
+ <translation type="obsolete">Le port UDP utilisé pour envoyer et recevoir des messages SIP.</translation>
+ </message>
+ <message>
+ <source>&amp;RTP port:</source>
+ <translation>Port &amp;RTP:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Le port UDP utilisé pour envoyer et recevoir des RTP pour la première ligne. Celui de la seconde est plus grand de 2. Ex: Si le port 8000 est utilisé pour la première ligne, celui de la seconde sera 8002. Quand vous utilisez le transfert d&apos;appel, le port suivant (ex:8004) est alors également utilisé.</translation>
+ </message>
+ <message>
+ <source>&amp;SIP UDP port:</source>
+ <translation type="obsolete">Port &amp;SIP UDP :</translation>
+ </message>
+ <message>
+ <source>Ring tone</source>
+ <translation>Sonneries</translation>
+ </message>
+ <message>
+ <source>&amp;Play ring tone on incoming call</source>
+ <translation>&amp;Sonner lors d&apos;un appel entrant</translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>Indicates if a ring tone should be played when a call comes in.</source>
+ <translation>Indique si une sonnerie doit être jouée lors d&apos;un appel entrant.</translation>
+ </message>
+ <message>
+ <source>&amp;Default ring tone</source>
+ <translation>Sonneries par &amp;défaut</translation>
+ </message>
+ <message>
+ <source>Play the default ring tone when a call comes in.</source>
+ <translation>Joue la sonnerie par défaut lors d&apos;un appel entrant.</translation>
+ </message>
+ <message>
+ <source>C&amp;ustom ring tone</source>
+ <translation>Sonnerie &amp;personnalisée</translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation>Alt+P</translation>
+ </message>
+ <message>
+ <source>Play a custom ring tone when a call comes in.</source>
+ <translation>Joue une sonnerie personnalisée lors d&apos;un appel entrant.</translation>
+ </message>
+ <message>
+ <source>Specify the file name of a .wav file that you want to be played as ring tone.</source>
+ <translation>Saisissez le nom de fichier .wav que vous voulez utiliser comme sonnerie.</translation>
+ </message>
+ <message>
+ <source>Ring back tone</source>
+ <translation>Sonneries de tonalité</translation>
+ </message>
+ <message>
+ <source>P&amp;lay ring back tone when network does not play ring back tone</source>
+ <translation>Jouer une&amp; tonalité quand le réseau ne le fait pas</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+T</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Play ring back tone while you are waiting for the far-end to answer your call.
+&lt;/p&gt;
+&lt;p&gt;
+Depending on your SIP provider the network might provide ring back tone or an announcement.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Joue une tonalité pendant que vous attendez que votre correspondant décroche. &lt;/p&gt;
+&lt;p&gt;Suivant votre fournisseur de service, le réseau peut émettre une tonalité ou une annonce.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>D&amp;efault ring back tone</source>
+ <translation>&amp;Tonalité par défaut</translation>
+ </message>
+ <message>
+ <source>Play the default ring back tone.</source>
+ <translation>Joue la tonalité par défaut.</translation>
+ </message>
+ <message>
+ <source>Cu&amp;stom ring back tone</source>
+ <translation>Tonalité p&amp;ersonnalisée</translation>
+ </message>
+ <message>
+ <source>Play a custom ring back tone.</source>
+ <translation>Joue la tonalité personnalisée.</translation>
+ </message>
+ <message>
+ <source>Specify the file name of a .wav file that you want to be played as ring back tone.</source>
+ <translation>Saisissez le nom de fichier .wav que vous voulez utiliser comme tonalité.</translation>
+ </message>
+ <message>
+ <source>&amp;Lookup name for incoming call</source>
+ <translation>&amp;Voir le nom de l&apos;appel entrant</translation>
+ </message>
+ <message>
+ <source>Ove&amp;rride received display name</source>
+ <translation>Ne pas &amp;tenir compte du nom d&apos;affichage reçu</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt+T</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>L&apos;appelant peut avoir défini un nom d&apos;affichage. Cochez cette case si vous voulez le remplacer par celui défini dans votre carnet d&apos;adresse.</translation>
+ </message>
+ <message>
+ <source>Lookup &amp;photo for incoming call</source>
+ <translation>Visionner la &amp;photo pour l&apos;appel entrant</translation>
+ </message>
+ <message>
+ <source>Lookup the photo of a caller in your address book and display it on an incoming call.</source>
+ <translation>Visionner la photo de l&apos;appelant dans votre carnet d&apos;adresse et l&apos;afficher pour les appels entrants.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Accept and save your changes.</source>
+ <translation>Accepter et enregistrer les modifications.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Annuler (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Undo all your changes and close the window.</source>
+ <translation>Annuler tous les changements et fermer la fenêtre.</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <comment>This is the &apos;none&apos; in default IP address combo</comment>
+ <translation type="obsolete">aucune</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <comment>This is the &apos;none&apos; in default network interface combo</comment>
+ <translation type="obsolete">aucune</translation>
+ </message>
+ <message>
+ <source>Either choose a default IP address or a default network interface.</source>
+ <translation type="obsolete">Choisissez soit une adresse IP par défaut soit une interface de réseau.</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Sonneries</translation>
+ </message>
+ <message>
+ <source>Choose ring tone</source>
+ <translation>Choisir une sonnerie</translation>
+ </message>
+ <message>
+ <source>Ring back tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Sonneries de tonalité</translation>
+ </message>
+ <message>
+ <source>Choose ring back tone</source>
+ <translation>Choisir une sonnerie de tonalité</translation>
+ </message>
+ <message>
+ <source>&amp;Validate devices before usage</source>
+ <translation>&amp;Valider les interfaces avant d&apos;utiliser</translation>
+ </message>
+ <message>
+ <source>Alt+V</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Twinkle validates the audio devices before usage to avoid an established call without an audio channel.
+&lt;p&gt;
+On startup of Twinkle a warning is given if an audio device is inaccessible.
+&lt;p&gt;
+If before making a call, the microphone or speaker appears to be invalid, a warning is given and no call can be made.
+&lt;p&gt;
+If before answering a call, the microphone or speaker appears to be invalid, a warning is given and the call will not be answered.</source>
+ <translation>&lt;p&gt;Twinkle valide l&apos;interface audio avant utilisation pour éviter d&apos;établir un appel sans canal audio.&lt;/p&gt;
+&lt;p&gt;Au démarrage de Twinkle, un avertissement vous prévient si l&apos;interface audio est inaccessible.&lt;/p&gt;
+&lt;p&gt;Si avant de faire un appel, le microphone ou le haut-parleur est invalide, un avertissement s&apos;affiche et l&apos;appel est bloqué.&lt;/p&gt;
+&lt;p&gt;Si avant de répondre à un appel, le microphone ou le haut-parleur est invalide, un avertissement s&apos;affiche et il est impossible de répondre à un appel.
+</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Lors d&apos;un appel entrant, Twinkle essaiera de trouve le nom correspondant à l&apos;adresse SIP dans votre carnet d&apos;adresse. Ce nom sera affiché.</translation>
+ </message>
+ <message>
+ <source>Select ring tone file.</source>
+ <translation>Sélectionner un fichier de sonnerie.</translation>
+ </message>
+ <message>
+ <source>Select ring back tone file.</source>
+ <translation>Sélectionnez votre sonnerie de tonalité.</translation>
+ </message>
+ <message>
+ <source>Maximum allowed size (0-65535) in bytes of an incoming SIP message over UDP.</source>
+ <translation>Taille maximum allouée pour un message SIP entrant en UDP en octets (0-65535).</translation>
+ </message>
+ <message>
+ <source>&amp;SIP port:</source>
+ <translation>Port &amp;SIP:</translation>
+ </message>
+ <message>
+ <source>Max. SIP message size (&amp;TCP):</source>
+ <translation>Taille max. du message SIP (&amp;TCP):</translation>
+ </message>
+ <message>
+ <source>The UDP/TCP port used for sending and receiving SIP messages.</source>
+ <translation>Le port UDP/TCP utilisé pour envoyer et recevoir des messages SIP.</translation>
+ </message>
+ <message>
+ <source>Max. SIP message size (&amp;UDP):</source>
+ <translation>Taille max. du message SIP (&amp;UDP):</translation>
+ </message>
+ <message>
+ <source>Maximum allowed size (0-4294967295) in bytes of an incoming SIP message over TCP.</source>
+ <translation>Taille maximum allouée pour un message SIP entrant en TCP en octets (0-4294967295).</translation>
+ </message>
+ <message>
+ <source>W&amp;eb browser command:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Command to start your web browser. If you leave this field empty Twinkle will try to figure out your default web browser.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SysTrayPopup</name>
+ <message>
+ <source>Answer</source>
+ <translation>Répondre</translation>
+ </message>
+ <message>
+ <source>Reject</source>
+ <translation>Refuser</translation>
+ </message>
+ <message>
+ <source>Incoming Call</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TermCapForm</name>
+ <message>
+ <source>Twinkle - Terminal Capabilities</source>
+ <translation>Twinkle - Capacités du terminal</translation>
+ </message>
+ <message>
+ <source>&amp;From:</source>
+ <translation>&amp;De:</translation>
+ </message>
+ <message>
+ <source>Get terminal capabilities of</source>
+ <translation>Récuperer les possibilités du terminal de</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;à:</translation>
+ </message>
+ <message>
+ <source>The address that you want to query for capabilities (OPTION request). This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>L&apos;adresse dont vous voulez demandes les possiblités (demande d&apos;OPTIONS). Ceci peut être une adresse SIP comme &lt;b&gt;sip:exemple@exemple.com&lt;/b&gt; ou uniquement la partie utilisateur ou le numéro de téléphone d&apos;une adresse complète. Quand vous ne spécifiez pas une adresse complète, Twinkle complètera cette adresse en utilisant le domaine défini dans votre profil utilisateur.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Carnet d&apos;adresse</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Sélectionner une adresse du carnet d&apos;adresse.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Annuler (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferForm</name>
+ <message>
+ <source>Twinkle - Transfer</source>
+ <translation>Twinkle - Transfert</translation>
+ </message>
+ <message>
+ <source>Transfer call to</source>
+ <translation>Transférer l&apos;appel vers</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;à:</translation>
+ </message>
+ <message>
+ <source>The address of the person you want to transfer the call to. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>L&apos;adresse de la personne vers que vous voulez transférer l&apos;appel. Ceci peut être une adresse SIP comme &lt;b&gt;sip:exemple@exemple.com&lt;/b&gt; ou uniquement la partie utilisateur ou le numéro de téléphone d&apos;une adresse complète. Quand vous ne spécifiez pas une adresse complète, Twinkle complètera cette adresse en utilisant le domaine défini dans votre profil utilisateur.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Carnet d&apos;adresse</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Sélectionner une adresse du carnet d&apos;adresse.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Annuler (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Type of transfer</source>
+ <translation>Type de transfert</translation>
+ </message>
+ <message>
+ <source>&amp;Blind transfer</source>
+ <translation>Transfert &amp;direct</translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation>Alt+D</translation>
+ </message>
+ <message>
+ <source>Transfer the call to a third party without contacting that third party yourself.</source>
+ <translation>Transfert l&apos;appel vers un tier sans consultation.</translation>
+ </message>
+ <message>
+ <source>T&amp;ransfer with consultation</source>
+ <translation>&amp;Transfert avec consultation</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt+T</translation>
+ </message>
+ <message>
+ <source>Before transferring the call to a third party, first consult the party yourself.</source>
+ <translation>Avant de transférer l&apos;appel vous pourrez consulter le tier vous-même.</translation>
+ </message>
+ <message>
+ <source>Transfer to other &amp;line</source>
+ <translation>Transfert vers l&apos;autre &amp;ligne</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Connect the remote party on the active line with the remote party on the other line.</source>
+ <translation>Connecte le correspondant de la ligne active avec le correspondant de l&apos;autre ligne.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TwinkleCore</name>
+ <message>
+ <source>Failed to create log file %1 .</source>
+ <translation>Impossible de créer le fichier de log %1.</translation>
+ </message>
+ <message>
+ <source>Cannot open file for reading: %1</source>
+ <translation>Impossible d&apos;ouvrir le fichier %1 en lecture</translation>
+ </message>
+ <message>
+ <source>File system error while reading file %1 .</source>
+ <translation>Erreur système pendant la lecture du fichier %1.</translation>
+ </message>
+ <message>
+ <source>Cannot open file for writing: %1</source>
+ <translation>Impossible d&apos;ouvrir le fichier %1 en écriture</translation>
+ </message>
+ <message>
+ <source>File system error while writing file %1 .</source>
+ <translation>Erreur système pendant l&apos;écriture du fichier %1.</translation>
+ </message>
+ <message>
+ <source>Excessive number of socket errors.</source>
+ <translation>Nombre trop important d&apos;erreurs de socket.</translation>
+ </message>
+ <message>
+ <source>Built with support for:</source>
+ <translation>Compilé à l&apos;aide de:</translation>
+ </message>
+ <message>
+ <source>Contributions:</source>
+ <translation>Contributions:</translation>
+ </message>
+ <message>
+ <source>This software contains the following software from 3rd parties:</source>
+ <translation>Ce logiciel contient les logiciels tiers suivants:</translation>
+ </message>
+ <message>
+ <source>* GSM codec from Jutta Degener and Carsten Bormann, University of Berlin</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>* G.711/G.726 codecs from Sun Microsystems (public domain)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>* iLBC implementation from RFC 3951 (www.ilbcfreeware.org)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>* Parts of the STUN project at http://sourceforge.net/projects/stun</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>* Parts of libsrv at http://libsrv.sourceforge.net/</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>For RTP the following dynamic libraries are linked:</source>
+ <translation>Pour RTP, les librairies dynamiques suivantes sont rattachées:</translation>
+ </message>
+ <message>
+ <source>Translated to english by &lt;your name&gt;</source>
+ <translation>Traduit en français par:&lt;br&gt;
+©20070614 Olivier Aufrère</translation>
+ </message>
+ <message>
+ <source>Directory %1 does not exist.</source>
+ <translation>Le dossier %1 n&apos;existe pas.</translation>
+ </message>
+ <message>
+ <source>Cannot open file %1 .</source>
+ <translation>Impossible d&apos;ouvrir le fichier %1.</translation>
+ </message>
+ <message>
+ <source>%1 is not set to your home directory.</source>
+ <translation>%1 n&apos;est pas paramêtré pour votre dossier home.</translation>
+ </message>
+ <message>
+ <source>Directory %1 (%2) does not exist.</source>
+ <translation>Le dossier %1 (%2) n&apos;existe pas.</translation>
+ </message>
+ <message>
+ <source>Cannot create directory %1 .</source>
+ <translation>Impossible de créer le dossier %1.</translation>
+ </message>
+ <message>
+ <source>Lock file %1 already exist, but cannot be opened.</source>
+ <translation type="obsolete">Le fichier de vérouillage %1 existe déjà mais ne peut être ouvert.</translation>
+ </message>
+ <message>
+ <source>%1 is already running.
+Lock file %2 already exists.</source>
+ <translation>%1 en cours d&apos;execution
+Le fichier de vérouillage %2 existe déjà.</translation>
+ </message>
+ <message>
+ <source>Cannot create %1 .</source>
+ <translation>Impossible de créer %1.</translation>
+ </message>
+ <message>
+ <source>Cannot write to %1 .</source>
+ <translation type="obsolete">Impossible d&apos;écrire su %1.</translation>
+ </message>
+ <message>
+ <source>Syntax error in file %1 .</source>
+ <translation>Erreur de syntaxe dans le fichier %1.</translation>
+ </message>
+ <message>
+ <source>Failed to backup %1 to %2</source>
+ <translation>Impossible de sauvegarder %1 sur %2</translation>
+ </message>
+ <message>
+ <source>unknown name (device is busy)</source>
+ <translation>nom inconnu (interface utilisée)</translation>
+ </message>
+ <message>
+ <source>Default device</source>
+ <translation>Interface par défaut</translation>
+ </message>
+ <message>
+ <source>Anonymous</source>
+ <translation>Anonyme</translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation>Attention:</translation>
+ </message>
+ <message>
+ <source>Call transfer - %1</source>
+ <translation>Transfert d&apos;appel - %1</translation>
+ </message>
+ <message>
+ <source>Sound card cannot be set to full duplex.</source>
+ <translation>La carte son ne peut pas être passée en full duplex.</translation>
+ </message>
+ <message>
+ <source>Cannot set buffer size on sound card.</source>
+ <translation>Impossible de paramètrer la taille du beffer de la carte son.</translation>
+ </message>
+ <message>
+ <source>Sound card cannot be set to %1 channels.</source>
+ <translation>Impossible de paramètrer la carte son pour les canaux %1.</translation>
+ </message>
+ <message>
+ <source>Cannot set sound card to 16 bits recording.</source>
+ <translation>Impossible de paramètrer la carte son en enregistrement 16 bits.</translation>
+ </message>
+ <message>
+ <source>Cannot set sound card to 16 bits playing.</source>
+ <translation>Impossible de paramètrer la carte son en lecture 16 bits.</translation>
+ </message>
+ <message>
+ <source>Cannot set sound card sample rate to %1</source>
+ <translation>Impossible de paramètrer la carte son à un taux de sample %1</translation>
+ </message>
+ <message>
+ <source>Opening ALSA driver failed</source>
+ <translation>Echec de l&apos;ouverture d&apos;ALSE</translation>
+ </message>
+ <message>
+ <source>Cannot open ALSA driver for PCM playback</source>
+ <translation>Impossible d&apos;ouvrir ALSA pour la lecture PCM</translation>
+ </message>
+ <message>
+ <source>Cannot resolve STUN server: %1</source>
+ <translation>Impossible de trouver le serveur STUN %1</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Vous êtes derrière un NAT symétrique.
+STUN ne fonctionnera pas.
+Configurez une adresse IP publique pour votre profil utilisateur
+et créez les attaches statiques suivantes (UDP) dans votre NAT.</translation>
+ </message>
+ <message>
+ <source>public IP: %1 --&gt; private IP: %2 (SIP signaling)</source>
+ <translation>IP publique: %1 -&gt; IP privée: %2 (SIP)</translation>
+ </message>
+ <message>
+ <source>public IP: %1-%2 --&gt; private IP: %3-%4 (RTP/RTCP)</source>
+ <translation>IP publique: %1-%2 -&gt; IP privée: %3-%4 (RTP/RTCP)</translation>
+ </message>
+ <message>
+ <source>Cannot reach the STUN server: %1</source>
+ <translation>Impossible d&apos;atteindre le serveur STUN: %1</translation>
+ </message>
+ <message>
+ <source>Port %1 (SIP signaling)</source>
+ <translation>Port %1 (SIP)</translation>
+ </message>
+ <message>
+ <source>NAT type discovery via STUN failed.</source>
+ <translation>Echec de l&apos;identification du type NAT par STUN.</translation>
+ </message>
+ <message>
+ <source>If you are behind a firewall then you need to open the following UDP ports.</source>
+ <translation>Si vous êtes derrière un firemwall, vous devez ouvrir les ports UDP suivants.</translation>
+ </message>
+ <message>
+ <source>Ports %1-%2 (RTP/RTCP)</source>
+ <translation>Ports %1-%2 (RTP/RTCP)</translation>
+ </message>
+ <message>
+ <source>Cannot access the ring tone device (%1).</source>
+ <translation>Impossible d&apos;accéder à l&apos;interface %1 de la sonnerie.</translation>
+ </message>
+ <message>
+ <source>Cannot access the speaker (%1).</source>
+ <translation>Impossible d&apos;accéder à l&apos;interface %1 du haut-parleur.</translation>
+ </message>
+ <message>
+ <source>Cannot access the microphone (%1).</source>
+ <translation>Impossible d&apos;accéder à l&apos;interface %1 du microphone.</translation>
+ </message>
+ <message>
+ <source>Cannot open ALSA driver for PCM capture</source>
+ <translation>Impossible d&apos;ouvrir ALSA pour la capture PCM</translation>
+ </message>
+ <message>
+ <source>Cannot receive incoming TCP connections.</source>
+ <translation>Impossible de recevoir des connexions TCP entrantes.</translation>
+ </message>
+ <message>
+ <source>Failed to create file %1</source>
+ <translation>Echec de la création du fichier %1</translation>
+ </message>
+ <message>
+ <source>Failed to write data to file %1</source>
+ <translation>Echec de l&apos;écriture de données dans %1</translation>
+ </message>
+ <message>
+ <source>Failed to send message.</source>
+ <translation>Echec de l&apos;envoi du message.</translation>
+ </message>
+ <message>
+ <source>Cannot lock %1 .</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UserProfileForm</name>
+ <message>
+ <source>Twinkle - User Profile</source>
+ <translation>Twinkle - Profil utilisateur</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Profil utilisateur:</translation>
+ </message>
+ <message>
+ <source>Select which profile you want to edit.</source>
+ <translation>Sélectionnez le profil que vous voulez éditer.</translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation>Utilisateur</translation>
+ </message>
+ <message>
+ <source>SIP server</source>
+ <translation>Serveur SIP</translation>
+ </message>
+ <message>
+ <source>RTP audio</source>
+ <translation>RTP Audio</translation>
+ </message>
+ <message>
+ <source>SIP protocol</source>
+ <translation>Protocole SIP</translation>
+ </message>
+ <message>
+ <source>Address format</source>
+ <translation>Format d&apos;adresse</translation>
+ </message>
+ <message>
+ <source>Timers</source>
+ <translation>Décomptes</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <translation>Sonneries</translation>
+ </message>
+ <message>
+ <source>Scripts</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Security</source>
+ <translation>Sécurité</translation>
+ </message>
+ <message>
+ <source>Select a category for which you want to see or modify the settings.</source>
+ <translation>Sélectionnez la catégorie dont vous voulez voir ou modifier les paramètres.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Accept and save your changes.</source>
+ <translation>Accepter et enregistrer les modifications.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Annuler (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Undo all your changes and close the window.</source>
+ <translation>Annuler tous les changements et fermer la fenêtre.</translation>
+ </message>
+ <message>
+ <source>SIP account</source>
+ <translation>Compte SIP</translation>
+ </message>
+ <message>
+ <source>&amp;User name*:</source>
+ <translation>Nom d&apos;&amp;utilisateur*:</translation>
+ </message>
+ <message>
+ <source>&amp;Domain*:</source>
+ <translation>&amp;Domaine*:</translation>
+ </message>
+ <message>
+ <source>Or&amp;ganization:</source>
+ <translation>Or&amp;ganisation:</translation>
+ </message>
+ <message>
+ <source>The SIP user name given to you by your provider. It is the user part in your SIP address, &lt;b&gt;username&lt;/b&gt;@domain.com This could be a telephone number.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>Le nom d&apos;utilisateur SIP donné par votre fournisseur de service. C&apos;est la partie &quot;utilisateur&quot; de votre adresse SIP, &lt;b&gt;utilisateur&lt;/b&gt;@domain.com.
+Ceci peut être un numéro de téléphone.
+&lt;br&gt;&lt;br&gt;
+Ce champ est obligatoire.</translation>
+ </message>
+ <message>
+ <source>The domain part of your SIP address, username@&lt;b&gt;domain.com&lt;/b&gt;. Instead of a real domain this could also be the hostname or IP address of your &lt;b&gt;SIP proxy&lt;/b&gt;. If you want direct IP phone to IP phone communications then you fill in the hostname or IP address of your computer.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>Le domaine de votre adresse SIP, username@&lt;b&gt;domain.com&lt;/b&gt;. A la place d&apos;un vrai nom de domaine, il est également possible de saisir le nom de l&apos;hôte ou l&apos;adresse IP de votre &lt;b&gt;proxy SIP&lt;/b&gt;. Si vous voulez uniquement des communications de PC à PC, saisissez le nom de l&apos;hôte ou l&apos;adresse IP de votre ordinateur.
+&lt;br&gt;&lt;br&gt;
+Ce champ est obligatoire.</translation>
+ </message>
+ <message>
+ <source>You may fill in the name of your organization. When you make a call, this might be shown to the called party.</source>
+ <translation>Vous pouvez remplir le nom de votre organisation. Quand vous ferez un appel, ceci sera montré à votre correspondant.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>C&apos;est simplement votre nom complet, ex: Pierre Dupond. Il est utilisé pour l&apos;affichage. Quand vous ferez un appel, ceci sera montré à votre correspondant.</translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation>&amp;Votre nom:</translation>
+ </message>
+ <message>
+ <source>SIP authentication</source>
+ <translation>Authentification SIP</translation>
+ </message>
+ <message>
+ <source>&amp;Realm:</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Authentication &amp;name:</source>
+ <translation>&amp;Nom d&apos;authentification:</translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>Mot de &amp;passe:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Le realm pour l&apos;authentification. Cette valeur vous est fournie par votre fournisseur de service SIP. Si vous laissez ce champ vide, Twinkle utilisera le nom d&apos;utilisateur et le mot de passe en cas de demande de realm.</translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation>Votre nom d&apos;authentification SIP. Souvent, c&apos;est le même que votre nom d&apos;utilisateur SIP. Cependant, il peut être différent.</translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation>Votre mot de passe d&apos;authentification.</translation>
+ </message>
+ <message>
+ <source>Registrar</source>
+ <translation>Registrar (Serveur proxy) </translation>
+ </message>
+ <message>
+ <source>&amp;Registrar:</source>
+ <translation>&amp;Registrar:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Le nom d&apos;hôte, le nom de domaine ou l&apos;adresse IP de votre fournisseur de service. Si vous utilisez un proxy sortant qui est identique à votre fournisseur de service, vous pouvez laisser ce champ vide et seulement remplir l&apos;adresse du proxy sortant. </translation>
+ </message>
+ <message>
+ <source>&amp;Expiry:</source>
+ <translation>&amp;Expiration:</translation>
+ </message>
+ <message>
+ <source>The registration expiry time that Twinkle will request.</source>
+ <translation>Le délai d&apos;expiration de l&apos;établissement de la connexion par Twinkle. Standard: 3600 (=1h).</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>secondes</translation>
+ </message>
+ <message>
+ <source>Re&amp;gister at startup</source>
+ <translation>Se &amp;connecter au démarrage</translation>
+ </message>
+ <message>
+ <source>Alt+G</source>
+ <translation>Alt-C</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Indique si Twinkle doit automatiquement se connecter quand cous utilisez ce profil. Vous devrez désactivé ceci en cas de communication directe de téléphone IP à téléphone IP sans passer par proxy SIP.</translation>
+ </message>
+ <message>
+ <source>Outbound Proxy</source>
+ <translation>Proxy sortant</translation>
+ </message>
+ <message>
+ <source>&amp;Use outbound proxy</source>
+ <translation>&amp;Utiliser le proxy sortant</translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Indique si Twinkle doit utiliser un proxy sortant. Si un proxy sortant est utiliser, toutes les demandes SIP sont envoyées par ce proxy. Sans proxy sortant, Twinkle essaiera de résoudre l&apos;adresse SIP que vous avez saisie pour une invitation d&apos;appel, par exemple à une adresse IP et envoie la demande SIP à cette adresse.</translation>
+ </message>
+ <message>
+ <source>Outbound &amp;proxy:</source>
+ <translation>&amp;Proxy sortant: </translation>
+ </message>
+ <message>
+ <source>&amp;Send in-dialog requests to proxy</source>
+ <translation>&amp;Envoyer des demandes &quot;in-dialog&quot; au proxy</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+E</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Les demandes SIP incluses dans un dialogue SIP sont normalement envoyées dans les entêtes de contact échangées pendant l&apos;établissement de l&apos;appel. Si vous cochez cette case, cette adresse est ignorée et les demandes incluses dans le dialog sont également envoyées par le proxy de sortie.</translation>
+ </message>
+ <message>
+ <source>&amp;Don&apos;t send a request to proxy if its destination can be resolved locally.</source>
+ <translation>&amp;Ne pas envoyer une demande au proxy si la destination peut être trouvée locallement.</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation>Alt+N</translation>
+ </message>
+ <message>
+ <source>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.)</source>
+ <translation>Quand vous cochez cette case, Twinkle essaiera d&apos;abord de trouver une adresse SIP par une adresse IP. S&apos;il y arrive, la demande SIP sera envoyée par ce mode. Dans le cas contraire, il enverra la demande SIP au proxy (nota: une demande incluse dans un dialogue serra uniquement envoyée au proxy si vous avez également cochez la case précédente)</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of your outbound proxy.</source>
+ <translation>Le nom d l&apos;hôte, le nom de domaine ou l&apos;adresse IP de votre proxy de sortie.</translation>
+ </message>
+ <message>
+ <source>Co&amp;decs</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Codecs</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Available codecs:</source>
+ <translation>Codecs disponibles:</translation>
+ </message>
+ <message>
+ <source>G.711 A-law</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>G.711 u-law</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>GSM</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>speex-nb (8 kHz)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>speex-wb (16 kHz)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>speex-uwb (32 kHz)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>List of available codecs.</source>
+ <translation>Liste des codecs disponibles.</translation>
+ </message>
+ <message>
+ <source>Move a codec from the list of available codecs to the list of active codecs.</source>
+ <translation>Active un codec.</translation>
+ </message>
+ <message>
+ <source>Move a codec from the list of active codecs to the list of available codecs.</source>
+ <translation>Désactive un codec.</translation>
+ </message>
+ <message>
+ <source>Active codecs:</source>
+ <translation>Codecs actifs:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Liste des codecs actifs. Ceux sont les codecs qui seront utilisés pour la négociation lors de l&apos;établissement de l&apos;appel. L&apos;ordre des codecs est l&apos;ordre de préférence d&apos;utilisation.</translation>
+ </message>
+ <message>
+ <source>Move a codec upwards in the list of active codecs, i.e. increase its preference of use.</source>
+ <translation>Monte un codec dans la liste des codecs actifs, i.e. augmente sa priorité d&apos;utilisation.</translation>
+ </message>
+ <message>
+ <source>Move a codec downwards in the list of active codecs, i.e. decrease its preference of use.</source>
+ <translation>Descend un codec dans la liste des codecs actifs, i.e. diminue sa priorité d&apos;utilisation.</translation>
+ </message>
+ <message>
+ <source>&amp;G.711/G.726 payload size:</source>
+ <translation>&amp;G.711/G.726 taille des données:</translation>
+ </message>
+ <message>
+ <source>The preferred payload size for the G.711 and G.726 codecs.</source>
+ <translation>La taille des données préférée pour les codecs G.711 et G.726.</translation>
+ </message>
+ <message>
+ <source>ms</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;iLBC</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>iLBC</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>i&amp;LBC payload type:</source>
+ <translation>i&amp;LBC Type des données:</translation>
+ </message>
+ <message>
+ <source>iLBC &amp;payload size (ms):</source>
+ <translation>iLBC &amp;taille des données (ms):</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for iLBC.</source>
+ <translation>Le type de valeur dynamique (96 ou plus) devant être utilisé.</translation>
+ </message>
+ <message>
+ <source>20</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>30</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>The preferred payload size for iLBC.</source>
+ <translation>Taille préférée des données du paquet RTP pour iLBC.</translation>
+ </message>
+ <message>
+ <source>&amp;Speex</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Speex</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Perceptual &amp;enhancement</source>
+ <translation>&amp;Amélioration de la perception</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>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).</source>
+ <translation>l&apos; &quot;amélioration de la perception&quot; (anglais: perceptual enhancement) est une partie du décodeur qui, quand elle est activée, essaie de réduire la perception du bruit produit par le décodage/encodage. Dans la plupart des cas, ceci rend le son assez différent de l&apos;original, mais le rend plus agréable.</translation>
+ </message>
+ <message>
+ <source>&amp;Ultra wide band payload type:</source>
+ <translation>Type des données pour la bande &amp;Ultra-Large:</translation>
+ </message>
+ <message>
+ <source>Alt+V</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>When enabled, voice activity detection detects whether the audio being encoded is speech or silence/background noise. VAD is always implicitly activated when encoding in VBR, so the option is only useful in non-VBR operation. In this case, Speex detects non-speech periods and encode them with just enough bits to reproduce the background noise. This is called &quot;comfort noise generation&quot; (CNG).</source>
+ <translation type="obsolete">En la sélectionnant, la détection de la parole (ie: voice activity detection ou VAD) détecte si le son encodé est de la voix ou du silence (bruit de fond). VAD est toujours implicitement activé en encodage VBR, cette option est donc uniquement utilisable pour les opérations non-VBR. Dans ce cas, Speex detecte les passages sans paroles et les encode avec juste le nombre de bits nécessaire pour reproduire le bruit de fond. Ceci est appelé la &quot;génération de bruit pour le confort&quot; (comfort noise generation CNG).</translation>
+ </message>
+ <message>
+ <source>&amp;Wide band payload type:</source>
+ <translation>Type des données pour la bande &amp;Large:</translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Variable bit-rate (VBR) allows a codec to change its bit-rate dynamically to adapt to the &quot;difficulty&quot; 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&apos;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.</source>
+ <translation>Variable Bit-Rate (VBR) permet au codec d&apos;ajuster sa bande passante dynamiquement à la difficulté d&apos;encodage du son. Ceci permet à qualité constante, de réduire la bande passante nécessaire. Il y a cependant des désavantages: en ne spécifiant que la qualité, il n&apos;y à aucune garantie sur la bande passante moyenne finallement utilisée; pour certaines applications comme la VOIP, ce qui compte c&apos;est la bande passante maximum, qui doit être la plus basse possible.</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for speex wide band.</source>
+ <translation>La valeur dynamique (96 ou plus) à utiliser pour le speex à large bande (RFC 2833).</translation>
+ </message>
+ <message>
+ <source>Co&amp;mplexity:</source>
+ <translation>Co&amp;mplexité:</translation>
+ </message>
+ <message>
+ <source>Discontinuous transmission is an addition to VAD/VBR operation, that allows to stop transmitting completely when the background noise is stationary.</source>
+ <translation>La transmission discontinue est un ajout à VAD/VBR, qui permet d&apos;arrêter totalement la transmission quand le bruit de fond est stationnaire.</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for speex narrow band.</source>
+ <translation>La valeur dynamique (96 ou plus) à utiliser pour le speex à petite bande (RFC 2833).</translation>
+ </message>
+ <message>
+ <source>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&apos;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.</source>
+ <translation>Avec Spexx, il est possible de faire varier le taux de compression de l&apos;encodeur. Ceci est possible en contrôlant comment la recherche est assurée avec un entier entre 1 et 10 d&apos;une manière similaire aux option -1 à -9 de gzip et bzip2. En utilisation normale, le niveau de bruit au taux 1 est entre 1 et 2 dB plus élevé que au taux 10, mais l&apos;utilisation du CPU au taux 10 est 5 fois plus grande que au taux 1. En pratique, Le meilleur compromis est entre 2 et 4, alors que des taux plus élevés sont souvent utilent pour encoder des sons autre que la voix comme les sonneries DTMF.</translation>
+ </message>
+ <message>
+ <source>&amp;Narrow band payload type:</source>
+ <translation>Type des données pour la bande &amp;Courte:</translation>
+ </message>
+ <message>
+ <source>G.726</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>G.726 &amp;40 kbps payload type:</source>
+ <translation>G.726 &amp;40 kb/s Type des données:</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 40 kbps.</source>
+ <translation>La valeur dynamique (96 ou plus) a utiliser pour G.726 40 kb/s.</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 32 kbps.</source>
+ <translation>La valeur dynamique (96 ou plus) a utiliser pour G.726 32 kb/s.</translation>
+ </message>
+ <message>
+ <source>G.726 &amp;24 kbps payload type:</source>
+ <translation>G.726 &amp;24 kb/s Type des données:</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 24 kbps.</source>
+ <translation>La valeur dynamique (96 ou plus) a utiliser pour G.726 24 kb/s.</translation>
+ </message>
+ <message>
+ <source>G.726 &amp;32 kbps payload type:</source>
+ <translation>G.726 &amp;32 kb/s Type des données:</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 16 kbps.</source>
+ <translation>La valeur dynamique (96 ou plus) a utiliser pour G.726 16 kb/s.</translation>
+ </message>
+ <message>
+ <source>G.726 &amp;16 kbps payload type:</source>
+ <translation>G.726 &amp;16 kb/s Type des données:</translation>
+ </message>
+ <message>
+ <source>DT&amp;MF</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>DTMF</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for DTMF events (RFC 2833).</source>
+ <translation>La valeur dynamique (96 ou plus) à utiliser pour les évenements DTMF (RFC 2833).</translation>
+ </message>
+ <message>
+ <source>DTMF vo&amp;lume:</source>
+ <translation>&amp;Volume DTMF:</translation>
+ </message>
+ <message>
+ <source>The power level of the DTMF tone in dB.</source>
+ <translation>Le volume de la sonnerie DTMF en dB.</translation>
+ </message>
+ <message>
+ <source>The pause after a DTMF tone.</source>
+ <translation>La durée de la pose après la sonnerie DTMF.</translation>
+ </message>
+ <message>
+ <source>DTMF &amp;duration:</source>
+ <translation>&amp;Durée DTMF: </translation>
+ </message>
+ <message>
+ <source>DTMF payload &amp;type:</source>
+ <translation>D&amp;TMF Type des données:</translation>
+ </message>
+ <message>
+ <source>DTMF &amp;pause:</source>
+ <translation>&amp;Pause DTMF:</translation>
+ </message>
+ <message>
+ <source>dB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Duration of a DTMF tone.</source>
+ <translation>Durée d&apos;une sonnerie DTMF.</translation>
+ </message>
+ <message>
+ <source>DTMF t&amp;ransport:</source>
+ <translation>&amp;Méthode DTMF:</translation>
+ </message>
+ <message>
+ <source>Auto</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>RFC 2833</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Inband</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Out-of-band (SIP INFO)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&lt;h2&gt;RFC 2833&lt;/h2&gt;
+&lt;p&gt;Send DTMF tones as RFC 2833 telephone events.&lt;/p&gt;
+&lt;h2&gt;Inband&lt;/h2&gt;
+&lt;p&gt;Send DTMF inband.&lt;/p&gt;
+&lt;h2&gt;Auto&lt;/h2&gt;
+&lt;p&gt;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.
+&lt;/p&gt;
+&lt;h2&gt;Out-of-band (SIP INFO)&lt;/h2&gt;
+&lt;p&gt;
+Send DTMF out-of-band via a SIP INFO request.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;&lt;h3&gt;RFC 2833&lt;/h3&gt;
+Envoi une sonnerie DTMF comme un événement de téléphone (RFC 2833).&lt;/p&gt;
+&lt;p&gt;&lt;h3&gt;Inband&lt;/h3&gt;
+Sende DTMF inband (tatsächliche Töne, die Twinkle ins Tonsignal einmischt).&lt;/p&gt;
+&lt;p&gt;&lt;h3&gt;Auto&lt;/h3&gt;
+Wenn die Gegenstelle RFC 2833 unterstützt, dann DTMF-Töne als RFC 2833 telephone events senden, ansonsten inband.&lt;/p&gt;
+&lt;p&gt;&lt;h3&gt;Out-of-band (SIP INFO)&lt;/h3&gt;
+Sende DTMF nur out-of-band via SIP INFO request.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Général</translation>
+ </message>
+ <message>
+ <source>Redirection</source>
+ <translation>Redirection</translation>
+ </message>
+ <message>
+ <source>&amp;Allow redirection</source>
+ <translation>&amp;Authoriser la redirection</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should redirect a request if a 3XX response is received.</source>
+ <translation>Indique si Twinkle doit rediriger une demande en cas de réception d&apos;une réponse 3XX.</translation>
+ </message>
+ <message>
+ <source>Ask user &amp;permission to redirect</source>
+ <translation>Demander la &amp;permission de l&apos;utilisateur avant de rediriger</translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should ask the user before redirecting a request when a 3XX response is received.</source>
+ <translation>Indique si Twinkle doit demander à l&apos;utilisateur avant de rediriger une demande en cas de réception d&apos;une réponse 3XX.</translation>
+ </message>
+ <message>
+ <source>Max re&amp;directions:</source>
+ <translation>Max. re&amp;directions:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Le nombre maximum de tentatives de redirection d&apos;adresse avant l&apos;abandon. Ceci évite qu&apos;une demande ne soit redirigé indéfiniement.</translation>
+ </message>
+ <message>
+ <source>Protocol options</source>
+ <translation>Options du protocole</translation>
+ </message>
+ <message>
+ <source>Call &amp;Hold variant:</source>
+ <translation>Variante d&apos;&amp;attente d&apos;appel: </translation>
+ </message>
+ <message>
+ <source>RFC 2543</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>RFC 3264</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Indique si RFC 2543 (passer l&apos;adresse IP de l&apos;interface dans SDP à 0.0.0.0) ou RFC 3264 (utiliser les attributs de direction dans SDP) est utilisé pour mettre un appel en attente.</translation>
+ </message>
+ <message>
+ <source>Allow m&amp;issing Contact header in 200 OK on REGISTER</source>
+ <translation>Authorise l&apos;absence de l&apos;&amp;entête de contact dans 200 OK lors de la connexion</translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation>Alt+E</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Une réponse &quot;200 OK&quot; lors d&apos;une connexion, doit comporter une entête de contact.Cependant, quelques fournisseurs de service, n&apos;incorporent pas d&apos;&apos;entête de contact ou en incorpore une erronée. Cette option authorise cette transgression.</translation>
+ </message>
+ <message>
+ <source>&amp;Max-Forwards header is mandatory</source>
+ <translation>&amp;Max-Forwards-Header onbligatoire</translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Selon le RFC3261, l&apos;entête Max-Forwards est obligatoire, mais plusieurs implémentations n&apos;envoient pas cet entête. Si vous cochez cette case, Twinkle rejettera une demande SIP si Max-Forwards est manquant.</translation>
+ </message>
+ <message>
+ <source>Put &amp;registration expiry time in contact header</source>
+ <translation>Mettre le délai d&apos;expi&amp;ration de la connexion dans l&apos;entête de contact</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Dans un message REGISTER, le temps d&apos;expiration de la connexion peut être inséré dans l&apos;entête de contact ou dans celle d&apos;expiration. Si vous cochez cette case, il sera inséreé dans celle de contact, dans le cas contraire, dans celle d&apos;expiration.</translation>
+ </message>
+ <message>
+ <source>&amp;Use compact header names</source>
+ <translation>&amp;Utiliser les nom d&apos;entêtes courts</translation>
+ </message>
+ <message>
+ <source>Indicates if compact header names should be used for headers that have a compact form.</source>
+ <translation>Indique si un nom d&apos;entête court doit être utilisé pour les entêtes courtes.</translation>
+ </message>
+ <message>
+ <source>Allow SDP change during call setup</source>
+ <translation>Authoriser les modification SDP pendant l&apos;établissement d&apos;un appel</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;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.&lt;/p&gt;
+&lt;p&gt;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.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Une UAS SIP doit envoyer un SDP dans une réponse 1XX. Quand l&apos;appel est répondu, l&apos;UAS SIP doit envoyer le même SDP dans une réponse 200 OK selon le RFC 3261. Après réception du SDP, les SDP dans les réponses suivantes seront annulés.&lt;/p&gt;
+&lt;p&gt;En authorisant les modifications de SDP pendant l&apos;appel, Twinkle n&apos;annulera pas les SDP dans les réponses suivantes et modifiera le medium si le SDP a changé.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Twinkle creates a unique contact header value by combining the SIP user name and domain:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;tt&gt;&amp;nbsp;user_domain@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+This way 2 user profiles, having the same user name but different domain names, have unique contact addresses and hence can be activated simultaneously.
+&lt;/p&gt;
+&lt;p&gt;
+Some proxies do not handle a contact header value like this. You can disable this option to get a contact header value like this:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;tt&gt;&amp;nbsp;user@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+This format is what most SIP phones use.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Twinkle crée une entête de contact unique en combinant le nom d&apos;utilisateur et de domaine SIP:
+&lt;br&gt;
+&lt;tt&gt;&amp;nbsp;user_domain@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+De cette façon, 2 profils utilisateur ayant le même nom d&apos;utilisateur mais des domaines différents, ont une adresse unique de contact et peuvent ainsi être activé simultanément.
+&lt;/p&gt;
+&lt;p&gt;
+Des proxy ne construisent pas l&apos;entête de contact de cette façon. Vous pouvez désactiver cette option pour avoir une entête comme ceci:
+&lt;br&gt;
+&lt;tt&gt;&amp;nbsp;user@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+Ce format est utiliser par la plupart des téléphones SIP.
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Encode Via, Route, Record-Route as list</source>
+ <translation>&amp;Encode Via, Route, Record-Route comme une liste</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Les entêtes Via-, Route- et Record-Route peuvent être encodé comme une liste séparée par des virgules ou comme des occurrences mulitples de la même entête.</translation>
+ </message>
+ <message>
+ <source>SIP extensions</source>
+ <translation>extensions SIP</translation>
+ </message>
+ <message>
+ <source>&amp;100 rel (PRACK):</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>disabled</source>
+ <translation>désactivé</translation>
+ </message>
+ <message>
+ <source>supported</source>
+ <translation>supporté</translation>
+ </message>
+ <message>
+ <source>required</source>
+ <translation>requis</translation>
+ </message>
+ <message>
+ <source>preferred</source>
+ <translation>préféré</translation>
+ </message>
+ <message>
+ <source>Indicates if the 100rel extension (PRACK) is supported:&lt;br&gt;&lt;br&gt;
+&lt;b&gt;disabled&lt;/b&gt;: 100rel extension is disabled
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;supported&lt;/b&gt;: 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.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;required&lt;/b&gt;: 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.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;preferred&lt;/b&gt;: 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.</source>
+ <translation>Indique si l&apos;extension 100rel (PRACK) est supportée:&lt;br&gt;&lt;br&gt;
+&lt;b&gt;désactivée&lt;/b&gt;: extension 100rel désactivée
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;supportée&lt;/b&gt;: 100rel supportée (elle est insérée dans &quot;supported header&quot; d&apos;une INVITE sortante). Le correspondant peut alors exiger un PRACK dans une réponse 1xx.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;requise&lt;/b&gt;: 100rel requise (elle est insérée dans &quot;equire header&quot; d&apos;une INVITE sortante). Si une INVITE entrante indique qu&apos;elle supporte 100rel, alors Twinkle exigera un PRACK lors de l&apos;envoi d&apos;une reponse 1xx. Si le correspondant ne supporte pas 100rel, l&apos;appel ne se réalise pas.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;préférée&lt;/b&gt;: proche de requise, mais si l&apos;appel échoue suite à l&apos;absence de support de 100rel par le correspondant (420 réponses), une nouvelle tentativce d&apos;appel sans 100rel sera lancée.</translation>
+ </message>
+ <message>
+ <source>REFER</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Call transfer (REFER)</source>
+ <translation>Transfert d&apos;appel (REFER)</translation>
+ </message>
+ <message>
+ <source>Allow call &amp;transfer (incoming REFER)</source>
+ <translation type="obsolete">Authoriser le &amp;transfert d&apos;appel (REFER entrant)</translation>
+ </message>
+ <message>
+ <source>Alt+T</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should transfer a call if a REFER request is received.</source>
+ <translation>Indique si Twinkle doit transferer l&apos;appel en cas de réception d&apos;une demande REFER.</translation>
+ </message>
+ <message>
+ <source>As&amp;k user permission to transfer</source>
+ <translation>Demander l&apos;aut&amp;horisation d&apos;utilisateur avant de transférer</translation>
+ </message>
+ <message>
+ <source>Alt+K</source>
+ <translation>Alt+H</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should ask the user before transferring a call when a REFER request is received.</source>
+ <translation>Indique si Twinkle doit demander à l&apos;utilisateur avant de transférer un appel en cas de réception d&apos;une demande REFER.</translation>
+ </message>
+ <message>
+ <source>Hold call &amp;with referrer while setting up call to transfer target</source>
+ <translation>Mettre l&apos;appel avec un &amp;mandataire en attente pendant l&apos;établissement de l&apos;appel vers le destinataire du transfert</translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation>Alt+M</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should put the current call on hold when a REFER request to transfer a call is received.</source>
+ <translation>Indique si Twinkle doit demander à l&apos;utilisateur avant de mettre l&apos;appel en attente en cas de réception d&apos;une réponse REFER pour un transfert.</translation>
+ </message>
+ <message>
+ <source>Ho&amp;ld call with referee before sending REFER</source>
+ <translation>Mettre l&apos;appel avec un ma&amp;ndant en attente avant d&apos;envoyer un REFER</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+N</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should put the current call on hold when you transfer a call.</source>
+ <translation>Indique si twinkle doit mettre l&apos;appel courant en attente pendant un transfert.</translation>
+ </message>
+ <message>
+ <source>Auto re&amp;fresh subscription to refer event while call transfer is not finished</source>
+ <translation>Ra&amp;fraichir la subsciption au refer automatiquement avant que le transfert d&apos;appel ne soit fini</translation>
+ </message>
+ <message>
+ <source>Alt+F</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Quand l&apos;appel est transféré, le mandant envoie des messages NOTIFY au mandataire à propos de la progression du transfert. Ces messages sont seulement envoyés pendante une courte période dans la durée est déterminée par le mandant. Si vous cochez cette case, le mandataire enverra automatiquement un SUBSCRIBE pour allonger cette durée si elle est trop courte (transfert non terminé).</translation>
+ </message>
+ <message>
+ <source>NAT traversal</source>
+ <translation>NAT Tranvsersal</translation>
+ </message>
+ <message>
+ <source>&amp;NAT traversal not needed</source>
+ <translation>&amp;NAT traversal non nécessaire</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Choose this option when there is no NAT device between you and your SIP proxy or when your SIP provider offers hosted NAT traversal.</source>
+ <translation>Cochez cette case quand il n&apos;y a pas d&apos;interface NAT entre vous et votre proxy SIP, ou quand votre fournisseur de service SIP gère lui même le NAT transversal.</translation>
+ </message>
+ <message>
+ <source>&amp;Use statically configured public IP address inside SIP messages</source>
+ <translation>&amp;Utiliser une adresse IP publique fixe dans les messages SIP</translation>
+ </message>
+ <message>
+ <source>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.&lt;br&gt;&lt;br&gt;
+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.</source>
+ <translation>Indique si Twinkle doit utiliser l&apos;adresse IP public spécifiée dans le champ suivant dans les messages SIP, i.e. dans les entêtes SIP et dans le corps SDP à la place de l&apos;adresse IP de votre interface réseau (privée).&lt;br&gt;&lt;br&gt;
+En cochant cette case, vous devez créer un mappage NAT. Vous devez mapper les ports RTP sur l&apos;adresse IP public et sur l&apos;adresse IP privée de votre PC.</translation>
+ </message>
+ <message>
+ <source>Use &amp;STUN</source>
+ <translation type="obsolete">Utiliser &amp;STUN</translation>
+ </message>
+ <message>
+ <source>Choose this option when your SIP provider offers a STUN server for NAT traversal.</source>
+ <translation>Sélectionez cette option si votre fournisseur de service SIP propose un serveur STUN pour le NAT transversal.</translation>
+ </message>
+ <message>
+ <source>S&amp;TUN server:</source>
+ <translation>Serveur S&amp;TUN:</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of the STUN server.</source>
+ <translation>Le nom d l&apos;hôte, le nom de domaine ou l&apos;adresse IP du serveur STUN.</translation>
+ </message>
+ <message>
+ <source>&amp;Public IP address:</source>
+ <translation>Adresse IP &amp;publique:</translation>
+ </message>
+ <message>
+ <source>The public IP address of your NAT.</source>
+ <translation>L&apos;adresse IP publique de votre NAT.</translation>
+ </message>
+ <message>
+ <source>Telephone numbers</source>
+ <translation>Numéros de téléphone</translation>
+ </message>
+ <message>
+ <source>Only &amp;display user part of URI for telephone number</source>
+ <translation>&amp;Afficher seulement la partie utilisateur de l&apos;URI pour un numéro de téléphone</translation>
+ </message>
+ <message>
+ <source>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 &quot;123456&quot; to the user. A URI indicates a telephone number if it contains the &quot;user=phone&quot; parameter or when it has a numerical user part and you ticked the next option.</source>
+ <translation>Si une URI indique un numéro de téléphone, alors seulement la partie utilisateur sera affichée. Ex: Si un appel arrive depuis sip:123456@twinklephone.com alors seulement &quot;123456&quot; sera affiché. Une URI indique un numérode téléphone si elle contient le paramêtre &quot;user=phone&quot; ou si elle a une partie utilisateur numérique et que vous avez coché la case suivante.</translation>
+ </message>
+ <message>
+ <source>&amp;URI with numerical user part is a telephone number</source>
+ <translation>Une &amp;URI avec une partie utilisateur numérique est un numéro de téléphone</translation>
+ </message>
+ <message>
+ <source>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 &quot;user=phone&quot; parameter to such a URI.</source>
+ <translation>Si vous cochez cette case, Twinkle considère une adresse SIP qui a une partie utilisateur constituée de chiffre,*,#,+ et des symboles spéciaux comme un numéro de téléphone. Dans un message sortant, Twinkle ajoutera le paramètre &quot;user=phone&quot; pour ce type d&apos;URI.</translation>
+ </message>
+ <message>
+ <source>&amp;Remove special symbols from numerical dial strings</source>
+ <translation>&amp;Supprimer les symboles spéciaux pour les chaines numériques</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Les numéros de téléphone sont souvent écrit avec des caractères spéciaux pour les rendre plus facile à lire. Quand vous composez ce genre de numéro, les caractères spéciaux doivent être supprimés. Pour vous permettre de copier/coller ce type de numéro, Twinkle supprimera ces caractères à la numérotation.</translation>
+ </message>
+ <message>
+ <source>&amp;Special symbols:</source>
+ <translation>&amp;Symboles spéciaux:</translation>
+ </message>
+ <message>
+ <source>The special symbols that may be part of a telephone number for nice formatting, but must be removed when dialing.</source>
+ <translation>Les symboles spéciaux utilisables pour respecter le format usuel des numéros de téléphone mais qui doivent être supprimé à la numérotation.</translation>
+ </message>
+ <message>
+ <source>Number conversion</source>
+ <translation>Conversion des numéros</translation>
+ </message>
+ <message>
+ <source>Match expression</source>
+ <translation>Expression de recherche</translation>
+ </message>
+ <message>
+ <source>Replace</source>
+ <translation>Remplacer</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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 &apos;00&apos; instead of the &apos;+&apos;, or you are at the office and all your numbers need to be prefixed with a &apos;9&apos; to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings.
+&lt;/p&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;p&gt;
+The number conversion rules are also applied to incoming calls, so the numbers are displayed in the format you want.
+&lt;/p&gt;
+&lt;h3&gt;Example 1&lt;/h3&gt;
+&lt;p&gt;
+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 &apos;+31&apos; and replace it by a &apos;0&apos;. For dialling numbers abroad you just want to replace the &apos;+&apos; by &apos;00&apos;.
+&lt;/p&gt;
+&lt;p&gt;
+The following rules will do the trick:
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expression = \+31([0-9]*) , Replace = 0$1&lt;br&gt;
+Match expression = \+([0-9]*) , Replace = 00$1&lt;/br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;h3&gt;Example 2&lt;/h3&gt;
+&lt;p&gt;
+You are at work and all telephone numbers starting with a 0 should be prefixed with a 9 for an outside line.
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expression = 0[0-9]* , Replace = 9$&amp;&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;</source>
+ <translation>&lt;p&gt;
+Souvent le format des numéros de téléphone que vous devez composer est différent du format eregistré dans votre carnet d&apos;adresse, ex: votre numéro commence par &quot;+&quot; suivi du code pays, mais votre fournisseur de service attend &quot;00&quot; à la plase de &quot;+&quot;, ou vous êtes au bureau et tous les numéros sortants doivent être précédés de &quot;0&quot;. Vous pouvez spécifier ici une conversion de numéro en expression régulière Perl ou chaine formatée.
+&lt;/p&gt;
+&lt;p&gt;
+Pour tous les numéros que vous compsez, Twinkle essaiera de trouver une occurence dans la liste des expressions. Lors de la première concordance, le numéro sera remplacé en suivant le formatage par chaine. Si aucune occurence n&apos;est rencontrée, le numéro reste inchangé.
+&lt;/p&gt;
+&lt;p&gt;
+Les règes de conversion des numéro sont également appliquées aux appels entrant. Les numéros seroont donc affichés au format souhaité.
+&lt;/p&gt;
+&lt;h3&gt;Exemple 1&lt;/h3&gt;
+&lt;p&gt;
+En considérant que votre code pays est 33 et que vous avez enregistré tous les numéros de votre carnet d&apos;adresse au format internationnal, ex +338712345678. Pour la numéroation des numéro de votre propre pays, vous voulez remplacer &quot;+33&quot; par &quot;0&quot;. Pour les numéros à l&apos;étranger, vous voulez remplacer &quot;+&quot; par &quot;00&quot;.
+&lt;/p&gt;
+&lt;p&gt;
+Voici les règles à créer:
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expression = \+31([0-9]*) , Replace =(sp)(sp)0$1&lt;br&gt;
+Match expression = \+([0-9]*) , Replace = 00$1&lt;/br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;h3&gt;Exemple 2&lt;/h3&gt;
+&lt;p&gt;
+Au bureau, tous les numéros commençant par 0 doivent recevoir un préfixe 9 pour un appel sortant.
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expression = 0[0-9]* , Replace =(sp)(sp)9$&amp;&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;</translation>
+ </message>
+ <message>
+ <source>Move the selected number conversion rule upwards in the list.</source>
+ <translation>Déplacer la règle de conversion sélectionnée vers le haut de la liste.</translation>
+ </message>
+ <message>
+ <source>Move the selected number conversion rule downwards in the list.</source>
+ <translation>Déplacer la règle de conversion sélectionnée vers le bas de la liste..</translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation>&amp;Ajouter</translation>
+ </message>
+ <message>
+ <source>Add a number conversion rule.</source>
+ <translation>Ajouter une règle de conversion de numéro.</translation>
+ </message>
+ <message>
+ <source>Re&amp;move</source>
+ <translation>&amp;Supprimer</translation>
+ </message>
+ <message>
+ <source>Remove the selected number conversion rule.</source>
+ <translation>Supprimer la règle de conversion de numéro sélectionnée.</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Editer</translation>
+ </message>
+ <message>
+ <source>Edit the selected number conversion rule.</source>
+ <translation>Editer la règle de conversion de numéro sélectionnée..</translation>
+ </message>
+ <message>
+ <source>Type a telephone number here an press the Test button to see how it is converted by the list of number conversion rules.</source>
+ <translation>Saisissez ici un numéro de téléphone et appuyer sur le bouton Test pour voir comment il est converti par la liste des règles de conversion de numéros.</translation>
+ </message>
+ <message>
+ <source>&amp;Test</source>
+ <translation>&amp;Test</translation>
+ </message>
+ <message>
+ <source>Test how a number is converted by the number conversion rules.</source>
+ <translation>Test la façon de convertir d&apos;un numéro par les règles de conversion.</translation>
+ </message>
+ <message>
+ <source>for STUN</source>
+ <translation type="obsolete">pour STUN</translation>
+ </message>
+ <message>
+ <source>Keep alive timer for the STUN protocol. If you have enabled STUN, then Twinkle will send keep alive packets at this interval rate to keep the address bindings in your NAT device alive.</source>
+ <translation type="obsolete">Garder actif le décompte pour le protocole STUN. Si vous avez activé STUN, Twinkle enverra des paquets à cet intervalle pour garder l&apos;adresse dans votre interface NAT active.</translation>
+ </message>
+ <message>
+ <source>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 &quot;480 User Not Responding&quot;.</source>
+ <translation>Quand un appel entrant est reçu, le décompte est lancé. Si l&apos;utilisateur répond à l&apos;appel, le chronomètre est arrèté. Si le décompte se termine avant que l&apos;utilisateur ne réponde, Twinkle rejettera l&apos;appel avec un message &quot;480 User Not Responding&quot; (L&apos;utilisateur ne répond pas).</translation>
+ </message>
+ <message>
+ <source>NAT &amp;keep alive:</source>
+ <translation>&amp;STUN NAT-keep-alive:</translation>
+ </message>
+ <message>
+ <source>&amp;No answer:</source>
+ <translation>&amp;Pas de réponse:</translation>
+ </message>
+ <message>
+ <source>Ring &amp;back tone:</source>
+ <translation>&amp;Tonalité:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Specify the file name of a .wav file that you want to be played as ring back tone for this user.
+&lt;/p&gt;
+&lt;p&gt;
+This ring back tone overrides the ring back tone settings in the system settings.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Entrez un nom de fichier wav qui sera utilisé comme tonalité pour cette utilisateur.&lt;/p&gt;
+
+&lt;p&gt;Cette tonalité est prioritaire sur celle définie dans les paramètres système.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Specify the file name of a .wav file that you want to be played as ring tone for this user.
+&lt;/p&gt;
+&lt;p&gt;
+This ring tone overrides the ring tone settings in the system settings.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Entrez un nom de fichier wav qui sera utilisé comme sonnerie pour cette utilisateur.&lt;/p&gt;
+
+&lt;p&gt;Cette sonnerie est prioritaire sur celle définie dans les paramètres système.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Ring tone:</source>
+ <translation>&amp;Sonnerie:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you release a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing SIP BYE request are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=local_release&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the BYE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Ce script est appelé au raccrochage.
+&lt;/p&gt;
+&lt;h3&gt;Variables d&apos;environnement&lt;/h3&gt;
+&lt;p&gt;
+Les valeurs de toutes les entêtes SIP de la demande sortante SIP BYE sont passées en variables d&apos;environnement à votre script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=local_release&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contient la demande URI de BYE. &lt;br&gt;
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; contient le nom du profil utilisé.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when an incoming call fails.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing SIP failure response are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_failed&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; contains the status code of the failure response. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Ce script est appelé en cas d&apos;échec d&apos;appel entrant.
+&lt;/p&gt;
+&lt;h3&gt;Variables d&apos;environnement&lt;/h3&gt;
+&lt;p&gt;
+Les valeurs de toutes les entêtes SIP de la réponse d&apos;échec sortante SIP sont passées en variables d&apos;environnement à votre script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_failed&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; contient le code de statut de la réponse d&apos;échec.&lt;br&gt;
+&lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contient la raison.&lt;br&gt;
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; contient le nom du profil utilisé.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when the remote party releases a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming SIP BYE request are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=remote_release&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the BYE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Ce script est appelé en cas de raccrochage de la part du correspondant.
+&lt;/p&gt;
+&lt;h3&gt;Variables d&apos;environnement&lt;/h3&gt;
+&lt;p&gt;
+Les valeurs de toutes les entêtes SIP de la demande entrante SIP BYE sont passées en variables d&apos;environnement à votre script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=remote_release&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contient la demande URI de BYE. &lt;br&gt;
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; contient le nom du profil utilisé.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when the remote party answers your call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming 200 OK are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_answered&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Ce script est appelé quand votre correspondant répond à votre appel.
+&lt;/p&gt;
+&lt;h3&gt;Variables d&apos;environnement&lt;/h3&gt;
+&lt;p&gt;
+Les valeurs de toutes les entêtes SIP d&apos;un 200 OK entrant sont passées en variables d&apos;environnement à votre script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_answered&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;&lt;br&gt;
+&lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contient la raison.&lt;br&gt;
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; contient le nom du profil utilisé.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you answer an incoming call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing 200 OK are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_answered&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Ce script est appelé quand vous répondez à un appel entrant.
+&lt;/p&gt;
+&lt;h3&gt;Variables d&apos;environnement&lt;/h3&gt;
+&lt;p&gt;
+Les valeurs de toutes les entêtes SIP d&apos;un 200 OK sortant sont passées en variables d&apos;environnement à votre script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_answered&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;&lt;br&gt;
+&lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contient la raison.&lt;br&gt;
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; contient le nom du profil utilisé.</translation>
+ </message>
+ <message>
+ <source>Call released locall&amp;y:</source>
+ <translation>Appel raccroché locale&amp;ment:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when an outgoing call fails.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming SIP failure response are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_failed&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; contains the status code of the failure response. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Ce script est appelé en cas d&apos;échec d&apos;appel sortant.
+&lt;/p&gt;
+&lt;h3&gt;Variables d&apos;environnement&lt;/h3&gt;
+&lt;p&gt;
+Les valeurs de toutes les entêtes SIP de la réponse d&apos;échec entrante SIP sont passées en variables d&apos;environnement à votre script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_failed&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; contient le code de statut de la réponse d&apos;échec.&lt;br&gt;
+&lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contient la raison.&lt;br&gt;
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; contient le nom du profil utilisé.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you make a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing INVITE are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=INVITE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the INVITE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Ce script est appelé quand vous passez un appel.
+&lt;/p&gt;
+&lt;h3&gt;Variables d&apos;environnement&lt;/h3&gt;
+&lt;p&gt;
+Les valeurs de toutes les entêtes SIP d&apos;un INVITE sortant sont passées en variables d&apos;environnement à votre script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call&lt;/b&gt;. &lt;br&gt;
+&lt;b&gt;SIPSTATUS_CODE=INVITE&lt;/b&gt;&lt;br&gt;
+&lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contient la demande URI de INVITE. &lt;br&gt;
+&lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; contient le nom du profil utilisé.</translation>
+ </message>
+ <message>
+ <source>Outgoing call a&amp;nswered:</source>
+ <translation>Appel sortant répo&amp;ndu:</translation>
+ </message>
+ <message>
+ <source>Incoming call &amp;failed:</source>
+ <translation>Appel entrant &amp;manqué:</translation>
+ </message>
+ <message>
+ <source>&amp;Incoming call:</source>
+ <translation>Appel &amp;entrant:</translation>
+ </message>
+ <message>
+ <source>Call released &amp;remotely:</source>
+ <translation>Appel &amp;terminé par le correspondant: </translation>
+ </message>
+ <message>
+ <source>Incoming call &amp;answered:</source>
+ <translation>Appel entrant répo&amp;ndu:</translation>
+ </message>
+ <message>
+ <source>O&amp;utgoing call:</source>
+ <translation>Appel &amp;sortant:</translation>
+ </message>
+ <message>
+ <source>Out&amp;going call failed:</source>
+ <translation>Appel entrant &amp;échoué:</translation>
+ </message>
+ <message>
+ <source>&amp;Enable ZRTP/SRTP encryption</source>
+ <translation>Activer la cryptographie &amp;ZRTP/SRTP</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Quand ZRT/SRTP est activé, Twinkle essaiera de crypter les appels que vous émettez ou recevez. L&apos;encodage ne réussira que si le correspondant accepte le ZRTP/SRTP. Dans le cas contraire l&apos;appel ne sera pas crypté.</translation>
+ </message>
+ <message>
+ <source>ZRTP settings</source>
+ <translation>Paramètres ZRTP</translation>
+ </message>
+ <message>
+ <source>O&amp;nly encrypt audio if remote party indicated ZRTP support in SDP</source>
+ <translation>Encoder &amp;seulement si le correspondant accepte le ZRTP en SDP</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Un terminal SIP supportant ZRTP doit l&apos;indiquer pendant l&apos;établissement de l&apos;appel. En cochant cette case, Twinkle n&apos;encryptera les appels que si le correspondant indique qu&apos;il accepte le ZRTP.</translation>
+ </message>
+ <message>
+ <source>&amp;Indicate ZRTP support in SDP</source>
+ <translation>&amp;Indiquer le support de ZRTP dans SDP</translation>
+ </message>
+ <message>
+ <source>Twinkle will indicate ZRTP support during call setup in its signalling.</source>
+ <translation>Twinkle indiquera qu&apos;il accepte le ZRTP dans sa signature pendant l&apos;établissement de l&apos;appel.</translation>
+ </message>
+ <message>
+ <source>&amp;Popup warning when remote party disables encryption during call</source>
+ <translation>Afficher un &amp;avertissement quand le correspondant désactive la cryptographie pendant l&apos;appel</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Un correspondant d&apos;un appel encrypté doit envoyer une commande de fin ZRTP (go-clear) pour arréter la cryptographie. Quand Twinkle reçoit cette commande, un avertissement s&apos;affichera si cette case est cochée.</translation>
+ </message>
+ <message>
+ <source>Dynamic payload type %1 is used more than once.</source>
+ <translation>Le type %1 de charge utile dynamique est utilisé plu d&apos;une fois.</translation>
+ </message>
+ <message>
+ <source>You must fill in a user name for your SIP account.</source>
+ <translation>Vous devez saisir un nom d&apos;utilisateur pour votre compte SIP.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Vous devez saisir un nom de domaine pour votre compte SIP.
+
+il est également possible de saisir le nom de l&apos;hôte ou l&apos;adresse IP de votre PC si vous voulez faire des appels directs de PC à PC.</translation>
+ </message>
+ <message>
+ <source>Invalid user name.</source>
+ <translation>Nom d&apos;utilisateur invalide.</translation>
+ </message>
+ <message>
+ <source>Invalid domain.</source>
+ <translation>Domaine invalide.</translation>
+ </message>
+ <message>
+ <source>Invalid value for registrar.</source>
+ <translation>Registrar invalde.</translation>
+ </message>
+ <message>
+ <source>Invalid value for outbound proxy.</source>
+ <translation>Proxy sortant invalide.</translation>
+ </message>
+ <message>
+ <source>Value for public IP address missing.</source>
+ <translation>Absence d&apos;adresse IP publique.</translation>
+ </message>
+ <message>
+ <source>Invalid value for STUN server.</source>
+ <translation>Absence de valeur pour le serveur STUN.</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Sonneries</translation>
+ </message>
+ <message>
+ <source>Choose ring tone</source>
+ <translation>Choisir une sonnerie</translation>
+ </message>
+ <message>
+ <source>Ring back tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Sonneries de tonalité</translation>
+ </message>
+ <message>
+ <source>All files</source>
+ <translation>Tous les fichiers</translation>
+ </message>
+ <message>
+ <source>Choose incoming call script</source>
+ <translation>Sélectionner le scipt d&apos;appel entrant</translation>
+ </message>
+ <message>
+ <source>Choose incoming call answered script</source>
+ <translation>Sélectionner le scipt d&apos;appel entrant répondu</translation>
+ </message>
+ <message>
+ <source>Choose incoming call failed script</source>
+ <translation>Sélectionner le scipt d&apos;appel entrant échoué</translation>
+ </message>
+ <message>
+ <source>Choose outgoing call script</source>
+ <translation>Sélectionner le scipt d&apos;appel sortant</translation>
+ </message>
+ <message>
+ <source>Choose outgoing call answered script</source>
+ <translation>Sélectionner le scipt d&apos;appel sortant répondu</translation>
+ </message>
+ <message>
+ <source>Choose outgoing call failed script</source>
+ <translation>Sélectionner le scipt d&apos;appel sortant échoué</translation>
+ </message>
+ <message>
+ <source>Choose local release script</source>
+ <translation>Sélectionner le scipt de raccrochage local</translation>
+ </message>
+ <message>
+ <source>Choose remote release script</source>
+ <translation>Sélectionner le scipt de raccrochage local distant</translation>
+ </message>
+ <message>
+ <source>Voice mail</source>
+ <translation>Boîte vocale</translation>
+ </message>
+ <message>
+ <source>&amp;Follow codec preference from far end on incoming calls</source>
+ <translation>&amp;Suivre la préférence de codec du correspondant pour les appels entrants</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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.
+&lt;p&gt;
+If you disable this option, then the first codec from the active codecs that is also in the SDP offer is picked.</source>
+ <translation>Choisit le premier codec de la demande SDP qui est également dans la liste des codecs actifs.&lt;br&gt;
+Si vous désactivez cette option, c&apos;est le premier codec de la liste des codecs actifs qui est également dans la demande SDP qui est choisi.</translation>
+ </message>
+ <message>
+ <source>Follow codec &amp;preference from far end on outgoing calls</source>
+ <translation>&amp;Suivre la préférence de codec du correspondant pour les appels sortants</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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.
+&lt;p&gt;
+If you disable this option, then the first codec from the active codecs that is also in the SDP answer is picked.</source>
+ <translation>Choisit le premier codec de la réponse SDP qui est également dans la liste des codecs actifs.&lt;br&gt;
+Si vous désactivez cette option, c&apos;est le premier codec de la liste des codecs actifs qui est également dans la réponse SDP qui est choisi.</translation>
+ </message>
+ <message>
+ <source>Codeword &amp;packing order:</source>
+ <translation>Ordre de compression du codec (codeword &amp;packing order):</translation>
+ </message>
+ <message>
+ <source>RFC 3551</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>ATM AAL2</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Il existe 2 standards de compression pour le codec G726 dans un paquet RTP. RFC 3551 est la compression par défaut. Quelques interfaces SIP utilisent ATM AAL2. Si vous avez une mauvaise qualité en G726 avec la compression RFC 3551, utilisez ATM AAL2.</translation>
+ </message>
+ <message>
+ <source>Replaces</source>
+ <translation>Remplace</translation>
+ </message>
+ <message>
+ <source>Indicates if the Replaces-extenstion is supported.</source>
+ <translation>Indique si Replaces-Extension est supporté.</translation>
+ </message>
+ <message>
+ <source>Attended refer to AoR (Address of Record)</source>
+ <translation>Refer avec consultation vers &quot;Address of Record&quot;</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Un transfert avec consultation doit utiliser l&apos;URI du contact comme cible du refer. Cependant, une URI de contact ne doit pas être routable. L&apos;AoR doit être utlisée à la place. Un incovéniant est que l&apos;AoR peut router vers plusieurs destinataires alors que l&apos;URI de contact route vers un destinataire unique.</translation>
+ </message>
+ <message>
+ <source>Privacy</source>
+ <translation>Confidentialité</translation>
+ </message>
+ <message>
+ <source>Privacy options</source>
+ <translation>Options de confidentialité</translation>
+ </message>
+ <message>
+ <source>&amp;Send P-Preferred-Identity header when hiding user identity</source>
+ <translation>&amp;Envoyer &quot;P-Preferred-Identity Header&quot; quand l&apos;identité est cachée</translation>
+ </message>
+ <message>
+ <source>Include a P-Preferred-Identity header with your identity in an INVITE request for a call with identity hiding.</source>
+ <translation>Inclure un &quot;P-Preferred-Identity Header&quot; à votre identité dans une demande INVITE pour un appel à l&apos;identité cachée.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+You can customize the way Twinkle handles incoming calls. Twinkle can call a script when a call comes in. Based on the ouput 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.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Note:&lt;/b&gt; 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 &lt;b&gt;end&lt;/b&gt; and keep on running. Twinkle will continue when it receives the &lt;b&gt;end&lt;/b&gt; parameter.
+&lt;/p&gt;
+&lt;p&gt;
+With your script you can customize call handling by outputing one or more of the following parameters to stdout. Each parameter should be on a separate line.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+action=[ continue | reject | dnd | redirect | autoanswer ]&lt;br&gt;
+reason=&amp;lt;string&amp;gt;&lt;br&gt;
+contact=&amp;lt;address to redirect to&amp;gt;&lt;br&gt;
+caller_name=&amp;lt;name of caller to display&amp;gt;&lt;br&gt;
+ringtone=&amp;lt;file name of .wav file&amp;gt;&lt;br&gt;
+display_msg=&amp;lt;message to show on display&amp;gt;&lt;br&gt;
+end&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;/p&gt;
+&lt;h2&gt;Parameters&lt;/h2&gt;
+&lt;h3&gt;action&lt;/h3&gt;
+&lt;p&gt;
+&lt;b&gt;continue&lt;/b&gt; - continue call handling as usual&lt;br&gt;
+&lt;b&gt;reject&lt;/b&gt; - reject call&lt;br&gt;
+&lt;b&gt;dnd&lt;/b&gt; - deny call with do not disturb indication&lt;br&gt;
+&lt;b&gt;redirect&lt;/b&gt; - redirect call to address specified by &lt;b&gt;contact&lt;/b&gt;&lt;br&gt;
+&lt;b&gt;autoanswer&lt;/b&gt; - automatically answer a call&lt;br&gt;
+&lt;/p&gt;
+&lt;p&gt;
+When the script does not write an action to stdout, then the default action is continue.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;reason: &lt;/b&gt;
+With the reason parameter you can set the reason string for reject or dnd. This might be shown to the far-end user.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;caller_name: &lt;/b&gt;
+This parameter will override the display name of the caller.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;ringtone: &lt;/b&gt;
+The ringtone parameter specifies the .wav file that will be played as ring tone when action is continue.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+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 &lt;b&gt;SIP_&amp;lt;HEADER_NAME&amp;gt;&lt;/b&gt; E.g. SIP_FROM contains the value of the from header.
+&lt;/p&gt;
+&lt;p&gt;
+TWINKLE_TRIGGER=in_call. SIPREQUEST_METHOD=INVITE. The request-URI of the INVITE will be passed in &lt;b&gt;SIPREQUEST_URI&lt;/b&gt;. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Vous pouvez personnaliser la façon dont Twinkle gère les appels entrants. Twinkle peut appel un script quand un appel arriver. Sur la base de la sortie du script, Twinkle accepte, rejette ou redirige l&apos;appel. Si l&apos;appel est accepté, la sonnerie peut également être presonnalisée par un script. Le script peut être un programme executable.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Nota:&lt;/b&gt; Twinkle est suspendu pendant que votre script tourne. Il est recommandé que votre script ne dure pas plus de 200 ms. Quand vous avez besoin de plus de temps, vous pouvez envoyer les paramètres suivis de &lt;b&gt;end&lt;/b&gt; et continuer d&apos;executer. Twinkle continuera quand il recevra le paramètre &lt;b&gt;end&lt;/b&gt;.(new line)
+&lt;/p&gt;
+&lt;p&gt;
+Avec votre script vous pouvez personnaliser la gestion d&apos;appel en renvoyant un ou plusieurs des paramètres suivants à stdout. Chaque paramètre doit être sur un ligne différente.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+action=[ continue | reject | dnd | redirect | autoanswer ]&lt;br&gt;
+reason=&amp;lt;string&amp;gt;&lt;br&gt;
+contact=&amp;lt;adresse de redirection&amp;gt;&lt;br&gt;
+caller_name=&amp;lt;non de l&apos;appelant à afficher&amp;gt;&lt;br&gt;
+ringtone=&amp;lt;nom de fichier wav&amp;gt;&lt;br&gt;
+display_msg=&amp;lt;message à afficher sur l&apos;écran&amp;gt;&lt;br&gt;
+end&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;/p&gt;
+&lt;h2&gt;Paramètres&lt;/h2&gt;
+&lt;h3&gt;action&lt;/h3&gt;
+&lt;p&gt;
+&lt;b&gt;continue&lt;/b&gt; - poursuivre la gestion d&apos;appel comme d&apos;habitude&lt;br&gt;
+&lt;b&gt;reject&lt;/b&gt; - rejeter l&apos;appel&lt;br&gt;
+&lt;b&gt;dnd&lt;/b&gt; - rejeter l&apos;appel avec un message &quot;ne pas derranger&quot;&lt;br&gt;
+&lt;b&gt;redirect&lt;/b&gt; - rediriger l&apos;appel vers l&apos;adresse de&lt;b&gt;contact&lt;/b&gt;&lt;br&gt;
+&lt;b&gt;autoanswer&lt;/b&gt; - répondre automatiquement à l&apos;appel&lt;br&gt;
+&lt;/p&gt;
+&lt;p&gt;
+Quand le script ne renvoie pas d&apos;action à stdout, alors l&apos;action par défaut se poursuit.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;reason: &lt;/b&gt;
+Avec le paramètre &quot;reason&quot; vous pouvez affecter la valeur &quot;reject&quot; ou &quot;dnd&quot;. Ce sera montré au correspondant.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;caller_name: &lt;/b&gt;
+Ce paramètre ne tient pas compte du nom l&apos;appelant affiché.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;ringtone: &lt;/b&gt;
+Ce paramètre indique quel fichier wav utiliser comme sonnerie.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+Les valeurs de toutes les entêtes SIP d&apos;un message INVITE entrant sont passées en variable d&apos;environnement à votre script. Les nom de varibles sont les suivants:&lt;b&gt;SIP_&amp;lt;HEADER_NAME&amp;gt;&lt;/b&gt; E.g. SIP_FROM contien le valeur de l&apos;entête from.
+&lt;/p&gt;
+&lt;p&gt;
+TWINKLE_TRIGGER=in_call. SIPREQUEST_METHOD=INVITE. la demande URI d&apos;une INVITE sera dans &lt;b&gt;SIPREQUEST_URI&lt;/b&gt;. le nom du profile utilisateur sera dans: &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <source>&amp;Voice mail address:</source>
+ <translation>Adresse de la &amp;boîte vocale:</translation>
+ </message>
+ <message>
+ <source>The SIP address or telephone number to access your voice mail.</source>
+ <translation>L&apos;adresse SIP ou le numéro de téléphone pour accéder à votre boît vocale.</translation>
+ </message>
+ <message>
+ <source>Unsollicited</source>
+ <translation>Non désiré</translation>
+ </message>
+ <message>
+ <source>Sollicited</source>
+ <translation>RFC 3842</translation>
+ </message>
+ <message>
+ <source>&lt;H2&gt;Message waiting indication type&lt;/H2&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;H3&gt;Unsollicited&lt;/H3&gt;
+&lt;p&gt;
+Asterisk provides unsollicited message waiting indication.
+&lt;/p&gt;
+&lt;H3&gt;Sollicited&lt;/H3&gt;
+&lt;p&gt;
+Sollicited message waiting indication as specified by RFC 3842.
+&lt;/p&gt;</source>
+ <translation>&lt;H2&gt;Type de message en attente&lt;/H2&gt;(new line)
+&lt;p&gt;(new line)
+Si votre fournisseur de service propose la signalisation d&apos;un message d&apos;attente , Twinkle peut vous indiquer qu&apos;un nouveau message est arrivé. Demander à votre fournisseur, quel type de signalisation est fourni.(new line)
+&lt;/p&gt;(new line)
+&lt;H3&gt;Non sollicité&lt;/H3&gt;(new line)
+&lt;p&gt;(new line)
+Signalisation de message en attente non sollicité .(new line)
+&lt;/p&gt;(new line)
+&lt;H3&gt;Sollicité&lt;/H3&gt;(new line)
+&lt;p&gt;(new line)
+Signalisation de message en attente sollicité com spécifié par le RFC 3842.(new line)
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;MWI type:</source>
+ <translation>Type &amp;MWI:</translation>
+ </message>
+ <message>
+ <source>Sollicited MWI</source>
+ <translation>RFC 3842</translation>
+ </message>
+ <message>
+ <source>Subscription &amp;duration:</source>
+ <translation>&amp;durée de souscription:</translation>
+ </message>
+ <message>
+ <source>Mailbox &amp;user name:</source>
+ <translation>Nom d&apos;&amp;utilisateur de boîte vocale:</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of your voice mailbox server.</source>
+ <translation>Le nom d l&apos;hôte, le nom de domaine ou l&apos;adresse IP du serveur de boîte vocale.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Pour le RFC 3842 MWI sollicité, un terminal souscrit au message de statut pour une durée limité. Juste avant l&apos;expiration le terminal doit raffraichir la subcription.</translation>
+ </message>
+ <message>
+ <source>Your user name for accessing your voice mailbox.</source>
+ <translation>Votre nom d&apos;utilisateur de boîte vocale.</translation>
+ </message>
+ <message>
+ <source>Mailbox &amp;server:</source>
+ <translation>&amp;Server de boîte vocale:</translation>
+ </message>
+ <message>
+ <source>Via outbound &amp;proxy</source>
+ <translation>Via &amp;proxy sortant</translation>
+ </message>
+ <message>
+ <source>Check this option if Twinkle should send SIP messages to the mailbox server via the outbound proxy.</source>
+ <translation>Cocher cette case si Twinkle doit envoyer les messages au serveur de boîte vocale par un proxy sortant.</translation>
+ </message>
+ <message>
+ <source>You must fill in a mailbox user name.</source>
+ <translation>Vous devez saisir un nom d&apos;utilisateur de boîte vocale.</translation>
+ </message>
+ <message>
+ <source>You must fill in a mailbox server</source>
+ <translation>Vous devez saisir un nom de serveur de boîte vocale</translation>
+ </message>
+ <message>
+ <source>Invalid mailbox server.</source>
+ <translation>Serveur de boîte vocale invalide.</translation>
+ </message>
+ <message>
+ <source>Invalid mailbox user name.</source>
+ <translation>Nom d&apos;utilisateur de boîte vocale invalide.</translation>
+ </message>
+ <message>
+ <source>Use domain &amp;name to create a unique contact header value</source>
+ <translation>Utiliser le &amp;nom de domaine pour créer une valeur unique de l&apos;entête de contact</translation>
+ </message>
+ <message>
+ <source>Select ring back tone file.</source>
+ <translation>Sélectionnez votre sonnerie de tonalité.</translation>
+ </message>
+ <message>
+ <source>Select ring tone file.</source>
+ <translation>Sélectionner un fichier de sonnerie.</translation>
+ </message>
+ <message>
+ <source>Select script file.</source>
+ <translation>Sélectionner un script.</translation>
+ </message>
+ <message>
+ <source>%1 converts to %2</source>
+ <translation>%1 convertit en %2</translation>
+ </message>
+ <message>
+ <source>Instant message</source>
+ <translation>Message instantané</translation>
+ </message>
+ <message>
+ <source>Presence</source>
+ <translation>Présence</translation>
+ </message>
+ <message>
+ <source>&amp;Maximum number of sessions:</source>
+ <translation>Nombre &amp;maximum de sessions:</translation>
+ </message>
+ <message>
+ <source>When you have this number of instant message sessions open, new incoming message sessions will be rejected.</source>
+ <translation>Quand ce nombre de sessions de message instantané est atteint, les nouvelles sessions de message entrant seront rejetées.</translation>
+ </message>
+ <message>
+ <source>Your presence</source>
+ <translation>Votre présence</translation>
+ </message>
+ <message>
+ <source>&amp;Publish availability at startup</source>
+ <translation>&amp;Publier la disponibilité au démarrage</translation>
+ </message>
+ <message>
+ <source>Publish your availability at startup.</source>
+ <translation>Publier la disponibilité au démarrage.</translation>
+ </message>
+ <message>
+ <source>Buddy presence</source>
+ <translation>Présence d&apos;avatar</translation>
+ </message>
+ <message>
+ <source>Publication &amp;refresh interval (sec):</source>
+ <translation>Intervalle d&apos;&amp;actualisation de la publication (sec):</translation>
+ </message>
+ <message>
+ <source>Refresh rate of presence publications.</source>
+ <translation>Période d&apos;actualisation de la publication de votre présence.</translation>
+ </message>
+ <message>
+ <source>&amp;Subscription refresh interval (sec):</source>
+ <translation>Intervalle d&apos;&amp;actualisation de la connexion (sec):</translation>
+ </message>
+ <message>
+ <source>Refresh rate of presence subscriptions.</source>
+ <translation>Période d&apos;actualisation de la connexion.</translation>
+ </message>
+ <message>
+ <source>Transport/NAT</source>
+ <translation>Transport/NAT</translation>
+ </message>
+ <message>
+ <source>Add q-value to registration</source>
+ <translation>Ajouter la q-value à la connexion</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>La q-value indique la priorité de l&apos;interface connectée. Si en plus de Twinkle, vous connectez une autre interface SIP pour ce compte, alors le réseau utilisera ces valeurs pour déterminer quelle interface tester en premier pour effectuer un appel.</translation>
+ </message>
+ <message>
+ <source>The q-value is a value between 0.000 and 1.000. A higher value means a higher priority.</source>
+ <translation>La q-value est une valeur comprise ent 0.000 et 1.000. Une valeur superieure signifie une priorité plus importante.</translation>
+ </message>
+ <message>
+ <source>SIP transport</source>
+ <translation>Transport SIP</translation>
+ </message>
+ <message>
+ <source>UDP</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Mode de transport SIP. En mode auto, la taille du message détermine quel protocole de transport utiliser. Les messages plus grand que la limite de l&apos;UDP sont envoyés via TCP.</translation>
+ </message>
+ <message>
+ <source>T&amp;ransport protocol:</source>
+ <translation>Protocole de T&amp;ransport:</translation>
+ </message>
+ <message>
+ <source>UDP t&amp;hreshold:</source>
+ <translation>&amp;Limite UDP:</translation>
+ </message>
+ <message>
+ <source> bytes</source>
+ <translation type="obsolete">octets</translation>
+ </message>
+ <message>
+ <source>Messages larger than the threshold are sent via TCP. Smaller messages are sent via UDP.</source>
+ <translation>Les messages plus grand que la limite sont envoyés via TCP. Les messages plus petits sont envoyés via UDP.</translation>
+ </message>
+ <message>
+ <source>Use &amp;STUN (does not work for incoming TCP)</source>
+ <translation>Utiliser &amp;STUN (ne fonctionne pas pour le TCP entrant)</translation>
+ </message>
+ <message>
+ <source>P&amp;ersistent TCP connection</source>
+ <translation>Connexion TCP p&amp;ercistante</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Conserve la connexion TCP pendant l&apos;ouverture de l&apos;enregistrement de façon à ce que le proxy SIP puisse réutiliser cette connexion pour envoyer des requêtes. Des ping sont enoyés pour tester si la connexion est toujours en établie.</translation>
+ </message>
+ <message>
+ <source>&amp;Send composing indications when typing a message.</source>
+ <translation>&amp;Envoi de l&apos;indication composite en un message.</translation>
+ </message>
+ <message>
+ <source>Twinkle sends a composing indication when you type a message. This way the recipient can see that you are typing.</source>
+ <translation>Twinkle envoie une indication composite quand vous écrivez un message. Ainsi, l&apos;interlocuteur peut voir que vous êtes en train d&apos;écrire un message.</translation>
+ </message>
+ <message>
+ <source>AKA AM&amp;F:</source>
+ <translation>AKA AM&amp;F:</translation>
+ </message>
+ <message>
+ <source>A&amp;KA OP:</source>
+ <translation>A&amp;KA OP:</translation>
+ </message>
+ <message>
+ <source>Authentication management field for AKAv1-MD5 authentication.</source>
+ <translation>Champ de gestion de l&apos;authentification en AKAv1-MD5.</translation>
+ </message>
+ <message>
+ <source>Operator variant key for AKAv1-MD5 authentication.</source>
+ <translation>Clé de l&apos;opérateur en AKAv1-MD5.</translation>
+ </message>
+ <message>
+ <source>Prepr&amp;ocessing</source>
+ <translation>Préinterprétati&amp;on</translation>
+ </message>
+ <message>
+ <source>Preprocessing (improves quality at remote end)</source>
+ <translation>La préinterpretation améliore la qualité distante</translation>
+ </message>
+ <message>
+ <source>&amp;Automatic gain control</source>
+ <translation>Contrôle &amp;automatique du gain</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Le contrôle automatique du gain (AGC) tient compte de la possible variation importante du volume d&apos;enregistrement entre deux paramètres. L&apos;AGC permet d&apos;ajuste le volume de référence. Ceci est très pratique car il supprime la nécessité d&apos;ajuster le gain du microphone manuellement. Un autre avantage est de permettre de régler le gain du microphone à un niveau assez bas pour éviter les coupures.</translation>
+ </message>
+ <message>
+ <source>Automatic gain control &amp;level:</source>
+ <translation>&amp;Niveau du contrôle automtaique du gain:</translation>
+ </message>
+ <message>
+ <source>Automatic gain control level represents percentual value of automatic gain setting of a microphone. Recommended value is about 25%.</source>
+ <translation>Ce niveau représente un pourcentage du gain du microphone. La valeur recommandée est 25%.</translation>
+ </message>
+ <message>
+ <source>&amp;Voice activity detection</source>
+ <translation>Détection de l&apos;activité de la &amp;voix</translation>
+ </message>
+ <message>
+ <source>When enabled, voice activity detection detects whether the input signal represents a speech or a silence/background noise.</source>
+ <translation>La détection de l&apos;activité détecte si le signal d&apos;entrée est de la parole ou du silence/bruit de fond et ne transmet pas ce bruit.</translation>
+ </message>
+ <message>
+ <source>&amp;Noise reduction</source>
+ <translation>Réduction du &amp;bruit</translation>
+ </message>
+ <message>
+ <source>The noise reduction can be used to reduce the amount of background noise present in the input signal. This provides higher quality speech.</source>
+ <translation>La réduction du bruit peut être utilisée pour réduire le niveau de bruit de fond dans le signal d&apos;entrée. Ceci améliore la qualité du son.</translation>
+ </message>
+ <message>
+ <source>Acoustic &amp;Echo Cancellation</source>
+ <translation>Suppression de l&apos;&amp;Echo</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Dans toute communication VOIP, si le son venant du correspondant est sur amplificateur, il est enregistré par le microphone. Si le son enregistré par le micropohne est directement envoyé au correspondant, alors il entend sa voix en écho. La suppression de l&apos;écho est consue pour supprimer cet écho avant qu&apos;il ne soit transmis. Il est important de comprendre que la suppression de l&apos;écho est consue pour améliorer la qualite du son pour le correspondant.</translation>
+ </message>
+ <message>
+ <source>Variable &amp;bit-rate</source>
+ <translation>Taux de compression varia&amp;ble</translation>
+ </message>
+ <message>
+ <source>Discontinuous &amp;Transmission</source>
+ <translation>&amp;Transmission discontinue</translation>
+ </message>
+ <message>
+ <source>&amp;Quality:</source>
+ <translation>&amp;Qualité:</translation>
+ </message>
+ <message>
+ <source>Speex is a lossy codec, which means that it achives 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.</source>
+ <translation>Speex est un codec à perte, ce qui signifie qu&apos;il assure la compression au dépend de la fidélité au son d&apos;entrée. A la différence de quelques autres codecs, il est possible de contrôler l&apos;équilibre entre qualité et compression. Le pocessus d&apos;encodage Speex est contrôlé la plupart du temps par un paramêtre de qualité entre 0 et 10.</translation>
+ </message>
+ <message>
+ <source>bytes</source>
+ <translation>octets</translation>
+ </message>
+ <message>
+ <source>Use tel-URI for telephone &amp;number</source>
+ <translation>Utiliser tel-URI comme &amp;numéro de téléphone</translation>
+ </message>
+ <message>
+ <source>Expand a dialed telephone number to a tel-URI instead of a sip-URI.</source>
+ <translation>Transcrit un numéro de téléphone entré en tel-URI et non en sip-URI.</translation>
+ </message>
+ <message>
+ <source>Accept call &amp;transfer request (incoming REFER)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allow call transfer while consultation in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable NAT &amp;keep alive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send UDP NAT keep alive packets.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WizardForm</name>
+ <message>
+ <source>Twinkle - Wizard</source>
+ <translation>Twinkle - Assitant</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of the STUN server.</source>
+ <translation>Le nom d l&apos;hôte, le nom de domaine ou l&apos;adresse IP du serveur STUN.</translation>
+ </message>
+ <message>
+ <source>S&amp;TUN server:</source>
+ <translation>Serveur S&amp;TUN:</translation>
+ </message>
+ <message>
+ <source>The SIP user name given to you by your provider. It is the user part in your SIP address, &lt;b&gt;username&lt;/b&gt;@domain.com This could be a telephone number.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>Le nom d&apos;utilisateur SIP donné par votre fournisseur de service. C&apos;est la partie &quot;utilisateur&quot; de votre adresse SIP, &lt;b&gt;utilisateur&lt;/b&gt;@domain.com.
+Ceci peut être un numéro de téléphone.
+&lt;br&gt;&lt;br&gt;
+Ce champ est obligatoire.</translation>
+ </message>
+ <message>
+ <source>&amp;Domain*:</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Choose your SIP service provider. If your SIP service provider is not in the list, then select &lt;b&gt;Other&lt;/b&gt; and fill in the settings you received from your provider.&lt;br&gt;&lt;br&gt;
+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.</source>
+ <translation>Sélectionnez votre fournisseur de service SIP. S&apos;il n&apos;es pas dans la liste, sélectionnez &lt;b&gt;Autre&lt;/b&gt; et remplissez les paramètres que vous avez reçu de votre fournisseur.&lt;br&gt;&lt;br&gt;
+Si vous sélectionnez un des fournisseurs prédéfinis, vous n&apos;avez qu&apos;à saisir votre nom, nom d&apos;utilisateur, nom d&apos;authentification, et mot de passe.</translation>
+ </message>
+ <message>
+ <source>&amp;Authentication name:</source>
+ <translation>Nom d&apos;&amp;authentification:</translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation>&amp;Votre nom:</translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation>Votre nom d&apos;authentification SIP. Souvent il est le même que votre nom d&apos;utilisateur SIP. Cependant, il peut être différent.</translation>
+ </message>
+ <message>
+ <source>The domain part of your SIP address, username@&lt;b&gt;domain.com&lt;/b&gt;. Instead of a real domain this could also be the hostname or IP address of your &lt;b&gt;SIP proxy&lt;/b&gt;. If you want direct IP phone to IP phone communications then you fill in the hostname or IP address of your computer.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>Le domaine de votre adresse SIP, username@&lt;b&gt;domain.com&lt;/b&gt;. A la place d&apos;un vrai nom de domaine, il est également possible de saisir le nom de l&apos;hôte ou l&apos;adresse IP de votre &lt;b&gt;proxy SIP&lt;/b&gt;. Si vous voulez uniquement des communications de PC à PC, saisissez le nom de l&apos;hôte ou l&apos;adresse IP de votre ordinateur.
+&lt;br&gt;&lt;br&gt;
+Ce champ est obligatoire.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>C&apos;est simplement votre nom complet, ex: Pierre Dupond. Il est utilisé pour l&apos;affichage. Quand vous ferez un appel, ceci sera montré à votre correspondant.</translation>
+ </message>
+ <message>
+ <source>SIP pro&amp;xy:</source>
+ <translation>Pro&amp;xy SIP:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Le nom d&apos;hôte, le nom de domaine ou l&apos;adresse IP de votre proxy SIP. Si c&apos;est le même valeur que votre domaine, vous pouvez laisser ce champ vide. </translation>
+ </message>
+ <message>
+ <source>&amp;SIP service provider:</source>
+ <translation>Fournisseur de service &amp;SIP:</translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>Mot de &amp;passe:</translation>
+ </message>
+ <message>
+ <source>&amp;User name*:</source>
+ <translation>Nom d&apos;&amp;utilisateur*:</translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation>Votre mot de passe pour authentification.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Annuler (Es&amp;c)</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>None (direct IP to IP calls)</source>
+ <translation>Aucun (appels directs d&apos;IP à IP)</translation>
+ </message>
+ <message>
+ <source>Other</source>
+ <translation>Autre</translation>
+ </message>
+ <message>
+ <source>User profile wizard:</source>
+ <translation>Assistant pour profil utilisateur: </translation>
+ </message>
+ <message>
+ <source>You must fill in a user name for your SIP account.</source>
+ <translation>Vous devez saisir un nom d&apos;utilisateur pour votre compte SIP.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Vous devez saisir un nom de domaine pour votre compte SIP.
+
+il est également possible de saisir le nom de l&apos;hôte ou l&apos;adresse IP de votre PC si vous voulez faire des appels directs de PC à PC.</translation>
+ </message>
+ <message>
+ <source>Invalid value for SIP proxy.</source>
+ <translation>Valeur invalide pour le proxy SIP.</translation>
+ </message>
+ <message>
+ <source>Invalid value for STUN server.</source>
+ <translation>Valeur invalide pour le serveur STUN.</translation>
+ </message>
+</context>
+<context>
+ <name>YesNoDialog</name>
+ <message>
+ <source>&amp;Yes</source>
+ <translation>&amp;Oui</translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation>&amp;Non</translation>
+ </message>
+</context>
+</TS>
diff --git a/src/gui/lang/twinkle_nl.ts b/src/gui/lang/twinkle_nl.ts
new file mode 100644
index 0000000..e7281cd
--- /dev/null
+++ b/src/gui/lang/twinkle_nl.ts
@@ -0,0 +1,6066 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name>AddressCardForm</name>
+ <message>
+ <source>Twinkle - Address Card</source>
+ <translation>Twinkle - Adres</translation>
+ </message>
+ <message>
+ <source>&amp;Remark:</source>
+ <translation>Op&amp;merkingen:</translation>
+ </message>
+ <message>
+ <source>Infix name of contact.</source>
+ <translation>Tussenvoegsel.</translation>
+ </message>
+ <message>
+ <source>First name of contact.</source>
+ <translation>Voornaam.</translation>
+ </message>
+ <message>
+ <source>&amp;First name:</source>
+ <translation>Voor&amp;naam:</translation>
+ </message>
+ <message>
+ <source>You may place any remark about the contact here.</source>
+ <translation>Hier kunt u opmerkingen kwijt.</translation>
+ </message>
+ <message>
+ <source>&amp;Phone:</source>
+ <translation>&amp;Telefoon:</translation>
+ </message>
+ <message>
+ <source>&amp;Infix name:</source>
+ <translation>Tu&amp;ssenvoegsel:</translation>
+ </message>
+ <message>
+ <source>Phone number or SIP address of contact.</source>
+ <translation>Telefoonnummer of SIP adres.</translation>
+ </message>
+ <message>
+ <source>Last name of contact.</source>
+ <translation>Achternaam.</translation>
+ </message>
+ <message>
+ <source>&amp;Last name:</source>
+ <translation>&amp;Achternaam:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>You must fill in a name.</source>
+ <translation>U moet een naam invullen.</translation>
+ </message>
+ <message>
+ <source>You must fill in a phone number or SIP address.</source>
+ <translation>U moet een telefoonnummer of SIP adres invullen.</translation>
+ </message>
+</context>
+<context>
+ <name>AuthenticationForm</name>
+ <message>
+ <source>Twinkle - Authentication</source>
+ <translation>Twinkle - Authenticatie</translation>
+ </message>
+ <message>
+ <source>The user for which authentication is requested.</source>
+ <translation>De gebruiker waarvoor authenticatie vereist is.</translation>
+ </message>
+ <message>
+ <source>The user profile of the user for which authentication is requested.</source>
+ <translation>Het gebruikersprofiel van de gebruiker.</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Gebruikersprofiel:</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Gebruiker:</translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>&amp;Paswoord:</translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation>Uw paswoord voor authenticatie.</translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation>Uw SIP gebruikersnaam voor authenticatie. Meestal is dit hetzelfde als uw SIP gebruikersnaam.</translation>
+ </message>
+ <message>
+ <source>&amp;User name:</source>
+ <translation>&amp;Gebruikersnaam:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+ <message>
+ <source>Login required for realm:</source>
+ <translation>Realm:</translation>
+ </message>
+ <message>
+ <source>The realm for which you need to authenticate.</source>
+ <translation>De &quot;realm&quot; waarvoor u zich moet authenticeren.</translation>
+ </message>
+ <message>
+ <source>user</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>profile</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>realm</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>BuddyForm</name>
+ <message>
+ <source>Twinkle - Buddy</source>
+ <translation>Twinkle - Vriend</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adresboek</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Kies een adres uit het adresboek.</translation>
+ </message>
+ <message>
+ <source>&amp;Phone:</source>
+ <translation>&amp;Telefoon:</translation>
+ </message>
+ <message>
+ <source>Name of your buddy.</source>
+ <translation>Naam van uw vriend.</translation>
+ </message>
+ <message>
+ <source>&amp;Show availability</source>
+ <translation>&amp;Toon beschikbaarheid</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+T</translation>
+ </message>
+ <message>
+ <source>Check this option if you want to see the availability of your buddy. This will only work if your provider offers a presence agent.</source>
+ <translation>Vink deze optie aan als u de beschikbaarheid van uw vriend wilt zien. Dit werkt alleen als uw provider een presence agent heeft.</translation>
+ </message>
+ <message>
+ <source>&amp;Name:</source>
+ <translation>&amp;Naam:</translation>
+ </message>
+ <message>
+ <source>SIP address your buddy.</source>
+ <translation>SIP adres van uw vriend.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>You must fill in a name.</source>
+ <translation>U moet een naam invullen.</translation>
+ </message>
+ <message>
+ <source>Invalid phone.</source>
+ <translation>Foutief telefoonnummer.</translation>
+ </message>
+ <message>
+ <source>Failed to save buddy list: %1</source>
+ <translation>Opslaan van vriendenlijst is mislukt: %1</translation>
+ </message>
+</context>
+<context>
+ <name>BuddyList</name>
+ <message>
+ <source>Availability</source>
+ <translation>Beschikbaarheid</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>onbekend</translation>
+ </message>
+ <message>
+ <source>offline</source>
+ <translation>offline</translation>
+ </message>
+ <message>
+ <source>online</source>
+ <translation>online</translation>
+ </message>
+ <message>
+ <source>request rejected</source>
+ <translation>verzoek geweigerd</translation>
+ </message>
+ <message>
+ <source>not published</source>
+ <translation>niet gepubliceerd</translation>
+ </message>
+ <message>
+ <source>failed to publish</source>
+ <translation>publicatie mislukt</translation>
+ </message>
+ <message>
+ <source>request failed</source>
+ <translation>verzoel mislukt</translation>
+ </message>
+ <message>
+ <source>Click right to add a buddy.</source>
+ <translation>Klik rechts om een vriend toe te voegen.</translation>
+ </message>
+</context>
+<context>
+ <name>CoreAudio</name>
+ <message>
+ <source>Failed to open sound card</source>
+ <translation>Openen geluidskaart mislukt</translation>
+ </message>
+ <message>
+ <source>Failed to create a UDP socket (RTP) on port %1</source>
+ <translation>UDP socket (RTP) creatie op port %1 mislukt</translation>
+ </message>
+ <message>
+ <source>Failed to create audio receiver thread.</source>
+ <translation>Creatie van audio receiver thread mislukt.</translation>
+ </message>
+ <message>
+ <source>Failed to create audio transmitter thread.</source>
+ <translation>Creatie van audio transmitter thread mislukt.</translation>
+ </message>
+</context>
+<context>
+ <name>CoreCallHistory</name>
+ <message>
+ <source>local user</source>
+ <translation>lokale partij</translation>
+ </message>
+ <message>
+ <source>remote user</source>
+ <translation>andere partij</translation>
+ </message>
+ <message>
+ <source>failure</source>
+ <translation>fout</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>onbekend</translation>
+ </message>
+ <message>
+ <source>in</source>
+ <translation>in</translation>
+ </message>
+ <message>
+ <source>out</source>
+ <translation>uit</translation>
+ </message>
+</context>
+<context>
+ <name>DeregisterForm</name>
+ <message>
+ <source>Twinkle - Deregister</source>
+ <translation>Twinkle - Deregistreren</translation>
+ </message>
+ <message>
+ <source>deregister all devices</source>
+ <translation>deregistreer alle apparaten</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+</context>
+<context>
+ <name>DiamondcardProfileForm</name>
+ <message>
+ <source>Twinkle - Diamondcard User Profile</source>
+ <translation>Twinkle - Diamondcard gebruikersprofiel</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;With a Diamondcard account you can make worldwide calls to regular and cell phones. To sign up for a Diamondcard account click on the &quot;sign up&quot; link below. Once you have signed up you receive an account ID and PIN code. Enter the account ID and PIN code below to create a Twinkle user profile for your Diamondcard account.&lt;/p&gt;
+&lt;p&gt;For call rates see the sign up web page that will be shown to you when you click on the &quot;sign up&quot; link.&lt;/p&gt;</source>
+ <translation type="obsolete">&lt;p&gt;Met een Diamondcard account kunt u wereldwijd bellen naar vaste en mobiele telefoons. U kunt zich aanmelden voor een Diamondcard account door op de onderstaande &quot;aanmelden&quot; link te klikken. Na aanmelding ontvangt u een account ID en PIN code. Voer dit account ID en de PIN code hieronder in om een Twinkle gebruikersprofiel voor uw Diamondcard account te maken.&lt;/p&gt;
+&lt;p&gt;Beltarieven kunt u vinden op de aanmeldingspagina die u krijgt als u op de &quot;aanmelden&quot; link klinkt.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Your Diamondcard account ID.</source>
+ <translation>Uw Diamondcard account ID.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Dit is uw eigen naam. bijv. Jan Jansen. Als u iemand belt, kan deze naam getoond worden.</translation>
+ </message>
+ <message>
+ <source>&amp;Account ID:</source>
+ <translation>&amp;Account ID:</translation>
+ </message>
+ <message>
+ <source>&amp;PIN code:</source>
+ <translation>&amp;PIN code:</translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation>U&amp;w naam:</translation>
+ </message>
+ <message>
+ <source>&lt;p align=&quot;center&quot;&gt;&lt;u&gt;Sign up for a Diamondcard account&lt;/u&gt;&lt;/p&gt;</source>
+ <translation>&lt;p align=&quot;center&quot;&gt;&lt;u&gt;Aanmelden voor een Diamondcard account&lt;/u&gt;&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Fill in your account ID.</source>
+ <translation>Vul uw account ID in.</translation>
+ </message>
+ <message>
+ <source>Fill in your PIN code.</source>
+ <translation>Vul uw PIN code in.</translation>
+ </message>
+ <message>
+ <source>A user profile with name %1 already exists.</source>
+ <translation>Een gebruikersprofiel met de naam %1 bestaat al.</translation>
+ </message>
+ <message>
+ <source>Your Diamondcard PIN code.</source>
+ <translation>Uw Diamondcard PIN code.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;With a Diamondcard account you can make worldwide calls to regular and cell phones and send SMS messages. To sign up for a Diamondcard account click on the &quot;sign up&quot; link below. Once you have signed up you receive an account ID and PIN code. Enter the account ID and PIN code below to create a Twinkle user profile for your Diamondcard account.&lt;/p&gt;
+&lt;p&gt;For call rates see the sign up web page that will be shown to you when you click on the &quot;sign up&quot; link.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Met een Diamondcard account kunt u wereldwijd bellen naar vaste en mobiele telefoons en SMS berichten versturen. U kunt zich aanmelden voor een Diamondcard account door op de onderstaande &quot;aanmelden&quot; link te klikken. Na aanmelding ontvangt u een account ID en PIN code. Voer dit account ID en de PIN code hieronder in om een Twinkle gebruikersprofiel voor uw Diamondcard account te maken.&lt;/p&gt;
+&lt;p&gt;Beltarieven kunt u vinden op de aanmeldingspagina die u krijgt als u op de &quot;aanmelden&quot; link klinkt.&lt;/p&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>DtmfForm</name>
+ <message>
+ <source>Twinkle - DTMF</source>
+ <translation>Twinkle - DTMF</translation>
+ </message>
+ <message>
+ <source>Keypad</source>
+ <translation>Toetsen</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>Over decadic A. Normally not needed.</source>
+ <translation>A (normaal niet nodig).</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>Over decadic B. Normally not needed.</source>
+ <translation>B (normaal niet nodig).</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>Over decadic C. Normally not needed.</source>
+ <translation>C (normaal niet nodig).</translation>
+ </message>
+ <message>
+ <source>Star (*)</source>
+ <translation>Ster (*)</translation>
+ </message>
+ <message>
+ <source>0</source>
+ <translation>0</translation>
+ </message>
+ <message>
+ <source>Pound (#)</source>
+ <translation>Hekje (#)</translation>
+ </message>
+ <message>
+ <source>Over decadic D. Normally not needed.</source>
+ <translation>D (normaal niet nodig).</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>&amp;Sluiten</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+S</translation>
+ </message>
+</context>
+<context>
+ <name>FreeDeskSysTray</name>
+ <message>
+ <source>Show/Hide</source>
+ <translation>Toon/Verberg</translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation>Afsluiten</translation>
+ </message>
+</context>
+<context>
+ <name>GUI</name>
+ <message>
+ <source>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.</source>
+ <translation>Geen netwerkverbinding gevonden. Twinkle gebruikt nu 127.0.0.1 als lokaal IP adres. Als u weer een netwerkverbinging heeft, dan moet u Twinkle opnieuw starten om het correcte IP adres te gebruiken.</translation>
+ </message>
+ <message>
+ <source>Terminal capabilities of %1</source>
+ <translation>Terminal eigenschappen van %1</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>onbekend</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation>geen</translation>
+ </message>
+ <message>
+ <source>%1, registration failed: %2 %3</source>
+ <translation>%1, registratie mislukt: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, registration succeeded (expires = %2 seconds)</source>
+ <translation>%1, registratie geslaagd (duur = %2 seconden)</translation>
+ </message>
+ <message>
+ <source>%1, registration failed: STUN failure</source>
+ <translation>%1, registratie mislukt: STUN fout</translation>
+ </message>
+ <message>
+ <source>%1, de-registration succeeded: %2 %3</source>
+ <translation>%1, deregistratie gesglaagd: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, fetching registrations failed: %2 %3</source>
+ <translation>%1, opvragen registraties mislukt: %2 %3</translation>
+ </message>
+ <message>
+ <source>: you are not registered</source>
+ <translation>: u bent niet geregistreerd</translation>
+ </message>
+ <message>
+ <source>: you have the following registrations</source>
+ <translation>: u heeft de volgende registraties</translation>
+ </message>
+ <message>
+ <source>: fetching registrations...</source>
+ <translation>: opvragen registraties...</translation>
+ </message>
+ <message>
+ <source>Redirecting request to: %1</source>
+ <translation>Verzoek doorgewezen naar: %1</translation>
+ </message>
+ <message>
+ <source>invalid DTMF telephone event (%1)</source>
+ <translation>foutief DTMF signaal (%1)</translation>
+ </message>
+ <message>
+ <source>Redirecting call</source>
+ <translation>Gesprek doorverwezen</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Gebruikersprofiel:</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Gebruiker:</translation>
+ </message>
+ <message>
+ <source>Do you allow the call to be redirected to the following destination?</source>
+ <translation>Staat u toe dat u wordt doorverwezen naar de volgende bestemming?</translation>
+ </message>
+ <message>
+ <source>If you don&apos;t want to be asked this anymore, then you must change the settings in the SIP protocol section of the user profile.</source>
+ <translation>Als u deze vraag niet meer wilt zien, dan kunt u dit aangeven in de SIP protocol instellingen van uw gebruikersprofiel.</translation>
+ </message>
+ <message>
+ <source>Redirecting request</source>
+ <translation>Verzoek doorverwezen</translation>
+ </message>
+ <message>
+ <source>Do you allow the %1 request to be redirected to the following destination?</source>
+ <translation>Staat u toe dat het %1 verzoek wordt doorverwezen naar de volgende bestemming?</translation>
+ </message>
+ <message>
+ <source>Transferring call</source>
+ <translation>Gesprek doorverbonden</translation>
+ </message>
+ <message>
+ <source>Request to transfer call received from:</source>
+ <translation>Verzoek om gesprek door te verbinden van:</translation>
+ </message>
+ <message>
+ <source>Do you allow the call to be transferred to the following destination?</source>
+ <translation>Staat u toe dat u wordt doorverbonden naar de volgende bestemming?</translation>
+ </message>
+ <message>
+ <source>Info:</source>
+ <translation>Info:</translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation>Waarschuwing:</translation>
+ </message>
+ <message>
+ <source>Critical:</source>
+ <translation>Ernstige fout:</translation>
+ </message>
+ <message>
+ <source>Firewall / NAT discovery...</source>
+ <translation>Firewall / NAT verkennen...</translation>
+ </message>
+ <message>
+ <source>Abort</source>
+ <translation>Afbreken</translation>
+ </message>
+ <message>
+ <source>Line %1</source>
+ <translation>Lijn %1</translation>
+ </message>
+ <message>
+ <source>Click the padlock to confirm a correct SAS.</source>
+ <translation>Klik op het hangslot om een juiste SAS te bevestigen.</translation>
+ </message>
+ <message>
+ <source>The remote user on line %1 disabled the encryption.</source>
+ <translation>De andere partij op lijn %1 heeft encryptie uitgeschakeld.</translation>
+ </message>
+ <message>
+ <source>Failed to start conference.</source>
+ <translation>Starten van conferentie mislukt.</translation>
+ </message>
+ <message>
+ <source>You can only run multiple profiles for different users.</source>
+ <translation>U kunt alleen meerdere profielen voor verschillende gebruikers starten.</translation>
+ </message>
+ <message>
+ <source>Line %1: incoming call for %2</source>
+ <translation>Lijn %1: inkomend gesprek voor %2</translation>
+ </message>
+ <message>
+ <source>Call transferred by %1</source>
+ <translation>Gesprek doorverbonden door %1</translation>
+ </message>
+ <message>
+ <source>Line %1: far end cancelled call.</source>
+ <translation>Lijn %1: andere partij heeft gesprek geannuleerd.</translation>
+ </message>
+ <message>
+ <source>Line %1: far end released call.</source>
+ <translation>Lijn %1: andere partij heeft gesprek beëindigd.</translation>
+ </message>
+ <message>
+ <source>Line %1: SDP answer from far end not supported.</source>
+ <translation>Lijn %1: SDP van andere partij wordt niet ondersteund.</translation>
+ </message>
+ <message>
+ <source>Line %1: SDP answer from far end missing.</source>
+ <translation>Lijn %1: SDP van andere partij ontbreekt.</translation>
+ </message>
+ <message>
+ <source>Line %1: Unsupported content type in answer from far end.</source>
+ <translation>Lijn %1: niet-ondersteunde &quot;content type&quot; ontvangen van andere partij.</translation>
+ </message>
+ <message>
+ <source>Line %1: no ACK received, call will be terminated.</source>
+ <translation>Lijn %1: geen ACK ontvangen, gesprek wordt afgebroken.</translation>
+ </message>
+ <message>
+ <source>Line %1: no PRACK received, call will be terminated.</source>
+ <translation>Lijn %1: geen PRACK ontvangen, gesprek wordt afgebroken.</translation>
+ </message>
+ <message>
+ <source>Line %1: PRACK failed.</source>
+ <translation>Lijn %1: PRACK mislukt.</translation>
+ </message>
+ <message>
+ <source>Line %1: failed to cancel call.</source>
+ <translation>Lijn %1: annuleren van gesprek is mislukt.</translation>
+ </message>
+ <message>
+ <source>Line %1: far end answered call.</source>
+ <translation>Lijn %1: gesprek beantwoord.</translation>
+ </message>
+ <message>
+ <source>Line %1: call failed.</source>
+ <translation>Lijn %1: gesprek mislukt.</translation>
+ </message>
+ <message>
+ <source>The call can be redirected to:</source>
+ <translation>U kunt het nogmaals proberen naar:</translation>
+ </message>
+ <message>
+ <source>Line %1: call released.</source>
+ <translation>Lijn %1: gesprek beëindigd.</translation>
+ </message>
+ <message>
+ <source>Line %1: call established.</source>
+ <translation>Lijn %1: gesprek verbonden.</translation>
+ </message>
+ <message>
+ <source>Accepted body types:</source>
+ <translation>Geaccepteerde &quot;body&quot; typen:</translation>
+ </message>
+ <message>
+ <source>Accepted encodings:</source>
+ <translation>Geaccepteerde encoderingen:</translation>
+ </message>
+ <message>
+ <source>Accepted languages:</source>
+ <translation>Geaccepteerde talen:</translation>
+ </message>
+ <message>
+ <source>Supported extensions:</source>
+ <translation>Ondersteunde extensies:</translation>
+ </message>
+ <message>
+ <source>End point type:</source>
+ <translation>Toesteltype:</translation>
+ </message>
+ <message>
+ <source>Line %1: call retrieve failed.</source>
+ <translation>Lijn %1: terughalen gesprek mislukt.</translation>
+ </message>
+ <message>
+ <source>Line %1: redirecting request to</source>
+ <translation>Lijn %1: verzoek doorverwezen naar</translation>
+ </message>
+ <message>
+ <source>Line %1: send DTMF %2</source>
+ <translation>Lijn %1: stuur DTMF %2</translation>
+ </message>
+ <message>
+ <source>Line %1: far end does not support DTMF telephone events.</source>
+ <translation>Lijn %1: andere partij ondersteund geen DTMF &quot;telephone events&quot;.</translation>
+ </message>
+ <message>
+ <source>Line %1: received notification.</source>
+ <translation>Lijn %1: notificatie ontvangen.</translation>
+ </message>
+ <message>
+ <source>Event: %1</source>
+ <translation>Gebeurtenis: %1</translation>
+ </message>
+ <message>
+ <source>State: %1</source>
+ <translation>Toestand: %1</translation>
+ </message>
+ <message>
+ <source>Reason: %1</source>
+ <translation>Reden: %1</translation>
+ </message>
+ <message>
+ <source>Progress: %1 %2</source>
+ <translation>Voortgang: %1 %2</translation>
+ </message>
+ <message>
+ <source>Line %1: call transfer failed.</source>
+ <translation>Lijn %1: doorverbinden gesprek mislukt.</translation>
+ </message>
+ <message>
+ <source>Line %1: call succesfully transferred.</source>
+ <translation>Lijn %1: doorverbinden gesprek geslaagd.</translation>
+ </message>
+ <message>
+ <source>Line %1: call transfer still in progress.</source>
+ <translation>Lijn %1: nog steeds bezig met doorverbinden gesprek.</translation>
+ </message>
+ <message>
+ <source>No further notifications will be received.</source>
+ <translation>Er komen geen notificaties meer.</translation>
+ </message>
+ <message>
+ <source>Line %1: transferring call to %2</source>
+ <translation>Lijn %1: doorverbinden gesprek met %2</translation>
+ </message>
+ <message>
+ <source>Transfer requested by %1</source>
+ <translation>Verzoek tot doorverbinden door %1</translation>
+ </message>
+ <message>
+ <source>Line %1: Call transfer failed. Retrieving original call.</source>
+ <translation>Lijn %1: doorverbinden mislukt. Oorspronkelijk gesprek wordt teruggehaald.</translation>
+ </message>
+ <message>
+ <source>Line %1: SAS confirmed.</source>
+ <translation>Lijn %1: SAS bevestigd.</translation>
+ </message>
+ <message>
+ <source>Line %1: SAS confirmation reset.</source>
+ <translation>Lijn %1: SAS bevestiging gewist.</translation>
+ </message>
+ <message>
+ <source>Line %1: call rejected.</source>
+ <translation>Lijn %1: gesprek afgewezen.</translation>
+ </message>
+ <message>
+ <source>Line %1: call redirected.</source>
+ <translation>Lijn %1: gesprek doorverwezen.</translation>
+ </message>
+ <message>
+ <source>Response on terminal capability request: %1 %2</source>
+ <translation>Antwoord op verzoek om terminal eigenschappen: %1 %2</translation>
+ </message>
+ <message>
+ <source>The following profiles are both for user %1</source>
+ <translation>De volgende profielen zijn beiden voor gebruiker %1</translation>
+ </message>
+ <message>
+ <source>Allowed requests:</source>
+ <translation>Toegestane verzoeken:</translation>
+ </message>
+ <message>
+ <source>Line %1: DTMF detected:</source>
+ <translation>Lijn %1: DTMF gedetecteerd:</translation>
+ </message>
+ <message>
+ <source>Failed to create a UDP socket (SIP) on port %1</source>
+ <translation type="obsolete">Opzetten UDP socket (SIP) op port %1 mislukt</translation>
+ </message>
+ <message>
+ <source>Override lock file and start anyway?</source>
+ <translation>Wilt u het lock bestand overschrijven en opstarten?</translation>
+ </message>
+ <message>
+ <source>%1, voice mail status failure.</source>
+ <translation>%1, voice mail status fout.</translation>
+ </message>
+ <message>
+ <source>%1, voice mail status rejected.</source>
+ <translation>%1, voice mail status geweigerd.</translation>
+ </message>
+ <message>
+ <source>%1, voice mailbox does not exist.</source>
+ <translation>%1, voice mailbox bestaat niet.</translation>
+ </message>
+ <message>
+ <source>%1, voice mail status terminated.</source>
+ <translation>%1, voice mail status beëindigd.</translation>
+ </message>
+ <message>
+ <source>%1, STUN request failed: %2 %3</source>
+ <translation>%1, STUN verzoek mislukt: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, STUN request failed.</source>
+ <translation>%1, STUN verzoek mislukt.</translation>
+ </message>
+ <message>
+ <source>%1, de-registration failed: %2 %3</source>
+ <translation>%1, deregistratie mislukt: %2 %3</translation>
+ </message>
+ <message>
+ <source>Request to transfer call received.</source>
+ <translation>Verzoek om gesprek door te verbinden.</translation>
+ </message>
+ <message>
+ <source>If these are users for different domains, then enable the following option in your user profile (SIP protocol)</source>
+ <translation>Als dit gebruikers in verschillende domeinen zijn, dan moet u de volgende optie in uw gebruikersprofiel (SIP protocol) aanzetten</translation>
+ </message>
+ <message>
+ <source>Use domain name to create a unique contact header</source>
+ <translation>Gebruik domeinnaam voor een unieke contact header</translation>
+ </message>
+ <message>
+ <source>Failed to create a %1 socket (SIP) on port %2</source>
+ <translation>SIP %1 poort kan niet geopend worden</translation>
+ </message>
+ <message>
+ <source>Accepted by network</source>
+ <translation>Geaccepteerd door netwerk</translation>
+ </message>
+ <message>
+ <source>Failed to save message attachment: %1</source>
+ <translation>Opslaan van bijlage %1 mislukt</translation>
+ </message>
+ <message>
+ <source>Transferred by: %1</source>
+ <translation>Doorverbonden door: %1</translation>
+ </message>
+ <message>
+ <source>Cannot open web browser: %1</source>
+ <translation>Web browser kan niet geopend worden: %1</translation>
+ </message>
+ <message>
+ <source>Configure your web browser in the system settings.</source>
+ <translation>Configureer uw web browser in de systeeminstellingen.</translation>
+ </message>
+</context>
+<context>
+ <name>GetAddressForm</name>
+ <message>
+ <source>Twinkle - Select address</source>
+ <translation>Twinkle - Kies adres</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Naam</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Type</translation>
+ </message>
+ <message>
+ <source>Phone</source>
+ <translation>Telefoon</translation>
+ </message>
+ <message>
+ <source>&amp;Show only SIP addresses</source>
+ <translation>&amp;Toon alleen SIP adressen</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+T</translation>
+ </message>
+ <message>
+ <source>Check this option when you only want to see contacts with SIP addresses, i.e. starting with &quot;&lt;b&gt;sip:&lt;/b&gt;&quot;.</source>
+ <translation>Vink deze optie aan als u alleen contacten met een SIP adres wilt zien, d.w.z. adressen die starten met &quot;&lt;b&gt;sip:&lt;/b&gt;&quot;.</translation>
+ </message>
+ <message>
+ <source>&amp;Reload</source>
+ <translation>&amp;Herladen</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt+H</translation>
+ </message>
+ <message>
+ <source>Reload the list of addresses from KAddressbook.</source>
+ <translation>Haal de adressen opnieuw op uit KAddressbook.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>&amp;KAddressBook</source>
+ <translation>&amp;KAddressBook</translation>
+ </message>
+ <message>
+ <source>This list of addresses is taken from &lt;b&gt;KAddressBook&lt;/b&gt;. 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.</source>
+ <translation>Deze lijst met adressen komt uit &lt;b&gt;KAddressBook&lt;/b&gt;. Contacten waarvoor u geen telefoonnummer heeft opgenomen staan niet in deze lijst. Om adresinformatie te wijzigen moet u KAddressBook gebruiken.</translation>
+ </message>
+ <message>
+ <source>&amp;Local address book</source>
+ <translation>&amp;Lokaal adresboek</translation>
+ </message>
+ <message>
+ <source>Remark</source>
+ <translation>Opmerkingen</translation>
+ </message>
+ <message>
+ <source>Contacts in the local address book of Twinkle.</source>
+ <translation>Adresgegevens uit het lokale adresboek van Twinkle.</translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation>To&amp;evoegen</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+E</translation>
+ </message>
+ <message>
+ <source>Add a new contact to the local address book.</source>
+ <translation>Voeg een adres toe aan het lokale adresboek.</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Verwijderen</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>Delete a contact from the local address book.</source>
+ <translation>Verwijder een adres uit het lokale adresboek.</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Bewerk</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation>Alt+B</translation>
+ </message>
+ <message>
+ <source>Edit a contact from the local address book.</source>
+ <translation>Wijzig adresgegevens.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You seem not to have any contacts with a phone number in &lt;b&gt;KAddressBook&lt;/b&gt;, KDE&apos;s address book application. Twinkle retrieves all contacts with a phone number from KAddressBook. To manage your contacts you have to use KAddressBook.&lt;p&gt;As an alternative you may use Twinkle&apos;s local address book.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;U heeft geen contacten met een telefoonnummer in &lt;b&gt;KAddressBook&lt;/b&gt;, KDE&apos;s adresboek applicatie. Twinkle haalt alle contacten met een telefoonnummer uit KAdressBook. Om uw contacten te beheren, moet u KAddressbook gebruiken.&lt;/p&gt;
+&lt;p&gt;Als alternatief kunt u het lokale adresboek van Twinkle gebruiken.&lt;/p&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>GetProfileNameForm</name>
+ <message>
+ <source>Twinkle - Profile name</source>
+ <translation>Twinkle - Profielnaam</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+ <message>
+ <source>Enter a name for your profile:</source>
+ <translation>Voer de naam voor uw profiel in:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The name of your profile&lt;/b&gt;
+&lt;br&gt;&lt;br&gt;
+A profile contains your user settings, e.g. your user name and password. You have to give each profile a name.
+&lt;br&gt;&lt;br&gt;
+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.
+&lt;br&gt;&lt;br&gt;
+To remember your profiles easily you could use your SIP user name as a profile name, e.g. &lt;b&gt;example@example.com&lt;/b&gt;</source>
+ <translation>&lt;b&gt;De naam van uw profiel&lt;/b&gt;
+&lt;br&gt;&lt;br&gt;
+Een profiel bevat uw gebruikersinstellingen, bijv. uw gebruikersnaam en paswoord. U moet elk profiel een naam geven.
+&lt;br&gt;&lt;br&gt;
+Als u meerde SIP accounts heeft, dan kunt u meerdere profielen maken. Als u Twinkle opstart dan krijgt u een lijst met alle profielnamen te zien. Uit deze lijst kunt u kiezen welk profiel u wilt starten.
+&lt;br&gt;&lt;br&gt;
+Om uw gebruikersprofielen makkelijk uit elkaar te houden kunt u uw SIP gebruikersnaam als profielnaam gebruiken, bijv. &lt;b&gt;example@example.com&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Cannot find .twinkle directory in your home directory.</source>
+ <translation>.twinkle folder kan niet gevonden worden in uw thuis folder.</translation>
+ </message>
+ <message>
+ <source>Profile already exists.</source>
+ <translation>Profiel bestaat al.</translation>
+ </message>
+ <message>
+ <source>Rename profile &apos;%1&apos; to:</source>
+ <translation>Hernoem profiel &apos;%1&apos; naar:</translation>
+ </message>
+</context>
+<context>
+ <name>HistoryForm</name>
+ <message>
+ <source>Twinkle - Call History</source>
+ <translation>Twinkle - Gesprekshistorie</translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation>Tijd</translation>
+ </message>
+ <message>
+ <source>From/To</source>
+ <translation>Van/Naar</translation>
+ </message>
+ <message>
+ <source>Subject</source>
+ <translation>Onderwerp</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Status</translation>
+ </message>
+ <message>
+ <source>Call details</source>
+ <translation>Gespreksdetails</translation>
+ </message>
+ <message>
+ <source>Details of the selected call record.</source>
+ <translation>Details van het geselecteerde gesprek.</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation>Toon</translation>
+ </message>
+ <message>
+ <source>&amp;Incoming calls</source>
+ <translation>&amp;Inkomende gesprekken</translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation>Alt+I</translation>
+ </message>
+ <message>
+ <source>Check this option to show incoming calls.</source>
+ <translation>Vink deze optie aan om inkomende gesprekken te tonen.</translation>
+ </message>
+ <message>
+ <source>&amp;Outgoing calls</source>
+ <translation>&amp;Uitgaande gesprekken</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>Check this option to show outgoing calls.</source>
+ <translation>Vink deze optie aan om uitgaande gesprekken te tonen.</translation>
+ </message>
+ <message>
+ <source>&amp;Answered calls</source>
+ <translation>Be&amp;antwoorde gesprekken</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Check this option to show answered calls.</source>
+ <translation>Vink deze optie aan om beantwoorde gesprekken te tonen.</translation>
+ </message>
+ <message>
+ <source>&amp;Missed calls</source>
+ <translation>Ge&amp;miste gesprekken</translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation>Alt+M</translation>
+ </message>
+ <message>
+ <source>Check this option to show missed calls.</source>
+ <translation>Vink deze optie aan om gemiste gesprekken te tonen.</translation>
+ </message>
+ <message>
+ <source>Current &amp;user profiles only</source>
+ <translation>Alleen actieve &amp;profielen</translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation>Alt+P</translation>
+ </message>
+ <message>
+ <source>Check this option to show only calls associated with this user profile.</source>
+ <translation>Vink deze optie aan om alleen gesprekken behorende bij de nu actieve profielen te tonen.</translation>
+ </message>
+ <message>
+ <source>C&amp;lear</source>
+ <translation>&amp;Wis</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+W</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;Clear the complete call history.&lt;/p&gt;
+&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; this will clear &lt;b&gt;all&lt;/b&gt; records, also records not shown depending on the checked view options.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Wis de gehele gespreksgeschiedenig.&lt;/p&gt;
+&lt;p&gt;&lt;b&gt;Noot:&lt;/b&gt; hiermee wist u &lt;b&gt;alle&lt;/b&gt; gespreksgegevens, ook gegevens die niet getoond worden afhankelijk van de toon-opties.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>Close this window.</source>
+ <translation>Sluit dit venster.</translation>
+ </message>
+ <message>
+ <source>Call start:</source>
+ <translation>Begin:</translation>
+ </message>
+ <message>
+ <source>Call answer:</source>
+ <translation>Beantwoord:</translation>
+ </message>
+ <message>
+ <source>Call end:</source>
+ <translation>Eind:</translation>
+ </message>
+ <message>
+ <source>Call duration:</source>
+ <translation>Duur:</translation>
+ </message>
+ <message>
+ <source>Direction:</source>
+ <translation>Richting:</translation>
+ </message>
+ <message>
+ <source>From:</source>
+ <translation>Van:</translation>
+ </message>
+ <message>
+ <source>To:</source>
+ <translation>Naar:</translation>
+ </message>
+ <message>
+ <source>Reply to:</source>
+ <translation>Antwoord aan:</translation>
+ </message>
+ <message>
+ <source>Referred by:</source>
+ <translation>Doorverbonden door:</translation>
+ </message>
+ <message>
+ <source>Subject:</source>
+ <translation>Onderwerp:</translation>
+ </message>
+ <message>
+ <source>Released by:</source>
+ <translation>Beëindigd door:</translation>
+ </message>
+ <message>
+ <source>Status:</source>
+ <translation>Status:</translation>
+ </message>
+ <message>
+ <source>Far end device:</source>
+ <translation>Toestel partner:</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Gebruikersprofiel:</translation>
+ </message>
+ <message>
+ <source>conversation</source>
+ <translation>gesprek</translation>
+ </message>
+ <message>
+ <source>Call...</source>
+ <translation>Bel...</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Wis</translation>
+ </message>
+ <message>
+ <source>Re:</source>
+ <translation>Antw:</translation>
+ </message>
+ <message>
+ <source>In/Out</source>
+ <translation>In/Uit</translation>
+ </message>
+ <message>
+ <source>Call selected address.</source>
+ <translation>Bel geselecteerd adres.</translation>
+ </message>
+ <message>
+ <source>Clo&amp;se</source>
+ <translation>&amp;Sluiten</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>&amp;Call</source>
+ <translation>&amp;Bel</translation>
+ </message>
+ <message>
+ <source>Number of calls:</source>
+ <translation>Aantal gesprekken:</translation>
+ </message>
+ <message>
+ <source>###</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Total call duration:</source>
+ <translation>Totale duur:</translation>
+ </message>
+</context>
+<context>
+ <name>InviteForm</name>
+ <message>
+ <source>Twinkle - Call</source>
+ <translation>Twinkle - Bellen</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;Aan:</translation>
+ </message>
+ <message>
+ <source>Optionally you can provide a subject here. This might be shown to the callee.</source>
+ <translation>Hier kunt u optioneel een onderwerp invoeren. Dit kan getoond worden aan de gebelde partij.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adresboek</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Kies een adres uit het adresboek.</translation>
+ </message>
+ <message>
+ <source>The address that you want to call. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Het adres dat u wilt bellen. Dit kan een volledig SIP adres zijn zoals &lt;b&gt;sip:example@example.com&lt;/b&gt; of alleen een gebruikersnaam of telefoonnummer. Als u geen volledig adres invoert, dan zal Twinkle het adres afmaken met de waarde die u voor domein heeft ingevuld in uw gebruikersprofiel.</translation>
+ </message>
+ <message>
+ <source>The user that will make the call.</source>
+ <translation>Het gebruikersprofiel waarmee u het gesprek wilt maken.</translation>
+ </message>
+ <message>
+ <source>&amp;Subject:</source>
+ <translation>O&amp;nderwerp:</translation>
+ </message>
+ <message>
+ <source>&amp;From:</source>
+ <translation>&amp;Van:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+ <message>
+ <source>&amp;Hide identity</source>
+ <translation>&amp;Identiteit verbergen</translation>
+ </message>
+ <message>
+ <source>Alt+H</source>
+ <translation>Alt+I</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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 &lt;b&gt;not&lt;/b&gt; hide your IP address.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Warning:&lt;/b&gt; not all providers support identity hiding.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;
+Met deze optie verzoekt u uw SIP provider om uw identiteit verborgen te houden voor degene die u belt. Alleen uw SIP adres of telefoonnummer blijft geheim. Uw IP adres wordt &lt;b&gt;niet&lt;/b&gt; verborgen.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Waarschuwing:&lt;/b&gt; niet alle providers ondersteunen het verbergen van uw identiteit.
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Not all SIP providers support identity hiding. Make sure your SIP provider supports it if you really need it.</source>
+ <translation>Niet alle SIP providers ondersteunen het verbergen van uw identiteit. Verzeker u ervan dat uw SIP provider dit ondersteunt als u dit nodig heeft.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation>F10</translation>
+ </message>
+</context>
+<context>
+ <name>LogViewForm</name>
+ <message>
+ <source>Twinkle - Log</source>
+ <translation>Twinkle - Log</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>&amp;Sluiten</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>C&amp;lear</source>
+ <translation>&amp;Wis</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+W</translation>
+ </message>
+ <message>
+ <source>Clear the log window. This does &lt;b&gt;not&lt;/b&gt; clear the log file itself.</source>
+ <translation>Wis het log venster. Hiermee wist u &lt;b&gt;niet&lt;/b&gt; het log bestand zelf.</translation>
+ </message>
+ <message>
+ <source>Contents of the current log file (~/.twinkle/twinkle.log)</source>
+ <translation>Inhoud van het log bestand (~/.twinkle/twinkle.log)</translation>
+ </message>
+</context>
+<context>
+ <name>MessageForm</name>
+ <message>
+ <source>Twinkle - Instant message</source>
+ <translation>Twinkle - Instant bericht</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;Aan:</translation>
+ </message>
+ <message>
+ <source>The user that will send the message.</source>
+ <translation>De gebruiker die het bericht stuurt.</translation>
+ </message>
+ <message>
+ <source>The address of the user that you want to send a message. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Het adres van de persoon aan wie u een bericht wilt sturen. Dit kan een volledig SIP adres zijn zoals &lt;b&gt;sip:example@example.com&lt;/b&gt; of een een telefoonnummer. Als u geen volledig adres opgeeft, dan zal Twinkle dit adres compleet maken door de domeinnaam uit uw gebruikersprofiel toe te voegen.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adresboek</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Kies een adres uit het adresboek.</translation>
+ </message>
+ <message>
+ <source>&amp;User profile:</source>
+ <translation>&amp;Gebruikersprofiel:</translation>
+ </message>
+ <message>
+ <source>Conversation</source>
+ <translation>Conversatie</translation>
+ </message>
+ <message>
+ <source>The exchanged messages.</source>
+ <translation type="obsolete">De uitgewisselde berichten.</translation>
+ </message>
+ <message>
+ <source>Type your message here and then press &quot;send&quot; to send it.</source>
+ <translation>Typ uw bericht en druk op &quot;zend&quot; om het te verzenden.</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation>&amp;Zend</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+Z</translation>
+ </message>
+ <message>
+ <source>Send the message.</source>
+ <translation>Zend het bericht.</translation>
+ </message>
+ <message>
+ <source>Delivery failure</source>
+ <translation>Afleverfout</translation>
+ </message>
+ <message>
+ <source>Delivery notification</source>
+ <translation>Aflevernotificatie</translation>
+ </message>
+ <message>
+ <source>Instant message toolbar</source>
+ <translation>Instant berichten</translation>
+ </message>
+ <message>
+ <source>Send file...</source>
+ <translation>Zend bestand...</translation>
+ </message>
+ <message>
+ <source>Send file</source>
+ <translation>Zend bestand</translation>
+ </message>
+ <message>
+ <source>image size is scaled down in preview</source>
+ <translation>plaatje is verkleind voor preview</translation>
+ </message>
+ <message>
+ <source>Open with %1...</source>
+ <translation>Openen met %1...</translation>
+ </message>
+ <message>
+ <source>Open with...</source>
+ <translation>Openen met...</translation>
+ </message>
+ <message>
+ <source>Save attachment as...</source>
+ <translation>Bijlage opslaan als...</translation>
+ </message>
+ <message>
+ <source>File already exists. Do you want to overwrite this file?</source>
+ <translation>Bestand bestaat al. Wilt u dit bestand overschrijven?</translation>
+ </message>
+ <message>
+ <source>Failed to save attachment.</source>
+ <translation>Opslaan bijlage mislukt.</translation>
+ </message>
+ <message>
+ <source>%1 is typing a message.</source>
+ <translation>%1 schrijft een bericht.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation>F10</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>Lengte</translation>
+ </message>
+</context>
+<context>
+ <name>MessageFormView</name>
+ <message>
+ <source>sending message</source>
+ <translation>bericht wordt verstuurd</translation>
+ </message>
+</context>
+<context>
+ <name>MphoneForm</name>
+ <message>
+ <source>Twinkle</source>
+ <translation>Twinkle</translation>
+ </message>
+ <message>
+ <source>The address that you want to call. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Het adres dat u wilt bellen. Dit kan een volledig SIP adres zijn zoals &lt;b&gt;sip:example@example.com&lt;/b&gt; of alleen een gebruikersnaam of telefoonnummer. Als u geen volledig adres invoert, dan zal Twinkle het adres afmaken met de waarde die u voor domein heeft ingevuld in uw gebruikersprofiel.</translation>
+ </message>
+ <message>
+ <source>The user that will make the call.</source>
+ <translation>Het gebruikersprofiel waarmee u het gesprek wilt maken.</translation>
+ </message>
+ <message>
+ <source>&amp;User:</source>
+ <translation>&amp;Gebruiker:</translation>
+ </message>
+ <message>
+ <source>Dial</source>
+ <translation>Bel</translation>
+ </message>
+ <message>
+ <source>Dial the address.</source>
+ <translation>Bel het adres.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adresboek</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Kies een adres uit het adresboek.</translation>
+ </message>
+ <message>
+ <source>Auto answer indication.</source>
+ <translation>Indicate automatisch beantwoord.</translation>
+ </message>
+ <message>
+ <source>Call redirect indication.</source>
+ <translation>Indicatie doorverwijzen.</translation>
+ </message>
+ <message>
+ <source>Do not disturb indication.</source>
+ <translation>Indicatie niet storen.</translation>
+ </message>
+ <message>
+ <source>Missed call indication.</source>
+ <translation>Indicatie gemiste gesprekken.</translation>
+ </message>
+ <message>
+ <source>Registration status.</source>
+ <translation>Registratiestatus.</translation>
+ </message>
+ <message>
+ <source>Display</source>
+ <translation>Scherm</translation>
+ </message>
+ <message>
+ <source>Line status</source>
+ <translation>Lijnstatus</translation>
+ </message>
+ <message>
+ <source>Line &amp;1:</source>
+ <translation>Lijn &amp;1:</translation>
+ </message>
+ <message>
+ <source>Alt+1</source>
+ <translation>Alt+1</translation>
+ </message>
+ <message>
+ <source>Click to switch to line 1.</source>
+ <translation>Kliek hier om over te schakelen naar lijn 1.</translation>
+ </message>
+ <message>
+ <source>From:</source>
+ <translation>Van:</translation>
+ </message>
+ <message>
+ <source>To:</source>
+ <translation>Naar:</translation>
+ </message>
+ <message>
+ <source>Subject:</source>
+ <translation>Onderwerp:</translation>
+ </message>
+ <message>
+ <source>idle</source>
+ <translation>vrij</translation>
+ </message>
+ <message>
+ <source>Call is on hold</source>
+ <translation>Gesprek staat in de wacht</translation>
+ </message>
+ <message>
+ <source>Voice is muted</source>
+ <translation>Geluid is onderdrukt</translation>
+ </message>
+ <message>
+ <source>Conference call</source>
+ <translation>Conferentiegesprek</translation>
+ </message>
+ <message>
+ <source>Transferring call</source>
+ <translation>Gesprek doorverbonden</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+The padlock indicates that your voice is encrypted during transport over the network.
+&lt;/p&gt;
+&lt;h3&gt;SAS - Short Authentication String&lt;/h3&gt;
+&lt;p&gt;
+Both ends of an encrypted voice channel receive the same SAS on the first call. If the SAS is different at each end, your voice channel may be compromised by a man-in-the-middle attack (MitM).
+&lt;/p&gt;
+&lt;p&gt;
+If the SAS is equal at both ends, then you should confirm it by clicking this padlock for stronger security of future calls to the same destination. For subsequent calls to the same destination, you don&apos;t have to confirm the SAS again. The padlock will show a check symbol when the SAS has been confirmed.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;
+Het hangslot geeft aan dat het geluidskanaal versleuteld is tijdens transport over het netwerk.
+&lt;/p&gt;
+&lt;h3&gt;SAS - Short Authentication String&lt;/h3&gt;
+&lt;p&gt;
+Beide kanten van een versleuteld geluidskanaal ontvangen dezelfde SAS bij het eerste gesprek. Als de SAS niet hetzelfde is aan beide kanten, dan kan uw geluidskanaal gecompromiteerd zijn door een &quot;man-in-the-middle&quot; aanval (MitM).
+&lt;/p&gt;
+&lt;p&gt;
+Als de SAS aan beide kanten hetzelfde is, dan moet u die bevestigen door op het hangslot te klikken voor hogere veiligheid van toekomstige gesprekken naar dezelfde bestemming. Voor toekomstige gesprekken naar deze bestemming, hoeft u de SAS dan niet nogmaals te bevestigen. Het hangslot toont een verificatie symbool als de SAS bevestigd is.
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Short authentication string</source>
+ <translation>Short authentication string</translation>
+ </message>
+ <message>
+ <source>Audio codec</source>
+ <translation>Audio codec</translation>
+ </message>
+ <message>
+ <source>0:00:00</source>
+ <translation>0:00:00</translation>
+ </message>
+ <message>
+ <source>Call duration</source>
+ <translation>Gespreksduur</translation>
+ </message>
+ <message>
+ <source>Line &amp;2:</source>
+ <translation>Lijn &amp;2:</translation>
+ </message>
+ <message>
+ <source>Alt+2</source>
+ <translation>Alt+2</translation>
+ </message>
+ <message>
+ <source>Click to switch to line 2.</source>
+ <translation>Klik hier om over te schakelen naar lijn 2.</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;Bestand</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>Be&amp;werk</translation>
+ </message>
+ <message>
+ <source>C&amp;all</source>
+ <translation>Ge&amp;sprek</translation>
+ </message>
+ <message>
+ <source>Activate line</source>
+ <translation>Activeer lijn</translation>
+ </message>
+ <message>
+ <source>&amp;Registration</source>
+ <translation>&amp;Registratie</translation>
+ </message>
+ <message>
+ <source>&amp;Services</source>
+ <translation>&amp;Diensten</translation>
+ </message>
+ <message>
+ <source>&amp;View</source>
+ <translation>&amp;Toon</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Help</translation>
+ </message>
+ <message>
+ <source>Call Toolbar</source>
+ <translation>Gespreksbalk</translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation>Afsluiten</translation>
+ </message>
+ <message>
+ <source>&amp;Quit</source>
+ <translation>&amp;Aflsuiten</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+Q</translation>
+ </message>
+ <message>
+ <source>About Twinkle</source>
+ <translation>Over Twinkle</translation>
+ </message>
+ <message>
+ <source>&amp;About Twinkle</source>
+ <translation>Over &amp;Twinkle</translation>
+ </message>
+ <message>
+ <source>Call someone</source>
+ <translation>Iemand bellen</translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation>F5</translation>
+ </message>
+ <message>
+ <source>Answer incoming call</source>
+ <translation>Beantwoord een binnenkomend gesprek</translation>
+ </message>
+ <message>
+ <source>F6</source>
+ <translation>F6</translation>
+ </message>
+ <message>
+ <source>Release call</source>
+ <translation>Beëindig een gesprek</translation>
+ </message>
+ <message>
+ <source>Reject incoming call</source>
+ <translation>Wijs een binnenkomend gesprek af</translation>
+ </message>
+ <message>
+ <source>F8</source>
+ <translation>F8</translation>
+ </message>
+ <message>
+ <source>Put a call on hold, or retrieve a held call</source>
+ <translation>Zet een gesprek in de wacht, of haal een gesprek uit de wacht</translation>
+ </message>
+ <message>
+ <source>Redirect incoming call without answering</source>
+ <translation>Verwijs een binnenkomend gesprek naar een andere bestemming zonder te antwoorden</translation>
+ </message>
+ <message>
+ <source>Open keypad to enter digits for voice menu&apos;s</source>
+ <translation>Open een toetsenbord om cijfers in te voeren voor een stem gestuurd menu</translation>
+ </message>
+ <message>
+ <source>Register</source>
+ <translation>Registreren</translation>
+ </message>
+ <message>
+ <source>&amp;Register</source>
+ <translation>&amp;Registreren</translation>
+ </message>
+ <message>
+ <source>Deregister</source>
+ <translation>Deregistreren</translation>
+ </message>
+ <message>
+ <source>&amp;Deregister</source>
+ <translation>&amp;Deregistreren</translation>
+ </message>
+ <message>
+ <source>Deregister this device</source>
+ <translation>Deregistreer dit apparaat</translation>
+ </message>
+ <message>
+ <source>Show registrations</source>
+ <translation>Toon registraties</translation>
+ </message>
+ <message>
+ <source>&amp;Show registrations</source>
+ <translation>&amp;Toon registraties</translation>
+ </message>
+ <message>
+ <source>Terminal capabilities</source>
+ <translation>Terminal eigenschappen</translation>
+ </message>
+ <message>
+ <source>Request terminal capabilities from someone</source>
+ <translation>Vraag terminal eigenschappen van iemand op</translation>
+ </message>
+ <message>
+ <source>Do not disturb</source>
+ <translation>Niet storen</translation>
+ </message>
+ <message>
+ <source>&amp;Do not disturb</source>
+ <translation>&amp;Niet storen</translation>
+ </message>
+ <message>
+ <source>Call &amp;redirection...</source>
+ <translation>&amp;Doorverwijzen...</translation>
+ </message>
+ <message>
+ <source>Repeat last call</source>
+ <translation>Herhaal het laatste gesprek</translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation>F12</translation>
+ </message>
+ <message>
+ <source>About Qt</source>
+ <translation>Over Qt</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation>Over &amp;Qt</translation>
+ </message>
+ <message>
+ <source>&amp;User profile...</source>
+ <translation>&amp;Gebruikersprofiel...</translation>
+ </message>
+ <message>
+ <source>Join two calls in a 3-way conference</source>
+ <translation>Verbind twee gesprekken in een 3-weg conferentie</translation>
+ </message>
+ <message>
+ <source>Mute a call</source>
+ <translation>Onderdruk het geluid</translation>
+ </message>
+ <message>
+ <source>Transfer call</source>
+ <translation>Gesprek doorverbinden</translation>
+ </message>
+ <message>
+ <source>&amp;System settings...</source>
+ <translation>&amp;Systeeminstellingen...</translation>
+ </message>
+ <message>
+ <source>Deregister all</source>
+ <translation>Alles deregistreren</translation>
+ </message>
+ <message>
+ <source>Deregister &amp;all</source>
+ <translation>&amp;Alles deregistreren</translation>
+ </message>
+ <message>
+ <source>Deregister all your registered devices</source>
+ <translation>Deregistreer al uw geregistreerde apparaten</translation>
+ </message>
+ <message>
+ <source>Auto answer</source>
+ <translation>Automatisch beantwoorden</translation>
+ </message>
+ <message>
+ <source>&amp;Auto answer</source>
+ <translation>&amp;Automatisch beantwoorden</translation>
+ </message>
+ <message>
+ <source>Log</source>
+ <translation>Log</translation>
+ </message>
+ <message>
+ <source>&amp;Log...</source>
+ <translation>&amp;Log...</translation>
+ </message>
+ <message>
+ <source>Call &amp;history...</source>
+ <translation>Gespreks&amp;historie...</translation>
+ </message>
+ <message>
+ <source>F9</source>
+ <translation>F9</translation>
+ </message>
+ <message>
+ <source>Change user ...</source>
+ <translation>Wijzig gerbuiker...</translation>
+ </message>
+ <message>
+ <source>&amp;Change user ...</source>
+ <translation>&amp;Wijzig gebruiker...</translation>
+ </message>
+ <message>
+ <source>Activate or de-activate users</source>
+ <translation>Activeer of de-actieveer gebruikers</translation>
+ </message>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation>Wat is dit?</translation>
+ </message>
+ <message>
+ <source>What&apos;s &amp;This?</source>
+ <translation>&amp;Wat is dit?</translation>
+ </message>
+ <message>
+ <source>Shift+F1</source>
+ <translation>Shift+F1</translation>
+ </message>
+ <message>
+ <source>Line 1</source>
+ <translation>Lijn 1</translation>
+ </message>
+ <message>
+ <source>Line 2</source>
+ <translation>Lijn 2</translation>
+ </message>
+ <message>
+ <source>idle</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>sas</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>g711a/g711a</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>sip:from</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>sip:to</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>subject</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>photo</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>dialing</source>
+ <translation>bellen</translation>
+ </message>
+ <message>
+ <source>attempting call, please wait</source>
+ <translation>gesprek opzetten, wacht aub</translation>
+ </message>
+ <message>
+ <source>incoming call</source>
+ <translation>inkomend gesprek</translation>
+ </message>
+ <message>
+ <source>establishing call, please wait</source>
+ <translation>gesprek verbinden, wacht aub</translation>
+ </message>
+ <message>
+ <source>established</source>
+ <translation>verbonden</translation>
+ </message>
+ <message>
+ <source>established (waiting for media)</source>
+ <translation>verbonden (wacht op media)</translation>
+ </message>
+ <message>
+ <source>releasing call, please wait</source>
+ <translation>gesprek afbreken, wacht aub</translation>
+ </message>
+ <message>
+ <source>unknown state</source>
+ <translation>onbekend</translation>
+ </message>
+ <message>
+ <source>Voice is encrypted</source>
+ <translation>Geluid is versleuteld</translation>
+ </message>
+ <message>
+ <source>Click to confirm SAS.</source>
+ <translation>Klik om SAS te bevestigen.</translation>
+ </message>
+ <message>
+ <source>Click to clear SAS verification.</source>
+ <translation>Klik om SAS bevestiging te wissen.</translation>
+ </message>
+ <message>
+ <source>Registration status:</source>
+ <translation>Registratiestatus:</translation>
+ </message>
+ <message>
+ <source>Registered</source>
+ <translation>Geregistreeerd</translation>
+ </message>
+ <message>
+ <source>Failed</source>
+ <translation>Mislukt</translation>
+ </message>
+ <message>
+ <source>Not registered</source>
+ <translation>Niet geregistreerd</translation>
+ </message>
+ <message>
+ <source>No users are registered.</source>
+ <translation>Niemand is geregistreerd.</translation>
+ </message>
+ <message>
+ <source>Do not disturb active for:</source>
+ <translation>Niet storen actief voor:</translation>
+ </message>
+ <message>
+ <source>Redirection active for:</source>
+ <translation>Doorverwijzen actief voor:</translation>
+ </message>
+ <message>
+ <source>Auto answer active for:</source>
+ <translation>Automatisch beantwoorden actief voor:</translation>
+ </message>
+ <message>
+ <source>Do not disturb is not active.</source>
+ <translation>Niet storen is niet actief.</translation>
+ </message>
+ <message>
+ <source>Redirection is not active.</source>
+ <translation>Doorverwijzen is niet actief.</translation>
+ </message>
+ <message>
+ <source>Auto answer is not active.</source>
+ <translation>Automatisch beantwoorden is niet actief.</translation>
+ </message>
+ <message>
+ <source>You have no missed calls.</source>
+ <translation>Geen gemiste gesprekken.</translation>
+ </message>
+ <message>
+ <source>You missed 1 call.</source>
+ <translation>U heeft 1 gemist gesprek.</translation>
+ </message>
+ <message>
+ <source>You missed %1 calls.</source>
+ <translation>U heeft %1 gemiste gesprekken.</translation>
+ </message>
+ <message>
+ <source>Click to see call history for details.</source>
+ <translation>Klik hier om de gesprekshistorie te zien.</translation>
+ </message>
+ <message>
+ <source>Starting user profiles...</source>
+ <translation>Opstarten gebruikersprofielen...</translation>
+ </message>
+ <message>
+ <source>You can only run multiple profiles for different users.</source>
+ <translation>U kunt alleen meerdere profielen voor verschillende gebruikers starten.</translation>
+ </message>
+ <message>
+ <source>You have changed the SIP UDP port. This setting will only become active when you restart Twinkle.</source>
+ <translation>U heeft de SIP UDP poort gewijzigd. Deze instelling wordt pas actief als u Twinkle opnieuw opstart.</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Gebruiker:</translation>
+ </message>
+ <message>
+ <source>Call:</source>
+ <translation>Bel:</translation>
+ </message>
+ <message>
+ <source>The following profiles are both for user %1</source>
+ <translation>De volgende profielen zijn beiden voor gebruiker %1</translation>
+ </message>
+ <message>
+ <source>Visual indication of line state.</source>
+ <translation>Visuele indicatie van de lijnstatus.</translation>
+ </message>
+ <message>
+ <source>Call redirection</source>
+ <translation>Doorverwijzen</translation>
+ </message>
+ <message>
+ <source>User profile</source>
+ <translation>Gebruikersprofiel</translation>
+ </message>
+ <message>
+ <source>System settings</source>
+ <translation>Systeeminstellingen</translation>
+ </message>
+ <message>
+ <source>Call history</source>
+ <translation>Gesprekshistorie</translation>
+ </message>
+ <message>
+ <source>&amp;Call:</source>
+ <comment>Label in front of combobox to enter address</comment>
+ <translation>B&amp;el:</translation>
+ </message>
+ <message>
+ <source>Esc</source>
+ <translation>Esc</translation>
+ </message>
+ <message>
+ <source>Transfer consultation</source>
+ <translation>Ruggespraak doorverbinden</translation>
+ </message>
+ <message>
+ <source>Hide identity</source>
+ <translation>Identiteit verbergen</translation>
+ </message>
+ <message>
+ <source>Click to show registrations.</source>
+ <translation>Klik om registraties te tonen.</translation>
+ </message>
+ <message>
+ <source>%1 new, 1 old message</source>
+ <translation>%1 nieuw, 1 oud bericht</translation>
+ </message>
+ <message>
+ <source>%1 new, %2 old messages</source>
+ <translation>%1 nieuw, %2 oude berichten</translation>
+ </message>
+ <message>
+ <source>1 new message</source>
+ <translation>1 nieuw bericht</translation>
+ </message>
+ <message>
+ <source>%1 new messages</source>
+ <translation>%1 nieuwe berichten</translation>
+ </message>
+ <message>
+ <source>1 old message</source>
+ <translation>1 oud bericht</translation>
+ </message>
+ <message>
+ <source>%1 old messages</source>
+ <translation>%1 oude berichten</translation>
+ </message>
+ <message>
+ <source>Messages waiting</source>
+ <translation>Er zijn berichten</translation>
+ </message>
+ <message>
+ <source>No messages</source>
+ <translation>Geen berichten</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Voice mail status:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Voice mail status:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Failure</source>
+ <translation>Fout</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>Onbekend</translation>
+ </message>
+ <message>
+ <source>Click to access voice mail.</source>
+ <translation>Klik voor toegang to voice mail.</translation>
+ </message>
+ <message>
+ <source>Click to activate/deactivate</source>
+ <translation>Klik om te activeren/deactiveren</translation>
+ </message>
+ <message>
+ <source>Click to activate</source>
+ <translation>Klik om te activeren</translation>
+ </message>
+ <message>
+ <source>not provisioned</source>
+ <translation>niet ingesteld</translation>
+ </message>
+ <message>
+ <source>You must provision your voice mail address in your user profile, before you can access it.</source>
+ <translation>Voor toegang tot voice mail moet u eerst uw voice mail nummer in uw gebruikersprofiel invullen.</translation>
+ </message>
+ <message>
+ <source>The line is busy. Cannot access voice mail.</source>
+ <translation>De lijn is bezet. Geen toegang tot voice mail.</translation>
+ </message>
+ <message>
+ <source>The voice mail address %1 is an invalid address. Please provision a valid address in your user profile.</source>
+ <translation>Het voice mail nummer %1 is ongeldig. Vul een geldig nummer in in uw gebruikersprofiel.</translation>
+ </message>
+ <message>
+ <source>Call</source>
+ <comment>toolbar text</comment>
+ <translation>Bel</translation>
+ </message>
+ <message>
+ <source>&amp;Call...</source>
+ <comment>call menu text</comment>
+ <translation>&amp;Bel...</translation>
+ </message>
+ <message>
+ <source>Answer</source>
+ <comment>toolbar text</comment>
+ <translation>Antw</translation>
+ </message>
+ <message>
+ <source>&amp;Answer</source>
+ <comment>menu text</comment>
+ <translation>&amp;Antwoord</translation>
+ </message>
+ <message>
+ <source>Bye</source>
+ <comment>toolbar text</comment>
+ <translation>Einde</translation>
+ </message>
+ <message>
+ <source>&amp;Bye</source>
+ <comment>menu text</comment>
+ <translation>&amp;Einde</translation>
+ </message>
+ <message>
+ <source>Reject</source>
+ <comment>toolbar text</comment>
+ <translation>Afwijzen</translation>
+ </message>
+ <message>
+ <source>&amp;Reject</source>
+ <comment>menu text</comment>
+ <translation>A&amp;fwijzen</translation>
+ </message>
+ <message>
+ <source>Hold</source>
+ <comment>toolbar text</comment>
+ <translation>Wacht</translation>
+ </message>
+ <message>
+ <source>&amp;Hold</source>
+ <comment>menu text</comment>
+ <translation>&amp;Wacht</translation>
+ </message>
+ <message>
+ <source>Redirect</source>
+ <comment>toolbar text</comment>
+ <translation>Verwijs</translation>
+ </message>
+ <message>
+ <source>R&amp;edirect...</source>
+ <comment>menu text</comment>
+ <translation>&amp;Verwijs...</translation>
+ </message>
+ <message>
+ <source>Dtmf</source>
+ <comment>toolbar text</comment>
+ <translation>Dtmf</translation>
+ </message>
+ <message>
+ <source>&amp;Dtmf...</source>
+ <comment>menu text</comment>
+ <translation>Dt&amp;mf...</translation>
+ </message>
+ <message>
+ <source>&amp;Terminal capabilities...</source>
+ <comment>menu text</comment>
+ <translation>&amp;Terminal eigenschappen...</translation>
+ </message>
+ <message>
+ <source>Redial</source>
+ <comment>toolbar text</comment>
+ <translation>Herh</translation>
+ </message>
+ <message>
+ <source>&amp;Redial</source>
+ <comment>menu text</comment>
+ <translation>&amp;Herhaal</translation>
+ </message>
+ <message>
+ <source>Conf</source>
+ <comment>toolbar text</comment>
+ <translation>Conf</translation>
+ </message>
+ <message>
+ <source>&amp;Conference</source>
+ <comment>menu text</comment>
+ <translation>&amp;Conferentie</translation>
+ </message>
+ <message>
+ <source>Mute</source>
+ <comment>toolbar text</comment>
+ <translation>Stil</translation>
+ </message>
+ <message>
+ <source>&amp;Mute</source>
+ <comment>menu text</comment>
+ <translation>&amp;Stil</translation>
+ </message>
+ <message>
+ <source>Xfer</source>
+ <comment>toolbar text</comment>
+ <translation>Xfer</translation>
+ </message>
+ <message>
+ <source>Trans&amp;fer...</source>
+ <comment>menu text</comment>
+ <translation>&amp;Doorverbinden...</translation>
+ </message>
+ <message>
+ <source>Voice mail</source>
+ <translation>Voice mail</translation>
+ </message>
+ <message>
+ <source>&amp;Voice mail</source>
+ <translation>&amp;Voice mail</translation>
+ </message>
+ <message>
+ <source>Access voice mail</source>
+ <translation>Bel voice mail</translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation>F11</translation>
+ </message>
+ <message>
+ <source>Message waiting indication.</source>
+ <translation>Voice mail status.</translation>
+ </message>
+ <message>
+ <source>Buddy list</source>
+ <translation>Vrienden</translation>
+ </message>
+ <message>
+ <source>&amp;Message</source>
+ <translation>&amp;Bericht</translation>
+ </message>
+ <message>
+ <source>Msg</source>
+ <translation>Bericht</translation>
+ </message>
+ <message>
+ <source>Instant &amp;message...</source>
+ <translation>Instant &amp;bericht...</translation>
+ </message>
+ <message>
+ <source>Instant message</source>
+ <translation>Instant bericht</translation>
+ </message>
+ <message>
+ <source>&amp;Call...</source>
+ <translation>&amp;Bel...</translation>
+ </message>
+ <message>
+ <source>&amp;Edit...</source>
+ <translation>Be&amp;werk...</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Verwijderen</translation>
+ </message>
+ <message>
+ <source>O&amp;ffline</source>
+ <translation>O&amp;ffline</translation>
+ </message>
+ <message>
+ <source>&amp;Online</source>
+ <translation>&amp;Online</translation>
+ </message>
+ <message>
+ <source>&amp;Change availability</source>
+ <translation>&amp;Wijzig beschikbaarheid</translation>
+ </message>
+ <message>
+ <source>&amp;Add buddy...</source>
+ <translation>&amp;Vriend toevoegen...</translation>
+ </message>
+ <message>
+ <source>Failed to save buddy list: %1</source>
+ <translation>Opslaan van vriendenlijst is mislukt: %1</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Voor elk gebruikersprofiel kunt u een vriendenlijst aanleggen. Om de beschikbaarheid van uw vrienden te zien en uw eigen beschikbaarheid te publiceren, moet uw provider over een presence server beschikken.</translation>
+ </message>
+ <message>
+ <source>&amp;Buddy list</source>
+ <translation>&amp;Vrienden</translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation>&amp;Scherm</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation>F10</translation>
+ </message>
+ <message>
+ <source>Diamondcard</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Manual</source>
+ <translation>Handleiding</translation>
+ </message>
+ <message>
+ <source>&amp;Manual</source>
+ <translation>&amp;Handleinding</translation>
+ </message>
+ <message>
+ <source>Sign up</source>
+ <translation>Aanmelden</translation>
+ </message>
+ <message>
+ <source>&amp;Sign up...</source>
+ <translation>&amp;Aanmelden...</translation>
+ </message>
+ <message>
+ <source>Recharge...</source>
+ <translation>Opwaarderen...</translation>
+ </message>
+ <message>
+ <source>Balance history...</source>
+ <translation>Balansoverzicht...</translation>
+ </message>
+ <message>
+ <source>Call history...</source>
+ <translation>Gesprekkenoverzicht...</translation>
+ </message>
+ <message>
+ <source>Admin center...</source>
+ <translation>Admin center...</translation>
+ </message>
+ <message>
+ <source>Recharge</source>
+ <translation>Opwaarderen</translation>
+ </message>
+ <message>
+ <source>Balance history</source>
+ <translation>Balansoverzicht</translation>
+ </message>
+ <message>
+ <source>Admin center</source>
+ <translation>Admin center</translation>
+ </message>
+</context>
+<context>
+ <name>NumberConversionForm</name>
+ <message>
+ <source>&amp;Match expression:</source>
+ <translation>&amp;Match expressie:</translation>
+ </message>
+ <message>
+ <source>&amp;Replace:</source>
+ <translation>&amp;Vervang:</translation>
+ </message>
+ <message>
+ <source>Perl style format string for the replacement number.</source>
+ <translation>Formaat string (Perl syntax) voor het vervangen van het nummer in.</translation>
+ </message>
+ <message>
+ <source>Perl style regular expression matching the number format you want to modify.</source>
+ <translation>Reguliere expressie (Perl syntax) voor het matchen van het nummerformaat dat u wilt modificeren.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>Twinkle - Number conversion</source>
+ <translation>Twinkle - Nummerconversie</translation>
+ </message>
+ <message>
+ <source>Match expression may not be empty.</source>
+ <translation>Match expressie mag niet leeg zijn.</translation>
+ </message>
+ <message>
+ <source>Replace value may not be empty.</source>
+ <translation>Vervangwaarde mag niet leeg zijn.</translation>
+ </message>
+ <message>
+ <source>Invalid regular expression.</source>
+ <translation>Ongeldige reguliere expressie.</translation>
+ </message>
+</context>
+<context>
+ <name>RedirectForm</name>
+ <message>
+ <source>Twinkle - Redirect</source>
+ <translation>Twinkle - Doorverwijzen</translation>
+ </message>
+ <message>
+ <source>Redirect incoming call to</source>
+ <translation>Verwijs inkomend gesprek naar</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>U kan tot 3 bestemmingen invoeren waarnaar u een gesprek wilt doorverwijzen. Als de eerste bestemming niet opneemt, dan wordt de tweede bestemming geprobeerd enz.</translation>
+ </message>
+ <message>
+ <source>&amp;3rd choice destination:</source>
+ <translation>&amp;3e bestemming:</translation>
+ </message>
+ <message>
+ <source>&amp;2nd choice destination:</source>
+ <translation>&amp;2e bestemming:</translation>
+ </message>
+ <message>
+ <source>&amp;1st choice destination:</source>
+ <translation>&amp;1e bestemming:</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adresboek</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Kies een adres uit het adresboek.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation>F10</translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation>F12</translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation>F11</translation>
+ </message>
+</context>
+<context>
+ <name>SelectNicForm</name>
+ <message>
+ <source>Twinkle - Select NIC</source>
+ <translation>Twinkle - Kies NIC</translation>
+ </message>
+ <message>
+ <source>Select the network interface/IP address that you want to use:</source>
+ <translation>Kies de netwerk interface/IP adres die u wilt gebruiken:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>U heeft meerdere IP adressen. Hier moet u aangeven welk IP adres gebruikt moet worden. Dit adres wordt gebruikt in de SIP berichten.</translation>
+ </message>
+ <message>
+ <source>Set as default &amp;IP</source>
+ <translation>Default &amp;IP</translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation>Alt+I</translation>
+ </message>
+ <message>
+ <source>Make the selected IP address the default IP address. The next time you start Twinkle, this IP address will be automatically selected.</source>
+ <translation>Het geselecteerde IP adres wordt het default IP adres. De volgende keer dat u Twinkle start wordt dit IP adres automatisch geslecteerd.</translation>
+ </message>
+ <message>
+ <source>Set as default &amp;NIC</source>
+ <translation>Default &amp;NIC</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation>Alt+N</translation>
+ </message>
+ <message>
+ <source>Make the selected network interface the default interface. The next time you start Twinkle, this interface will be automatically selected.</source>
+ <translation>De geslecteerde netwerk interface wordt de default interface. De volgende keer dat u Twinkle opstart wordt deze interface automatisch geslecteerd.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>If you want to remove or change the default at a later time, you can do that via the system settings.</source>
+ <translation>Als u de default later wilt verwijderen of wijzigen, dan kan dat via de systeeminstellingen.</translation>
+ </message>
+</context>
+<context>
+ <name>SelectProfileForm</name>
+ <message>
+ <source>Twinkle - Select user profile</source>
+ <translation>Twinkle - Kies gebruikersprofiel</translation>
+ </message>
+ <message>
+ <source>Select user profile(s) to run:</source>
+ <translation>Selecteer de gebruikersprofielen die u wilt activeren:</translation>
+ </message>
+ <message>
+ <source>User profile</source>
+ <translation>Gebruikersprofiel</translation>
+ </message>
+ <message>
+ <source>Tick the check boxes of the user profiles that you want to run and press run.</source>
+ <translation>Vink de gebruikersprofielen aan die u wilt activeren.</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Nieuw</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation type="obsolete">Alt+N</translation>
+ </message>
+ <message>
+ <source>Create a new profile with the profile editor.</source>
+ <translation>Maak een nieuw profiel met de profielen editor.</translation>
+ </message>
+ <message>
+ <source>&amp;Wizard</source>
+ <translation>Wi&amp;zard</translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation>Alt+Z</translation>
+ </message>
+ <message>
+ <source>Create a new profile with the wizard.</source>
+ <translation>Maak een nieuw profiel met de wizard.</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>Be&amp;werk</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation>Alt+W</translation>
+ </message>
+ <message>
+ <source>Edit the highlighted profile.</source>
+ <translation>Bewerk het huidige profiel.</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Verwijderen</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>Delete the highlighted profile.</source>
+ <translation>Verwijder het huidige profiel.</translation>
+ </message>
+ <message>
+ <source>Ren&amp;ame</source>
+ <translation>&amp;Hernoemen</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+H</translation>
+ </message>
+ <message>
+ <source>Rename the highlighted profile.</source>
+ <translation>Hernoem het huidige profiel.</translation>
+ </message>
+ <message>
+ <source>&amp;Set as default</source>
+ <translation>&amp;Default</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+D</translation>
+ </message>
+ <message>
+ <source>Make the selected profiles the default profiles. The next time you start Twinkle, these profiles will be automatically run.</source>
+ <translation>Markeer de geselecteerde profielen als default profielen. De volgende keer dat u Twinkle opstart, zullen deze profielen automatisch gestart worden.</translation>
+ </message>
+ <message>
+ <source>&amp;Run</source>
+ <translation>&amp;Start</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>Run Twinkle with the selected profiles.</source>
+ <translation>Start Twinkle met de geselecteerde profielen.</translation>
+ </message>
+ <message>
+ <source>S&amp;ystem settings</source>
+ <translation>S&amp;ysteeminstellingen</translation>
+ </message>
+ <message>
+ <source>Alt+Y</source>
+ <translation>Alt+Y</translation>
+ </message>
+ <message>
+ <source>Edit the system settings.</source>
+ <translation>Wijzig de systeeminstellingen.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;Before you can use Twinkle, you must create a user profile.&lt;br&gt;Click OK to create a profile.&lt;/html&gt;</source>
+ <translation>&lt;html&gt;Voordat u Twinkle kunt gebruiken, moet u een gebruikerspofiel maken.&lt;br&gt;Klik op OK om een gebruikersprofiel te maken.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;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.&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;Choose what method you wish to use.&lt;/html&gt;</source>
+ <translation type="obsolete">&lt;html&gt;U kunt de profieleditor gebruiken om een gebruikersprofiel te maken. Met de profieleditor kunt u diverse instellingen met betrekking tot het SIP protocol, RTP en vele andere zaken wijzigen.&lt;br&gt;&lt;br&gt;Met de wizard kunt u snel een gebruikersprofiel maken. De wizard vraagt u alleen om een aantal essentiële instellingen. Als u een gebruikersprofiel met de wizard maakt, dan kun u deze op een later tijdstip alsnog met de profieleditor wijzigen.&lt;br&gt;&lt;br&gt;Kies op welke wijze u een gebruikersprofiel wilt maken.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;Next you may adjust the system settings. You can change these settings always at a later time.&lt;br&gt;&lt;br&gt;Click OK to view and adjust the system settings.&lt;/html&gt;</source>
+ <translation>&lt;html&gt;U kunt nu de systeeminstellingen wijzigen. Deze instellingen kunt u altijd wijzigen op een later tijdstip.&lt;br&gt;&lt;br&gt;Klik op OK om de systeeminstellingen te bekijken en eventueel te wijzigen.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>You did not select any user profile to run.
+Please select a profile.</source>
+ <translation>U heeft geen gebruikersprofiel geselecteerd.
+Kies eerst een gebruikersprofiel.</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete profile &apos;%1&apos;?</source>
+ <translation>Weet u zeker dat u profiel &apos;%1&apos; wilt verwijderen?</translation>
+ </message>
+ <message>
+ <source>Delete profile</source>
+ <translation>Verwijder profiel</translation>
+ </message>
+ <message>
+ <source>Failed to delete profile.</source>
+ <translation>Profiel verwijderen mislukt.</translation>
+ </message>
+ <message>
+ <source>Failed to rename profile.</source>
+ <translation>Profiel hernoemen mislukt.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;If you want to remove or change the default at a later time, you can do that via the system settings.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Als u de default later wilt verwijderen of wijzigen, dan kunt u dat doen via de systeeminstellingen.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Cannot find .twinkle directory in your home directory.</source>
+ <translation>.twinkle folder kan niet gevonden worden in uw thuis folder.</translation>
+ </message>
+ <message>
+ <source>&amp;Profile editor</source>
+ <translation>&amp;Profieleditor</translation>
+ </message>
+ <message>
+ <source>Create profile</source>
+ <translation>Maak gebruikersprofiel</translation>
+ </message>
+ <message>
+ <source>Ed&amp;itor</source>
+ <translation>Ed&amp;itor</translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation>Alt+I</translation>
+ </message>
+ <message>
+ <source>Dia&amp;mondcard</source>
+ <translation>Dia&amp;mondcard</translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation>Alt+M</translation>
+ </message>
+ <message>
+ <source>Modify profile</source>
+ <translation>Bewerk gebruikersprofiel</translation>
+ </message>
+ <message>
+ <source>Startup profile</source>
+ <translation>Starten gebruikersprofiel</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;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.&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;You can create a Diamondcard account to make worldwide calls to regular and cell phones.&lt;br&gt;&lt;br&gt;Choose what method you wish to use.&lt;/html&gt;</source>
+ <translation type="obsolete">&lt;html&gt;U kunt de profieleditor gebruiken om een gebruikersprofiel te maken. Met de profieleditor kunt u diverse instellingen met betrekking tot het SIP protocol, RTP en vele andere zaken wijzigen.&lt;br&gt;&lt;br&gt;Met de wizard kunt u snel een gebruikersprofiel maken. De wizard vraagt u alleen om een aantal essentiële instellingen. Als u een gebruikersprofiel met de wizard maakt, dan kun u deze op een later tijdstip alsnog met de profieleditor wijzigen.&lt;br&gt;&lt;br&gt;U kunt een Diamondcard account aanmaken waarmee u wereldwijd kunt bellen naar vaste en mobiele telefoonnummers.&lt;br&gt;&lt;br&gt;Kies op welke wijze u een gebruikersprofiel wilt maken.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Diamondcard</source>
+ <translation>&amp;Diamondcard</translation>
+ </message>
+ <message>
+ <source>Create a profile for a Diamondcard account. With a Diamondcard account you can make worldwide calls to regular and cell phones.</source>
+ <translation type="obsolete">Maak een gebruikersprofiel voor een Diamondcard account. Met een Diamondcard account kunt u wereldwijd bellen naar vaste en mobiele telefoonnummers.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Maak een gebruikersprofiel voor een Diamondcard account. Met een Diamondcard account kunt u wereldwijd bellen naar vaste en mobiele telefoonnummers en SMS berichten versturen.
+</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;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.&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;You can create a Diamondcard account to make worldwide calls to regular and cell phones and send SMS messages.&lt;br&gt;&lt;br&gt;Choose what method you wish to use.&lt;/html&gt;</source>
+ <translation>&lt;html&gt;U kunt de profieleditor gebruiken om een gebruikersprofiel te maken. Met de profieleditor kunt u diverse instellingen met betrekking tot het SIP protocol, RTP en vele andere zaken wijzigen.&lt;br&gt;&lt;br&gt;Met de wizard kunt u snel een gebruikersprofiel maken. De wizard vraagt u alleen om een aantal essentiële instellingen. Als u een gebruikersprofiel met de wizard maakt, dan kun u deze op een later tijdstip alsnog met de profieleditor wijzigen.&lt;br&gt;&lt;br&gt;U kunt een Diamondcard account aanmaken waarmee u wereldwijd kunt bellen naar vaste en mobiele telefoonnummers en SMS berichten versturen.&lt;br&gt;&lt;br&gt;Kies op welke wijze u een gebruikersprofiel wilt maken.&lt;/html&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>SelectUserForm</name>
+ <message>
+ <source>Twinkle - Select user</source>
+ <translation>Twinkle - Kies gebruiker</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>&amp;Select all</source>
+ <translation>&amp;Selecteer alles</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>C&amp;lear all</source>
+ <translation>&amp;Wis alles</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+W</translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation>Gebruiker</translation>
+ </message>
+ <message>
+ <source>Register</source>
+ <translation>Registreren</translation>
+ </message>
+ <message>
+ <source>Select users that you want to register.</source>
+ <translation>Selecteer welke gebruikers u wilt registreren.</translation>
+ </message>
+ <message>
+ <source>Deregister</source>
+ <translation>Deregistreren</translation>
+ </message>
+ <message>
+ <source>Select users that you want to deregister.</source>
+ <translation>Kies de gebruikers die u wilt deregistreren.</translation>
+ </message>
+ <message>
+ <source>Deregister all devices</source>
+ <translation>Deregistreer alle apparaten</translation>
+ </message>
+ <message>
+ <source>Select users for which you want to deregister all devices.</source>
+ <translation>Kies de gebruikers voor wie u alle apparaten wilt deregistreren.</translation>
+ </message>
+ <message>
+ <source>Do not disturb</source>
+ <translation>Niet storen</translation>
+ </message>
+ <message>
+ <source>Select users for which you want to enable &apos;do not disturb&apos;.</source>
+ <translation>Kies de gebruikers voor wie u &apos;niet storen&apos; wilt aanzetten.</translation>
+ </message>
+ <message>
+ <source>Auto answer</source>
+ <translation>Automatisch beantwoorden</translation>
+ </message>
+ <message>
+ <source>Select users for which you want to enable &apos;auto answer&apos;.</source>
+ <translation>Kies de gebruikers voor wie u &apos;automatisch beantwoorden&apos; wilt aanzetten.</translation>
+ </message>
+ <message>
+ <source>purpose</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>SendFileForm</name>
+ <message>
+ <source>Twinkle - Send File</source>
+ <translation>Twinkle - Zend bestand</translation>
+ </message>
+ <message>
+ <source>Select file to send.</source>
+ <translation>Kies het bestand dat u wilt zenden.</translation>
+ </message>
+ <message>
+ <source>&amp;File:</source>
+ <translation>&amp;Bestand:</translation>
+ </message>
+ <message>
+ <source>&amp;Subject:</source>
+ <translation>O&amp;nderwerp:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>File does not exist.</source>
+ <translation>Bestand bestaat niet.</translation>
+ </message>
+ <message>
+ <source>Send file...</source>
+ <translation>Zend bestand...</translation>
+ </message>
+</context>
+<context>
+ <name>SrvRedirectForm</name>
+ <message>
+ <source>Twinkle - Call Redirection</source>
+ <translation>Twinkle - Doorverwijzen</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Gebruiker:</translation>
+ </message>
+ <message>
+ <source>There are 3 redirect services:&lt;p&gt;
+&lt;b&gt;Unconditional:&lt;/b&gt; redirect all calls
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Busy:&lt;/b&gt; redirect a call if both lines are busy
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;No answer:&lt;/b&gt; redirect a call when the no-answer timer expires
+&lt;/p&gt;</source>
+ <translation>Er zijn 3 doorverwijsdiensten:&lt;p&gt;
+&lt;b&gt;Onvoorwaardelijk:&lt;/b&gt; alle inkomende gesprekken worden doorverwezen
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Bezet:&lt;/b&gt; een inkomend gesprek wordt doorverwezen als beide lijnen bezet zijn
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Geen antwoord:&lt;/b&gt; een inkomend gesprek wordt doorverwezen als u niet opneemt
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Unconditional</source>
+ <translation>O&amp;nvoorwaardelijk</translation>
+ </message>
+ <message>
+ <source>&amp;Redirect all calls</source>
+ <translation>&amp;Alle gesprekken doorverwijzen</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Activate the unconditional redirection service.</source>
+ <translation>Activeer de onvoorwaardelijk doorverwijzen.</translation>
+ </message>
+ <message>
+ <source>Redirect to</source>
+ <translation>Doorverwijzen naar</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>U kan tot 3 bestemmingen invoeren waarnaar u een gesprek wilt doorverwijzen. Als de eerste bestemming niet opneemt, dan wordt de tweede bestemming geprobeerd enz.</translation>
+ </message>
+ <message>
+ <source>&amp;3rd choice destination:</source>
+ <translation>&amp;3e bestemming:</translation>
+ </message>
+ <message>
+ <source>&amp;2nd choice destination:</source>
+ <translation>&amp;2e bestemming:</translation>
+ </message>
+ <message>
+ <source>&amp;1st choice destination:</source>
+ <translation>&amp;1e bestemming:</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adresboek</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Kies een adres uit het adresboek.</translation>
+ </message>
+ <message>
+ <source>&amp;Busy</source>
+ <translation>&amp;Bezet</translation>
+ </message>
+ <message>
+ <source>&amp;Redirect calls when I am busy</source>
+ <translation>Gesprekken &amp;doorverwijzen als alle lijnen bezet zijn</translation>
+ </message>
+ <message>
+ <source>Activate the redirection when busy service.</source>
+ <translation>Activeer doorverwijzen bij bezet.</translation>
+ </message>
+ <message>
+ <source>&amp;No answer</source>
+ <translation>Geen &amp;antwoord</translation>
+ </message>
+ <message>
+ <source>&amp;Redirect calls when I do not answer</source>
+ <translation>Gesprekken &amp;doorverwijzen als ik niet antwoord</translation>
+ </message>
+ <message>
+ <source>Activate the redirection on no answer service.</source>
+ <translation>Activeer doorverwijzen bij geen antwoord.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>Accept and save all changes.</source>
+ <translation>Sla de huidige instellingen op.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>Undo your changes and close the window.</source>
+ <translation>Maak uw wijzigingen ongedaan en sluit het venster.</translation>
+ </message>
+ <message>
+ <source>You have entered an invalid destination.</source>
+ <translation>U heeft een ongeldige bestemming ingevoerd.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation>F10</translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation>F11</translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation>F12</translation>
+ </message>
+</context>
+<context>
+ <name>SysSettingsForm</name>
+ <message>
+ <source>Twinkle - System Settings</source>
+ <translation>Twinkle - Systeeminstellingen</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Algemeen</translation>
+ </message>
+ <message>
+ <source>Audio</source>
+ <translation>Audio</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <translation>Ring tones</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adresboek</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Netwerk</translation>
+ </message>
+ <message>
+ <source>Log</source>
+ <translation>Log</translation>
+ </message>
+ <message>
+ <source>Select a category for which you want to see or modify the settings.</source>
+ <translation>Kies de categorie waarvoor u instellingen wilt wijzigen.</translation>
+ </message>
+ <message>
+ <source>Sound Card</source>
+ <translation>Geluidskaart</translation>
+ </message>
+ <message>
+ <source>Select the sound card for playing the ring tone for incoming calls.</source>
+ <translation>Kies de geluidskaart voor het afspelen van de ring tone bij een binnenkomend gesprek.</translation>
+ </message>
+ <message>
+ <source>Select the sound card to which your microphone is connected.</source>
+ <translation>Kies de geluidskaart waarmee uw microfoon is verbonden.</translation>
+ </message>
+ <message>
+ <source>Select the sound card for the speaker function during a call.</source>
+ <translation>Kies de geluidskaart waarmee uw speaker of headset verbonden is.</translation>
+ </message>
+ <message>
+ <source>&amp;Speaker:</source>
+ <translation>&amp;Speaker:</translation>
+ </message>
+ <message>
+ <source>&amp;Ring tone:</source>
+ <translation>&amp;Ring tone:</translation>
+ </message>
+ <message>
+ <source>Other device:</source>
+ <translation>Ander apparaat:</translation>
+ </message>
+ <message>
+ <source>&amp;Microphone:</source>
+ <translation>&amp;Microfoon:</translation>
+ </message>
+ <message>
+ <source>When using ALSA, it is not recommended to use the default device for the microphone as it gives poor sound quality.</source>
+ <translation type="obsolete">Als u ALSA gebruikt, dan is het niet aan te raden om het default apparaat als microfoon te gebruiken omdat die een matige geluidskwaliteit heeft.</translation>
+ </message>
+ <message>
+ <source>Reduce &amp;noise from the microphone</source>
+ <translation type="obsolete">&amp;Verminder ruis van de microfoon</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation type="obsolete">Alt+V</translation>
+ </message>
+ <message>
+ <source>Recordings from the microphone can contain noise. This could be annoying to the person on the other side of your call. This option removes soft noise coming from the microphone.
+
+The noise reduction algorithm is very simplistic. Sound is captured as 16 bits signed linear PCM samples. All samples between -50 and 50 are truncated to 0.</source>
+ <translation type="obsolete">Opnames van de microfoon kunnen ruis bevatten. Dit kan vervelend zijn voor de persoon aan de andere kant van de lijn. Deze instelling kan zachte ruis van de microfoon verwijderen.
+
+Het algoritme om ruis te verminderen is erg simplistisch. Geluid wordt gedigitaliseerd als 16 bits lineaire PCM samples. Alle samples tussen de waarden -50 en 50 worden afgerond naar 0.</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Expert instellingen</translation>
+ </message>
+ <message>
+ <source>OSS &amp;fragment size:</source>
+ <translation>OSS &amp;fragment grootte:</translation>
+ </message>
+ <message>
+ <source>16</source>
+ <translation>16</translation>
+ </message>
+ <message>
+ <source>32</source>
+ <translation>32</translation>
+ </message>
+ <message>
+ <source>64</source>
+ <translation>64</translation>
+ </message>
+ <message>
+ <source>128</source>
+ <translation>128</translation>
+ </message>
+ <message>
+ <source>256</source>
+ <translation>256</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>De ALSA afspeel periode grootte is van invloed op het real time gedrag van uw geluidskaart bij het afspelen van geluid. Als het geluid hapert bij het gebruik van ALSA, dan kunt u een andere waarde proberen.</translation>
+ </message>
+ <message>
+ <source>ALSA &amp;play period size:</source>
+ <translation>ALSA afspeel-&amp;periode grootte:</translation>
+ </message>
+ <message>
+ <source>&amp;ALSA capture period size:</source>
+ <translation>&amp;ALSA opneem-periode grootte:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>De OSS fragment grootte is van invloed op het real time gedrag van uw geluidskaart. Als het geluid hapert bij het gebruik van OSS, dan kunt u een andere waarde proberen.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>De ALSA opneem-periode grootte is van invloed op het real time gedrag van uw geluidskaart bij het opnemen van geluid. Als het geluid aan de andere kant van de lijn hapert bij het gebruik van ALSA, dan kunt u een andere waarde proberen.</translation>
+ </message>
+ <message>
+ <source>&amp;Max log size:</source>
+ <translation>&amp;Max log grootte:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>De maximum omvang van het log bestand in MB. Als de log file groter wordt dan deze omvang, dan wordt een backup van de log file gemaakt en wordt de huidige log file gewist. Er wordt slechts één backup log bestand bewaard.</translation>
+ </message>
+ <message>
+ <source>MB</source>
+ <translation>MB</translation>
+ </message>
+ <message>
+ <source>Log &amp;debug reports</source>
+ <translation>Log &amp;debug meldingen</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation>Alt+D</translation>
+ </message>
+ <message>
+ <source>Indicates if reports marked as &quot;debug&quot; will be logged.</source>
+ <translation>Plaats &quot;debug&quot; meldingen in het log bestand.</translation>
+ </message>
+ <message>
+ <source>Log &amp;SIP reports</source>
+ <translation>Log &amp;SIP meldingen</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>Indicates if SIP messages will be logged.</source>
+ <translation>Plaats SIP meldingen in het log bestand.</translation>
+ </message>
+ <message>
+ <source>Log S&amp;TUN reports</source>
+ <translation>Log S&amp;TUN meldingen</translation>
+ </message>
+ <message>
+ <source>Alt+T</source>
+ <translation>Alt+T</translation>
+ </message>
+ <message>
+ <source>Indicates if STUN messages will be logged.</source>
+ <translation>Plaats STUN meldingen in het log bestand.</translation>
+ </message>
+ <message>
+ <source>Log m&amp;emory reports</source>
+ <translation>Log g&amp;eheugen meldingen</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation>Alt+E</translation>
+ </message>
+ <message>
+ <source>Indicates if reports concerning memory management will be logged.</source>
+ <translation>Plaats meldingen met betrekking tot geheugenbeheer in het log bestand.</translation>
+ </message>
+ <message>
+ <source>System tray</source>
+ <translation>Systeemvak</translation>
+ </message>
+ <message>
+ <source>Create &amp;system tray icon on startup</source>
+ <translation>Maak een icoon in het &amp;systeemvak bij opstarten</translation>
+ </message>
+ <message>
+ <source>Enable this option if you want a system tray icon for Twinkle. The system tray icon is created when you start Twinkle.</source>
+ <translation>Met deze optie wordt er een icoon in het systeemvak geplaatst bij het opstarten van Twinkle.</translation>
+ </message>
+ <message>
+ <source>&amp;Hide in system tray when closing main window</source>
+ <translation>&amp;Verbergen in systeemvak bij sluiten van het hoofdvenster</translation>
+ </message>
+ <message>
+ <source>Alt+H</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>Enable this option if you want Twinkle to hide in the system tray when you close the main window.</source>
+ <translation>Met deze optie verbert Twinkle zich in het systeemvak als u het hoofdvenster sluit.</translation>
+ </message>
+ <message>
+ <source>Startup</source>
+ <translation>Opstarten</translation>
+ </message>
+ <message>
+ <source>Next time you start Twinkle, this IP address will be automatically selected. This is only useful when your computer has multiple and static IP addresses.</source>
+ <translation type="obsolete">De volgende keer dat u Twinkle opstart wordt dit IP adres automatisch geselecteerd. Dit is alleen handig als uw computer meerdere statische IP adressen heeft.</translation>
+ </message>
+ <message>
+ <source>Default &amp;IP address:</source>
+ <translation type="obsolete">Default &amp;IP adres:</translation>
+ </message>
+ <message>
+ <source>Next time you start Twinkle, the IP address of this network interface be automatically selected. This is only useful when your computer has multiple network devices.</source>
+ <translation type="obsolete">De volgende keer dat u Twinkle opstart wordt het IP adres van deze netwerk interface automatisch geselecteerd. Dit is alleen handig als uw computer meerdere netwerk interfaces heeft.</translation>
+ </message>
+ <message>
+ <source>Default &amp;network interface:</source>
+ <translation type="obsolete">Default &amp;netwerk interface:</translation>
+ </message>
+ <message>
+ <source>S&amp;tartup hidden in system tray</source>
+ <translation>Verborgen ops&amp;tarten in systeemvak</translation>
+ </message>
+ <message>
+ <source>Next time you start Twinkle it will immediately hide in the system tray. This works best when you also select a default user profile.</source>
+ <translation>De volgende keer dat u Twinkle opstart, zal Twinkle zich onmiddelijk verbergen in het systeemvak. Dit werkt het beste als u ook een default gebruikersprofiel selecteert.</translation>
+ </message>
+ <message>
+ <source>Default user profiles</source>
+ <translation>Default gebruikersprofielen</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Als u altijd dezelfde gebruikersprofielen gebruikt, dan kunt u deze profielen als default markeren. De volgdende keer dat u Twinkle opstart, wordt u dan niet meer gevraagd om een gebruikers profiel te kiezen. De default profielen worden automatisch opgestart.</translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation>Diensten</translation>
+ </message>
+ <message>
+ <source>Call &amp;waiting</source>
+ <translation>&amp;Wisselgesprek</translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation>Alt+W</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Met wisselgesprek kunt een inkomend gesprek ontvangen als slechts één lijn bezet is. Als u wisselgesprek uitschakelt, dan wordt een binnekomend gesprek automatisch geweigerd als één lijn bezet is.</translation>
+ </message>
+ <message>
+ <source>Hang up &amp;both lines when ending a 3-way conference call.</source>
+ <translation>Hang &amp;beide lijnen op bij het beëindigen van een 3-weg conferentiegesprek.</translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation>Alt+B</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Hang beide lijnen op als u een 3-weg gesprek beëindigd. Als u deze optie uitschakelt, dan zal alleen de actieve lijn worden opgehangen. U kunt dan doorpraten met de partij op de andere lijn.</translation>
+ </message>
+ <message>
+ <source>&amp;Maximum calls in call history:</source>
+ <translation>&amp;Maximum aantal gesrpekken in gesprekshistorie:</translation>
+ </message>
+ <message>
+ <source>The maximum number of calls that will be kept in the call history.</source>
+ <translation>Het maximum aantal gesprekken dat in de gesprekshistorie wordt bewaard.</translation>
+ </message>
+ <message>
+ <source>&amp;Auto show main window on incoming call after</source>
+ <translation>Toon hoofdvenster &amp;automatisch bij een inkomend gesprek na</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>When the main window is hidden, it will be automatically shown on an incoming call after the number of specified seconds.</source>
+ <translation>Als het hoofdvenster verborgen is, dan wordt deze automatisch getoond bij een inkomend gesprek na het aantal aangegeven seconden.</translation>
+ </message>
+ <message>
+ <source>Number of seconds after which the main window should be shown.</source>
+ <translation>Het aantal seconden waarna het hoofdvenster getoond moet worden.</translation>
+ </message>
+ <message>
+ <source>secs</source>
+ <translation>s</translation>
+ </message>
+ <message>
+ <source>The UDP port used for sending and receiving SIP messages.</source>
+ <translation type="obsolete">De UDP poort voor het sturen en ontvangen van SIP berichten.</translation>
+ </message>
+ <message>
+ <source>&amp;RTP port:</source>
+ <translation>&amp;RTP poort:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>De UDP poort wordt gebruikt voor het sturen en ontvangen van RTP op de eerste lijn. De UDP poort voor de tweede lijn is 2 hoger. Voorbeeld: als poort 8000 wordt gebruikt voor de eerste lijn, dan wordt 8002 voor de tweede lijn gebruikt. Als u de dienst &quot;doorverbinden&quot; gebruikt dan wordt de volgende even poort (bijv. 8004) ook gebruikt.</translation>
+ </message>
+ <message>
+ <source>&amp;SIP UDP port:</source>
+ <translation type="obsolete">&amp;SIP UDP poort:</translation>
+ </message>
+ <message>
+ <source>Ring tone</source>
+ <translation>Ring tone</translation>
+ </message>
+ <message>
+ <source>&amp;Play ring tone on incoming call</source>
+ <translation>&amp;Speel ring tone bij inkomend gesprek</translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>Indicates if a ring tone should be played when a call comes in.</source>
+ <translation>Geeft aan dat een ring tone gespeeld moet worden bij een inkomend gesprek.</translation>
+ </message>
+ <message>
+ <source>&amp;Default ring tone</source>
+ <translation>&amp;Default reing tone</translation>
+ </message>
+ <message>
+ <source>Play the default ring tone when a call comes in.</source>
+ <translation>Speel de default ring tone bij een inkomend gesprek.</translation>
+ </message>
+ <message>
+ <source>C&amp;ustom ring tone</source>
+ <translation>&amp;Eigen ring tone</translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation>Alt+E</translation>
+ </message>
+ <message>
+ <source>Play a custom ring tone when a call comes in.</source>
+ <translation>Speel een eigen ring tone bij een inkomend gesprek.</translation>
+ </message>
+ <message>
+ <source>Specify the file name of a .wav file that you want to be played as ring tone.</source>
+ <translation>De bestandsnaam van een .wav bestand dat u als ring tone wilt afspelen.</translation>
+ </message>
+ <message>
+ <source>Ring back tone</source>
+ <translation>Ring back tone</translation>
+ </message>
+ <message>
+ <source>P&amp;lay ring back tone when network does not play ring back tone</source>
+ <translation>S&amp;peel ring back tone als het netwerk geen ring back tone speelt</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+P</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Play ring back tone while you are waiting for the far-end to answer your call.
+&lt;/p&gt;
+&lt;p&gt;
+Depending on your SIP provider the network might provide ring back tone or an announcement.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;
+Speel een ring back tone (de toon die u hoort als u iemand belt) als u wacht op antwoord van de gebelde partij.
+&lt;/p&gt;
+&lt;p&gt;
+Afhankelijk van uw SIP provider, kan het netwerk een ring back tone spelen.
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>D&amp;efault ring back tone</source>
+ <translation>De&amp;fault ring back tone</translation>
+ </message>
+ <message>
+ <source>Play the default ring back tone.</source>
+ <translation>Speel de default ring back tone.</translation>
+ </message>
+ <message>
+ <source>Cu&amp;stom ring back tone</source>
+ <translation>Ei&amp;gen ring back tone</translation>
+ </message>
+ <message>
+ <source>Play a custom ring back tone.</source>
+ <translation>Speel een eigen ring back tone.</translation>
+ </message>
+ <message>
+ <source>Specify the file name of a .wav file that you want to be played as ring back tone.</source>
+ <translation>De bestandsnaam van een .wav bestand dat u als ring back tone wilt afspelen.</translation>
+ </message>
+ <message>
+ <source>&amp;Lookup name for incoming call</source>
+ <translation>Naam op&amp;zoeken voor een inkomend gesprek</translation>
+ </message>
+ <message>
+ <source>Ove&amp;rride received display name</source>
+ <translation>Gevonden naam heeft voor&amp;rang op ontvangen naam</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt+R</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>De beller kan een naam meesturen met een inkomend gesprek. Als u deze optie selecteert, dan zal Twinkle toch de naam uit uw adresboek tonen als deze gevonden wordt.</translation>
+ </message>
+ <message>
+ <source>Lookup &amp;photo for incoming call</source>
+ <translation>Opzoeken &amp;foto bij inkomend gesprek</translation>
+ </message>
+ <message>
+ <source>Lookup the photo of a caller in your address book and display it on an incoming call.</source>
+ <translation>Zoek de foto van de beller op in uw adresboek en toon het bij een inkomend gesprek.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>Accept and save your changes.</source>
+ <translation>Sla de instellingen op.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>Undo all your changes and close the window.</source>
+ <translation>Maak alle wijzigingen ongedaan en sluit het venster.</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <comment>This is the &apos;none&apos; in default IP address combo</comment>
+ <translation type="obsolete">geen</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <comment>This is the &apos;none&apos; in default network interface combo</comment>
+ <translation type="obsolete">geen</translation>
+ </message>
+ <message>
+ <source>Either choose a default IP address or a default network interface.</source>
+ <translation type="obsolete">Kies óf een default IP adres óf een default netwerk interface.</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Ring tones</translation>
+ </message>
+ <message>
+ <source>Choose ring tone</source>
+ <translation>Kies ring tone</translation>
+ </message>
+ <message>
+ <source>Ring back tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Ring back tones</translation>
+ </message>
+ <message>
+ <source>Choose ring back tone</source>
+ <translation>Kies ring back tone</translation>
+ </message>
+ <message>
+ <source>&amp;Validate devices before usage</source>
+ <translation>&amp;Valideer apparaten voor gebruik</translation>
+ </message>
+ <message>
+ <source>Alt+V</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Twinkle validates the audio devices before usage to avoid an established call without an audio channel.
+&lt;p&gt;
+On startup of Twinkle a warning is given if an audio device is inaccessible.
+&lt;p&gt;
+If before making a call, the microphone or speaker appears to be invalid, a warning is given and no call can be made.
+&lt;p&gt;
+If before answering a call, the microphone or speaker appears to be invalid, a warning is given and the call will not be answered.</source>
+ <translation>&lt;p&gt;
+Twinkle valideert de geluidsapparaten voor gebruik om te voorkomen dat een gesprek zonder geluidskanaal wordt opgezet.
+&lt;p&gt;
+Bij het opstarten geeft Twinkle een waarschuwing als een geluidsapparaat niet beschikbaar is.
+&lt;p&gt;
+Als voor het maken van een gesprek, de microfoon of speaker niet beschikbaar zijn, dan krijgt u een waarschuwing en kunt u het gesprek niet maken.
+&lt;p&gt;
+Als voor het beantwoorden van een inkomend gesprek, de microfoon of speaker onbeschikbaar zijn, dan krijgt u een waarschuwing en kunt u het gesprek niet beantwoorden.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Bij een inkomend gesprek, probeert Twinkle de naam van de beller op te zoeken in het adresboek. Deze naam wordt dan getoond.</translation>
+ </message>
+ <message>
+ <source>Select ring tone file.</source>
+ <translation>Selecteer ring tone bestand.</translation>
+ </message>
+ <message>
+ <source>Select ring back tone file.</source>
+ <translation>Selecteer ring back tone bestand.</translation>
+ </message>
+ <message>
+ <source>Maximum allowed size (0-65535) in bytes of an incoming SIP message over UDP.</source>
+ <translation>Maximum omvang (0-65535) van een inkomend SIP bericht over UDP in bytes.</translation>
+ </message>
+ <message>
+ <source>&amp;SIP port:</source>
+ <translation>&amp;SIP poort:</translation>
+ </message>
+ <message>
+ <source>Max. SIP message size (&amp;TCP):</source>
+ <translation>Max. omvang SIP bericht (&amp;TCP):</translation>
+ </message>
+ <message>
+ <source>The UDP/TCP port used for sending and receiving SIP messages.</source>
+ <translation>De TCP/UDP poort die wordt gebruikt voor SIP verkeer.</translation>
+ </message>
+ <message>
+ <source>Max. SIP message size (&amp;UDP):</source>
+ <translation>Max. omvang SIP bericht (&amp;UDP):</translation>
+ </message>
+ <message>
+ <source>Maximum allowed size (0-4294967295) in bytes of an incoming SIP message over TCP.</source>
+ <translation>Maxmimum grootte (0-4294967295) van een SIP bericht over TCP in bytes.</translation>
+ </message>
+ <message>
+ <source>W&amp;eb browser command:</source>
+ <translation>Command voor opstarten w&amp;eb browser:</translation>
+ </message>
+ <message>
+ <source>Command to start your web browser. If you leave this field empty Twinkle will try to figure out your default web browser.</source>
+ <translation>Het commando waamee uw web browser kan worden opgestart. Als u dit veld leeg laat, dan zal Twinkle zelf proberen om uw standaard web browser op te starten.</translation>
+ </message>
+</context>
+<context>
+ <name>SysTrayPopup</name>
+ <message>
+ <source>Answer</source>
+ <translation>Antwoord</translation>
+ </message>
+ <message>
+ <source>Reject</source>
+ <translation>Afwijzen</translation>
+ </message>
+ <message>
+ <source>Incoming Call</source>
+ <translation>Inkomend gesprek</translation>
+ </message>
+</context>
+<context>
+ <name>TermCapForm</name>
+ <message>
+ <source>Twinkle - Terminal Capabilities</source>
+ <translation>Twinkle - Terminal Eigenschappen</translation>
+ </message>
+ <message>
+ <source>&amp;From:</source>
+ <translation>&amp;Van:</translation>
+ </message>
+ <message>
+ <source>Get terminal capabilities of</source>
+ <translation>Opvragen terminal eigenschappen van</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;Aan:</translation>
+ </message>
+ <message>
+ <source>The address that you want to query for capabilities (OPTION request). This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Het adres waarvoor u de eigenschappen (OPTION verzoek) wilt weten. Dit kan een volledig SIP adres zijn zoals &lt;b&gt;sip:example@example.com&lt;/b&gt; of alleen een gebruikersnaam of telefoonnummer. Als u geen volledig adres invoert, dan zal Twinkle het adres afmaken met de waarde die u voor domein heeft ingevuld in uw gebruikersprofiel.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adresboek</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Kies een adres uit het adresboek.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation>F10</translation>
+ </message>
+</context>
+<context>
+ <name>TransferForm</name>
+ <message>
+ <source>Twinkle - Transfer</source>
+ <translation>Twinkle - Doorverbinden</translation>
+ </message>
+ <message>
+ <source>Transfer call to</source>
+ <translation>Doorverbinden naar</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;Aan:</translation>
+ </message>
+ <message>
+ <source>The address of the person you want to transfer the call to. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Het adres waarnaar u wilt doorverbinden. Dit kan een volledig SIP adres zijn zoals &lt;b&gt;sip:example@example.com&lt;/b&gt; of alleen een gebruikersnaam of telefoonnummer. Als u geen volledig adres invoert, dan zal Twinkle het adres afmaken met de waarde die u voor domein heeft ingevuld in uw gebruikersprofiel.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adresboek</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Kies een adres uit het adresboek.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+ <message>
+ <source>Type of transfer</source>
+ <translation>Doorverbindmethode</translation>
+ </message>
+ <message>
+ <source>&amp;Blind transfer</source>
+ <translation>&amp;Blind doorverbinden</translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation>Alt+B</translation>
+ </message>
+ <message>
+ <source>Transfer the call to a third party without contacting that third party yourself.</source>
+ <translation>Doorverbinden van het gesprek naar een derde partij zonder dat u die derde partij eerst zelf raadpleegt.</translation>
+ </message>
+ <message>
+ <source>T&amp;ransfer with consultation</source>
+ <translation>Doorverbinden met &amp;ruggespraak</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt+R</translation>
+ </message>
+ <message>
+ <source>Before transferring the call to a third party, first consult the party yourself.</source>
+ <translation>Alvorens een gesprek door te verbinden naar een derde partij, houdt u eerst ruggespraak met die partij.</translation>
+ </message>
+ <message>
+ <source>Transfer to other &amp;line</source>
+ <translation>Doorverbinden naar andere &amp;lijn</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+L</translation>
+ </message>
+ <message>
+ <source>Connect the remote party on the active line with the remote party on the other line.</source>
+ <translation>Verbind de persoon op deze lijn door met de persoon op de andere lijn.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation>F10</translation>
+ </message>
+</context>
+<context>
+ <name>TwinkleCore</name>
+ <message>
+ <source>Directory %1 does not exist.</source>
+ <translation>Folder %1 bestaat niet.</translation>
+ </message>
+ <message>
+ <source>Lock file %1 already exist, but cannot be opened.</source>
+ <translation type="obsolete">Lock bestand %1 bestaat al, maar kan niet geopend worden.</translation>
+ </message>
+ <message>
+ <source>%1 is already running.
+Lock file %2 already exists.</source>
+ <translation>%1 is al actief.
+Lock bestand %2 bestaat al.</translation>
+ </message>
+ <message>
+ <source>Failed to create log file %1 .</source>
+ <translation>Aanmaken van log bestand %1 mislukt.</translation>
+ </message>
+ <message>
+ <source>Cannot open file for reading: %1</source>
+ <translation>Bestand kan niet geopend worden om te lezen: %1</translation>
+ </message>
+ <message>
+ <source>File system error while reading file %1 .</source>
+ <translation>Bestandssysteem fout tijdens lezen van file %1 .</translation>
+ </message>
+ <message>
+ <source>Cannot open file for writing: %1</source>
+ <translation>Bestand niet geopend worden om te schrijven: %1</translation>
+ </message>
+ <message>
+ <source>File system error while writing file %1 .</source>
+ <translation>Bestandssysteem fout tijdens schrijven van bestand %1 .</translation>
+ </message>
+ <message>
+ <source>Excessive number of socket errors.</source>
+ <translation>Excessief aantal socket fouten.</translation>
+ </message>
+ <message>
+ <source>Built with support for:</source>
+ <translation>Gebouwd met ondersteuning voor:</translation>
+ </message>
+ <message>
+ <source>Contributions:</source>
+ <translation>Bijdragen:</translation>
+ </message>
+ <message>
+ <source>This software contains the following software from 3rd parties:</source>
+ <translation>Deze software bevat de volgende software van derden:</translation>
+ </message>
+ <message>
+ <source>* GSM codec from Jutta Degener and Carsten Bormann, University of Berlin</source>
+ <translation>* GSM codec van Jutta Degener en Carsten Bormann, Universiteit van Berlijn</translation>
+ </message>
+ <message>
+ <source>* G.711/G.726 codecs from Sun Microsystems (public domain)</source>
+ <translation>* G.711/G.726 codecs van Sun Microsystems (public domain)</translation>
+ </message>
+ <message>
+ <source>* iLBC implementation from RFC 3951 (www.ilbcfreeware.org)</source>
+ <translation>* iLBC implementatie uit RFC 3951 (www.ilbcfreeware.org)</translation>
+ </message>
+ <message>
+ <source>* Parts of the STUN project at http://sourceforge.net/projects/stun</source>
+ <translation>* Delen van het STUN project op http://sourceforge.net/projects/stun</translation>
+ </message>
+ <message>
+ <source>* Parts of libsrv at http://libsrv.sourceforge.net/</source>
+ <translation>* Delen van libsrv op http://libsrv.sourceforge.net/</translation>
+ </message>
+ <message>
+ <source>For RTP the following dynamic libraries are linked:</source>
+ <translation>Voor RTP zijn de volgende dynamische libraries gelinkt:</translation>
+ </message>
+ <message>
+ <source>Translated to english by &lt;your name&gt;</source>
+ <translation>Nederlandse vertaling door Michel de Boer</translation>
+ </message>
+ <message>
+ <source>Cannot open file %1 .</source>
+ <translation>Betand %1 kan niet geopend worden.</translation>
+ </message>
+ <message>
+ <source>%1 is not set to your home directory.</source>
+ <translation>%1 heeft niet de waarde van uw thuis folder.</translation>
+ </message>
+ <message>
+ <source>Directory %1 (%2) does not exist.</source>
+ <translation>Folder %1 (%2) bestaat niet.</translation>
+ </message>
+ <message>
+ <source>Cannot create directory %1 .</source>
+ <translation>Folder %1 kan niet aangemaakt worden.</translation>
+ </message>
+ <message>
+ <source>Cannot create %1 .</source>
+ <translation>%1 kan niet aangemaakt worden.</translation>
+ </message>
+ <message>
+ <source>Cannot write to %1 .</source>
+ <translation type="obsolete">Kan niet schrijven naar %1 .</translation>
+ </message>
+ <message>
+ <source>Syntax error in file %1 .</source>
+ <translation>Syntactische fout in bestand %1 .</translation>
+ </message>
+ <message>
+ <source>Failed to backup %1 to %2</source>
+ <translation>Backuppen van %1 naar %2 mislukt</translation>
+ </message>
+ <message>
+ <source>unknown name (device is busy)</source>
+ <translation>naam onbekend (apparaat bezet)</translation>
+ </message>
+ <message>
+ <source>Default device</source>
+ <translation>Default apparaat</translation>
+ </message>
+ <message>
+ <source>Anonymous</source>
+ <translation>Anoniem</translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation>Waarschuwing:</translation>
+ </message>
+ <message>
+ <source>Call transfer - %1</source>
+ <translation>Doorverbinden - %1</translation>
+ </message>
+ <message>
+ <source>Sound card cannot be set to full duplex.</source>
+ <translation>Geluidskaart werkt niet in full duplex modus.</translation>
+ </message>
+ <message>
+ <source>Cannot set buffer size on sound card.</source>
+ <translation>De buffergrootte van de geluidskaart kan niet ingesteld worden.</translation>
+ </message>
+ <message>
+ <source>Sound card cannot be set to %1 channels.</source>
+ <translation>Geluidskaar ondersteunt geen %1 kanalen.</translation>
+ </message>
+ <message>
+ <source>Cannot set sound card to 16 bits recording.</source>
+ <translation>Geluidskaart ondersteunt geen 16 bits opname.</translation>
+ </message>
+ <message>
+ <source>Cannot set sound card to 16 bits playing.</source>
+ <translation>Geluidskaar ondersteunt geen 16 bits afspelen.</translation>
+ </message>
+ <message>
+ <source>Cannot set sound card sample rate to %1</source>
+ <translation>Geluidskaar ondersteunt sampling rate %1 niet</translation>
+ </message>
+ <message>
+ <source>Opening ALSA driver failed</source>
+ <translation>Openen ALSA stuurprogramma mislukt</translation>
+ </message>
+ <message>
+ <source>Cannot open ALSA driver for PCM playback</source>
+ <translation>ALSA stuur programma voor PCM afspelen kan niet geopend worden</translation>
+ </message>
+ <message>
+ <source>Cannot resolve STUN server: %1</source>
+ <translation>IP adres van STUN server niet gevonden: %1</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>U bevindt zich achter een symmetrische NAT.
+STUN zal niet werken.
+Configureer uw publieke IP adres in uw gebruikersprofiel
+en creëer de volgende statische UDP mapping in uw NAT.</translation>
+ </message>
+ <message>
+ <source>public IP: %1 --&gt; private IP: %2 (SIP signaling)</source>
+ <translation>publiek IP: %1 --&gt; privé IP: %2 (SIP signalering)</translation>
+ </message>
+ <message>
+ <source>public IP: %1-%2 --&gt; private IP: %3-%4 (RTP/RTCP)</source>
+ <translation>publiek IP: %1-%2 --&gt; privé IP: %3-%4 (RTP/RTCP)</translation>
+ </message>
+ <message>
+ <source>Cannot reach the STUN server: %1</source>
+ <translation>STUN server onbereikbaar: %1</translation>
+ </message>
+ <message>
+ <source>Port %1 (SIP signaling)</source>
+ <translation>Poort %1 (SIP signalering)</translation>
+ </message>
+ <message>
+ <source>NAT type discovery via STUN failed.</source>
+ <translation>Verkenning van NAT type via STUN is mislukt.</translation>
+ </message>
+ <message>
+ <source>If you are behind a firewall then you need to open the following UDP ports.</source>
+ <translation>Als u zich achter een firewall bevindt dan moet u de volgende UDP poorten open zetten.</translation>
+ </message>
+ <message>
+ <source>Ports %1-%2 (RTP/RTCP)</source>
+ <translation>Poorten %1-%2 (RTP/RTCP)</translation>
+ </message>
+ <message>
+ <source>Cannot access the ring tone device (%1).</source>
+ <translation>Ring tone apparaat niet beschikbaar (%1).</translation>
+ </message>
+ <message>
+ <source>Cannot access the speaker (%1).</source>
+ <translation>Speaker niet beschikbaar (%1).</translation>
+ </message>
+ <message>
+ <source>Cannot access the microphone (%1).</source>
+ <translation>Microfoon niet beschikbaar (%1).</translation>
+ </message>
+ <message>
+ <source>Cannot open ALSA driver for PCM capture</source>
+ <translation>ALSA stuurapparaat kan niet geopend worden voor openemen</translation>
+ </message>
+ <message>
+ <source>Cannot receive incoming TCP connections.</source>
+ <translation>Kan geen inkomende TCP verbindingen ontvangen.</translation>
+ </message>
+ <message>
+ <source>Failed to create file %1</source>
+ <translation>Creëren van bestand %1 mislukt</translation>
+ </message>
+ <message>
+ <source>Failed to write data to file %1</source>
+ <translation>Schrijven naar bestand %1 mislukt</translation>
+ </message>
+ <message>
+ <source>Failed to send message.</source>
+ <translation>Zenden bericht mislukt.</translation>
+ </message>
+ <message>
+ <source>Cannot lock %1 .</source>
+ <translation>Kan geen lock zetten op %1 .</translation>
+ </message>
+</context>
+<context>
+ <name>UserProfileForm</name>
+ <message>
+ <source>Twinkle - User Profile</source>
+ <translation>Twinkle - Gebruikersprofiel</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Gebruikersprofiel:</translation>
+ </message>
+ <message>
+ <source>Select which profile you want to edit.</source>
+ <translation>Kies het gebruikersprofiel dat u wilt bewerken.</translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation>Gebruiker</translation>
+ </message>
+ <message>
+ <source>SIP server</source>
+ <translation>SIP server</translation>
+ </message>
+ <message>
+ <source>RTP audio</source>
+ <translation>RTP audio</translation>
+ </message>
+ <message>
+ <source>SIP protocol</source>
+ <translation>SIP protocol</translation>
+ </message>
+ <message>
+ <source>NAT</source>
+ <translation type="obsolete">NAT</translation>
+ </message>
+ <message>
+ <source>Address format</source>
+ <translation>Adresformaat</translation>
+ </message>
+ <message>
+ <source>Timers</source>
+ <translation>Timers</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <translation>Ring tones</translation>
+ </message>
+ <message>
+ <source>Scripts</source>
+ <translation>Scripts</translation>
+ </message>
+ <message>
+ <source>Security</source>
+ <translation>Beveiliging</translation>
+ </message>
+ <message>
+ <source>Select a category for which you want to see or modify the settings.</source>
+ <translation>Kies de categorie die u wilt bewerken.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>Accept and save your changes.</source>
+ <translation>Bewaar uw wijzigingen.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>Undo all your changes and close the window.</source>
+ <translation>Maak alle wijzigingen ongedaan en sluit het venster.</translation>
+ </message>
+ <message>
+ <source>SIP account</source>
+ <translation>SIP account</translation>
+ </message>
+ <message>
+ <source>&amp;User name*:</source>
+ <translation>Ge&amp;bruikersnaam*:</translation>
+ </message>
+ <message>
+ <source>&amp;Domain*:</source>
+ <translation>&amp;Domein*:</translation>
+ </message>
+ <message>
+ <source>Or&amp;ganization:</source>
+ <translation>Or&amp;ganisatie:</translation>
+ </message>
+ <message>
+ <source>The SIP user name given to you by your provider. It is the user part in your SIP address, &lt;b&gt;username&lt;/b&gt;@domain.com This could be a telephone number.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>De SIP gebruikersnaam die u van uw provider heeft gekregen. Dit het gebruikersdeel in uw SIP adres, &lt;b&gt;gebruikersnaame&lt;/b&gt;@domein.nl Dit kan een telefoonnummer zijn.
+&lt;br&gt;&lt;br&gt;
+Dit is een verplicht veld.</translation>
+ </message>
+ <message>
+ <source>The domain part of your SIP address, username@&lt;b&gt;domain.com&lt;/b&gt;. Instead of a real domain this could also be the hostname or IP address of your &lt;b&gt;SIP proxy&lt;/b&gt;. If you want direct IP phone to IP phone communications then you fill in the hostname or IP address of your computer.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>Dit is het domein deel van uw SIP adres, gebruikersnaame@&lt;b&gt;domein.nl&lt;/b&gt;. In plaats van een echt domein kan dit ook de host naam of het IP van uw &lt;b&gt;SIP proxy&lt;/b&gt; zijn. Als u direct van IP adres naar IP adres wilt bellen, dan vult u hier de host naam of IP adres van uw computer in.
+&lt;br&gt;&lt;br&gt;
+Dit is een verplicht veld.</translation>
+ </message>
+ <message>
+ <source>You may fill in the name of your organization. When you make a call, this might be shown to the called party.</source>
+ <translation>Hier kunt u de naam van uw organisatie invullen. Als u iemand belt, dan kan dit getoond worden.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Dit is uw eigen naam. bijv. Jan Jansen. Als u iemand belt, kan deze naam getoond worden.</translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation>U&amp;w naam:</translation>
+ </message>
+ <message>
+ <source>SIP authentication</source>
+ <translation>SIP authenticatie</translation>
+ </message>
+ <message>
+ <source>&amp;Realm:</source>
+ <translation>&amp;Realm:</translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>&amp;Paswoord:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>De authenticatie realm. Deze waarde moet verstrekt worden door uw SIP provider. Als u dit veld leeg laat, dan zal Twinkle automatisch de realm gebruiken die de SIP proxy stuurt. Als u de realm niet weet, laat dit veld dan leeg.</translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation>Uw SIP gebruikersnaam voor authenticatie. Meestal is dit hetzelfde als uw SIP gebruikersnaam.</translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation>Uw paswoord voor authenticatie.</translation>
+ </message>
+ <message>
+ <source>Registrar</source>
+ <translation>Registratie server</translation>
+ </message>
+ <message>
+ <source>&amp;Registrar:</source>
+ <translation>&amp;Registratie server:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>De host naam, domein naam of IP adres van uw registratie server. Als u een uitgaande proxy gebruikt die tevens uw registratie server is, dan kunt u dit veld leeg laten en alleen het adres voor de uitgaande proxy invullen.</translation>
+ </message>
+ <message>
+ <source>&amp;Expiry:</source>
+ <translation>&amp;Interval:</translation>
+ </message>
+ <message>
+ <source>The registration expiry time that Twinkle will request.</source>
+ <translation>Het registratie interval dat Twinkle zal aanvragen.</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>sec</translation>
+ </message>
+ <message>
+ <source>Re&amp;gister at startup</source>
+ <translation>Re&amp;gistreer tijdens opstarten</translation>
+ </message>
+ <message>
+ <source>Alt+G</source>
+ <translation>Alt+G</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Geeft aan of Twinkle zich automatisch moet registrerent als u dit gebruikersprofiel start. U moet deze optie uitschakelen als u direct van IP adres naar IP adres wilt bellen zonder tussenkomst van een SIP proxy.</translation>
+ </message>
+ <message>
+ <source>Outbound Proxy</source>
+ <translation>Uitgaande Proxy</translation>
+ </message>
+ <message>
+ <source>&amp;Use outbound proxy</source>
+ <translation>&amp;Gebruik uitgaande proxy</translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation>Alt+G</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Geeft aan dat Twinkle een uitgaande proxy moet gebruiken. Als een uitgaande proxy gebruikt wordt, dan worden alle SIP berichten naar die proxy gestuurd. Zonder uitgaande proxy, zal Twinkle zelf proberen om een SIP adres naar een IP adres te veralen.</translation>
+ </message>
+ <message>
+ <source>Outbound &amp;proxy:</source>
+ <translation>Uitgaande &amp;proxy:</translation>
+ </message>
+ <message>
+ <source>&amp;Send in-dialog requests to proxy</source>
+ <translation>&amp;Stuur &quot;in-dialog SIP request&quot; naar de proxy</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>SIP verzoeken binnen een SIP dialog worden normaliter naar het adres uit de contact-header gestuurd. Dit adres wordt tijdens de gespreksopbouw bepaald. Als u deze optie aanvinkt, dan zal Twinkle dat adres negeren en zullen in-dialog requests ook naar de uitgaande proxy gestuurd worden.</translation>
+ </message>
+ <message>
+ <source>&amp;Don&apos;t send a request to proxy if its destination can be resolved locally.</source>
+ <translation>Stuur een &amp;verzoek niet naar de proxy als de bestemming lokaal bepaald kan worden.</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>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.)</source>
+ <translation>Als u deze optie aanvinkt, dan zal Twinkle eerst zelf proberen om een SIP adres naar een IP adres te vertalen. Als dat lukt, dan zal het SIP verzoek naar dat IP adres worden gestuurd. Als dat niet lukt dan wordt het verzoek naar de proxy gestuurd (letop: als het om een in-dialog request gaat, dan moet ook de voorgaande optie aan staan, als u wilt dat deze naar de proxy gaat.)</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of your outbound proxy.</source>
+ <translation>Host naam, domein of IP adres van uw uitgaande proxy.</translation>
+ </message>
+ <message>
+ <source>Codecs</source>
+ <translation>Codecs</translation>
+ </message>
+ <message>
+ <source>Available codecs:</source>
+ <translation>Beschikbare codecs:</translation>
+ </message>
+ <message>
+ <source>G.711 A-law</source>
+ <translation>G.711 A-law</translation>
+ </message>
+ <message>
+ <source>G.711 u-law</source>
+ <translation>G.711 u-law</translation>
+ </message>
+ <message>
+ <source>GSM</source>
+ <translation>GSM</translation>
+ </message>
+ <message>
+ <source>speex-nb (8 kHz)</source>
+ <translation>speex-nb (8 kHz)</translation>
+ </message>
+ <message>
+ <source>speex-wb (16 kHz)</source>
+ <translation>speex-wb (16 kHz)</translation>
+ </message>
+ <message>
+ <source>speex-uwb (32 kHz)</source>
+ <translation>speex-uwb (32 kHz)</translation>
+ </message>
+ <message>
+ <source>List of available codecs.</source>
+ <translation>Lijst met beschikbare codecs.</translation>
+ </message>
+ <message>
+ <source>Move a codec from the list of available codecs to the list of active codecs.</source>
+ <translation>Verplaats een codec van de lijst met beschikbare codecs naar de lijst met actieve codecs.</translation>
+ </message>
+ <message>
+ <source>Move a codec from the list of active codecs to the list of available codecs.</source>
+ <translation>Verplaats een codec van de lijst met actieve codecs naar de lijst met beschikbare codecs.</translation>
+ </message>
+ <message>
+ <source>Active codecs:</source>
+ <translation>Actieve codecs:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Lijst met actieve codecs. Deze codecs worden gebruikt in de media onderhandeling tijdens de gespreksopbouw. De volgorde van de codecs geeft de voorkeur aan.</translation>
+ </message>
+ <message>
+ <source>Move a codec upwards in the list of active codecs, i.e. increase its preference of use.</source>
+ <translation>Schuif een codec omhoog in de lijst met actieve codec, d.w.z. verhoog de voorkeur.</translation>
+ </message>
+ <message>
+ <source>Move a codec downwards in the list of active codecs, i.e. decrease its preference of use.</source>
+ <translation>Verschuif een codec omlaag in de lijst met actieve codecs, d.w.z. verlaag de voorkeur.</translation>
+ </message>
+ <message>
+ <source>&amp;G.711/G.726 payload size:</source>
+ <translation>&amp;G.711/G.726 payload grootte:</translation>
+ </message>
+ <message>
+ <source>The preferred payload size for the G.711 and G.726 codecs.</source>
+ <translation>De gewenste payload grootte voor de G.711 en G.726 codecs.</translation>
+ </message>
+ <message>
+ <source>ms</source>
+ <translation>ms</translation>
+ </message>
+ <message>
+ <source>&amp;iLBC</source>
+ <translation>&amp;iLBC</translation>
+ </message>
+ <message>
+ <source>iLBC</source>
+ <translation>iLBC</translation>
+ </message>
+ <message>
+ <source>i&amp;LBC payload type:</source>
+ <translation>i&amp;LBC payload type:</translation>
+ </message>
+ <message>
+ <source>iLBC &amp;payload size (ms):</source>
+ <translation>iLBC &amp;payload grootte (ms):</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for iLBC.</source>
+ <translation>Het dynamische payload type (96 of hoger) voor iLBC.</translation>
+ </message>
+ <message>
+ <source>20</source>
+ <translation>20</translation>
+ </message>
+ <message>
+ <source>30</source>
+ <translation>30</translation>
+ </message>
+ <message>
+ <source>The preferred payload size for iLBC.</source>
+ <translation>De gewenste payload grootte voor iLBC.</translation>
+ </message>
+ <message>
+ <source>&amp;Speex</source>
+ <translation>&amp;Speex</translation>
+ </message>
+ <message>
+ <source>Speex</source>
+ <translation>Speex</translation>
+ </message>
+ <message>
+ <source>Perceptual &amp;enhancement</source>
+ <translation>Perceptual &amp;enhancement</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation>Alt+W</translation>
+ </message>
+ <message>
+ <source>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).</source>
+ <translation>Perceptual enhancement tracht de ruis geproduceert door het coderings/decoderings proces te verminderen (een subjectieve verbetering).</translation>
+ </message>
+ <message>
+ <source>&amp;Ultra wide band payload type:</source>
+ <translation>U&amp;ltra wide band payload type:</translation>
+ </message>
+ <message>
+ <source>&amp;VAD</source>
+ <translation type="obsolete">&amp;VAD</translation>
+ </message>
+ <message>
+ <source>Alt+V</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>When enabled, voice activity detection detects whether the audio being encoded is speech or silence/background noise. VAD is always implicitly activated when encoding in VBR, so the option is only useful in non-VBR operation. In this case, Speex detects non-speech periods and encode them with just enough bits to reproduce the background noise. This is called &quot;comfort noise generation&quot; (CNG).</source>
+ <translation type="obsolete">Voice activity detection detecteert of de opgenomen audio spraak of stilte dan wel achtergrondruis is. VAD staat atlijd impliciet aan als VBR wordt gebruikt. VAD is dus alleen nutting als VBR uitstaat. De Speex codec stuurt dan slechts een paar bits tijdens stilte periodes. Dit heet comfort noise generation (CNG).</translation>
+ </message>
+ <message>
+ <source>&amp;Wide band payload type:</source>
+ <translation>&amp;Wide band payload type:</translation>
+ </message>
+ <message>
+ <source>V&amp;BR</source>
+ <translation type="obsolete">V&amp;BR</translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation>Alt+B</translation>
+ </message>
+ <message>
+ <source>Variable bit-rate (VBR) allows a codec to change its bit-rate dynamically to adapt to the &quot;difficulty&quot; 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&apos;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.</source>
+ <translation>Met variable bit-rate (VBR) past de codec de bit-rate dynamisch aan aan de complexiteit van de opgenomen audio.</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for speex wide band.</source>
+ <translation>Het dynamische payload type (96 of hoger) voor speex wide band.</translation>
+ </message>
+ <message>
+ <source>Co&amp;mplexity:</source>
+ <translation>Co&amp;mplexiteit:</translation>
+ </message>
+ <message>
+ <source>DT&amp;X</source>
+ <translation type="obsolete">DT&amp;X</translation>
+ </message>
+ <message>
+ <source>Alt+X</source>
+ <translation type="obsolete">Alt+X</translation>
+ </message>
+ <message>
+ <source>Discontinuous transmission is an addition to VAD/VBR operation, that allows to stop transmitting completely when the background noise is stationary.</source>
+ <translation>Discontinuous transmission (DTX) is een extra optie boven op VAD. Met DTX wordt helemaal niets gestuurd tijdens stilte periodes.</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for speex narrow band.</source>
+ <translation>Het dynamische payload type (96 of hoger) voor speex narrow band.</translation>
+ </message>
+ <message>
+ <source>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&apos;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.</source>
+ <translation>Voor Speex kan de complexiteit van de encoder ingesteld worden. Deze instelling is vergelijkbaar met de -1 tot -9 opties voor gzip en bzip2 compressie. Voor normaal gebruik is het ruisniveau bij complexiteit 1 tussen de 1 en 2 dB hoger dan bij complexiteit 10. De benodigde CPU kracht is bij complexiteit 10 ongeveer 5 keer zo hoog als bij complexiteit 1. In de praktijk is een complexiteit tussen 2 en 4 genoeg. Hogere complexiteit kan nuttig zijn bij het versturen van niet-spraak audio, bijvoorbeeld DTMF tonen.</translation>
+ </message>
+ <message>
+ <source>&amp;Narrow band payload type:</source>
+ <translation>&amp;Narrow band payload type:</translation>
+ </message>
+ <message>
+ <source>G.726</source>
+ <translation>G.726</translation>
+ </message>
+ <message>
+ <source>G.726 &amp;40 kbps payload type:</source>
+ <translation>G.726 &amp;40 kbps payload type:</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 40 kbps.</source>
+ <translation>Het dynamische payload type (96 of hoger) voor G.726 40 kbps.</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 32 kbps.</source>
+ <translation>Het dynamische payload type (96 of hoger) voor G.726 32 kbps.</translation>
+ </message>
+ <message>
+ <source>G.726 &amp;24 kbps payload type:</source>
+ <translation>G.726 &amp;24 kbps payload type:</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 24 kbps.</source>
+ <translation>Het dynamische payload type (96 of hoger) voor G.726 24 kbps.</translation>
+ </message>
+ <message>
+ <source>G.726 &amp;32 kbps payload type:</source>
+ <translation>G.726 &amp;32 kbps payload type:</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 16 kbps.</source>
+ <translation>Het dynamische payload type (96 of hoger) voor G.726 16 kbps.</translation>
+ </message>
+ <message>
+ <source>G.726 &amp;16 kbps payload type:</source>
+ <translation>G.726 &amp;16 kbps payload type:</translation>
+ </message>
+ <message>
+ <source>DT&amp;MF</source>
+ <translation>DT&amp;MF</translation>
+ </message>
+ <message>
+ <source>DTMF</source>
+ <translation>DTMF</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for DTMF events (RFC 2833).</source>
+ <translation>Het dynamische payload type (96 of hoger) voor DTMF (RFC 2833).</translation>
+ </message>
+ <message>
+ <source>DTMF vo&amp;lume:</source>
+ <translation>DTMF vo&amp;lume:</translation>
+ </message>
+ <message>
+ <source>The power level of the DTMF tone in dB.</source>
+ <translation>Het volume van de DTMF toon in dB.</translation>
+ </message>
+ <message>
+ <source>The pause after a DTMF tone.</source>
+ <translation>Pauze na het sturen van een DTMF toon.</translation>
+ </message>
+ <message>
+ <source>DTMF &amp;duration:</source>
+ <translation>DTMF &amp;duur:</translation>
+ </message>
+ <message>
+ <source>DTMF payload &amp;type:</source>
+ <translation>DTMF payload &amp;type:</translation>
+ </message>
+ <message>
+ <source>DTMF &amp;pause:</source>
+ <translation>DTMF &amp;pauze:</translation>
+ </message>
+ <message>
+ <source>dB</source>
+ <translation>dB</translation>
+ </message>
+ <message>
+ <source>Duration of a DTMF tone.</source>
+ <translation>Duur van een DTMF toon.</translation>
+ </message>
+ <message>
+ <source>DTMF t&amp;ransport:</source>
+ <translation>DTMF t&amp;ransport:</translation>
+ </message>
+ <message>
+ <source>Auto</source>
+ <translation>Auto</translation>
+ </message>
+ <message>
+ <source>RFC 2833</source>
+ <translation>RFC 2833</translation>
+ </message>
+ <message>
+ <source>Inband</source>
+ <translation>Inband</translation>
+ </message>
+ <message>
+ <source>Out-of-band (SIP INFO)</source>
+ <translation>Out-of-band (SIP INFO)</translation>
+ </message>
+ <message>
+ <source>&lt;h2&gt;RFC 2833&lt;/h2&gt;
+&lt;p&gt;Send DTMF tones as RFC 2833 telephone events.&lt;/p&gt;
+&lt;h2&gt;Inband&lt;/h2&gt;
+&lt;p&gt;Send DTMF inband.&lt;/p&gt;
+&lt;h2&gt;Auto&lt;/h2&gt;
+&lt;p&gt;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.
+&lt;/p&gt;
+&lt;h2&gt;Out-of-band (SIP INFO)&lt;/h2&gt;
+&lt;p&gt;
+Send DTMF out-of-band via a SIP INFO request.
+&lt;/p&gt;</source>
+ <translation>&lt;h2&gt;RFC 2833&lt;/h2&gt;
+&lt;p&gt;Stuur DTMF tonen als RFC 2833 events.&lt;/p&gt;
+&lt;h2&gt;Inband&lt;/h2&gt;
+&lt;p&gt;Stuur DTMF inband toon.&lt;/p&gt;
+&lt;h2&gt;Auto&lt;/h2&gt;
+&lt;p&gt;Als de andere partij RFC 2833 ondersteund dan wordt RFC 2833 gebruikt, anders wordt de DTMF toon inband gestuurd.
+&lt;/p&gt;
+&lt;h2&gt;Out-of-band (SIP INFO)&lt;/h2&gt;
+&lt;p&gt;
+Stuur DTMF out-of-band in een SIP INFO verzoek.
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Algemeen</translation>
+ </message>
+ <message>
+ <source>Redirection</source>
+ <translation>Doorverwijzen</translation>
+ </message>
+ <message>
+ <source>&amp;Allow redirection</source>
+ <translation>St&amp;a doorverwijzen toe</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Ask user &amp;permission to redirect</source>
+ <translation>&amp;Vraag toestemming voor doorverwijzen</translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should ask the user before redirecting a request when a 3XX response is received.</source>
+ <translation>Geeft aan of Twinkle de gebruiker om toestemming moet vragen alvorens een verzoek door te verwijzen bij een 3XX antwoord.</translation>
+ </message>
+ <message>
+ <source>Max re&amp;directions:</source>
+ <translation>Max &amp;doorverwijzingen:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Het maximaal aantal doorverwijzingen dat Twinkle probeert om een verzoek af te leveren. Dit maximum voorkomt dat een verzoek eeuwig wordt doorverwezen.</translation>
+ </message>
+ <message>
+ <source>Protocol options</source>
+ <translation>Protocol opties</translation>
+ </message>
+ <message>
+ <source>Call &amp;Hold variant:</source>
+ <translation>Wac&amp;ht variant:</translation>
+ </message>
+ <message>
+ <source>RFC 2543</source>
+ <translation>RFC 2543</translation>
+ </message>
+ <message>
+ <source>RFC 3264</source>
+ <translation>RFC 3264</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Geeft aan of RFC 2543 (zet media IP adres in SDP op 0.0.0.0) of RFC 3264 (gebruikt &quot;direction&quot; attribuut in SDP) gebruikt moet worden om een gesprek in de wacht te plaatsen.</translation>
+ </message>
+ <message>
+ <source>Allow m&amp;issing Contact header in 200 OK on REGISTER</source>
+ <translation>Ontbrekende Contact header &amp;in 200 OK op REGISTER toegestaan</translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation>Alt+I</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Een 200 OK antwoord op een REGISTER verzoek moet een Contact header bevatten. Sommige registratie servers stoppen echter geen of een foutieve Contact header de 200 OK. Met deze optie staat u een dergelijke afwijking van de specificaties toe.</translation>
+ </message>
+ <message>
+ <source>&amp;Max-Forwards header is mandatory</source>
+ <translation>&amp;Max-Forwards header verplicht</translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation>Alt+M</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Volgens RFC 3261 is de Max-Forwards header verplicht. Veel implementaties sturen deze header echter niet. Als u deze optie aanvinkt, dan zal Twinkle een SIP verzoek zonder Max-Forwards weigeren.</translation>
+ </message>
+ <message>
+ <source>Put &amp;registration expiry time in contact header</source>
+ <translation>&amp;Registratie interval in contact header</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt+R</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>In een REGISTER verzoek kan het registratie interval zowel in de Contact header als in de Expires header geplaatst worden. Als u deze optie aanvinkt, dan wordt het interval in de Contact header geplaatst, anders in de Expires header.</translation>
+ </message>
+ <message>
+ <source>&amp;Use compact header names</source>
+ <translation>&amp;Compacte header namen</translation>
+ </message>
+ <message>
+ <source>Indicates if compact header names should be used for headers that have a compact form.</source>
+ <translation>Geeft aan of compacte header namen gebruikt moeten worden voor headers die een compacte naam hebben.</translation>
+ </message>
+ <message>
+ <source>Allow SDP change during call setup</source>
+ <translation>SDP wijziging tijdens gespreksopbouw toestaan</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;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.&lt;/p&gt;
+&lt;p&gt;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.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Een SIP UAS kan SDP in een 1XX antwoord sturen voor bijvoorbeeld een ring back tone. Als het gesprek beantwoord wordt, dan moet de SIP UAS dezelfde SDP in de 200 OK sturen volgens RFC 3261: &lt;i&gt;Once SDP has been received, SDP in subsequent responses should be discarded.&lt;/i&gt;&lt;/p&gt;
+&lt;p&gt;Door een SDP wijziging toe te staan, zal Twinkle de SDP in de 200 OK niet negeren in dit geval en de media parameters aanpassen. Als de SDP wijzigt, dan moet die wel een nieuwe versienummer in de o= lijn hebben.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Twinkle creates a unique contact header value by combining the SIP user name and domain:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;tt&gt;&amp;nbsp;user_domain@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+This way 2 user profiles, having the same user name but different domain names, have unique contact addresses and hence can be activated simultaneously.
+&lt;/p&gt;
+&lt;p&gt;
+Some proxies do not handle a contact header value like this. You can disable this option to get a contact header value like this:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;tt&gt;&amp;nbsp;user@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+This format is what most SIP phones use.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;
+Twinkle maakt een unieke contact header waarde door de SIP gebruikersnaam te combineren met de domeinnaam:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;tt&gt;&amp;nbsp;gebruikersnaam_domeinnaam@ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+Zo krijgen 2 gebruikersprofielen met dezelfde gebruikersnaam, maar verschillende domeinnamen, toch een uniek contact adres. Hierdoor kunnen beide profielen tegelijkertijd geactiveerd worden.
+&lt;/p&gt;
+&lt;p&gt;
+Sommige proxies vinden dit niet leuk. U kunt deze optie uitzetten voor een meer gangbare contact header:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;tt&gt;&amp;nbsp;gebruikersnaam@ip&lt;/tt&gt;
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Encode Via, Route, Record-Route as list</source>
+ <translation>Cod&amp;eer Via, Route, Record-Route als lijst</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>De Via, Route en Record-Route headers kunnen als een lijst met door komma&apos;s gescheiden waarden worden gecodeerd of als meerdere voorkomens van dezelfde header.</translation>
+ </message>
+ <message>
+ <source>SIP extensions</source>
+ <translation>SIP extensies</translation>
+ </message>
+ <message>
+ <source>&amp;100 rel (PRACK):</source>
+ <translation>&amp;100 rel (PRACK):</translation>
+ </message>
+ <message>
+ <source>disabled</source>
+ <translation>uitgeschakeld</translation>
+ </message>
+ <message>
+ <source>supported</source>
+ <translation>ondersteund</translation>
+ </message>
+ <message>
+ <source>required</source>
+ <translation>vereist</translation>
+ </message>
+ <message>
+ <source>preferred</source>
+ <translation>voorkeur</translation>
+ </message>
+ <message>
+ <source>Indicates if the 100rel extension (PRACK) is supported:&lt;br&gt;&lt;br&gt;
+&lt;b&gt;disabled&lt;/b&gt;: 100rel extension is disabled
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;supported&lt;/b&gt;: 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.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;required&lt;/b&gt;: 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.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;preferred&lt;/b&gt;: 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.</source>
+ <translation>Geeft aan of de 100rel extensie (PRACK) wordt ondersteund:
+&lt;b&gt;uitgeschakeld&lt;/b&gt;: 100rel extensie is uitgeschakeld
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;ondersteund&lt;/b&gt;: 100rel wordt ondersteund (wordt toegevoegd aan de supported header in een INVITE).
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;vereist&lt;/b&gt;: 100rel is vereist (wordt toegevoegd aan de require header in een INVITE). Als een inkomende INVITE ondersteuning aangeeft voor 100rel, dan zal Twinkle een PRACK eisen bij het sturen van een 1XX antwoord. Een gesprek mislukt als de andere partij 100rel niet ondersteund.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;voorkeur&lt;/b&gt;: Vergelijkbaar met &lt;b&gt;vereist&lt;/b&gt;, maar als het gesprek mislukt omdat de andere partij 100rel niet ondersteund (420 antwoord), dan wordt het gesprek nogmaals opgezet zonder de 100rel eis.</translation>
+ </message>
+ <message>
+ <source>REFER</source>
+ <translation>REFER</translation>
+ </message>
+ <message>
+ <source>Call transfer (REFER)</source>
+ <translation>Doorverbinden (REFER)</translation>
+ </message>
+ <message>
+ <source>Allow call &amp;transfer (incoming REFER)</source>
+ <translation type="obsolete">Doorverbinden &amp;toestaan (inkomende REFER)</translation>
+ </message>
+ <message>
+ <source>Alt+T</source>
+ <translation>Alt+T</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should transfer a call if a REFER request is received.</source>
+ <translation>Geeft aan of Twinkle een gesprek moet doorverbinden als een REFER verzoek wordt ontvangen.</translation>
+ </message>
+ <message>
+ <source>As&amp;k user permission to transfer</source>
+ <translation>&amp;Vraag toestemming voor doorverbinden</translation>
+ </message>
+ <message>
+ <source>Alt+K</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should ask the user before transferring a call when a REFER request is received.</source>
+ <translation>Geeft aan of Twinkle de gebruiker om toestemming moet vragen alvorens een gesprek door te verbinden als een REFER verzoek ontvangen wordt.</translation>
+ </message>
+ <message>
+ <source>Hold call &amp;with referrer while setting up call to transfer target</source>
+ <translation>Zet de partij die u doorverbindt in de &amp;wacht tijdens doorverbinden</translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation>Alt+W</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should put the current call on hold when a REFER request to transfer a call is received.</source>
+ <translation>Geeft aan of Twinkle het huidige gesprek in de wacht moet zetten als een REFER verzoek is ontvangen.</translation>
+ </message>
+ <message>
+ <source>Ho&amp;ld call with referee before sending REFER</source>
+ <translation>&amp;Zet andere partij in de wacht voor sturen REFER</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+Z</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should put the current call on hold when you transfer a call.</source>
+ <translation>Geeft aan of Twinkle de andere partij in de wacht moet zetten als u een gesprek doorverbindt.</translation>
+ </message>
+ <message>
+ <source>Auto re&amp;fresh subscription to refer event while call transfer is not finished</source>
+ <translation>Automatisch verversen van re&amp;fer subscriptie tijdens doorverbinden</translation>
+ </message>
+ <message>
+ <source>Alt+F</source>
+ <translation>Alt+F</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Tijdens doorverbinden, stuurt de partij die wordt doorverbonden NOTIFY berichten naar de partij die doorverbindt. Deze NOTIFY berichten geven de voortgang van het doorverbinden aan. Deze berichten worden voor een bepaalde tijdsduur gestuurd. Als u deze optie aanvinkt, dan zal Twinkle automatisch een SUBSCRIBE verzoek sturen om de tijdsduur te verlengen als deze verloopt voordat het doorverbinden klaar is.</translation>
+ </message>
+ <message>
+ <source>NAT traversal</source>
+ <translation>NAT oplossing</translation>
+ </message>
+ <message>
+ <source>&amp;NAT traversal not needed</source>
+ <translation>Geen &amp;NAT</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation>Alt+N</translation>
+ </message>
+ <message>
+ <source>Choose this option when there is no NAT device between you and your SIP proxy or when your SIP provider offers hosted NAT traversal.</source>
+ <translation>Kies deze optie als er geen router met netwerk adres translatie (NAT) zit tussen u en uw SIP proxy of als uw SIP provider &quot;hosted NAT traversal&quot; biedt.</translation>
+ </message>
+ <message>
+ <source>&amp;Use statically configured public IP address inside SIP messages</source>
+ <translation>St&amp;atisch publiek IP adres in SIP berichten</translation>
+ </message>
+ <message>
+ <source>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.&lt;br&gt;&lt;br&gt;
+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.</source>
+ <translation>Geeft aan of Twinkle een statisch IP adres in de SIP berichten moet plaatsen, bijv. in headers en SDP in plaats van het prive IP adres van uw netwerk interface.&lt;br&gt;&lt;br&gt;
+Als u deze optie kiest, dan moet u teven een adres vertaling in uw NAT router aanbrengen. U moet dezelfde RTP poorten op het publieke en prive adres gebruiken.</translation>
+ </message>
+ <message>
+ <source>Use &amp;STUN</source>
+ <translation type="obsolete">&amp;STUN</translation>
+ </message>
+ <message>
+ <source>Choose this option when your SIP provider offers a STUN server for NAT traversal.</source>
+ <translation>Kies deze optie als uw SIP provider een STUN server aanbiedt.</translation>
+ </message>
+ <message>
+ <source>S&amp;TUN server:</source>
+ <translation>S&amp;TUN server:</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of the STUN server.</source>
+ <translation>Host naam, domeinnaam of IP adres van de STUN server.</translation>
+ </message>
+ <message>
+ <source>&amp;Public IP address:</source>
+ <translation>&amp;Publiek IP adres:</translation>
+ </message>
+ <message>
+ <source>The public IP address of your NAT.</source>
+ <translation>Het publieke IP adres van uw NAT router.</translation>
+ </message>
+ <message>
+ <source>Telephone numbers</source>
+ <translation>Telefoonnummers</translation>
+ </message>
+ <message>
+ <source>Only &amp;display user part of URI for telephone number</source>
+ <translation>Toon alleen gebruikers&amp;deel van een URI voor een telnr</translation>
+ </message>
+ <message>
+ <source>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 &quot;123456&quot; to the user. A URI indicates a telephone number if it contains the &quot;user=phone&quot; parameter or when it has a numerical user part and you ticked the next option.</source>
+ <translation>Als een URI een telefoonnummer is, toon dan alleen het gebruikersdeel. Voorbeeld: een gesprek komt binnen van sip:123456@twinklephone.com, dan wordt alleen &quot;123456&quot; getoond. Een URI is een telefoonnummer als het de parameter &quot;user=phone&quot; bevat of als het gebruikersdeel numeriek is en u vinkt de volgende optie aan.</translation>
+ </message>
+ <message>
+ <source>&amp;URI with numerical user part is a telephone number</source>
+ <translation>URI met &amp;numeriek gebruikersdeel is een telefoonnumer</translation>
+ </message>
+ <message>
+ <source>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 &quot;user=phone&quot; parameter to such a URI.</source>
+ <translation>Als u deze optie aanvinkt, dan ziet Twinkle een SIP adres dat bestaat uit cijfers, *, #, + en speciale symbolen als een telefoonnummer. In een uitgaand bericht, zal Twinkle dan de parameter &quot;user=phone&quot; toevoegen.</translation>
+ </message>
+ <message>
+ <source>&amp;Remove special symbols from numerical dial strings</source>
+ <translation>Ve&amp;rwijder speciale symbolen van numerieke strings</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Telefoonnummers worden vaak opgeschreven met speciale symbolen zoals streepjes voor de leesbaarheid. Als u een dergelijk nummer draait, dan moeten de speciale symbolen niet gedraaid worden. Om ervoor te zorgen dat u makkelijke telefoonnumers kan knippen en plakken naar Twinkle, kan Twinkle deze symbolen verwijderen als u op de &quot;bel&quot; knop drukt.</translation>
+ </message>
+ <message>
+ <source>&amp;Special symbols:</source>
+ <translation>&amp;Speciale symbolen:</translation>
+ </message>
+ <message>
+ <source>The special symbols that may be part of a telephone number for nice formatting, but must be removed when dialing.</source>
+ <translation>De speciale symbolen die in een telefoonnummer kunnen staan voor de leesbaarheid, maar die verwijderd moeten worden bij het bellen.</translation>
+ </message>
+ <message>
+ <source>Number conversion</source>
+ <translation>Nummer conversie</translation>
+ </message>
+ <message>
+ <source>Match expression</source>
+ <translation>Match expressie</translation>
+ </message>
+ <message>
+ <source>Replace</source>
+ <translation>Vervang</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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 &apos;00&apos; instead of the &apos;+&apos;, or you are at the office and all your numbers need to be prefixed with a &apos;9&apos; to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings.
+&lt;/p&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;p&gt;
+The number conversion rules are also applied to incoming calls, so the numbers are displayed in the format you want.
+&lt;/p&gt;
+&lt;h3&gt;Example 1&lt;/h3&gt;
+&lt;p&gt;
+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 &apos;+31&apos; and replace it by a &apos;0&apos;. For dialling numbers abroad you just want to replace the &apos;+&apos; by &apos;00&apos;.
+&lt;/p&gt;
+&lt;p&gt;
+The following rules will do the trick:
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expression = \+31([0-9]*) , Replace = 0$1&lt;br&gt;
+Match expression = \+([0-9]*) , Replace = 00$1&lt;/br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;h3&gt;Example 2&lt;/h3&gt;
+&lt;p&gt;
+You are at work and all telephone numbers starting with a 0 should be prefixed with a 9 for an outside line.
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expression = 0[0-9]* , Replace = 9$&amp;&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;</source>
+ <translation>&lt;p&gt;
+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 &apos;00&apos; in plaats van het +-teken, of u bent op kantoor en u moet eerst een &apos;9&apos; draaien om naar buiten te bellen. Hier kunt u nummerformaatconversie definieren m.b.v. reguliere expressies en vervang strings (Perl syntax).
+&lt;/p&gt;
+&lt;p&gt;
+Voor elk nummer dat u draait probeer Twinkle een match te vinden in de lijst met match expressies. Voor de eerste match die gevonden wordt, wordt het nummer vervangen door de vervang string. Als er geen match is, dan blijft het nummer onveranderd.
+&lt;/p&gt;
+&lt;p&gt;
+Nummerconversie wordt ook toegepast op inkomende gesprekken, zodat de nummers getoond worden zoals u dat wilt.
+&lt;/p&gt;
+&lt;h3&gt;Voorbeeld 1&lt;/h3&gt;
+&lt;p&gt;
+Uw landencode is 31 en u heeft alle nummers in uw adresboek in volledig internationaal formaat opgeslagen, bijv. +318712345678. Om nummers binnen Nederland te draaien wilt u de &apos;+31&apos; vervangen door &apos;0&apos;. Voor het draaien van buitenlandse nummers wilt u de &apos;+&apos; vervangen door &apos;00&apos;.
+&lt;/p&gt;
+&lt;p&gt;
+De volgende match/vervang regels doen dit voor u:
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expressie = \+31([0-9]*) , Vervang = 0$1&lt;br&gt;
+Match expressie = \+([0-9]*) , Vervang = 00$1&lt;/br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;h3&gt;Voorbeeld 2&lt;/h3&gt;
+&lt;p&gt;
+U bent op kantoor en alle nummers met een 0 moeten voorafgegaan worden door een 9 voor een buitenlijn.
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expressie = 0[0-9]* , Vervang = 9$&amp;&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;</translation>
+ </message>
+ <message>
+ <source>Move the selected number conversion rule upwards in the list.</source>
+ <translation>Schuif de geselecteerde conversie omhoog in de lijst.</translation>
+ </message>
+ <message>
+ <source>Move the selected number conversion rule downwards in the list.</source>
+ <translation>Schuif de geselecteerde conversie omlaag in de lijst.</translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation>To&amp;evoegen</translation>
+ </message>
+ <message>
+ <source>Add a number conversion rule.</source>
+ <translation>Voeg een nummerconversie toe.</translation>
+ </message>
+ <message>
+ <source>Re&amp;move</source>
+ <translation>&amp;Verwijder</translation>
+ </message>
+ <message>
+ <source>Remove the selected number conversion rule.</source>
+ <translation>Verwijder de geselcteerde nummerconversie.</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Bewerk</translation>
+ </message>
+ <message>
+ <source>Edit the selected number conversion rule.</source>
+ <translation>Bewerk de geselecteerde nummerconversie.</translation>
+ </message>
+ <message>
+ <source>Type a telephone number here an press the Test button to see how it is converted by the list of number conversion rules.</source>
+ <translation>Voer een telefoonnummer in en druk op de Test-knop om te zien hoe het nummer geconverteerd wordt door de lijst van nummerconversies.</translation>
+ </message>
+ <message>
+ <source>&amp;Test</source>
+ <translation>&amp;Test</translation>
+ </message>
+ <message>
+ <source>Test how a number is converted by the number conversion rules.</source>
+ <translation>Test hoe een nummer geconverteerd wordt door de nummerconversies.</translation>
+ </message>
+ <message>
+ <source>for STUN</source>
+ <translation type="obsolete">STUN</translation>
+ </message>
+ <message>
+ <source>Keep alive timer for the STUN protocol. If you have enabled STUN, then Twinkle will send keep alive packets at this interval rate to keep the address bindings in your NAT device alive.</source>
+ <translation type="obsolete">Keep alive timer voor het STUN protocol. Als u STUN aan heeft gezet, dan zal Twinkle keep alive pakketjes sturen met deze snelheid om de adresbindingen in uw NAT router in leven te houden.</translation>
+ </message>
+ <message>
+ <source>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 &quot;480 User Not Responding&quot;.</source>
+ <translation>Als een gesprek binnenkomt, dan wordt deze timer gestart. Als de gebruiker antwoordt, dan wordt de timer gestopt. Als de timer afloopt voordat de gebruiker antwoordt, dan weigert Twinkle het gesprek met &quot;480 User Not Responding&quot;.</translation>
+ </message>
+ <message>
+ <source>NAT &amp;keep alive:</source>
+ <translation>NAT &amp;keep alive:</translation>
+ </message>
+ <message>
+ <source>&amp;No answer:</source>
+ <translation>Gee&amp;n antwoord:</translation>
+ </message>
+ <message>
+ <source>Ring &amp;back tone:</source>
+ <translation>Ring &amp;back tone:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Specify the file name of a .wav file that you want to be played as ring back tone for this user.
+&lt;/p&gt;
+&lt;p&gt;
+This ring back tone overrides the ring back tone settings in the system settings.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;
+Naam van het .wav bestand dat u gespeeld wilt hebben als ring back tone voor dit gebruikersprofiel.
+&lt;/p&gt;
+&lt;p&gt;
+Deze ring back tone heeft voorrang boven de ring back tone in de systeeminstellingen.
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Specify the file name of a .wav file that you want to be played as ring tone for this user.
+&lt;/p&gt;
+&lt;p&gt;
+This ring tone overrides the ring tone settings in the system settings.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;
+Naam van het .wav bestand dat u gespeeld wilt hebben als ring tone voor dit gebruikersprofiel.
+&lt;/p&gt;
+&lt;p&gt;
+Deze ring back tone heeft voorrang boven de ring tone in de systeeminstellingen.
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Ring tone:</source>
+ <translation>&amp;Ring tone:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you release a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing SIP BYE request are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=local_release&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the BYE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Dit script wordt aangeroepen als u een gesprek beëindigd.
+&lt;/p&gt;
+&lt;h2&gt;Variabelen&lt;/h2&gt;
+&lt;p&gt;
+De waarden van alle SIP headers van de uitgaande SIP BYE verzoek worden via variabelen aan uw script doorgegeven.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=local_release&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; bevat request-URI van de BYE. &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; bevat de gebruikersprofielnaam.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when an incoming call fails.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing SIP failure response are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_failed&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; contains the status code of the failure response. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Dit script wordt aangeroepen als een inkomend gesprek mislukt.
+&lt;/p&gt;
+&lt;h2&gt;Variabelen&lt;/h2&gt;
+De waarden van alle SIP headers van de uitgaande SIP fout indicatie worden via variabelen aan uw script doorgegeven.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_failed&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; bevat de status code de fout indicatie. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; bevat de foutmelding. &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; bevat de gebruikersprofielnaam.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when the remote party releases a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming SIP BYE request are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=remote_release&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the BYE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Dit script wordt aangeroepen als de andere partij het gesprek beëindigd.
+&lt;/p&gt;
+&lt;h2&gt;Variabelen&lt;/h2&gt;
+&lt;p&gt;
+De waarden van alle SIP headers van de inkomende SIP BYE worden via variabelen aan uw script doorgegeven.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=remote_release&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; bevat de request-URI van de BYE. &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; bevat de gebruikersprofielnaam.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when the remote party answers your call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming 200 OK are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_answered&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Dit script wordt aangeroepen als de andere partij uw gesprek beantwoordt.
+&lt;/p&gt;
+&lt;h2&gt;Variabelen&lt;/h2&gt;
+&lt;p&gt;
+De waarden van alle SIP headers van de inkomende 200 OK worden via variabelen aan uw script doorgegeven.
+&lt;/p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_answered&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; bevat de status melding. &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; bevat de gebruikersprofielnaam.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you answer an incoming call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing 200 OK are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_answered&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Dit script wordt aangeroepen als u een inkomend gesprek beantwoordt.
+&lt;/p&gt;
+&lt;h2&gt;Variabelen&lt;/h2&gt;
+&lt;p&gt;
+De waarden van alle SIP headers van de uitgaande 200 OK worden via variabelen aan uw script doorgegeven.
+&lt;/p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_answered&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; bevat de status melding. &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; bevat de gebruikersprofielnaam.</translation>
+ </message>
+ <message>
+ <source>Call released locall&amp;y:</source>
+ <translation>Gesprek beëindigd &amp;door uzelf:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when an outgoing call fails.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming SIP failure response are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_failed&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; contains the status code of the failure response. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Dit script wordt aangeroepen als een uitgaand gesprek mislukt.
+&lt;/p&gt;
+&lt;h2&gt;Variabelen&lt;/h2&gt;
+&lt;p&gt;
+De waarden van alle SIP headers van de inkomende SIP foutmelding worden via variabelen aan uw script doorgegeven.
+&lt;/p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_failed&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; bevat de foutcode. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; bevat de foutmelding. &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; bevat de gebruikersprofielnaam.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you make a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing INVITE are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=INVITE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the INVITE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+Dit script wordt aangeroepen als u een nummer draait.
+&lt;/p&gt;
+&lt;h2&gt;Variabelen&lt;/h2&gt;
+&lt;p&gt;
+De waarden van alle SIP headers van de uitgaande SIP INVITE worden via variabelen aan uw script doorgegeven.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=INVITE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; bevat request-URI van de INVITE. &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; bevat de gebruikersprofielnaam.</translation>
+ </message>
+ <message>
+ <source>Outgoing call a&amp;nswered:</source>
+ <translation>Uitgaand gesprek bea&amp;ntwoord:</translation>
+ </message>
+ <message>
+ <source>Incoming call &amp;failed:</source>
+ <translation>Inkomend gesprek &amp;mislukt:</translation>
+ </message>
+ <message>
+ <source>&amp;Incoming call:</source>
+ <translation>&amp;Inkomend gesprek:</translation>
+ </message>
+ <message>
+ <source>Call released &amp;remotely:</source>
+ <translation>Gesp&amp;rek beëindigd door ander:</translation>
+ </message>
+ <message>
+ <source>Incoming call &amp;answered:</source>
+ <translation>Inkomend gesprek be&amp;antwoord:</translation>
+ </message>
+ <message>
+ <source>O&amp;utgoing call:</source>
+ <translation>Ui&amp;tgaand gesprek:</translation>
+ </message>
+ <message>
+ <source>Out&amp;going call failed:</source>
+ <translation>Uit&amp;gaand gesprek mislukt:</translation>
+ </message>
+ <message>
+ <source>&amp;Enable ZRTP/SRTP encryption</source>
+ <translation>ZRTP/SRTP &amp;encryptie</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>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.</translation>
+ </message>
+ <message>
+ <source>ZRTP settings</source>
+ <translation>ZRTP instellingen</translation>
+ </message>
+ <message>
+ <source>O&amp;nly encrypt audio if remote party indicated ZRTP support in SDP</source>
+ <translation>Allee&amp;n versleutelen als de andere partij ZRTP ondersteuning in SDP aangeeft</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Een SIP toestel kan tijdens de gespreksopbouw aangeven of het ZRTP ondersteunt. Met deze optie zal Twinkle de audio alleen proberen te versleutelen als de andere partij ondesteuning voor ZRTP gesignaleerd heeft.</translation>
+ </message>
+ <message>
+ <source>&amp;Indicate ZRTP support in SDP</source>
+ <translation>S&amp;ignaleer ZRTP ondersteuning in SDP</translation>
+ </message>
+ <message>
+ <source>Twinkle will indicate ZRTP support during call setup in its signalling.</source>
+ <translation>Twinkle zal tijdens gespreksopbouw aangeven dat het ZRTP ondersteunt.</translation>
+ </message>
+ <message>
+ <source>&amp;Popup warning when remote party disables encryption during call</source>
+ <translation>&amp;Popup waarschuwing als de andere partij versleuteling uitzet</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Als de andere partij tijdens een versleuteld gesprek een ZRTP go-clear commando stuurt om de versleuteling te stoppen, dan zal Twinkle een waarschuwing geven.</translation>
+ </message>
+ <message>
+ <source>Dynamic payload type %1 is used more than once.</source>
+ <translation>Dynamische payload type %1 is meer malen gebruikt.</translation>
+ </message>
+ <message>
+ <source>You must fill in a user name for your SIP account.</source>
+ <translation>U moet een gebruikersnaam voor uw SIP account invullen.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>U moet een domeinnaam voor uw SIP account invullen.
+Dit kan de host naam of IP adres van uw PC zijn als u direct van PC naar PC wilt bellen.</translation>
+ </message>
+ <message>
+ <source>Invalid user name.</source>
+ <translation>Ongeldige gebruikersnaam.</translation>
+ </message>
+ <message>
+ <source>Invalid domain.</source>
+ <translation>Ongeldig domein.</translation>
+ </message>
+ <message>
+ <source>Invalid value for registrar.</source>
+ <translation>Ongeldige waarde voor de registratie server.</translation>
+ </message>
+ <message>
+ <source>Invalid value for outbound proxy.</source>
+ <translation>Ongeldige waarde voor de uitgaande proxy.</translation>
+ </message>
+ <message>
+ <source>Value for public IP address missing.</source>
+ <translation>Publiek IP adres ontbreekt.</translation>
+ </message>
+ <message>
+ <source>Invalid value for STUN server.</source>
+ <translation>Ongeldige waarde voor STUN server.</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Ring tones</translation>
+ </message>
+ <message>
+ <source>Choose ring tone</source>
+ <translation>Kies ring tone</translation>
+ </message>
+ <message>
+ <source>Ring back tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Ring back tones</translation>
+ </message>
+ <message>
+ <source>All files</source>
+ <translation>Alle bestanden</translation>
+ </message>
+ <message>
+ <source>Choose incoming call script</source>
+ <translation>Kies script voor inkomende gesprekken</translation>
+ </message>
+ <message>
+ <source>Choose incoming call answered script</source>
+ <translation>Kies script voor beantwoording inkomend gesprek</translation>
+ </message>
+ <message>
+ <source>Choose incoming call failed script</source>
+ <translation>Kies script voor mislukken inkomend gesprek</translation>
+ </message>
+ <message>
+ <source>Choose outgoing call script</source>
+ <translation>Kies script voor uitgaande gesprekken</translation>
+ </message>
+ <message>
+ <source>Choose outgoing call answered script</source>
+ <translation>Kies script voor beantwoording uitgaande gesprek</translation>
+ </message>
+ <message>
+ <source>Choose outgoing call failed script</source>
+ <translation>Kies script voor mislukken uitgaande gesprek</translation>
+ </message>
+ <message>
+ <source>Choose local release script</source>
+ <translation>Kies script voor beëindigen gesprek door uzelf</translation>
+ </message>
+ <message>
+ <source>Choose remote release script</source>
+ <translation>Kies script voor beëindigen gesprek door ander</translation>
+ </message>
+ <message>
+ <source>Co&amp;decs</source>
+ <translation>Co&amp;decs</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should redirect a request if a 3XX response is received.</source>
+ <translation>Geeft aan of Twinkle een verzoek moet doorverwijzen als een 3XX antwoord wordt ontvangen.</translation>
+ </message>
+ <message>
+ <source>Authentication &amp;name:</source>
+ <translation>Authenticatie &amp;naam:</translation>
+ </message>
+ <message>
+ <source>Voice mail</source>
+ <translation>Voice mail</translation>
+ </message>
+ <message>
+ <source>&amp;Follow codec preference from far end on incoming calls</source>
+ <translation>&amp;Volg codec voorkeur van de beller bij inkomende gesprekken</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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.
+&lt;p&gt;
+If you disable this option, then the first codec from the active codecs that is also in the SDP offer is picked.</source>
+ <translation>&lt;p&gt;
+Volg de voorkeur van de beller (SDP aanbod) bij inkomende gesprekken. Neem de eerste codec uit het SDP aanbod dat ook in de lijst van actieve codecs voorkomt.
+&lt;p&gt;
+Als u deze optie uitschakeld, dan neemt Twinkle de eerste codec uit de actieve codec lijst die ook in het SDP aanbod voorkomt.</translation>
+ </message>
+ <message>
+ <source>Follow codec &amp;preference from far end on outgoing calls</source>
+ <translation>Volg &amp;codec voorkeur van de gebelde bij uitgaande gesprekken</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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.
+&lt;p&gt;
+If you disable this option, then the first codec from the active codecs that is also in the SDP answer is picked.</source>
+ <translation>&lt;p&gt;
+Volg de voorkeur van de gebelde (SDP antwoord) bij uitgaande gesprekken. Neem de eerste codec uit het SDP antwoord dat ook in de lijst van actieve codecs voorkomt.
+&lt;p&gt;
+Als u deze optie uitschakelt, dan neemt Twinkle de eerste codec uit de actieve codec lijst die ook in het SDP antwoord voorkomt.</translation>
+ </message>
+ <message>
+ <source>Replaces</source>
+ <translation>Replaces</translation>
+ </message>
+ <message>
+ <source>Indicates if the Replaces-extenstion is supported.</source>
+ <translation>Geeft aan of de Replaces-extensie ondersteund wordt.</translation>
+ </message>
+ <message>
+ <source>Attended refer to AoR (Address of Record)</source>
+ <translation>Begeleid doorverbinden maar AoR (Address of Record)</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>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.</translation>
+ </message>
+ <message>
+ <source>Privacy</source>
+ <translation>Privacy</translation>
+ </message>
+ <message>
+ <source>Privacy options</source>
+ <translation>Privacy opties</translation>
+ </message>
+ <message>
+ <source>&amp;Send P-Preferred-Identity header when hiding user identity</source>
+ <translation>&amp;Stuur P-Preferred-Identity header bij anonieme gesprekken</translation>
+ </message>
+ <message>
+ <source>Include a P-Preferred-Identity header with your identity in an INVITE request for a call with identity hiding.</source>
+ <translation>Stuur de P-Preferred-Identity header in een INVITE verzoek, als u uw identiteit verbergt bij het maken van een gesprek.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+You can customize the way Twinkle handles incoming calls. Twinkle can call a script when a call comes in. Based on the ouput 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.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Note:&lt;/b&gt; 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 &lt;b&gt;end&lt;/b&gt; and keep on running. Twinkle will continue when it receives the &lt;b&gt;end&lt;/b&gt; parameter.
+&lt;/p&gt;
+&lt;p&gt;
+With your script you can customize call handling by outputing one or more of the following parameters to stdout. Each parameter should be on a separate line.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+action=[ continue | reject | dnd | redirect | autoanswer ]&lt;br&gt;
+reason=&amp;lt;string&amp;gt;&lt;br&gt;
+contact=&amp;lt;address to redirect to&amp;gt;&lt;br&gt;
+caller_name=&amp;lt;name of caller to display&amp;gt;&lt;br&gt;
+ringtone=&amp;lt;file name of .wav file&amp;gt;&lt;br&gt;
+display_msg=&amp;lt;message to show on display&amp;gt;&lt;br&gt;
+end&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;/p&gt;
+&lt;h2&gt;Parameters&lt;/h2&gt;
+&lt;h3&gt;action&lt;/h3&gt;
+&lt;p&gt;
+&lt;b&gt;continue&lt;/b&gt; - continue call handling as usual&lt;br&gt;
+&lt;b&gt;reject&lt;/b&gt; - reject call&lt;br&gt;
+&lt;b&gt;dnd&lt;/b&gt; - deny call with do not disturb indication&lt;br&gt;
+&lt;b&gt;redirect&lt;/b&gt; - redirect call to address specified by &lt;b&gt;contact&lt;/b&gt;&lt;br&gt;
+&lt;b&gt;autoanswer&lt;/b&gt; - automatically answer a call&lt;br&gt;
+&lt;/p&gt;
+&lt;p&gt;
+When the script does not write an action to stdout, then the default action is continue.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;reason: &lt;/b&gt;
+With the reason parameter you can set the reason string for reject or dnd. This might be shown to the far-end user.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;caller_name: &lt;/b&gt;
+This parameter will override the display name of the caller.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;ringtone: &lt;/b&gt;
+The ringtone parameter specifies the .wav file that will be played as ring tone when action is continue.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+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 &lt;b&gt;SIP_&amp;lt;HEADER_NAME&amp;gt;&lt;/b&gt; E.g. SIP_FROM contains the value of the from header.
+&lt;/p&gt;
+&lt;p&gt;
+TWINKLE_TRIGGER=in_call. SIPREQUEST_METHOD=INVITE. The request-URI of the INVITE will be passed in &lt;b&gt;SIPREQUEST_URI&lt;/b&gt;. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation>&lt;p&gt;
+U kunt het gedrag waarmee Twinkle inkomende gesprekken afhandelt aanpassen met een script dat Twinkle aanroept als een gesprek binnenkomt. Afhankelijk van de output van het script accepteert of weigert Twinkle het gesprek of verwijst het door.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Let op:&lt;/b&gt; Twinkle staat stil als het script loopt. Het is aanbevolen dat uw script niet langer dan 200 ms loopt. Als u meer tijd nodig heeft, dan kunt u de parameters sturen gevolgd door &lt;b&gt;end&lt;/b&gt;. Twinkle gaat verder zodra het &lt;b&gt;end&lt;/b&gt; ontvangt, terwijl u script blijft draaien.
+&lt;/p&gt;
+&lt;p&gt;
+U kunt Twinkle sturen door de volgende parameters naar stdout te schrijven. Elk op een nieuwe regel.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+action=[ continue | reject | dnd | redirect | autoanswer ]&lt;br&gt;
+reason=&amp;lt;string&amp;gt;&lt;br&gt;
+contact=&amp;lt;adres voor doorverwijzen&amp;gt;&lt;br&gt;
+caller_name=&amp;lt;toon deze naam&amp;gt;&lt;br&gt;
+ringtone=&amp;lt;naam van .wav bestand&amp;gt;&lt;br&gt;
+display_msg=&amp;lt;toon bericht op scherm&amp;gt;&lt;br&gt;
+end&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;/p&gt;
+&lt;h2&gt;Parameters&lt;/h2&gt;
+&lt;h3&gt;action&lt;/h3&gt;
+&lt;p&gt;
+&lt;b&gt;continue&lt;/b&gt; - handel gesprek af op normale wijze&lt;br&gt;
+&lt;b&gt;reject&lt;/b&gt; - weiger gesprek&lt;br&gt;
+&lt;b&gt;dnd&lt;/b&gt; - weiger gesprek met niet-storen indicatie&lt;br&gt;
+&lt;b&gt;redirect&lt;/b&gt; - verwijs gesprek door naar &lt;b&gt;contact&lt;/b&gt;&lt;br&gt;
+&lt;b&gt;autoanswer&lt;/b&gt; - automatisch antwoorden&lt;br&gt;
+&lt;/p&gt;
+&lt;p&gt;
+Als een script geen actie op stdout zet, dan is de actie &quot;continue&quot;
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;reason: &lt;/b&gt;
+Met de reason parameter, zet u de SIP reason string voor reject of dnd. Dit kan getoond worden aan de gebruiker.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;caller_name: &lt;/b&gt;
+Toon deze naam in plaats van de display naam.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;ringtone: &lt;/b&gt;
+De ring tone die gespeeld moet worden als de actie &quot;continue&quot; is.
+&lt;/p&gt;
+&lt;h2&gt;Variables&lt;/h2&gt;
+&lt;p&gt;
+De waarden van alle SIP headers van de inkomende INVITE worden via variabelen aan uw script doorgegeven. De variabele namen zijn als volgt samengesteld &lt;b&gt;SIP_&amp;lt;HEADER_NAME&amp;gt;&lt;/b&gt; Bijv. SIP_FROM bevat de waarde van de from header.
+&lt;/p&gt;
+&lt;p&gt;
+TWINKLE_TRIGGER=in_call. SIPREQUEST_METHOD=INVITE. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; bevat de request-URI van de INVITE. &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt; bevat de gebruikersprofielnaam.</translation>
+ </message>
+ <message>
+ <source>&amp;Voice mail address:</source>
+ <translation>&amp;Voice mail adres:</translation>
+ </message>
+ <message>
+ <source>The SIP address or telephone number to access your voice mail.</source>
+ <translation>SIP adres of telefoonnummer van uw voice mail.</translation>
+ </message>
+ <message>
+ <source>Unsollicited</source>
+ <translation>Unsollicited</translation>
+ </message>
+ <message>
+ <source>Sollicited</source>
+ <translation>Sollicited</translation>
+ </message>
+ <message>
+ <source>&lt;H2&gt;Message waiting indication type&lt;/H2&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;H3&gt;Unsollicited&lt;/H3&gt;
+&lt;p&gt;
+Asterisk provides unsollicited message waiting indication.
+&lt;/p&gt;
+&lt;H3&gt;Sollicited&lt;/H3&gt;
+&lt;p&gt;
+Sollicited message waiting indication as specified by RFC 3842.
+&lt;/p&gt;</source>
+ <translation>&lt;H2&gt;Message waiting indication type&lt;/H2&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;H3&gt;Unsollicited&lt;/H3&gt;
+&lt;p&gt;
+Asterisk biedt unsollicited message waiting indication.
+&lt;/p&gt;
+&lt;H3&gt;Sollicited&lt;/H3&gt;
+&lt;p&gt;
+Sollicited message waiting indication zoals gespecificeerd in RFC 3842.
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;MWI type:</source>
+ <translation>&amp;MWI type:</translation>
+ </message>
+ <message>
+ <source>Sollicited MWI</source>
+ <translation>Sollicited MWI</translation>
+ </message>
+ <message>
+ <source>Subscription &amp;duration:</source>
+ <translation>Aanmeldings&amp;duur:</translation>
+ </message>
+ <message>
+ <source>Mailbox &amp;user name:</source>
+ <translation>Mailbox &amp;gebruikersnaam:</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of your voice mailbox server.</source>
+ <translation>De host naam, domeinnaam of IP adres van uw voice mailbox server.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Twinkle meldt zich voor een bepaalde periode aan bij de voice mailbox server. Net voordat deze periode verstrijkt, zal Twinkle zich opnieuw aanmelden.</translation>
+ </message>
+ <message>
+ <source>Your user name for accessing your voice mailbox.</source>
+ <translation>Uw gebruikersnaam voor toegang tot uw mailbox.</translation>
+ </message>
+ <message>
+ <source>Mailbox &amp;server:</source>
+ <translation>Mailbox &amp;server:</translation>
+ </message>
+ <message>
+ <source>Via outbound &amp;proxy</source>
+ <translation>Via uitgaande &amp;proxy</translation>
+ </message>
+ <message>
+ <source>Check this option if Twinkle should send SIP messages to the mailbox server via the outbound proxy.</source>
+ <translation>Vink deze optie aan als Twinkle de SIP berichten naar de mailbox server via de uitgaande proxy moet sturen.</translation>
+ </message>
+ <message>
+ <source>You must fill in a mailbox user name.</source>
+ <translation>U moet een mailbox gebruikersnaam invullen.</translation>
+ </message>
+ <message>
+ <source>You must fill in a mailbox server</source>
+ <translation>U moet een mailbox server invullen</translation>
+ </message>
+ <message>
+ <source>Invalid mailbox server.</source>
+ <translation>Ongeldige mailbox server.</translation>
+ </message>
+ <message>
+ <source>Invalid mailbox user name.</source>
+ <translation>Ongeldige mailbox gebruikersnaam.</translation>
+ </message>
+ <message>
+ <source>Codeword &amp;packing order:</source>
+ <translation>Codeword &amp;packing volgorde:</translation>
+ </message>
+ <message>
+ <source>RFC 3551</source>
+ <translation>RFC 3551</translation>
+ </message>
+ <message>
+ <source>ATM AAL2</source>
+ <translation>ATM AAL2</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Er zijn 2 methoden om G.726 codewords in een RTP pakket te stoppen. RFC 3551 is de default methode. Sommige SIP apparaten gebruiken de ATM AAL2 methode echter. Als bij het gebruik van G.726 met RFC 3551 packing de geluidskwaliteit slecht is, probeer dan ATM AAL2 packing.</translation>
+ </message>
+ <message>
+ <source>Use domain &amp;name to create a unique contact header value</source>
+ <translation>&amp;Gebruik domeinnaam voor een unieke contact header</translation>
+ </message>
+ <message>
+ <source>Select ring back tone file.</source>
+ <translation>Selecteer ring back tone bestand.</translation>
+ </message>
+ <message>
+ <source>Select ring tone file.</source>
+ <translation>Selecteer ring tone bestand.</translation>
+ </message>
+ <message>
+ <source>Select script file.</source>
+ <translation>Selecteer script bestand.</translation>
+ </message>
+ <message>
+ <source>%1 converts to %2</source>
+ <translation>%1 wordt geconverteerd naar %2</translation>
+ </message>
+ <message>
+ <source>Instant message</source>
+ <translation>Instant bericht</translation>
+ </message>
+ <message>
+ <source>Presence</source>
+ <translation>Beschikbaarheid</translation>
+ </message>
+ <message>
+ <source>&amp;Maximum number of sessions:</source>
+ <translation>&amp;Maximum aantal sessies:</translation>
+ </message>
+ <message>
+ <source>When you have this number of instant message sessions open, new incoming message sessions will be rejected.</source>
+ <translation>Als u het maximum aantal berichtensessies actief heeft, dan zullen inkomende berichten voor nieuwe sessies geweigerd worden.</translation>
+ </message>
+ <message>
+ <source>Your presence</source>
+ <translation>Uw beschikbaarheid</translation>
+ </message>
+ <message>
+ <source>&amp;Publish availability at startup</source>
+ <translation>&amp;Publiceer beschikbaarheid bij opstarten</translation>
+ </message>
+ <message>
+ <source>Publish your availability at startup.</source>
+ <translation>Publiceer uw beschikbaarheid bij opstarten.</translation>
+ </message>
+ <message>
+ <source>Buddy presence</source>
+ <translation>Beschikbaarheid van vrienden</translation>
+ </message>
+ <message>
+ <source>Publication &amp;refresh interval (sec):</source>
+ <translation>Publicatie &amp;interval (sec):</translation>
+ </message>
+ <message>
+ <source>Refresh rate of presence publications.</source>
+ <translation>Verversingssnelheid van beschikbaarheidspublicaties.</translation>
+ </message>
+ <message>
+ <source>&amp;Subscription refresh interval (sec):</source>
+ <translation>Aan&amp;meldingsinterval (sec):</translation>
+ </message>
+ <message>
+ <source>Refresh rate of presence subscriptions.</source>
+ <translation>Verversingsnelheid van beschikbaarheidsaanmeldingen.</translation>
+ </message>
+ <message>
+ <source>Transport/NAT</source>
+ <translation>Transport/NAT</translation>
+ </message>
+ <message>
+ <source>Add q-value to registration</source>
+ <translation>Voeg q-waarde toe aan registratie</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>De q-waarde is de prioriteit van een apparaat. Als u naast Twinkle nog andere SIP apparaten bij het netwerk registreert voor deze gebruiker, dan kan het netwerk deze waarde gebruiken om te bepalen op welk apparaat een gesprek als eerste afgeleverd moet worden.</translation>
+ </message>
+ <message>
+ <source>The q-value is a value between 0.000 and 1.000. A higher value means a higher priority.</source>
+ <translation>De q-waarde is een waarde tussen 0,000 en 1,000. Een hogere waarde betekent een hogere prioriteit.</translation>
+ </message>
+ <message>
+ <source>SIP transport</source>
+ <translation>SIP transport</translation>
+ </message>
+ <message>
+ <source>UDP</source>
+ <translation>UDP</translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <translation>TCP</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Transport modus voor SIP. In auto modus bepaalt de berichtgrootte welk transport protocol gebruikt wordt. Berichten groter dan de UDP drempel worden via TCP verstuurd. Kleinere berichten worden via UDP gestuurd.</translation>
+ </message>
+ <message>
+ <source>T&amp;ransport protocol:</source>
+ <translation>T&amp;ransport protocol:</translation>
+ </message>
+ <message>
+ <source>UDP t&amp;hreshold:</source>
+ <translation>UDP &amp;drempel:</translation>
+ </message>
+ <message>
+ <source> bytes</source>
+ <translation type="obsolete"> bytes</translation>
+ </message>
+ <message>
+ <source>Messages larger than the threshold are sent via TCP. Smaller messages are sent via UDP.</source>
+ <translation>Berichten groter dan de drempel worden via TCP verstuurd. Kleinere berichten worden via UDP verstuurd.</translation>
+ </message>
+ <message>
+ <source>Use &amp;STUN (does not work for incoming TCP)</source>
+ <translation>&amp;STUN (werkt niet voor inkomend TCP verkeer)</translation>
+ </message>
+ <message>
+ <source>P&amp;ersistent TCP connection</source>
+ <translation>P&amp;ersistente TCP verbinding</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>De TCP verbinding die opgezet wordt tijdens registratie blijft open, zodat de SIP proxy deze verbinding kan gebruiken om binnenkomende verzoeken te sturen. Ping pakketten worden gestuurd om te testen of de verbinding nog bestaat.</translation>
+ </message>
+ <message>
+ <source>&amp;Send composing indications when typing a message.</source>
+ <translation>&amp;Zend indicaties als u een bericht aan het schrijven bent.</translation>
+ </message>
+ <message>
+ <source>Twinkle sends a composing indication when you type a message. This way the recipient can see that you are typing.</source>
+ <translation>Twinkle stuurt een compositie indicatie als u een bericht aan het schrijven bent. De ontvanger van uw bericht kan dan zien dat u bezig bent met schrijven.</translation>
+ </message>
+ <message>
+ <source>AKA AM&amp;F:</source>
+ <translation>AkA AM&amp;F:</translation>
+ </message>
+ <message>
+ <source>A&amp;KA OP:</source>
+ <translation>A&amp;KA OP:</translation>
+ </message>
+ <message>
+ <source>Authentication management field for AKAv1-MD5 authentication.</source>
+ <translation>&quot;Authentication management field&quot; voor AKAv1-MD5 authenticatie.</translation>
+ </message>
+ <message>
+ <source>Operator variant key for AKAv1-MD5 authentication.</source>
+ <translation>&quot;Operator variant key&quot; voor AKAv1-MD5 authenticatie.</translation>
+ </message>
+ <message>
+ <source>Prepr&amp;ocessing</source>
+ <translation>V&amp;oorbewerking</translation>
+ </message>
+ <message>
+ <source>Preprocessing (improves quality at remote end)</source>
+ <translation>Voorbewerking (verbetert de geluidskwaliteit voor uw gesprekspartner)</translation>
+ </message>
+ <message>
+ <source>&amp;Automatic gain control</source>
+ <translation>&amp;Automatische sterkteregeling</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Automatische sterkteregeling versterkt zachte signalen en dempt luide signalen die door de microfoon worden opgenomen.</translation>
+ </message>
+ <message>
+ <source>Automatic gain control &amp;level:</source>
+ <translation>Niveau automatische sterkterege&amp;ling:</translation>
+ </message>
+ <message>
+ <source>Automatic gain control level represents percentual value of automatic gain setting of a microphone. Recommended value is about 25%.</source>
+ <translation>Een waarde rond 25% is aanbevolen voor een goede geluidskwaliteit.</translation>
+ </message>
+ <message>
+ <source>&amp;Voice activity detection</source>
+ <translation>&amp;Voice activity detection</translation>
+ </message>
+ <message>
+ <source>When enabled, voice activity detection detects whether the input signal represents a speech or a silence/background noise.</source>
+ <translation>&quot;Voice activity detection&quot; detecteteert of een signaal spraak of stilte/ruid bevat. Stilte/ruis wordt niet over het netwerk gestuurd waardoor minder bandbreedte gebruikt wordt.</translation>
+ </message>
+ <message>
+ <source>&amp;Noise reduction</source>
+ <translation>Ruisonderdrukki&amp;ng</translation>
+ </message>
+ <message>
+ <source>The noise reduction can be used to reduce the amount of background noise present in the input signal. This provides higher quality speech.</source>
+ <translation>Ruisonderdrukking vermindert achtergrondruis in het microfoonsignaal.</translation>
+ </message>
+ <message>
+ <source>Acoustic &amp;Echo Cancellation</source>
+ <translation>Acoustic &amp;Echo Cancellation</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Spraak uit de speakers wordt opgevangen door de microfoon waardoor uw gesprekspartner een echo waarneemt. &quot;Acoustic echo cancellation&quot; verwijdert deze echo.</translation>
+ </message>
+ <message>
+ <source>Variable &amp;bit-rate</source>
+ <translation>Variable &amp;bit-rate</translation>
+ </message>
+ <message>
+ <source>Discontinuous &amp;Transmission</source>
+ <translation>Discontinuous &amp;Transmission</translation>
+ </message>
+ <message>
+ <source>&amp;Quality:</source>
+ <translation>&amp;Kwaliteit:</translation>
+ </message>
+ <message>
+ <source>Speex is a lossy codec, which means that it achives 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.</source>
+ <translation>Speex comprimeert het geluidssignaal ten koste van de kwaliteit. Hoe meer compressie, hoe minder bandbreedte nodig is, maar hoe slechter de geluidskwaliteit. Deze kwaliteitsfactor (0 tot 10) bepaalt de trade-off tussen kwaliteit en compressie.</translation>
+ </message>
+ <message>
+ <source>bytes</source>
+ <translation>bytes</translation>
+ </message>
+ <message>
+ <source>Use tel-URI for telephone &amp;number</source>
+ <translation>Vestuur telefoon&amp;nummer als tel-URI</translation>
+ </message>
+ <message>
+ <source>Expand a dialed telephone number to a tel-URI instead of a sip-URI.</source>
+ <translation>Expandeer een telefoonnummer naar een tel-URI in plaats van een sip-URI.</translation>
+ </message>
+ <message>
+ <source>Accept call &amp;transfer request (incoming REFER)</source>
+ <translation>Accep&amp;teer doorverbindverzoek (inkomende REFER)</translation>
+ </message>
+ <message>
+ <source>Allow call transfer while consultation in progress</source>
+ <translation>Doorverbinden toestaan tijdens opbouw ruggespraak gesprek</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Bij doorverbinden met ruggespraak, verbindt u normaal pas door nadat u ruggespraak heeft gehouden. Met deze optie kunt u al doorverbinden terwijl het gesprek voor ruggespraak nog in opbouw is. Dit is een niet-standaard implementatie die mogelijk niet werkt met alle SIP apparaten.</translation>
+ </message>
+ <message>
+ <source>Enable NAT &amp;keep alive</source>
+ <translation>NAT &amp;keep alive</translation>
+ </message>
+ <message>
+ <source>Send UDP NAT keep alive packets.</source>
+ <translation>Stuur UDP NAT keep alive pakketten.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>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.</translation>
+ </message>
+</context>
+<context>
+ <name>WizardForm</name>
+ <message>
+ <source>Twinkle - Wizard</source>
+ <translation>Twinkle - Wizard</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of the STUN server.</source>
+ <translation>De host naam, domeinnaam of IP adres van de STUN server.</translation>
+ </message>
+ <message>
+ <source>S&amp;TUN server:</source>
+ <translation>S&amp;TUN server:</translation>
+ </message>
+ <message>
+ <source>The SIP user name given to you by your provider. It is the user part in your SIP address, &lt;b&gt;username&lt;/b&gt;@domain.com This could be a telephone number.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>De SIP gebruikersnaam die u van uw provider heeft gekregen. Dit het gebruikersdeel in uw SIP adres, &lt;b&gt;gebruikersnaame&lt;/b&gt;@domein.nl Dit kan een telefoonnummer zijn.
+&lt;br&gt;&lt;br&gt;
+Dit is een verplicht veld.</translation>
+ </message>
+ <message>
+ <source>&amp;Domain*:</source>
+ <translation>&amp;Domein*:</translation>
+ </message>
+ <message>
+ <source>Choose your SIP service provider. If your SIP service provider is not in the list, then select &lt;b&gt;Other&lt;/b&gt; and fill in the settings you received from your provider.&lt;br&gt;&lt;br&gt;
+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.</source>
+ <translation>Kies uw SIP provider. Als uw SIP provider niet in de lijst voorkomt, kies dan &lt;b&gt;Anders&lt;/b&gt; en vul de instellingen in die uw van uw provider hebt gekregen.&lt;br&gt;&lt;br&gt;
+Als u een voorgedefinieerde SIP provider kiest, dan hoeft u alleen uw eigen naam, gebruikersnaam, authenticatie naam en paswoord in te voeren.</translation>
+ </message>
+ <message>
+ <source>&amp;Authentication name:</source>
+ <translation>&amp;Authenticatie naam:</translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation>U&amp;w naam:</translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation>Uw SIP gebruikersnaam voor authenticatie. Meestal is dit hetzelfde als uw SIP gebruikersnaam.</translation>
+ </message>
+ <message>
+ <source>The domain part of your SIP address, username@&lt;b&gt;domain.com&lt;/b&gt;. Instead of a real domain this could also be the hostname or IP address of your &lt;b&gt;SIP proxy&lt;/b&gt;. If you want direct IP phone to IP phone communications then you fill in the hostname or IP address of your computer.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>Dit is het domein deel van uw SIP adres, gebruikersnaame@&lt;b&gt;domein.nl&lt;/b&gt;. In plaats van een echt domein kan dit ook de host naam of het IP van uw &lt;b&gt;SIP proxy&lt;/b&gt; zijn. Als u direct van IP adres naar IP adres wilt bellen, dan vult u hier de host naam of IP adres van uw computer in.
+&lt;br&gt;&lt;br&gt;
+Dit is een verplicht veld.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Dit is uw eigen naam. bijv. Jan Jansen. Als u iemand belt, kan deze naam getoond worden.</translation>
+ </message>
+ <message>
+ <source>SIP pro&amp;xy:</source>
+ <translation>SIP pro&amp;xy:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>De host naam, domeinnaam of IP adres van uw SIP proxy. Als deze hetzelfde is als uw domeinnaam, dan mag u dit veld leeg laten.</translation>
+ </message>
+ <message>
+ <source>&amp;SIP service provider:</source>
+ <translation>&amp;SIP provider:</translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>&amp;Paswoord:</translation>
+ </message>
+ <message>
+ <source>&amp;User name*:</source>
+ <translation>Ge&amp;bruikersnaam*:</translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation>Uw paswoord voor authenticatie.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>Ann&amp;uleren</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>None (direct IP to IP calls)</source>
+ <translation>Geen (directe IP naar IP gesprekken)</translation>
+ </message>
+ <message>
+ <source>Other</source>
+ <translation>Anders</translation>
+ </message>
+ <message>
+ <source>User profile wizard:</source>
+ <translation>Gebruikersprofiel wizard:</translation>
+ </message>
+ <message>
+ <source>You must fill in a user name for your SIP account.</source>
+ <translation>U moet een gebruikersnaam voor uw SIP account invullen.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>U moet een domeinnaam voor uw SIP account invullen.
+Dit kan de host naam of IP adres van uw PC zijn als u direct van PC naar PC wilt bellen.</translation>
+ </message>
+ <message>
+ <source>Invalid value for SIP proxy.</source>
+ <translation>Ongeldige waarde voor SIP proxy.</translation>
+ </message>
+ <message>
+ <source>Invalid value for STUN server.</source>
+ <translation>Ongeldige waared voor STUN server.</translation>
+ </message>
+</context>
+<context>
+ <name>YesNoDialog</name>
+ <message>
+ <source>&amp;Yes</source>
+ <translation>&amp;Ja</translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation>&amp;Nee</translation>
+ </message>
+</context>
+</TS>
diff --git a/src/gui/lang/twinkle_ru.ts b/src/gui/lang/twinkle_ru.ts
new file mode 100644
index 0000000..e71b60c
--- /dev/null
+++ b/src/gui/lang/twinkle_ru.ts
@@ -0,0 +1,5729 @@
+<!DOCTYPE TS><TS>
+<defaultcodec></defaultcodec>
+<context>
+ <name>AddressCardForm</name>
+ <message>
+ <source>Twinkle - Address Card</source>
+ <translation>Twinkle - Карточка абонента</translation>
+ </message>
+ <message>
+ <source>&amp;Remark:</source>
+ <translation>&amp;Описание:</translation>
+ </message>
+ <message>
+ <source>Infix name of contact.</source>
+ <translation>Префикс контакта.</translation>
+ </message>
+ <message>
+ <source>First name of contact.</source>
+ <translation>Имя контакта.</translation>
+ </message>
+ <message>
+ <source>&amp;First name:</source>
+ <translation>&amp;Имя:</translation>
+ </message>
+ <message>
+ <source>You may place any remark about the contact here.</source>
+ <translation>Вы можете вписать сюда любое описание этого контакта.</translation>
+ </message>
+ <message>
+ <source>&amp;Phone:</source>
+ <translation>&amp;Телефон:</translation>
+ </message>
+ <message>
+ <source>&amp;Infix name:</source>
+ <translation>&amp;Префикс имени:</translation>
+ </message>
+ <message>
+ <source>Phone number or SIP address of contact.</source>
+ <translation>Телефонный номер или SIP адрес контакта.</translation>
+ </message>
+ <message>
+ <source>Last name of contact.</source>
+ <translation>Фамилия контакта.</translation>
+ </message>
+ <message>
+ <source>&amp;Last name:</source>
+ <translation>&amp;Фамилия:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Принять</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Отмена</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>You must fill in a name.</source>
+ <translation>Вы должны заполнить поле имя.</translation>
+ </message>
+ <message>
+ <source>You must fill in a phone number or SIP address.</source>
+ <translation>Вы должны заполнить поле номер телефона или SIP адрес</translation>
+ </message>
+</context>
+<context>
+ <name>AuthenticationForm</name>
+ <message>
+ <source>Twinkle - Authentication</source>
+ <translation>Twinkle - Аутентификация</translation>
+ </message>
+ <message>
+ <source>user</source>
+ <comment>No need to translate</comment>
+ <translation>пользователь</translation>
+ </message>
+ <message>
+ <source>The user for which authentication is requested.</source>
+ <translation>Пользователь, для которого запрашивается аутентификация.</translation>
+ </message>
+ <message>
+ <source>profile</source>
+ <comment>No need to translate</comment>
+ <translation>профиль</translation>
+ </message>
+ <message>
+ <source>The user profile of the user for which authentication is requested.</source>
+ <translation>Профиль пользователя, для которого запрашивается аутентификация.</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Профиль пользователя:</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Пользователь:</translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>&amp;Пароль:</translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation>Ваш пароль для аутентификации.</translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation>Ваше аутентификационное имя для SIP. В большинстве случаем совпадает с именем пользователя SIP. Вы можете ввести здесь другое имя при необходимости.</translation>
+ </message>
+ <message>
+ <source>&amp;User name:</source>
+ <translation>&amp;Имя пользователя:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Записать</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Отмена</translation>
+ </message>
+ <message>
+ <source>Login required for realm:</source>
+ <translation>Имя требуемое для области:</translation>
+ </message>
+ <message>
+ <source>realm</source>
+ <comment>No need to translate</comment>
+ <translation>область</translation>
+ </message>
+ <message>
+ <source>The realm for which you need to authenticate.</source>
+ <translation>Область для которой нужна авторизация.</translation>
+ </message>
+</context>
+<context>
+ <name>BuddyForm</name>
+ <message>
+ <source>Twinkle - Buddy</source>
+ <translation>Twinkle - Друзья</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Адресная книга</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Выберите адрес из адресной книги.</translation>
+ </message>
+ <message>
+ <source>&amp;Phone:</source>
+ <translation>&amp;Телефон:</translation>
+ </message>
+ <message>
+ <source>Name of your buddy.</source>
+ <translation>Имя вашего друга.</translation>
+ </message>
+ <message>
+ <source>&amp;Show availability</source>
+ <translation>&amp;Показать доступность</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Check this option if you want to see the availability of your buddy. This will only work if your provider offers a presence agent.</source>
+ <translation>Выберите эту опцию если вы хотите видеть доступность вашего друга. Это работает, только если ваш провайдер предоставляет услугу проверки доступности.</translation>
+ </message>
+ <message>
+ <source>&amp;Name:</source>
+ <translation>&amp;Имя:</translation>
+ </message>
+ <message>
+ <source>SIP address your buddy.</source>
+ <translation>SIP адрес твоего друга.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Принять</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Отмена</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>You must fill in a name.</source>
+ <translation>Вы должны заполнить имя.</translation>
+ </message>
+ <message>
+ <source>Invalid phone.</source>
+ <translation>Не правильный телефон.</translation>
+ </message>
+ <message>
+ <source>Failed to save buddy list: %1</source>
+ <translation>Ошибка сохранения списка друзей: %1</translation>
+ </message>
+</context>
+<context>
+ <name>BuddyList</name>
+ <message>
+ <source>Availability</source>
+ <translation>Доступность</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>неизвестно</translation>
+ </message>
+ <message>
+ <source>offline</source>
+ <translation>не в сети</translation>
+ </message>
+ <message>
+ <source>online</source>
+ <translation>в сети</translation>
+ </message>
+ <message>
+ <source>request failed</source>
+ <translation>ошибка запроса</translation>
+ </message>
+ <message>
+ <source>request rejected</source>
+ <translation>запрос отклонён</translation>
+ </message>
+ <message>
+ <source>not published</source>
+ <translation>не опубликован</translation>
+ </message>
+ <message>
+ <source>failed to publish</source>
+ <translation>ошибка публикации</translation>
+ </message>
+ <message>
+ <source>Click right to add a buddy.</source>
+ <translation>Правый клик для добавления друзей.</translation>
+ </message>
+</context>
+<context>
+ <name>CoreAudio</name>
+ <message>
+ <source>Failed to open sound card</source>
+ <translation>Ошибка открытия звуковой карты</translation>
+ </message>
+ <message>
+ <source>Failed to create a UDP socket (RTP) on port %1</source>
+ <translation>Ошибка создания UDP сокета (RTP) на порту %1</translation>
+ </message>
+ <message>
+ <source>Failed to create audio receiver thread.</source>
+ <translation>Ошибка создания принимаемого аудиопотка.</translation>
+ </message>
+ <message>
+ <source>Failed to create audio transmitter thread.</source>
+ <translation>Ошибка создания передаваемого аудиопотка.</translation>
+ </message>
+</context>
+<context>
+ <name>CoreCallHistory</name>
+ <message>
+ <source>local user</source>
+ <translation>локальный пользователь</translation>
+ </message>
+ <message>
+ <source>remote user</source>
+ <translation>удалённый пользователь</translation>
+ </message>
+ <message>
+ <source>failure</source>
+ <translation>ошибка</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>неизвестно</translation>
+ </message>
+ <message>
+ <source>in</source>
+ <translation>входящий</translation>
+ </message>
+ <message>
+ <source>out</source>
+ <translation>исходящий</translation>
+ </message>
+</context>
+<context>
+ <name>DeregisterForm</name>
+ <message>
+ <source>Twinkle - Deregister</source>
+ <translation>Twinkle - Разрегистатрация</translation>
+ </message>
+ <message>
+ <source>deregister all devices</source>
+ <translation>разрегистрировать все устройства</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Принять</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Отмена</translation>
+ </message>
+</context>
+<context>
+ <name>DiamondcardProfileForm</name>
+ <message>
+ <source>Twinkle - Diamondcard User Profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your Diamondcard account ID.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Account ID:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;PIN code:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation type="unfinished">&amp;Ваше имя:</translation>
+ </message>
+ <message>
+ <source>&lt;p align=&quot;center&quot;&gt;&lt;u&gt;Sign up for a Diamondcard account&lt;/u&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Отмена</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fill in your account ID.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fill in your PIN code.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A user profile with name %1 already exists.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your Diamondcard PIN code.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;With a Diamondcard account you can make worldwide calls to regular and cell phones and send SMS messages. To sign up for a Diamondcard account click on the &quot;sign up&quot; link below. Once you have signed up you receive an account ID and PIN code. Enter the account ID and PIN code below to create a Twinkle user profile for your Diamondcard account.&lt;/p&gt;
+&lt;p&gt;For call rates see the sign up web page that will be shown to you when you click on the &quot;sign up&quot; link.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DtmfForm</name>
+ <message>
+ <source>Twinkle - DTMF</source>
+ <translation>Twinkle - DTMF</translation>
+ </message>
+ <message>
+ <source>Keypad</source>
+ <translation>Цифровая клавиатура</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Over decadic A. Normally not needed.</source>
+ <translation>Не цифровое A. Обычно не нужно.</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Over decadic B. Normally not needed.</source>
+ <translation>Не цифровое B. Обычно не нужно.</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Over decadic C. Normally not needed.</source>
+ <translation>Не цифровое C. Обычно не нужно.</translation>
+ </message>
+ <message>
+ <source>Star (*)</source>
+ <translation>Звезда (*)</translation>
+ </message>
+ <message>
+ <source>0</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Pound (#)</source>
+ <translation>Решётка (#)</translation>
+ </message>
+ <message>
+ <source>Over decadic D. Normally not needed.</source>
+ <translation>Не цифровое D. Обычно не нужно.</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>&amp;Закрыть</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>FreeDeskSysTray</name>
+ <message>
+ <source>Show/Hide</source>
+ <translation>Показать/Скрыть</translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation>Выход</translation>
+ </message>
+</context>
+<context>
+ <name>GUI</name>
+ <message>
+ <source>Failed to create a %1 socket (SIP) on port %2</source>
+ <translation>Ошибка создания %1 сокет (SIP) на порту %2</translation>
+ </message>
+ <message>
+ <source>Override lock file and start anyway?</source>
+ <translation>Перехватить файл блокировки и запуститься сейчас? </translation>
+ </message>
+ <message>
+ <source>The following profiles are both for user %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You can only run multiple profiles for different users.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If these are users for different domains, then enable the following option in your user profile (SIP protocol)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use domain name to create a unique contact header</source>
+ <translation>Используйте доменное имя для создания уникального заголовка контакта</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Не могу найти сетевой интерфейс. Twinkle будет использовать 127.0.0.1 как локальный IP адрес. Когда вы будете соединены с сетью перезапустите Twinkle для использования правильного IP адреса.</translation>
+ </message>
+ <message>
+ <source>Line %1: incoming call for %2</source>
+ <translation>Линия %1: входящий звонок для %2</translation>
+ </message>
+ <message>
+ <source>Call transferred by %1</source>
+ <translation>Звонок переведён к %1</translation>
+ </message>
+ <message>
+ <source>Line %1: far end cancelled call.</source>
+ <translation>Линия %1: удалённая сторона прервала звонок.</translation>
+ </message>
+ <message>
+ <source>Line %1: far end released call.</source>
+ <translation>Линия %1: удалённая сторона закончила звонок.</translation>
+ </message>
+ <message>
+ <source>Line %1: SDP answer from far end not supported.</source>
+ <translation>Линия %1: SDP ответ от удалённой стороны не поддерживается.</translation>
+ </message>
+ <message>
+ <source>Line %1: SDP answer from far end missing.</source>
+ <translation>Линия %1: SDP ответ от удалённой стороны отсутствует.</translation>
+ </message>
+ <message>
+ <source>Line %1: Unsupported content type in answer from far end.</source>
+ <translation>Линия %1: Не поддерживаемый тип содержимого в ответе от удалённой стороны.</translation>
+ </message>
+ <message>
+ <source>Line %1: no ACK received, call will be terminated.</source>
+ <translation>Линия %1: не получен ACK, звонок прерван.</translation>
+ </message>
+ <message>
+ <source>Line %1: no PRACK received, call will be terminated.</source>
+ <translation>Линия %1: не получен PRACK, звонок будет прерван.</translation>
+ </message>
+ <message>
+ <source>Line %1: PRACK failed.</source>
+ <translation>Линия %1: PRACK ошибка.</translation>
+ </message>
+ <message>
+ <source>Line %1: failed to cancel call.</source>
+ <translation>Линия %1: Ошибка завершения звонка.</translation>
+ </message>
+ <message>
+ <source>Line %1: far end answered call.</source>
+ <translation>Линия %1: удалённая сторона ответила на звонок.</translation>
+ </message>
+ <message>
+ <source>Line %1: call failed.</source>
+ <translation>Линия %1: Ошибка звонка.</translation>
+ </message>
+ <message>
+ <source>The call can be redirected to:</source>
+ <translation>Звонок будет переведён к:</translation>
+ </message>
+ <message>
+ <source>Line %1: call released.</source>
+ <translation>Линия %1: соединение завершено.</translation>
+ </message>
+ <message>
+ <source>Line %1: call established.</source>
+ <translation>Линия %1: соединение установлено.</translation>
+ </message>
+ <message>
+ <source>Response on terminal capability request: %1 %2</source>
+ <translation>Ответ на запрос органичений терминала: %1 %2</translation>
+ </message>
+ <message>
+ <source>Terminal capabilities of %1</source>
+ <translation>Ограничения терминала от %1</translation>
+ </message>
+ <message>
+ <source>Accepted body types:</source>
+ <translation>Разрешённые типы содержимого:</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>неизвестный</translation>
+ </message>
+ <message>
+ <source>Accepted encodings:</source>
+ <translation>Подтверждённые кодировки:</translation>
+ </message>
+ <message>
+ <source>Accepted languages:</source>
+ <translation>Подтверждённые языки:</translation>
+ </message>
+ <message>
+ <source>Allowed requests:</source>
+ <translation>Разрешённые запросы:</translation>
+ </message>
+ <message>
+ <source>Supported extensions:</source>
+ <translation>Поддерживаемые расширения:</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation>нету</translation>
+ </message>
+ <message>
+ <source>End point type:</source>
+ <translation>Тип конечной точки:</translation>
+ </message>
+ <message>
+ <source>Line %1: call retrieve failed.</source>
+ <translation>Линия %1: ошибка получения звонка.</translation>
+ </message>
+ <message>
+ <source>%1, registration failed: %2 %3</source>
+ <translation>%1, ошибка регистрации: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, registration succeeded (expires = %2 seconds)</source>
+ <translation>%1, регистрация завершена (устаревание = %2 секунд)</translation>
+ </message>
+ <message>
+ <source>%1, registration failed: STUN failure</source>
+ <translation>%1, ошибка регистрации: ошибка STUN</translation>
+ </message>
+ <message>
+ <source>%1, de-registration succeeded: %2 %3</source>
+ <translation>%1, разрегистрация состоялась: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, de-registration failed: %2 %3</source>
+ <translation>%1, ошибка разрегистрации: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, fetching registrations failed: %2 %3</source>
+ <translation>%1, ошибка проверки регистрации: %2 %3</translation>
+ </message>
+ <message>
+ <source>: you are not registered</source>
+ <translation>: вы не зарегистрированы</translation>
+ </message>
+ <message>
+ <source>: you have the following registrations</source>
+ <translation>: вы имеете следующие регистрации</translation>
+ </message>
+ <message>
+ <source>: fetching registrations...</source>
+ <translation>: проверка регистрации...</translation>
+ </message>
+ <message>
+ <source>Line %1: redirecting request to</source>
+ <translation>Линия %1: перенаправление запроса к</translation>
+ </message>
+ <message>
+ <source>Redirecting request to: %1</source>
+ <translation>Перенаправление запроса к: %1</translation>
+ </message>
+ <message>
+ <source>Line %1: DTMF detected:</source>
+ <translation>Линия %1: определён DTMF:</translation>
+ </message>
+ <message>
+ <source>invalid DTMF telephone event (%1)</source>
+ <translation>неправильное телефонное DTMF событие (%1)</translation>
+ </message>
+ <message>
+ <source>Line %1: send DTMF %2</source>
+ <translation>Линия %1: посылка DTMF %2</translation>
+ </message>
+ <message>
+ <source>Line %1: far end does not support DTMF telephone events.</source>
+ <translation>Линия %1: удалённая стороны не поддерживает DTMF события.</translation>
+ </message>
+ <message>
+ <source>Line %1: received notification.</source>
+ <translation>Линия %1: получено оповещение.</translation>
+ </message>
+ <message>
+ <source>Event: %1</source>
+ <translation>Событие %1</translation>
+ </message>
+ <message>
+ <source>State: %1</source>
+ <translation>Состояние: %1</translation>
+ </message>
+ <message>
+ <source>Reason: %1</source>
+ <translation>Причина: %1</translation>
+ </message>
+ <message>
+ <source>Progress: %1 %2</source>
+ <translation>Прогресс: %1 %2</translation>
+ </message>
+ <message>
+ <source>Line %1: call transfer failed.</source>
+ <translation>Линия %1: ошибка передачи звонка.</translation>
+ </message>
+ <message>
+ <source>Line %1: call succesfully transferred.</source>
+ <translation>Линия %1: Перевод звонка завершён.</translation>
+ </message>
+ <message>
+ <source>Line %1: call transfer still in progress.</source>
+ <translation>Линия %1: перевод звонка.</translation>
+ </message>
+ <message>
+ <source>No further notifications will be received.</source>
+ <translation>Никакие дальнейшие уведомления не будут получены.</translation>
+ </message>
+ <message>
+ <source>Line %1: transferring call to %2</source>
+ <translation>Линия %1. передача звонка к %2</translation>
+ </message>
+ <message>
+ <source>Transfer requested by %1</source>
+ <translation>Перевод запрошен %1</translation>
+ </message>
+ <message>
+ <source>Line %1: Call transfer failed. Retrieving original call.</source>
+ <translation>Линия %1: Ошибка передачи звонка. Получение оригинального звонка.</translation>
+ </message>
+ <message>
+ <source>%1, STUN request failed: %2 %3</source>
+ <translation>%1, ошибка STUN запроса: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, STUN request failed.</source>
+ <translation>%1, Ошибка STUN запроса.</translation>
+ </message>
+ <message>
+ <source>Redirecting call</source>
+ <translation>Перенаправление звонка</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Профиль пользователя:</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Пользователь:</translation>
+ </message>
+ <message>
+ <source>Do you allow the call to be redirected to the following destination?</source>
+ <translation>Вы разрешаете переводить звонки к следующему направлению?</translation>
+ </message>
+ <message>
+ <source>If you don&apos;t want to be asked this anymore, then you must change the settings in the SIP protocol section of the user profile.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redirecting request</source>
+ <translation>Запрос перенаправления</translation>
+ </message>
+ <message>
+ <source>Do you allow the %1 request to be redirected to the following destination?</source>
+ <translation>Вы разрешаете перевести запрос %1 к следующему назначению?</translation>
+ </message>
+ <message>
+ <source>Transferring call</source>
+ <translation>Передача звонка</translation>
+ </message>
+ <message>
+ <source>Request to transfer call received from:</source>
+ <translation>Запрос перевода звонка получен от:</translation>
+ </message>
+ <message>
+ <source>Request to transfer call received.</source>
+ <translation>Запрос перевода звонка получен.</translation>
+ </message>
+ <message>
+ <source>Do you allow the call to be transferred to the following destination?</source>
+ <translation>Вы разрешаете передачу звонка к следующему назначению?</translation>
+ </message>
+ <message>
+ <source>Info:</source>
+ <translation>Информация:</translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation>Внимание:</translation>
+ </message>
+ <message>
+ <source>Critical:</source>
+ <translation>Критическое:</translation>
+ </message>
+ <message>
+ <source>Firewall / NAT discovery...</source>
+ <translation>Фаервол / NAT обнаружение...</translation>
+ </message>
+ <message>
+ <source>Abort</source>
+ <translation>Прервать</translation>
+ </message>
+ <message>
+ <source>Line %1</source>
+ <translation>Линия %1</translation>
+ </message>
+ <message>
+ <source>Click the padlock to confirm a correct SAS.</source>
+ <translation>Нажмите на замок для подтвердения корректности SAS.</translation>
+ </message>
+ <message>
+ <source>The remote user on line %1 disabled the encryption.</source>
+ <translation>Удалённый пользователь на линии %1 запретил шифрование.</translation>
+ </message>
+ <message>
+ <source>Line %1: SAS confirmed.</source>
+ <translation>Линия %1: SAS подтверждён.</translation>
+ </message>
+ <message>
+ <source>Line %1: SAS confirmation reset.</source>
+ <translation>Линия %1: сброс SAS подтверждения.</translation>
+ </message>
+ <message>
+ <source>%1, voice mail status failure.</source>
+ <translation>%1, ошибка статуса голосовой почты.</translation>
+ </message>
+ <message>
+ <source>%1, voice mail status rejected.</source>
+ <translation>%1, статус голосовой почты не принят.</translation>
+ </message>
+ <message>
+ <source>%1, voice mailbox does not exist.</source>
+ <translation>%1, ящик голосовой почты не существует.</translation>
+ </message>
+ <message>
+ <source>%1, voice mail status terminated.</source>
+ <translation>%1, прерван статус голосовой почты.</translation>
+ </message>
+ <message>
+ <source>Accepted by network</source>
+ <translation>Разрешён сетью</translation>
+ </message>
+ <message>
+ <source>Line %1: call rejected.</source>
+ <translation>Линия %1: звонок сброшен.</translation>
+ </message>
+ <message>
+ <source>Line %1: call redirected.</source>
+ <translation>Линия %1: звонок пенаправлен.</translation>
+ </message>
+ <message>
+ <source>Failed to start conference.</source>
+ <translation>Ошибка запуска конференции.</translation>
+ </message>
+ <message>
+ <source>Failed to save message attachment: %1</source>
+ <translation>Ошибка сохранения вложения сообщения: %1</translation>
+ </message>
+ <message>
+ <source>Transferred by: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot open web browser: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Configure your web browser in the system settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>GetAddressForm</name>
+ <message>
+ <source>Twinkle - Select address</source>
+ <translation>Twinkle - Выбор адреса</translation>
+ </message>
+ <message>
+ <source>&amp;KAddressBook</source>
+ <translation>Адресная книга &amp;KDE </translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Имя</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Тип</translation>
+ </message>
+ <message>
+ <source>Phone</source>
+ <translation>Телефон</translation>
+ </message>
+ <message>
+ <source>This list of addresses is taken from &lt;b&gt;KAddressBook&lt;/b&gt;. 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.</source>
+ <translation>Этот список адресов получен из &lt;b&gt;Адресной книги KDE&lt;/b&gt;. Контакты которые на содержат телефонного номера здесь не показываются. Для добавления, удаления или модификации адресной информации вы должны использовать Адресную книгу KDE.</translation>
+ </message>
+ <message>
+ <source>&amp;Show only SIP addresses</source>
+ <translation>&amp;Показать только SIP адреса</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Check this option when you only want to see contacts with SIP addresses, i.e. starting with &quot;&lt;b&gt;sip:&lt;/b&gt;&quot;.</source>
+ <translation>Отметьте эту опцию если вы ходите видеть только контакты с SIP адресами, те которые начинаются с &lt;b&gt;sip:&lt;/b&gt;&quot;.</translation>
+ </message>
+ <message>
+ <source>&amp;Reload</source>
+ <translation>&amp;Обновить</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Reload the list of addresses from KAddressbook.</source>
+ <translation>Перезагрузить список адресов из Адресной книги KDE.</translation>
+ </message>
+ <message>
+ <source>&amp;Local address book</source>
+ <translation>&amp;Локальная адресная книга</translation>
+ </message>
+ <message>
+ <source>Remark</source>
+ <translation>Описание</translation>
+ </message>
+ <message>
+ <source>Contacts in the local address book of Twinkle.</source>
+ <translation>Контакты из локальной адресной книги Twinkle.</translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation>&amp;Добавить</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Add a new contact to the local address book.</source>
+ <translation>Добавить новый контакт в локальную адресную книгу.</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Удалить</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Delete a contact from the local address book.</source>
+ <translation>Удалить контакт из локальной адресной книги.</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Редактировать</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Edit a contact from the local address book.</source>
+ <translation>Редактировать контакт из локальной адресной книги.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Принять</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Отмена</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You seem not to have any contacts with a phone number in &lt;b&gt;KAddressBook&lt;/b&gt;, KDE&apos;s address book application. Twinkle retrieves all contacts with a phone number from KAddressBook. To manage your contacts you have to use KAddressBook.&lt;p&gt;As an alternative you may use Twinkle&apos;s local address book.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;У Вас нет ни одного контакта с телефонным номером в &lt;b&gt;KAddressBook&lt;/b&gt;(приложении KDE адресная книга). Twinkle получает все контакты с телефонными номерами из Адресной книги KDE. Для управления вашими контактами вы должны использовать KAddressBook.&lt;p&gt;Как альтернативу вы можете использовать локальную адресную книгу Twinkle.&lt;/p&gt;</translation>
+ </message>
+</context>
+<context>
+ <name>GetProfileNameForm</name>
+ <message>
+ <source>Twinkle - Profile name</source>
+ <translation>Twinkle - Имя профиля</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Принять</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Отмена</translation>
+ </message>
+ <message>
+ <source>Enter a name for your profile:</source>
+ <translation>Введите имя вашего профиля:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The name of your profile&lt;/b&gt;
+&lt;br&gt;&lt;br&gt;
+A profile contains your user settings, e.g. your user name and password. You have to give each profile a name.
+&lt;br&gt;&lt;br&gt;
+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.
+&lt;br&gt;&lt;br&gt;
+To remember your profiles easily you could use your SIP user name as a profile name, e.g. &lt;b&gt;example@example.com&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Имя вашего профиля&lt;/b&gt;
+&lt;br&gt;&lt;br&gt;
+Профиль содержит ваши пользовательские настройки такие как имя пользователя и пароль. Вы должны дать каждому профилю отдельное имя
+&lt;br&gt;&lt;br&gt;
+Если у вас несколько различных учётных записей SIP, вы можете создать несколько профилей. При запуске Twinkle покажет вам список профилей и вы сможете выбрать какой использовать при этом запуске.
+&lt;br&gt;&lt;br&gt;
+Чтобы легко различать свои профили вы можете использовать ваше SIP имя пользователя, как название профиля, например,&lt;b&gt;example@example.com&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Cannot find .twinkle directory in your home directory.</source>
+ <translation>Не могу найти каталог .twinkle в вашем домашнем каталоге.</translation>
+ </message>
+ <message>
+ <source>Profile already exists.</source>
+ <translation>Профиль уже существует.</translation>
+ </message>
+ <message>
+ <source>Rename profile &apos;%1&apos; to:</source>
+ <translation>Переименовываю профиль &apos;%1&apos; в:</translation>
+ </message>
+</context>
+<context>
+ <name>HistoryForm</name>
+ <message>
+ <source>Twinkle - Call History</source>
+ <translation>Twinkle - История звонков</translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation>Время</translation>
+ </message>
+ <message>
+ <source>In/Out</source>
+ <translation>Входящий/исходящий</translation>
+ </message>
+ <message>
+ <source>From/To</source>
+ <translation>Откуда/Куда</translation>
+ </message>
+ <message>
+ <source>Subject</source>
+ <translation>Тема</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Статус</translation>
+ </message>
+ <message>
+ <source>Call details</source>
+ <translation>Детали звонка</translation>
+ </message>
+ <message>
+ <source>Details of the selected call record.</source>
+ <translation>Детали выбранной записи звонка.</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation>Показать</translation>
+ </message>
+ <message>
+ <source>&amp;Incoming calls</source>
+ <translation>&amp;Входящие звонки</translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Check this option to show incoming calls.</source>
+ <translation>Выберите эту опцию для показа входящих звонков.</translation>
+ </message>
+ <message>
+ <source>&amp;Outgoing calls</source>
+ <translation>&amp;Исходящие звонки</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Check this option to show outgoing calls.</source>
+ <translation>Выберите эту опцию для показа исходящих звонков.</translation>
+ </message>
+ <message>
+ <source>&amp;Answered calls</source>
+ <translation>&amp;Отвеченные звонки</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Check this option to show answered calls.</source>
+ <translation>Выберите эту опцию для показа отвеченных звонков.</translation>
+ </message>
+ <message>
+ <source>&amp;Missed calls</source>
+ <translation>&amp;Пропущенные звонки</translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Check this option to show missed calls.</source>
+ <translation>Выберите эту опцию для показа пропущенных звонков.</translation>
+ </message>
+ <message>
+ <source>Current &amp;user profiles only</source>
+ <translation>Только профиль данного &amp;пользователя</translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Check this option to show only calls associated with this user profile.</source>
+ <translation>Выберите эту опцию для показа звонков ассоциированных с этим профилем пользователя.</translation>
+ </message>
+ <message>
+ <source>C&amp;lear</source>
+ <translation>О&amp;чистить</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;Clear the complete call history.&lt;/p&gt;
+&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; this will clear &lt;b&gt;all&lt;/b&gt; records, also records not shown depending on the checked view options.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Очистить всю историю звонков.&lt;/p&gt;
+&lt;p&gt;&lt;b&gt;Заметка:&lt;/b&gt; очищает &lt;b&gt;все&lt;/b&gt; записи, записи удаляются безвозратно, и вы никогда не увидите их в любых вариантах просмотра.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Clo&amp;se</source>
+ <translation>&amp;Закрыть</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Close this window.</source>
+ <translation>Закрыть это окно.</translation>
+ </message>
+ <message>
+ <source>&amp;Call</source>
+ <translation>&amp;Звонить</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Call selected address.</source>
+ <translation>Звонить на выбранный адрес.</translation>
+ </message>
+ <message>
+ <source>Call...</source>
+ <translation>Звонить...</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Удалить</translation>
+ </message>
+ <message>
+ <source>Call start:</source>
+ <translation>Звонок начат:</translation>
+ </message>
+ <message>
+ <source>Call answer:</source>
+ <translation>Звонок отвечен:</translation>
+ </message>
+ <message>
+ <source>Call end:</source>
+ <translation>Звонок закончен:</translation>
+ </message>
+ <message>
+ <source>Call duration:</source>
+ <translation>Продолжительность звонка:</translation>
+ </message>
+ <message>
+ <source>Direction:</source>
+ <translation>Направление:</translation>
+ </message>
+ <message>
+ <source>From:</source>
+ <translation>Откуда:</translation>
+ </message>
+ <message>
+ <source>To:</source>
+ <translation>Куда:</translation>
+ </message>
+ <message>
+ <source>Reply to:</source>
+ <translation>Ответить на:</translation>
+ </message>
+ <message>
+ <source>Referred by:</source>
+ <translation>Ссылаться на:</translation>
+ </message>
+ <message>
+ <source>Subject:</source>
+ <translation>Тема:</translation>
+ </message>
+ <message>
+ <source>Released by:</source>
+ <translation>Источник:</translation>
+ </message>
+ <message>
+ <source>Status:</source>
+ <translation>Статус:</translation>
+ </message>
+ <message>
+ <source>Far end device:</source>
+ <translation>Конечное устройство:</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Профиль пользователя:</translation>
+ </message>
+ <message>
+ <source>conversation</source>
+ <translation>разговор</translation>
+ </message>
+ <message>
+ <source>Re:</source>
+ <translation>Ответ:</translation>
+ </message>
+ <message>
+ <source>Number of calls:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>###</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Total call duration:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>InviteForm</name>
+ <message>
+ <source>Twinkle - Call</source>
+ <translation>Twinkle - Звонить</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;Кому:</translation>
+ </message>
+ <message>
+ <source>Optionally you can provide a subject here. This might be shown to the callee.</source>
+ <translation>Опционально вы можете ввести сюда тему. Возможно она будет показана удалённой стороне при звонке.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Адресная книга</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Выберите адрес из адресной книги.</translation>
+ </message>
+ <message>
+ <source>The address that you want to call. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Адрес куда вы хотите позвонить. Это может быть полный SIP адрес, такой как &lt;b&gt;sip:example@example.com&lt;/b&gt;, или просто часть имени пользователя или телефонный номер. Если вы не указываете полного адреса, Twinkle дополнит этот адрес используя значение домена из вашего профиля пользователя.</translation>
+ </message>
+ <message>
+ <source>The user that will make the call.</source>
+ <translation>Пользователь от которого вы будете производить звонок.</translation>
+ </message>
+ <message>
+ <source>&amp;Subject:</source>
+ <translation>&amp;Тема:</translation>
+ </message>
+ <message>
+ <source>&amp;From:</source>
+ <translation>&amp;Откуда:</translation>
+ </message>
+ <message>
+ <source>&amp;Hide identity</source>
+ <translation>&amp;Звонить анонимно</translation>
+ </message>
+ <message>
+ <source>Alt+H</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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 &lt;b&gt;not&lt;/b&gt; hide your IP address.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Warning:&lt;/b&gt; not all providers support identity hiding.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;
+С этой опцией вы запрашиваете у своего провайдера SIP услуг убрать ваши идентификационные данные из данных направляемых к удалённой стороне. Эта опция только прячет ваши идентификационные данные такие как: ваш SIP адрес, телефонный номер, имя пользователя. Она &lt;b&gt;не&lt;/b&gt; скрывает ваш IP адрес.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Внимание:&lt;/b&gt; не все провайдеры поддерживают анонимные звонки.
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Звонить</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Отмена</translation>
+ </message>
+ <message>
+ <source>Not all SIP providers support identity hiding. Make sure your SIP provider supports it if you really need it.</source>
+ <translation>Не все SIP провайдеры поддерживают анонимные звонки. Уточните у своего провайдера действительно ли он поддерживает это.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LogViewForm</name>
+ <message>
+ <source>Twinkle - Log</source>
+ <translation>Twinkle - Журнал</translation>
+ </message>
+ <message>
+ <source>Contents of the current log file (~/.twinkle/twinkle.log)</source>
+ <translation>Содержимое текущего журнала (~/.twinkle/twinkle.log)</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>&amp;Закрыть</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>C&amp;lear</source>
+ <translation>О&amp;чистить</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Clear the log window. This does &lt;b&gt;not&lt;/b&gt; clear the log file itself.</source>
+ <translation>Очистить окно журнала. Это &lt;b&gt;не &lt;/b&gt; стирает файл журнала и не очищает его.</translation>
+ </message>
+</context>
+<context>
+ <name>MessageForm</name>
+ <message>
+ <source>Twinkle - Instant message</source>
+ <translation>Twinkle - Мгновенное сообщение</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;Кому:</translation>
+ </message>
+ <message>
+ <source>The user that will send the message.</source>
+ <translation>Пользователь от которого вы будете посылать сообщения.</translation>
+ </message>
+ <message>
+ <source>The address of the user that you want to send a message. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Адрес пользователя которому вы посылаете сообщение. Это может быть полный SIP адрес, такой как &lt;b&gt;sip:example@example.com&lt;/b&gt;, или просто часть имени пользователя или телефонный номер. Если вы не указываете полного адреса, Twinkle дополнит этот адрес используя значение домена из вашего профиля пользователя.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Адресная книга</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Выберите адрес из адресной книги.</translation>
+ </message>
+ <message>
+ <source>&amp;User profile:</source>
+ <translation>&amp;Профиль пользователя:</translation>
+ </message>
+ <message>
+ <source>Conversation</source>
+ <translation>Общение</translation>
+ </message>
+ <message>
+ <source>The exchanged messages.</source>
+ <translation type="obsolete">Сообщения, которыми вы обменялись.</translation>
+ </message>
+ <message>
+ <source>Type your message here and then press &quot;send&quot; to send it.</source>
+ <translation>Введите ваше сообщение и нажмите &quot;Отправить&quot; для его отсылки.</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation>&amp;Отправить</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Send the message.</source>
+ <translation>Отправить сообщение.</translation>
+ </message>
+ <message>
+ <source>Delivery failure</source>
+ <translation>Ошибка доставки</translation>
+ </message>
+ <message>
+ <source>Delivery notification</source>
+ <translation>Сообщение доставки</translation>
+ </message>
+ <message>
+ <source>Instant message toolbar</source>
+ <translation>Панель мгновенных сообщений</translation>
+ </message>
+ <message>
+ <source>Send file...</source>
+ <translation>Отправить файл...</translation>
+ </message>
+ <message>
+ <source>Send file</source>
+ <translation>Отправить файл</translation>
+ </message>
+ <message>
+ <source>image size is scaled down in preview</source>
+ <translation>размер картинки уменьшен для просмотра</translation>
+ </message>
+ <message>
+ <source>Open with %1...</source>
+ <translation>Открыть в %1...</translation>
+ </message>
+ <message>
+ <source>Open with...</source>
+ <translation>Открыть в...</translation>
+ </message>
+ <message>
+ <source>Save attachment as...</source>
+ <translation>Сохранить вложение как...</translation>
+ </message>
+ <message>
+ <source>File already exists. Do you want to overwrite this file?</source>
+ <translation>Файл уже существует. Перезаписать данный файл?</translation>
+ </message>
+ <message>
+ <source>Failed to save attachment.</source>
+ <translation>Ошибка сохранения вложения.</translation>
+ </message>
+ <message>
+ <source>%1 is typing a message.</source>
+ <translation>%1 пишет сообщение.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MessageFormView</name>
+ <message>
+ <source>sending message</source>
+ <translation>отправка сообщения</translation>
+ </message>
+</context>
+<context>
+ <name>MphoneForm</name>
+ <message>
+ <source>Twinkle</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Buddy list</source>
+ <translation>Список друзей</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Вы можете создать раздельные листы друзей для каждого профиля. Вы можете только видеть доступность друзей и публиковать вашу личную доступность если провайдер поддерживает функцию доступности на сервере.</translation>
+ </message>
+ <message>
+ <source>&amp;Call:</source>
+ <comment>Label in front of combobox to enter address</comment>
+ <translation>&amp;Позвонить:</translation>
+ </message>
+ <message>
+ <source>The address that you want to call. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Адрес куда вы хотите позвонить. Это может быть полный SIP адрес, такой как &lt;b&gt;sip:example@example.com&lt;/b&gt;, или просто часть имени пользователя или телефонный номер. Если вы не указываете полного адреса, Twinkle дополнит этот адрес используя значение домена из вашего профиля пользователя.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Адресная книга</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Выберите адрес из адресной книги.</translation>
+ </message>
+ <message>
+ <source>Dial</source>
+ <translation>Набрать</translation>
+ </message>
+ <message>
+ <source>Dial the address.</source>
+ <translation>Набрать адрес.</translation>
+ </message>
+ <message>
+ <source>&amp;User:</source>
+ <translation>&amp;Пользователь:</translation>
+ </message>
+ <message>
+ <source>The user that will make the call.</source>
+ <translation>Пользователь от которого вы будете производить звонок.</translation>
+ </message>
+ <message>
+ <source>Auto answer indication.</source>
+ <translation>Индикатор автоответа.</translation>
+ </message>
+ <message>
+ <source>Call redirect indication.</source>
+ <translation>Индикатор перенаправления звонков.</translation>
+ </message>
+ <message>
+ <source>Do not disturb indication.</source>
+ <translation>Индикатор &quot;Не тревожить&quot;.</translation>
+ </message>
+ <message>
+ <source>Message waiting indication.</source>
+ <translation>Индикатор ожидания сообщения.</translation>
+ </message>
+ <message>
+ <source>Missed call indication.</source>
+ <translation>Индикатор пропущенных звонков.</translation>
+ </message>
+ <message>
+ <source>Registration status.</source>
+ <translation>Статус регистрации.</translation>
+ </message>
+ <message>
+ <source>Display</source>
+ <translation>Монитор</translation>
+ </message>
+ <message>
+ <source>Line status</source>
+ <translation>Статус линий</translation>
+ </message>
+ <message>
+ <source>Line &amp;1:</source>
+ <translation>Линия &amp;1:</translation>
+ </message>
+ <message>
+ <source>Alt+1</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Click to switch to line 1.</source>
+ <translation>Нажмите для переключения к линии 1.</translation>
+ </message>
+ <message>
+ <source>From:</source>
+ <translation>Откуда:</translation>
+ </message>
+ <message>
+ <source>To:</source>
+ <translation>Куда:</translation>
+ </message>
+ <message>
+ <source>Subject:</source>
+ <translation>Тема:</translation>
+ </message>
+ <message>
+ <source>Visual indication of line state.</source>
+ <translation>Наглядное отображение состояния линии.</translation>
+ </message>
+ <message>
+ <source>idle</source>
+ <comment>No need to translate</comment>
+ <translation>простой</translation>
+ </message>
+ <message>
+ <source>Call is on hold</source>
+ <translation>Звонок на удержании</translation>
+ </message>
+ <message>
+ <source>Voice is muted</source>
+ <translation>Микрофон заглушен</translation>
+ </message>
+ <message>
+ <source>Conference call</source>
+ <translation>Конференц связь</translation>
+ </message>
+ <message>
+ <source>Transferring call</source>
+ <translation>Передача звонка</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+The padlock indicates that your voice is encrypted during transport over the network.
+&lt;/p&gt;
+&lt;h3&gt;SAS - Short Authentication String&lt;/h3&gt;
+&lt;p&gt;
+Both ends of an encrypted voice channel receive the same SAS on the first call. If the SAS is different at each end, your voice channel may be compromised by a man-in-the-middle attack (MitM).
+&lt;/p&gt;
+&lt;p&gt;
+If the SAS is equal at both ends, then you should confirm it by clicking this padlock for stronger security of future calls to the same destination. For subsequent calls to the same destination, you don&apos;t have to confirm the SAS again. The padlock will show a check symbol when the SAS has been confirmed.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>sas</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Short authentication string</source>
+ <translation>Короткая строка авторизации</translation>
+ </message>
+ <message>
+ <source>g711a/g711a</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Audio codec</source>
+ <translation>Аудио кодек</translation>
+ </message>
+ <message>
+ <source>0:00:00</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Call duration</source>
+ <translation>Продолжительность звонка</translation>
+ </message>
+ <message>
+ <source>sip:from</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>sip:to</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>subject</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>photo</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Line &amp;2:</source>
+ <translation>Линия &amp;2:</translation>
+ </message>
+ <message>
+ <source>Alt+2</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Click to switch to line 2.</source>
+ <translation>Нажмите для переключения к линии 2.</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;Файл</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Редактировать</translation>
+ </message>
+ <message>
+ <source>C&amp;all</source>
+ <translation>З&amp;вонить</translation>
+ </message>
+ <message>
+ <source>Activate line</source>
+ <translation>Активировать линию</translation>
+ </message>
+ <message>
+ <source>&amp;Message</source>
+ <translation>&amp;Чат</translation>
+ </message>
+ <message>
+ <source>&amp;Registration</source>
+ <translation>&amp;Регистрация</translation>
+ </message>
+ <message>
+ <source>&amp;Services</source>
+ <translation>&amp;Сервисы</translation>
+ </message>
+ <message>
+ <source>&amp;View</source>
+ <translation>&amp;Показать</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Справка</translation>
+ </message>
+ <message>
+ <source>Call Toolbar</source>
+ <translation>Панель звонков</translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation>Выход</translation>
+ </message>
+ <message>
+ <source>&amp;Quit</source>
+ <translation>&amp;Выход</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>About Twinkle</source>
+ <translation>О программе Twinkle </translation>
+ </message>
+ <message>
+ <source>&amp;About Twinkle</source>
+ <translation>&amp;О программе Twinkle </translation>
+ </message>
+ <message>
+ <source>Call</source>
+ <comment>toolbar text</comment>
+ <translation>Звон</translation>
+ </message>
+ <message>
+ <source>&amp;Call...</source>
+ <comment>call menu text</comment>
+ <translation>&amp;Звонить...</translation>
+ </message>
+ <message>
+ <source>Call someone</source>
+ <translation>Позвонить кому либо </translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Answer</source>
+ <comment>toolbar text</comment>
+ <translation>Ответ</translation>
+ </message>
+ <message>
+ <source>&amp;Answer</source>
+ <comment>menu text</comment>
+ <translation>&amp;Ответить</translation>
+ </message>
+ <message>
+ <source>Answer incoming call</source>
+ <translation>Ответить входящий звонок</translation>
+ </message>
+ <message>
+ <source>F6</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Bye</source>
+ <comment>toolbar text</comment>
+ <translation>Заверш</translation>
+ </message>
+ <message>
+ <source>&amp;Bye</source>
+ <comment>menu text</comment>
+ <translation>&amp;Завершить</translation>
+ </message>
+ <message>
+ <source>Release call</source>
+ <translation>Завершить звонок</translation>
+ </message>
+ <message>
+ <source>Esc</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Reject</source>
+ <comment>toolbar text</comment>
+ <translation>Отклон</translation>
+ </message>
+ <message>
+ <source>&amp;Reject</source>
+ <comment>menu text</comment>
+ <translation>&amp;Отклонить</translation>
+ </message>
+ <message>
+ <source>Reject incoming call</source>
+ <translation>Отклонить входящий звонок</translation>
+ </message>
+ <message>
+ <source>F8</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Hold</source>
+ <comment>toolbar text</comment>
+ <translation>Удерж</translation>
+ </message>
+ <message>
+ <source>&amp;Hold</source>
+ <comment>menu text</comment>
+ <translation>&amp;Удержать</translation>
+ </message>
+ <message>
+ <source>Put a call on hold, or retrieve a held call</source>
+ <translation>Поставить звонок на удержание, или ответить второй вызов</translation>
+ </message>
+ <message>
+ <source>Redirect</source>
+ <comment>toolbar text</comment>
+ <translation>Направ</translation>
+ </message>
+ <message>
+ <source>R&amp;edirect...</source>
+ <comment>menu text</comment>
+ <translation>П&amp;еренаправить...</translation>
+ </message>
+ <message>
+ <source>Redirect incoming call without answering</source>
+ <translation>Перенаправить входящий звонок без ответа</translation>
+ </message>
+ <message>
+ <source>Dtmf</source>
+ <comment>toolbar text</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Dtmf...</source>
+ <comment>menu text</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Open keypad to enter digits for voice menu&apos;s</source>
+ <translation>Открывает панель цифровых клавиш для использования в голосовых меню</translation>
+ </message>
+ <message>
+ <source>Register</source>
+ <translation>Регистрация</translation>
+ </message>
+ <message>
+ <source>&amp;Register</source>
+ <translation>&amp;Регистрация</translation>
+ </message>
+ <message>
+ <source>Deregister</source>
+ <translation>Разрегистрация</translation>
+ </message>
+ <message>
+ <source>&amp;Deregister</source>
+ <translation>&amp;Разрегистрация</translation>
+ </message>
+ <message>
+ <source>Deregister this device</source>
+ <translation>Разрегистрация этого устройства</translation>
+ </message>
+ <message>
+ <source>Show registrations</source>
+ <translation>Показать регистрации</translation>
+ </message>
+ <message>
+ <source>&amp;Show registrations</source>
+ <translation>&amp;Показать регистрации</translation>
+ </message>
+ <message>
+ <source>Terminal capabilities</source>
+ <translation>Ограничения терминала</translation>
+ </message>
+ <message>
+ <source>&amp;Terminal capabilities...</source>
+ <comment>menu text</comment>
+ <translation>&amp;Ограничения терминала...</translation>
+ </message>
+ <message>
+ <source>Request terminal capabilities from someone</source>
+ <translation>Запрос органичений терминала от кого-либо</translation>
+ </message>
+ <message>
+ <source>Do not disturb</source>
+ <translation>Не беспокоить</translation>
+ </message>
+ <message>
+ <source>&amp;Do not disturb</source>
+ <translation>&amp;Не беспокоить</translation>
+ </message>
+ <message>
+ <source>Call redirection</source>
+ <translation>Перенаправление звонка</translation>
+ </message>
+ <message>
+ <source>Call &amp;redirection...</source>
+ <translation>&amp;Перенаправление звонка...</translation>
+ </message>
+ <message>
+ <source>Redial</source>
+ <comment>toolbar text</comment>
+ <translation>Повт</translation>
+ </message>
+ <message>
+ <source>&amp;Redial</source>
+ <comment>menu text</comment>
+ <translation>&amp;Повторить</translation>
+ </message>
+ <message>
+ <source>Repeat last call</source>
+ <translation>Повторить последний звонок</translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>About Qt</source>
+ <translation>О Qt</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation>О &amp;Qt</translation>
+ </message>
+ <message>
+ <source>User profile</source>
+ <translation>Профиль пользователя</translation>
+ </message>
+ <message>
+ <source>&amp;User profile...</source>
+ <translation>&amp;Профиль пользователя...</translation>
+ </message>
+ <message>
+ <source>Conf</source>
+ <comment>toolbar text</comment>
+ <translation>Конф</translation>
+ </message>
+ <message>
+ <source>&amp;Conference</source>
+ <comment>menu text</comment>
+ <translation>&amp;Конференция</translation>
+ </message>
+ <message>
+ <source>Join two calls in a 3-way conference</source>
+ <translation>Объединить два звонка в единую 3-х строннюю конференцию</translation>
+ </message>
+ <message>
+ <source>Mute</source>
+ <comment>toolbar text</comment>
+ <translation>Вык.Зв</translation>
+ </message>
+ <message>
+ <source>&amp;Mute</source>
+ <comment>menu text</comment>
+ <translation>&amp;Выключить звук</translation>
+ </message>
+ <message>
+ <source>Mute a call</source>
+ <translation>Отключить микрофон</translation>
+ </message>
+ <message>
+ <source>Xfer</source>
+ <comment>toolbar text</comment>
+ <translation>Перекл</translation>
+ </message>
+ <message>
+ <source>Trans&amp;fer...</source>
+ <comment>menu text</comment>
+ <translation>Пере&amp;ключить...</translation>
+ </message>
+ <message>
+ <source>Transfer call</source>
+ <translation>Переключить звонок на другого абонента</translation>
+ </message>
+ <message>
+ <source>System settings</source>
+ <translation>Системные настройки</translation>
+ </message>
+ <message>
+ <source>&amp;System settings...</source>
+ <translation>&amp;Системные настройки...</translation>
+ </message>
+ <message>
+ <source>Deregister all</source>
+ <translation>Разрегистрировать всех</translation>
+ </message>
+ <message>
+ <source>Deregister &amp;all</source>
+ <translation>Разрегистрировать &amp;всех</translation>
+ </message>
+ <message>
+ <source>Deregister all your registered devices</source>
+ <translation>Разрегистрировать все ваши зарегистрированные устройства</translation>
+ </message>
+ <message>
+ <source>Auto answer</source>
+ <translation>Автоответ</translation>
+ </message>
+ <message>
+ <source>&amp;Auto answer</source>
+ <translation>&amp;Автоответ</translation>
+ </message>
+ <message>
+ <source>Log</source>
+ <translation>Журнал</translation>
+ </message>
+ <message>
+ <source>&amp;Log...</source>
+ <translation>&amp;Журнал...</translation>
+ </message>
+ <message>
+ <source>Call history</source>
+ <translation>История звонков</translation>
+ </message>
+ <message>
+ <source>Call &amp;history...</source>
+ <translation>&amp;История звонков...</translation>
+ </message>
+ <message>
+ <source>F9</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Change user ...</source>
+ <translation>Сменить пользователя ...</translation>
+ </message>
+ <message>
+ <source>&amp;Change user ...</source>
+ <translation>&amp;Сменить пользователя ...</translation>
+ </message>
+ <message>
+ <source>Activate or de-activate users</source>
+ <translation>Активировать или деактивировать пользователей</translation>
+ </message>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation>Что это?</translation>
+ </message>
+ <message>
+ <source>What&apos;s &amp;This?</source>
+ <translation>Что &amp;это?</translation>
+ </message>
+ <message>
+ <source>Shift+F1</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Line 1</source>
+ <translation>Линия 1</translation>
+ </message>
+ <message>
+ <source>Line 2</source>
+ <translation>Линия 2</translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation>&amp;Монитор</translation>
+ </message>
+ <message>
+ <source>Voice mail</source>
+ <translation>Голосовая почта</translation>
+ </message>
+ <message>
+ <source>&amp;Voice mail</source>
+ <translation>&amp;Голосовая почта</translation>
+ </message>
+ <message>
+ <source>Access voice mail</source>
+ <translation>Доступ к голосовой почте</translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Msg</source>
+ <translation>Чат</translation>
+ </message>
+ <message>
+ <source>Instant &amp;message...</source>
+ <translation>Мгновенное &amp;сообщение...</translation>
+ </message>
+ <message>
+ <source>Instant message</source>
+ <translation>Сообщения</translation>
+ </message>
+ <message>
+ <source>&amp;Buddy list</source>
+ <translation>Список &amp;друзей</translation>
+ </message>
+ <message>
+ <source>&amp;Call...</source>
+ <translation>&amp;Звонить...</translation>
+ </message>
+ <message>
+ <source>&amp;Edit...</source>
+ <translation>&amp;Редактировать...</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Удалить</translation>
+ </message>
+ <message>
+ <source>O&amp;ffline</source>
+ <translation>&amp;Не в сети</translation>
+ </message>
+ <message>
+ <source>&amp;Online</source>
+ <translation>&amp;В сети</translation>
+ </message>
+ <message>
+ <source>&amp;Change availability</source>
+ <translation>&amp;Изменить доступность</translation>
+ </message>
+ <message>
+ <source>&amp;Add buddy...</source>
+ <translation>&amp;Добавить друзей...</translation>
+ </message>
+ <message>
+ <source>idle</source>
+ <translation>простой</translation>
+ </message>
+ <message>
+ <source>dialing</source>
+ <translation>набор номера</translation>
+ </message>
+ <message>
+ <source>attempting call, please wait</source>
+ <translation>производится звонок, пожалуйста ждите</translation>
+ </message>
+ <message>
+ <source>incoming call</source>
+ <translation>входящий звонок</translation>
+ </message>
+ <message>
+ <source>establishing call, please wait</source>
+ <translation>установка соединения, пожалуйста ожидайте</translation>
+ </message>
+ <message>
+ <source>established</source>
+ <translation>установлено</translation>
+ </message>
+ <message>
+ <source>established (waiting for media)</source>
+ <translation>установлено (ожидание медиапотока)</translation>
+ </message>
+ <message>
+ <source>releasing call, please wait</source>
+ <translation>завершение соединения, пожалуйста ожидайте</translation>
+ </message>
+ <message>
+ <source>unknown state</source>
+ <translation>неизвестное состояние</translation>
+ </message>
+ <message>
+ <source>Voice is encrypted</source>
+ <translation>Звук зашифрован</translation>
+ </message>
+ <message>
+ <source>Click to confirm SAS.</source>
+ <translation>Нажмите для подтверждения SAS.</translation>
+ </message>
+ <message>
+ <source>Click to clear SAS verification.</source>
+ <translation>Нажмите для очистки проверки SAS.</translation>
+ </message>
+ <message>
+ <source>Transfer consultation</source>
+ <translation>Передача с разговором</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Пользователь:</translation>
+ </message>
+ <message>
+ <source>Call:</source>
+ <translation>Звонок:</translation>
+ </message>
+ <message>
+ <source>Hide identity</source>
+ <translation>Звонить анонимно</translation>
+ </message>
+ <message>
+ <source>Registration status:</source>
+ <translation>Статус регистрации:</translation>
+ </message>
+ <message>
+ <source>Registered</source>
+ <translation>Зарегестрирован</translation>
+ </message>
+ <message>
+ <source>Failed</source>
+ <translation>Oшибка</translation>
+ </message>
+ <message>
+ <source>Not registered</source>
+ <translation>Не зарегистрирован</translation>
+ </message>
+ <message>
+ <source>Click to show registrations.</source>
+ <translation>Нажмите для показа регистрации.</translation>
+ </message>
+ <message>
+ <source>No users are registered.</source>
+ <translation>Нет зарегистрированных пользователей.</translation>
+ </message>
+ <message>
+ <source>%1 new, 1 old message</source>
+ <translation>%1 новое, 1 старое сообщение</translation>
+ </message>
+ <message>
+ <source>%1 new, %2 old messages</source>
+ <translation>%1 новое, %2 старых сообщений</translation>
+ </message>
+ <message>
+ <source>1 new message</source>
+ <translation>1 новое сообщение</translation>
+ </message>
+ <message>
+ <source>%1 new messages</source>
+ <translation>%1 новых сообщений</translation>
+ </message>
+ <message>
+ <source>1 old message</source>
+ <translation>1 старое сообщение</translation>
+ </message>
+ <message>
+ <source>%1 old messages</source>
+ <translation>%1 старых сообщений</translation>
+ </message>
+ <message>
+ <source>Messages waiting</source>
+ <translation>Ожидание сообщений</translation>
+ </message>
+ <message>
+ <source>No messages</source>
+ <translation>Нет сообщений</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Voice mail status:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Статус голосовой почты:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Failure</source>
+ <translation>Ошибка</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>Неизвестно</translation>
+ </message>
+ <message>
+ <source>Click to access voice mail.</source>
+ <translation>Нажмите для доступа к голосовой почте.</translation>
+ </message>
+ <message>
+ <source>Do not disturb active for:</source>
+ <translation>Не беспокоить активно для:</translation>
+ </message>
+ <message>
+ <source>Redirection active for:</source>
+ <translation>Перенаправление ативно для:</translation>
+ </message>
+ <message>
+ <source>Auto answer active for:</source>
+ <translation>Автоответ активен для:</translation>
+ </message>
+ <message>
+ <source>Click to activate/deactivate</source>
+ <translation>Нажмите для активации/деактивации</translation>
+ </message>
+ <message>
+ <source>Click to activate</source>
+ <translation>Нажмите для активации</translation>
+ </message>
+ <message>
+ <source>Do not disturb is not active.</source>
+ <translation>Не беспокоить не активно.</translation>
+ </message>
+ <message>
+ <source>Redirection is not active.</source>
+ <translation>Перенаправление не ативно.</translation>
+ </message>
+ <message>
+ <source>Auto answer is not active.</source>
+ <translation>Автоответ не активен.</translation>
+ </message>
+ <message>
+ <source>Click to see call history for details.</source>
+ <translation>Нажмите для просмотра подробностей истории звонков.</translation>
+ </message>
+ <message>
+ <source>You have no missed calls.</source>
+ <translation>У вас нет пропущенных звонков.</translation>
+ </message>
+ <message>
+ <source>You missed 1 call.</source>
+ <translation>У вас есть 1 пропущенный звонок.</translation>
+ </message>
+ <message>
+ <source>You missed %1 calls.</source>
+ <translation>У вас %1 пропущенных звонков.</translation>
+ </message>
+ <message>
+ <source>Starting user profiles...</source>
+ <translation>Запуск профиля пользователя...</translation>
+ </message>
+ <message>
+ <source>The following profiles are both for user %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You can only run multiple profiles for different users.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You have changed the SIP UDP port. This setting will only become active when you restart Twinkle.</source>
+ <translation>Вы изменили SIP UDP порт. Эта настройка применится только после перезапуска Twinkle.</translation>
+ </message>
+ <message>
+ <source>not provisioned</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You must provision your voice mail address in your user profile, before you can access it.</source>
+ <translation>Вы должны предоставить адрес голосовой почты в вашем профиле перед доступом к ней.</translation>
+ </message>
+ <message>
+ <source>The line is busy. Cannot access voice mail.</source>
+ <translation>Линия занята. Не могу получить доступ к голосовой почте.</translation>
+ </message>
+ <message>
+ <source>The voice mail address %1 is an invalid address. Please provision a valid address in your user profile.</source>
+ <translation>адрес голосовой почты %1 не является верным. Пожалуйста предоставьте правильный адрес в вашем профиле пользователя.</translation>
+ </message>
+ <message>
+ <source>Failed to save buddy list: %1</source>
+ <translation>Ошибка сохранения списка друзей: %1</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Diamondcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sign up</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Sign up...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recharge...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Balance history...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call history...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Admin center...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recharge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Balance history</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Admin center</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>NumberConversionForm</name>
+ <message>
+ <source>Twinkle - Number conversion</source>
+ <translation>Twinkle - Преобразователь номеров</translation>
+ </message>
+ <message>
+ <source>&amp;Match expression:</source>
+ <translation>&amp;Совпадение:</translation>
+ </message>
+ <message>
+ <source>&amp;Replace:</source>
+ <translation>&amp;Замена:</translation>
+ </message>
+ <message>
+ <source>Perl style format string for the replacement number.</source>
+ <translation>Perl стиль формата строки для замены номера.</translation>
+ </message>
+ <message>
+ <source>Perl style regular expression matching the number format you want to modify.</source>
+ <translation>Perl стиль регулярного выражения совпадения формата номера который вы хотите изменить.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Отмена</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Match expression may not be empty.</source>
+ <translation>Совпадающее выражение не может быть пустым.</translation>
+ </message>
+ <message>
+ <source>Replace value may not be empty.</source>
+ <translation>Заменяющее значение не может быть пустым.</translation>
+ </message>
+ <message>
+ <source>Invalid regular expression.</source>
+ <translation>Неправильное регулярное выражение.</translation>
+ </message>
+</context>
+<context>
+ <name>RedirectForm</name>
+ <message>
+ <source>Twinkle - Redirect</source>
+ <translation>Twinkle - Перенаправление</translation>
+ </message>
+ <message>
+ <source>Redirect incoming call to</source>
+ <translation>Перенаправление входящего звонка к</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Вы можете определить до 3 направлений куда будут перенаправлятся звонки. Если первое направление не отвечает на вызов, то звонок перейдёт на второе направление и так далее.</translation>
+ </message>
+ <message>
+ <source>&amp;3rd choice destination:</source>
+ <translation>&amp;3-й выбор направления:</translation>
+ </message>
+ <message>
+ <source>&amp;2nd choice destination:</source>
+ <translation>&amp;2-й выбор направления:</translation>
+ </message>
+ <message>
+ <source>&amp;1st choice destination:</source>
+ <translation>&amp;1-й выбор направления:</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Адресная книга</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Выберите адрес из адресной книги.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Принять</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Отмена</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SelectNicForm</name>
+ <message>
+ <source>Twinkle - Select NIC</source>
+ <translation>Twinkle - Выбор сетевого интерфейса</translation>
+ </message>
+ <message>
+ <source>Select the network interface/IP address that you want to use:</source>
+ <translation>Выберите сетевой интеерфйс/IP адресс который вы будете использовать:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>В вашей системе несколько IP адресов. Здесь вы должны выбрать какой из IP адресов нужно использовать. Этот IP адрес будет использоваться вне SIP сообщений (заголовки ip пакетов).</translation>
+ </message>
+ <message>
+ <source>Set as default &amp;IP</source>
+ <translation>Установить как &amp;IP по умолчанию</translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Make the selected IP address the default IP address. The next time you start Twinkle, this IP address will be automatically selected.</source>
+ <translation>Сделать выбранный IP адрес адресом по умолчанию. В следующий раз когда Twinkle будет запускатся, этот IP адрес будет выбран автоматически.</translation>
+ </message>
+ <message>
+ <source>Set as default &amp;NIC</source>
+ <translation>Выбрать как сетевую карту по &amp;умолчанию</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Make the selected network interface the default interface. The next time you start Twinkle, this interface will be automatically selected.</source>
+ <translation>Сделать выбранный сетевой интерфейс интерфейсом по умолчанию. В следующий раз когда Twinkle будет запускатся, этот интерфейс будет выбран автоматически.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Принять</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>If you want to remove or change the default at a later time, you can do that via the system settings.</source>
+ <translation>Если вы захотите удалить или изменить профиль по умолчанию позже, то вы можете сделать это через системные настройки.</translation>
+ </message>
+</context>
+<context>
+ <name>SelectProfileForm</name>
+ <message>
+ <source>Twinkle - Select user profile</source>
+ <translation>Twinkle - Выбор пользовательского профиля</translation>
+ </message>
+ <message>
+ <source>Select user profile(s) to run:</source>
+ <translation>Выберите пользовательский профиль(ли) для запуска:</translation>
+ </message>
+ <message>
+ <source>User profile</source>
+ <translation>Профиль пользователя</translation>
+ </message>
+ <message>
+ <source>Tick the check boxes of the user profiles that you want to run and press run.</source>
+ <translation>Поставьте отметки на профилях которые вы хотите запустить и нажмите запуск.</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Новый</translation>
+ </message>
+ <message>
+ <source>Create a new profile with the profile editor.</source>
+ <translation>Создание нового профиля с помощью редактора профилей.</translation>
+ </message>
+ <message>
+ <source>&amp;Wizard</source>
+ <translation>&amp;Мастер</translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Create a new profile with the wizard.</source>
+ <translation>Создание нового профиля с помощью мастера профилей.</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Изменить</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Edit the highlighted profile.</source>
+ <translation>Редактировать выделенный профиль.</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Удалить</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Delete the highlighted profile.</source>
+ <translation>Удалить выделенный профиль.</translation>
+ </message>
+ <message>
+ <source>Ren&amp;ame</source>
+ <translation>Пер&amp;еименовать</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Rename the highlighted profile.</source>
+ <translation>Переименовать выделенный профиль.</translation>
+ </message>
+ <message>
+ <source>&amp;Set as default</source>
+ <translation>&amp;Уст. по умолчанию</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Make the selected profiles the default profiles. The next time you start Twinkle, these profiles will be automatically run.</source>
+ <translation>Сделать выбранный профиль как профиль по умолчанию. При следующих запусках Twinkle, этот профиль будет автоматически запущен.</translation>
+ </message>
+ <message>
+ <source>&amp;Run</source>
+ <translation>&amp;Запуск</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Run Twinkle with the selected profiles.</source>
+ <translation>Запустить Twinkle с выбраным профилем.</translation>
+ </message>
+ <message>
+ <source>S&amp;ystem settings</source>
+ <translation>С&amp;истемные настройки</translation>
+ </message>
+ <message>
+ <source>Alt+Y</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Edit the system settings.</source>
+ <translation>Редактировать системные настройки.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Отмена</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;Before you can use Twinkle, you must create a user profile.&lt;br&gt;Click OK to create a profile.&lt;/html&gt;</source>
+ <translation>&lt;html&gt;Перед тем как использовать Twinkle, вы должны создать пользовательский профиль.&lt;br&gt;Нажмите OK Для создания профиля.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;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.&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;Choose what method you wish to use.&lt;/html&gt;</source>
+ <translation type="obsolete">&lt;html&gt;Для создания нового профиля вы можете использовать редактор профилей. В редакторе профилей вы можете гибко изменить настройки для SIP протокола, RTP и множество других тонких настроек.&lt;br&gt;&lt;br&gt;Как альтернативу вы можете использовать мастер для быстрой настройки. Мастер спросит у вас только самые необходимые настройки. Если вы создаёте профиль мастером, то позже сможете редактировать его редактором профилей.&lt;br&gt;&lt;br&gt;Выберите метод который вы будете использовать.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Profile editor</source>
+ <translation>&amp;Редактор профилей</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;Next you may adjust the system settings. You can change these settings always at a later time.&lt;br&gt;&lt;br&gt;Click OK to view and adjust the system settings.&lt;/html&gt;</source>
+ <translation>&lt;html&gt;Далее вы можете определить системные настройки. Вы можете изменить эти настройки позже.&lt;br&gt;&lt;br&gt;Нажмите OK для просмотра и настройки системных настроек.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>You did not select any user profile to run.
+Please select a profile.</source>
+ <translation>Вы не выбрали ни одного профиля для запуска.
+Пожалуйста выберите профиль.</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete profile &apos;%1&apos;?</source>
+ <translation>Вы уверены что хотите удалить профиль &apos;%1&apos;?</translation>
+ </message>
+ <message>
+ <source>Delete profile</source>
+ <translation>Удалить профиль</translation>
+ </message>
+ <message>
+ <source>Failed to delete profile.</source>
+ <translation>Ошибка удаления профиля.</translation>
+ </message>
+ <message>
+ <source>Failed to rename profile.</source>
+ <translation>Ошибка переименования профиля.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;If you want to remove or change the default at a later time, you can do that via the system settings.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Если вы захотите удалить или изменить профиль по умолчанию позже, то вы можете сделать это через системные настройки.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>Cannot find .twinkle directory in your home directory.</source>
+ <translation>Не могу найти .twinkle папку в вашей домашней директории.</translation>
+ </message>
+ <message>
+ <source>Create profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ed&amp;itor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dia&amp;mondcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modify profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Startup profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Diamondcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;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.&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;You can create a Diamondcard account to make worldwide calls to regular and cell phones and send SMS messages.&lt;br&gt;&lt;br&gt;Choose what method you wish to use.&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SelectUserForm</name>
+ <message>
+ <source>Twinkle - Select user</source>
+ <translation>Twinkle - Выбор пользователя</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Отмена</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Select all</source>
+ <translation>&amp;Выбрать все</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Принять</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>C&amp;lear all</source>
+ <translation>О&amp;чистить все</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>purpose</source>
+ <comment>No need to translate</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation>Пользователь</translation>
+ </message>
+ <message>
+ <source>Register</source>
+ <translation>Регистрация</translation>
+ </message>
+ <message>
+ <source>Select users that you want to register.</source>
+ <translation>Выберите пользователей которых надо зарегистрировать.</translation>
+ </message>
+ <message>
+ <source>Deregister</source>
+ <translation>Разрегистрация</translation>
+ </message>
+ <message>
+ <source>Select users that you want to deregister.</source>
+ <translation>Выберите пользователей которых надо разрегистрировать.</translation>
+ </message>
+ <message>
+ <source>Deregister all devices</source>
+ <translation>разрегистрировать все устройства</translation>
+ </message>
+ <message>
+ <source>Select users for which you want to deregister all devices.</source>
+ <translation>Выберите пользователей для которых вы хотите &quot;разрегистрировать все устройства&quot;.</translation>
+ </message>
+ <message>
+ <source>Do not disturb</source>
+ <translation>Не беспокоить</translation>
+ </message>
+ <message>
+ <source>Select users for which you want to enable &apos;do not disturb&apos;.</source>
+ <translation>Выберите пользователей для которых вы хотите включить &quot;не беспокоить&quot;.</translation>
+ </message>
+ <message>
+ <source>Auto answer</source>
+ <translation>Автоответ</translation>
+ </message>
+ <message>
+ <source>Select users for which you want to enable &apos;auto answer&apos;.</source>
+ <translation>Выберите пользователей для которых вы хотите включить &quot;автоответ&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>SendFileForm</name>
+ <message>
+ <source>Twinkle - Send File</source>
+ <translation>Twinkle - Отправить файл</translation>
+ </message>
+ <message>
+ <source>Select file to send.</source>
+ <translation>Выберите файл для отправки.</translation>
+ </message>
+ <message>
+ <source>&amp;File:</source>
+ <translation>&amp;Файл:</translation>
+ </message>
+ <message>
+ <source>&amp;Subject:</source>
+ <translation>&amp;Тема:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Отправить</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Отмена</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>File does not exist.</source>
+ <translation>Файл не существует.</translation>
+ </message>
+ <message>
+ <source>Send file...</source>
+ <translation>Отправить файл...</translation>
+ </message>
+</context>
+<context>
+ <name>SrvRedirectForm</name>
+ <message>
+ <source>Twinkle - Call Redirection</source>
+ <translation>Twinkle - Перенаправление звонков</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Пользователь:</translation>
+ </message>
+ <message>
+ <source>There are 3 redirect services:&lt;p&gt;
+&lt;b&gt;Unconditional:&lt;/b&gt; redirect all calls
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Busy:&lt;/b&gt; redirect a call if both lines are busy
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;No answer:&lt;/b&gt; redirect a call when the no-answer timer expires
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Unconditional</source>
+ <translation>&amp;Безусловная</translation>
+ </message>
+ <message>
+ <source>&amp;Redirect all calls</source>
+ <translation>&amp;Перенаправление всех звонков</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Activate the unconditional redirection service.</source>
+ <translation>Активировать сервис безусловой переадресации.</translation>
+ </message>
+ <message>
+ <source>Redirect to</source>
+ <translation>Перенаправить к</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Вы можете определить до 3 направлений куда будут перенаправлятся звонки. Если первое направление не отвечает на вызов, то звонок перейдёт на второе направление и так далее.</translation>
+ </message>
+ <message>
+ <source>&amp;3rd choice destination:</source>
+ <translation>&amp;3-й выбор направления:</translation>
+ </message>
+ <message>
+ <source>&amp;2nd choice destination:</source>
+ <translation>&amp;2-й выбор направления:</translation>
+ </message>
+ <message>
+ <source>&amp;1st choice destination:</source>
+ <translation>&amp;1-й выбор направления:</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Адресная книга</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Выберите адрес из адресной книги.</translation>
+ </message>
+ <message>
+ <source>&amp;Busy</source>
+ <translation>&amp;Занятость</translation>
+ </message>
+ <message>
+ <source>&amp;Redirect calls when I am busy</source>
+ <translation>&amp;Перенаправлять звонки когда я занят</translation>
+ </message>
+ <message>
+ <source>Activate the redirection when busy service.</source>
+ <translation>Активировать перенаправление когда я занят.</translation>
+ </message>
+ <message>
+ <source>&amp;No answer</source>
+ <translation>&amp;Нет ответа</translation>
+ </message>
+ <message>
+ <source>&amp;Redirect calls when I do not answer</source>
+ <translation>&amp;Перенаправлять звонки когда я не отвечаю</translation>
+ </message>
+ <message>
+ <source>Activate the redirection on no answer service.</source>
+ <translation>Активировать перенаправление когда я не отвечаю.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Принять</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Accept and save all changes.</source>
+ <translation>Принять и сохранить изменения.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Отмена</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Undo your changes and close the window.</source>
+ <translation>Отменить все измения и закрыть окно.</translation>
+ </message>
+ <message>
+ <source>You have entered an invalid destination.</source>
+ <translation>Вы ввели не верное направление</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SysSettingsForm</name>
+ <message>
+ <source>Twinkle - System Settings</source>
+ <translation>Twinkle - Системные настройки</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Основные</translation>
+ </message>
+ <message>
+ <source>Audio</source>
+ <translation>Аудио</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <translation>Сигналы</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Адресная книга</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Сеть</translation>
+ </message>
+ <message>
+ <source>Log</source>
+ <translation>Журнал</translation>
+ </message>
+ <message>
+ <source>Select a category for which you want to see or modify the settings.</source>
+ <translation>Выберите категорию для просмотра и модификации настроек.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Принять</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Accept and save your changes.</source>
+ <translation>Принять и сохранить изменения.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Отмена</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Undo all your changes and close the window.</source>
+ <translation>Отменить все измения и закрыть окно.</translation>
+ </message>
+ <message>
+ <source>Sound Card</source>
+ <translation>Звуковая Карта</translation>
+ </message>
+ <message>
+ <source>Select the sound card for playing the ring tone for incoming calls.</source>
+ <translation>Выберите звуковую карту для проигрывания сигнала вызова для входящих звонков.</translation>
+ </message>
+ <message>
+ <source>Select the sound card to which your microphone is connected.</source>
+ <translation>Выберите звуковую карту к которой подключен ваш микрофон.</translation>
+ </message>
+ <message>
+ <source>Select the sound card for the speaker function during a call.</source>
+ <translation>Выберите звуковую карту к которой подключены ваши колонки или наушники.</translation>
+ </message>
+ <message>
+ <source>&amp;Speaker:</source>
+ <translation>&amp;Колонки:</translation>
+ </message>
+ <message>
+ <source>&amp;Ring tone:</source>
+ <translation>&amp;Сигнал вызова: </translation>
+ </message>
+ <message>
+ <source>Other device:</source>
+ <translation>Другое устройство:</translation>
+ </message>
+ <message>
+ <source>&amp;Microphone:</source>
+ <translation>&amp;Микрофон:</translation>
+ </message>
+ <message>
+ <source>&amp;Validate devices before usage</source>
+ <translation>&amp;Проверять устройства перед использованием</translation>
+ </message>
+ <message>
+ <source>Alt+V</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Twinkle validates the audio devices before usage to avoid an established call without an audio channel.
+&lt;p&gt;
+On startup of Twinkle a warning is given if an audio device is inaccessible.
+&lt;p&gt;
+If before making a call, the microphone or speaker appears to be invalid, a warning is given and no call can be made.
+&lt;p&gt;
+If before answering a call, the microphone or speaker appears to be invalid, a warning is given and the call will not be answered.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reduce &amp;noise from the microphone</source>
+ <translation type="obsolete">Подавлять &amp;эхо от микрофона</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Дополнительно</translation>
+ </message>
+ <message>
+ <source>OSS &amp;fragment size:</source>
+ <translation>OSS &amp;размер фрагмента:</translation>
+ </message>
+ <message>
+ <source>16</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>32</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>64</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>128</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>256</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ALSA &amp;play period size:</source>
+ <translation>ALSA размер периода &amp;проигрывания:</translation>
+ </message>
+ <message>
+ <source>&amp;ALSA capture period size:</source>
+ <translation>ALSA размер периода &amp;записи:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Max log size:</source>
+ <translation>&amp;Максимальный размер журнала:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Максимальный размер файла журнала в МБ. Когда журнал достигает этого размера, создаётся архивная копия и текущий журнал удаляется. Остаётся только архивная копия.</translation>
+ </message>
+ <message>
+ <source>MB</source>
+ <translation>МБ</translation>
+ </message>
+ <message>
+ <source>Log &amp;debug reports</source>
+ <translation>Записывать &amp;отладочные отчёты</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if reports marked as &quot;debug&quot; will be logged.</source>
+ <translation>Указывает будут ли записываться отладочные сообщения в журнал.</translation>
+ </message>
+ <message>
+ <source>Log &amp;SIP reports</source>
+ <translation>Записывать &amp;SIP отчёты</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if SIP messages will be logged.</source>
+ <translation>Указывает будут ли записываться SIP сообщения в журнал.</translation>
+ </message>
+ <message>
+ <source>Log S&amp;TUN reports</source>
+ <translation>Записывать S&amp;TUN отчёты</translation>
+ </message>
+ <message>
+ <source>Alt+T</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if STUN messages will be logged.</source>
+ <translation>Указывает будут ли записываться STUN сообщения в журнал.</translation>
+ </message>
+ <message>
+ <source>Log m&amp;emory reports</source>
+ <translation>Записывать отчёты п&amp;амяти</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if reports concerning memory management will be logged.</source>
+ <translation>Указывает будут ли записываться сообщения касасющиеся управления памятью в журнал.</translation>
+ </message>
+ <message>
+ <source>System tray</source>
+ <translation>Системный лоток</translation>
+ </message>
+ <message>
+ <source>Create &amp;system tray icon on startup</source>
+ <translation>Создавать значок в &amp;системном лотке при запуске</translation>
+ </message>
+ <message>
+ <source>Enable this option if you want a system tray icon for Twinkle. The system tray icon is created when you start Twinkle.</source>
+ <translation>Включите эту опцию если вы хотите видеть значок Twinkle в системном лотке. Значок в системном лотке создаётся при старте Twinkle.</translation>
+ </message>
+ <message>
+ <source>&amp;Hide in system tray when closing main window</source>
+ <translation>&amp;Прятать в системном лотке при закрытии главного окна</translation>
+ </message>
+ <message>
+ <source>Alt+H</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Enable this option if you want Twinkle to hide in the system tray when you close the main window.</source>
+ <translation>Включите эту опцию если вы хотите чтобы Twinkle прятался в системном лотке когда вы закрываете основное окно.</translation>
+ </message>
+ <message>
+ <source>Startup</source>
+ <translation>Запуск</translation>
+ </message>
+ <message>
+ <source>S&amp;tartup hidden in system tray</source>
+ <translation>При &amp;запуске свернуться в системный лоток</translation>
+ </message>
+ <message>
+ <source>Next time you start Twinkle it will immediately hide in the system tray. This works best when you also select a default user profile.</source>
+ <translation>При следующих запусках Twinkle будет постоянно прятаться в системном лотке. Это удобно когда вы выбрали профиль пользователя по умолчанию.</translation>
+ </message>
+ <message>
+ <source>Default user profiles</source>
+ <translation>Стандартный профиль пользователя</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Если вы всегда используете одинаковый профиль(ля), тогда вы можете отметить этот профиль(ля) как профиль по умолчанию. При следующем запуске Twinkle он не будет спрашивать выбор профиля для запуска. Профиль по умолчанию загружается автоматически.</translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation>Севисы</translation>
+ </message>
+ <message>
+ <source>Call &amp;waiting</source>
+ <translation>&amp;Ожидание звонка</translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>При ожидании звонка если одна из линий занята то входящий звонок будет разрешён. Если вы запретите ожидание звонка то если одна из линий занята входящие звонки будут отклонены.</translation>
+ </message>
+ <message>
+ <source>Hang up &amp;both lines when ending a 3-way conference call.</source>
+ <translation>Прерывать &amp;обе линии при завершении 3-х сторонней конференции.</translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Прерывать обе линии при завершении 3-х сторонней конференции. Если эта опция отключена, только активная линия будет прервана и вы сможете продолжить разговор с удалённой стороной на другой линии.</translation>
+ </message>
+ <message>
+ <source>&amp;Maximum calls in call history:</source>
+ <translation>&amp;Максимальное количество звонков в истории:</translation>
+ </message>
+ <message>
+ <source>The maximum number of calls that will be kept in the call history.</source>
+ <translation>Максимальное количество звонков которые будут сохранятся в истории звонков.</translation>
+ </message>
+ <message>
+ <source>&amp;Auto show main window on incoming call after</source>
+ <translation>&amp;Автоматически показывать главное окно при входящем звонке после</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>When the main window is hidden, it will be automatically shown on an incoming call after the number of specified seconds.</source>
+ <translation>Когда главное окно скрыто, оно будет автоматически показано при входящем звонке после после указанного количества секунд.</translation>
+ </message>
+ <message>
+ <source>Number of seconds after which the main window should be shown.</source>
+ <translation>Число секунд после которого главное окно будет показано.</translation>
+ </message>
+ <message>
+ <source>secs</source>
+ <translation>секунд</translation>
+ </message>
+ <message>
+ <source>Maximum allowed size (0-65535) in bytes of an incoming SIP message over UDP.</source>
+ <translation>Максимально разрешённый размер (0-65535) в байтах входящего SIP сообщения через UDP.</translation>
+ </message>
+ <message>
+ <source>&amp;SIP port:</source>
+ <translation>&amp;SIP порт:</translation>
+ </message>
+ <message>
+ <source>&amp;RTP port:</source>
+ <translation>&amp;RTP порт:</translation>
+ </message>
+ <message>
+ <source>Max. SIP message size (&amp;TCP):</source>
+ <translation>Макс. размер SIP сообщения (&amp;TCP):</translation>
+ </message>
+ <message>
+ <source>The UDP/TCP port used for sending and receiving SIP messages.</source>
+ <translation>UDP/TCP порт используемый для отправки и получения SIP сообщений.</translation>
+ </message>
+ <message>
+ <source>Max. SIP message size (&amp;UDP):</source>
+ <translation>Макс. размер SIP сообщения (&amp;UDP):</translation>
+ </message>
+ <message>
+ <source>Maximum allowed size (0-4294967295) in bytes of an incoming SIP message over TCP.</source>
+ <translation>Максимально разрешённый размер (0-4294967295) в байтах для входящего SIP сообщения поверх TCP.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>UDP порт используемый для отправки и приёма RTP для первой линии. UDP порт для второй линии на 2 больше. Если для первой линии используется порт 8000, значит вторая линия использует порт 8002. Когда вы используете передачу звонка используется следующий свободный порт (8004).</translation>
+ </message>
+ <message>
+ <source>Ring tone</source>
+ <translation>Звонок</translation>
+ </message>
+ <message>
+ <source>&amp;Play ring tone on incoming call</source>
+ <translation>&amp;Играть звонок при входящем вызове</translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Indicates if a ring tone should be played when a call comes in.</source>
+ <translation>Указывает будет ли проигрываться вызывной сигнал при входящем вызове.</translation>
+ </message>
+ <message>
+ <source>&amp;Default ring tone</source>
+ <translation>&amp;Стандартный звонок</translation>
+ </message>
+ <message>
+ <source>Play the default ring tone when a call comes in.</source>
+ <translation>Проигрывать вызывной сигнал по умолчанию при входящем звонке.</translation>
+ </message>
+ <message>
+ <source>C&amp;ustom ring tone</source>
+ <translation>С&amp;вой звонок</translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Play a custom ring tone when a call comes in.</source>
+ <translation>Проигрывать свой сигнал по умолчанию при входящем звонке.</translation>
+ </message>
+ <message>
+ <source>Specify the file name of a .wav file that you want to be played as ring tone.</source>
+ <translation>Определите имя файла из *.wav файлов, который будет проигрываться как вызывной сигнал.</translation>
+ </message>
+ <message>
+ <source>Select ring tone file.</source>
+ <translation>Выберите файл вызывного сигнала.</translation>
+ </message>
+ <message>
+ <source>Ring back tone</source>
+ <translation>Гудок вызова</translation>
+ </message>
+ <message>
+ <source>P&amp;lay ring back tone when network does not play ring back tone</source>
+ <translation>И&amp;грать гудок когда сеть не играет вызывного сигнала</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Play ring back tone while you are waiting for the far-end to answer your call.
+&lt;/p&gt;
+&lt;p&gt;
+Depending on your SIP provider the network might provide ring back tone or an announcement.
+&lt;/p&gt;</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>D&amp;efault ring back tone</source>
+ <translation>С&amp;тандартный гудок вызова</translation>
+ </message>
+ <message>
+ <source>Play the default ring back tone.</source>
+ <translation>Играть стандартный гудок при исходящем вызове.</translation>
+ </message>
+ <message>
+ <source>Cu&amp;stom ring back tone</source>
+ <translation>С&amp;вой гудок вызова</translation>
+ </message>
+ <message>
+ <source>Play a custom ring back tone.</source>
+ <translation>Играть свой гудок вызова.</translation>
+ </message>
+ <message>
+ <source>Specify the file name of a .wav file that you want to be played as ring back tone.</source>
+ <translation type="unfinished">Определите файл из .wav файлов, который будет проигрываться как гудок вызова</translation>
+ </message>
+ <message>
+ <source>Select ring back tone file.</source>
+ <translation>Выберите файл гудка вызова.</translation>
+ </message>
+ <message>
+ <source>&amp;Lookup name for incoming call</source>
+ <translation>&amp;Искать имя при входящем звонке</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>При входящем звонке, Twinkle будет пытаться найти имя в вашей адресной книге которое соответствует входящему SIP адресу. Это имя будет отображено.</translation>
+ </message>
+ <message>
+ <source>Ove&amp;rride received display name</source>
+ <translation>За&amp;менять полученное имя абонента</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Звонящий может предоставить отображаемое имя. Отметьте эту опцию если вы хотите заменить его данные данными из вашей адресной книги.</translation>
+ </message>
+ <message>
+ <source>Lookup &amp;photo for incoming call</source>
+ <translation>Искать &amp;фотографию при входящем звонке</translation>
+ </message>
+ <message>
+ <source>Lookup the photo of a caller in your address book and display it on an incoming call.</source>
+ <translation>Искать фото звонящего в вашей адресной книге и отобразить его при входящем звонке.</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <comment>This is the &apos;none&apos; in default IP address combo</comment>
+ <translation type="obsolete">нету</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <comment>This is the &apos;none&apos; in default network interface combo</comment>
+ <translation type="obsolete">нету</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Вызывные сигналы</translation>
+ </message>
+ <message>
+ <source>Choose ring tone</source>
+ <translation>Выберите вызывной сигнал</translation>
+ </message>
+ <message>
+ <source>Ring back tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Гудок вызова</translation>
+ </message>
+ <message>
+ <source>Choose ring back tone</source>
+ <translation>Выберите гудок вызова</translation>
+ </message>
+ <message>
+ <source>W&amp;eb browser command:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Command to start your web browser. If you leave this field empty Twinkle will try to figure out your default web browser.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SysTrayPopup</name>
+ <message>
+ <source>Answer</source>
+ <translation>Ответить</translation>
+ </message>
+ <message>
+ <source>Reject</source>
+ <translation>Отклонить</translation>
+ </message>
+ <message>
+ <source>Incoming Call</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TermCapForm</name>
+ <message>
+ <source>Twinkle - Terminal Capabilities</source>
+ <translation>Twinkle - Ограничения клиента</translation>
+ </message>
+ <message>
+ <source>&amp;From:</source>
+ <translation>&amp;Откуда:</translation>
+ </message>
+ <message>
+ <source>Get terminal capabilities of</source>
+ <translation>Получить ограничения клиента от</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;Откуда:</translation>
+ </message>
+ <message>
+ <source>The address that you want to query for capabilities (OPTION request). This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Адресная книга</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Выберите адрес из адресной книги.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Принять</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Отмена</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferForm</name>
+ <message>
+ <source>Twinkle - Transfer</source>
+ <translation>Twinkle - Переключение</translation>
+ </message>
+ <message>
+ <source>Transfer call to</source>
+ <translation>Переключить звонок к</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;Кому:</translation>
+ </message>
+ <message>
+ <source>The address of the person you want to transfer the call to. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Адрес абонента которому вы хотите перевести звонок. Это может быть полный адрес вида &lt;b&gt;sip:example@example.com&lt;/b&gt; , только пользовательская часть или номер телефона из полного адреса. Когда вы не указываете полный адрес, Twinkle дополняет адрес используя имя домена из вашего профиля пользователя.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Адресная книга</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Выберите адрес из адресной книги.</translation>
+ </message>
+ <message>
+ <source>Type of transfer</source>
+ <translation>Тип переключения</translation>
+ </message>
+ <message>
+ <source>&amp;Blind transfer</source>
+ <translation>&amp;Слепой перевод</translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Transfer the call to a third party without contacting that third party yourself.</source>
+ <translation>Передача звонка другому абоненту без разговора с ним. </translation>
+ </message>
+ <message>
+ <source>T&amp;ransfer with consultation</source>
+ <translation>П&amp;ередача с разговором</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Before transferring the call to a third party, first consult the party yourself.</source>
+ <translation>Перед передачей звонка другому абоненту вы можете предварительно переговорить с ним.</translation>
+ </message>
+ <message>
+ <source>Transfer to other &amp;line</source>
+ <translation>Передача на другую &amp;линию</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Connect the remote party on the active line with the remote party on the other line.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Отмена</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TwinkleCore</name>
+ <message>
+ <source>Anonymous</source>
+ <translation>Неизвестный</translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation>Внимание:</translation>
+ </message>
+ <message>
+ <source>Failed to create log file %1 .</source>
+ <translation>Ошибка создания файла журнала: %1 .</translation>
+ </message>
+ <message>
+ <source>Cannot open file for reading: %1</source>
+ <translation>Не могу открыть файл для чтения: %1</translation>
+ </message>
+ <message>
+ <source>File system error while reading file %1 .</source>
+ <translation>Ошибка файловой системы при чтении файла %1 .</translation>
+ </message>
+ <message>
+ <source>Cannot open file for writing: %1</source>
+ <translation>Не могу открыть файл для записи: %1</translation>
+ </message>
+ <message>
+ <source>File system error while writing file %1 .</source>
+ <translation>Ошибка файловой системы при записи файла %1 .</translation>
+ </message>
+ <message>
+ <source>Excessive number of socket errors.</source>
+ <translation>Большое число ошибок сокета.</translation>
+ </message>
+ <message>
+ <source>Built with support for:</source>
+ <translation>Собрано с поддержкой и для:</translation>
+ </message>
+ <message>
+ <source>Contributions:</source>
+ <translation>При участии:</translation>
+ </message>
+ <message>
+ <source>This software contains the following software from 3rd parties:</source>
+ <translation>Данная програма содержит следующее програмное обеспечение от третьих сторон:</translation>
+ </message>
+ <message>
+ <source>* GSM codec from Jutta Degener and Carsten Bormann, University of Berlin</source>
+ <translation>* GSM кодек от Jutta Degener and Carsten Bormann, University of Berlin</translation>
+ </message>
+ <message>
+ <source>* G.711/G.726 codecs from Sun Microsystems (public domain)</source>
+ <translation>* G.711/G.726 кодек от Sun Microsystems (public domain)</translation>
+ </message>
+ <message>
+ <source>* iLBC implementation from RFC 3951 (www.ilbcfreeware.org)</source>
+ <translation>* iLBC реализация по RFC 3951 (www.ilbcfreeware.org)</translation>
+ </message>
+ <message>
+ <source>* Parts of the STUN project at http://sourceforge.net/projects/stun</source>
+ <translation>* Часть из STUN проекта на http://sourceforge.net/projects/stun</translation>
+ </message>
+ <message>
+ <source>* Parts of libsrv at http://libsrv.sourceforge.net/</source>
+ <translation>* Часть из libsrv на http://libsrv.sourceforge.net/</translation>
+ </message>
+ <message>
+ <source>For RTP the following dynamic libraries are linked:</source>
+ <translation>Для RTP следующие динамические библиотеки были связаны:</translation>
+ </message>
+ <message>
+ <source>Translated to english by &lt;your name&gt;</source>
+ <translation>Перевод на русский язык: Ходоренко Михаил chodorenko@mail.ru</translation>
+ </message>
+ <message>
+ <source>Directory %1 does not exist.</source>
+ <translation>Директория %1 не существует.</translation>
+ </message>
+ <message>
+ <source>Cannot open file %1 .</source>
+ <translation>Не могу открыть файл %1 .</translation>
+ </message>
+ <message>
+ <source>%1 is not set to your home directory.</source>
+ <translation>%1 не установлена в вашу домашнюю директорию.</translation>
+ </message>
+ <message>
+ <source>Directory %1 (%2) does not exist.</source>
+ <translation>Директория %1 (%2) не существует.</translation>
+ </message>
+ <message>
+ <source>Cannot create directory %1 .</source>
+ <translation>Не могу создать директорию %1 .</translation>
+ </message>
+ <message>
+ <source>Lock file %1 already exist, but cannot be opened.</source>
+ <translation type="obsolete">Файл блокировки %1 уже существует и не может быть открыт.</translation>
+ </message>
+ <message>
+ <source>%1 is already running.
+Lock file %2 already exists.</source>
+ <translation>%1 уже запушен.
+файл блокировки %2 уже существует.</translation>
+ </message>
+ <message>
+ <source>Cannot create %1 .</source>
+ <translation>Не могу создать %1 .</translation>
+ </message>
+ <message>
+ <source>Cannot write to %1 .</source>
+ <translation type="obsolete">Не могу записать %1 .</translation>
+ </message>
+ <message>
+ <source>Syntax error in file %1 .</source>
+ <translation>Синтаксическая ошибка в файле %1 .</translation>
+ </message>
+ <message>
+ <source>Failed to backup %1 to %2</source>
+ <translation>Ошибка создания резервной копии %1 в %2</translation>
+ </message>
+ <message>
+ <source>unknown name (device is busy)</source>
+ <translation>неизвестное имя (устройство занято)</translation>
+ </message>
+ <message>
+ <source>Default device</source>
+ <translation>Устройство по умолчанию</translation>
+ </message>
+ <message>
+ <source>Cannot access the ring tone device (%1).</source>
+ <translation>Не могу получить доступ к устройству звукового сигнала (%1).</translation>
+ </message>
+ <message>
+ <source>Cannot access the speaker (%1).</source>
+ <translation>Не могу получить доступ к аудиовыходу (%1).</translation>
+ </message>
+ <message>
+ <source>Cannot access the microphone (%1).</source>
+ <translation>Не могу получить доступ к входу микрофона (%1).</translation>
+ </message>
+ <message>
+ <source>Cannot receive incoming TCP connections.</source>
+ <translation>Не могу получить входящие TCP соединения.</translation>
+ </message>
+ <message>
+ <source>Call transfer - %1</source>
+ <translation>Перевод звонка - %1</translation>
+ </message>
+ <message>
+ <source>Sound card cannot be set to full duplex.</source>
+ <translation>Звуковая карта не может установить полнодуплексный режим.</translation>
+ </message>
+ <message>
+ <source>Cannot set buffer size on sound card.</source>
+ <translation>Не могу установить размер буфера на звуковой карте.</translation>
+ </message>
+ <message>
+ <source>Sound card cannot be set to %1 channels.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot set sound card to 16 bits recording.</source>
+ <translation>Не могу настроить звуковую карту для 16 битной записи.</translation>
+ </message>
+ <message>
+ <source>Cannot set sound card to 16 bits playing.</source>
+ <translation>Не могу настроить звуковую карту для 16 битного проигрывания.</translation>
+ </message>
+ <message>
+ <source>Cannot set sound card sample rate to %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opening ALSA driver failed</source>
+ <translation>Ошибка открытия ALSA драйвера</translation>
+ </message>
+ <message>
+ <source>Cannot open ALSA driver for PCM playback</source>
+ <translation>Не могу открыть ALSA драйвер для воспроизведения PCM</translation>
+ </message>
+ <message>
+ <source>Cannot open ALSA driver for PCM capture</source>
+ <translation>Не могу открыть ALSA драйвер для захвата PCM</translation>
+ </message>
+ <message>
+ <source>Cannot resolve STUN server: %1</source>
+ <translation>Не могу определить имя STUN сервера: %1</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>public IP: %1 --&gt; private IP: %2 (SIP signaling)</source>
+ <translation>внешний IP: %1 --&gt; внутренний IP: %2 (SIP оповещение)</translation>
+ </message>
+ <message>
+ <source>public IP: %1-%2 --&gt; private IP: %3-%4 (RTP/RTCP)</source>
+ <translation>внешний IP: %1-%2 --&gt; внутренний IP: %3-%4 (RTP/RTCP)</translation>
+ </message>
+ <message>
+ <source>Cannot reach the STUN server: %1</source>
+ <translation>Не могу получить доступ к STUN серверу: %1</translation>
+ </message>
+ <message>
+ <source>If you are behind a firewall then you need to open the following UDP ports.</source>
+ <translation>Если вы находитесь за фаерволом вам нужно открыть следующие UDP порты.</translation>
+ </message>
+ <message>
+ <source>Port %1 (SIP signaling)</source>
+ <translation>Порт %1 (SIP оповещение)</translation>
+ </message>
+ <message>
+ <source>Ports %1-%2 (RTP/RTCP)</source>
+ <translation>Порта %1-%2 (RTP/RTCP)</translation>
+ </message>
+ <message>
+ <source>NAT type discovery via STUN failed.</source>
+ <translation>Ошибка определения типа NAT через STUN.</translation>
+ </message>
+ <message>
+ <source>Failed to create file %1</source>
+ <translation>Ошибка создания файла %1</translation>
+ </message>
+ <message>
+ <source>Failed to write data to file %1</source>
+ <translation>Ошибка записи данных в файл %1</translation>
+ </message>
+ <message>
+ <source>Failed to send message.</source>
+ <translation>Ошибка отправки сообщения.</translation>
+ </message>
+ <message>
+ <source>Cannot lock %1 .</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UserProfileForm</name>
+ <message>
+ <source>Twinkle - User Profile</source>
+ <translation>Twinkle - Профиль пользователя</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Профиль пользователя:</translation>
+ </message>
+ <message>
+ <source>Select which profile you want to edit.</source>
+ <translation>Выберите профиль пользователя для редактирования.</translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation>Пользователь</translation>
+ </message>
+ <message>
+ <source>SIP server</source>
+ <translation>SIP сервер</translation>
+ </message>
+ <message>
+ <source>Voice mail</source>
+ <translation>Голосовая почта</translation>
+ </message>
+ <message>
+ <source>Instant message</source>
+ <translation>Сообщения</translation>
+ </message>
+ <message>
+ <source>Presence</source>
+ <translation>Доступность</translation>
+ </message>
+ <message>
+ <source>RTP audio</source>
+ <translation>RTP аудио</translation>
+ </message>
+ <message>
+ <source>SIP protocol</source>
+ <translation>SIP протокол</translation>
+ </message>
+ <message>
+ <source>Transport/NAT</source>
+ <translation>Транспорт/NAT</translation>
+ </message>
+ <message>
+ <source>Address format</source>
+ <translation>Формат адреса</translation>
+ </message>
+ <message>
+ <source>Timers</source>
+ <translation>Таймеры</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <translation>Звуковые сигналы</translation>
+ </message>
+ <message>
+ <source>Scripts</source>
+ <translation>Скрипты</translation>
+ </message>
+ <message>
+ <source>Security</source>
+ <translation>Безопастность</translation>
+ </message>
+ <message>
+ <source>Select a category for which you want to see or modify the settings.</source>
+ <translation>Выберите категорию для просмотра и модификации настроек.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Принять</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Accept and save your changes.</source>
+ <translation>Принять и сохранить изменения.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Отмена</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Undo all your changes and close the window.</source>
+ <translation>Отменить все измения и закрыть окно.</translation>
+ </message>
+ <message>
+ <source>SIP account</source>
+ <translation>Учётная запись SIP</translation>
+ </message>
+ <message>
+ <source>&amp;User name*:</source>
+ <translation>&amp;Имя пользователя*:</translation>
+ </message>
+ <message>
+ <source>&amp;Domain*:</source>
+ <translation>&amp;Домен*:</translation>
+ </message>
+ <message>
+ <source>Or&amp;ganization:</source>
+ <translation>Ор&amp;ганизация:</translation>
+ </message>
+ <message>
+ <source>The SIP user name given to you by your provider. It is the user part in your SIP address, &lt;b&gt;username&lt;/b&gt;@domain.com This could be a telephone number.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>SIP имя пользователя предоставленное вашим провайдером. Пользовательская часть вашего SIP адреса, &lt;b&gt;username&lt;/b&gt;@domain.com может быть вашим телефонным номером.
+&lt;br&gt;&lt;br&gt;
+Это поле является обязательным.</translation>
+ </message>
+ <message>
+ <source>The domain part of your SIP address, username@&lt;b&gt;domain.com&lt;/b&gt;. Instead of a real domain this could also be the hostname or IP address of your &lt;b&gt;SIP proxy&lt;/b&gt;. If you want direct IP phone to IP phone communications then you fill in the hostname or IP address of your computer.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>Доменная часть вашего SIP адреса , username@&lt;b&gt;domain.com&lt;/b&gt;. Вместо реального домена также может быть именем машины или IP адресом вашего &lt;b&gt;SIP proxy&lt;/b&gt;. Если вы звоните напрямую с компьютера на компьютер, то заполните именем или IP адресом вашей машины
+&lt;br&gt;&lt;br&gt;
+Это поле является обязательным.</translation>
+ </message>
+ <message>
+ <source>You may fill in the name of your organization. When you make a call, this might be shown to the called party.</source>
+ <translation>Вы можете заполнить имя вашей организации. Когда вы будете осуществлять звонок оно может быть показано удалённой стороне.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Это просто ваше полное имя, например John Doe. Оно используется в качестве отображаемого имени. Когда Вы делаете звонок, это имя может быть укаазно в качестве вызывающей стороны.</translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation>&amp;Ваше имя:</translation>
+ </message>
+ <message>
+ <source>SIP authentication</source>
+ <translation>SIP аутетификация</translation>
+ </message>
+ <message>
+ <source>&amp;Realm:</source>
+ <translation>&amp;Область:</translation>
+ </message>
+ <message>
+ <source>Authentication &amp;name:</source>
+ <translation>Аутентификационное &amp;имя:</translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>&amp;Пароль:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Область аутентификации. Значение должно быть предоставлено вашим SIP провайдером. Если вы оставите это поле пустым , то Twinkle будет использовать имя пользователя и пароль для любой области которая требует авторизации.</translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation>Ваше аутентификационное имя для SIP. В большинстве случаем совпадает с именем пользователя SIP. Вы можете ввести здесь другое имя при необходимости.</translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation>Ваш пароль для аутентификации.</translation>
+ </message>
+ <message>
+ <source>Registrar</source>
+ <translation>Регистратор</translation>
+ </message>
+ <message>
+ <source>&amp;Registrar:</source>
+ <translation>&amp;Регистратор:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Имя компьютера, доменное имя или IP адрес вашего регистратора. Если вы используете исходящий прокси совпадающий с вашим регистратором, вы можете оставить его пустым.</translation>
+ </message>
+ <message>
+ <source>&amp;Expiry:</source>
+ <translation>&amp;Устаревание:</translation>
+ </message>
+ <message>
+ <source>The registration expiry time that Twinkle will request.</source>
+ <translation>Время устаревание регистрации, после которого Twinkle перепошлёт запрос заново.</translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>секунд</translation>
+ </message>
+ <message>
+ <source>Re&amp;gister at startup</source>
+ <translation>Ре&amp;гистрироваться при запуске</translation>
+ </message>
+ <message>
+ <source>Alt+G</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Указывает должен ли Twinkle автоматически регистрироваться когда запускается профиль пользователя. Если отключить эту опцию то соединения будут происходить напрямую между IP клиентами без обращения к SIP прокси.</translation>
+ </message>
+ <message>
+ <source>Add q-value to registration</source>
+ <translation>Добавить q-значение к регистрации</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Q-значение указывает приоритет вашего зарегистриванного устройства. Если кроме Twinkle вы регистрируете эту учётную запись на другом SIP устройстве. Сеть может определять по этому значению какому устройству перенаправить вызов в первую очередь.</translation>
+ </message>
+ <message>
+ <source>The q-value is a value between 0.000 and 1.000. A higher value means a higher priority.</source>
+ <translation>Q-значение может изменятся в пределах между 0.000 и 1.000. Большее значение равно большему приоритету (для примера 1 &gt; 0.1 &gt; 0.01).</translation>
+ </message>
+ <message>
+ <source>Outbound Proxy</source>
+ <translation>Исходящий Прокси</translation>
+ </message>
+ <message>
+ <source>&amp;Use outbound proxy</source>
+ <translation>&amp;Использовать исходящий прокси</translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Outbound &amp;proxy:</source>
+ <translation>Исходящий &amp;прокси:</translation>
+ </message>
+ <message>
+ <source>&amp;Send in-dialog requests to proxy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Don&apos;t send a request to proxy if its destination can be resolved locally.</source>
+ <translation>&amp;Не посылать запрос к прокси если назначение может быть определено локально.</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.)</source>
+ <translation type="unfinished">Если вы отметите эту опцию Twinkle сначала попытается определить SIP адрес как IP адрес. Если сможет, то SIP запрос будет послан напрямую. Только если он не сможет опреелить адрес, Twinkle пошлёт SIP запрос на прокси (замечание )</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of your outbound proxy.</source>
+ <translation>Имя сервера, доменное имя или IP адрес вашего исходящего прокси.</translation>
+ </message>
+ <message>
+ <source>Co&amp;decs</source>
+ <translation>Ко&amp;деки</translation>
+ </message>
+ <message>
+ <source>Codecs</source>
+ <translation>Кодеки</translation>
+ </message>
+ <message>
+ <source>Available codecs:</source>
+ <translation>Доступные кодеки:</translation>
+ </message>
+ <message>
+ <source>G.711 A-law</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>G.711 u-law</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>GSM</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>speex-nb (8 kHz)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>speex-wb (16 kHz)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>speex-uwb (32 kHz)</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>List of available codecs.</source>
+ <translation>Список доступных кодеков.</translation>
+ </message>
+ <message>
+ <source>Move a codec from the list of available codecs to the list of active codecs.</source>
+ <translation>Переместите кодек из списка доступных кодеков в список активных кодеков.</translation>
+ </message>
+ <message>
+ <source>Move a codec from the list of active codecs to the list of available codecs.</source>
+ <translation>Переместите кодек из списка активных кодеков в список доступных кодеков.</translation>
+ </message>
+ <message>
+ <source>Active codecs:</source>
+ <translation>Активные кодеки:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Список активных кодеков. Эти кодеки будут использовании при согласовании медиа потоков при установке соединения. Очерёдность кодеков это приоритетность их использования.</translation>
+ </message>
+ <message>
+ <source>Move a codec upwards in the list of active codecs, i.e. increase its preference of use.</source>
+ <translation>Перемещение кодеков вверх по списку увеличивает их приоритет при использовании.</translation>
+ </message>
+ <message>
+ <source>Move a codec downwards in the list of active codecs, i.e. decrease its preference of use.</source>
+ <translation>Перемещение кодеков вниз по списку понижает их приоритет при использовании.</translation>
+ </message>
+ <message>
+ <source>&amp;G.711/G.726 payload size:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The preferred payload size for the G.711 and G.726 codecs.</source>
+ <translation type="unfinished">Приоритетный payload размер для G.711 и G.726 кодеков.</translation>
+ </message>
+ <message>
+ <source>ms</source>
+ <translation>мс</translation>
+ </message>
+ <message>
+ <source>&amp;Follow codec preference from far end on incoming calls</source>
+ <translation>&amp;Следовать настройкам кодеков удалённой стороны при входящем звонке</translation>
+ </message>
+ <message>
+ <source>Alt+F</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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.
+&lt;p&gt;
+If you disable this option, then the first codec from the active codecs that is also in the SDP offer is picked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Follow codec &amp;preference from far end on outgoing calls</source>
+ <translation>Следовать &amp;настройкам кодеков удалённой стороны при исходящем звонке</translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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.
+&lt;p&gt;
+If you disable this option, then the first codec from the active codecs that is also in the SDP answer is picked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;iLBC</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>iLBC</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>i&amp;LBC payload type:</source>
+ <translation type="unfinished">i&amp;LBC payload тип:</translation>
+ </message>
+ <message>
+ <source>iLBC &amp;payload size (ms):</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for iLBC.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>20</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>30</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>The preferred payload size for iLBC.</source>
+ <translation type="unfinished">Приоритетный payload размер для iLBC.</translation>
+ </message>
+ <message>
+ <source>&amp;Speex</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Speex</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Perceptual &amp;enhancement</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Ultra wide band payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+V</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Wide band payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Variable bit-rate (VBR) allows a codec to change its bit-rate dynamically to adapt to the &quot;difficulty&quot; 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&apos;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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for speex wide band.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Co&amp;mplexity:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Discontinuous transmission is an addition to VAD/VBR operation, that allows to stop transmitting completely when the background noise is stationary.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for speex narrow band.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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&apos;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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Narrow band payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G.726</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>G.726 &amp;40 kbps payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 40 kbps.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 32 kbps.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G.726 &amp;24 kbps payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 24 kbps.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G.726 &amp;32 kbps payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 16 kbps.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G.726 &amp;16 kbps payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Codeword &amp;packing order:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RFC 3551</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>ATM AAL2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DT&amp;MF</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>DTMF</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for DTMF events (RFC 2833).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DTMF vo&amp;lume:</source>
+ <translation type="unfinished">DTMF ур&amp;овень:</translation>
+ </message>
+ <message>
+ <source>The power level of the DTMF tone in dB.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The pause after a DTMF tone.</source>
+ <translation>Пауза после DTMF тона.</translation>
+ </message>
+ <message>
+ <source>DTMF &amp;duration:</source>
+ <translation type="unfinished">DTMF &amp;длинна:</translation>
+ </message>
+ <message>
+ <source>DTMF payload &amp;type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DTMF &amp;pause:</source>
+ <translation>DTMF &amp;паузы:</translation>
+ </message>
+ <message>
+ <source>dB</source>
+ <translation type="unfinished">дБ</translation>
+ </message>
+ <message>
+ <source>Duration of a DTMF tone.</source>
+ <translation>Продолжительность посылки DTMF тона.</translation>
+ </message>
+ <message>
+ <source>DTMF t&amp;ransport:</source>
+ <translation>DTMF т&amp;ранспорт:</translation>
+ </message>
+ <message>
+ <source>Auto</source>
+ <translation>Авто</translation>
+ </message>
+ <message>
+ <source>RFC 2833</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Inband</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Out-of-band (SIP INFO)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;h2&gt;RFC 2833&lt;/h2&gt;
+&lt;p&gt;Send DTMF tones as RFC 2833 telephone events.&lt;/p&gt;
+&lt;h2&gt;Inband&lt;/h2&gt;
+&lt;p&gt;Send DTMF inband.&lt;/p&gt;
+&lt;h2&gt;Auto&lt;/h2&gt;
+&lt;p&gt;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.
+&lt;/p&gt;
+&lt;h2&gt;Out-of-band (SIP INFO)&lt;/h2&gt;
+&lt;p&gt;
+Send DTMF out-of-band via a SIP INFO request.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Основные</translation>
+ </message>
+ <message>
+ <source>Protocol options</source>
+ <translation>Опции потокола</translation>
+ </message>
+ <message>
+ <source>Call &amp;Hold variant:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RFC 2543</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>RFC 3264</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allow m&amp;issing Contact header in 200 OK on REGISTER</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Max-Forwards header is mandatory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Put &amp;registration expiry time in contact header</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Use compact header names</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if compact header names should be used for headers that have a compact form.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allow SDP change during call setup</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;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.&lt;/p&gt;
+&lt;p&gt;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.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use domain &amp;name to create a unique contact header value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Twinkle creates a unique contact header value by combining the SIP user name and domain:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;tt&gt;&amp;nbsp;user_domain@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+This way 2 user profiles, having the same user name but different domain names, have unique contact addresses and hence can be activated simultaneously.
+&lt;/p&gt;
+&lt;p&gt;
+Some proxies do not handle a contact header value like this. You can disable this option to get a contact header value like this:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;tt&gt;&amp;nbsp;user@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+This format is what most SIP phones use.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Encode Via, Route, Record-Route as list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redirection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Allow redirection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should redirect a request if a 3XX response is received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ask user &amp;permission to redirect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should ask the user before redirecting a request when a 3XX response is received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max re&amp;directions:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SIP extensions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>disabled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>supported</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>required</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>preferred</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if the 100rel extension (PRACK) is supported:&lt;br&gt;&lt;br&gt;
+&lt;b&gt;disabled&lt;/b&gt;: 100rel extension is disabled
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;supported&lt;/b&gt;: 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.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;required&lt;/b&gt;: 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.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;preferred&lt;/b&gt;: 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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;100 rel (PRACK):</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Replaces</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if the Replaces-extenstion is supported.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>REFER</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call transfer (REFER)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+T</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should transfer a call if a REFER request is received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>As&amp;k user permission to transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should ask the user before transferring a call when a REFER request is received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hold call &amp;with referrer while setting up call to transfer target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should put the current call on hold when a REFER request to transfer a call is received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ho&amp;ld call with referee before sending REFER</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should put the current call on hold when you transfer a call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Auto re&amp;fresh subscription to refer event while call transfer is not finished</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attended refer to AoR (Address of Record)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Privacy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Privacy options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Send P-Preferred-Identity header when hiding user identity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Include a P-Preferred-Identity header with your identity in an INVITE request for a call with identity hiding.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SIP transport</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UDP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>T&amp;ransport protocol:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UDP t&amp;hreshold:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Messages larger than the threshold are sent via TCP. Smaller messages are sent via UDP.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NAT traversal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;NAT traversal not needed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose this option when there is no NAT device between you and your SIP proxy or when your SIP provider offers hosted NAT traversal.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Use statically configured public IP address inside SIP messages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.&lt;br&gt;&lt;br&gt;
+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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &amp;STUN (does not work for incoming TCP)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose this option when your SIP provider offers a STUN server for NAT traversal.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&amp;TUN server:</source>
+ <translation type="unfinished">S&amp;TUN сервер:</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of the STUN server.</source>
+ <translation type="unfinished">Имя сервера, доменное имя или IP адрес STUN сервера.</translation>
+ </message>
+ <message>
+ <source>&amp;Public IP address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The public IP address of your NAT.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Telephone numbers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Only &amp;display user part of URI for telephone number</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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 &quot;123456&quot; to the user. A URI indicates a telephone number if it contains the &quot;user=phone&quot; parameter or when it has a numerical user part and you ticked the next option.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;URI with numerical user part is a telephone number</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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 &quot;user=phone&quot; parameter to such a URI.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Remove special symbols from numerical dial strings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Special symbols:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The special symbols that may be part of a telephone number for nice formatting, but must be removed when dialing.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number conversion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Match expression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Replace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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 &apos;00&apos; instead of the &apos;+&apos;, or you are at the office and all your numbers need to be prefixed with a &apos;9&apos; to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings.
+&lt;/p&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;p&gt;
+The number conversion rules are also applied to incoming calls, so the numbers are displayed in the format you want.
+&lt;/p&gt;
+&lt;h3&gt;Example 1&lt;/h3&gt;
+&lt;p&gt;
+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 &apos;+31&apos; and replace it by a &apos;0&apos;. For dialling numbers abroad you just want to replace the &apos;+&apos; by &apos;00&apos;.
+&lt;/p&gt;
+&lt;p&gt;
+The following rules will do the trick:
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expression = \+31([0-9]*) , Replace = 0$1&lt;br&gt;
+Match expression = \+([0-9]*) , Replace = 00$1&lt;/br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;h3&gt;Example 2&lt;/h3&gt;
+&lt;p&gt;
+You are at work and all telephone numbers starting with a 0 should be prefixed with a 9 for an outside line.
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expression = 0[0-9]* , Replace = 9$&amp;&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move the selected number conversion rule upwards in the list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move the selected number conversion rule downwards in the list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation type="unfinished">&amp;Добавить</translation>
+ </message>
+ <message>
+ <source>Add a number conversion rule.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Re&amp;move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove the selected number conversion rule.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit the selected number conversion rule.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type a telephone number here an press the Test button to see how it is converted by the list of number conversion rules.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Test</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Test how a number is converted by the number conversion rules.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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 &quot;480 User Not Responding&quot;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NAT &amp;keep alive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;No answer:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select ring back tone file.</source>
+ <translation>Выберите файл гудка вызова.</translation>
+ </message>
+ <message>
+ <source>Select ring tone file.</source>
+ <translation>Выберите файл вызывного сигнала.</translation>
+ </message>
+ <message>
+ <source>Ring &amp;back tone:</source>
+ <translation>Гудок &amp;вызова:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Specify the file name of a .wav file that you want to be played as ring back tone for this user.
+&lt;/p&gt;
+&lt;p&gt;
+This ring back tone overrides the ring back tone settings in the system settings.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Specify the file name of a .wav file that you want to be played as ring tone for this user.
+&lt;/p&gt;
+&lt;p&gt;
+This ring tone overrides the ring tone settings in the system settings.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Ring tone:</source>
+ <translation type="unfinished">&amp;Сигнал вызова: </translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you release a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing SIP BYE request are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=local_release&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the BYE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select script file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when an incoming call fails.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing SIP failure response are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_failed&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; contains the status code of the failure response. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when the remote party releases a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming SIP BYE request are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=remote_release&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the BYE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+You can customize the way Twinkle handles incoming calls. Twinkle can call a script when a call comes in. Based on the ouput 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.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Note:&lt;/b&gt; 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 &lt;b&gt;end&lt;/b&gt; and keep on running. Twinkle will continue when it receives the &lt;b&gt;end&lt;/b&gt; parameter.
+&lt;/p&gt;
+&lt;p&gt;
+With your script you can customize call handling by outputing one or more of the following parameters to stdout. Each parameter should be on a separate line.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+action=[ continue | reject | dnd | redirect | autoanswer ]&lt;br&gt;
+reason=&amp;lt;string&amp;gt;&lt;br&gt;
+contact=&amp;lt;address to redirect to&amp;gt;&lt;br&gt;
+caller_name=&amp;lt;name of caller to display&amp;gt;&lt;br&gt;
+ringtone=&amp;lt;file name of .wav file&amp;gt;&lt;br&gt;
+display_msg=&amp;lt;message to show on display&amp;gt;&lt;br&gt;
+end&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;/p&gt;
+&lt;h2&gt;Parameters&lt;/h2&gt;
+&lt;h3&gt;action&lt;/h3&gt;
+&lt;p&gt;
+&lt;b&gt;continue&lt;/b&gt; - continue call handling as usual&lt;br&gt;
+&lt;b&gt;reject&lt;/b&gt; - reject call&lt;br&gt;
+&lt;b&gt;dnd&lt;/b&gt; - deny call with do not disturb indication&lt;br&gt;
+&lt;b&gt;redirect&lt;/b&gt; - redirect call to address specified by &lt;b&gt;contact&lt;/b&gt;&lt;br&gt;
+&lt;b&gt;autoanswer&lt;/b&gt; - automatically answer a call&lt;br&gt;
+&lt;/p&gt;
+&lt;p&gt;
+When the script does not write an action to stdout, then the default action is continue.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;reason: &lt;/b&gt;
+With the reason parameter you can set the reason string for reject or dnd. This might be shown to the far-end user.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;caller_name: &lt;/b&gt;
+This parameter will override the display name of the caller.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;ringtone: &lt;/b&gt;
+The ringtone parameter specifies the .wav file that will be played as ring tone when action is continue.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+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 &lt;b&gt;SIP_&amp;lt;HEADER_NAME&amp;gt;&lt;/b&gt; E.g. SIP_FROM contains the value of the from header.
+&lt;/p&gt;
+&lt;p&gt;
+TWINKLE_TRIGGER=in_call. SIPREQUEST_METHOD=INVITE. The request-URI of the INVITE will be passed in &lt;b&gt;SIPREQUEST_URI&lt;/b&gt;. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when the remote party answers your call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming 200 OK are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_answered&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you answer an incoming call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing 200 OK are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_answered&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call released locall&amp;y:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when an outgoing call fails.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming SIP failure response are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_failed&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; contains the status code of the failure response. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you make a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing INVITE are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=INVITE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the INVITE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Outgoing call a&amp;nswered:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Incoming call &amp;failed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Incoming call:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call released &amp;remotely:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Incoming call &amp;answered:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>O&amp;utgoing call:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Out&amp;going call failed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Enable ZRTP/SRTP encryption</source>
+ <translation>&amp;Включить ZRTP/SRTP шифрование</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ZRTP settings</source>
+ <translation>ZRTP настройки</translation>
+ </message>
+ <message>
+ <source>O&amp;nly encrypt audio if remote party indicated ZRTP support in SDP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Indicate ZRTP support in SDP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Twinkle will indicate ZRTP support during call setup in its signalling.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Popup warning when remote party disables encryption during call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Voice mail address:</source>
+ <translation>&amp;Адрес голосовой почты:</translation>
+ </message>
+ <message>
+ <source>The SIP address or telephone number to access your voice mail.</source>
+ <translation>SIP адрес илм телефонный номер для доступа к вашей голосовой почте.</translation>
+ </message>
+ <message>
+ <source>Unsollicited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sollicited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;H2&gt;Message waiting indication type&lt;/H2&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;H3&gt;Unsollicited&lt;/H3&gt;
+&lt;p&gt;
+Asterisk provides unsollicited message waiting indication.
+&lt;/p&gt;
+&lt;H3&gt;Sollicited&lt;/H3&gt;
+&lt;p&gt;
+Sollicited message waiting indication as specified by RFC 3842.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;MWI type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sollicited MWI</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Subscription &amp;duration:</source>
+ <translation>Продолжительность &amp;подписки:</translation>
+ </message>
+ <message>
+ <source>Mailbox &amp;user name:</source>
+ <translation>Почтовый &amp;ящик:</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of your voice mailbox server.</source>
+ <translation>Имя сервера, доменное имя или IP адрес вашего сервера голосовой почты.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your user name for accessing your voice mailbox.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mailbox &amp;server:</source>
+ <translation>Почтовый &amp;сервер:</translation>
+ </message>
+ <message>
+ <source>Via outbound &amp;proxy</source>
+ <translation>Через исходящий &amp;прокси</translation>
+ </message>
+ <message>
+ <source>Check this option if Twinkle should send SIP messages to the mailbox server via the outbound proxy.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Maximum number of sessions:</source>
+ <translation>&amp;Максимальное число сессий:</translation>
+ </message>
+ <message>
+ <source>When you have this number of instant message sessions open, new incoming message sessions will be rejected.</source>
+ <translation>Это число ограничивает количество открытых сеансов мгновенных сообщений, при превышении этого значения новые сессии будут отвергнуты.</translation>
+ </message>
+ <message>
+ <source>Your presence</source>
+ <translation>Ваша доступность</translation>
+ </message>
+ <message>
+ <source>&amp;Publish availability at startup</source>
+ <translation>&amp;Публиковать доступность при запуске</translation>
+ </message>
+ <message>
+ <source>Publish your availability at startup.</source>
+ <translation>Публикует вашу доступность при запуске.</translation>
+ </message>
+ <message>
+ <source>Publication &amp;refresh interval (sec):</source>
+ <translation>Интервал &amp;обновления публикации (сек):</translation>
+ </message>
+ <message>
+ <source>Refresh rate of presence publications.</source>
+ <translation>Частота обновлений публикации доступности.</translation>
+ </message>
+ <message>
+ <source>Buddy presence</source>
+ <translation>Доступность друзей</translation>
+ </message>
+ <message>
+ <source>&amp;Subscription refresh interval (sec):</source>
+ <translation>Интервал обновления &amp;подписки (сек):</translation>
+ </message>
+ <message>
+ <source>Refresh rate of presence subscriptions.</source>
+ <translation>Частота обновлений подписки.</translation>
+ </message>
+ <message>
+ <source>Dynamic payload type %1 is used more than once.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You must fill in a user name for your SIP account.</source>
+ <translation>Вы должны заполнить имя пользователя для вашей учётной записи SIP.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>ВЫ должны заполнить доменное имя для вашей учётной записи SIP.
+это может быть имя сервера или IP адрес вашего компьютера при прямых звонках.</translation>
+ </message>
+ <message>
+ <source>Invalid domain.</source>
+ <translation>Не правильный домен.</translation>
+ </message>
+ <message>
+ <source>Invalid user name.</source>
+ <translation type="unfinished">Неправильное имя пользователя.</translation>
+ </message>
+ <message>
+ <source>Invalid value for registrar.</source>
+ <translation>Неправильное значение для регистратора.</translation>
+ </message>
+ <message>
+ <source>Invalid value for outbound proxy.</source>
+ <translation type="unfinished">Неправильное значение для исходящего прокси.</translation>
+ </message>
+ <message>
+ <source>You must fill in a mailbox user name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You must fill in a mailbox server</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid mailbox server.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid mailbox user name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value for public IP address missing.</source>
+ <translation>Значение для внешнего IP адреса отсутствует.</translation>
+ </message>
+ <message>
+ <source>Invalid value for STUN server.</source>
+ <translation type="unfinished">Неправильное значение для STUN сервера.</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Вызывные сигналы</translation>
+ </message>
+ <message>
+ <source>Choose ring tone</source>
+ <translation>Выберите вызывной сигнал</translation>
+ </message>
+ <message>
+ <source>Ring back tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Гудок вызова</translation>
+ </message>
+ <message>
+ <source>All files</source>
+ <translation>Все файлы</translation>
+ </message>
+ <message>
+ <source>Choose incoming call script</source>
+ <translation>Выберите скрипт входящего звонка</translation>
+ </message>
+ <message>
+ <source>Choose incoming call answered script</source>
+ <translation>Выберите скрипт входящего отвеченого звонка</translation>
+ </message>
+ <message>
+ <source>Choose incoming call failed script</source>
+ <translation>Выберите скрипт входящего звонка с ошибкой</translation>
+ </message>
+ <message>
+ <source>Choose outgoing call script</source>
+ <translation>Выберите скрипт исходящего звонка</translation>
+ </message>
+ <message>
+ <source>Choose outgoing call answered script</source>
+ <translation>Выберите скрипт исходящего отвеченого звонка</translation>
+ </message>
+ <message>
+ <source>Choose outgoing call failed script</source>
+ <translation>Выберите скрипт исходящего звонка с ошибкой</translation>
+ </message>
+ <message>
+ <source>Choose local release script</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose remote release script</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 converts to %2</source>
+ <translation>%1 конвертирован в %2</translation>
+ </message>
+ <message>
+ <source>AKA AM&amp;F:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A&amp;KA OP:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Authentication management field for AKAv1-MD5 authentication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Operator variant key for AKAv1-MD5 authentication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Prepr&amp;ocessing</source>
+ <translation>Пред&amp;обработка</translation>
+ </message>
+ <message>
+ <source>Preprocessing (improves quality at remote end)</source>
+ <translation>Предварительная обработка (улучшает качество звука на удалённой стороне)</translation>
+ </message>
+ <message>
+ <source>&amp;Automatic gain control</source>
+ <translation>&amp;Автоматический контроль усиления</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automatic gain control &amp;level:</source>
+ <translation>Автоматический контроль уровня &amp;усиления:</translation>
+ </message>
+ <message>
+ <source>Automatic gain control level represents percentual value of automatic gain setting of a microphone. Recommended value is about 25%.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Voice activity detection</source>
+ <translation>&amp;Определение голосовой активности</translation>
+ </message>
+ <message>
+ <source>When enabled, voice activity detection detects whether the input signal represents a speech or a silence/background noise.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Noise reduction</source>
+ <translation>&amp;Понижение шума</translation>
+ </message>
+ <message>
+ <source>The noise reduction can be used to reduce the amount of background noise present in the input signal. This provides higher quality speech.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Acoustic &amp;Echo Cancellation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Variable &amp;bit-rate</source>
+ <translation>Переменный &amp;битрейт</translation>
+ </message>
+ <message>
+ <source>Discontinuous &amp;Transmission</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Quality:</source>
+ <translation>&amp;Качество:</translation>
+ </message>
+ <message>
+ <source>Speex is a lossy codec, which means that it achives 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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>bytes</source>
+ <translation>байт</translation>
+ </message>
+ <message>
+ <source>P&amp;ersistent TCP connection</source>
+ <translation>П&amp;остоянные TCP соединения</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use tel-URI for telephone &amp;number</source>
+ <translation type="unfinished">Использовать tel-URI для телефонного &amp;номера</translation>
+ </message>
+ <message>
+ <source>Expand a dialed telephone number to a tel-URI instead of a sip-URI.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Send composing indications when typing a message.</source>
+ <translation>&amp;Посылать оповещение о наборе тескта при вводе сообщения.</translation>
+ </message>
+ <message>
+ <source>Twinkle sends a composing indication when you type a message. This way the recipient can see that you are typing.</source>
+ <translation>Twinkle посылает оповещения при наборе сообщения. Получатель будет видеть когда вы печатате.</translation>
+ </message>
+ <message>
+ <source>Accept call &amp;transfer request (incoming REFER)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allow call transfer while consultation in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable NAT &amp;keep alive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send UDP NAT keep alive packets.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WizardForm</name>
+ <message>
+ <source>Twinkle - Wizard</source>
+ <translation>Twinkle - Мастер</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of the STUN server.</source>
+ <translation>Имя сервера, доменное имя или IP адрес STUN сервера.</translation>
+ </message>
+ <message>
+ <source>S&amp;TUN server:</source>
+ <translation>S&amp;TUN сервер:</translation>
+ </message>
+ <message>
+ <source>The SIP user name given to you by your provider. It is the user part in your SIP address, &lt;b&gt;username&lt;/b&gt;@domain.com This could be a telephone number.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>SIP имя пользователя предоставленное вашим провайдером. Пользовательская часть вашего SIP адреса, &lt;b&gt;username&lt;/b&gt;@domain.com может быть вашим телефонным номером.
+&lt;br&gt;&lt;br&gt;
+Это поле является обязательным.</translation>
+ </message>
+ <message>
+ <source>&amp;Domain*:</source>
+ <translation>&amp;Домен*:</translation>
+ </message>
+ <message>
+ <source>Choose your SIP service provider. If your SIP service provider is not in the list, then select &lt;b&gt;Other&lt;/b&gt; and fill in the settings you received from your provider.&lt;br&gt;&lt;br&gt;
+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.</source>
+ <translation>Выберите вашего провайдера SIP услуг. Если вашего провайдера нет в списке, тогда выберите &lt;b&gt;Other&lt;/b&gt; и заполните поля данными полученными от вашего провайдера.&lt;br&gt;&lt;br&gt;
+Если вы выбрали одного из предопределённых провайдеров SIP услуг, то вы должны только заполнить ваше имя, имя пользователя, имя аутентификации и пароль.</translation>
+ </message>
+ <message>
+ <source>&amp;Authentication name:</source>
+ <translation>&amp;Аутентификационное имя:</translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation>&amp;Ваше имя:</translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation>Ваше имя SIP аутентификации. Довольно часто совпадает с именем пользователя SIP. Однако может иметь и другое значение.</translation>
+ </message>
+ <message>
+ <source>The domain part of your SIP address, username@&lt;b&gt;domain.com&lt;/b&gt;. Instead of a real domain this could also be the hostname or IP address of your &lt;b&gt;SIP proxy&lt;/b&gt;. If you want direct IP phone to IP phone communications then you fill in the hostname or IP address of your computer.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>Доменная часть вашего SIP адреса , username@&lt;b&gt;domain.com&lt;/b&gt;. Вместо реального домена также может быть именем машины или IP адресом вашего &lt;b&gt;SIP proxy&lt;/b&gt;. Если вы звоните напрямую с компьютера на компьютер, то заполните именем или IP адресом вашей машины
+&lt;br&gt;&lt;br&gt;
+Это поле является обязательным.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Это просто ваше полное имя, например John Doe. Оно используется в качестве отображаемого имени. Когда Вы делаете звонок, это имя может быть указано в качестве вызывающей стороны.</translation>
+ </message>
+ <message>
+ <source>SIP pro&amp;xy:</source>
+ <translation>SIP про&amp;кси:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Имя компьютера, доменное имя или IP адрес вашего SIP прокси. Если оно совпадает со значением вашего домена, вы можете оставить его пустым.</translation>
+ </message>
+ <message>
+ <source>&amp;SIP service provider:</source>
+ <translation>Провайдер &amp;SIP услуг:</translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>&amp;Пароль:</translation>
+ </message>
+ <message>
+ <source>&amp;User name*:</source>
+ <translation>&amp;Имя пользователя*:</translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation>Ваш пароль для аутентификации.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;Принять</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Отмена</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>None (direct IP to IP calls)</source>
+ <translation>Отсутствует (Прямое IP - IP соединение)</translation>
+ </message>
+ <message>
+ <source>Other</source>
+ <translation>Другой</translation>
+ </message>
+ <message>
+ <source>User profile wizard:</source>
+ <translation>Помошник профиля пользователя:</translation>
+ </message>
+ <message>
+ <source>You must fill in a user name for your SIP account.</source>
+ <translation>Вы должны заполнить имя пользователя для вашей учётной записи SIP.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Вы должны заполнить имя домена для вашей учётной записи SIP.
+Это может быть имя или IP адрес вашего компьютера если вы выполняете прямые звонки между компьютерами.</translation>
+ </message>
+ <message>
+ <source>Invalid value for SIP proxy.</source>
+ <translation>Неправильное значение для SIP прокси.</translation>
+ </message>
+ <message>
+ <source>Invalid value for STUN server.</source>
+ <translation>Неправильное значение для STUN сервера.</translation>
+ </message>
+</context>
+<context>
+ <name>YesNoDialog</name>
+ <message>
+ <source>&amp;Yes</source>
+ <translation>&amp;Да</translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation>&amp;Нет</translation>
+ </message>
+</context>
+</TS>
diff --git a/src/gui/lang/twinkle_sv.ts b/src/gui/lang/twinkle_sv.ts
new file mode 100644
index 0000000..a63d54d
--- /dev/null
+++ b/src/gui/lang/twinkle_sv.ts
@@ -0,0 +1,5772 @@
+<!DOCTYPE TS><TS>
+<defaultcodec></defaultcodec>
+<context>
+ <name>AddressCardForm</name>
+ <message>
+ <source>Twinkle - Address Card</source>
+ <translation>Twinkle - Adresskort</translation>
+ </message>
+ <message>
+ <source>&amp;Remark:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Infix name of contact.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>First name of contact.</source>
+ <translation>Förnamn för kontakten.</translation>
+ </message>
+ <message>
+ <source>&amp;First name:</source>
+ <translation>&amp;Förnamn:</translation>
+ </message>
+ <message>
+ <source>You may place any remark about the contact here.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Phone:</source>
+ <translation>&amp;Telefon:</translation>
+ </message>
+ <message>
+ <source>&amp;Infix name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Phone number or SIP address of contact.</source>
+ <translation>Telefonnummer eller SIP-adress för kontakten.</translation>
+ </message>
+ <message>
+ <source>Last name of contact.</source>
+ <translation>Efternamn för kontakten.</translation>
+ </message>
+ <message>
+ <source>&amp;Last name:</source>
+ <translation>&amp;Efternamn:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>You must fill in a name.</source>
+ <translation>Du måste ange ett namn.</translation>
+ </message>
+ <message>
+ <source>You must fill in a phone number or SIP address.</source>
+ <translation>Du måste ange ett telefonnummer eller SIP-adress.</translation>
+ </message>
+</context>
+<context>
+ <name>AuthenticationForm</name>
+ <message>
+ <source>Twinkle - Authentication</source>
+ <translation>Twinkle - Autentisering</translation>
+ </message>
+ <message>
+ <source>user</source>
+ <comment>No need to translate</comment>
+ <translation>användare</translation>
+ </message>
+ <message>
+ <source>The user for which authentication is requested.</source>
+ <translation>Användaren för vilken autentisering begärs.</translation>
+ </message>
+ <message>
+ <source>profile</source>
+ <comment>No need to translate</comment>
+ <translation>profil</translation>
+ </message>
+ <message>
+ <source>The user profile of the user for which authentication is requested.</source>
+ <translation>Användarprofilen för användaren för vilken autentisering begärs.</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Användarprofil:</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Användare:</translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>&amp;Lösenord:</translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation>Ditt lösenord för autentisering.</translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation>Ditt SIP-autentiseringsnamn. Ganska ofta är detta samma som ditt SIP-användarnamn. Det kan dock vara ett annat namn.</translation>
+ </message>
+ <message>
+ <source>&amp;User name:</source>
+ <translation>Användar&amp;namn:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Login required for realm:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>realm</source>
+ <comment>No need to translate</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The realm for which you need to authenticate.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>BuddyForm</name>
+ <message>
+ <source>Twinkle - Buddy</source>
+ <translation>Twinkle - Kompis</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adressbok</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Välj en adress från adressboken.</translation>
+ </message>
+ <message>
+ <source>&amp;Phone:</source>
+ <translation>&amp;Telefon:</translation>
+ </message>
+ <message>
+ <source>Name of your buddy.</source>
+ <translation>Namnet på din kompis.</translation>
+ </message>
+ <message>
+ <source>&amp;Show availability</source>
+ <translation>&amp;Visa tillgänglighet</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>Check this option if you want to see the availability of your buddy. This will only work if your provider offers a presence agent.</source>
+ <translation>Kryssa för detta alternativ om du vill se tillgängligheten för din kompis. Detta kommer endast att fungera om din leverantör erbjuder en närvaroagent.</translation>
+ </message>
+ <message>
+ <source>&amp;Name:</source>
+ <translation>&amp;Namn:</translation>
+ </message>
+ <message>
+ <source>SIP address your buddy.</source>
+ <translation>SIP-adress till din kompis.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>You must fill in a name.</source>
+ <translation>Du måste ange ett namn.</translation>
+ </message>
+ <message>
+ <source>Invalid phone.</source>
+ <translation>Ogiltig telefon.</translation>
+ </message>
+ <message>
+ <source>Failed to save buddy list: %1</source>
+ <translation>Misslyckades med att spara kompislista: %1</translation>
+ </message>
+</context>
+<context>
+ <name>BuddyList</name>
+ <message>
+ <source>Availability</source>
+ <translation>Tillgänglighet</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>okänd</translation>
+ </message>
+ <message>
+ <source>offline</source>
+ <translation>frånkopplad</translation>
+ </message>
+ <message>
+ <source>online</source>
+ <translation>ansluten</translation>
+ </message>
+ <message>
+ <source>request failed</source>
+ <translation>begäran misslyckades</translation>
+ </message>
+ <message>
+ <source>request rejected</source>
+ <translation>begäran avvisades</translation>
+ </message>
+ <message>
+ <source>not published</source>
+ <translation>inte publicerad</translation>
+ </message>
+ <message>
+ <source>failed to publish</source>
+ <translation>misslyckades med att publicera</translation>
+ </message>
+ <message>
+ <source>Click right to add a buddy.</source>
+ <translation>Högerklicka för att lägga till en kompis.</translation>
+ </message>
+</context>
+<context>
+ <name>CoreAudio</name>
+ <message>
+ <source>Failed to open sound card</source>
+ <translation>MIsslyckades med att öppna ljudkortet</translation>
+ </message>
+ <message>
+ <source>Failed to create a UDP socket (RTP) on port %1</source>
+ <translation>Misslyckades med att skapa ett UDP-uttag(RTP) på port %1</translation>
+ </message>
+ <message>
+ <source>Failed to create audio receiver thread.</source>
+ <translation>Misslyckades med att skapa ljudmottagartråd.</translation>
+ </message>
+ <message>
+ <source>Failed to create audio transmitter thread.</source>
+ <translation>Misslyckades med att skapa ljudsändartråd.</translation>
+ </message>
+</context>
+<context>
+ <name>CoreCallHistory</name>
+ <message>
+ <source>local user</source>
+ <translation>lokal användare</translation>
+ </message>
+ <message>
+ <source>remote user</source>
+ <translation>fjärranvändare</translation>
+ </message>
+ <message>
+ <source>failure</source>
+ <translation>fel</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>okänd</translation>
+ </message>
+ <message>
+ <source>in</source>
+ <translation>in</translation>
+ </message>
+ <message>
+ <source>out</source>
+ <translation>ut</translation>
+ </message>
+</context>
+<context>
+ <name>DeregisterForm</name>
+ <message>
+ <source>Twinkle - Deregister</source>
+ <translation>Twinkle - Avregistrering</translation>
+ </message>
+ <message>
+ <source>deregister all devices</source>
+ <translation>avregistrera alla enheter</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+</context>
+<context>
+ <name>DiamondcardProfileForm</name>
+ <message>
+ <source>Twinkle - Diamondcard User Profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your Diamondcard account ID.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished">Detta är helt enkelt ditt fullständiga namn, t.ex. Sven Svensson. Det används endast för visning. När du ringer ett samtal kan dock detta namn visas för motparten.</translation>
+ </message>
+ <message>
+ <source>&amp;Account ID:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;PIN code:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation type="unfinished">&amp;Ditt namn:</translation>
+ </message>
+ <message>
+ <source>&lt;p align=&quot;center&quot;&gt;&lt;u&gt;Sign up for a Diamondcard account&lt;/u&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished">&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fill in your account ID.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fill in your PIN code.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A user profile with name %1 already exists.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your Diamondcard PIN code.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;With a Diamondcard account you can make worldwide calls to regular and cell phones and send SMS messages. To sign up for a Diamondcard account click on the &quot;sign up&quot; link below. Once you have signed up you receive an account ID and PIN code. Enter the account ID and PIN code below to create a Twinkle user profile for your Diamondcard account.&lt;/p&gt;
+&lt;p&gt;For call rates see the sign up web page that will be shown to you when you click on the &quot;sign up&quot; link.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DtmfForm</name>
+ <message>
+ <source>Twinkle - DTMF</source>
+ <translation>Twinkle - DTMF</translation>
+ </message>
+ <message>
+ <source>Keypad</source>
+ <translation>Knappsats</translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation>2</translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation>3</translation>
+ </message>
+ <message>
+ <source>Over decadic A. Normally not needed.</source>
+ <translation>Över dekadiskt A. Behövs oftast inte.</translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation>4</translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation>5</translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation>6</translation>
+ </message>
+ <message>
+ <source>Over decadic B. Normally not needed.</source>
+ <translation>Över dekadiskt B. Behövs oftast inte.</translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation>7</translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation>8</translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation>9</translation>
+ </message>
+ <message>
+ <source>Over decadic C. Normally not needed.</source>
+ <translation>Över dekadiskt C. Behövs oftast inte.</translation>
+ </message>
+ <message>
+ <source>Star (*)</source>
+ <translation>Stjärna (*)</translation>
+ </message>
+ <message>
+ <source>0</source>
+ <translation>0</translation>
+ </message>
+ <message>
+ <source>Pound (#)</source>
+ <translation>Fyrkant (#)</translation>
+ </message>
+ <message>
+ <source>Over decadic D. Normally not needed.</source>
+ <translation>Över dekadiskt D. Behövs oftast inte.</translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation>1</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>S&amp;täng</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+T</translation>
+ </message>
+</context>
+<context>
+ <name>FreeDeskSysTray</name>
+ <message>
+ <source>Show/Hide</source>
+ <translation>Visa/Göm</translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation>Avsluta</translation>
+ </message>
+</context>
+<context>
+ <name>GUI</name>
+ <message>
+ <source>Failed to create a UDP socket (SIP) on port %1</source>
+ <translation type="obsolete">Kunde inte skapa UDP-socket (SIP) på port %1</translation>
+ </message>
+ <message>
+ <source>Override lock file and start anyway?</source>
+ <translation>Strunta i låsfil och starta ändå?</translation>
+ </message>
+ <message>
+ <source>The following profiles are both for user %1</source>
+ <translation>Följande profiler är båda för användaren %1</translation>
+ </message>
+ <message>
+ <source>You can only run multiple profiles for different users.</source>
+ <translation>Du kan endast köra flera profiler för olika användare.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Kan inte hitta ett nätverkskort. Twinkle kommer att använda 127.0.0.1 som lokal IP-adress. När du ansluter till nätverket så måste du starta om Twinkle för att använda den korrekta IP-adressen.</translation>
+ </message>
+ <message>
+ <source>Line %1: incoming call for %2</source>
+ <translation>Linje %1: inkommande samtal för %2</translation>
+ </message>
+ <message>
+ <source>Call transferred by %1</source>
+ <translation>Samtal kopplat av %1</translation>
+ </message>
+ <message>
+ <source>Line %1: far end cancelled call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: far end released call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: SDP answer from far end not supported.</source>
+ <translation>Linje %1: SDP-svar från andra parten stöds inte.</translation>
+ </message>
+ <message>
+ <source>Line %1: SDP answer from far end missing.</source>
+ <translation>Linje %1: Inget SDP-svar från andra parten.</translation>
+ </message>
+ <message>
+ <source>Line %1: Unsupported content type in answer from far end.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: no ACK received, call will be terminated.</source>
+ <translation>Linje %1: inget ACK mottaget. Samtalet kommer avslutas.</translation>
+ </message>
+ <message>
+ <source>Line %1: no PRACK received, call will be terminated.</source>
+ <translation>Linje %1: inget PRACK mottaget. Samtalet kommer avslutas.</translation>
+ </message>
+ <message>
+ <source>Line %1: PRACK failed.</source>
+ <translation>Linje %1: PRACK misslyckades.</translation>
+ </message>
+ <message>
+ <source>Line %1: failed to cancel call.</source>
+ <translation>Linje %1: misslyckades med att avbryta samtal.</translation>
+ </message>
+ <message>
+ <source>Line %1: far end answered call.</source>
+ <translation>Linje %1: motparten svarade på samtalet.</translation>
+ </message>
+ <message>
+ <source>Line %1: call failed.</source>
+ <translation>Linje %1: samtal misslyckades.</translation>
+ </message>
+ <message>
+ <source>The call can be redirected to:</source>
+ <translation>Samtalet kan vidarekopplas till:</translation>
+ </message>
+ <message>
+ <source>Line %1: call released.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: call established.</source>
+ <translation>Linje %1: samtal etablerat.</translation>
+ </message>
+ <message>
+ <source>Response on terminal capability request: %1 %2</source>
+ <translation>Svar på begäran om terminalförmågor: %1 %2</translation>
+ </message>
+ <message>
+ <source>Terminal capabilities of %1</source>
+ <translation>Terminalförmågor för %1</translation>
+ </message>
+ <message>
+ <source>Accepted body types:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation>okänt</translation>
+ </message>
+ <message>
+ <source>Accepted encodings:</source>
+ <translation>Accepterade kodningar:</translation>
+ </message>
+ <message>
+ <source>Accepted languages:</source>
+ <translation>Accepterade språk:</translation>
+ </message>
+ <message>
+ <source>Allowed requests:</source>
+ <translation>Tillåtna begäran:</translation>
+ </message>
+ <message>
+ <source>Supported extensions:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>End point type:</source>
+ <translation>Typ av motpart:</translation>
+ </message>
+ <message>
+ <source>Line %1: call retrieve failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, registration failed: %2 %3</source>
+ <translation>%1, registrering misslyckades: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, registration succeeded (expires = %2 seconds)</source>
+ <translation>%1, registrering lyckades (går ut om = %2 sekunder)</translation>
+ </message>
+ <message>
+ <source>%1, registration failed: STUN failure</source>
+ <translation>%1, registrering misslyckades: STUN-problem</translation>
+ </message>
+ <message>
+ <source>%1, de-registration succeeded: %2 %3</source>
+ <translation>%1, avregistrering lyckades: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, de-registration failed: %2 %3</source>
+ <translation>%1, avregistrering misslyckades: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, fetching registrations failed: %2 %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>: you are not registered</source>
+ <translation>: du är inte registrerad</translation>
+ </message>
+ <message>
+ <source>: you have the following registrations</source>
+ <translation>: du har följande registreringar</translation>
+ </message>
+ <message>
+ <source>: fetching registrations...</source>
+ <translation>: hämtar registreringar...</translation>
+ </message>
+ <message>
+ <source>Line %1: redirecting request to</source>
+ <translation>Linje %1: Skickar vidare till</translation>
+ </message>
+ <message>
+ <source>Redirecting request to: %1</source>
+ <translation>Skickar vidare till: %1</translation>
+ </message>
+ <message>
+ <source>Line %1: DTMF detected:</source>
+ <translation>Linje %1: DTMF detekterad:</translation>
+ </message>
+ <message>
+ <source>invalid DTMF telephone event (%1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: send DTMF %2</source>
+ <translation>Linje %1: skicka DTMF %2</translation>
+ </message>
+ <message>
+ <source>Line %1: far end does not support DTMF telephone events.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: received notification.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Event: %1</source>
+ <translation>Händelse: %1</translation>
+ </message>
+ <message>
+ <source>State: %1</source>
+ <translation>Tillstånd: %1</translation>
+ </message>
+ <message>
+ <source>Reason: %1</source>
+ <translation>Anledning: %1</translation>
+ </message>
+ <message>
+ <source>Progress: %1 %2</source>
+ <translation>Förlopp: %1 %2</translation>
+ </message>
+ <message>
+ <source>Line %1: call transfer failed.</source>
+ <translation>Linje %1: samtalskoppling misslyckades.</translation>
+ </message>
+ <message>
+ <source>Line %1: call succesfully transferred.</source>
+ <translation>Linje %1: samtal kopplades.</translation>
+ </message>
+ <message>
+ <source>Line %1: call transfer still in progress.</source>
+ <translation>Linje %1: samtalskoppling pågår fortfarande.</translation>
+ </message>
+ <message>
+ <source>No further notifications will be received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: transferring call to %2</source>
+ <translation>Linje %1: kopplar samtal till %2</translation>
+ </message>
+ <message>
+ <source>Transfer requested by %1</source>
+ <translation>Koppilng begärd av %1</translation>
+ </message>
+ <message>
+ <source>Line %1: Call transfer failed. Retrieving original call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, STUN request failed: %2 %3</source>
+ <translation>%1. STUN-begäran misslyckades: %2 %3</translation>
+ </message>
+ <message>
+ <source>%1, STUN request failed.</source>
+ <translation>%1, STUN-begäran misslyckades.</translation>
+ </message>
+ <message>
+ <source>Redirecting call</source>
+ <translation>Vidarekoppling av samtal</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Användarprofil:</translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Användare:</translation>
+ </message>
+ <message>
+ <source>Do you allow the call to be redirected to the following destination?</source>
+ <translation>Tillåter du samtalet att hänvisas till följande destination?</translation>
+ </message>
+ <message>
+ <source>If you don&apos;t want to be asked this anymore, then you must change the settings in the SIP protocol section of the user profile.</source>
+ <translation type="unfinished">Om du inte vill bli frågad detta igen måste du ändra inställningarna i sektionen SIP-protokoll för användarprofilen.</translation>
+ </message>
+ <message>
+ <source>Redirecting request</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Do you allow the %1 request to be redirected to the following destination?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transferring call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Request to transfer call received from:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Request to transfer call received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Do you allow the call to be transferred to the following destination?</source>
+ <translation>Tillåter du samtalet att kopplas vidare till följande destination?</translation>
+ </message>
+ <message>
+ <source>Info:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation>Varning:</translation>
+ </message>
+ <message>
+ <source>Critical:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Firewall / NAT discovery...</source>
+ <translation>Brandvägg / NAT-identifiering...</translation>
+ </message>
+ <message>
+ <source>Abort</source>
+ <translation>Avbryt</translation>
+ </message>
+ <message>
+ <source>Line %1</source>
+ <translation>Linje %1</translation>
+ </message>
+ <message>
+ <source>Click the padlock to confirm a correct SAS.</source>
+ <translation>Klicka på hänglåset för att bekräfta en korrekt SAS.</translation>
+ </message>
+ <message>
+ <source>The remote user on line %1 disabled the encryption.</source>
+ <translation>Motparten på linje %1 stängde av krypteringen.</translation>
+ </message>
+ <message>
+ <source>Line %1: SAS confirmed.</source>
+ <translation>Linje %1: SAS bekräftad.</translation>
+ </message>
+ <message>
+ <source>Line %1: SAS confirmation reset.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, voice mail status failure.</source>
+ <translation>%1, kan inte hämta status för röstbrevlåda.</translation>
+ </message>
+ <message>
+ <source>%1, voice mail status rejected.</source>
+ <translation>%1, hämtning av status för röstbrevlåda avvisades.</translation>
+ </message>
+ <message>
+ <source>%1, voice mailbox does not exist.</source>
+ <translation>%1, röstbrevlådan finns inte.</translation>
+ </message>
+ <message>
+ <source>%1, voice mail status terminated.</source>
+ <translation>%1, hämtning av status för röstbrevlåda avslutad.</translation>
+ </message>
+ <message>
+ <source>Line %1: call rejected.</source>
+ <translation>Linje %1: samtal avvisades.</translation>
+ </message>
+ <message>
+ <source>Line %1: call redirected.</source>
+ <translation>Linje %1: samtal vidarekopplat.</translation>
+ </message>
+ <message>
+ <source>Failed to start conference.</source>
+ <translation>Kunde inte starta konferens.</translation>
+ </message>
+ <message>
+ <source>Failed to create a %1 socket (SIP) on port %2</source>
+ <translation>Misslyckades med att skapa ett %1-uttag (SIP) på port %2</translation>
+ </message>
+ <message>
+ <source>If these are users for different domains, then enable the following option in your user profile (SIP protocol)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use domain name to create a unique contact header</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save message attachment: %1</source>
+ <translation>Misslyckades med att spara meddelandebilaga: %1</translation>
+ </message>
+ <message>
+ <source>Accepted by network</source>
+ <translation>Accepterad av nätverket</translation>
+ </message>
+ <message>
+ <source>Transferred by: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot open web browser: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Configure your web browser in the system settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>GetAddressForm</name>
+ <message>
+ <source>Twinkle - Select address</source>
+ <translation>Twinkle - Välj adress</translation>
+ </message>
+ <message>
+ <source>&amp;KAddressBook</source>
+ <translation>&amp;KAddressBook</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Namn</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation>Typ</translation>
+ </message>
+ <message>
+ <source>Phone</source>
+ <translation>Telefon</translation>
+ </message>
+ <message>
+ <source>This list of addresses is taken from &lt;b&gt;KAddressBook&lt;/b&gt;. 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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Show only SIP addresses</source>
+ <translation>&amp;Visa endast SIP-adresser</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>Check this option when you only want to see contacts with SIP addresses, i.e. starting with &quot;&lt;b&gt;sip:&lt;/b&gt;&quot;.</source>
+ <translation>Kryssa för detta alternativ när du endast vill se kontakter med SIP-adresser, alltså börjar med &quot;&lt;b&gt;sip:&lt;/b&gt;&quot;.</translation>
+ </message>
+ <message>
+ <source>&amp;Reload</source>
+ <translation>Upp&amp;datera</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt+D</translation>
+ </message>
+ <message>
+ <source>Reload the list of addresses from KAddressbook.</source>
+ <translation>Uppdatera listan över adresser från KAddressbook.</translation>
+ </message>
+ <message>
+ <source>&amp;Local address book</source>
+ <translation>&amp;Lokal adressbok</translation>
+ </message>
+ <message>
+ <source>Remark</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Contacts in the local address book of Twinkle.</source>
+ <translation>Kontakter i den lokala adressboken för Twinkle.</translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation>&amp;Lägg till</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+L</translation>
+ </message>
+ <message>
+ <source>Add a new contact to the local address book.</source>
+ <translation>Lägg till en ny kontakt i den lokala adressboken.</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Ta bort</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation>Alt+T</translation>
+ </message>
+ <message>
+ <source>Delete a contact from the local address book.</source>
+ <translation>Ta bort en kontakt från den lokala adressboken.</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Redigera</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation>Alt+R</translation>
+ </message>
+ <message>
+ <source>Edit a contact from the local address book.</source>
+ <translation>Redigera en kontakt från den lokala adressboken.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You seem not to have any contacts with a phone number in &lt;b&gt;KAddressBook&lt;/b&gt;, KDE&apos;s address book application. Twinkle retrieves all contacts with a phone number from KAddressBook. To manage your contacts you have to use KAddressBook.&lt;p&gt;As an alternative you may use Twinkle&apos;s local address book.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>GetProfileNameForm</name>
+ <message>
+ <source>Twinkle - Profile name</source>
+ <translation>Twinkle - Profilnamn</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Enter a name for your profile:</source>
+ <translation>Ge din profil ett namn:</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The name of your profile&lt;/b&gt;
+&lt;br&gt;&lt;br&gt;
+A profile contains your user settings, e.g. your user name and password. You have to give each profile a name.
+&lt;br&gt;&lt;br&gt;
+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.
+&lt;br&gt;&lt;br&gt;
+To remember your profiles easily you could use your SIP user name as a profile name, e.g. &lt;b&gt;example@example.com&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Din profils namn&lt;/b&gt;
+&lt;br&gt;&lt;br&gt;
+En profil innehåller dina användarinställningar. T.ex. ditt användarnamn och lösenord. Du måste ge varje profil ett namn.
+&lt;br&gt;&lt;br&gt;
+Om du har flera SIP-konton kan du skapa flera profiler. När du startar Twinkle kommer du se en lista över dina profiler och kunna välja vilken av profilerna du vill använda.
+&lt;br&gt;&lt;br&gt;
+För att enkelt komma ihåg dina profiler kan du använda ditt SIP-användarnamn som profilnamn. T.ex. &lt;b&gt;exempel@exempel.com&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Cannot find .twinkle directory in your home directory.</source>
+ <translation>Kan inte hitta katalogen .twinkle i din hemkatalog.</translation>
+ </message>
+ <message>
+ <source>Profile already exists.</source>
+ <translation>Profilen finns redan.</translation>
+ </message>
+ <message>
+ <source>Rename profile &apos;%1&apos; to:</source>
+ <translation>Döp om profilen &apos;%1&apos; till:</translation>
+ </message>
+</context>
+<context>
+ <name>HistoryForm</name>
+ <message>
+ <source>Twinkle - Call History</source>
+ <translation>Twinkle - Samtalshistorik</translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation>Tid</translation>
+ </message>
+ <message>
+ <source>In/Out</source>
+ <translation>In/Ut</translation>
+ </message>
+ <message>
+ <source>From/To</source>
+ <translation>Från/Till</translation>
+ </message>
+ <message>
+ <source>Subject</source>
+ <translation>Ämne</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation>Status</translation>
+ </message>
+ <message>
+ <source>Call details</source>
+ <translation>Samtalsdetaljer</translation>
+ </message>
+ <message>
+ <source>Details of the selected call record.</source>
+ <translation>Detaljer för det valda samtalet.</translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation>Visa</translation>
+ </message>
+ <message>
+ <source>&amp;Incoming calls</source>
+ <translation>&amp;Inkommande samtal</translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation>Alt+I</translation>
+ </message>
+ <message>
+ <source>Check this option to show incoming calls.</source>
+ <translation>Kryssa i denna ruta för att visa inkommande samtal.</translation>
+ </message>
+ <message>
+ <source>&amp;Outgoing calls</source>
+ <translation>&amp;Utgående samtal</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+U</translation>
+ </message>
+ <message>
+ <source>Check this option to show outgoing calls.</source>
+ <translation>Kryssa i denna ruta för att visa utgående samtal.</translation>
+ </message>
+ <message>
+ <source>&amp;Answered calls</source>
+ <translation>&amp;Besvarade samtal</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+B</translation>
+ </message>
+ <message>
+ <source>Check this option to show answered calls.</source>
+ <translation>Kryssa i denna ruta för att visa besvarade samtal.</translation>
+ </message>
+ <message>
+ <source>&amp;Missed calls</source>
+ <translation>&amp;Missade samtal</translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation>Alt+M</translation>
+ </message>
+ <message>
+ <source>Check this option to show missed calls.</source>
+ <translation>Kryssa i denna ruta för att visa missade samtal.</translation>
+ </message>
+ <message>
+ <source>Current &amp;user profiles only</source>
+ <translation>Enbart aktuell &amp;användarprofil</translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Check this option to show only calls associated with this user profile.</source>
+ <translation>Kryssa i denna ruta för att enbart visa samtal associerade med aktuell användarprofil.</translation>
+ </message>
+ <message>
+ <source>C&amp;lear</source>
+ <translation>&amp;Töm</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+T</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;Clear the complete call history.&lt;/p&gt;
+&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; this will clear &lt;b&gt;all&lt;/b&gt; records, also records not shown depending on the checked view options.&lt;/p&gt;</source>
+ <translation>&lt;p&gt;Töm hela samtalshistoriken.&lt;/p&gt;
+&lt;p&gt;&lt;b&gt;Observera:&lt;/b&gt; detta rensar bort &lt;b&gt;alla&lt;/b&gt; samtal. Även samtal som inte visas på grund av aktuella visningsalternativ.&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation type="obsolete">&amp;Stäng</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>Close this window.</source>
+ <translation>Stäng detta fönster.</translation>
+ </message>
+ <message>
+ <source>Call start:</source>
+ <translation>Samtal startade:</translation>
+ </message>
+ <message>
+ <source>Call answer:</source>
+ <translation>Samtal besvarades:</translation>
+ </message>
+ <message>
+ <source>Call end:</source>
+ <translation>Samtal avslutades:</translation>
+ </message>
+ <message>
+ <source>Call duration:</source>
+ <translation>Samtalslängd:</translation>
+ </message>
+ <message>
+ <source>Direction:</source>
+ <translation>Riktning:</translation>
+ </message>
+ <message>
+ <source>From:</source>
+ <translation>Från:</translation>
+ </message>
+ <message>
+ <source>To:</source>
+ <translation>Till:</translation>
+ </message>
+ <message>
+ <source>Reply to:</source>
+ <translation>Svara till:</translation>
+ </message>
+ <message>
+ <source>Referred by:</source>
+ <translation>Kopplad av:</translation>
+ </message>
+ <message>
+ <source>Subject:</source>
+ <translation>Ämne:</translation>
+ </message>
+ <message>
+ <source>Released by:</source>
+ <translation>Avslutat av:</translation>
+ </message>
+ <message>
+ <source>Status:</source>
+ <translation>Status:</translation>
+ </message>
+ <message>
+ <source>Far end device:</source>
+ <translation>Enhet på andra sidan:</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Användarprofil:</translation>
+ </message>
+ <message>
+ <source>conversation</source>
+ <translation>konversation</translation>
+ </message>
+ <message>
+ <source>Call...</source>
+ <translation>Ring upp...</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Ta bort</translation>
+ </message>
+ <message>
+ <source>Re:</source>
+ <translation>Sv:</translation>
+ </message>
+ <message>
+ <source>Clo&amp;se</source>
+ <translation>St&amp;äng</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+Ä</translation>
+ </message>
+ <message>
+ <source>&amp;Call</source>
+ <translation>&amp;Ring</translation>
+ </message>
+ <message>
+ <source>Call selected address.</source>
+ <translation>Ring markerad adress.</translation>
+ </message>
+ <message>
+ <source>Number of calls:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>###</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Total call duration:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>InviteForm</name>
+ <message>
+ <source>Twinkle - Call</source>
+ <translation>Twinkle - Ring</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;Till:</translation>
+ </message>
+ <message>
+ <source>Optionally you can provide a subject here. This might be shown to the callee.</source>
+ <translation>Om du vill kan du ange ämne här. Det kan visas för den du ringer.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adressbok</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Välj en adress från adressboken.</translation>
+ </message>
+ <message>
+ <source>The address that you want to call. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Adressen som du vill ringa. Detta kan vara en komplett SIP-adress som &lt;b&gt;sip:exempel@exempel.com&lt;/b&gt; eller bara användarnamnet eller telefonnumret i adressen. När du inte anger en komplett adress kommer Twinkle fylla ut adressen med domännamnet från din användarprofil.</translation>
+ </message>
+ <message>
+ <source>The user that will make the call.</source>
+ <translation>Användare som ringer upp.</translation>
+ </message>
+ <message>
+ <source>&amp;Subject:</source>
+ <translation>&amp;Ämne:</translation>
+ </message>
+ <message>
+ <source>&amp;From:</source>
+ <translation>&amp;Från:</translation>
+ </message>
+ <message>
+ <source>&amp;Hide identity</source>
+ <translation>&amp;Dölj identitet</translation>
+ </message>
+ <message>
+ <source>Alt+H</source>
+ <translation>Alt+D</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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 &lt;b&gt;not&lt;/b&gt; hide your IP address.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Warning:&lt;/b&gt; not all providers support identity hiding.
+&lt;/p&gt;</source>
+ <translation>&lt;p&gt;
+Med denna inställning kan du be din SIP-leverantör dölja din identitet för den du ringer upp. Detta döljer bara din identitet. D.v.s. din SIP-adress eller telefonnummer. Det döljer &lt;b&gt;inte&lt;/b&gt; din IP-adress.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Varning:&lt;/b&gt; Inte alla SIP-leverantörer stöder dold identitet.
+&lt;/p&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Not all SIP providers support identity hiding. Make sure your SIP provider supports it if you really need it.</source>
+ <translation>Inte alla SIP-leverantörer stöder dold identitet. Se till att din SIP-leverantör stöder det om du verkligen behöver det.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished">F10</translation>
+ </message>
+</context>
+<context>
+ <name>LogViewForm</name>
+ <message>
+ <source>Twinkle - Log</source>
+ <translation>Twinkle - Logg</translation>
+ </message>
+ <message>
+ <source>Contents of the current log file (~/.twinkle/twinkle.log)</source>
+ <translation>Innehåll i nuvarande loggfil (~/.twinkle/twinkle.log)</translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation>&amp;Stäng</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>C&amp;lear</source>
+ <translation>&amp;Töm</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+T</translation>
+ </message>
+ <message>
+ <source>Clear the log window. This does &lt;b&gt;not&lt;/b&gt; clear the log file itself.</source>
+ <translation>Töm loggfönstret. Detta tömmer &lt;b&gt;inte&lt;/b&gt; själva loggfilen.</translation>
+ </message>
+</context>
+<context>
+ <name>MessageForm</name>
+ <message>
+ <source>Twinkle - Instant message</source>
+ <translation>Twinkle - Snabbmeddelande</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;Till:</translation>
+ </message>
+ <message>
+ <source>The user that will send the message.</source>
+ <translation>Användaren som ska skicka meddelandet.</translation>
+ </message>
+ <message>
+ <source>The address of the user that you want to send a message. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adressbok</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Välj en adress från adressboken.</translation>
+ </message>
+ <message>
+ <source>&amp;User profile:</source>
+ <translation>&amp;Användarprofil:</translation>
+ </message>
+ <message>
+ <source>Conversation</source>
+ <translation>Konversation</translation>
+ </message>
+ <message>
+ <source>Type your message here and then press &quot;send&quot; to send it.</source>
+ <translation>Skriv ditt meddelande här och tryck sedan på &quot;Skicka&quot; för att skicka det.</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation>&amp;Skicka</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>Send the message.</source>
+ <translation>Skicka meddelandet.</translation>
+ </message>
+ <message>
+ <source>Instant message toolbar</source>
+ <translation>Verktygsrad för snabbmeddelanden</translation>
+ </message>
+ <message>
+ <source>Send file...</source>
+ <translation>Skicka fil...</translation>
+ </message>
+ <message>
+ <source>Send file</source>
+ <translation>Skicka fil</translation>
+ </message>
+ <message>
+ <source>image size is scaled down in preview</source>
+ <translation>bildstorleken är nedskalad i förhandsvisning</translation>
+ </message>
+ <message>
+ <source>Delivery failure</source>
+ <translation>Leverans misslyckades</translation>
+ </message>
+ <message>
+ <source>Delivery notification</source>
+ <translation>Leveransnotifiering</translation>
+ </message>
+ <message>
+ <source>Open with %1...</source>
+ <translation>Öppna med %1...</translation>
+ </message>
+ <message>
+ <source>Open with...</source>
+ <translation>Öppna med...</translation>
+ </message>
+ <message>
+ <source>Save attachment as...</source>
+ <translation>Spara bilaga som...</translation>
+ </message>
+ <message>
+ <source>File already exists. Do you want to overwrite this file?</source>
+ <translation>Filen finns redan. Vill du skriva över denna fil?</translation>
+ </message>
+ <message>
+ <source>Failed to save attachment.</source>
+ <translation>Misslyckades med att spara bilaga.</translation>
+ </message>
+ <message>
+ <source>%1 is typing a message.</source>
+ <translation>%1 skriver ett meddelande.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished">F10</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MessageFormView</name>
+ <message>
+ <source>sending message</source>
+ <translation>skickar meddelande</translation>
+ </message>
+</context>
+<context>
+ <name>MphoneForm</name>
+ <message>
+ <source>Twinkle</source>
+ <translation>Twinkle</translation>
+ </message>
+ <message>
+ <source>&amp;Call:</source>
+ <comment>Label in front of combobox to enter address</comment>
+ <translation>&amp;Ring:</translation>
+ </message>
+ <message>
+ <source>The address that you want to call. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Adressen som du vill ringa. Detta kan vara en komplett SIP-adress som &lt;b&gt;sip:exempel@exempel.com&lt;/b&gt; eller bara användarnamnet eller telefonnumret i adressen. När du inte anger en komplett adress kommer Twinkle fylla ut adressen med domännamnet från din användarprofil.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adressbok</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Välj en adress från adressboken.</translation>
+ </message>
+ <message>
+ <source>Dial</source>
+ <translation>Ring</translation>
+ </message>
+ <message>
+ <source>Dial the address.</source>
+ <translation>Ring till adressen.</translation>
+ </message>
+ <message>
+ <source>&amp;User:</source>
+ <translation>&amp;Användare:</translation>
+ </message>
+ <message>
+ <source>The user that will make the call.</source>
+ <translation>Användaren som ska ringa samtalet.</translation>
+ </message>
+ <message>
+ <source>Auto answer indication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call redirect indication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Do not disturb indication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Missed call indication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Registration status.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line status</source>
+ <translation>Linjestatus</translation>
+ </message>
+ <message>
+ <source>Line &amp;1:</source>
+ <translation>Linje &amp;1:</translation>
+ </message>
+ <message>
+ <source>Alt+1</source>
+ <translation>Alt+1</translation>
+ </message>
+ <message>
+ <source>Click to switch to line 1.</source>
+ <translation>Klicka för att växla till linje 1.</translation>
+ </message>
+ <message>
+ <source>From:</source>
+ <translation>Från:</translation>
+ </message>
+ <message>
+ <source>To:</source>
+ <translation>Till:</translation>
+ </message>
+ <message>
+ <source>Subject:</source>
+ <translation>Ämne:</translation>
+ </message>
+ <message>
+ <source>Visual indication of line state.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>idle</source>
+ <comment>No need to translate</comment>
+ <translation>Overksam</translation>
+ </message>
+ <message>
+ <source>Call is on hold</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Voice is muted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Conference call</source>
+ <translation>Konferenssamtal</translation>
+ </message>
+ <message>
+ <source>Transferring call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+The padlock indicates that your voice is encrypted during transport over the network.
+&lt;/p&gt;
+&lt;h3&gt;SAS - Short Authentication String&lt;/h3&gt;
+&lt;p&gt;
+Both ends of an encrypted voice channel receive the same SAS on the first call. If the SAS is different at each end, your voice channel may be compromised by a man-in-the-middle attack (MitM).
+&lt;/p&gt;
+&lt;p&gt;
+If the SAS is equal at both ends, then you should confirm it by clicking this padlock for stronger security of future calls to the same destination. For subsequent calls to the same destination, you don&apos;t have to confirm the SAS again. The padlock will show a check symbol when the SAS has been confirmed.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>sas</source>
+ <comment>No need to translate</comment>
+ <translation>sas</translation>
+ </message>
+ <message>
+ <source>Short authentication string</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>g711a/g711a</source>
+ <comment>No need to translate</comment>
+ <translation>g711a/g711a</translation>
+ </message>
+ <message>
+ <source>Audio codec</source>
+ <translation>Ljudkodek</translation>
+ </message>
+ <message>
+ <source>0:00:00</source>
+ <translation>0:00:00</translation>
+ </message>
+ <message>
+ <source>Call duration</source>
+ <translation>Samtalslängd</translation>
+ </message>
+ <message>
+ <source>sip:from</source>
+ <comment>No need to translate</comment>
+ <translation>sip:från</translation>
+ </message>
+ <message>
+ <source>sip:to</source>
+ <comment>No need to translate</comment>
+ <translation>sip:till</translation>
+ </message>
+ <message>
+ <source>subject</source>
+ <comment>No need to translate</comment>
+ <translation>ämne</translation>
+ </message>
+ <message>
+ <source>photo</source>
+ <comment>No need to translate</comment>
+ <translation>foto</translation>
+ </message>
+ <message>
+ <source>Line &amp;2:</source>
+ <translation>Linje &amp;2:</translation>
+ </message>
+ <message>
+ <source>Alt+2</source>
+ <translation>Alt+2</translation>
+ </message>
+ <message>
+ <source>Click to switch to line 2.</source>
+ <translation>Klicka för att växla till linje 2.</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;Arkiv</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Redigera</translation>
+ </message>
+ <message>
+ <source>C&amp;all</source>
+ <translation>&amp;Ring</translation>
+ </message>
+ <message>
+ <source>Activate line</source>
+ <translation>Aktivera linje</translation>
+ </message>
+ <message>
+ <source>&amp;Registration</source>
+ <translation>&amp;Registrering</translation>
+ </message>
+ <message>
+ <source>&amp;Services</source>
+ <translation>&amp;Tjänster</translation>
+ </message>
+ <message>
+ <source>&amp;View</source>
+ <translation>&amp;Visa</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>&amp;Hjälp</translation>
+ </message>
+ <message>
+ <source>Call Toolbar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation>Avsluta</translation>
+ </message>
+ <message>
+ <source>&amp;Quit</source>
+ <translation>&amp;Avsluta</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation>Ctrl+A</translation>
+ </message>
+ <message>
+ <source>About Twinkle</source>
+ <translation>Om Twinkle</translation>
+ </message>
+ <message>
+ <source>&amp;About Twinkle</source>
+ <translation>&amp;Om Twinkle</translation>
+ </message>
+ <message>
+ <source>Call</source>
+ <comment>toolbar text</comment>
+ <translation>Ring</translation>
+ </message>
+ <message>
+ <source>&amp;Call...</source>
+ <comment>call menu text</comment>
+ <translation>&amp;Ring...</translation>
+ </message>
+ <message>
+ <source>Call someone</source>
+ <translation>Ring någon</translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation>F5</translation>
+ </message>
+ <message>
+ <source>Answer</source>
+ <comment>toolbar text</comment>
+ <translation>Svara</translation>
+ </message>
+ <message>
+ <source>&amp;Answer</source>
+ <comment>menu text</comment>
+ <translation>&amp;Svara</translation>
+ </message>
+ <message>
+ <source>Answer incoming call</source>
+ <translation>Svara inkommande samtal</translation>
+ </message>
+ <message>
+ <source>F6</source>
+ <translation>F6</translation>
+ </message>
+ <message>
+ <source>Bye</source>
+ <comment>toolbar text</comment>
+ <translation>Adjö</translation>
+ </message>
+ <message>
+ <source>&amp;Bye</source>
+ <comment>menu text</comment>
+ <translation>&amp;Lägg på</translation>
+ </message>
+ <message>
+ <source>Release call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Esc</source>
+ <translation>Esc</translation>
+ </message>
+ <message>
+ <source>Reject</source>
+ <comment>toolbar text</comment>
+ <translation>Avvisa</translation>
+ </message>
+ <message>
+ <source>&amp;Reject</source>
+ <comment>menu text</comment>
+ <translation>&amp;Avvisa</translation>
+ </message>
+ <message>
+ <source>Reject incoming call</source>
+ <translation>Avvisa inkommande samtal</translation>
+ </message>
+ <message>
+ <source>F8</source>
+ <translation>F8</translation>
+ </message>
+ <message>
+ <source>Hold</source>
+ <comment>toolbar text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Hold</source>
+ <comment>menu text</comment>
+ <translation>&amp;Parkera</translation>
+ </message>
+ <message>
+ <source>Put a call on hold, or retrieve a held call</source>
+ <translation>Pakera ett samtal eller återuppta ett parkerat samtal</translation>
+ </message>
+ <message>
+ <source>Redirect</source>
+ <comment>toolbar text</comment>
+ <translation>Koppla vidare</translation>
+ </message>
+ <message>
+ <source>R&amp;edirect...</source>
+ <comment>menu text</comment>
+ <translation>Koppla vidar&amp;e...</translation>
+ </message>
+ <message>
+ <source>Redirect incoming call without answering</source>
+ <translation>Koppla vidare inkommande samtal utan att svara</translation>
+ </message>
+ <message>
+ <source>Dtmf</source>
+ <comment>toolbar text</comment>
+ <translation>Dtmf</translation>
+ </message>
+ <message>
+ <source>&amp;Dtmf...</source>
+ <comment>menu text</comment>
+ <translation>&amp;Dtmf...</translation>
+ </message>
+ <message>
+ <source>Open keypad to enter digits for voice menu&apos;s</source>
+ <translation>Öppna knappsats för att mata in siffror för röstmenyer</translation>
+ </message>
+ <message>
+ <source>Register</source>
+ <translation>Registrera</translation>
+ </message>
+ <message>
+ <source>&amp;Register</source>
+ <translation>&amp;Registrera</translation>
+ </message>
+ <message>
+ <source>Deregister</source>
+ <translation>Avregistrera</translation>
+ </message>
+ <message>
+ <source>&amp;Deregister</source>
+ <translation>Avre&amp;gistrera</translation>
+ </message>
+ <message>
+ <source>Deregister this device</source>
+ <translation>Avregistrera denna enhet</translation>
+ </message>
+ <message>
+ <source>Show registrations</source>
+ <translation>Visa registreringar</translation>
+ </message>
+ <message>
+ <source>&amp;Show registrations</source>
+ <translation>&amp;Visa registreringar</translation>
+ </message>
+ <message>
+ <source>Terminal capabilities</source>
+ <translation>Terminalförmågor</translation>
+ </message>
+ <message>
+ <source>&amp;Terminal capabilities...</source>
+ <comment>menu text</comment>
+ <translation>&amp;Terminalförmågor...</translation>
+ </message>
+ <message>
+ <source>Request terminal capabilities from someone</source>
+ <translation>Begär terminalförmågor från någon</translation>
+ </message>
+ <message>
+ <source>Do not disturb</source>
+ <translation>Stör inte</translation>
+ </message>
+ <message>
+ <source>&amp;Do not disturb</source>
+ <translation>Stör &amp;inte</translation>
+ </message>
+ <message>
+ <source>Call redirection</source>
+ <translation>Vidarekoppla samtal</translation>
+ </message>
+ <message>
+ <source>Call &amp;redirection...</source>
+ <translation>Vidarekoppla sa&amp;mtal...</translation>
+ </message>
+ <message>
+ <source>Redial</source>
+ <comment>toolbar text</comment>
+ <translation>Ring igen</translation>
+ </message>
+ <message>
+ <source>&amp;Redial</source>
+ <comment>menu text</comment>
+ <translation>Ring &amp;igen</translation>
+ </message>
+ <message>
+ <source>Repeat last call</source>
+ <translation>Upprepa senaste samtalet</translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation>F12</translation>
+ </message>
+ <message>
+ <source>About Qt</source>
+ <translation>Om Qt</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation>Om &amp;Qt</translation>
+ </message>
+ <message>
+ <source>User profile</source>
+ <translation>Användarprofil</translation>
+ </message>
+ <message>
+ <source>&amp;User profile...</source>
+ <translation>&amp;Användarprofil...</translation>
+ </message>
+ <message>
+ <source>Conf</source>
+ <comment>toolbar text</comment>
+ <translation>Konf</translation>
+ </message>
+ <message>
+ <source>&amp;Conference</source>
+ <comment>menu text</comment>
+ <translation>&amp;Konferens</translation>
+ </message>
+ <message>
+ <source>Join two calls in a 3-way conference</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mute</source>
+ <comment>toolbar text</comment>
+ <translation>Tyst</translation>
+ </message>
+ <message>
+ <source>&amp;Mute</source>
+ <comment>menu text</comment>
+ <translation>&amp;Tyst</translation>
+ </message>
+ <message>
+ <source>Mute a call</source>
+ <translation>Stäng av mikrofonen</translation>
+ </message>
+ <message>
+ <source>Xfer</source>
+ <comment>toolbar text</comment>
+ <translation>Koppla</translation>
+ </message>
+ <message>
+ <source>Trans&amp;fer...</source>
+ <comment>menu text</comment>
+ <translation>Kopp&amp;la...</translation>
+ </message>
+ <message>
+ <source>Transfer call</source>
+ <translation>Koppla samtal</translation>
+ </message>
+ <message>
+ <source>System settings</source>
+ <translation>Systeminställningar</translation>
+ </message>
+ <message>
+ <source>&amp;System settings...</source>
+ <translation>&amp;Systeminställningar...</translation>
+ </message>
+ <message>
+ <source>Deregister all</source>
+ <translation>Avregistrera alla</translation>
+ </message>
+ <message>
+ <source>Deregister &amp;all</source>
+ <translation>Avregistrera &amp;alla</translation>
+ </message>
+ <message>
+ <source>Deregister all your registered devices</source>
+ <translation>Avregistera alla dina registrerade enheter</translation>
+ </message>
+ <message>
+ <source>Auto answer</source>
+ <translation>Svara automatiskt</translation>
+ </message>
+ <message>
+ <source>&amp;Auto answer</source>
+ <translation>S&amp;vara automatiskt</translation>
+ </message>
+ <message>
+ <source>Log</source>
+ <translation>Logg</translation>
+ </message>
+ <message>
+ <source>&amp;Log...</source>
+ <translation>&amp;Logg...</translation>
+ </message>
+ <message>
+ <source>Call history</source>
+ <translation>Samtalshistorik</translation>
+ </message>
+ <message>
+ <source>Call &amp;history...</source>
+ <translation>Samtals&amp;historik...</translation>
+ </message>
+ <message>
+ <source>F9</source>
+ <translation>F9</translation>
+ </message>
+ <message>
+ <source>Change user ...</source>
+ <translation>Byt användare...</translation>
+ </message>
+ <message>
+ <source>&amp;Change user ...</source>
+ <translation>&amp;Byt användare...</translation>
+ </message>
+ <message>
+ <source>Activate or de-activate users</source>
+ <translation>Aktivera eller inaktivera användare</translation>
+ </message>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation>Vad är detta?</translation>
+ </message>
+ <message>
+ <source>What&apos;s &amp;This?</source>
+ <translation>Vad är &amp;detta?</translation>
+ </message>
+ <message>
+ <source>Shift+F1</source>
+ <translation>Shift+F1</translation>
+ </message>
+ <message>
+ <source>Line 1</source>
+ <translation>Linje 1</translation>
+ </message>
+ <message>
+ <source>Line 2</source>
+ <translation>Linje 2</translation>
+ </message>
+ <message>
+ <source>idle</source>
+ <translation>overksam</translation>
+ </message>
+ <message>
+ <source>dialing</source>
+ <translation>ringer</translation>
+ </message>
+ <message>
+ <source>attempting call, please wait</source>
+ <translation>försöker ringa samtal, vänta</translation>
+ </message>
+ <message>
+ <source>incoming call</source>
+ <translation>inkommande samtal</translation>
+ </message>
+ <message>
+ <source>establishing call, please wait</source>
+ <translation>etablerar samtal, vänta</translation>
+ </message>
+ <message>
+ <source>established</source>
+ <translation>etablerat</translation>
+ </message>
+ <message>
+ <source>established (waiting for media)</source>
+ <translation>etablerat (väntar på media)</translation>
+ </message>
+ <message>
+ <source>releasing call, please wait</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unknown state</source>
+ <translation>okänt tillstånd</translation>
+ </message>
+ <message>
+ <source>Voice is encrypted</source>
+ <translation>Röstkanal är krypterad</translation>
+ </message>
+ <message>
+ <source>Click to confirm SAS.</source>
+ <translation>Klicka för att bekräfta SAS.</translation>
+ </message>
+ <message>
+ <source>Click to clear SAS verification.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transfer consultation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Användare:</translation>
+ </message>
+ <message>
+ <source>Call:</source>
+ <translation>Ring:</translation>
+ </message>
+ <message>
+ <source>Hide identity</source>
+ <translation>Dölj identitet</translation>
+ </message>
+ <message>
+ <source>Registration status:</source>
+ <translation>Registreringsstatus:</translation>
+ </message>
+ <message>
+ <source>Registered</source>
+ <translation>Registrerad</translation>
+ </message>
+ <message>
+ <source>Failed</source>
+ <translation>Misslyckades</translation>
+ </message>
+ <message>
+ <source>Not registered</source>
+ <translation>Inte registrerad</translation>
+ </message>
+ <message>
+ <source>Click to show registrations.</source>
+ <translation>Klicka för att visa registreringar.</translation>
+ </message>
+ <message>
+ <source>No users are registered.</source>
+ <translation>Inga användare är registrerade.</translation>
+ </message>
+ <message>
+ <source>%1 new, 1 old message</source>
+ <translation>%1 nytt, ett gammalt meddelande</translation>
+ </message>
+ <message>
+ <source>%1 new, %2 old messages</source>
+ <translation>%1 nya, %2 gamla meddelanden</translation>
+ </message>
+ <message>
+ <source>1 new message</source>
+ <translation>Ett nytt meddelande</translation>
+ </message>
+ <message>
+ <source>%1 new messages</source>
+ <translation>%1 nya meddelanden</translation>
+ </message>
+ <message>
+ <source>1 old message</source>
+ <translation>Ett gammalt meddelande</translation>
+ </message>
+ <message>
+ <source>%1 old messages</source>
+ <translation>%1 gamla meddelanden</translation>
+ </message>
+ <message>
+ <source>Messages waiting</source>
+ <translation>Meddelanden väntar</translation>
+ </message>
+ <message>
+ <source>No messages</source>
+ <translation>Inga meddelanden</translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Voice mail status:&lt;/b&gt;</source>
+ <translation>&lt;b&gt;Status för röstbrevlåda:&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Failure</source>
+ <translation>Misslyckades</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>Okänt</translation>
+ </message>
+ <message>
+ <source>Click to access voice mail.</source>
+ <translation>Klicka för att komma åt röstmeddelanden.</translation>
+ </message>
+ <message>
+ <source>Do not disturb active for:</source>
+ <translation>Stör inte är aktivt för:</translation>
+ </message>
+ <message>
+ <source>Redirection active for:</source>
+ <translation>Vidarekoppling är aktivt för:</translation>
+ </message>
+ <message>
+ <source>Auto answer active for:</source>
+ <translation>Svara automatiskt är aktivt för:</translation>
+ </message>
+ <message>
+ <source>Click to activate/deactivate</source>
+ <translation>Klicka för att aktivera/inaktivera</translation>
+ </message>
+ <message>
+ <source>Click to activate</source>
+ <translation>Klicka för att aktivera</translation>
+ </message>
+ <message>
+ <source>Do not disturb is not active.</source>
+ <translation>Stör inte är inte aktiverat.</translation>
+ </message>
+ <message>
+ <source>Redirection is not active.</source>
+ <translation>Vidarekoppling är inte aktiverat.</translation>
+ </message>
+ <message>
+ <source>Auto answer is not active.</source>
+ <translation>Svara automatiskt är inte aktiverat.</translation>
+ </message>
+ <message>
+ <source>Click to see call history for details.</source>
+ <translation>Klicka för att se samtalshistorik för detaljer.</translation>
+ </message>
+ <message>
+ <source>You have no missed calls.</source>
+ <translation>Du har inga missade samtal.</translation>
+ </message>
+ <message>
+ <source>You missed 1 call.</source>
+ <translation>Du missade ett samtal.</translation>
+ </message>
+ <message>
+ <source>You missed %1 calls.</source>
+ <translation>Du missade %1 samtal.</translation>
+ </message>
+ <message>
+ <source>Starting user profiles...</source>
+ <translation>Startar användarprofiler...</translation>
+ </message>
+ <message>
+ <source>The following profiles are both for user %1</source>
+ <translation>Följande profiler är båda för användaren %1</translation>
+ </message>
+ <message>
+ <source>You can only run multiple profiles for different users.</source>
+ <translation>Du kan endast köra flera profiler för olika användare.</translation>
+ </message>
+ <message>
+ <source>You have changed the SIP UDP port. This setting will only become active when you restart Twinkle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>not provisioned</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You must provision your voice mail address in your user profile, before you can access it.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The line is busy. Cannot access voice mail.</source>
+ <translation>Linjen är upptagen. Kan inte komma åt röstmeddelanden.</translation>
+ </message>
+ <message>
+ <source>The voice mail address %1 is an invalid address. Please provision a valid address in your user profile.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Buddy list</source>
+ <translation>Kompislista</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Message waiting indication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Message</source>
+ <translation>&amp;Meddelande</translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Voice mail</source>
+ <translation>Röstbrevlåda</translation>
+ </message>
+ <message>
+ <source>&amp;Voice mail</source>
+ <translation>&amp;Röstbrevlåda</translation>
+ </message>
+ <message>
+ <source>Access voice mail</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation>F11</translation>
+ </message>
+ <message>
+ <source>Msg</source>
+ <translation>Chatt</translation>
+ </message>
+ <message>
+ <source>Instant &amp;message...</source>
+ <translation>Snabb&amp;meddelande...</translation>
+ </message>
+ <message>
+ <source>Instant message</source>
+ <translation>Snabbmeddelande</translation>
+ </message>
+ <message>
+ <source>&amp;Buddy list</source>
+ <translation>&amp;Kompislista</translation>
+ </message>
+ <message>
+ <source>&amp;Call...</source>
+ <translation>&amp;Ring...</translation>
+ </message>
+ <message>
+ <source>&amp;Edit...</source>
+ <translation>&amp;Redigera...</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Ta bort</translation>
+ </message>
+ <message>
+ <source>O&amp;ffline</source>
+ <translation>Fr&amp;ånkopplad</translation>
+ </message>
+ <message>
+ <source>&amp;Online</source>
+ <translation>A&amp;nsluten</translation>
+ </message>
+ <message>
+ <source>&amp;Change availability</source>
+ <translation>&amp;Ändra tillgänglighet</translation>
+ </message>
+ <message>
+ <source>&amp;Add buddy...</source>
+ <translation>&amp;Lägg till kompis...</translation>
+ </message>
+ <message>
+ <source>Failed to save buddy list: %1</source>
+ <translation>Misslyckades med att spara kompislista. %1</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished">F10</translation>
+ </message>
+ <message>
+ <source>Diamondcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sign up</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Sign up...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recharge...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Balance history...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call history...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Admin center...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recharge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Balance history</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Admin center</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>NumberConversionForm</name>
+ <message>
+ <source>Twinkle - Number conversion</source>
+ <translation>Twinkle - Nummerkonvertering</translation>
+ </message>
+ <message>
+ <source>&amp;Match expression:</source>
+ <translation>&amp;Matcha uttryck:</translation>
+ </message>
+ <message>
+ <source>&amp;Replace:</source>
+ <translation>&amp;Ersätt:</translation>
+ </message>
+ <message>
+ <source>Perl style format string for the replacement number.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Perl style regular expression matching the number format you want to modify.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Match expression may not be empty.</source>
+ <translation>Uttryck att matcha mot kan inte vara tomt.</translation>
+ </message>
+ <message>
+ <source>Replace value may not be empty.</source>
+ <translation>Ersättningsvärde kan inte vara tomt.</translation>
+ </message>
+ <message>
+ <source>Invalid regular expression.</source>
+ <translation>Ogiltigt reguljärt uttryck.</translation>
+ </message>
+</context>
+<context>
+ <name>RedirectForm</name>
+ <message>
+ <source>Twinkle - Redirect</source>
+ <translation>Twinkle - Koppla vidare</translation>
+ </message>
+ <message>
+ <source>Redirect incoming call to</source>
+ <translation>Koppla vidare inkommande samtal till</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Du kan ange upp till 3 destinationer att koppla vidare samtalet till. Om första destinationen inte svarar går man vidare till andra destinationen och så vidare.</translation>
+ </message>
+ <message>
+ <source>&amp;3rd choice destination:</source>
+ <translation>Destination i &amp;tredje hand:</translation>
+ </message>
+ <message>
+ <source>&amp;2nd choice destination:</source>
+ <translation>Destination i &amp;andra hand:</translation>
+ </message>
+ <message>
+ <source>&amp;1st choice destination:</source>
+ <translation>Destination i &amp;första hand:</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adressbok</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Välj en adress från adressboken.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished">F10</translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation type="unfinished">F12</translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation type="unfinished">F11</translation>
+ </message>
+</context>
+<context>
+ <name>SelectNicForm</name>
+ <message>
+ <source>Twinkle - Select NIC</source>
+ <translation>Twinkle - Välj nätverkskort</translation>
+ </message>
+ <message>
+ <source>Select the network interface/IP address that you want to use:</source>
+ <translation>Välj nätverkskort/IP-adress som du vill använda:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Du har flera IP-adresser. Här måste du välja vilken IP-adress som ska användas. Denna IP-adress kommer användas i alla SIP-meddelanden.</translation>
+ </message>
+ <message>
+ <source>Set as default &amp;IP</source>
+ <translation>Ange som standard-&amp;IP</translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation>Alt+I</translation>
+ </message>
+ <message>
+ <source>Make the selected IP address the default IP address. The next time you start Twinkle, this IP address will be automatically selected.</source>
+ <translation>Gör den valda IP-adressen till standard-IP-adress. Nästa gång som du startar Twinkle kommer denna IP-adress att väljas automatiskt.</translation>
+ </message>
+ <message>
+ <source>Set as default &amp;NIC</source>
+ <translation>Ange som standard&amp;nätverkskort</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation>Alt+N</translation>
+ </message>
+ <message>
+ <source>Make the selected network interface the default interface. The next time you start Twinkle, this interface will be automatically selected.</source>
+ <translation>Gör det valda nätverkskortet till standardgränssnitt. Nästa gång som du startar Twinkle kommer detta nätverkskort att väljas automatiskt.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>If you want to remove or change the default at a later time, you can do that via the system settings.</source>
+ <translation>Om du vill ta bort eller ändra standardvärdet vid ett senare tillfälle så kan du göra det via systeminställningarna.</translation>
+ </message>
+</context>
+<context>
+ <name>SelectProfileForm</name>
+ <message>
+ <source>Twinkle - Select user profile</source>
+ <translation>Twinkle - Välj användarprofil</translation>
+ </message>
+ <message>
+ <source>Select user profile(s) to run:</source>
+ <translation>Välj användarprofil(er) att köra:</translation>
+ </message>
+ <message>
+ <source>User profile</source>
+ <translation>Användarprofil</translation>
+ </message>
+ <message>
+ <source>Tick the check boxes of the user profiles that you want to run and press run.</source>
+ <translation>Kryssa för de användarprofiler som du vill köra och tryck på Kör.</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="obsolete">&amp;Ny</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation type="obsolete">Alt+N</translation>
+ </message>
+ <message>
+ <source>Create a new profile with the profile editor.</source>
+ <translation>Skapa en ny profil med profilredigeraren.</translation>
+ </message>
+ <message>
+ <source>&amp;Wizard</source>
+ <translation>&amp;Guide</translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation>Alt+G</translation>
+ </message>
+ <message>
+ <source>Create a new profile with the wizard.</source>
+ <translation>Skapa en ny profil med guiden.</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Redigera</translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation>Alt+R</translation>
+ </message>
+ <message>
+ <source>Edit the highlighted profile.</source>
+ <translation>Redigera markerad profil.</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Ta bort</translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation>Alt+T</translation>
+ </message>
+ <message>
+ <source>Delete the highlighted profile.</source>
+ <translation>Ta bort markerad profil.</translation>
+ </message>
+ <message>
+ <source>Ren&amp;ame</source>
+ <translation>Byt &amp;namn</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation>Alt+N</translation>
+ </message>
+ <message>
+ <source>Rename the highlighted profile.</source>
+ <translation>Byt namn på markerad profil.</translation>
+ </message>
+ <message>
+ <source>&amp;Set as default</source>
+ <translation>&amp;Ange som standard</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Make the selected profiles the default profiles. The next time you start Twinkle, these profiles will be automatically run.</source>
+ <translation>Gör de markerade profilerna till standardprofiler. Nästa gång som du startar Twinkle så kommer dessa profiler att köras automatiskt.</translation>
+ </message>
+ <message>
+ <source>&amp;Run</source>
+ <translation>&amp;Kör</translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation>Alt+K</translation>
+ </message>
+ <message>
+ <source>Run Twinkle with the selected profiles.</source>
+ <translation>Kör Twinkle med markerade profiler.</translation>
+ </message>
+ <message>
+ <source>S&amp;ystem settings</source>
+ <translation>S&amp;ysteminställningar</translation>
+ </message>
+ <message>
+ <source>Alt+Y</source>
+ <translation>Alt+Y</translation>
+ </message>
+ <message>
+ <source>Edit the system settings.</source>
+ <translation>Redigera systeminställningarna.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;Before you can use Twinkle, you must create a user profile.&lt;br&gt;Click OK to create a profile.&lt;/html&gt;</source>
+ <translation>&lt;html&gt;Innan du kan använda Twinkle måste du skapa en användarprofil.&lt;br&gt;Klicka OK för att skapa en profil.&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <source>&amp;Profile editor</source>
+ <translation>&amp;Profilredigerare</translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;Next you may adjust the system settings. You can change these settings always at a later time.&lt;br&gt;&lt;br&gt;Click OK to view and adjust the system settings.&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You did not select any user profile to run.
+Please select a profile.</source>
+ <translation>Du valde inte någon användarprofil att köra.
+Välj en profil.</translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete profile &apos;%1&apos;?</source>
+ <translation>Är du säker på att du vill ta bort profilen &quot;%1&quot;?</translation>
+ </message>
+ <message>
+ <source>Delete profile</source>
+ <translation>Ta bort profil</translation>
+ </message>
+ <message>
+ <source>Failed to delete profile.</source>
+ <translation>Misslyckades med att ta bort profil.</translation>
+ </message>
+ <message>
+ <source>Failed to rename profile.</source>
+ <translation>Misslyckades med att byta namn på profil.</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;If you want to remove or change the default at a later time, you can do that via the system settings.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot find .twinkle directory in your home directory.</source>
+ <translation>Kan inte hitta katalogen .twinkle i din hemkatalog.</translation>
+ </message>
+ <message>
+ <source>Create profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ed&amp;itor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation type="unfinished">Alt+I</translation>
+ </message>
+ <message>
+ <source>Dia&amp;mondcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation type="unfinished">Alt+M</translation>
+ </message>
+ <message>
+ <source>Modify profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Startup profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Diamondcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;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.&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;You can create a Diamondcard account to make worldwide calls to regular and cell phones and send SMS messages.&lt;br&gt;&lt;br&gt;Choose what method you wish to use.&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SelectUserForm</name>
+ <message>
+ <source>Twinkle - Select user</source>
+ <translation>Twinkle - Välj användare</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>&amp;Select all</source>
+ <translation>&amp;Välj alla</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>C&amp;lear all</source>
+ <translation>&amp;Töm alla</translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation>Alt+T</translation>
+ </message>
+ <message>
+ <source>purpose</source>
+ <comment>No need to translate</comment>
+ <translation>syfte</translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation>Användare</translation>
+ </message>
+ <message>
+ <source>Register</source>
+ <translation>Registrera</translation>
+ </message>
+ <message>
+ <source>Select users that you want to register.</source>
+ <translation>Välj användare som du vill registrera.</translation>
+ </message>
+ <message>
+ <source>Deregister</source>
+ <translation>Avregistrera</translation>
+ </message>
+ <message>
+ <source>Select users that you want to deregister.</source>
+ <translation>Välj användare som du vill avregistrera.</translation>
+ </message>
+ <message>
+ <source>Deregister all devices</source>
+ <translation>Avregistrera alla enheter</translation>
+ </message>
+ <message>
+ <source>Select users for which you want to deregister all devices.</source>
+ <translation>Välj användare för vilka du vill avregistrera alla enheter.</translation>
+ </message>
+ <message>
+ <source>Do not disturb</source>
+ <translation>Stör inte</translation>
+ </message>
+ <message>
+ <source>Select users for which you want to enable &apos;do not disturb&apos;.</source>
+ <translation>Välj användare för vilka du vill aktivera &apos;stör ej&apos;.</translation>
+ </message>
+ <message>
+ <source>Auto answer</source>
+ <translation>Svara automatiskt</translation>
+ </message>
+ <message>
+ <source>Select users for which you want to enable &apos;auto answer&apos;.</source>
+ <translation>Välj användare för vilka du vill aktivera &quot;svara automatiskt&quot;.</translation>
+ </message>
+</context>
+<context>
+ <name>SendFileForm</name>
+ <message>
+ <source>Twinkle - Send File</source>
+ <translation>Twinkle - Skicka fil</translation>
+ </message>
+ <message>
+ <source>Select file to send.</source>
+ <translation>Välj fil att skicka.</translation>
+ </message>
+ <message>
+ <source>&amp;File:</source>
+ <translation>&amp;Fil:</translation>
+ </message>
+ <message>
+ <source>&amp;Subject:</source>
+ <translation>&amp;Ämne:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>File does not exist.</source>
+ <translation>Filen finns inte.</translation>
+ </message>
+ <message>
+ <source>Send file...</source>
+ <translation>Skicka fil...</translation>
+ </message>
+</context>
+<context>
+ <name>SrvRedirectForm</name>
+ <message>
+ <source>Twinkle - Call Redirection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation>Användare:</translation>
+ </message>
+ <message>
+ <source>There are 3 redirect services:&lt;p&gt;
+&lt;b&gt;Unconditional:&lt;/b&gt; redirect all calls
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Busy:&lt;/b&gt; redirect a call if both lines are busy
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;No answer:&lt;/b&gt; redirect a call when the no-answer timer expires
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Unconditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Redirect all calls</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Activate the unconditional redirection service.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redirect to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished">Du kan ange upp till 3 destinationer att koppla vidare samtalet till. Om första destinationen inte svarar går man vidare till andra destinationen och så vidare.</translation>
+ </message>
+ <message>
+ <source>&amp;3rd choice destination:</source>
+ <translation>Destination i &amp;3:e hand:</translation>
+ </message>
+ <message>
+ <source>&amp;2nd choice destination:</source>
+ <translation>Destination i &amp;2:a hand:</translation>
+ </message>
+ <message>
+ <source>&amp;1st choice destination:</source>
+ <translation>Destination i &amp;1:a hand:</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adressbok</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Välj en adress från adressboken.</translation>
+ </message>
+ <message>
+ <source>&amp;Busy</source>
+ <translation>&amp;Upptagen</translation>
+ </message>
+ <message>
+ <source>&amp;Redirect calls when I am busy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Activate the redirection when busy service.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;No answer</source>
+ <translation>&amp;Inget svar</translation>
+ </message>
+ <message>
+ <source>&amp;Redirect calls when I do not answer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Activate the redirection on no answer service.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>Accept and save all changes.</source>
+ <translation>Acceptera och spara alla ändringar.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Undo your changes and close the window.</source>
+ <translation>Ångra dina ändringar och stäng fönstret.</translation>
+ </message>
+ <message>
+ <source>You have entered an invalid destination.</source>
+ <translation>Du har angivit en ogiltig destination.</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished">F10</translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation type="unfinished">F11</translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation type="unfinished">F12</translation>
+ </message>
+</context>
+<context>
+ <name>SysSettingsForm</name>
+ <message>
+ <source>Twinkle - System Settings</source>
+ <translation>Twinkle - Systeminställningar</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Generellt</translation>
+ </message>
+ <message>
+ <source>Audio</source>
+ <translation>Ljud</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <translation>Ringsignaler</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adressbok</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation>Nätverk</translation>
+ </message>
+ <message>
+ <source>Log</source>
+ <translation>Logg</translation>
+ </message>
+ <message>
+ <source>Select a category for which you want to see or modify the settings.</source>
+ <translation>Välj den kategori som du vill titta eller ändra inställningar för.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>Accept and save your changes.</source>
+ <translation>Acceptera och spara dina ändringar.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Undo all your changes and close the window.</source>
+ <translation>Ångra alla ändringar och stäng fönstret.</translation>
+ </message>
+ <message>
+ <source>Sound Card</source>
+ <translation>Ljudkort</translation>
+ </message>
+ <message>
+ <source>Select the sound card for playing the ring tone for incoming calls.</source>
+ <translation>Välj det ljudkort som ska användas för att spela upp ringsignalen när någon ringer.</translation>
+ </message>
+ <message>
+ <source>Select the sound card to which your microphone is connected.</source>
+ <translation>Välj det ljudkort som din mikrofon är inkopplad till.</translation>
+ </message>
+ <message>
+ <source>Select the sound card for the speaker function during a call.</source>
+ <translation>Välj det ljudkort som högtalaren är inkopplad till under samtal.</translation>
+ </message>
+ <message>
+ <source>&amp;Speaker:</source>
+ <translation>&amp;Högtalare:</translation>
+ </message>
+ <message>
+ <source>&amp;Ring tone:</source>
+ <translation>&amp;Ringsignal:</translation>
+ </message>
+ <message>
+ <source>Other device:</source>
+ <translation>Annan enhet:</translation>
+ </message>
+ <message>
+ <source>&amp;Microphone:</source>
+ <translation>&amp;Mikrofon:</translation>
+ </message>
+ <message>
+ <source>&amp;Validate devices before usage</source>
+ <translation>&amp;Validera enheterna innan användning</translation>
+ </message>
+ <message>
+ <source>Alt+V</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Twinkle validates the audio devices before usage to avoid an established call without an audio channel.
+&lt;p&gt;
+On startup of Twinkle a warning is given if an audio device is inaccessible.
+&lt;p&gt;
+If before making a call, the microphone or speaker appears to be invalid, a warning is given and no call can be made.
+&lt;p&gt;
+If before answering a call, the microphone or speaker appears to be invalid, a warning is given and the call will not be answered.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reduce &amp;noise from the microphone</source>
+ <translation type="obsolete">Reducera &amp;brus från mikrofonen</translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation type="obsolete">Alt+B</translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation>Avancerat</translation>
+ </message>
+ <message>
+ <source>OSS &amp;fragment size:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>16</source>
+ <translation>16</translation>
+ </message>
+ <message>
+ <source>32</source>
+ <translation>32</translation>
+ </message>
+ <message>
+ <source>64</source>
+ <translation>64</translation>
+ </message>
+ <message>
+ <source>128</source>
+ <translation>128</translation>
+ </message>
+ <message>
+ <source>256</source>
+ <translation>256</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ALSA &amp;play period size:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;ALSA capture period size:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Max log size:</source>
+ <translation>&amp;Maximal loggstorlek:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MB</source>
+ <translation>MB</translation>
+ </message>
+ <message>
+ <source>Log &amp;debug reports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation type="unfinished">Alt+T</translation>
+ </message>
+ <message>
+ <source>Indicates if reports marked as &quot;debug&quot; will be logged.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Log &amp;SIP reports</source>
+ <translation>Logga &amp;SIP-rapporter</translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation>Alt+S</translation>
+ </message>
+ <message>
+ <source>Indicates if SIP messages will be logged.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Log S&amp;TUN reports</source>
+ <translation>Logga S&amp;TUN-rapporter</translation>
+ </message>
+ <message>
+ <source>Alt+T</source>
+ <translation>Alt+T</translation>
+ </message>
+ <message>
+ <source>Indicates if STUN messages will be logged.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Log m&amp;emory reports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation type="unfinished">Alt+R</translation>
+ </message>
+ <message>
+ <source>Indicates if reports concerning memory management will be logged.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>System tray</source>
+ <translation>Aktivitetsfält</translation>
+ </message>
+ <message>
+ <source>Create &amp;system tray icon on startup</source>
+ <translation>Skapa ikon i a&amp;ktivitetsfält vid uppstart</translation>
+ </message>
+ <message>
+ <source>Enable this option if you want a system tray icon for Twinkle. The system tray icon is created when you start Twinkle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Hide in system tray when closing main window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+H</source>
+ <translation type="unfinished">Alt+D</translation>
+ </message>
+ <message>
+ <source>Enable this option if you want Twinkle to hide in the system tray when you close the main window.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Startup</source>
+ <translation>Uppstart</translation>
+ </message>
+ <message>
+ <source>S&amp;tartup hidden in system tray</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Next time you start Twinkle it will immediately hide in the system tray. This works best when you also select a default user profile.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Default user profiles</source>
+ <translation>Användarprofiler som standard</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation>Tjänster</translation>
+ </message>
+ <message>
+ <source>Call &amp;waiting</source>
+ <translation>Samtal &amp;väntar</translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hang up &amp;both lines when ending a 3-way conference call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation type="unfinished">Alt+B</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Maximum calls in call history:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The maximum number of calls that will be kept in the call history.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Auto show main window on incoming call after</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished">Alt+B</translation>
+ </message>
+ <message>
+ <source>When the main window is hidden, it will be automatically shown on an incoming call after the number of specified seconds.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number of seconds after which the main window should be shown.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>secs</source>
+ <translation>s</translation>
+ </message>
+ <message>
+ <source>&amp;RTP port:</source>
+ <translation>&amp;RTP-port:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ring tone</source>
+ <translation>Ringsignal</translation>
+ </message>
+ <message>
+ <source>&amp;Play ring tone on incoming call</source>
+ <translation>S&amp;pela upp ringsignal vid inkommande samtal</translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation>Alt+P</translation>
+ </message>
+ <message>
+ <source>Indicates if a ring tone should be played when a call comes in.</source>
+ <translation>Indikerar om en ringsignal ska spelas upp när ett samtal kommer in.</translation>
+ </message>
+ <message>
+ <source>&amp;Default ring tone</source>
+ <translation>Stan&amp;dardringsignal</translation>
+ </message>
+ <message>
+ <source>Play the default ring tone when a call comes in.</source>
+ <translation>Spela upp standardringsignalen när ett samtal kommer in.</translation>
+ </message>
+ <message>
+ <source>C&amp;ustom ring tone</source>
+ <translation>A&amp;npassad ringsignal</translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation>Alt+N</translation>
+ </message>
+ <message>
+ <source>Play a custom ring tone when a call comes in.</source>
+ <translation>Spela upp en anpassad ringsignal när ett samtal kommer in.</translation>
+ </message>
+ <message>
+ <source>Specify the file name of a .wav file that you want to be played as ring tone.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ring back tone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>P&amp;lay ring back tone when network does not play ring back tone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation type="unfinished">Alt+T</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Play ring back tone while you are waiting for the far-end to answer your call.
+&lt;/p&gt;
+&lt;p&gt;
+Depending on your SIP provider the network might provide ring back tone or an announcement.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D&amp;efault ring back tone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Play the default ring back tone.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cu&amp;stom ring back tone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Play a custom ring back tone.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Specify the file name of a .wav file that you want to be played as ring back tone.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Lookup name for incoming call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ove&amp;rride received display name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lookup &amp;photo for incoming call</source>
+ <translation>Slå upp &amp;foto för inkommande samtal</translation>
+ </message>
+ <message>
+ <source>Lookup the photo of a caller in your address book and display it on an incoming call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>none</source>
+ <comment>This is the &apos;none&apos; in default IP address combo</comment>
+ <translation type="obsolete">ingen</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <comment>This is the &apos;none&apos; in default network interface combo</comment>
+ <translation type="obsolete">ingen</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Ringsignaler</translation>
+ </message>
+ <message>
+ <source>Choose ring tone</source>
+ <translation>Välj ringsignal</translation>
+ </message>
+ <message>
+ <source>Ring back tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose ring back tone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Maximum allowed size (0-65535) in bytes of an incoming SIP message over UDP.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;SIP port:</source>
+ <translation>&amp;SIP-port:</translation>
+ </message>
+ <message>
+ <source>Max. SIP message size (&amp;TCP):</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The UDP/TCP port used for sending and receiving SIP messages.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max. SIP message size (&amp;UDP):</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Maximum allowed size (0-4294967295) in bytes of an incoming SIP message over TCP.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select ring tone file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select ring back tone file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>W&amp;eb browser command:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Command to start your web browser. If you leave this field empty Twinkle will try to figure out your default web browser.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SysTrayPopup</name>
+ <message>
+ <source>Answer</source>
+ <translation>Svara</translation>
+ </message>
+ <message>
+ <source>Reject</source>
+ <translation>Avvisa</translation>
+ </message>
+ <message>
+ <source>Incoming Call</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TermCapForm</name>
+ <message>
+ <source>Twinkle - Terminal Capabilities</source>
+ <translation>Twinkle - Terminalförmågor</translation>
+ </message>
+ <message>
+ <source>&amp;From:</source>
+ <translation>&amp;Från:</translation>
+ </message>
+ <message>
+ <source>Get terminal capabilities of</source>
+ <translation>Hämta terminalförmågor för</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;Till:</translation>
+ </message>
+ <message>
+ <source>The address that you want to query for capabilities (OPTION request). This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation>Adressen som du vill fråga efter förmågor (OPTION-begäran). Detta kan vara en fullständig SIP-adress som &lt;b&gt;sip:exempel@exempel.se&lt;/b&gt; eller bara användardelen eller telefonnumret av den fullständiga adressen. När du inte anger en fullständig adress så kommer Twinkle att komplettera adressen genom att använda domänvärdet för din användarprofil.</translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adressbok</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Välj en adress från adressboken.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished">F10</translation>
+ </message>
+</context>
+<context>
+ <name>TransferForm</name>
+ <message>
+ <source>Twinkle - Transfer</source>
+ <translation>Twinkle - Koppla</translation>
+ </message>
+ <message>
+ <source>Transfer call to</source>
+ <translation>Koppla samtal till</translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation>&amp;Till:</translation>
+ </message>
+ <message>
+ <source>The address of the person you want to transfer the call to. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation>Adressbok</translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation>Välj en adress från adressboken.</translation>
+ </message>
+ <message>
+ <source>Type of transfer</source>
+ <translation>Typ av koppling</translation>
+ </message>
+ <message>
+ <source>&amp;Blind transfer</source>
+ <translation>&amp;Blind koppling</translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation>Alt+B</translation>
+ </message>
+ <message>
+ <source>Transfer the call to a third party without contacting that third party yourself.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>T&amp;ransfer with consultation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Before transferring the call to a third party, first consult the party yourself.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transfer to other &amp;line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation type="unfinished">Alt+T</translation>
+ </message>
+ <message>
+ <source>Connect the remote party on the active line with the remote party on the other line.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished">F10</translation>
+ </message>
+</context>
+<context>
+ <name>TwinkleCore</name>
+ <message>
+ <source>Cannot open file for reading: %1</source>
+ <translation>Kan inte öppna fil för läsning: %1</translation>
+ </message>
+ <message>
+ <source>File system error while reading file %1 .</source>
+ <translation>Fel i filsystemet vid läsning från filen %1.</translation>
+ </message>
+ <message>
+ <source>Cannot open file for writing: %1</source>
+ <translation>Kan inte öppna fil för skrivning: %1</translation>
+ </message>
+ <message>
+ <source>File system error while writing file %1 .</source>
+ <translation>Fel i filsystemet vid skrivning till filen %1.</translation>
+ </message>
+ <message>
+ <source>Anonymous</source>
+ <translation>Anonym</translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation>Varning:</translation>
+ </message>
+ <message>
+ <source>Failed to create log file %1 .</source>
+ <translation>Kunde inte skapa loggfil %1.</translation>
+ </message>
+ <message>
+ <source>Excessive number of socket errors.</source>
+ <translation>För stort antal uttagsfel (socket).</translation>
+ </message>
+ <message>
+ <source>Built with support for:</source>
+ <translation>Byggd med stöd för:</translation>
+ </message>
+ <message>
+ <source>Contributions:</source>
+ <translation>Bidrag:</translation>
+ </message>
+ <message>
+ <source>This software contains the following software from 3rd parties:</source>
+ <translation>Den här programmet innehåller följande tredjepartsprogramvara:</translation>
+ </message>
+ <message>
+ <source>* GSM codec from Jutta Degener and Carsten Bormann, University of Berlin</source>
+ <translation>* GSM codec från Jutta Degener och Carsten Bormann vid Berlins universitet</translation>
+ </message>
+ <message>
+ <source>* G.711/G.726 codecs from Sun Microsystems (public domain)</source>
+ <translation>* G.711/G.726 kodekar från Sun Microsystems (public domain)</translation>
+ </message>
+ <message>
+ <source>* iLBC implementation from RFC 3951 (www.ilbcfreeware.org)</source>
+ <translation>* iLBC implementation från RFC 3951 (www.ilbcfreeware.org)</translation>
+ </message>
+ <message>
+ <source>* Parts of the STUN project at http://sourceforge.net/projects/stun</source>
+ <translation>* Delar av STUN-projektet från http://sourceforge.net/projects/stun</translation>
+ </message>
+ <message>
+ <source>* Parts of libsrv at http://libsrv.sourceforge.net/</source>
+ <translation>* Delar av libsrv från http://libsrv.sourceforge.net</translation>
+ </message>
+ <message>
+ <source>For RTP the following dynamic libraries are linked:</source>
+ <translation>För RTP länkas följande dynamiska bibliotek in:</translation>
+ </message>
+ <message>
+ <source>Translated to english by &lt;your name&gt;</source>
+ <translation>Översatt till svenska av Daniel Nylander</translation>
+ </message>
+ <message>
+ <source>Directory %1 does not exist.</source>
+ <translation>Katalogen %1 finns inte.</translation>
+ </message>
+ <message>
+ <source>Cannot open file %1 .</source>
+ <translation>Kan inte öppna filen %1.</translation>
+ </message>
+ <message>
+ <source>%1 is not set to your home directory.</source>
+ <translation>%1 är inte satt till din hemkatalog.</translation>
+ </message>
+ <message>
+ <source>Directory %1 (%2) does not exist.</source>
+ <translation>Katalogen %1 (%2) finns inte.</translation>
+ </message>
+ <message>
+ <source>Cannot create directory %1 .</source>
+ <translation>Kan inte skapa katalogen %1.</translation>
+ </message>
+ <message>
+ <source>Lock file %1 already exist, but cannot be opened.</source>
+ <translation type="obsolete">Låsfil %1 finns redan, men kan inte öppnas.</translation>
+ </message>
+ <message>
+ <source>%1 is already running.
+Lock file %2 already exists.</source>
+ <translation>%1 körs redan.
+Låsfilen %2 finns redan.</translation>
+ </message>
+ <message>
+ <source>Cannot create %1 .</source>
+ <translation>Kan inte skapa %1.</translation>
+ </message>
+ <message>
+ <source>Cannot write to %1 .</source>
+ <translation type="obsolete">Kan inte skriva till %1.</translation>
+ </message>
+ <message>
+ <source>Syntax error in file %1 .</source>
+ <translation>Syntaxfel i filen %1.</translation>
+ </message>
+ <message>
+ <source>Failed to backup %1 to %2</source>
+ <translation>Kunde inte kopiera %1 till %2</translation>
+ </message>
+ <message>
+ <source>unknown name (device is busy)</source>
+ <translation>okänt namn (enheten är upptagen)</translation>
+ </message>
+ <message>
+ <source>Default device</source>
+ <translation>Standardenhet</translation>
+ </message>
+ <message>
+ <source>Cannot access the ring tone device (%1).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot access the speaker (%1).</source>
+ <translation>Kan inte komma åt högtalaren (%1).</translation>
+ </message>
+ <message>
+ <source>Cannot access the microphone (%1).</source>
+ <translation>Kan inte komma åt mikrofonen (%1).</translation>
+ </message>
+ <message>
+ <source>Call transfer - %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sound card cannot be set to full duplex.</source>
+ <translation>Ljudkortet kan inte ställas in i full duplex-läge.</translation>
+ </message>
+ <message>
+ <source>Cannot set buffer size on sound card.</source>
+ <translation>Kan inte ställa in buffertstorlek på ljudkortet.</translation>
+ </message>
+ <message>
+ <source>Sound card cannot be set to %1 channels.</source>
+ <translation>Ljudkortet kan inte ställas in till %1 kanaler.</translation>
+ </message>
+ <message>
+ <source>Cannot set sound card to 16 bits recording.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot set sound card to 16 bits playing.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot set sound card sample rate to %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opening ALSA driver failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot open ALSA driver for PCM playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot resolve STUN server: %1</source>
+ <translation>Kan inte slå upp STUN-server: %1</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Du är bakom en symmetrisk NAT.
+STUN kommer inte fungera.
+Konfigurera en publik IP-adress i användarprofilen
+och skapa följande statiska bindningar (UDP) i din NAT.</translation>
+ </message>
+ <message>
+ <source>public IP: %1 --&gt; private IP: %2 (SIP signaling)</source>
+ <translation>publik IP: %1 --&gt; privat IP: %2 (SIP-signalering)</translation>
+ </message>
+ <message>
+ <source>public IP: %1-%2 --&gt; private IP: %3-%4 (RTP/RTCP)</source>
+ <translation>publik IP: %1-%2 --&gt; privat IP: %3-%4 (RTP/RTCP)</translation>
+ </message>
+ <message>
+ <source>Cannot reach the STUN server: %1</source>
+ <translation>Kan inte kontakta STUN-servern: %1</translation>
+ </message>
+ <message>
+ <source>If you are behind a firewall then you need to open the following UDP ports.</source>
+ <translation>Om du är bakom en brandvägg behöver du öppna följande UDP-portar.</translation>
+ </message>
+ <message>
+ <source>Port %1 (SIP signaling)</source>
+ <translation>Port %1 (SIP-signalering)</translation>
+ </message>
+ <message>
+ <source>Ports %1-%2 (RTP/RTCP)</source>
+ <translation>Portar %1-%2 (RTP/RTCP)</translation>
+ </message>
+ <message>
+ <source>NAT type discovery via STUN failed.</source>
+ <translation>STUN kunde inte detektera NAT-typ.</translation>
+ </message>
+ <message>
+ <source>Failed to create file %1</source>
+ <translation>Misslyckades med att skapa filen %1</translation>
+ </message>
+ <message>
+ <source>Failed to write data to file %1</source>
+ <translation>Misslyckades med att skriva data till filen %1</translation>
+ </message>
+ <message>
+ <source>Cannot receive incoming TCP connections.</source>
+ <translation>Kan inte ta emot inkommande TCP-anslutningar.</translation>
+ </message>
+ <message>
+ <source>Cannot open ALSA driver for PCM capture</source>
+ <translation>Kan inte öppna ALSA-drivrutin för PCM-fångst</translation>
+ </message>
+ <message>
+ <source>Failed to send message.</source>
+ <translation>Misslyckades med att skicka meddelande.</translation>
+ </message>
+ <message>
+ <source>Cannot lock %1 .</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UserProfileForm</name>
+ <message>
+ <source>Twinkle - User Profile</source>
+ <translation>Twinkle - Användarprofil</translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation>Användarprofil:</translation>
+ </message>
+ <message>
+ <source>Select which profile you want to edit.</source>
+ <translation>Välj den profil du vill ändra.</translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation>Användare</translation>
+ </message>
+ <message>
+ <source>SIP server</source>
+ <translation>SIP-server</translation>
+ </message>
+ <message>
+ <source>Voice mail</source>
+ <translation>Röstbrevlåda</translation>
+ </message>
+ <message>
+ <source>RTP audio</source>
+ <translation>RTP-ljud</translation>
+ </message>
+ <message>
+ <source>SIP protocol</source>
+ <translation>SIP-protokoll</translation>
+ </message>
+ <message>
+ <source>NAT</source>
+ <translation type="obsolete">NAT</translation>
+ </message>
+ <message>
+ <source>Address format</source>
+ <translation>Adressformat</translation>
+ </message>
+ <message>
+ <source>Timers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <translation>Ringsignaler</translation>
+ </message>
+ <message>
+ <source>Scripts</source>
+ <translation>Skript</translation>
+ </message>
+ <message>
+ <source>Security</source>
+ <translation>Säkerhet</translation>
+ </message>
+ <message>
+ <source>Select a category for which you want to see or modify the settings.</source>
+ <translation>Välj en kategori för vilken du vill se eller ändra inställningar.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>Accept and save your changes.</source>
+ <translation>Acceptera och spara dina ändringar.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>Undo all your changes and close the window.</source>
+ <translation>Ångra alla dina ändringar och stäng fönstret.</translation>
+ </message>
+ <message>
+ <source>SIP account</source>
+ <translation>SIP-konto</translation>
+ </message>
+ <message>
+ <source>&amp;User name*:</source>
+ <translation>&amp;Användarnamn*:</translation>
+ </message>
+ <message>
+ <source>&amp;Domain*:</source>
+ <translation>&amp;Domän*:</translation>
+ </message>
+ <message>
+ <source>Or&amp;ganization:</source>
+ <translation>Or&amp;ganisation:</translation>
+ </message>
+ <message>
+ <source>The SIP user name given to you by your provider. It is the user part in your SIP address, &lt;b&gt;username&lt;/b&gt;@domain.com This could be a telephone number.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>SIP-användarnamnet som din leverantör levererat till dig. Detta är användardelen av din SIP-adress, &lt;b&gt;användarnamn&lt;/b&gt;@domän.se. Detta kan vara ett telefonnummer.
+&lt;br&gt;&lt;br&gt;
+Detta fält är obligatoriskt.</translation>
+ </message>
+ <message>
+ <source>The domain part of your SIP address, username@&lt;b&gt;domain.com&lt;/b&gt;. Instead of a real domain this could also be the hostname or IP address of your &lt;b&gt;SIP proxy&lt;/b&gt;. If you want direct IP phone to IP phone communications then you fill in the hostname or IP address of your computer.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>Domändelen av din SIP-adress, användarnamn@&lt;b&gt;domän.se&lt;/b&gt;. Istället för en riktig domän så kan detta även vara värdnamnet eller IP-adressen för din &lt;b&gt;SIP-proxy&lt;/b&gt;. Om du vill använda direktkommunikation mellan IP-telefon och IP-telefon så kan du fylla i värdnamnet eller IP-adress för din dator.
+&lt;br&gt;&lt;br&gt;
+Detta fält är obligatoriskt.</translation>
+ </message>
+ <message>
+ <source>You may fill in the name of your organization. When you make a call, this might be shown to the called party.</source>
+ <translation>Du kan fylla i namnet för din organisation. När du ringer ett samtal så kan dock detta visas för motparten.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Detta är helt enkelt ditt fullständiga namn, t.ex. Sven Svensson. Det används endast för visning. När du ringer ett samtal kan dock detta namn visas för motparten.</translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation>&amp;Ditt namn:</translation>
+ </message>
+ <message>
+ <source>SIP authentication</source>
+ <translation>SIP-autentisering</translation>
+ </message>
+ <message>
+ <source>&amp;Realm:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Authentication &amp;name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>&amp;Lösenord:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation>Ditt SIP-autentiseringsnamn. Ganska ofta är detta samma som ditt SIP-användarnamn. Det kan dock vara ett annat namn.</translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation>Ditt lösenord för autentisering.</translation>
+ </message>
+ <message>
+ <source>Registrar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Registrar:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Expiry:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The registration expiry time that Twinkle will request.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation>sekunder</translation>
+ </message>
+ <message>
+ <source>Re&amp;gister at startup</source>
+ <translation>Re&amp;gistrera vid uppstart</translation>
+ </message>
+ <message>
+ <source>Alt+G</source>
+ <translation>Alt+G</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Outbound Proxy</source>
+ <translation>Utgående proxy</translation>
+ </message>
+ <message>
+ <source>&amp;Use outbound proxy</source>
+ <translation>&amp;Använd utgående proxy</translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Outbound &amp;proxy:</source>
+ <translation>Utgående &amp;proxy:</translation>
+ </message>
+ <message>
+ <source>&amp;Send in-dialog requests to proxy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation type="unfinished">Alt+V</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Don&apos;t send a request to proxy if its destination can be resolved locally.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation type="unfinished">Alt+T</translation>
+ </message>
+ <message>
+ <source>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.)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of your outbound proxy.</source>
+ <translation>Värdnamnet, domännamnet eller IP-adressen för din utgående proxy.</translation>
+ </message>
+ <message>
+ <source>Co&amp;decs</source>
+ <translation>Ko&amp;dekar</translation>
+ </message>
+ <message>
+ <source>Codecs</source>
+ <translation>Kodekar</translation>
+ </message>
+ <message>
+ <source>Available codecs:</source>
+ <translation>Tillgängliga kodekar:</translation>
+ </message>
+ <message>
+ <source>G.711 A-law</source>
+ <translation>G.711 A-law</translation>
+ </message>
+ <message>
+ <source>G.711 u-law</source>
+ <translation>G.711 u-law</translation>
+ </message>
+ <message>
+ <source>GSM</source>
+ <translation>GSM</translation>
+ </message>
+ <message>
+ <source>speex-nb (8 kHz)</source>
+ <translation>speex-nb (8 kHz)</translation>
+ </message>
+ <message>
+ <source>speex-wb (16 kHz)</source>
+ <translation>speex-wb (16 kHz)</translation>
+ </message>
+ <message>
+ <source>speex-uwb (32 kHz)</source>
+ <translation>speex-uwb (32 kHz)</translation>
+ </message>
+ <message>
+ <source>List of available codecs.</source>
+ <translation>Lista över tillgängliga kodekar.</translation>
+ </message>
+ <message>
+ <source>Move a codec from the list of available codecs to the list of active codecs.</source>
+ <translation>Flytta en kodek från listan för tillgängliga kodekar till listan för aktiva kodekar.</translation>
+ </message>
+ <message>
+ <source>Move a codec from the list of active codecs to the list of available codecs.</source>
+ <translation>Flytta en kodek från listan för aktiva kodekar till listan för tillgängliga kodekar.</translation>
+ </message>
+ <message>
+ <source>Active codecs:</source>
+ <translation>Aktiva kodekar:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move a codec upwards in the list of active codecs, i.e. increase its preference of use.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move a codec downwards in the list of active codecs, i.e. decrease its preference of use.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;G.711/G.726 payload size:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The preferred payload size for the G.711 and G.726 codecs.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ms</source>
+ <translation>ms</translation>
+ </message>
+ <message>
+ <source>&amp;Follow codec preference from far end on incoming calls</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+F</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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.
+&lt;p&gt;
+If you disable this option, then the first codec from the active codecs that is also in the SDP offer is picked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Follow codec &amp;preference from far end on outgoing calls</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation type="unfinished">Alt+P</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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.
+&lt;p&gt;
+If you disable this option, then the first codec from the active codecs that is also in the SDP answer is picked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;iLBC</source>
+ <translation>&amp;iLBC</translation>
+ </message>
+ <message>
+ <source>iLBC</source>
+ <translation>iLBC</translation>
+ </message>
+ <message>
+ <source>i&amp;LBC payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>iLBC &amp;payload size (ms):</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for iLBC.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>20</source>
+ <translation>20</translation>
+ </message>
+ <message>
+ <source>30</source>
+ <translation>30</translation>
+ </message>
+ <message>
+ <source>The preferred payload size for iLBC.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Speex</source>
+ <translation>&amp;Speex</translation>
+ </message>
+ <message>
+ <source>Speex</source>
+ <translation>Speex</translation>
+ </message>
+ <message>
+ <source>Perceptual &amp;enhancement</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation type="unfinished">Alt+R</translation>
+ </message>
+ <message>
+ <source>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).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Ultra wide band payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;VAD</source>
+ <translation type="obsolete">&amp;VAD</translation>
+ </message>
+ <message>
+ <source>Alt+V</source>
+ <translation>Alt+V</translation>
+ </message>
+ <message>
+ <source>&amp;Wide band payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>V&amp;BR</source>
+ <translation type="obsolete">V&amp;BR</translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation>Alt+B</translation>
+ </message>
+ <message>
+ <source>Variable bit-rate (VBR) allows a codec to change its bit-rate dynamically to adapt to the &quot;difficulty&quot; 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&apos;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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for speex wide band.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Co&amp;mplexity:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DT&amp;X</source>
+ <translation type="obsolete">DT&amp;X</translation>
+ </message>
+ <message>
+ <source>Alt+X</source>
+ <translation type="obsolete">Alt+X</translation>
+ </message>
+ <message>
+ <source>Discontinuous transmission is an addition to VAD/VBR operation, that allows to stop transmitting completely when the background noise is stationary.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for speex narrow band.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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&apos;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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Narrow band payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G.726</source>
+ <translation>G.726</translation>
+ </message>
+ <message>
+ <source>G.726 &amp;40 kbps payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 40 kbps.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 32 kbps.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G.726 &amp;24 kbps payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 24 kbps.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G.726 &amp;32 kbps payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 16 kbps.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G.726 &amp;16 kbps payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Codeword &amp;packing order:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RFC 3551</source>
+ <translation>RFC 3551</translation>
+ </message>
+ <message>
+ <source>ATM AAL2</source>
+ <translation>ATM AAL2</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DT&amp;MF</source>
+ <translation>DT&amp;MF</translation>
+ </message>
+ <message>
+ <source>DTMF</source>
+ <translation>DTMF</translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for DTMF events (RFC 2833).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DTMF vo&amp;lume:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The power level of the DTMF tone in dB.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The pause after a DTMF tone.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DTMF &amp;duration:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DTMF payload &amp;type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DTMF &amp;pause:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>dB</source>
+ <translation>dB</translation>
+ </message>
+ <message>
+ <source>Duration of a DTMF tone.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DTMF t&amp;ransport:</source>
+ <translation>DTMF-t&amp;ransport:</translation>
+ </message>
+ <message>
+ <source>Auto</source>
+ <translation>Auto</translation>
+ </message>
+ <message>
+ <source>RFC 2833</source>
+ <translation>RFC 2833</translation>
+ </message>
+ <message>
+ <source>Inband</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Out-of-band (SIP INFO)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;h2&gt;RFC 2833&lt;/h2&gt;
+&lt;p&gt;Send DTMF tones as RFC 2833 telephone events.&lt;/p&gt;
+&lt;h2&gt;Inband&lt;/h2&gt;
+&lt;p&gt;Send DTMF inband.&lt;/p&gt;
+&lt;h2&gt;Auto&lt;/h2&gt;
+&lt;p&gt;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.
+&lt;/p&gt;
+&lt;h2&gt;Out-of-band (SIP INFO)&lt;/h2&gt;
+&lt;p&gt;
+Send DTMF out-of-band via a SIP INFO request.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Allmänt</translation>
+ </message>
+ <message>
+ <source>Protocol options</source>
+ <translation>Protokollalternativ</translation>
+ </message>
+ <message>
+ <source>Call &amp;Hold variant:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RFC 2543</source>
+ <translation>RFC 2543</translation>
+ </message>
+ <message>
+ <source>RFC 3264</source>
+ <translation>RFC 3264</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allow m&amp;issing Contact header in 200 OK on REGISTER</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation type="unfinished">Alt+I</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Max-Forwards header is mandatory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation type="unfinished">Alt+M</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Put &amp;registration expiry time in contact header</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Use compact header names</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if compact header names should be used for headers that have a compact form.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allow SDP change during call setup</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;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.&lt;/p&gt;
+&lt;p&gt;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.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use domain &amp;name to create a unique contact header value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Twinkle creates a unique contact header value by combining the SIP user name and domain:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;tt&gt;&amp;nbsp;user_domain@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+This way 2 user profiles, having the same user name but different domain names, have unique contact addresses and hence can be activated simultaneously.
+&lt;/p&gt;
+&lt;p&gt;
+Some proxies do not handle a contact header value like this. You can disable this option to get a contact header value like this:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;tt&gt;&amp;nbsp;user@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+This format is what most SIP phones use.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Encode Via, Route, Record-Route as list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redirection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Allow redirection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished">Alt+B</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should redirect a request if a 3XX response is received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ask user &amp;permission to redirect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should ask the user before redirecting a request when a 3XX response is received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max re&amp;directions:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SIP extensions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>disabled</source>
+ <translation>inaktiverad</translation>
+ </message>
+ <message>
+ <source>supported</source>
+ <translation>stöds</translation>
+ </message>
+ <message>
+ <source>required</source>
+ <translation>krävs</translation>
+ </message>
+ <message>
+ <source>preferred</source>
+ <translation>föredras</translation>
+ </message>
+ <message>
+ <source>Indicates if the 100rel extension (PRACK) is supported:&lt;br&gt;&lt;br&gt;
+&lt;b&gt;disabled&lt;/b&gt;: 100rel extension is disabled
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;supported&lt;/b&gt;: 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.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;required&lt;/b&gt;: 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.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;preferred&lt;/b&gt;: 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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;100 rel (PRACK):</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Replaces</source>
+ <translation>Ersätter</translation>
+ </message>
+ <message>
+ <source>Indicates if the Replaces-extenstion is supported.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>REFER</source>
+ <translation>REFER</translation>
+ </message>
+ <message>
+ <source>Call transfer (REFER)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+T</source>
+ <translation type="unfinished">Alt+T</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should transfer a call if a REFER request is received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>As&amp;k user permission to transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should ask the user before transferring a call when a REFER request is received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hold call &amp;with referrer while setting up call to transfer target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should put the current call on hold when a REFER request to transfer a call is received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ho&amp;ld call with referee before sending REFER</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation type="unfinished">Alt+T</translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should put the current call on hold when you transfer a call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Auto re&amp;fresh subscription to refer event while call transfer is not finished</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attended refer to AoR (Address of Record)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Privacy</source>
+ <translation>Integritet</translation>
+ </message>
+ <message>
+ <source>Privacy options</source>
+ <translation>Integritetsalternativ</translation>
+ </message>
+ <message>
+ <source>&amp;Send P-Preferred-Identity header when hiding user identity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Include a P-Preferred-Identity header with your identity in an INVITE request for a call with identity hiding.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NAT traversal</source>
+ <translation>NAT-traversering</translation>
+ </message>
+ <message>
+ <source>&amp;NAT traversal not needed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose this option when there is no NAT device between you and your SIP proxy or when your SIP provider offers hosted NAT traversal.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Use statically configured public IP address inside SIP messages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.&lt;br&gt;&lt;br&gt;
+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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose this option when your SIP provider offers a STUN server for NAT traversal.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&amp;TUN server:</source>
+ <translation>S&amp;TUN-server:</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of the STUN server.</source>
+ <translation type="unfinished">Värdnamnet, domännamnet eller IP-adressen för STUN-servern.</translation>
+ </message>
+ <message>
+ <source>&amp;Public IP address:</source>
+ <translation>&amp;Publik IP-adress:</translation>
+ </message>
+ <message>
+ <source>The public IP address of your NAT.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Telephone numbers</source>
+ <translation>Telefonnummer</translation>
+ </message>
+ <message>
+ <source>Only &amp;display user part of URI for telephone number</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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 &quot;123456&quot; to the user. A URI indicates a telephone number if it contains the &quot;user=phone&quot; parameter or when it has a numerical user part and you ticked the next option.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;URI with numerical user part is a telephone number</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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 &quot;user=phone&quot; parameter to such a URI.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Remove special symbols from numerical dial strings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Special symbols:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The special symbols that may be part of a telephone number for nice formatting, but must be removed when dialing.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number conversion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Match expression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Replace</source>
+ <translation>Ersätt</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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 &apos;00&apos; instead of the &apos;+&apos;, or you are at the office and all your numbers need to be prefixed with a &apos;9&apos; to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings.
+&lt;/p&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;p&gt;
+The number conversion rules are also applied to incoming calls, so the numbers are displayed in the format you want.
+&lt;/p&gt;
+&lt;h3&gt;Example 1&lt;/h3&gt;
+&lt;p&gt;
+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 &apos;+31&apos; and replace it by a &apos;0&apos;. For dialling numbers abroad you just want to replace the &apos;+&apos; by &apos;00&apos;.
+&lt;/p&gt;
+&lt;p&gt;
+The following rules will do the trick:
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expression = \+31([0-9]*) , Replace = 0$1&lt;br&gt;
+Match expression = \+([0-9]*) , Replace = 00$1&lt;/br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;h3&gt;Example 2&lt;/h3&gt;
+&lt;p&gt;
+You are at work and all telephone numbers starting with a 0 should be prefixed with a 9 for an outside line.
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expression = 0[0-9]* , Replace = 9$&amp;&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move the selected number conversion rule upwards in the list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move the selected number conversion rule downwards in the list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation>&amp;Lägg till</translation>
+ </message>
+ <message>
+ <source>Add a number conversion rule.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Re&amp;move</source>
+ <translation>Ta &amp;bort</translation>
+ </message>
+ <message>
+ <source>Remove the selected number conversion rule.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Redigera</translation>
+ </message>
+ <message>
+ <source>Edit the selected number conversion rule.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type a telephone number here an press the Test button to see how it is converted by the list of number conversion rules.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Test</source>
+ <translation>&amp;Testa</translation>
+ </message>
+ <message>
+ <source>Test how a number is converted by the number conversion rules.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>for STUN</source>
+ <translation type="obsolete">för STUN</translation>
+ </message>
+ <message>
+ <source>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 &quot;480 User Not Responding&quot;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NAT &amp;keep alive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;No answer:</source>
+ <translation>&amp;Inget svar:</translation>
+ </message>
+ <message>
+ <source>Ring &amp;back tone:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Specify the file name of a .wav file that you want to be played as ring back tone for this user.
+&lt;/p&gt;
+&lt;p&gt;
+This ring back tone overrides the ring back tone settings in the system settings.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Specify the file name of a .wav file that you want to be played as ring tone for this user.
+&lt;/p&gt;
+&lt;p&gt;
+This ring tone overrides the ring tone settings in the system settings.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Ring tone:</source>
+ <translation>&amp;Ringsignal:</translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you release a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing SIP BYE request are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=local_release&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the BYE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when an incoming call fails.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing SIP failure response are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_failed&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; contains the status code of the failure response. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when the remote party releases a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming SIP BYE request are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=remote_release&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the BYE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+You can customize the way Twinkle handles incoming calls. Twinkle can call a script when a call comes in. Based on the ouput 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.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Note:&lt;/b&gt; 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 &lt;b&gt;end&lt;/b&gt; and keep on running. Twinkle will continue when it receives the &lt;b&gt;end&lt;/b&gt; parameter.
+&lt;/p&gt;
+&lt;p&gt;
+With your script you can customize call handling by outputing one or more of the following parameters to stdout. Each parameter should be on a separate line.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+action=[ continue | reject | dnd | redirect | autoanswer ]&lt;br&gt;
+reason=&amp;lt;string&amp;gt;&lt;br&gt;
+contact=&amp;lt;address to redirect to&amp;gt;&lt;br&gt;
+caller_name=&amp;lt;name of caller to display&amp;gt;&lt;br&gt;
+ringtone=&amp;lt;file name of .wav file&amp;gt;&lt;br&gt;
+display_msg=&amp;lt;message to show on display&amp;gt;&lt;br&gt;
+end&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;/p&gt;
+&lt;h2&gt;Parameters&lt;/h2&gt;
+&lt;h3&gt;action&lt;/h3&gt;
+&lt;p&gt;
+&lt;b&gt;continue&lt;/b&gt; - continue call handling as usual&lt;br&gt;
+&lt;b&gt;reject&lt;/b&gt; - reject call&lt;br&gt;
+&lt;b&gt;dnd&lt;/b&gt; - deny call with do not disturb indication&lt;br&gt;
+&lt;b&gt;redirect&lt;/b&gt; - redirect call to address specified by &lt;b&gt;contact&lt;/b&gt;&lt;br&gt;
+&lt;b&gt;autoanswer&lt;/b&gt; - automatically answer a call&lt;br&gt;
+&lt;/p&gt;
+&lt;p&gt;
+When the script does not write an action to stdout, then the default action is continue.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;reason: &lt;/b&gt;
+With the reason parameter you can set the reason string for reject or dnd. This might be shown to the far-end user.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;caller_name: &lt;/b&gt;
+This parameter will override the display name of the caller.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;ringtone: &lt;/b&gt;
+The ringtone parameter specifies the .wav file that will be played as ring tone when action is continue.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+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 &lt;b&gt;SIP_&amp;lt;HEADER_NAME&amp;gt;&lt;/b&gt; E.g. SIP_FROM contains the value of the from header.
+&lt;/p&gt;
+&lt;p&gt;
+TWINKLE_TRIGGER=in_call. SIPREQUEST_METHOD=INVITE. The request-URI of the INVITE will be passed in &lt;b&gt;SIPREQUEST_URI&lt;/b&gt;. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when the remote party answers your call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming 200 OK are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_answered&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you answer an incoming call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing 200 OK are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_answered&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call released locall&amp;y:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when an outgoing call fails.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming SIP failure response are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_failed&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; contains the status code of the failure response. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you make a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing INVITE are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=INVITE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the INVITE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Outgoing call a&amp;nswered:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Incoming call &amp;failed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Incoming call:</source>
+ <translation>&amp;Inkommande samtal:</translation>
+ </message>
+ <message>
+ <source>Call released &amp;remotely:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Incoming call &amp;answered:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>O&amp;utgoing call:</source>
+ <translation>&amp;Utgående samtal:</translation>
+ </message>
+ <message>
+ <source>Out&amp;going call failed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Enable ZRTP/SRTP encryption</source>
+ <translation>&amp;Aktivera ZRTP/SRTP-kryptering</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ZRTP settings</source>
+ <translation>Inställningar för ZRTP</translation>
+ </message>
+ <message>
+ <source>O&amp;nly encrypt audio if remote party indicated ZRTP support in SDP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Indicate ZRTP support in SDP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Twinkle will indicate ZRTP support during call setup in its signalling.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Popup warning when remote party disables encryption during call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Voice mail address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The SIP address or telephone number to access your voice mail.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsollicited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sollicited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;H2&gt;Message waiting indication type&lt;/H2&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;H3&gt;Unsollicited&lt;/H3&gt;
+&lt;p&gt;
+Asterisk provides unsollicited message waiting indication.
+&lt;/p&gt;
+&lt;H3&gt;Sollicited&lt;/H3&gt;
+&lt;p&gt;
+Sollicited message waiting indication as specified by RFC 3842.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;MWI type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sollicited MWI</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Subscription &amp;duration:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mailbox &amp;user name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of your voice mailbox server.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your user name for accessing your voice mailbox.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mailbox &amp;server:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Via outbound &amp;proxy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Check this option if Twinkle should send SIP messages to the mailbox server via the outbound proxy.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dynamic payload type %1 is used more than once.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You must fill in a user name for your SIP account.</source>
+ <translation type="unfinished">Du måste fylla i ett användarnamn för ditt SIP-konto.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished">Du måste fylla i ett domännamn för ditt SIP-konto.
+Detta kan vara värdnamnet eller IP-adressen för din dator, om du vill ha direktsamtal, PC till PC.</translation>
+ </message>
+ <message>
+ <source>Invalid domain.</source>
+ <translation>Ogiltig domän.</translation>
+ </message>
+ <message>
+ <source>Invalid user name.</source>
+ <translation>Ogiltigt användarnamn.</translation>
+ </message>
+ <message>
+ <source>Invalid value for registrar.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid value for outbound proxy.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You must fill in a mailbox user name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You must fill in a mailbox server</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid mailbox server.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid mailbox user name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value for public IP address missing.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid value for STUN server.</source>
+ <translation>Ogiltigt värde för STUN-server.</translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation>Ringsignaler</translation>
+ </message>
+ <message>
+ <source>Choose ring tone</source>
+ <translation>Välj ringsignal</translation>
+ </message>
+ <message>
+ <source>Ring back tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All files</source>
+ <translation>Alla filer</translation>
+ </message>
+ <message>
+ <source>Choose incoming call script</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose incoming call answered script</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose incoming call failed script</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose outgoing call script</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose outgoing call answered script</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose outgoing call failed script</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose local release script</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose remote release script</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instant message</source>
+ <translation>Snabbmeddelande</translation>
+ </message>
+ <message>
+ <source>Presence</source>
+ <translation>Närvaro</translation>
+ </message>
+ <message>
+ <source>Transport/NAT</source>
+ <translation>Transport/NAT</translation>
+ </message>
+ <message>
+ <source>AKA AM&amp;F</source>
+ <translation type="obsolete">AKA AM&amp;F</translation>
+ </message>
+ <message>
+ <source>A&amp;KA OP:</source>
+ <translation>A&amp;KA OP:</translation>
+ </message>
+ <message>
+ <source>Authentication management field for AKAv1-MD5 authentication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Operator variant key for AKAv1-MD5 authentication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add q-value to registration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The q-value is a value between 0.000 and 1.000. A higher value means a higher priority.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SIP transport</source>
+ <translation>SIP-transport</translation>
+ </message>
+ <message>
+ <source>UDP</source>
+ <translation>UDP</translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <translation>TCP</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>T&amp;ransport protocol:</source>
+ <translation>T&amp;ransportprotokoll:</translation>
+ </message>
+ <message>
+ <source>UDP t&amp;hreshold:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source> bytes</source>
+ <translation type="obsolete"> byte</translation>
+ </message>
+ <message>
+ <source>Messages larger than the threshold are sent via TCP. Smaller messages are sent via UDP.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &amp;STUN (does not work for incoming TCP)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>P&amp;ersistent TCP connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use tel-URI for telephone &amp;number</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Expand a dialed telephone number to a tel-URI instead of a sip-URI.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select ring back tone file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select ring tone file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select script file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Maximum number of sessions:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When you have this number of instant message sessions open, new incoming message sessions will be rejected.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Send composing indications when typing a message.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Twinkle sends a composing indication when you type a message. This way the recipient can see that you are typing.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your presence</source>
+ <translation>Din närvaro</translation>
+ </message>
+ <message>
+ <source>&amp;Publish availability at startup</source>
+ <translation>&amp;Publicera tillgänglighet vid uppstart</translation>
+ </message>
+ <message>
+ <source>Publish your availability at startup.</source>
+ <translation>Publicera din tillgänglighet vid uppstart.</translation>
+ </message>
+ <message>
+ <source>Publication &amp;refresh interval (sec):</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Refresh rate of presence publications.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Buddy presence</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Subscription refresh interval (sec):</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Refresh rate of presence subscriptions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 converts to %2</source>
+ <translation>%1 konverteras till %2</translation>
+ </message>
+ <message>
+ <source>AKA AM&amp;F:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Prepr&amp;ocessing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preprocessing (improves quality at remote end)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Automatic gain control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automatic gain control &amp;level:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automatic gain control level represents percentual value of automatic gain setting of a microphone. Recommended value is about 25%.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Voice activity detection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When enabled, voice activity detection detects whether the input signal represents a speech or a silence/background noise.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Noise reduction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The noise reduction can be used to reduce the amount of background noise present in the input signal. This provides higher quality speech.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Acoustic &amp;Echo Cancellation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Variable &amp;bit-rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Discontinuous &amp;Transmission</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Quality:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Speex is a lossy codec, which means that it achives 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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Accept call &amp;transfer request (incoming REFER)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allow call transfer while consultation in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>bytes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable NAT &amp;keep alive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send UDP NAT keep alive packets.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WizardForm</name>
+ <message>
+ <source>Twinkle - Wizard</source>
+ <translation>Twinkle - Guide</translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of the STUN server.</source>
+ <translation>Värdnamnet, domännamnet eller IP-adressen för STUN-servern.</translation>
+ </message>
+ <message>
+ <source>S&amp;TUN server:</source>
+ <translation>S&amp;TUN-server:</translation>
+ </message>
+ <message>
+ <source>The SIP user name given to you by your provider. It is the user part in your SIP address, &lt;b&gt;username&lt;/b&gt;@domain.com This could be a telephone number.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>SIP-användarnamnet som din leverantör levererat till dig. Detta är användardelen av din SIP-adress, &lt;b&gt;användarnamn&lt;/b&gt;@domän.se. Detta kan vara ett telefonnummer.
+&lt;br&gt;&lt;br&gt;
+Detta fält är obligatoriskt.</translation>
+ </message>
+ <message>
+ <source>&amp;Domain*:</source>
+ <translation>&amp;Domän*:</translation>
+ </message>
+ <message>
+ <source>Choose your SIP service provider. If your SIP service provider is not in the list, then select &lt;b&gt;Other&lt;/b&gt; and fill in the settings you received from your provider.&lt;br&gt;&lt;br&gt;
+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.</source>
+ <translation>Välj din SIP-tjänsteleverantör. Om din SIP-tjänsteleverantör inte finns med i listan så ska du välja &lt;b&gt;Annan&lt;/b&gt; och fylla i inställningarna som du fått från din leverantör.&lt;br&gt;&lt;br&gt;
+Om du väljer en av de fördefinierade SIP-tjänsteleverantörerna så behöver du endast fylla i ditt namn, användarnamn, autentiseringsnamn och lösenord.</translation>
+ </message>
+ <message>
+ <source>&amp;Authentication name:</source>
+ <translation>&amp;Autentiseringsnamn:</translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation>&amp;Ditt namn:</translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation>Ditt SIP-autentiseringsnamn. Ganska ofta är detta samma som ditt SIP-användarnamn. Det kan dock skilja sig.</translation>
+ </message>
+ <message>
+ <source>The domain part of your SIP address, username@&lt;b&gt;domain.com&lt;/b&gt;. Instead of a real domain this could also be the hostname or IP address of your &lt;b&gt;SIP proxy&lt;/b&gt;. If you want direct IP phone to IP phone communications then you fill in the hostname or IP address of your computer.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation>Domändelen av din SIP-adress, användarnamn@&lt;b&gt;domän.se&lt;/b&gt;. Istället för en riktig domän så kan detta även vara värdnamnet eller IP-adressen för din &lt;b&gt;SIP-proxy&lt;/b&gt;. Om du vill använda direktkommunikation mellan IP-telefon och IP-telefon så kan du fylla i värdnamnet eller IP-adress för din dator.
+&lt;br&gt;&lt;br&gt;
+Detta fält är obligatoriskt.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Detta är helt enkelt ditt fullständiga namn, t.ex. Sven Svensson. Det används endast för visning. När du ringer ett samtal kan dock detta namn visas för motparten.</translation>
+ </message>
+ <message>
+ <source>SIP pro&amp;xy:</source>
+ <translation>SIP-pro&amp;xy:</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Värdnamnet, domännamnet eller IP-adressen för din SIP-proxy. Om detta är samma värde som för din domän så kan du lämna detta fält tomt.</translation>
+ </message>
+ <message>
+ <source>&amp;SIP service provider:</source>
+ <translation>&amp;SIP-tjänsteleverantör:</translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation>&amp;Lösenord:</translation>
+ </message>
+ <message>
+ <source>&amp;User name*:</source>
+ <translation>A&amp;nvändarnamn*:</translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation>Ditt lösenord för autentisering.</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation>Alt+O</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Avbryt</translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation>Alt+A</translation>
+ </message>
+ <message>
+ <source>None (direct IP to IP calls)</source>
+ <translation>Ingen (direktsamtal IP till IP)</translation>
+ </message>
+ <message>
+ <source>Other</source>
+ <translation>Annan</translation>
+ </message>
+ <message>
+ <source>User profile wizard:</source>
+ <translation>Guide för användarprofil:</translation>
+ </message>
+ <message>
+ <source>You must fill in a user name for your SIP account.</source>
+ <translation>Du måste fylla i ett användarnamn för ditt SIP-konto.</translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation>Du måste fylla i ett domännamn för ditt SIP-konto.
+Detta kan vara värdnamnet eller IP-adressen för din dator, om du vill ha direktsamtal, PC till PC.</translation>
+ </message>
+ <message>
+ <source>Invalid value for SIP proxy.</source>
+ <translation>Ogiltigt värde för SIP-proxy.</translation>
+ </message>
+ <message>
+ <source>Invalid value for STUN server.</source>
+ <translation>Ogiltigt värde för STUN-server.</translation>
+ </message>
+</context>
+<context>
+ <name>YesNoDialog</name>
+ <message>
+ <source>&amp;Yes</source>
+ <translation>&amp;Ja</translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation>&amp;Nej</translation>
+ </message>
+</context>
+</TS>
diff --git a/src/gui/lang/twinkle_xx.ts b/src/gui/lang/twinkle_xx.ts
new file mode 100644
index 0000000..6f2ade3
--- /dev/null
+++ b/src/gui/lang/twinkle_xx.ts
@@ -0,0 +1,5669 @@
+<!DOCTYPE TS><TS>
+<context>
+ <name>AddressCardForm</name>
+ <message>
+ <source>Twinkle - Address Card</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Remark:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Infix name of contact.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>First name of contact.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;First name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You may place any remark about the contact here.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Phone:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Infix name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Phone number or SIP address of contact.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Last name of contact.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Last name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You must fill in a name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You must fill in a phone number or SIP address.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>AuthenticationForm</name>
+ <message>
+ <source>Twinkle - Authentication</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>user</source>
+ <comment>No need to translate</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The user for which authentication is requested.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>profile</source>
+ <comment>No need to translate</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The user profile of the user for which authentication is requested.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;User name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Login required for realm:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>realm</source>
+ <comment>No need to translate</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The realm for which you need to authenticate.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>BuddyForm</name>
+ <message>
+ <source>Twinkle - Buddy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Phone:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name of your buddy.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Show availability</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Check this option if you want to see the availability of your buddy. This will only work if your provider offers a presence agent.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SIP address your buddy.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You must fill in a name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid phone.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save buddy list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>BuddyList</name>
+ <message>
+ <source>Availability</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>offline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>online</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>request failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>request rejected</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>not published</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>failed to publish</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click right to add a buddy.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CoreAudio</name>
+ <message>
+ <source>Failed to open sound card</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to create a UDP socket (RTP) on port %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to create audio receiver thread.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to create audio transmitter thread.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CoreCallHistory</name>
+ <message>
+ <source>local user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>remote user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>failure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>in</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>out</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DeregisterForm</name>
+ <message>
+ <source>Twinkle - Deregister</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>deregister all devices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiamondcardProfileForm</name>
+ <message>
+ <source>Twinkle - Diamondcard User Profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your Diamondcard account ID.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Account ID:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;PIN code:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p align=&quot;center&quot;&gt;&lt;u&gt;Sign up for a Diamondcard account&lt;/u&gt;&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fill in your account ID.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Fill in your PIN code.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A user profile with name %1 already exists.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your Diamondcard PIN code.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;With a Diamondcard account you can make worldwide calls to regular and cell phones and send SMS messages. To sign up for a Diamondcard account click on the &quot;sign up&quot; link below. Once you have signed up you receive an account ID and PIN code. Enter the account ID and PIN code below to create a Twinkle user profile for your Diamondcard account.&lt;/p&gt;
+&lt;p&gt;For call rates see the sign up web page that will be shown to you when you click on the &quot;sign up&quot; link.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DtmfForm</name>
+ <message>
+ <source>Twinkle - DTMF</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Keypad</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Over decadic A. Normally not needed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>4</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>5</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>6</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Over decadic B. Normally not needed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>7</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>9</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Over decadic C. Normally not needed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Star (*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Pound (#)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Over decadic D. Normally not needed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FreeDeskSysTray</name>
+ <message>
+ <source>Show/Hide</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>GUI</name>
+ <message>
+ <source>Failed to create a %1 socket (SIP) on port %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Override lock file and start anyway?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The following profiles are both for user %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You can only run multiple profiles for different users.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If these are users for different domains, then enable the following option in your user profile (SIP protocol)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use domain name to create a unique contact header</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: incoming call for %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call transferred by %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: far end cancelled call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: far end released call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: SDP answer from far end not supported.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: SDP answer from far end missing.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: Unsupported content type in answer from far end.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: no ACK received, call will be terminated.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: no PRACK received, call will be terminated.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: PRACK failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: failed to cancel call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: far end answered call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: call failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The call can be redirected to:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: call released.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: call established.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Response on terminal capability request: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Terminal capabilities of %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Accepted body types:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Accepted encodings:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Accepted languages:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allowed requests:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Supported extensions:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>End point type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: call retrieve failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, registration failed: %2 %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, registration succeeded (expires = %2 seconds)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, registration failed: STUN failure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, de-registration succeeded: %2 %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, de-registration failed: %2 %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, fetching registrations failed: %2 %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>: you are not registered</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>: you have the following registrations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>: fetching registrations...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: redirecting request to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redirecting request to: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: DTMF detected:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>invalid DTMF telephone event (%1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: send DTMF %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: far end does not support DTMF telephone events.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: received notification.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Event: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>State: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reason: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Progress: %1 %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: call transfer failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: call succesfully transferred.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: call transfer still in progress.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No further notifications will be received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: transferring call to %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transfer requested by %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: Call transfer failed. Retrieving original call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, STUN request failed: %2 %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, STUN request failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redirecting call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Do you allow the call to be redirected to the following destination?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If you don&apos;t want to be asked this anymore, then you must change the settings in the SIP protocol section of the user profile.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redirecting request</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Do you allow the %1 request to be redirected to the following destination?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transferring call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Request to transfer call received from:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Request to transfer call received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Do you allow the call to be transferred to the following destination?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Info:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Critical:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Firewall / NAT discovery...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Abort</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click the padlock to confirm a correct SAS.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The remote user on line %1 disabled the encryption.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: SAS confirmed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: SAS confirmation reset.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, voice mail status failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, voice mail status rejected.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, voice mailbox does not exist.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1, voice mail status terminated.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Accepted by network</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: call rejected.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line %1: call redirected.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to start conference.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save message attachment: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transferred by: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot open web browser: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Configure your web browser in the system settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>GetAddressForm</name>
+ <message>
+ <source>Twinkle - Select address</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;KAddressBook</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Phone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This list of addresses is taken from &lt;b&gt;KAddressBook&lt;/b&gt;. 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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Show only SIP addresses</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Check this option when you only want to see contacts with SIP addresses, i.e. starting with &quot;&lt;b&gt;sip:&lt;/b&gt;&quot;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Reload</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reload the list of addresses from KAddressbook.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Local address book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remark</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Contacts in the local address book of Twinkle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add a new contact to the local address book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete a contact from the local address book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit a contact from the local address book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;You seem not to have any contacts with a phone number in &lt;b&gt;KAddressBook&lt;/b&gt;, KDE&apos;s address book application. Twinkle retrieves all contacts with a phone number from KAddressBook. To manage your contacts you have to use KAddressBook.&lt;p&gt;As an alternative you may use Twinkle&apos;s local address book.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>GetProfileNameForm</name>
+ <message>
+ <source>Twinkle - Profile name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enter a name for your profile:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;The name of your profile&lt;/b&gt;
+&lt;br&gt;&lt;br&gt;
+A profile contains your user settings, e.g. your user name and password. You have to give each profile a name.
+&lt;br&gt;&lt;br&gt;
+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.
+&lt;br&gt;&lt;br&gt;
+To remember your profiles easily you could use your SIP user name as a profile name, e.g. &lt;b&gt;example@example.com&lt;/b&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot find .twinkle directory in your home directory.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Profile already exists.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rename profile &apos;%1&apos; to:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>HistoryForm</name>
+ <message>
+ <source>Twinkle - Call History</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Time</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>In/Out</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>From/To</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Subject</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call details</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Details of the selected call record.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>View</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Incoming calls</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Check this option to show incoming calls.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Outgoing calls</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Check this option to show outgoing calls.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Answered calls</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Check this option to show answered calls.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Missed calls</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Check this option to show missed calls.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Current &amp;user profiles only</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Check this option to show only calls associated with this user profile.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&amp;lear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;Clear the complete call history.&lt;/p&gt;
+&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; this will clear &lt;b&gt;all&lt;/b&gt; records, also records not shown depending on the checked view options.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clo&amp;se</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close this window.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call selected address.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call start:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call answer:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call end:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call duration:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Direction:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reply to:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Referred by:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Subject:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Released by:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Status:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Far end device:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>conversation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Re:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number of calls:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>###</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Total call duration:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>InviteForm</name>
+ <message>
+ <source>Twinkle - Call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optionally you can provide a subject here. This might be shown to the callee.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The address that you want to call. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The user that will make the call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Subject:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Hide identity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+H</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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 &lt;b&gt;not&lt;/b&gt; hide your IP address.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Warning:&lt;/b&gt; not all providers support identity hiding.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Not all SIP providers support identity hiding. Make sure your SIP provider supports it if you really need it.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>LogViewForm</name>
+ <message>
+ <source>Twinkle - Log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Contents of the current log file (~/.twinkle/twinkle.log)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&amp;lear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear the log window. This does &lt;b&gt;not&lt;/b&gt; clear the log file itself.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MessageForm</name>
+ <message>
+ <source>Twinkle - Instant message</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The user that will send the message.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The address of the user that you want to send a message. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;User profile:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Conversation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type your message here and then press &quot;send&quot; to send it.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the message.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delivery failure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delivery notification</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instant message toolbar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>image size is scaled down in preview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open with %1...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open with...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save attachment as...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File already exists. Do you want to overwrite this file?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save attachment.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is typing a message.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MessageFormView</name>
+ <message>
+ <source>sending message</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MphoneForm</name>
+ <message>
+ <source>Twinkle</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Buddy list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Call:</source>
+ <comment>Label in front of combobox to enter address</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The address that you want to call. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dial</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dial the address.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;User:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The user that will make the call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Auto answer indication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call redirect indication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Do not disturb indication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Message waiting indication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Missed call indication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Registration status.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line status</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line &amp;1:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click to switch to line 1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Subject:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Visual indication of line state.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>idle</source>
+ <comment>No need to translate</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call is on hold</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Voice is muted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Conference call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transferring call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+The padlock indicates that your voice is encrypted during transport over the network.
+&lt;/p&gt;
+&lt;h3&gt;SAS - Short Authentication String&lt;/h3&gt;
+&lt;p&gt;
+Both ends of an encrypted voice channel receive the same SAS on the first call. If the SAS is different at each end, your voice channel may be compromised by a man-in-the-middle attack (MitM).
+&lt;/p&gt;
+&lt;p&gt;
+If the SAS is equal at both ends, then you should confirm it by clicking this padlock for stronger security of future calls to the same destination. For subsequent calls to the same destination, you don&apos;t have to confirm the SAS again. The padlock will show a check symbol when the SAS has been confirmed.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>sas</source>
+ <comment>No need to translate</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Short authentication string</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>g711a/g711a</source>
+ <comment>No need to translate</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio codec</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>0:00:00</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call duration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>sip:from</source>
+ <comment>No need to translate</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>sip:to</source>
+ <comment>No need to translate</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>subject</source>
+ <comment>No need to translate</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>photo</source>
+ <comment>No need to translate</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line &amp;2:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click to switch to line 2.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&amp;all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Activate line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Message</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Registration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Services</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;View</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call Toolbar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Quit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>About Twinkle</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;About Twinkle</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call</source>
+ <comment>toolbar text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Call...</source>
+ <comment>call menu text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call someone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F5</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Answer</source>
+ <comment>toolbar text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Answer</source>
+ <comment>menu text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Answer incoming call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F6</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bye</source>
+ <comment>toolbar text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Bye</source>
+ <comment>menu text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Release call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Esc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reject</source>
+ <comment>toolbar text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Reject</source>
+ <comment>menu text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reject incoming call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F8</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hold</source>
+ <comment>toolbar text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Hold</source>
+ <comment>menu text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Put a call on hold, or retrieve a held call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redirect</source>
+ <comment>toolbar text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>R&amp;edirect...</source>
+ <comment>menu text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redirect incoming call without answering</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dtmf</source>
+ <comment>toolbar text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Dtmf...</source>
+ <comment>menu text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open keypad to enter digits for voice menu&apos;s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Register</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Register</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Deregister</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Deregister</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Deregister this device</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show registrations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Show registrations</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Terminal capabilities</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Terminal capabilities...</source>
+ <comment>menu text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Request terminal capabilities from someone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Do not disturb</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Do not disturb</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call redirection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call &amp;redirection...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redial</source>
+ <comment>toolbar text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Redial</source>
+ <comment>menu text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Repeat last call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>About Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;User profile...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Conf</source>
+ <comment>toolbar text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Conference</source>
+ <comment>menu text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Join two calls in a 3-way conference</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mute</source>
+ <comment>toolbar text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Mute</source>
+ <comment>menu text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mute a call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Xfer</source>
+ <comment>toolbar text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Trans&amp;fer...</source>
+ <comment>menu text</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transfer call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>System settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;System settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Deregister all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Deregister &amp;all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Deregister all your registered devices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Auto answer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Auto answer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Log...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call history</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call &amp;history...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F9</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Change user ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Change user ...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Activate or de-activate users</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>What&apos;s This?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>What&apos;s &amp;This?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Shift+F1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Voice mail</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Voice mail</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Access voice mail</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Msg</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instant &amp;message...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instant message</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Buddy list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Call...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Edit...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>O&amp;ffline</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Online</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Change availability</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Add buddy...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>idle</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>dialing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>attempting call, please wait</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>incoming call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>establishing call, please wait</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>established</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>established (waiting for media)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>releasing call, please wait</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unknown state</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Voice is encrypted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click to confirm SAS.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click to clear SAS verification.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transfer consultation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hide identity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Registration status:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Registered</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Not registered</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click to show registrations.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No users are registered.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 new, 1 old message</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 new, %2 old messages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1 new message</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 new messages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>1 old message</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 old messages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Messages waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No messages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;b&gt;Voice mail status:&lt;/b&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failure</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click to access voice mail.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Do not disturb active for:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redirection active for:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Auto answer active for:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click to activate/deactivate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click to activate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Do not disturb is not active.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redirection is not active.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Auto answer is not active.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Click to see call history for details.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You have no missed calls.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You missed 1 call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You missed %1 calls.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Starting user profiles...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The following profiles are both for user %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You can only run multiple profiles for different users.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You have changed the SIP UDP port. This setting will only become active when you restart Twinkle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>not provisioned</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You must provision your voice mail address in your user profile, before you can access it.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The line is busy. Cannot access voice mail.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The voice mail address %1 is an invalid address. Please provision a valid address in your user profile.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save buddy list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Diamondcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Manual</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sign up</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Sign up...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recharge...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Balance history...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call history...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Admin center...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Recharge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Balance history</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Admin center</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>NumberConversionForm</name>
+ <message>
+ <source>Twinkle - Number conversion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Match expression:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Replace:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Perl style format string for the replacement number.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Perl style regular expression matching the number format you want to modify.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Match expression may not be empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Replace value may not be empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid regular expression.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RedirectForm</name>
+ <message>
+ <source>Twinkle - Redirect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redirect incoming call to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;3rd choice destination:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;2nd choice destination:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;1st choice destination:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SelectNicForm</name>
+ <message>
+ <source>Twinkle - Select NIC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select the network interface/IP address that you want to use:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set as default &amp;IP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Make the selected IP address the default IP address. The next time you start Twinkle, this IP address will be automatically selected.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set as default &amp;NIC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Make the selected network interface the default interface. The next time you start Twinkle, this interface will be automatically selected.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If you want to remove or change the default at a later time, you can do that via the system settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SelectProfileForm</name>
+ <message>
+ <source>Twinkle - Select user profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select user profile(s) to run:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tick the check boxes of the user profiles that you want to run and press run.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create a new profile with the profile editor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Wizard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create a new profile with the wizard.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit the highlighted profile.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete the highlighted profile.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ren&amp;ame</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rename the highlighted profile.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Set as default</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Make the selected profiles the default profiles. The next time you start Twinkle, these profiles will be automatically run.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Run</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Run Twinkle with the selected profiles.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&amp;ystem settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+Y</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit the system settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;Before you can use Twinkle, you must create a user profile.&lt;br&gt;Click OK to create a profile.&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Profile editor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;Next you may adjust the system settings. You can change these settings always at a later time.&lt;br&gt;&lt;br&gt;Click OK to view and adjust the system settings.&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You did not select any user profile to run.
+Please select a profile.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Are you sure you want to delete profile &apos;%1&apos;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Delete profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to delete profile.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to rename profile.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;If you want to remove or change the default at a later time, you can do that via the system settings.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot find .twinkle directory in your home directory.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ed&amp;itor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dia&amp;mondcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Modify profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Startup profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Diamondcard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;html&gt;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.&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;You can create a Diamondcard account to make worldwide calls to regular and cell phones and send SMS messages.&lt;br&gt;&lt;br&gt;Choose what method you wish to use.&lt;/html&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SelectUserForm</name>
+ <message>
+ <source>Twinkle - Select user</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Select all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&amp;lear all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>purpose</source>
+ <comment>No need to translate</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Register</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select users that you want to register.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Deregister</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select users that you want to deregister.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Deregister all devices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select users for which you want to deregister all devices.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Do not disturb</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select users for which you want to enable &apos;do not disturb&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Auto answer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select users for which you want to enable &apos;auto answer&apos;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SendFileForm</name>
+ <message>
+ <source>Twinkle - Send File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select file to send.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;File:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Subject:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File does not exist.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SrvRedirectForm</name>
+ <message>
+ <source>Twinkle - Call Redirection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>There are 3 redirect services:&lt;p&gt;
+&lt;b&gt;Unconditional:&lt;/b&gt; redirect all calls
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Busy:&lt;/b&gt; redirect a call if both lines are busy
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;No answer:&lt;/b&gt; redirect a call when the no-answer timer expires
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Unconditional</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Redirect all calls</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Activate the unconditional redirection service.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redirect to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;3rd choice destination:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;2nd choice destination:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;1st choice destination:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Busy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Redirect calls when I am busy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Activate the redirection when busy service.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;No answer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Redirect calls when I do not answer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Activate the redirection on no answer service.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Accept and save all changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Undo your changes and close the window.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You have entered an invalid destination.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F11</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F12</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SysSettingsForm</name>
+ <message>
+ <source>Twinkle - System Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Audio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Log</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select a category for which you want to see or modify the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Accept and save your changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Undo all your changes and close the window.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sound Card</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select the sound card for playing the ring tone for incoming calls.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select the sound card to which your microphone is connected.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select the sound card for the speaker function during a call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Speaker:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Ring tone:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Other device:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Microphone:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Validate devices before usage</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+V</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Twinkle validates the audio devices before usage to avoid an established call without an audio channel.
+&lt;p&gt;
+On startup of Twinkle a warning is given if an audio device is inaccessible.
+&lt;p&gt;
+If before making a call, the microphone or speaker appears to be invalid, a warning is given and no call can be made.
+&lt;p&gt;
+If before answering a call, the microphone or speaker appears to be invalid, a warning is given and the call will not be answered.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Advanced</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OSS &amp;fragment size:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>16</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>32</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>64</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>128</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>256</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ALSA &amp;play period size:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;ALSA capture period size:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Max log size:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Log &amp;debug reports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if reports marked as &quot;debug&quot; will be logged.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Log &amp;SIP reports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if SIP messages will be logged.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Log S&amp;TUN reports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+T</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if STUN messages will be logged.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Log m&amp;emory reports</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if reports concerning memory management will be logged.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>System tray</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Create &amp;system tray icon on startup</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable this option if you want a system tray icon for Twinkle. The system tray icon is created when you start Twinkle.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Hide in system tray when closing main window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+H</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable this option if you want Twinkle to hide in the system tray when you close the main window.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Startup</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&amp;tartup hidden in system tray</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Next time you start Twinkle it will immediately hide in the system tray. This works best when you also select a default user profile.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Default user profiles</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call &amp;waiting</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hang up &amp;both lines when ending a 3-way conference call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Maximum calls in call history:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The maximum number of calls that will be kept in the call history.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Auto show main window on incoming call after</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When the main window is hidden, it will be automatically shown on an incoming call after the number of specified seconds.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number of seconds after which the main window should be shown.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>secs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Maximum allowed size (0-65535) in bytes of an incoming SIP message over UDP.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;SIP port:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;RTP port:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max. SIP message size (&amp;TCP):</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The UDP/TCP port used for sending and receiving SIP messages.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max. SIP message size (&amp;UDP):</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Maximum allowed size (0-4294967295) in bytes of an incoming SIP message over TCP.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ring tone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Play ring tone on incoming call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if a ring tone should be played when a call comes in.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Default ring tone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Play the default ring tone when a call comes in.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&amp;ustom ring tone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Play a custom ring tone when a call comes in.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Specify the file name of a .wav file that you want to be played as ring tone.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select ring tone file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ring back tone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>P&amp;lay ring back tone when network does not play ring back tone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Play ring back tone while you are waiting for the far-end to answer your call.
+&lt;/p&gt;
+&lt;p&gt;
+Depending on your SIP provider the network might provide ring back tone or an announcement.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D&amp;efault ring back tone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Play the default ring back tone.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cu&amp;stom ring back tone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Play a custom ring back tone.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Specify the file name of a .wav file that you want to be played as ring back tone.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select ring back tone file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Lookup name for incoming call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ove&amp;rride received display name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lookup &amp;photo for incoming call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Lookup the photo of a caller in your address book and display it on an incoming call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose ring tone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ring back tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose ring back tone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>W&amp;eb browser command:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Command to start your web browser. If you leave this field empty Twinkle will try to figure out your default web browser.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SysTrayPopup</name>
+ <message>
+ <source>Answer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Reject</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Incoming Call</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TermCapForm</name>
+ <message>
+ <source>Twinkle - Terminal Capabilities</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;From:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Get terminal capabilities of</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The address that you want to query for capabilities (OPTION request). This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferForm</name>
+ <message>
+ <source>Twinkle - Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transfer call to</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;To:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The address of the person you want to transfer the call to. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Address book</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select an address from the address book.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type of transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Blind transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transfer the call to a third party without contacting that third party yourself.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>T&amp;ransfer with consultation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Before transferring the call to a third party, first consult the party yourself.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transfer to other &amp;line</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Connect the remote party on the active line with the remote party on the other line.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>F10</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TwinkleCore</name>
+ <message>
+ <source>Anonymous</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Warning:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to create log file %1 .</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot open file for reading: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File system error while reading file %1 .</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot open file for writing: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>File system error while writing file %1 .</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Excessive number of socket errors.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Built with support for:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Contributions:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This software contains the following software from 3rd parties:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>* GSM codec from Jutta Degener and Carsten Bormann, University of Berlin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>* G.711/G.726 codecs from Sun Microsystems (public domain)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>* iLBC implementation from RFC 3951 (www.ilbcfreeware.org)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>* Parts of the STUN project at http://sourceforge.net/projects/stun</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>* Parts of libsrv at http://libsrv.sourceforge.net/</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>For RTP the following dynamic libraries are linked:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Translated to english by &lt;your name&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Directory %1 does not exist.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot open file %1 .</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is not set to your home directory.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Directory %1 (%2) does not exist.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot create directory %1 .</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 is already running.
+Lock file %2 already exists.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot create %1 .</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Syntax error in file %1 .</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to backup %1 to %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>unknown name (device is busy)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Default device</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot access the ring tone device (%1).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot access the speaker (%1).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot access the microphone (%1).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot receive incoming TCP connections.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call transfer - %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sound card cannot be set to full duplex.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot set buffer size on sound card.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sound card cannot be set to %1 channels.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot set sound card to 16 bits recording.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot set sound card to 16 bits playing.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot set sound card sample rate to %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Opening ALSA driver failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot open ALSA driver for PCM playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot open ALSA driver for PCM capture</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot resolve STUN server: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>public IP: %1 --&gt; private IP: %2 (SIP signaling)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>public IP: %1-%2 --&gt; private IP: %3-%4 (RTP/RTCP)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot reach the STUN server: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If you are behind a firewall then you need to open the following UDP ports.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Port %1 (SIP signaling)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ports %1-%2 (RTP/RTCP)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NAT type discovery via STUN failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to create file %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to write data to file %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to send message.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cannot lock %1 .</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UserProfileForm</name>
+ <message>
+ <source>Twinkle - User Profile</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User profile:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select which profile you want to edit.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SIP server</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Voice mail</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Instant message</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Presence</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RTP audio</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SIP protocol</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transport/NAT</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Address format</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Timers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scripts</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Security</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select a category for which you want to see or modify the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Accept and save your changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Undo all your changes and close the window.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SIP account</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;User name*:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Domain*:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Or&amp;ganization:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The SIP user name given to you by your provider. It is the user part in your SIP address, &lt;b&gt;username&lt;/b&gt;@domain.com This could be a telephone number.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The domain part of your SIP address, username@&lt;b&gt;domain.com&lt;/b&gt;. Instead of a real domain this could also be the hostname or IP address of your &lt;b&gt;SIP proxy&lt;/b&gt;. If you want direct IP phone to IP phone communications then you fill in the hostname or IP address of your computer.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You may fill in the name of your organization. When you make a call, this might be shown to the called party.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SIP authentication</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Realm:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Authentication &amp;name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Registrar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Registrar:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Expiry:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The registration expiry time that Twinkle will request.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>seconds</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Re&amp;gister at startup</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+G</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add q-value to registration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The q-value is a value between 0.000 and 1.000. A higher value means a higher priority.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Outbound Proxy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Use outbound proxy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+U</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Outbound &amp;proxy:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Send in-dialog requests to proxy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+S</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Don&apos;t send a request to proxy if its destination can be resolved locally.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+D</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of your outbound proxy.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Co&amp;decs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Codecs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Available codecs:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G.711 A-law</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G.711 u-law</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>GSM</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>speex-nb (8 kHz)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>speex-wb (16 kHz)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>speex-uwb (32 kHz)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>List of available codecs.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move a codec from the list of available codecs to the list of active codecs.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move a codec from the list of active codecs to the list of available codecs.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active codecs:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move a codec upwards in the list of active codecs, i.e. increase its preference of use.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move a codec downwards in the list of active codecs, i.e. decrease its preference of use.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;G.711/G.726 payload size:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The preferred payload size for the G.711 and G.726 codecs.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ms</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Follow codec preference from far end on incoming calls</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+F</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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.
+&lt;p&gt;
+If you disable this option, then the first codec from the active codecs that is also in the SDP offer is picked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Follow codec &amp;preference from far end on outgoing calls</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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.
+&lt;p&gt;
+If you disable this option, then the first codec from the active codecs that is also in the SDP answer is picked.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;iLBC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>iLBC</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>i&amp;LBC payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>iLBC &amp;payload size (ms):</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for iLBC.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>20</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>30</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The preferred payload size for iLBC.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Speex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Speex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Perceptual &amp;enhancement</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+E</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Ultra wide band payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+V</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Wide band payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+B</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Variable bit-rate (VBR) allows a codec to change its bit-rate dynamically to adapt to the &quot;difficulty&quot; 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&apos;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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for speex wide band.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Co&amp;mplexity:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Discontinuous transmission is an addition to VAD/VBR operation, that allows to stop transmitting completely when the background noise is stationary.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for speex narrow band.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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&apos;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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Narrow band payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G.726</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G.726 &amp;40 kbps payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 40 kbps.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 32 kbps.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G.726 &amp;24 kbps payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 24 kbps.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G.726 &amp;32 kbps payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for G.726 16 kbps.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>G.726 &amp;16 kbps payload type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Codeword &amp;packing order:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RFC 3551</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ATM AAL2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DT&amp;MF</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DTMF</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The dynamic type value (96 or higher) to be used for DTMF events (RFC 2833).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DTMF vo&amp;lume:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The power level of the DTMF tone in dB.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The pause after a DTMF tone.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DTMF &amp;duration:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DTMF payload &amp;type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DTMF &amp;pause:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>dB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Duration of a DTMF tone.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>DTMF t&amp;ransport:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Auto</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RFC 2833</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inband</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Out-of-band (SIP INFO)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;h2&gt;RFC 2833&lt;/h2&gt;
+&lt;p&gt;Send DTMF tones as RFC 2833 telephone events.&lt;/p&gt;
+&lt;h2&gt;Inband&lt;/h2&gt;
+&lt;p&gt;Send DTMF inband.&lt;/p&gt;
+&lt;h2&gt;Auto&lt;/h2&gt;
+&lt;p&gt;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.
+&lt;/p&gt;
+&lt;h2&gt;Out-of-band (SIP INFO)&lt;/h2&gt;
+&lt;p&gt;
+Send DTMF out-of-band via a SIP INFO request.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Protocol options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call &amp;Hold variant:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RFC 2543</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>RFC 3264</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allow m&amp;issing Contact header in 200 OK on REGISTER</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+I</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Max-Forwards header is mandatory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+M</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Put &amp;registration expiry time in contact header</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+R</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Use compact header names</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if compact header names should be used for headers that have a compact form.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allow SDP change during call setup</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;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.&lt;/p&gt;
+&lt;p&gt;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.&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use domain &amp;name to create a unique contact header value</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+N</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Twinkle creates a unique contact header value by combining the SIP user name and domain:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;tt&gt;&amp;nbsp;user_domain@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+This way 2 user profiles, having the same user name but different domain names, have unique contact addresses and hence can be activated simultaneously.
+&lt;/p&gt;
+&lt;p&gt;
+Some proxies do not handle a contact header value like this. You can disable this option to get a contact header value like this:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;tt&gt;&amp;nbsp;user@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+This format is what most SIP phones use.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Encode Via, Route, Record-Route as list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redirection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Allow redirection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should redirect a request if a 3XX response is received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ask user &amp;permission to redirect</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should ask the user before redirecting a request when a 3XX response is received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Max re&amp;directions:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SIP extensions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>disabled</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>supported</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>required</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>preferred</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if the 100rel extension (PRACK) is supported:&lt;br&gt;&lt;br&gt;
+&lt;b&gt;disabled&lt;/b&gt;: 100rel extension is disabled
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;supported&lt;/b&gt;: 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.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;required&lt;/b&gt;: 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.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;preferred&lt;/b&gt;: 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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;100 rel (PRACK):</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Replaces</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if the Replaces-extenstion is supported.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>REFER</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call transfer (REFER)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+T</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should transfer a call if a REFER request is received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>As&amp;k user permission to transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+K</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should ask the user before transferring a call when a REFER request is received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hold call &amp;with referrer while setting up call to transfer target</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+W</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should put the current call on hold when a REFER request to transfer a call is received.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ho&amp;ld call with referee before sending REFER</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+L</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Indicates if Twinkle should put the current call on hold when you transfer a call.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Auto re&amp;fresh subscription to refer event while call transfer is not finished</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attended refer to AoR (Address of Record)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Privacy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Privacy options</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Send P-Preferred-Identity header when hiding user identity</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Include a P-Preferred-Identity header with your identity in an INVITE request for a call with identity hiding.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SIP transport</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UDP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>T&amp;ransport protocol:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>UDP t&amp;hreshold:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Messages larger than the threshold are sent via TCP. Smaller messages are sent via UDP.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NAT traversal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;NAT traversal not needed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose this option when there is no NAT device between you and your SIP proxy or when your SIP provider offers hosted NAT traversal.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Use statically configured public IP address inside SIP messages</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.&lt;br&gt;&lt;br&gt;
+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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &amp;STUN (does not work for incoming TCP)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose this option when your SIP provider offers a STUN server for NAT traversal.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&amp;TUN server:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of the STUN server.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Public IP address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The public IP address of your NAT.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Telephone numbers</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Only &amp;display user part of URI for telephone number</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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 &quot;123456&quot; to the user. A URI indicates a telephone number if it contains the &quot;user=phone&quot; parameter or when it has a numerical user part and you ticked the next option.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;URI with numerical user part is a telephone number</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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 &quot;user=phone&quot; parameter to such a URI.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Remove special symbols from numerical dial strings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Special symbols:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The special symbols that may be part of a telephone number for nice formatting, but must be removed when dialing.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number conversion</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Match expression</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Replace</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+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 &apos;00&apos; instead of the &apos;+&apos;, or you are at the office and all your numbers need to be prefixed with a &apos;9&apos; to access an outside line. Here you can specify number format conversion using Perl style regular expressions and format strings.
+&lt;/p&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;p&gt;
+The number conversion rules are also applied to incoming calls, so the numbers are displayed in the format you want.
+&lt;/p&gt;
+&lt;h3&gt;Example 1&lt;/h3&gt;
+&lt;p&gt;
+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 &apos;+31&apos; and replace it by a &apos;0&apos;. For dialling numbers abroad you just want to replace the &apos;+&apos; by &apos;00&apos;.
+&lt;/p&gt;
+&lt;p&gt;
+The following rules will do the trick:
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expression = \+31([0-9]*) , Replace = 0$1&lt;br&gt;
+Match expression = \+([0-9]*) , Replace = 00$1&lt;/br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;h3&gt;Example 2&lt;/h3&gt;
+&lt;p&gt;
+You are at work and all telephone numbers starting with a 0 should be prefixed with a 9 for an outside line.
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expression = 0[0-9]* , Replace = 9$&amp;&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move the selected number conversion rule upwards in the list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move the selected number conversion rule downwards in the list.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add a number conversion rule.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Re&amp;move</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remove the selected number conversion rule.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit the selected number conversion rule.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type a telephone number here an press the Test button to see how it is converted by the list of number conversion rules.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Test</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Test how a number is converted by the number conversion rules.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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 &quot;480 User Not Responding&quot;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>NAT &amp;keep alive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;No answer:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select ring back tone file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select ring tone file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ring &amp;back tone:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Specify the file name of a .wav file that you want to be played as ring back tone for this user.
+&lt;/p&gt;
+&lt;p&gt;
+This ring back tone overrides the ring back tone settings in the system settings.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+Specify the file name of a .wav file that you want to be played as ring tone for this user.
+&lt;/p&gt;
+&lt;p&gt;
+This ring tone overrides the ring tone settings in the system settings.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Ring tone:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you release a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing SIP BYE request are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=local_release&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the BYE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select script file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when an incoming call fails.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing SIP failure response are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_failed&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; contains the status code of the failure response. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when the remote party releases a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming SIP BYE request are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=remote_release&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the BYE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+You can customize the way Twinkle handles incoming calls. Twinkle can call a script when a call comes in. Based on the ouput 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.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Note:&lt;/b&gt; 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 &lt;b&gt;end&lt;/b&gt; and keep on running. Twinkle will continue when it receives the &lt;b&gt;end&lt;/b&gt; parameter.
+&lt;/p&gt;
+&lt;p&gt;
+With your script you can customize call handling by outputing one or more of the following parameters to stdout. Each parameter should be on a separate line.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+action=[ continue | reject | dnd | redirect | autoanswer ]&lt;br&gt;
+reason=&amp;lt;string&amp;gt;&lt;br&gt;
+contact=&amp;lt;address to redirect to&amp;gt;&lt;br&gt;
+caller_name=&amp;lt;name of caller to display&amp;gt;&lt;br&gt;
+ringtone=&amp;lt;file name of .wav file&amp;gt;&lt;br&gt;
+display_msg=&amp;lt;message to show on display&amp;gt;&lt;br&gt;
+end&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;/p&gt;
+&lt;h2&gt;Parameters&lt;/h2&gt;
+&lt;h3&gt;action&lt;/h3&gt;
+&lt;p&gt;
+&lt;b&gt;continue&lt;/b&gt; - continue call handling as usual&lt;br&gt;
+&lt;b&gt;reject&lt;/b&gt; - reject call&lt;br&gt;
+&lt;b&gt;dnd&lt;/b&gt; - deny call with do not disturb indication&lt;br&gt;
+&lt;b&gt;redirect&lt;/b&gt; - redirect call to address specified by &lt;b&gt;contact&lt;/b&gt;&lt;br&gt;
+&lt;b&gt;autoanswer&lt;/b&gt; - automatically answer a call&lt;br&gt;
+&lt;/p&gt;
+&lt;p&gt;
+When the script does not write an action to stdout, then the default action is continue.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;reason: &lt;/b&gt;
+With the reason parameter you can set the reason string for reject or dnd. This might be shown to the far-end user.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;caller_name: &lt;/b&gt;
+This parameter will override the display name of the caller.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;ringtone: &lt;/b&gt;
+The ringtone parameter specifies the .wav file that will be played as ring tone when action is continue.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+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 &lt;b&gt;SIP_&amp;lt;HEADER_NAME&amp;gt;&lt;/b&gt; E.g. SIP_FROM contains the value of the from header.
+&lt;/p&gt;
+&lt;p&gt;
+TWINKLE_TRIGGER=in_call. SIPREQUEST_METHOD=INVITE. The request-URI of the INVITE will be passed in &lt;b&gt;SIPREQUEST_URI&lt;/b&gt;. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when the remote party answers your call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming 200 OK are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_answered&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you answer an incoming call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing 200 OK are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_answered&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call released locall&amp;y:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when an outgoing call fails.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming SIP failure response are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_failed&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; contains the status code of the failure response. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;p&gt;
+This script is called when you make a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing INVITE are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=INVITE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the INVITE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Outgoing call a&amp;nswered:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Incoming call &amp;failed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Incoming call:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Call released &amp;remotely:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Incoming call &amp;answered:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>O&amp;utgoing call:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Out&amp;going call failed:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Enable ZRTP/SRTP encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ZRTP settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>O&amp;nly encrypt audio if remote party indicated ZRTP support in SDP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Indicate ZRTP support in SDP</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Twinkle will indicate ZRTP support during call setup in its signalling.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Popup warning when remote party disables encryption during call</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Voice mail address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The SIP address or telephone number to access your voice mail.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unsollicited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sollicited</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&lt;H2&gt;Message waiting indication type&lt;/H2&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;H3&gt;Unsollicited&lt;/H3&gt;
+&lt;p&gt;
+Asterisk provides unsollicited message waiting indication.
+&lt;/p&gt;
+&lt;H3&gt;Sollicited&lt;/H3&gt;
+&lt;p&gt;
+Sollicited message waiting indication as specified by RFC 3842.
+&lt;/p&gt;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;MWI type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sollicited MWI</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Subscription &amp;duration:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mailbox &amp;user name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of your voice mailbox server.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your user name for accessing your voice mailbox.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mailbox &amp;server:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Via outbound &amp;proxy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Check this option if Twinkle should send SIP messages to the mailbox server via the outbound proxy.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Maximum number of sessions:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When you have this number of instant message sessions open, new incoming message sessions will be rejected.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your presence</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Publish availability at startup</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Publish your availability at startup.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Publication &amp;refresh interval (sec):</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Refresh rate of presence publications.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Buddy presence</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Subscription refresh interval (sec):</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Refresh rate of presence subscriptions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dynamic payload type %1 is used more than once.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You must fill in a user name for your SIP account.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid domain.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid user name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid value for registrar.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid value for outbound proxy.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You must fill in a mailbox user name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You must fill in a mailbox server</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid mailbox server.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid mailbox user name.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Value for public IP address missing.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid value for STUN server.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ring tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose ring tone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Ring back tones</source>
+ <comment>Description of .wav files in file dialog</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose incoming call script</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose incoming call answered script</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose incoming call failed script</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose outgoing call script</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose outgoing call answered script</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose outgoing call failed script</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose local release script</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose remote release script</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 converts to %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>P&amp;ersistent TCP connection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Send composing indications when typing a message.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Twinkle sends a composing indication when you type a message. This way the recipient can see that you are typing.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>AKA AM&amp;F:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>A&amp;KA OP:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Authentication management field for AKAv1-MD5 authentication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Operator variant key for AKAv1-MD5 authentication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Prepr&amp;ocessing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preprocessing (improves quality at remote end)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Automatic gain control</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automatic gain control &amp;level:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Automatic gain control level represents percentual value of automatic gain setting of a microphone. Recommended value is about 25%.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Voice activity detection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When enabled, voice activity detection detects whether the input signal represents a speech or a silence/background noise.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Noise reduction</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The noise reduction can be used to reduce the amount of background noise present in the input signal. This provides higher quality speech.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Acoustic &amp;Echo Cancellation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Variable &amp;bit-rate</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Discontinuous &amp;Transmission</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Quality:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Speex is a lossy codec, which means that it achives 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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>bytes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use tel-URI for telephone &amp;number</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Expand a dialed telephone number to a tel-URI instead of a sip-URI.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Accept call &amp;transfer request (incoming REFER)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allow call transfer while consultation in progress</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable NAT &amp;keep alive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send UDP NAT keep alive packets.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WizardForm</name>
+ <message>
+ <source>Twinkle - Wizard</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The hostname, domain name or IP address of the STUN server.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&amp;TUN server:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The SIP user name given to you by your provider. It is the user part in your SIP address, &lt;b&gt;username&lt;/b&gt;@domain.com This could be a telephone number.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Domain*:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose your SIP service provider. If your SIP service provider is not in the list, then select &lt;b&gt;Other&lt;/b&gt; and fill in the settings you received from your provider.&lt;br&gt;&lt;br&gt;
+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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Authentication name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Your name:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The domain part of your SIP address, username@&lt;b&gt;domain.com&lt;/b&gt;. Instead of a real domain this could also be the hostname or IP address of your &lt;b&gt;SIP proxy&lt;/b&gt;. If you want direct IP phone to IP phone communications then you fill in the hostname or IP address of your computer.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SIP pro&amp;xy:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;SIP service provider:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;User name*:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Your password for authentication.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+O</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+C</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>None (direct IP to IP calls)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Other</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User profile wizard:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You must fill in a user name for your SIP account.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>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.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid value for SIP proxy.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Invalid value for STUN server.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>YesNoDialog</name>
+ <message>
+ <source>&amp;Yes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&amp;No</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/src/gui/logviewform.ui b/src/gui/logviewform.ui
new file mode 100644
index 0000000..c99d24c
--- /dev/null
+++ b/src/gui/logviewform.ui
@@ -0,0 +1,123 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>LogViewForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>LogViewForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>599</width>
+ <height>472</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Log</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTextEdit" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>logTextEdit</cstring>
+ </property>
+ <property name="textFormat">
+ <enum>PlainText</enum>
+ </property>
+ <property name="wordWrap">
+ <enum>NoWrap</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Contents of the current log file (~/.twinkle/twinkle.log)</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>closePushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ <property name="accel">
+ <string>Alt+C</string>
+ </property>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer23</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>360</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>clearPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>C&amp;lear</string>
+ </property>
+ <property name="accel">
+ <string>Alt+L</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Clear the log window. This does &lt;b&gt;not&lt;/b&gt; clear the log file itself.</string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>closePushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>LogViewForm</receiver>
+ <slot>close()</slot>
+ </connection>
+ <connection>
+ <sender>clearPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>LogViewForm</receiver>
+ <slot>clear()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>logTextEdit</tabstop>
+ <tabstop>clearPushButton</tabstop>
+ <tabstop>closePushButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in declaration">qfile.h</include>
+ <include location="local" impldecl="in declaration">qtextstream.h</include>
+ <include location="local" impldecl="in implementation">log.h</include>
+ <include location="local" impldecl="in implementation">qdialog.h</include>
+ <include location="local" impldecl="in implementation">qstring.h</include>
+ <include location="local" impldecl="in implementation">audits/memman.h</include>
+ <include location="local" impldecl="in implementation">logviewform.ui.h</include>
+</includes>
+<variables>
+ <variable access="private">QFile *logfile;</variable>
+ <variable access="private">QTextStream *logstream;</variable>
+</variables>
+<slots>
+ <slot>show()</slot>
+ <slot>closeEvent( QCloseEvent * ev )</slot>
+ <slot>update( bool log_zapped )</slot>
+ <slot>clear()</slot>
+</slots>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/logviewform.ui.h b/src/gui/logviewform.ui.h
new file mode 100644
index 0000000..859de0d
--- /dev/null
+++ b/src/gui/logviewform.ui.h
@@ -0,0 +1,98 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you want to add, delete, or rename functions or slots, use
+** Qt Designer to update this file, preserving your code.
+**
+** You should not define a constructor or destructor in this file.
+** Instead, write your code in functions called init() and destroy().
+** These will automatically be called by the form's constructor and
+** destructor.
+*****************************************************************************/
+
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+void LogViewForm::show()
+{
+ if (isShown()) {
+ raise();
+ return;
+ }
+
+ QString fname = log_file->get_filename().c_str();
+ logfile = new QFile(fname);
+ MEMMAN_NEW(logfile);
+ logstream = NULL;
+ if (logfile->open(IO_ReadOnly)) {
+ logstream = new QTextStream(logfile);
+ MEMMAN_NEW(logstream);
+ logTextEdit->setText(logstream->read());
+
+ // Set cursor position at the end of text
+ logTextEdit->scrollToBottom();
+ }
+
+ log_file->enable_inform_user(true);
+
+ QDialog::show();
+ raise();
+}
+
+void LogViewForm::closeEvent( QCloseEvent *ev )
+{
+ log_file->enable_inform_user(false);
+ logTextEdit->clear();
+
+ if (logstream) {
+ MEMMAN_DELETE(logstream);
+ delete logstream;
+ logstream = NULL;
+ }
+
+ logfile->close();
+ MEMMAN_DELETE(logfile);
+ delete logfile;
+ logfile = NULL;
+
+ QDialog::closeEvent(ev);
+}
+
+void LogViewForm::update(bool log_zapped)
+{
+ if (!isShown()) return;
+
+ if (log_zapped) {
+ close();
+ show();
+ return;
+ }
+
+ if (logstream) {
+ QString s = logstream->read();
+ if (!s.isNull() && !s.isEmpty()) {
+ logTextEdit->append(s);
+ }
+ }
+}
+
+void LogViewForm::clear()
+{
+ logTextEdit->clear();
+}
+
diff --git a/src/gui/main.cpp b/src/gui/main.cpp
new file mode 100644
index 0000000..36242f9
--- /dev/null
+++ b/src/gui/main.cpp
@@ -0,0 +1,1201 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include "twinkle_config.h"
+
+#ifdef HAVE_KDE
+#include <kapplication.h>
+#include <kcmdlineargs.h>
+#endif
+
+#include <qapplication.h>
+#include <qtranslator.h>
+#include <qmime.h>
+#include <qprogressdialog.h>
+#include <qtextcodec.h>
+
+#include "mphoneform.h"
+
+#include <iostream>
+#include <string>
+#include <cstdlib>
+#include <cstring>
+#include <ctime>
+#include <unistd.h>
+
+#include "address_book.h"
+#include "address_finder.h"
+#include "call_history.h"
+#include "cmd_socket.h"
+#include "events.h"
+#include "listener.h"
+#include "log.h"
+#include "protocol.h"
+#include "sender.h"
+#include "transaction_mgr.h"
+#include "twinkleapplication.h"
+#include "user.h"
+#include "util.h"
+#include "phone.h"
+#include "gui.h"
+#include "qt_translator.h"
+#include "command_args.h"
+#include "sockets/connection_table.h"
+#include "sockets/interfaces.h"
+#include "sockets/socket.h"
+#include "threads/thread.h"
+#include "utils/mime_database.h"
+#include "audits/memman.h"
+
+using namespace std;
+using namespace utils;
+
+// Class to initialize the random generator before objects of
+// other classes are created. Initializing just from the main function
+// is too late.
+class t_init_rand {
+public:
+ t_init_rand();
+};
+
+t_init_rand::t_init_rand() { srand(time(NULL)); }
+
+// Initialize random generator
+t_init_rand init_rand;
+
+// Language translator for the core of Twinkle
+t_translator *translator = NULL;
+
+// Indicates if application is ending (because user pressed Quit)
+bool end_app;
+
+// Memory manager for memory leak tracing
+t_memman *memman;
+
+// IP address on which the phone is running
+string user_host;
+
+// Local host name
+string local_hostname;
+
+// SIP UDP socket for sending and receiving signaling
+t_socket_udp *sip_socket;
+
+// SIP TCP socket for sending and receiving signaling
+t_socket_tcp *sip_socket_tcp;
+
+// SIP connection table for connection oriented transport
+t_connection_table *connection_table;
+
+// Event queue that is handled by the transaction manager thread
+// The following threads write to this queue
+// - UDP listener
+// - transaction layer
+// - timekeeper
+t_event_queue *evq_trans_mgr;
+
+// Event queue that is handled by the UDP sender thread
+// The following threads write to this queue:
+// - phone UAS
+// - phone UAC
+// - transaction manager
+t_event_queue *evq_sender;
+
+// Event queue that is handled by the transaction layer thread
+// The following threads write to this queue
+// - transaction manager
+// - timekeeper
+t_event_queue *evq_trans_layer;
+
+// Event queue that is handled by the phone timekeeper thread
+// The following threads write into this queue
+// - phone UAS
+// - phone UAC
+// - transaction manager
+t_event_queue *evq_timekeeper;
+
+// The timekeeper
+t_timekeeper *timekeeper;
+
+// The transaction manager
+t_transaction_mgr *transaction_mgr;
+
+// The phone
+t_phone *phone;
+
+// User interface
+t_userintf *ui;
+
+// Log file
+t_log *log_file;
+
+// System config
+t_sys_settings *sys_config;
+
+// Call history
+t_call_history *call_history;
+
+// Local address book
+t_address_book *ab_local;
+
+// Mime database
+t_mime_database *mime_database;
+
+/** Command arguments. */
+t_command_args g_cmd_args;
+
+// Thread id of main thread
+pthread_t thread_id_main;
+
+// Indicates if LinuxThreads or NPTL is active.
+bool threading_is_LinuxThreads;
+
+
+/**
+ * Parse arguments passed to application
+ * @param argc [in] Number of arguments
+ * @param argv [in] Array of arguments
+ * @param cli_mode [out] Indicates if Twinkle must run in CLI mode.
+ * @param override_lock_file [out] Indicates if an existing lock file must be overriden.
+ * @param config_files [out] User profiles passed on the command line.
+ * @param remain_argc [out] The number of arguments not parsed by this function.
+ * @param remain_argv [out] The arguments not parsed by this function.
+ * remain_argv[0] == argv[0]
+ */
+void parse_main_args(int argc, char **argv, bool &cli_mode, bool &override_lock_file,
+ list<string> &config_files, int &remain_argc, char **&remain_argv)
+{
+ cli_mode = false;
+ override_lock_file = false;
+ config_files.clear();
+
+ // Initialize the remaining arguments with the first argument (application name)
+ // from the original arguments.
+ remain_argv = (char**)malloc(argc * sizeof(char*));
+ remain_argv[0] = argv[0];
+ remain_argc = 1;
+
+ for (int i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) {
+ // Help
+ cout << "Usage: twinkle [options]\n\n";
+ cout << "Options:\n";
+ cout << " -c";
+ cout << "\t\tRun in command line interface (CLI) mode\n";
+ cout << endl;
+ cout << " --share <dir>";
+ cout << "\tSet the share directory.\n";
+ cout << endl;
+ cout << " -f <profile>";
+ cout << "\tStartup with a specific profile. You will not be requested\n";
+ cout << "\t\tto choose a profile at startup. The profiles that you created\n";
+ cout << "\t\tare the .cfg files in your .twinkle directory.\n";
+ cout << "\t\tYou may specify multiple profiles separated by spaces.\n";
+ cout << endl;
+ cout << " --force";
+ cout << "\tIf a lock file is detected at startup, then override it\n";
+ cout << "\t\tand startup.\n";
+ cout << endl;
+#if 0
+ // DEPRECATED
+ cout << " -i <IP addr>";
+ cout << "\tIf you have multiple IP addresses on your computer,\n";
+ cout << "\t\tthen you can supply the IP address to use here.\n";
+ cout << endl;
+#endif
+ cout << " --sip-port <port>\n";
+ cout << "\t\tPort for SIP signalling.\n";
+ cout << "\t\tThis port overrides the port from the system settings.\n";
+ cout << endl;
+ cout << " --rtp-port <port>\n";
+ cout << "\t\tPort for RTP.\n";
+ cout << "\t\tThis port overrides the port from the system settings.\n";
+ cout << endl;
+#if 0
+ // DEPRECATED
+ cout << " --nic <NIC>";
+ cout << "\tIf you have multiple NICs on your computer,\n";
+ cout << "\t\tthen you can supply the NIC name to use here (e.g. eth0).\n";
+ cout << endl;
+#endif
+ cout << " --call <address>\n";
+ cout << "\t\tInstruct Twinkle to call the address.\n";
+ cout << "\t\tWhen Twinkle is already running, this will instruct the running\n";
+ cout << "\t\tprocess to call the address.\n";
+ cout << "\t\tThe address may be a full or partial SIP URI. A partial SIP URI\n";
+ cout << "\t\twill be completed with the information from the user profile.\n";
+ cout << endl;
+ cout << "\t\tA subject may be passed by appending '?subject=<subject>'\n";
+ cout << "\t\tto the address.\n";
+ cout << endl;
+ cout << "\t\tExamples:\n";
+ cout << "\t\ttwinkle --call 123456\n";
+ cout << "\t\ttwinkle --call sip:example@example.com?subject=hello\n";
+ cout << endl;
+ cout << " --cmd <cli command>\n";
+ cout << "\t\tInstruct Twinkle to execute the CLI command. You can run\n";
+ cout << "\t\tall commands from the command line interface mode.\n";
+ cout << "\t\tWhen Twinkle is already running, this will instruct the running\n";
+ cout << "\t\tprocess to execute the CLI command.\n";
+ cout << endl;
+ cout << "\t\tExamples:\n";
+ cout << "\t\ttwinkle --cmd answer\n";
+ cout << "\t\ttwinkle --cmd mute\n";
+ cout << "\t\ttwinkle --cmd 'transfer 12345'\n";
+ cout << endl;
+ cout << " --immediate";
+ cout << "\tThis option can be used in conjunction with --call or --cmd\n";
+ cout << "\t\tIt indicates the the command or call is to be performed\n";
+ cout << "\t\timmediately without asking the user for any confirmation.\n";
+ cout << endl;
+ cout << " --set-profile <profile>\n";
+ cout << "\t\tMake <profile> the active profile.\n";
+ cout << "\t\tWhen using this option in conjuction with --call and --cmd,\n";
+ cout << "\t\tthen the profile is activated before executing --call or \n";
+ cout << "\t\t--cmd.\n";
+ cout << endl;
+ cout << " --show";
+ cout << "\t\tInstruct a running instance of Twinkle to show the main window\n";
+ cout << "\t\tand take focus.\n";
+ cout << endl;
+ cout << " --hide";
+ cout << "\t\tInstruct a running instance of Twinkle to hide in the sytem tray.\n";
+ cout << "\t\tIf no system tray is used, then Twinkle will minimize.\n";
+ cout << endl;
+ cout << " --help-cli [cli command]\n";
+ cout << "\t\tWithout a cli command this option lists all available CLI\n";
+ cout << "\t\tcommands. With a CLI command this option prints help on\n";
+ cout << "\t\tthe CLI command.\n";
+ cout << endl;
+ cout << " --version";
+ cout << "\tGet version information.\n";
+ exit(0);
+ } else if (strcmp(argv[i], "--version") == 0) {
+ // Get version
+ QString s = sys_config->about(false).c_str();
+ cout << s;
+ exit(0);
+ } else if (strcmp(argv[i], "-c") == 0) {
+ // CLI mode
+ cli_mode = true;
+ } else if (strcmp(argv[i], "--share") == 0) {
+ if (i < argc - 1 && argv[i+1][0] != '-') {
+ i++;
+ sys_config->set_dir_share(argv[i]);
+ } else {
+ cout << argv[0] << ": ";
+ cout << "Directory missing for option '-share'.\n";
+ exit(0);
+ }
+ } else if (strcmp(argv[i], "-f") == 0) {
+ if (i < argc - 1 && argv[i+1][0] != '-') {
+ while (i < argc -1 && argv[i+1][0] != '-') {
+ i++;
+ // Config file name
+ QString config_file = argv[i];
+ if (!config_file.endsWith(USER_FILE_EXT))
+ {
+ config_file += USER_FILE_EXT;
+ }
+ config_files.push_back(config_file.ascii());
+ }
+ } else {
+ cout << argv[0] << ": ";
+ cout << "Config file name missing for option '-f'.\n";
+ exit(0);
+ }
+ } else if (strcmp(argv[i], "--force") == 0) {
+ override_lock_file = true;
+#if 0
+ // DEPRECATED
+ } else if (strcmp(argv[i], "-i") == 0) {
+ if (i < argc - 1) {
+ i++;
+ // IP address
+ user_host = argv[i];
+ if (!exists_interface(user_host)) {
+ cout << argv[0] << ": ";
+ cout << "There is no interface with IP address ";
+ cout << user_host << endl;
+ exit(0);
+ }
+ } else {
+ cout << argv[0] << ": ";
+ cout << "IP address missing for option '-i'.\n";
+ exit(0);
+ }
+#endif
+ } else if (strcmp(argv[i], "--sip-port") == 0) {
+ if (i < argc - 1) {
+ i++;
+ g_cmd_args.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++;
+ g_cmd_args.override_rtp_port = atoi(argv[i]);
+ } else {
+ cout << argv[0] << ": ";
+ cout << "Port missing for option '--rtp-port'\n";
+ }
+ } else if (strcmp(argv[i], "--call") == 0) {
+ if (i < argc - 1) {
+ i++;
+ // SIP URI
+ g_cmd_args.callto_destination = argv[i];
+
+ if (g_cmd_args.callto_destination.isEmpty()) {
+ cout << argv[0] << ": ";
+ cout << "--call argument may not be empty.\n";
+ exit(0);
+ }
+ } else {
+ cout << argv[0] << ": ";
+ cout << "SIP URI missing for option '--call'.\n";
+ exit(0);
+ }
+ } else if (strcmp(argv[i], "--cmd") == 0) {
+ if (i < argc - 1) {
+ i++;
+ // CLI command
+ g_cmd_args.cli_command = argv[i];
+
+ if (g_cmd_args.cli_command.isEmpty()) {
+ cout << argv[0] << ": ";
+ cout << "--cmd argument may not be empty.\n";
+ exit(0);
+ }
+ } else {
+ cout << argv[0] << ": ";
+ cout << "CLI command missing for option '--cmd'.\n";
+ exit(0);
+ }
+ } else if (strcmp(argv[i], "--immediate") == 0) {
+ // Immediate mode
+ g_cmd_args.cmd_immediate_mode = true;
+ } else if (strcmp(argv[i], "--set-profile") == 0) {
+ if (i < argc - 1) {
+ i++;
+ // Set profile
+ g_cmd_args.cmd_set_profile = argv[i];
+ } else {
+ cout << argv[0] << ": ";
+ cout << "Profile missing for option '--set-profile'.\n";
+ exit(0);
+ }
+ } else if (strcmp(argv[i], "--show") == 0) {
+ // Show main window
+ g_cmd_args.cmd_show = true;
+ } else if (strcmp(argv[i], "--hide") == 0) {
+ // Hide main window
+ g_cmd_args.cmd_hide = true;
+ } else if (strcmp(argv[i], "--help-cli") == 0) {
+ string cmd_help("help ");
+ if (i < argc -1) {
+ i++;
+ // Help CLI
+ cmd_help += argv[i];
+ }
+
+ t_phone p;
+ t_userintf u(&p);
+ u.exec_command(cmd_help);
+ exit(0);
+ } else {
+ // Unknown argument. Assume that it is an Qt/KDE argument.
+ remain_argv[remain_argc++] = argv[i];
+ }
+ }
+
+ if (!g_cmd_args.callto_destination.isEmpty() && !g_cmd_args.cli_command.isEmpty()) {
+ cout << argv[0] << ": ";
+ cout << "--call and --cmd cannot be used at the same time.\n";
+ exit(0);
+ }
+
+ return;
+}
+
+bool open_sip_socket(bool cli_mode) {
+ QString sock_type;
+
+ // Open socket for SIP signaling
+ try {
+ sock_type = "UDP";
+ sip_socket = new t_socket_udp(sys_config->get_sip_port(true));
+ MEMMAN_NEW(sip_socket);
+ if (sip_socket->enable_icmp()) {
+ log_file->write_report("ICMP processing enabled.", "::main");
+ } else {
+ log_file->write_report("ICMP processing disabled.", "::main");
+ }
+
+ sock_type = "TCP";
+ sip_socket_tcp = new t_socket_tcp(sys_config->get_sip_port());
+ MEMMAN_NEW(sip_socket_tcp);
+ } catch (int err) {
+ string msg;
+ if (cli_mode) {
+ msg = QString("Failed to create a %1 socket (SIP) on port %2")
+ .arg(sock_type)
+ .arg(sys_config->get_sip_port()).ascii();
+ } else {
+ msg = qApp->translate("GUI", "Failed to create a %1 socket (SIP) on port %2")
+ .arg(sock_type)
+ .arg(sys_config->get_sip_port()).ascii();
+ }
+ msg += "\n";
+ msg += get_error_str(err);
+ log_file->write_report(msg, "::main", LOG_NORMAL, LOG_CRITICAL);
+ ui->cb_show_msg(msg, MSG_CRITICAL);
+ return false;
+ }
+
+ return true;
+}
+
+QApplication *create_user_interface(bool cli_mode, int argc, char **argv, QTranslator *qtranslator) {
+ QApplication *qa = NULL;
+
+ if (cli_mode) {
+ // CLI mode
+ ui = new t_userintf(phone);
+ MEMMAN_NEW(ui);
+ } else {
+ // GUI mode
+
+#ifdef HAVE_KDE
+ // Store the defualt mime source factory for the embedded icons.
+ // This is created by Qt. The KApplication constructor seems to destroy
+ // this default.
+ QMimeSourceFactory *factory_qt = QMimeSourceFactory::takeDefaultFactory();
+
+ // Initialize the KApplication
+ KCmdLineArgs::init(argc, argv, "twinkle", PRODUCT_NAME, "Soft phone",
+ PRODUCT_VERSION, true);
+ qa = new t_twinkle_application();
+ MEMMAN_NEW(qa);
+
+ // Store the KDE mime source factory
+ QMimeSourceFactory *factory_kde = QMimeSourceFactory::takeDefaultFactory();
+
+ // Make the Qt factory the default to make the embedded icons work.
+ QMimeSourceFactory::setDefaultFactory(factory_qt);
+
+ // Add the KDE factory
+ QMimeSourceFactory::addFactory(factory_kde);
+#else
+ int tmp = argc;
+ qa = new t_twinkle_application(tmp, argv);
+ MEMMAN_NEW(qa);
+#endif
+ QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf8"));
+ QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));
+
+ // Install Qt translator
+ // Do not report to memman as the translator will be deleted
+ // automatically when the QApplication is deleted.
+ qtranslator = new QTranslator(0);
+ qtranslator->load(QString("twinkle_") + QTextCodec::locale(),
+ QString(sys_config->get_dir_lang().c_str()));
+ qa->installTranslator(qtranslator);
+
+ // Create translator for translation of strings from the core
+ translator = new t_qt_translator(qa);
+ MEMMAN_NEW(translator);
+
+ ui = new t_gui(phone);
+ MEMMAN_NEW(ui);
+ }
+
+ return qa;
+}
+
+int main( int argc, char ** argv )
+{
+ string error_msg;
+ bool cli_mode;
+ bool override_lock_file;
+ list<string> config_files;
+
+ // Initialize globals
+ end_app = false;
+
+ // Determine threading implementation
+ threading_is_LinuxThreads = t_thread::is_LinuxThreads();
+
+ QApplication *qa = NULL;
+ QTranslator *qtranslator = NULL;
+
+ // Store id of main thread
+ thread_id_main = t_thread::self();
+
+ memman = new t_memman();
+ MEMMAN_NEW(memman);
+ connection_table = new t_connection_table();
+ MEMMAN_NEW(connection_table);
+ evq_trans_mgr = new t_event_queue();
+ MEMMAN_NEW(evq_trans_mgr);
+ evq_sender = new t_event_queue();
+ MEMMAN_NEW(evq_sender);
+ evq_trans_layer = new t_event_queue();
+ MEMMAN_NEW(evq_trans_layer);
+ evq_timekeeper = new t_event_queue();
+ MEMMAN_NEW(evq_timekeeper);
+ timekeeper = new t_timekeeper();
+ MEMMAN_NEW(timekeeper);
+ transaction_mgr = new t_transaction_mgr();
+ MEMMAN_NEW(transaction_mgr);
+ phone = new t_phone();
+ MEMMAN_NEW(phone);
+
+ // Create system configuration object
+ sys_config = new t_sys_settings();
+ MEMMAN_NEW(sys_config);
+
+ // Parse command line arguments
+ int remain_argc = 0;
+ char **remain_argv = NULL;
+ parse_main_args(argc, argv, cli_mode, override_lock_file, config_files, remain_argc, remain_argv);
+ sys_config->set_override_sip_port(g_cmd_args.override_sip_port);
+ sys_config->set_override_rtp_port(g_cmd_args.override_rtp_port);
+
+ // Checking the environment and creating the lock is done at
+ // this early stage to improve performance of the --call parameter.
+ // Creation of the QApplication object for the GUI is slow.
+ // However for errors, the user interface must be created to give
+ // either a message box or text formatted error.
+
+ // Check requirements on environment
+ // If check fails, then display error after user interface has been
+ // created.
+ string env_error_msg;
+ bool env_check_ok = sys_config->check_environment(env_error_msg);
+
+ // Create a lock file to guarantee that the application runs only once.
+ bool already_running;
+ bool lock_created = false;
+ string lock_error_msg;
+ if (env_check_ok &&
+ !(lock_created = sys_config->create_lock_file(false, lock_error_msg, already_running)))
+ {
+ bool must_exit = false;
+
+ // Show the main window of the running Twinkle process.
+ if (already_running && g_cmd_args.cmd_show) {
+ cmdsocket::cmd_show();
+ must_exit = true;
+ }
+
+ // Hide the main window of the running Twinkle process.
+ if (already_running && g_cmd_args.cmd_hide) {
+ cmdsocket::cmd_hide();
+ must_exit = true;
+ }
+
+ // Activate a profile in the running Twinkle process.
+ if (already_running && !g_cmd_args.cmd_set_profile.isEmpty()) {
+ cmdsocket::cmd_cli(string("user ") + g_cmd_args.cmd_set_profile.ascii(), true);
+ // Do not exit now as this option may be used in conjuction
+ // with --call or --cmd
+ must_exit = true;
+ }
+
+ // If Twinkle is running already and the --call parameter
+ // is present, then send the call destination to the running
+ // Twinkle process.
+ if (already_running && !g_cmd_args.callto_destination.isEmpty()) {
+ cmdsocket::cmd_call(g_cmd_args.callto_destination.ascii(),
+ g_cmd_args.cmd_immediate_mode);
+ exit(0);
+ }
+
+ // If the --cmd parameter is present, send the cli command
+ // to the running Twinkle process
+ if (already_running && !g_cmd_args.cli_command.isEmpty()) {
+ cmdsocket::cmd_cli(g_cmd_args.cli_command.ascii(),
+ g_cmd_args.cmd_immediate_mode);
+ exit(0);
+ }
+
+ // Exit if an instruction for a running instance was given.
+ if (must_exit) {
+ exit(0);
+ }
+ }
+
+ // Read system configuration
+ bool sys_config_read = sys_config->read_config(error_msg);
+ qa = create_user_interface(cli_mode, remain_argc, remain_argv, qtranslator);
+ if (!sys_config_read) {
+ ui->cb_show_msg(error_msg, MSG_CRITICAL);
+ exit(1);
+ }
+
+ user_host = AUTO_IP4_ADDRESS;
+ local_hostname = get_local_hostname();
+
+ if (!env_check_ok) {
+ // Environment is not good
+ // Call the check_environment once more to get proper translation
+ // of the error message. The previous check was done before
+ // the QApplication was created.
+ (void)sys_config->check_environment(env_error_msg);
+ ui->cb_show_msg(env_error_msg, MSG_CRITICAL);
+ exit(1);
+ }
+
+ // Show error if lock file could not be created
+ if (!lock_created) {
+ string msg;
+ // Call create lock file once more to get proper translation of
+ // error message.
+ if (!sys_config->create_lock_file(false, msg, already_running)) {
+ if (already_running) {
+ if (!cli_mode) {
+ msg += "\n\n";
+ msg += qApp->translate("GUI",
+ "Override lock file and start anyway?").ascii();
+ }
+ if (override_lock_file || ui->cb_ask_msg(msg, MSG_WARNING)) {
+ sys_config->delete_lock_file();
+ if (!sys_config->create_lock_file(true, msg,
+ already_running))
+ {
+ ui->cb_show_msg(msg, MSG_CRITICAL);
+ exit(1);
+ }
+ } else {
+ exit(1);
+ }
+ } else {
+ ui->cb_show_msg(msg, MSG_CRITICAL);
+ exit(1);
+ }
+ }
+ // If for some obscure reason the lock file could be
+ // created this time, then continue.
+ }
+
+ // Create log file
+ log_file = new t_log();
+ MEMMAN_NEW(log_file);
+
+ // Write threading implementation to log file. May be useful for debugging.
+ if (threading_is_LinuxThreads) {
+ log_file->write_report("Threading implementation is LinuxThreads.",
+ "::main", LOG_NORMAL, LOG_INFO);
+ } else {
+ log_file->write_report("Threading implementation is NPTL.",
+ "::main", LOG_NORMAL, LOG_INFO);
+ }
+
+ // Check if the previous Twinkle session was stopped by a system
+ // shutdow and now gets restored.
+ if (qa && qa->isSessionRestored()) {
+ QString msg = "Restore session: " + qa->sessionId();
+ log_file->write_report(msg.ascii(), "::main");
+
+ if (sys_config->get_ui_session_id() == qa->sessionId().ascii()) {
+ config_files = sys_config->get_ui_session_active_profiles();
+ // Note: the GUI state is restore in t_gui::run()
+ } else {
+ log_file->write_header("::main", LOG_NORMAL, LOG_WARNING);
+ log_file->write_raw("Cannot restore session.\n");
+ log_file->write_raw("Stored session id: ");
+ log_file->write_raw(sys_config->get_ui_session_id());
+ log_file->write_endl();
+ log_file->write_footer();
+ }
+ }
+
+ // Get default values from system configuration
+ if (config_files.empty()) {
+ list<string> start_user_profiles = sys_config->get_start_user_profiles();
+ for (list<string>::iterator i = start_user_profiles.begin();
+ i != start_user_profiles.end(); i++)
+ {
+ QString config_file = (*i).c_str();
+ config_file += USER_FILE_EXT;
+ config_files.push_back(config_file.ascii());
+ }
+ }
+
+ bool profile_selected = false;
+ while(!profile_selected) {
+ // Select user profile
+ if (config_files.empty()) {
+ if (!ui->select_user_config(config_files)) {
+ sys_config->delete_lock_file();
+ exit(1);
+ }
+ }
+
+ for (list<string>::iterator i = config_files.begin();
+ i != config_files.end(); i++)
+ {
+ t_user user_config;
+
+ // Read user configuration
+ if (user_config.read_config(*i, error_msg)) {
+ t_user *dup_user;
+ if (phone->add_phone_user(
+ user_config, &dup_user))
+ {
+ profile_selected = true;
+ } else {
+ if (cli_mode) {
+ error_msg = QString("The following profiles are both for user %1").arg(user_config.get_name().c_str()).ascii();
+ } else {
+ error_msg = qApp->translate("GUI", "The following profiles are both for user %1").arg(user_config.get_name().c_str()).ascii();
+ }
+ error_msg += ":\n\n";
+ error_msg += user_config.get_profile_name();
+ error_msg += "\n";
+ error_msg += dup_user->get_profile_name();
+ error_msg += "\n\n";
+ if (cli_mode) {
+ error_msg += QString("You can only run multiple profiles for different users.").ascii();
+ error_msg += "\n";
+ error_msg += QString("If these are users for different domains, then enable the following option in your user profile (SIP protocol):");
+ error_msg += "\n";
+ error_msg += QString("Use domain name to create a unique contact header");
+ } else {
+ error_msg += qApp->translate("GUI", "You can only run multiple profiles for different users.").ascii();
+ error_msg += "\n";
+ error_msg += qApp->translate("GUI", "If these are users for different domains, then enable the following option in your user profile (SIP protocol)");
+ error_msg += ":\n";
+ error_msg += qApp->translate("GUI", "Use domain name to create a unique contact header");
+ }
+ ui->cb_show_msg(error_msg, MSG_CRITICAL);
+ profile_selected = false;
+ break;
+ }
+ } else {
+ ui->cb_show_msg(error_msg, MSG_CRITICAL);
+ profile_selected = false;
+ break;
+ }
+ }
+
+ if (profile_selected && !open_sip_socket(cli_mode)) {
+ // Opening SIP socket failed. Let user pick a user profile
+ // again, so he can make changes in settings to fix the error.
+ profile_selected = false;
+ }
+
+ // In CLI mode the user cannot select another profile.
+ if (!profile_selected) {
+ if (cli_mode) {
+ sys_config->delete_lock_file();
+ exit(1);
+ }
+ }
+
+ config_files.clear();
+ }
+
+ // Initialize RTP port settings.
+ phone->init_rtp_ports();
+
+ // Create call history
+ call_history = new t_call_history();
+ MEMMAN_NEW(call_history);
+
+ // Read call history
+ if (!call_history->load(error_msg)) {
+ log_file->write_report(error_msg, "::main", LOG_NORMAL, LOG_WARNING);
+ }
+
+ // Create local address book
+ ab_local = new t_address_book();
+ MEMMAN_NEW(ab_local);
+
+ // Read local address book
+ if (!ab_local->load(error_msg)) {
+ log_file->write_report(error_msg, "::main", LOG_NORMAL, LOG_WARNING);
+ ui->cb_show_msg(error_msg, MSG_WARNING);
+ }
+
+ // Preload the address finder (KABC is only available in GUI mode)
+ if (!cli_mode) {
+ t_address_finder::preload();
+ }
+
+ // Create mime database
+ mime_database = new t_mime_database();
+ MEMMAN_NEW(mime_database);
+ if (!mime_database->load(error_msg)) {
+ log_file->write_report(error_msg, "::main", LOG_NORMAL, LOG_WARNING);
+ }
+
+ // Discover NAT type if STUN is enabled
+ list<t_user *> user_list = phone->ref_users();
+ ui->cb_nat_discovery_progress_start(user_list.size());
+ list<string> msg_list;
+ int progressStep = 0;
+ for (list<t_user *>::iterator i = user_list.begin(); i != user_list.end(); i++) {
+ ui->cb_nat_discovery_progress_step(progressStep);
+
+ if (ui->cb_nat_discovery_cancelled()) {
+ log_file->write_report("User aborted NAT discovery.", "::main");
+ sys_config->delete_lock_file();
+ exit(1);
+ }
+
+ if (!phone->stun_discover_nat(*i, error_msg)) {
+ msg_list.push_back(error_msg);
+ }
+
+ progressStep++;
+ }
+ ui->cb_nat_discovery_finished();
+
+ for (list<string>::iterator i = msg_list.begin();
+ i != msg_list.end(); i++)
+ {
+ ui->cb_show_msg(*i, MSG_WARNING);
+ }
+
+ // Open socket for external commands from the command line
+ string cmd_sock_name = sys_config->get_dir_user();
+ cmd_sock_name += '/';
+ cmd_sock_name += CMD_SOCKNAME;
+ t_socket_local *sock_cmd = NULL;
+ try {
+
+
+ // The local socket may still exist if Twinkle got killed
+ // previously, so remove it if it is still there.
+ unlink(cmd_sock_name.c_str());
+
+ sock_cmd = new t_socket_local();
+ MEMMAN_NEW(sock_cmd);
+ sock_cmd->bind(cmd_sock_name);
+ sock_cmd->listen(5);
+
+ string log_msg = "Created local socket: ";
+ log_msg += cmd_sock_name;
+ log_file->write_report(log_msg, "::main");
+ }
+ catch (int e) {
+ if (sock_cmd) {
+ MEMMAN_DELETE(sock_cmd);
+ delete sock_cmd;
+ sock_cmd = NULL;
+ }
+ string log_msg = "Failed to create local socket: ";
+ log_msg += cmd_sock_name;
+ log_msg += "\n";
+ log_msg += get_error_str(e);
+ log_msg += "\n";
+ log_file->write_report(log_msg, "::main", LOG_NORMAL, LOG_WARNING);
+ }
+
+ // Dedicated thread will catch SIGALRM, SIGINT, SIGTERM, SIGCHLD signals,
+ // therefore all threads must block these signals. Block now, then all
+ // created threads will inherit the signal mask.
+ // In LinuxThreads the sigwait does not work very well, so
+ // in LinuxThreads a signal handler is used instead.
+ if (!threading_is_LinuxThreads) {
+ sigset_t sigset;
+ sigemptyset(&sigset);
+ sigaddset(&sigset, SIGALRM);
+ sigaddset(&sigset, SIGINT);
+ sigaddset(&sigset, SIGTERM);
+ sigaddset(&sigset, SIGCHLD);
+ sigprocmask(SIG_BLOCK, &sigset, NULL);
+ } else {
+ if (!phone->set_sighandler()) {
+ string msg = "Failed to register signal handler.";
+ log_file->write_report(msg, "::main", LOG_NORMAL, LOG_CRITICAL);
+ ui->cb_show_msg(msg, MSG_CRITICAL);
+ sys_config->delete_lock_file();
+ exit(1);
+ }
+ }
+
+ // Ignore SIGPIPE so read from broken sockets will not cause
+ // the process to terminate.
+ (void)signal(SIGPIPE, SIG_IGN);
+
+ // Create threads
+ t_thread *thr_sender;
+ t_thread *thr_tcp_sender;
+ t_thread *thr_listen_udp;
+ t_thread *thr_listen_data_tcp;
+ t_thread *thr_listen_conn_tcp;
+ t_thread *thr_conn_timeout_handler;
+ t_thread *thr_timekeeper;
+ t_thread *thr_alarm_catcher = NULL;
+ t_thread *thr_sig_catcher = NULL;
+ t_thread *thr_trans_mgr;
+ t_thread *thr_phone_uas;
+ t_thread *thr_listen_cmd = NULL;
+
+ try {
+ // SIP sender thread
+ thr_sender = new t_thread(sender_loop, NULL);
+ MEMMAN_NEW(thr_sender);
+
+ // SIP TCP sender thread
+ thr_tcp_sender = new t_thread(tcp_sender_loop, NULL);
+ MEMMAN_NEW(thr_tcp_sender);
+
+ // UDP listener thread
+ thr_listen_udp = new t_thread(listen_udp, NULL);
+ MEMMAN_NEW(thr_listen_udp);
+
+ // TCP data listener thread
+ thr_listen_data_tcp = new t_thread(listen_for_data_tcp, NULL);
+ MEMMAN_NEW(thr_listen_data_tcp);
+
+ // TCP connection listener thread
+ thr_listen_conn_tcp = new t_thread(listen_for_conn_requests_tcp, NULL);
+ MEMMAN_NEW(thr_listen_conn_tcp);
+
+ // Connection timeout handler thread
+ thr_conn_timeout_handler = new t_thread(connection_timeout_main, NULL);
+ MEMMAN_NEW(thr_conn_timeout_handler);
+
+ // Timekeeper thread
+ thr_timekeeper = new t_thread(timekeeper_main, NULL);
+ MEMMAN_NEW(thr_timekeeper);
+
+ if (!threading_is_LinuxThreads) {
+ // Alarm catcher thread
+ thr_alarm_catcher = new t_thread(timekeeper_sigwait, NULL);
+ MEMMAN_NEW(thr_alarm_catcher);
+
+ // Signal catcher thread
+ thr_sig_catcher = new t_thread(phone_sigwait, NULL);
+ MEMMAN_NEW(thr_sig_catcher);
+ }
+
+ // Transaction manager thread
+ thr_trans_mgr = new t_thread(transaction_mgr_main, NULL);
+ MEMMAN_NEW(thr_trans_mgr);
+
+ // Phone thread (UAS)
+ thr_phone_uas = new t_thread(phone_uas_main, NULL);
+ MEMMAN_NEW(thr_phone_uas);
+
+ // External command listener thread
+ if (sock_cmd) {
+ thr_listen_cmd = new t_thread(cmdsocket::listen_cmd, sock_cmd);
+ MEMMAN_NEW(thr_listen_cmd);
+ }
+ } catch (int) {
+ string msg = "Failed to create threads.";
+ log_file->write_report(msg, "::main", LOG_NORMAL, LOG_CRITICAL);
+ ui->cb_show_msg(msg, MSG_CRITICAL);
+ sys_config->delete_lock_file();
+ exit(1);
+ }
+
+ // Validate sound devices
+ if (!sys_config->exec_audio_validation(true, true, true, error_msg)) {
+ ui->cb_show_msg(error_msg, MSG_WARNING);
+ }
+
+ // Start UI event loop (CLI/QApplication/KApplication)
+ try {
+ ui->run();
+ } catch (string e) {
+ string msg = "Exception: ";
+ msg += e;
+ log_file->write_report(msg, "::main", LOG_NORMAL, LOG_CRITICAL);
+ ui->cb_show_msg(msg, MSG_CRITICAL);
+ sys_config->delete_lock_file();
+ exit(1);
+ } catch (...) {
+ string msg = "Unknown exception";
+ log_file->write_report(msg, "::main", LOG_NORMAL, LOG_CRITICAL);
+ ui->cb_show_msg(msg, MSG_CRITICAL);
+ sys_config->delete_lock_file();
+ exit(1);
+ }
+
+ // Application is ending
+ end_app = true;
+
+ // Terminate threads
+ // Kill the threads getting receiving input from the outside world first,
+ // so no new inputs come in during termination.
+ if (thr_listen_cmd) {
+ thr_listen_cmd->cancel();
+ thr_listen_cmd->join();
+ log_file->write_report("thr_listen_cmd stopped.", "::main", LOG_NORMAL, LOG_DEBUG);
+ }
+
+ thr_listen_udp->cancel();
+ thr_listen_udp->join();
+ log_file->write_report("thr_listen_udp stopped.", "::main", LOG_NORMAL, LOG_DEBUG);
+
+ thr_listen_conn_tcp->cancel();
+ thr_listen_conn_tcp->join();
+ log_file->write_report("thr_listen_conn_tcp stopped.", "::main", LOG_NORMAL, LOG_DEBUG);
+
+ connection_table->cancel_select();
+ thr_listen_data_tcp->join();
+ log_file->write_report("thr_listen_data_tcp stopped.", "::main", LOG_NORMAL, LOG_DEBUG);
+ thr_conn_timeout_handler->join();
+ log_file->write_report("thr_conn_timeout_handler stopped.", "::main", LOG_NORMAL, LOG_DEBUG);
+
+ thr_tcp_sender->join();
+ log_file->write_report("thr_tcp_sender stopped.", "::main", LOG_NORMAL, LOG_DEBUG);
+
+ evq_trans_layer->push_quit();
+ thr_phone_uas->join();
+ log_file->write_report("thr_phone_uas stopped.", "::main", LOG_NORMAL, LOG_DEBUG);
+
+ evq_trans_mgr->push_quit();
+ thr_trans_mgr->join();
+
+ if (!threading_is_LinuxThreads) {
+ try {
+ thr_sig_catcher->cancel();
+ } catch (int) {
+ // Thread terminated already by itself
+ }
+ thr_sig_catcher->join();
+ log_file->write_report("thr_sig_catcher stopped.", "::main",
+ LOG_NORMAL, LOG_DEBUG);
+
+ thr_alarm_catcher->cancel();
+ thr_alarm_catcher->join();
+ log_file->write_report("thr_alarm_catcher stopped.", "::main",
+ LOG_NORMAL, LOG_DEBUG);
+ }
+
+ evq_timekeeper->push_quit();
+ thr_timekeeper->join();
+ log_file->write_report("thr_timekeeper stopped.", "::main", LOG_NORMAL, LOG_DEBUG);
+
+ evq_sender->push_quit();
+ thr_sender->join();
+ log_file->write_report("thr_sender stopped.", "::main", LOG_NORMAL, LOG_DEBUG);
+
+ sys_config->remove_all_tmp_files();
+
+ if (thr_listen_cmd) {
+ MEMMAN_DELETE(thr_listen_cmd);
+ delete thr_listen_cmd;
+ }
+
+ MEMMAN_DELETE(thr_phone_uas);
+ delete thr_phone_uas;
+ MEMMAN_DELETE(thr_trans_mgr);
+ delete thr_trans_mgr;
+ MEMMAN_DELETE(thr_timekeeper);
+ delete thr_timekeeper;
+ MEMMAN_DELETE(thr_conn_timeout_handler);
+ delete thr_conn_timeout_handler;
+
+ if (!threading_is_LinuxThreads) {
+ MEMMAN_DELETE(thr_sig_catcher);
+ delete thr_sig_catcher;
+ MEMMAN_DELETE(thr_alarm_catcher);
+ delete thr_alarm_catcher;
+ }
+
+ MEMMAN_DELETE(thr_listen_udp);
+ delete thr_listen_udp;
+ MEMMAN_DELETE(thr_sender);
+ delete thr_sender;
+ MEMMAN_DELETE(thr_tcp_sender);
+ delete thr_tcp_sender;
+
+ MEMMAN_DELETE(thr_listen_data_tcp);
+ delete thr_listen_data_tcp;
+ MEMMAN_DELETE(thr_listen_conn_tcp);
+ delete thr_listen_conn_tcp;
+
+ MEMMAN_DELETE(mime_database);
+ delete mime_database;
+ MEMMAN_DELETE(ab_local);
+ delete ab_local;
+ MEMMAN_DELETE(call_history);
+ delete call_history;
+ call_history = NULL;
+
+ MEMMAN_DELETE(ui);
+ delete ui;
+ ui = NULL;
+
+ MEMMAN_DELETE(connection_table);
+ delete connection_table;
+ MEMMAN_DELETE(sip_socket_tcp);
+ delete sip_socket_tcp;
+ MEMMAN_DELETE(sip_socket);
+ delete sip_socket;
+
+ if (sock_cmd) {
+ MEMMAN_DELETE(sock_cmd);
+ delete sock_cmd;
+ unlink(cmd_sock_name.c_str());
+ }
+
+ MEMMAN_DELETE(phone);
+ delete phone;
+ MEMMAN_DELETE(transaction_mgr);
+ delete transaction_mgr;
+ MEMMAN_DELETE(timekeeper);
+ delete timekeeper;
+ MEMMAN_DELETE(evq_trans_mgr);
+ delete evq_trans_mgr;
+ MEMMAN_DELETE(evq_sender);
+ delete evq_sender;
+ MEMMAN_DELETE(evq_trans_layer);
+ delete evq_trans_layer;
+ MEMMAN_DELETE(evq_timekeeper);
+ delete evq_timekeeper;
+
+ if (translator) {
+ MEMMAN_DELETE(translator);
+ delete translator;
+ translator = NULL;
+ }
+
+ if (qtranslator) {
+ MEMMAN_DELETE(qtranslator);
+ delete(qtranslator);
+ }
+
+ if (qa) {
+ MEMMAN_DELETE(qa);
+ delete qa;
+ }
+
+ // Report memory leaks
+ // Report deletion of log_file and sys_config already to get a correct
+ // report.
+ MEMMAN_DELETE(sys_config);
+ MEMMAN_DELETE(log_file);
+ MEMMAN_DELETE(memman);
+ MEMMAN_REPORT;
+
+ delete log_file;
+ delete memman;
+
+ sys_config->delete_lock_file();
+ delete sys_config;
+}
diff --git a/src/gui/messageform.ui b/src/gui/messageform.ui
new file mode 100644
index 0000000..ee900e1
--- /dev/null
+++ b/src/gui/messageform.ui
@@ -0,0 +1,325 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>MessageForm</class>
+<widget class="QMainWindow">
+ <property name="name">
+ <cstring>MessageForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>578</width>
+ <height>356</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Instant message</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout154</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>toTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;To:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>toLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>fromComboBox</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The user that will send the message.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>layout152</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>toLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The address of the user that you want to send a message. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>addressToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>F10</string>
+ </property>
+ <property name="iconSet">
+ <iconset>kontact_contacts.png</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Address book</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select an address from the address book.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>profileTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;User profile:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>fromComboBox</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>conversationGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Conversation</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="TextBrowserNoAutoLink" row="0" column="0">
+ <property name="name">
+ <cstring>conversationBrowser</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout158</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>msgLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Type your message here and then press "send" to send it.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>sendPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Send</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Send the message.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<toolbars>
+ <toolbar dock="2">
+ <property name="name">
+ <cstring>Toolbar</cstring>
+ </property>
+ <property name="horizontallyStretchable">
+ <bool>false</bool>
+ </property>
+ <property name="label">
+ <string>Instant message toolbar</string>
+ </property>
+ <action name="sendFileAction"/>
+ </toolbar>
+</toolbars>
+<customwidgets>
+ <customwidget>
+ <class>TextBrowserNoAutoLink</class>
+ <header location="global">textbrowsernoautolink.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>7</hordata>
+ <verdata>7</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ <signal>linkClicked( const QString &amp; link )</signal>
+ </customwidget>
+</customwidgets>
+<actions>
+ <action>
+ <property name="name">
+ <cstring>sendFileAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>attach.png</iconset>
+ </property>
+ <property name="text">
+ <string>Send file...</string>
+ </property>
+ <property name="toolTip">
+ <string>Send file</string>
+ </property>
+ </action>
+</actions>
+<images>
+ <image name="image0">
+ <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154388dad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d0326df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df218e0582c261e95f8bfc04f1a1e8bc5c4dfe0a190172af6a9690000000049454e44ae426082</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>sendPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>MessageForm</receiver>
+ <slot>sendMessage()</slot>
+ </connection>
+ <connection>
+ <sender>addressToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>MessageForm</receiver>
+ <slot>showAddressBook()</slot>
+ </connection>
+ <connection>
+ <sender>conversationBrowser</sender>
+ <signal>linkClicked(const QString&amp;)</signal>
+ <receiver>MessageForm</receiver>
+ <slot>showAttachmentPopupMenu(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>sendFileAction</sender>
+ <signal>activated()</signal>
+ <receiver>MessageForm</receiver>
+ <slot>chooseFileToSend()</slot>
+ </connection>
+ <connection>
+ <sender>toLineEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>MessageForm</receiver>
+ <slot>toAddressChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>msgLineEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>MessageForm</receiver>
+ <slot>showMessageSize()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in declaration">getaddressform.h</include>
+ <include location="local" impldecl="in declaration">qstring.h</include>
+ <include location="local" impldecl="in declaration">user.h</include>
+ <include location="local" impldecl="in declaration">im/msg_session.h</include>
+ <include location="local" impldecl="in declaration">phone.h</include>
+ <include location="local" impldecl="in declaration">qpopupmenu.h</include>
+ <include location="local" impldecl="in declaration">qlabel.h</include>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">sockets/url.h</include>
+ <include location="local" impldecl="in implementation">qstylesheet.h</include>
+ <include location="local" impldecl="in implementation">audits/memman.h</include>
+ <include location="local" impldecl="in implementation">util.h</include>
+ <include location="local" impldecl="in implementation">qpixmap.h</include>
+ <include location="local" impldecl="in implementation">qcursor.h</include>
+ <include location="local" impldecl="in implementation">qfiledialog.h</include>
+ <include location="local" impldecl="in implementation">utils/file_utils.h</include>
+ <include location="local" impldecl="in implementation">qfile.h</include>
+ <include location="local" impldecl="in implementation">sendfileform.h</include>
+ <include location="local" impldecl="in implementation">qstatusbar.h</include>
+ <include location="local" impldecl="in implementation">qframe.h</include>
+ <include location="local" impldecl="in implementation">messageform.ui.h</include>
+</includes>
+<forwards>
+ <forward>extern t_phone *phone;</forward>
+</forwards>
+<variables>
+ <variable access="private">QDialog *_saveAsDialog;</variable>
+ <variable access="private">map&lt;string, string&gt; _filenameMap;</variable>
+ <variable>im::t_msg_session *_msgSession;</variable>
+ <variable access="private">bool _remotePartyComplete;</variable>
+ <variable access="private">GetAddressForm *_getAddressForm;</variable>
+ <variable access="private">QPopupMenu *attachmentPopupMenu;</variable>
+ <variable access="private">QString clickedAttachment;</variable>
+ <variable access="private">void *_serviceMap;</variable>
+ <variable access="private">QLabel *_isComposingLabel;</variable>
+ <variable access="private">QLabel *_msgSizeLabel;</variable>
+</variables>
+<slots>
+ <slot>closeEvent( QCloseEvent * e )</slot>
+ <slot>show()</slot>
+ <slot>selectUserConfig( t_user * user_config )</slot>
+ <slot>showAddressBook()</slot>
+ <slot>selectedAddress( const QString &amp; address )</slot>
+ <slot>sendMessage()</slot>
+ <slot>sendFile( const QString &amp; filename, const QString &amp; subject )</slot>
+ <slot>addMessage( const im::t_msg &amp; msg, const QString &amp; name )</slot>
+ <slot>displayError( const QString &amp; errorMsg )</slot>
+ <slot>displayDeliveryNotification( const QString &amp; notification )</slot>
+ <slot>setRemotePartyCaption( void )</slot>
+ <slot>showAttachmentPopupMenu( const QString &amp; attachment )</slot>
+ <slot>attachmentPopupActivated( int id )</slot>
+ <slot>saveAttachment()</slot>
+ <slot>chooseFileToSend()</slot>
+ <slot>setComposingIndication( const QString &amp; name )</slot>
+ <slot>clearComposingIndication()</slot>
+ <slot>setLocalComposingIndicationActive()</slot>
+ <slot>keyPressEvent( QKeyEvent * e )</slot>
+ <slot>toAddressChanged( const QString &amp; address )</slot>
+ <slot>showMessageSize()</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function access="private" specifier="non virtual">destroy()</function>
+ <function returnType="bool">updateMessageSession()</function>
+ <function returnType="bool">prepareSendMessage()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>textbrowsernoautolink.h</includehint>
+</includehints>
+</UI>
diff --git a/src/gui/messageform.ui.h b/src/gui/messageform.ui.h
new file mode 100644
index 0000000..f44fc02
--- /dev/null
+++ b/src/gui/messageform.ui.h
@@ -0,0 +1,616 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you want to add, delete, or rename functions or slots, use
+** Qt Designer to update this file, preserving your code.
+**
+** You should not define a constructor or destructor in this file.
+** Instead, write your code in functions called init() and destroy().
+** These will automatically be called by the form's constructor and
+** destructor.
+*****************************************************************************/
+
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifdef HAVE_KDE
+#include <kfiledialog.h>
+#include <kiconloader.h>
+#include <kmimetype.h>
+#include <krun.h>
+#include <kuserprofile.h>
+#else
+#include "utils/mime_database.h"
+#endif
+
+using namespace utils;
+
+/** Maximum width for an inline image */
+#define MAX_WIDTH_IMG_INLINE 400
+
+/** Maximum height for an inline image */
+#define MAX_HEIGHT_IMG_INLINE 400
+
+#define IMG_SCALE_FACTOR(width, height) (std::min<float>( float(MAX_WIDTH_IMG_INLINE) / (width), float(MAX_HEIGHT_IMG_INLINE) / (height) ) )
+
+void MessageForm::init()
+{
+ setWFlags(getWFlags() | Qt::WDestructiveClose);
+
+ _getAddressForm = 0;
+ _remotePartyComplete = false;
+
+ // Add label to display size of typed message
+ _msgSizeLabel = new QLabel(this);
+ statusBar()->addWidget(_msgSizeLabel);
+ showMessageSize();
+
+ // Set toolbutton icons for disabled options.
+ setDisabledIcon(addressToolButton, "kontact_contacts-disabled.png");
+
+ attachmentPopupMenu = new QPopupMenu(this);
+ MEMMAN_NEW(attachmentPopupMenu);
+
+ connect(attachmentPopupMenu, SIGNAL(activated(int)),
+ this, SLOT(attachmentPopupActivated(int)));
+
+ _serviceMap = NULL;
+ _saveAsDialog = NULL;
+
+ _isComposingLabel = NULL;
+
+ // When the user edits the message, the composition indication
+ // will be set to active.
+ connect(msgLineEdit, SIGNAL(textChanged(const QString &)),
+ this, SLOT(setLocalComposingIndicationActive()));
+}
+
+void MessageForm::destroy()
+{
+ if (_getAddressForm) {
+ MEMMAN_DELETE(_getAddressForm);
+ delete _getAddressForm;
+ }
+
+ MEMMAN_DELETE(attachmentPopupMenu);
+ delete attachmentPopupMenu;
+
+#ifdef HAVE_KDE
+ vector<KService::Ptr> *serviceMap = (vector<KService::Ptr> *)_serviceMap;
+ if (serviceMap) {
+ MEMMAN_DELETE(serviceMap);
+ delete serviceMap;
+ }
+#endif
+
+ if (_saveAsDialog) {
+ MEMMAN_DELETE(_saveAsDialog);
+ delete _saveAsDialog;
+ }
+
+ if (_isComposingLabel) {
+ MEMMAN_DELETE(_isComposingLabel);
+ delete _isComposingLabel;
+ }
+}
+
+void MessageForm::closeEvent(QCloseEvent *e)
+{
+ MEMMAN_DELETE(this); // destructive close
+ QMainWindow::closeEvent(e);
+}
+
+
+void MessageForm::show()
+{
+ if (toLineEdit->text().isEmpty()) {
+ sendFileAction->setEnabled(false);
+ toLineEdit->setFocus();
+ } else {
+ // Once a message session has been created, the
+ // source and destination cannot be changed anymore.
+ fromComboBox->setEnabled(false);
+ toLineEdit->setEnabled(false);
+ addressToolButton->setEnabled(false);
+ sendFileAction->setEnabled(true);
+ msgLineEdit->setFocus();
+ }
+
+ QMainWindow::show();
+}
+
+void MessageForm::selectUserConfig(t_user *user_config)
+{
+ for (int i = 0; i < fromComboBox->count(); i++) {
+ if (fromComboBox->text(i) ==
+ user_config->get_profile_name().c_str())
+ {
+ fromComboBox->setCurrentItem(i);
+ break;
+ }
+ }
+}
+
+void MessageForm::showAddressBook()
+{
+ if (!_getAddressForm) {
+ _getAddressForm = new GetAddressForm(
+ this, "select address", true);
+ MEMMAN_NEW(_getAddressForm);
+ }
+
+ connect(_getAddressForm,
+ SIGNAL(address(const QString &)),
+ this, SLOT(selectedAddress(const QString &)));
+
+ _getAddressForm->show();
+}
+
+void MessageForm::selectedAddress(const QString &address)
+{
+ toLineEdit->setText(address);
+}
+
+/**
+ * Check if there is a valid sender and receiver. If so, then set the sender
+ * and receiver addresses in the message session object.
+ */
+bool MessageForm::updateMessageSession()
+{
+ string display, dest_str;
+ t_user *from_user = phone->ref_user_profile(
+ fromComboBox->currentText().ascii());
+ if (!from_user) {
+ // The user profile is not active anymore
+ fromComboBox->setFocus();
+ return false;
+ }
+
+ ui->expand_destination(from_user, toLineEdit->text().stripWhiteSpace().ascii(),
+ display, dest_str);
+ t_url dest(dest_str);
+
+ if (!dest.is_valid()) {
+ toLineEdit->setFocus();
+ toLineEdit->selectAll();
+ return false;
+ }
+
+ _msgSession->set_user(from_user);
+ _msgSession->set_remote_party(t_display_url(dest, display));
+
+ setRemotePartyCaption();
+
+ return true;
+}
+
+/**
+ * Determine if a message can be sent, i.e. there is a valid sender and
+ * receiver. If a message can be sent, then lock the sender and receiver.
+ * @return True if message can be sent, false otherwise.
+ */
+bool MessageForm::prepareSendMessage() {
+ if (toLineEdit->text().isEmpty()) {
+ // No recipient selected.
+ return false;
+ }
+
+ if (toLineEdit->isEnabled()) {
+ if (!updateMessageSession()) {
+ // No valid sender and receiver.
+ return false;
+ }
+
+ // Once a message session has been created, the
+ // source and destination cannot be changed anymore.
+ fromComboBox->setEnabled(false);
+ toLineEdit->setEnabled(false);
+ addressToolButton->setEnabled(false);
+
+ }
+
+ return true;
+}
+
+/** Send a text message */
+void MessageForm::sendMessage() {
+ if (msgLineEdit->text().isEmpty()) {
+ // Nothing to send
+ return;
+ }
+
+ if (!prepareSendMessage()) {
+ return;
+ }
+
+ _msgSession->send_msg(msgLineEdit->text().ascii(), im::TXT_PLAIN);
+}
+
+/**
+ * Send a file.
+ * @param filename [in] Name of file to send.
+ * @param subject [in] Subject to set in the message.
+ */
+void MessageForm::sendFile(const QString &filename, const QString &subject) {
+ if (!prepareSendMessage()) {
+ return;
+ }
+
+ t_media media("application/octet-stream");
+
+#ifdef HAVE_KDE
+ // Get mime type for the attachment
+ KMimeType::Ptr pMime = KMimeType::findByURL(filename);
+ media = t_media(pMime->name().ascii());
+#else
+ string mime_type = mime_database->get_mimetype(filename.ascii());
+ if (!mime_type.empty()) {
+ media = t_media(mime_type);
+ }
+#endif
+
+ _msgSession->send_file(filename.ascii(), media, subject.ascii());
+}
+
+/**
+ * Add a message to the converstation broswer.
+ * @param msg [in] The message to add.
+ * @param name [in] The name of the sender of the message.
+ */
+void MessageForm::addMessage(const im::t_msg &msg, const QString &name)
+{
+ QString s = "<b>";
+
+ // Timestamp and name of sender
+ if (msg.direction == im::MSG_DIR_IN) s += "<font color=\"blue\">";
+ s += time2str(msg.timestamp, "%H:%M:%S ").c_str();
+ s += QStyleSheet::escape(name);
+ if (msg.direction == im::MSG_DIR_IN) s += "</font>";
+ s += "</b>";
+
+ // Subject
+ if (!msg.subject.empty()) {
+ s += "<br>";
+ s += "<b>";
+ s += "Subject: ";
+ s += "</b>";
+ s += msg.subject.c_str();
+ }
+
+ // Text message
+ if (!msg.message.empty()) {
+ s += "<br>";
+ if (msg.format == im::TXT_HTML) {
+ s += msg.message.c_str();
+ } else {
+ s += QStyleSheet::escape(msg.message.c_str());
+ }
+ }
+
+ // Attachment
+ if (msg.has_attachment) {
+ s += "<br>";
+ s += "<a href=\"";
+ s += msg.attachment_filename.c_str();
+ s += "\">";
+
+ bool show_attachment_inline = false;
+ bool scale_image = false;
+ int scaled_width = 0, scaled_height = 0;
+
+ if (msg.attachment_media.type == "image") {
+ // Show image inline if possible
+ QPixmap image (msg.attachment_filename.c_str());
+ if (!image.isNull()) {
+ show_attachment_inline = true;
+ if (image.width() > MAX_WIDTH_IMG_INLINE &&
+ image.height() > MAX_HEIGHT_IMG_INLINE)
+ {
+ // Shrink image
+ scaled_width = int(image.width() * IMG_SCALE_FACTOR(image.width(), image.height()));
+ scaled_height = int(image.height() * IMG_SCALE_FACTOR(image.width(), image.height()));
+ scale_image = true;
+ }
+ }
+ }
+
+ s += "<img ";
+
+ if (scale_image) {
+ s += "width=";
+ s += QString().setNum(scaled_width);
+ s += " height=";
+ s += QString().setNum(scaled_height);
+ s += " ";
+ }
+
+ s += "src=\"";
+
+ if (show_attachment_inline) {
+ s += msg.attachment_filename.c_str();
+ } else {
+ // Show an icon representing the attachment
+#ifdef HAVE_KDE
+ KIconLoader iconLoader;
+ QString iconName = KMimeType::iconForURL(
+ msg.attachment_filename.c_str());
+ s += iconLoader.iconPath(iconName, KIcon::Desktop);
+#else
+ // Set icon based on main mime type
+ s += "mime_";
+ s += msg.attachment_media.type.c_str();
+ s += ".png";
+#endif
+ }
+
+ s += "\">";
+ s+= "<br>";
+
+ s += msg.attachment_save_as_name.c_str();
+
+ s += "</a> ";
+
+ if (scale_image) {
+ s += "<br>";
+ s += "<i>";
+ s += tr("image size is scaled down in preview");
+ s += "</i>";
+ }
+
+ // Store the association between the tempory file name of the
+ // save attachment and the suggested save-as file name. When
+ // the user clicks on the attachment, only the temporary file name
+ // is available. Through this association the suggested file name
+ // can be retrieved.
+ _filenameMap[msg.attachment_filename] = msg.attachment_save_as_name;
+ }
+
+ conversationBrowser->append(s);
+}
+
+void MessageForm::displayError(const QString &errorMsg)
+{
+ QString s = "<font color =\"red\">";
+ s += "<b>";
+ s += tr("Delivery failure").ascii();
+ s += ": </b>";
+ s += QStyleSheet::escape(errorMsg);
+ s += "</font>";
+
+ conversationBrowser->append(s);
+}
+
+void MessageForm::displayDeliveryNotification(const QString &notification)
+{
+ QString s = "<font color =\"darkgreen\">";
+ s += "<b>";
+ s += tr("Delivery notification").ascii();
+ s += ": </b>";
+ s += QStyleSheet::escape(notification);
+ s += "</font>";
+
+ conversationBrowser->append(s);
+}
+
+void MessageForm::setRemotePartyCaption(void) {
+ if (!_msgSession) return;
+ t_user *user = _msgSession->get_user();
+ t_display_url remote_party = _msgSession->get_remote_party();
+ setCaption(ui->format_sip_address(user,
+ remote_party.display, remote_party.url).c_str());
+}
+
+void MessageForm::showAttachmentPopupMenu(const QString &attachment) {
+#ifdef HAVE_KDE
+ vector<KService::Ptr> *serviceMap = (vector<KService::Ptr> *)_serviceMap;
+
+ if (serviceMap) {
+ MEMMAN_DELETE(serviceMap);
+ delete serviceMap;
+ }
+ serviceMap = new vector<KService::Ptr>;
+ MEMMAN_NEW(serviceMap);
+ _serviceMap = (void *)serviceMap;
+#endif
+
+ int id = 0; // Identity of popup menu item
+
+ // Store attachment. When the user selects an attachment we still
+ // know which attachment was clicked.
+ clickedAttachment = attachment;
+
+ attachmentPopupMenu->clear();
+
+ QIconSet saveIcon(QPixmap::fromMimeSource("save_as.png"));
+ attachmentPopupMenu->insertItem(saveIcon, "Save as...", id++);
+
+#ifdef HAVE_KDE
+ // Get mime type for the attachment
+ KMimeType::Ptr pMime = KMimeType::findByURL(attachment);
+
+ // Get applications that can open the mime type
+ KServiceTypeProfile::OfferList services = KServiceTypeProfile::offers(
+ pMime->name(), "Application");
+
+ KServiceTypeProfile::OfferList::ConstIterator it;
+ for (it = services.begin(); it != services.end(); ++it) {
+ KService::Ptr service = (*it).service();
+ serviceMap->push_back(service);
+ QString menuText = tr("Open with %1...").arg(service->name());
+ QPixmap pixmap = service->pixmap(KIcon::Small);
+ QIconSet iconSet;
+ iconSet.setPixmap(pixmap, QIconSet::Small);
+ attachmentPopupMenu->insertItem(iconSet, menuText, id++);
+ }
+
+ QIconSet openIcon(QPixmap::fromMimeSource("fileopen.png"));
+ attachmentPopupMenu->insertItem(openIcon, tr("Open with..."), id++);
+#endif
+
+ attachmentPopupMenu->popup(QCursor::pos());
+}
+
+void MessageForm::attachmentPopupActivated(int id) {
+#ifdef HAVE_KDE
+ vector<KService::Ptr> *serviceMap = (vector<KService::Ptr> *)_serviceMap;
+ assert(serviceMap);
+#endif
+
+ if (id == 0) {
+#ifdef HAVE_KDE
+ KFileDialog *d = new KFileDialog(QString::null, QString::null, this, 0, true);
+ MEMMAN_NEW(d);
+ d->setOperationMode(KFileDialog::Saving);
+
+ connect(d, SIGNAL(okClicked()), this,
+ SLOT(saveAttachment()));
+#else
+ QFileDialog *d = new QFileDialog(QString::null, QString::null, this, 0, true);
+ MEMMAN_NEW(d);
+ d->setMode(QFileDialog::AnyFile);
+
+ connect(d, SIGNAL(fileSelected(const QString &)), this,
+ SLOT(saveAttachment()));
+#endif
+ d->setSelection(_filenameMap[clickedAttachment.ascii()].c_str());
+ d->setCaption(tr("Save attachment as..."));
+
+ if (_saveAsDialog) {
+ MEMMAN_DELETE(_saveAsDialog);
+ delete _saveAsDialog;
+ }
+ _saveAsDialog = d;
+
+ d->show();
+#ifdef HAVE_KDE
+ } else if (id > serviceMap->size()) {
+ KURL::List urls;
+ urls << clickedAttachment;
+ KRun::displayOpenWithDialog(urls, false);
+ } else {
+ KURL::List urls;
+ urls << clickedAttachment;
+ KRun::run(*serviceMap->at(id-1), urls);
+#endif
+ }
+}
+
+void MessageForm::saveAttachment() {
+#ifdef HAVE_KDE
+ KFileDialog *d = dynamic_cast<KFileDialog *>(_saveAsDialog);
+#else
+ QFileDialog *d = dynamic_cast<QFileDialog *>(_saveAsDialog);
+#endif
+ QString filename = d->selectedFile();
+
+ if (QFile::exists(filename)) {
+ bool overwrite = ((t_gui *)ui)->cb_ask_msg(this,
+ tr("File already exists. Do you want to overwrite this file?").ascii(),
+ MSG_WARNING);
+
+ if (!overwrite) return;
+ }
+
+ if (!filecopy(clickedAttachment.ascii(), filename.ascii())) {
+ ((t_gui *)ui)->cb_show_msg(this, tr("Failed to save attachment.").ascii(),
+ MSG_CRITICAL);
+ }
+}
+
+/** Choose a file to send */
+void MessageForm::chooseFileToSend()
+{
+ // Indicate that a message is being composed.
+ setLocalComposingIndicationActive();
+
+ SendFileForm *form = new SendFileForm();
+ MEMMAN_NEW(form);
+ // Form will auto destruct itself on close.
+
+ connect(form, SIGNAL(selected(const QString &, const QString &)),
+ this, SLOT(sendFile(const QString &, const QString &)));
+
+ form->show();
+}
+
+/**
+ * Show an is-composing indication in the status bar.
+ * @param name [in] The name of the sender of the message.
+ */
+void MessageForm::setComposingIndication(const QString &name)
+{
+
+ if (!_isComposingLabel) {
+ _isComposingLabel = new QLabel(NULL);
+ MEMMAN_NEW(_isComposingLabel);
+
+ _isComposingLabel->setText(tr("%1 is typing a message.").arg(name));
+ _isComposingLabel->setFrameStyle(QFrame::NoFrame | QFrame::Plain);
+ statusBar()->addWidget(_isComposingLabel);
+ }
+}
+
+/** Clear an is-composing indication from the status bar. */
+void MessageForm::clearComposingIndication()
+{
+ if (_isComposingLabel) {
+ statusBar()->removeWidget(_isComposingLabel);
+ statusBar()->clear();
+
+ MEMMAN_DELETE(_isComposingLabel);
+ delete _isComposingLabel;
+ _isComposingLabel = NULL;
+ }
+}
+
+/** Set the local composition indication to active. */
+void MessageForm::setLocalComposingIndicationActive()
+{
+ _msgSession->set_local_composing_state(im::COMPOSING_STATE_ACTIVE);
+}
+
+void MessageForm::keyPressEvent(QKeyEvent *e)
+{
+ switch (e->key()) {
+ case Qt::Key_Return:
+ case Qt::Key_Enter:
+ if (sendPushButton->isEnabled()) {
+ sendPushButton->animateClick();
+ }
+ break;
+ default:
+ e->ignore();
+ }
+}
+
+void MessageForm::toAddressChanged(const QString &address)
+{
+ sendFileAction->setEnabled(!address.isEmpty());
+}
+
+/** Show the size of the typed message */
+void MessageForm::showMessageSize()
+{
+ uint len = msgLineEdit->text().length();
+
+ QString s(tr("Size"));
+ s += ": ";
+ s += QString().setNum(len);
+
+ _msgSizeLabel->setText(s);
+}
diff --git a/src/gui/messageformview.cpp b/src/gui/messageformview.cpp
new file mode 100644
index 0000000..b869520
--- /dev/null
+++ b/src/gui/messageformview.cpp
@@ -0,0 +1,159 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include "messageformview.h"
+
+#include "gui.h"
+
+#include "audits/memman.h"
+
+MessageFormView::MessageFormView(QWidget *parent, im::t_msg_session *s) :
+ MessageForm(parent),
+ t_observer()
+{
+ _msgSession = s;
+ _msgSession->attach(this);
+ _destructing = false;
+}
+
+MessageFormView::~MessageFormView()
+{
+ _destructing = true;
+ if (_msgSession) {
+ ((t_gui *)ui)->removeMessageSession(_msgSession);
+ MEMMAN_DELETE(_msgSession);
+ delete _msgSession;
+ }
+}
+
+void MessageFormView::updatePartyInfo(void)
+{
+ t_user *user_config = _msgSession->get_user();
+ selectUserConfig(user_config);
+ t_display_url to_url = _msgSession->get_remote_party();
+
+ if (to_url.is_valid()) {
+ toLineEdit->setText(ui->format_sip_address(user_config, to_url.display, to_url.url).c_str());
+ } else {
+ toLineEdit->clear();
+ }
+}
+
+void MessageFormView::update(void) {
+ // Called directly from core, so lock GUI
+ ui->lock();
+
+ updatePartyInfo();
+ setRemotePartyCaption();
+
+ t_user *user_config = _msgSession->get_user();
+ t_display_url to_url = _msgSession->get_remote_party();
+
+ // Update msgLineEdit field based on msg-in-flight indication
+ if (!_msgSession->is_msg_in_flight() && !msgLineEdit->isEnabled()) {
+ msgLineEdit->clear();
+
+ // When the user edits the message, the composition indication
+ // will be set to active.
+ connect(msgLineEdit, SIGNAL(textChanged(const QString &)),
+ this, SLOT(setLocalComposingIndicationActive()));
+
+ // Enable msgLineEdit first, otherwise the setFocus does not work
+ msgLineEdit->setEnabled(true);
+
+ msgLineEdit->setFocus();
+ } else if (_msgSession->is_msg_in_flight() && msgLineEdit->isEnabled()) {
+ // Disable the triggering of the composition indication while a message
+ // is being sent.
+ disconnect(msgLineEdit, SIGNAL(textChanged(const QString &)),
+ this, SLOT(setLocalComposingIndicationActive()));
+ msgLineEdit->setText(tr("sending message"));
+ }
+
+ // Enable/disable msgLineEdit here to be robust, such that msgLineEdit
+ // does not stay disabled forever.
+ msgLineEdit->setEnabled(!_msgSession->is_msg_in_flight());
+
+ sendFileAction->setEnabled(!_msgSession->is_msg_in_flight());
+
+ // Display error
+ if (_msgSession->error_received()) {
+ string error_msg = _msgSession->take_error();
+ displayError(error_msg.c_str());
+ }
+
+ // Display delivery notification
+ if (_msgSession->delivery_notification_received()) {
+ string notification = _msgSession->take_delivery_notification();
+ displayDeliveryNotification(notification.c_str());
+ }
+
+ // Display message composing indication
+ if (_msgSession->get_remote_composing_state() == im::COMPOSING_STATE_ACTIVE) {
+ QString name = to_url.display.c_str();
+ if (name.isEmpty()) {
+ name = to_url.url.get_user().c_str();
+ }
+
+ setComposingIndication(name);
+ } else {
+ clearComposingIndication();
+ }
+
+ // Display message
+ if (_msgSession->is_new_message_added()) {
+ im::t_msg m;
+ try {
+ m = _msgSession->get_last_message();
+ } catch (empty_list_exception) {
+ ui->unlock();
+ return;
+ }
+
+ QString name;
+ if (m.direction == im::MSG_DIR_IN) {
+ name = to_url.display.c_str();
+ if (name.isEmpty()) {
+ name = to_url.url.get_user().c_str();
+ }
+ } else {
+ name = user_config->get_display(false).c_str();
+ if (name.isEmpty()) {
+ name = user_config->get_name().c_str();
+ }
+ }
+
+ addMessage(m, name);
+ }
+
+ ui->unlock();
+}
+
+void MessageFormView::subject_destroyed()
+{
+ _msgSession = NULL;
+
+ if (!_destructing) close();
+}
+
+void MessageFormView::show()
+{
+ ((t_gui *)ui)->fill_user_combo(fromComboBox);
+ updatePartyInfo();
+ MessageForm::show();
+}
diff --git a/src/gui/messageformview.h b/src/gui/messageformview.h
new file mode 100644
index 0000000..951cb51
--- /dev/null
+++ b/src/gui/messageformview.h
@@ -0,0 +1,43 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef _MESSAGEFORMVIEW_H
+#define _MESSAGEFORMVIEW_H
+
+#include "messageform.h"
+
+#include "im/msg_session.h"
+#include "patterns/observer.h"
+
+class MessageFormView : public MessageForm, patterns::t_observer
+{
+private:
+ bool _destructing; /**< Indicates if object is being destructed. */
+public:
+ MessageFormView(QWidget *parent, im::t_msg_session *s);
+ virtual ~MessageFormView();
+ virtual void updatePartyInfo(void);
+
+ /** Update the message form with the latest message session state. */
+ virtual void update(void);
+
+ virtual void subject_destroyed(void);
+ virtual void show(void);
+};
+
+#endif
diff --git a/src/gui/mphoneform.ui b/src/gui/mphoneform.ui
new file mode 100644
index 0000000..50f65be
--- /dev/null
+++ b/src/gui/mphoneform.ui
@@ -0,0 +1,2851 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>MphoneForm</class>
+<widget class="QMainWindow">
+ <property name="name">
+ <cstring>MphoneForm</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>739</width>
+ <height>693</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>714</width>
+ <height>693</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>Twinkle</string>
+ </property>
+ <property name="icon">
+ <pixmap>twinkle16.png</pixmap>
+ </property>
+ <property name="rightJustification">
+ <bool>false</bool>
+ </property>
+ <property name="usesBigPixmaps">
+ <bool>false</bool>
+ </property>
+ <property name="usesTextLabel">
+ <bool>true</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSplitter" row="0" column="0">
+ <property name="name">
+ <cstring>splitter2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Buddy list</string>
+ </property>
+ <property name="clickable">
+ <bool>false</bool>
+ </property>
+ <property name="resizable">
+ <bool>false</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>buddyListView</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>150</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout13</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout76</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>callTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Call:</string>
+ <comment>Label in front of combobox to enter address</comment>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>callComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>layout71</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>callComboBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ <property name="maxCount">
+ <number>10</number>
+ </property>
+ <property name="insertionPolicy">
+ <enum>NoInsertion</enum>
+ </property>
+ <property name="autoCompletion">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The address that you want to call. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>addressToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>F10</string>
+ </property>
+ <property name="iconSet">
+ <iconset>kontact_contacts.png</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Address book</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select an address from the address book.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>callPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Dial</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Dial the address.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>userLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;User:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>userComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layout75</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>userComboBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The user that will make the call.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout74</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>statAaLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursor>13</cursor>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>auto_answer.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Auto answer indication.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>statCfLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursor>13</cursor>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>cf.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Call redirect indication.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>statDndLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursor>13</cursor>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>cancel.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Do not disturb indication.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>statMWILabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursor>13</cursor>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>mwi_none16.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Message waiting indication.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>statMissedLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursor>13</cursor>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>missed.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Missed call indication.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>statRegLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursor>13</cursor>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>twinkle16.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Registration status.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>displayGroupBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Display</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTextEdit">
+ <property name="name">
+ <cstring>displayTextEdit</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="vScrollBarMode">
+ <enum>AlwaysOn</enum>
+ </property>
+ <property name="textFormat">
+ <enum>PlainText</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="wordWrap">
+ <enum>NoWrap</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="autoFormatting">
+ <set>AutoAll</set>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>lineButtonGroup</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Line status</string>
+ </property>
+ <property name="exclusive">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout20</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout27</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>line1RadioButton</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Line &amp;1:</string>
+ </property>
+ <property name="accel">
+ <string>Alt+1</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click to switch to line 1.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>fromhead1Label</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>From:</string>
+ </property>
+ <property name="indent">
+ <number>21</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>tohead1Label</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>To:</string>
+ </property>
+ <property name="indent">
+ <number>21</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>subjecthead1Label</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Subject:</string>
+ </property>
+ <property name="indent">
+ <number>21</number>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout19</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout17</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>line1StatLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>stat_ringing.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Visual indication of line state.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>status1TextLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>85</red>
+ <green>0</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="text">
+ <string>idle</string>
+ <comment>No need to translate</comment>
+ </property>
+ <property name="textFormat">
+ <enum>RichText</enum>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>line1HoldLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>hold.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Call is on hold</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>line1MuteLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>stat_mute.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Voice is muted</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>line1ConfLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>stat_conference.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Conference call</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>line1ReferLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>cf.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Transferring call</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>crypt1Label</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursor>13</cursor>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>encrypted.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+The padlock indicates that your voice is encrypted during transport over the network.
+&lt;/p&gt;
+&lt;h3&gt;SAS - Short Authentication String&lt;/h3&gt;
+&lt;p&gt;
+Both ends of an encrypted voice channel receive the same SAS on the first call. If the SAS is different at each end, your voice channel may be compromised by a man-in-the-middle attack (MitM).
+&lt;/p&gt;
+&lt;p&gt;
+If the SAS is equal at both ends, then you should confirm it by clicking this padlock for stronger security of future calls to the same destination. For subsequent calls to the same destination, you don't have to confirm the SAS again. The padlock will show a check symbol when the SAS has been confirmed.
+&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>line1SasLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>sas</string>
+ <comment>No need to translate</comment>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Short authentication string</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>codec1TextLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>0</red>
+ <green>170</green>
+ <blue>127</blue>
+ </color>
+ </property>
+ <property name="text">
+ <string>g711a/g711a</string>
+ <comment>No need to translate</comment>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Audio codec</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>timer1TextLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <family>Courier New</family>
+ </font>
+ </property>
+ <property name="text">
+ <string>0:00:00</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Call duration</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>from1Label</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>85</red>
+ <green>0</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>238</red>
+ <green>234</green>
+ <blue>238</blue>
+ </color>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="text">
+ <string>sip:from</string>
+ <comment>No need to translate</comment>
+ </property>
+ <property name="alignment">
+ <set>AlignAuto</set>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>to1Label</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>85</red>
+ <green>0</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>238</red>
+ <green>234</green>
+ <blue>238</blue>
+ </color>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="text">
+ <string>sip:to</string>
+ <comment>No need to translate</comment>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>subject1Label</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>85</red>
+ <green>0</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>238</red>
+ <green>234</green>
+ <blue>238</blue>
+ </color>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="text">
+ <string>subject</string>
+ <comment>No need to translate</comment>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>photo1Label</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>70</width>
+ <height>98</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>70</width>
+ <height>98</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>photo</string>
+ <comment>No need to translate</comment>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout22</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout31</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>line2RadioButton</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Line &amp;2:</string>
+ </property>
+ <property name="accel">
+ <string>Alt+2</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Click to switch to line 2.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>fromhead2Label</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>From:</string>
+ </property>
+ <property name="indent">
+ <number>21</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>tohead2Label</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>To:</string>
+ </property>
+ <property name="indent">
+ <number>21</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>subjecthead2Label</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Subject:</string>
+ </property>
+ <property name="indent">
+ <number>21</number>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout21</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout18</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>line2StatLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>stat_ringing.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Visual indication of line state.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>status2TextLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>85</red>
+ <green>0</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="text">
+ <string>idle</string>
+ <comment>No need to translate</comment>
+ </property>
+ <property name="textFormat">
+ <enum>RichText</enum>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>line2HoldLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>hold.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Call is on hold</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>line2MuteLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>stat_mute.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Voice is muted</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>line2ConfLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>stat_conference.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Conference call</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>line2ReferLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>cf.png</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Transferring call</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>crypt2Label</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="cursor">
+ <cursor>13</cursor>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>encrypted.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+The padlock indicates that your voice is encrypted during transport over the network.
+&lt;/p&gt;
+&lt;h3&gt;SAS - Short Authentication String&lt;/h3&gt;
+&lt;p&gt;
+Both ends of an encrypted voice channel receive the same SAS on the first call. If the SAS is different at each end, your voice channel may be compromised by a man-in-the-middle attack (MitM).
+&lt;/p&gt;
+&lt;p&gt;
+If the SAS is equal at both ends, then you should confirm it by clicking this padlock for stronger security of future calls to the same destination. For subsequent calls to the same destination, you don't have to confirm the SAS again. The padlock will show a check symbol when the SAS has been confirmed.
+&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>line2SasLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>sas</string>
+ <comment>No need to translate</comment>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Short authentication string</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>codec2TextLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>0</red>
+ <green>170</green>
+ <blue>127</blue>
+ </color>
+ </property>
+ <property name="text">
+ <string>g711a/g711a</string>
+ <comment>No need to translate</comment>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Audio codec</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>timer2TextLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <family>Courier New</family>
+ </font>
+ </property>
+ <property name="text">
+ <string>0:00:00</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Call duration</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>from2Label</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>85</red>
+ <green>0</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>238</red>
+ <green>234</green>
+ <blue>238</blue>
+ </color>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="text">
+ <string>sip:from</string>
+ <comment>No need to translate</comment>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>to2Label</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>85</red>
+ <green>0</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>238</red>
+ <green>234</green>
+ <blue>238</blue>
+ </color>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="text">
+ <string>sip:to</string>
+ <comment>No need to translate</comment>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>subject2Label</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>85</red>
+ <green>0</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>238</red>
+ <green>234</green>
+ <blue>238</blue>
+ </color>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="text">
+ <string>subject</string>
+ <comment>No need to translate</comment>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>photo2Label</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>70</width>
+ <height>98</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>70</width>
+ <height>98</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>photo</string>
+ <comment>No need to translate</comment>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<menubar>
+ <property name="name">
+ <cstring>menubar</cstring>
+ </property>
+ <item text="&amp;File" name="fileMenu">
+ <action name="fileChangeUserAction"/>
+ <separator/>
+ <action name="fileExitAction"/>
+ </item>
+ <item text="&amp;Edit" name="Edit">
+ <action name="editUserProfileAction"/>
+ <action name="editSysSettingsAction"/>
+ </item>
+ <item text="C&amp;all" name="Call">
+ <action name="callInvite"/>
+ <action name="callAnswer"/>
+ <action name="callBye"/>
+ <action name="callReject"/>
+ <action name="callRedirect"/>
+ <action name="callTransfer"/>
+ <action name="callHold"/>
+ <action name="callConference"/>
+ <action name="callMute"/>
+ <action name="callDTMF"/>
+ <action name="callRedial"/>
+ <separator/>
+ <action name="callTermCap"/>
+ <action name="callActivate_LineAction"/>
+ <item text="Activate line" name="popupMenu_19" accel="">
+ <action name="actionLine1"/>
+ <action name="actionLine2"/>
+ </item>
+ </item>
+ <item text="&amp;Message" name="Message">
+ <action name="actionSendMsg"/>
+ </item>
+ <item text="&amp;Registration" name="PopupMenu_2">
+ <action name="regRegister"/>
+ <action name="regDeregister"/>
+ <action name="regDeregisterAll"/>
+ <action name="regShow"/>
+ </item>
+ <item text="&amp;Services" name="PopupMenu_3">
+ <action name="serviceDnd"/>
+ <action name="serviceRedirection"/>
+ <action name="serviceAutoAnswer"/>
+ <action name="servicesVoice_mailAction"/>
+ </item>
+ <item text="&amp;View" name="View">
+ <action name="viewCall_HistoryAction"/>
+ <action name="viewLogAction"/>
+ <action name="viewDisplayAction"/>
+ <action name="viewBuddyListAction"/>
+ </item>
+ <item text="Diamondcard" name="Diamondcard">
+ <action name="diamondcardSign_upAction"/>
+ </item>
+ <item text="&amp;Help" name="helpMenu">
+ <action name="helpWhats_ThisAction"/>
+ <separator/>
+ <action name="helpManualAction"/>
+ <action name="helpAboutAction"/>
+ <action name="helpAboutQtAction"/>
+ </item>
+ <separator/>
+</menubar>
+<toolbars>
+ <toolbar dock="2">
+ <property name="name">
+ <cstring>callToolbar</cstring>
+ </property>
+ <property name="resizeEnabled">
+ <bool>false</bool>
+ </property>
+ <property name="movingEnabled">
+ <bool>true</bool>
+ </property>
+ <property name="horizontallyStretchable">
+ <bool>true</bool>
+ </property>
+ <property name="verticallyStretchable">
+ <bool>true</bool>
+ </property>
+ <property name="label">
+ <string>Call Toolbar</string>
+ </property>
+ <action name="callInvite"/>
+ <action name="callAnswer"/>
+ <action name="callBye"/>
+ <action name="callReject"/>
+ <action name="callRedirect"/>
+ <action name="callTransfer"/>
+ <action name="callHold"/>
+ <action name="callConference"/>
+ <action name="callMute"/>
+ <action name="callDTMF"/>
+ <action name="callRedial"/>
+ <action name="actionSendMsg"/>
+ </toolbar>
+</toolbars>
+<actions>
+ <action>
+ <property name="name">
+ <cstring>fileExitAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>exit.png</iconset>
+ </property>
+ <property name="text">
+ <string>Quit</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Quit</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+Q</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>helpAboutAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>twinkle16.png</iconset>
+ </property>
+ <property name="text">
+ <string>About Twinkle</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;About Twinkle</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>callInvite</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>invite.png</iconset>
+ </property>
+ <property name="text">
+ <string>Call</string>
+ <comment>toolbar text</comment>
+ </property>
+ <property name="menuText">
+ <string>&amp;Call...</string>
+ <comment>call menu text</comment>
+ </property>
+ <property name="toolTip">
+ <string>Call someone</string>
+ </property>
+ <property name="accel">
+ <string>F5</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>callAnswer</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>answer.png</iconset>
+ </property>
+ <property name="text">
+ <string>Answer</string>
+ <comment>toolbar text</comment>
+ </property>
+ <property name="menuText">
+ <string>&amp;Answer</string>
+ <comment>menu text</comment>
+ </property>
+ <property name="toolTip">
+ <string>Answer incoming call</string>
+ </property>
+ <property name="accel">
+ <string>F6</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>callBye</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>bye.png</iconset>
+ </property>
+ <property name="text">
+ <string>Bye</string>
+ <comment>toolbar text</comment>
+ </property>
+ <property name="menuText">
+ <string>&amp;Bye</string>
+ <comment>menu text</comment>
+ </property>
+ <property name="toolTip">
+ <string>Release call</string>
+ </property>
+ <property name="accel">
+ <string>Esc</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>callReject</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>reject.png</iconset>
+ </property>
+ <property name="text">
+ <string>Reject</string>
+ <comment>toolbar text</comment>
+ </property>
+ <property name="menuText">
+ <string>&amp;Reject</string>
+ <comment>menu text</comment>
+ </property>
+ <property name="toolTip">
+ <string>Reject incoming call</string>
+ </property>
+ <property name="accel">
+ <string>F8</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>callHold</cstring>
+ </property>
+ <property name="toggleAction">
+ <bool>true</bool>
+ </property>
+ <property name="iconSet">
+ <iconset>hold.png</iconset>
+ </property>
+ <property name="text">
+ <string>Hold</string>
+ <comment>toolbar text</comment>
+ </property>
+ <property name="menuText">
+ <string>&amp;Hold</string>
+ <comment>menu text</comment>
+ </property>
+ <property name="toolTip">
+ <string>Put a call on hold, or retrieve a held call</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>callRedirect</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>redirect.png</iconset>
+ </property>
+ <property name="text">
+ <string>Redirect</string>
+ <comment>toolbar text</comment>
+ </property>
+ <property name="menuText">
+ <string>R&amp;edirect...</string>
+ <comment>menu text</comment>
+ </property>
+ <property name="toolTip">
+ <string>Redirect incoming call without answering</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>callDTMF</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>dtmf.png</iconset>
+ </property>
+ <property name="text">
+ <string>Dtmf</string>
+ <comment>toolbar text</comment>
+ </property>
+ <property name="menuText">
+ <string>&amp;Dtmf...</string>
+ <comment>menu text</comment>
+ </property>
+ <property name="toolTip">
+ <string>Open keypad to enter digits for voice menu's</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>regRegister</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>twinkle16.png</iconset>
+ </property>
+ <property name="text">
+ <string>Register</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Register</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>regDeregister</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>twinkle16-disabled.png</iconset>
+ </property>
+ <property name="text">
+ <string>Deregister</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Deregister</string>
+ </property>
+ <property name="toolTip">
+ <string>Deregister this device</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>regShow</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>reg-query.png</iconset>
+ </property>
+ <property name="text">
+ <string>Show registrations</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Show registrations</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>callTermCap</cstring>
+ </property>
+ <property name="text">
+ <string>Terminal capabilities</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Terminal capabilities...</string>
+ <comment>menu text</comment>
+ </property>
+ <property name="toolTip">
+ <string>Request terminal capabilities from someone</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>serviceDnd</cstring>
+ </property>
+ <property name="toggleAction">
+ <bool>true</bool>
+ </property>
+ <property name="iconSet">
+ <iconset>cancel.png</iconset>
+ </property>
+ <property name="text">
+ <string>Do not disturb</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Do not disturb</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>serviceRedirection</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>cf.png</iconset>
+ </property>
+ <property name="text">
+ <string>Call redirection</string>
+ </property>
+ <property name="menuText">
+ <string>Call &amp;redirection...</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>callRedial</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>redial.png</iconset>
+ </property>
+ <property name="text">
+ <string>Redial</string>
+ <comment>toolbar text</comment>
+ </property>
+ <property name="menuText">
+ <string>&amp;Redial</string>
+ <comment>menu text</comment>
+ </property>
+ <property name="toolTip">
+ <string>Repeat last call</string>
+ </property>
+ <property name="accel">
+ <string>F12</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>helpAboutQtAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>qt-logo.png</iconset>
+ </property>
+ <property name="text">
+ <string>About Qt</string>
+ </property>
+ <property name="menuText">
+ <string>About &amp;Qt</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editUserProfileAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>penguin-small.png</iconset>
+ </property>
+ <property name="text">
+ <string>User profile</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;User profile...</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>callConference</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>conf.png</iconset>
+ </property>
+ <property name="text">
+ <string>Conf</string>
+ <comment>toolbar text</comment>
+ </property>
+ <property name="menuText">
+ <string>&amp;Conference</string>
+ <comment>menu text</comment>
+ </property>
+ <property name="toolTip">
+ <string>Join two calls in a 3-way conference</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>callMute</cstring>
+ </property>
+ <property name="toggleAction">
+ <bool>true</bool>
+ </property>
+ <property name="iconSet">
+ <iconset>mute.png</iconset>
+ </property>
+ <property name="text">
+ <string>Mute</string>
+ <comment>toolbar text</comment>
+ </property>
+ <property name="menuText">
+ <string>&amp;Mute</string>
+ <comment>menu text</comment>
+ </property>
+ <property name="toolTip">
+ <string>Mute a call</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>callTransfer</cstring>
+ </property>
+ <property name="toggleAction">
+ <bool>true</bool>
+ </property>
+ <property name="iconSet">
+ <iconset>transfer.png</iconset>
+ </property>
+ <property name="text">
+ <string>Xfer</string>
+ <comment>toolbar text</comment>
+ </property>
+ <property name="menuText">
+ <string>Trans&amp;fer...</string>
+ <comment>menu text</comment>
+ </property>
+ <property name="toolTip">
+ <string>Transfer call</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editSysSettingsAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>settings.png</iconset>
+ </property>
+ <property name="text">
+ <string>System settings</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;System settings...</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>registrationAction</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="menuText">
+ <string></string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>regDeregisterAll</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>twinkle16-disabled.png</iconset>
+ </property>
+ <property name="text">
+ <string>Deregister all</string>
+ </property>
+ <property name="menuText">
+ <string>Deregister &amp;all</string>
+ </property>
+ <property name="toolTip">
+ <string>Deregister all your registered devices</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>serviceAutoAnswer</cstring>
+ </property>
+ <property name="toggleAction">
+ <bool>true</bool>
+ </property>
+ <property name="iconSet">
+ <iconset>auto_answer.png</iconset>
+ </property>
+ <property name="text">
+ <string>Auto answer</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Auto answer</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>viewLogAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>log_small.png</iconset>
+ </property>
+ <property name="text">
+ <string>Log</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Log...</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>viewCall_HistoryAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>missed.png</iconset>
+ </property>
+ <property name="text">
+ <string>Call history</string>
+ </property>
+ <property name="menuText">
+ <string>Call &amp;history...</string>
+ </property>
+ <property name="accel">
+ <string>F9</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileChangeUserAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>penguin-small.png</iconset>
+ </property>
+ <property name="text">
+ <string>Change user ...</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Change user ...</string>
+ </property>
+ <property name="toolTip">
+ <string>Activate or de-activate users</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>helpWhats_ThisAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>contexthelp.png</iconset>
+ </property>
+ <property name="text">
+ <string>What's This?</string>
+ </property>
+ <property name="menuText">
+ <string>What's &amp;This?</string>
+ </property>
+ <property name="accel">
+ <string>Shift+F1</string>
+ </property>
+ </action>
+ <actiongroup>
+ <property name="name">
+ <cstring>actgrActivateLine</cstring>
+ </property>
+ <property name="on">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Activate line</string>
+ </property>
+ <property name="usesDropDown">
+ <bool>false</bool>
+ </property>
+ <action>
+ <property name="name">
+ <cstring>actionLine1</cstring>
+ </property>
+ <property name="toggleAction">
+ <bool>true</bool>
+ </property>
+ <property name="on">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Line 1</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>actionLine2</cstring>
+ </property>
+ <property name="toggleAction">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Line 2</string>
+ </property>
+ </action>
+ </actiongroup>
+ <action>
+ <property name="name">
+ <cstring>callActivate_LineAction</cstring>
+ </property>
+ <property name="on">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Activate line</string>
+ </property>
+ <property name="menuText">
+ <string>Activate line</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>viewDisplayAction</cstring>
+ </property>
+ <property name="toggleAction">
+ <bool>true</bool>
+ </property>
+ <property name="on">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Display</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Display</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>servicesVoice_mailAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>mwi_none16.png</iconset>
+ </property>
+ <property name="text">
+ <string>Voice mail</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Voice mail</string>
+ </property>
+ <property name="toolTip">
+ <string>Access voice mail</string>
+ </property>
+ <property name="accel">
+ <string>F11</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>actionSendMsg</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>message.png</iconset>
+ </property>
+ <property name="text">
+ <string>Msg</string>
+ </property>
+ <property name="menuText">
+ <string>Instant &amp;message...</string>
+ </property>
+ <property name="toolTip">
+ <string>Instant message</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>viewBuddyListAction</cstring>
+ </property>
+ <property name="toggleAction">
+ <bool>true</bool>
+ </property>
+ <property name="on">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Buddy list</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Buddy list</string>
+ </property>
+ <property name="toolTip">
+ <string>Buddy list</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>helpManualAction</cstring>
+ </property>
+ <property name="text">
+ <string>Manual</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Manual</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>diamondcardSign_upAction</cstring>
+ </property>
+ <property name="text">
+ <string>Sign up</string>
+ </property>
+ <property name="menuText">
+ <string>&amp;Sign up...</string>
+ </property>
+ <property name="toolTip">
+ <string>Sign up</string>
+ </property>
+ </action>
+</actions>
+<connections>
+ <connection>
+ <sender>helpWhats_ThisAction</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>whatsThis()</slot>
+ </connection>
+ <connection>
+ <sender>addressToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>showAddressBook()</slot>
+ </connection>
+ <connection>
+ <sender>callPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>quickCall()</slot>
+ </connection>
+ <connection>
+ <sender>fileChangeUserAction</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>selectProfile()</slot>
+ </connection>
+ <connection>
+ <sender>viewCall_HistoryAction</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>viewHistory()</slot>
+ </connection>
+ <connection>
+ <sender>viewLogAction</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>viewLog()</slot>
+ </connection>
+ <connection>
+ <sender>regDeregisterAll</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>phoneDeregisterAll()</slot>
+ </connection>
+ <connection>
+ <sender>editSysSettingsAction</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>editSysSettings()</slot>
+ </connection>
+ <connection>
+ <sender>callMute</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>phoneMute(bool)</slot>
+ </connection>
+ <connection>
+ <sender>callConference</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>phoneConference()</slot>
+ </connection>
+ <connection>
+ <sender>editUserProfileAction</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>editUserProfile()</slot>
+ </connection>
+ <connection>
+ <sender>helpAboutQtAction</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>aboutQt()</slot>
+ </connection>
+ <connection>
+ <sender>helpAboutAction</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>about()</slot>
+ </connection>
+ <connection>
+ <sender>callRedial</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>phoneRedial()</slot>
+ </connection>
+ <connection>
+ <sender>serviceRedirection</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>srvRedirect()</slot>
+ </connection>
+ <connection>
+ <sender>regShow</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>phoneShowRegistrations()</slot>
+ </connection>
+ <connection>
+ <sender>regDeregister</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>phoneDeregister()</slot>
+ </connection>
+ <connection>
+ <sender>regRegister</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>phoneRegister()</slot>
+ </connection>
+ <connection>
+ <sender>callHold</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>phoneHold(bool)</slot>
+ </connection>
+ <connection>
+ <sender>callReject</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>phoneReject()</slot>
+ </connection>
+ <connection>
+ <sender>callRedirect</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>phoneRedirect()</slot>
+ </connection>
+ <connection>
+ <sender>callInvite</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>phoneInvite()</slot>
+ </connection>
+ <connection>
+ <sender>callDTMF</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>phoneDTMF()</slot>
+ </connection>
+ <connection>
+ <sender>callBye</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>phoneBye()</slot>
+ </connection>
+ <connection>
+ <sender>callAnswer</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>phoneAnswer()</slot>
+ </connection>
+ <connection>
+ <sender>callTermCap</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>phoneTermCap()</slot>
+ </connection>
+ <connection>
+ <sender>line2RadioButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>line2rbChangedState(bool)</slot>
+ </connection>
+ <connection>
+ <sender>line1RadioButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>line1rbChangedState(bool)</slot>
+ </connection>
+ <connection>
+ <sender>fileExitAction</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>fileExit()</slot>
+ </connection>
+ <connection>
+ <sender>actionLine1</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>actionLine1Toggled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>actionLine2</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>actionLine2Toggled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>viewDisplayAction</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>showDisplay(bool)</slot>
+ </connection>
+ <connection>
+ <sender>callTransfer</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>phoneTransfer()</slot>
+ </connection>
+ <connection>
+ <sender>servicesVoice_mailAction</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>popupMenuVoiceMail()</slot>
+ </connection>
+ <connection>
+ <sender>actionSendMsg</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>startMessageSession()</slot>
+ </connection>
+ <connection>
+ <sender>buddyListView</sender>
+ <signal>rightButtonPressed(QListViewItem*,const QPoint&amp;,int)</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>showBuddyListPopupMenu(QListViewItem*,const QPoint&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>buddyListView</sender>
+ <signal>doubleClicked(QListViewItem*)</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>doMessageBuddy(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>viewBuddyListAction</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>showBuddyList(bool)</slot>
+ </connection>
+ <connection>
+ <sender>helpManualAction</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>manual()</slot>
+ </connection>
+ <connection>
+ <sender>diamondcardSign_upAction</sender>
+ <signal>activated()</signal>
+ <receiver>MphoneForm</receiver>
+ <slot>DiamondcardSignUp()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>callComboBox</tabstop>
+ <tabstop>addressToolButton</tabstop>
+ <tabstop>callPushButton</tabstop>
+ <tabstop>displayTextEdit</tabstop>
+ <tabstop>line1RadioButton</tabstop>
+ <tabstop>line2RadioButton</tabstop>
+ <tabstop>userComboBox</tabstop>
+ <tabstop>from1Label</tabstop>
+ <tabstop>subject1Label</tabstop>
+ <tabstop>to1Label</tabstop>
+ <tabstop>subject2Label</tabstop>
+ <tabstop>from2Label</tabstop>
+ <tabstop>to2Label</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in declaration">phone.h</include>
+ <include location="local" impldecl="in declaration">dtmfform.h</include>
+ <include location="local" impldecl="in declaration">inviteform.h</include>
+ <include location="local" impldecl="in declaration">redirectform.h</include>
+ <include location="local" impldecl="in declaration">termcapform.h</include>
+ <include location="local" impldecl="in declaration">srvredirectform.h</include>
+ <include location="local" impldecl="in declaration">userprofileform.h</include>
+ <include location="local" impldecl="in declaration">transferform.h</include>
+ <include location="local" impldecl="in declaration">syssettingsform.h</include>
+ <include location="local" impldecl="in declaration">logviewform.h</include>
+ <include location="local" impldecl="in declaration">historyform.h</include>
+ <include location="local" impldecl="in declaration">selectuserform.h</include>
+ <include location="local" impldecl="in declaration">selectprofileform.h</include>
+ <include location="local" impldecl="in declaration">qevent.h</include>
+ <include location="local" impldecl="in declaration">twinklesystray.h</include>
+ <include location="local" impldecl="in declaration">im/msg_session.h</include>
+ <include location="local" impldecl="in declaration">messageformview.h</include>
+ <include location="local" impldecl="in declaration">buddylistview.h</include>
+ <include location="local" impldecl="in declaration">diamondcard.h</include>
+ <include location="local" impldecl="in implementation">user.h</include>
+ <include location="local" impldecl="in implementation">qtextedit.h</include>
+ <include location="local" impldecl="in implementation">qcheckbox.h</include>
+ <include location="local" impldecl="in implementation">qapplication.h</include>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">qpixmap.h</include>
+ <include location="local" impldecl="in implementation">qiconset.h</include>
+ <include location="local" impldecl="in implementation">qmessagebox.h</include>
+ <include location="local" impldecl="in implementation">audits/memman.h</include>
+ <include location="local" impldecl="in implementation">line.h</include>
+ <include location="local" impldecl="in implementation">stun/stun_transaction.h</include>
+ <include location="local" impldecl="in implementation">log.h</include>
+ <include location="local" impldecl="in implementation">qprogressdialog.h</include>
+ <include location="local" impldecl="in implementation">util.h</include>
+ <include location="local" impldecl="in implementation">qtimer.h</include>
+ <include location="global" impldecl="in implementation">sys/time.h</include>
+ <include location="local" impldecl="in implementation">qframe.h</include>
+ <include location="local" impldecl="in implementation">qcursor.h</include>
+ <include location="local" impldecl="in implementation">qregexp.h</include>
+ <include location="local" impldecl="in implementation">qvalidator.h</include>
+ <include location="local" impldecl="in implementation">buddyform.h</include>
+ <include location="local" impldecl="in implementation">diamondcardprofileform.h</include>
+ <include location="local" impldecl="in implementation">mphoneform.ui.h</include>
+</includes>
+<forwards>
+ <forward>extern t_phone *phone;</forward>
+</forwards>
+<variables>
+ <variable access="private">QTimer tmrFlashMWI;</variable>
+ <variable access="private">GetAddressForm *getAddressForm;</variable>
+ <variable access="private">SelectProfileForm *selectProfileForm;</variable>
+ <variable access="private">SelectUserForm *selectUserForm;</variable>
+ <variable access="private">HistoryForm *historyForm;</variable>
+ <variable access="private">TransferForm *transferForm;</variable>
+ <variable access="private">UserProfileForm *userProfileForm;</variable>
+ <variable access="private">SrvRedirectForm *srvRedirectForm;</variable>
+ <variable access="private">TermCapForm *termCapForm;</variable>
+ <variable access="private">RedirectForm *redirectForm;</variable>
+ <variable access="private">InviteForm *inviteForm;</variable>
+ <variable access="private">DtmfForm *dtmfForm;</variable>
+ <variable access="private">SysSettingsForm *sysSettingsForm;</variable>
+ <variable access="private">QStringList displayContents;</variable>
+ <variable access="private">LogViewForm *logViewForm;</variable>
+ <variable access="private">t_twinkle_sys_tray *sysTray;</variable>
+ <variable access="private">QTimer *lineTimer1;</variable>
+ <variable access="private">QTimer *lineTimer2;</variable>
+ <variable access="private">QTimer *hideLineTimer1;</variable>
+ <variable access="private">QTimer *hideLineTimer2;</variable>
+ <variable access="private">bool viewDisplay;</variable>
+ <variable access="private">bool viewCompactLineStatus;</variable>
+ <variable access="private">bool mwiFlashStatus;</variable>
+ <variable access="private">QPopupMenu *buddyPopupMenu;</variable>
+ <variable access="private">QPopupMenu *buddyListPopupMenu;</variable>
+ <variable access="private">QPopupMenu *changeAvailabilityPopupMenu;</variable>
+ <variable access="private">QToolTip *buddyToolTip;</variable>
+ <variable access="private">bool viewBuddyList;</variable>
+</variables>
+<slots>
+ <slot>closeEvent( QCloseEvent * e )</slot>
+ <slot>fileExit()</slot>
+ <slot>display( const QString &amp; s )</slot>
+ <slot>displayHeader()</slot>
+ <slot>showLineTimer( int line )</slot>
+ <slot>showLineTimer1()</slot>
+ <slot>showLineTimer2()</slot>
+ <slot>updateLineTimer( int line )</slot>
+ <slot>updateLineEncryptionState( int line )</slot>
+ <slot>updateLineStatus( int line )</slot>
+ <slot>updateState()</slot>
+ <slot>updateRegStatus()</slot>
+ <slot>flashMWI()</slot>
+ <slot>updateMwi()</slot>
+ <slot>updateServicesStatus()</slot>
+ <slot>updateMissedCallStatus( int num_missed_calls )</slot>
+ <slot>updateSysTrayStatus()</slot>
+ <slot>updateMenuStatus()</slot>
+ <slot>updateDiamondcardMenu()</slot>
+ <slot>removeDiamondcardAction( int &amp; id )</slot>
+ <slot>removeDiamondcardMenu( QPopupMenu * &amp; menu )</slot>
+ <slot>phoneRegister()</slot>
+ <slot>do_phoneRegister( list&lt;t_user *&gt; user_list )</slot>
+ <slot>phoneDeregister()</slot>
+ <slot>do_phoneDeregister( list&lt;t_user *&gt; user_list )</slot>
+ <slot>phoneDeregisterAll()</slot>
+ <slot>do_phoneDeregisterAll( list&lt;t_user *&gt; user_list )</slot>
+ <slot>phoneShowRegistrations()</slot>
+ <slot>phoneInvite( t_user * user_config, const QString &amp; dest, const QString &amp; subject, bool anonymous )</slot>
+ <slot>phoneInvite( const QString &amp; dest, const QString &amp; subject, bool anonymous )</slot>
+ <slot>phoneInvite()</slot>
+ <slot>do_phoneInvite( t_user * user_config, const QString &amp; display, const t_url &amp; destination, const QString &amp; subject, bool anonymous )</slot>
+ <slot>phoneRedial( void )</slot>
+ <slot>phoneAnswer()</slot>
+ <slot>phoneAnswerFromSystrayPopup()</slot>
+ <slot>phoneBye()</slot>
+ <slot>phoneReject()</slot>
+ <slot>phoneRejectFromSystrayPopup()</slot>
+ <slot>phoneRedirect( const list&lt;string&gt; &amp; contacts )</slot>
+ <slot>phoneRedirect()</slot>
+ <slot>do_phoneRedirect( const list&lt;t_display_url&gt; &amp; destinations )</slot>
+ <slot>phoneTransfer( const string &amp; dest, t_transfer_type transfer_type )</slot>
+ <slot>phoneTransfer()</slot>
+ <slot>do_phoneTransfer( const t_display_url &amp; destination, t_transfer_type transfer_type )</slot>
+ <slot>do_phoneTransferLine()</slot>
+ <slot>phoneHold( bool on )</slot>
+ <slot>phoneConference()</slot>
+ <slot>phoneMute( bool on )</slot>
+ <slot>phoneTermCap( const QString &amp; dest )</slot>
+ <slot>phoneTermCap()</slot>
+ <slot>do_phoneTermCap( t_user * user_config, const t_url &amp; destination )</slot>
+ <slot>phoneDTMF()</slot>
+ <slot>sendDTMF( const QString &amp; digits )</slot>
+ <slot>startMessageSession( void )</slot>
+ <slot>startMessageSession( t_buddy * buddy )</slot>
+ <slot>phoneConfirmZrtpSas( int line )</slot>
+ <slot>phoneConfirmZrtpSas()</slot>
+ <slot>phoneResetZrtpSasConfirmation( int line )</slot>
+ <slot>phoneResetZrtpSasConfirmation()</slot>
+ <slot>phoneEnableZrtp( bool on )</slot>
+ <slot>phoneZrtpGoClearOk( unsigned short line )</slot>
+ <slot>line1rbChangedState( bool on )</slot>
+ <slot>line2rbChangedState( bool on )</slot>
+ <slot>actionLine1Toggled( bool on )</slot>
+ <slot>actionLine2Toggled( bool on )</slot>
+ <slot>srvDnd( bool on )</slot>
+ <slot>srvDnd()</slot>
+ <slot>do_srvDnd_enable( list&lt;t_user *&gt; user_list )</slot>
+ <slot>do_srvDnd_disable( list&lt;t_user *&gt; user_list )</slot>
+ <slot>srvAutoAnswer( bool on )</slot>
+ <slot>srvAutoAnswer()</slot>
+ <slot>do_srvAutoAnswer_enable( list&lt;t_user *&gt; user_list )</slot>
+ <slot>do_srvAutoAnswer_disable( list&lt;t_user *&gt; user_list )</slot>
+ <slot>srvRedirect()</slot>
+ <slot>do_srvRedirect( t_user * user_config, const list&lt;t_display_url&gt; &amp; always, const list&lt;t_display_url&gt; &amp; busy, const list&lt;t_display_url&gt; &amp; noanswer )</slot>
+ <slot>about()</slot>
+ <slot>aboutQt()</slot>
+ <slot>manual()</slot>
+ <slot>editUserProfile()</slot>
+ <slot>editSysSettings()</slot>
+ <slot>selectProfile()</slot>
+ <slot>newUsers( const list&lt;string&gt; &amp; profiles )</slot>
+ <slot>updateUserComboBox()</slot>
+ <slot>updateSipUdpPort()</slot>
+ <slot>updateRtpPorts()</slot>
+ <slot>updateStunSettings( t_user * user_config )</slot>
+ <slot>updateAuthCache( t_user * user_config, const string &amp; realm )</slot>
+ <slot>unsubscribeMWI( t_user * user_config )</slot>
+ <slot>subscribeMWI( t_user * user_config )</slot>
+ <slot>viewLog()</slot>
+ <slot>updateLog( bool log_zapped )</slot>
+ <slot>viewHistory()</slot>
+ <slot>updateCallHistory()</slot>
+ <slot>quickCall()</slot>
+ <slot>addToCallComboBox( const QString &amp; destination )</slot>
+ <slot>showAddressBook()</slot>
+ <slot>selectedAddress( const QString &amp; address )</slot>
+ <slot>enableCallOptions( bool enable )</slot>
+ <slot>keyPressEvent( QKeyEvent * e )</slot>
+ <slot>mouseReleaseEvent( QMouseEvent * e )</slot>
+ <slot>processLeftMouseButtonRelease( QMouseEvent * e )</slot>
+ <slot>processRightMouseButtonRelease( QMouseEvent * e )</slot>
+ <slot>processCryptLabelClick( int line )</slot>
+ <slot>popupMenuVoiceMail( const QPoint &amp; pos )</slot>
+ <slot>popupMenuVoiceMail( void )</slot>
+ <slot>showDisplay( bool on )</slot>
+ <slot>showBuddyList( bool on )</slot>
+ <slot>showCompactLineStatus( bool on )</slot>
+ <slot>populateBuddyList()</slot>
+ <slot>showBuddyListPopupMenu( QListViewItem * item, const QPoint &amp; pos )</slot>
+ <slot>doCallBuddy()</slot>
+ <slot>doMessageBuddy( QListViewItem * qitem )</slot>
+ <slot>doMessageBuddy()</slot>
+ <slot>doEditBuddy()</slot>
+ <slot>doDeleteBuddy()</slot>
+ <slot>doAddBuddy()</slot>
+ <slot>doAvailabilityOffline()</slot>
+ <slot>doAvailabilityOnline()</slot>
+ <slot>DiamondcardSignUp()</slot>
+ <slot>newDiamondcardUser( const QString &amp; filename )</slot>
+ <slot>DiamondcardAction( t_dc_action action, int userIdx )</slot>
+ <slot>DiamondcardRecharge( int userIdx )</slot>
+ <slot>DiamondcardBalanceHistory( int userIdx )</slot>
+ <slot>DiamondcardCallHistory( int userIdx )</slot>
+ <slot>DiamondcardAdminCenter( int userIdx )</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function access="private" specifier="non virtual">destroy()</function>
+ <function access="private" returnType="QString">lineSubstate2str( int line )</function>
+ <function returnType="QString">getMWIStatus( const t_mwi &amp; mwi, bool &amp; msg_waiting ) const</function>
+ <function returnType="t_twinkle_sys_tray *">getSysTray()</function>
+ <function returnType="bool">getViewDisplay()</function>
+ <function returnType="bool">getViewBuddyList()</function>
+ <function returnType="bool">getViewCompactLineStatus()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/mphoneform.ui.h b/src/gui/mphoneform.ui.h
new file mode 100644
index 0000000..6d008e6
--- /dev/null
+++ b/src/gui/mphoneform.ui.h
@@ -0,0 +1,3126 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, pres:erving your code. Ceate an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include "twinkle_config.h"
+#include "twinklesystray.h"
+
+// Time (s) that the conversation timer of a line should stay visible after
+// a call has ended
+#define HIDE_LINE_TIMER_AFTER 5
+
+void MphoneForm::init()
+{
+ // Forms
+ dtmfForm = 0;
+ inviteForm = 0;
+ redirectForm = 0;
+ transferForm = 0;
+ termCapForm = 0;
+ srvRedirectForm = 0;
+ userProfileForm = 0;
+ sysSettingsForm = 0;
+ logViewForm = 0;
+ historyForm = 0;
+ selectUserForm = 0;
+ selectProfileForm = 0;
+ getAddressForm = 0;
+ sysTray = 0;
+
+ // Popup menu for a single buddy
+ QIconSet inviteIcon(QPixmap::fromMimeSource("invite.png"));
+ QIconSet messageIcon(QPixmap::fromMimeSource("message.png"));
+ QIconSet editIcon(QPixmap::fromMimeSource("edit16.png"));
+ QIconSet deleteIcon(QPixmap::fromMimeSource("editdelete.png"));
+ buddyPopupMenu = new QPopupMenu(this);
+ MEMMAN_NEW(buddyPopupMenu);
+ buddyPopupMenu->insertItem(inviteIcon, tr("&Call..."), this, SLOT(doCallBuddy()));
+ buddyPopupMenu->insertItem(messageIcon, tr("Instant &message..."), this, SLOT(doMessageBuddy()));
+ buddyPopupMenu->insertItem(editIcon, tr("&Edit..."), this, SLOT(doEditBuddy()));
+ buddyPopupMenu->insertItem(deleteIcon, tr("&Delete"), this, SLOT(doDeleteBuddy()));
+
+ // Change availibility sub popup menu
+ changeAvailabilityPopupMenu = new QPopupMenu(this);
+ MEMMAN_NEW(changeAvailabilityPopupMenu);
+ QIconSet availOnlineIcon(QPixmap::fromMimeSource("presence_online.png"));
+ QIconSet availOfflineIcon(QPixmap::fromMimeSource("presence_offline.png"));
+ changeAvailabilityPopupMenu->insertItem(availOfflineIcon, tr("O&ffline"), this,
+ SLOT(doAvailabilityOffline()));
+ changeAvailabilityPopupMenu->insertItem(availOnlineIcon, tr("&Online"), this,
+ SLOT(doAvailabilityOnline()));
+
+ // Popup menu for a buddy list (click on profile name)
+ QIconSet changeAvailabilityIcon(QPixmap::fromMimeSource("presence_online.png"));
+ QIconSet addIcon(QPixmap::fromMimeSource("buddy.png"));
+ buddyListPopupMenu = new QPopupMenu(this);
+ MEMMAN_NEW(buddyListPopupMenu);
+ buddyListPopupMenu->insertItem(changeAvailabilityIcon, tr("&Change availability"),
+ changeAvailabilityPopupMenu);
+ buddyListPopupMenu->insertItem(addIcon, tr("&Add buddy..."), this, SLOT(doAddBuddy()));
+
+ // Tool tip for buddy list
+ buddyToolTip = new BuddyListViewTip(buddyListView);
+ MEMMAN_NEW(buddyToolTip);
+
+ // Line timers
+ lineTimer1 = 0;
+ lineTimer2 = 0;
+ timer1TextLabel->hide();
+ timer2TextLabel->hide();
+
+ // Timer to hide the conversation timer after a conversation has ended.
+ hideLineTimer1 = new QTimer(this);
+ MEMMAN_NEW(hideLineTimer1);
+ hideLineTimer2 = new QTimer(this);
+ MEMMAN_NEW(hideLineTimer2);
+ connect(hideLineTimer1, SIGNAL(timeout()), timer1TextLabel, SLOT(hide()));
+ connect(hideLineTimer2, SIGNAL(timeout()), timer2TextLabel, SLOT(hide()));
+
+ // Attach the MWI flash slot to the MWI flash timer
+ connect(&tmrFlashMWI, SIGNAL(timeout()), this, SLOT(flashMWI()));
+
+ // Set toolbar icons for disabled options.
+ setDisabledIcon(callInvite, "invite-disabled.png");
+ setDisabledIcon(callAnswer, "answer-disabled.png");
+ setDisabledIcon(callBye, "bye-disabled.png");
+ setDisabledIcon(callReject, "reject-disabled.png");
+ setDisabledIcon(callRedirect, "redirect-disabled.png");
+ setDisabledIcon(callTransfer, "transfer-disabled.png");
+ setDisabledIcon(callHold, "hold-disabled.png");
+ setDisabledIcon(callConference, "conf-disabled.png");
+ setDisabledIcon(callMute, "mute-disabled.png");
+ setDisabledIcon(callDTMF, "dtmf-disabled.png");
+ setDisabledIcon(callRedial, "redial-disabled.png");
+
+ // Set tool button icons for disabled options
+ setDisabledIcon(addressToolButton, "kontact_contacts-disabled.png");
+
+ // Some text labels on the main window are implemented as QLineEdit
+ // objects as these do not automatically resize when a text set with setText
+ // does not fit. The background of a QLineEdit is static however, it does not
+ // automatically take a background color passed by the -bg parameter.
+ // Set the background color of these QLineEdit objects here.
+ from1Label->setPaletteBackgroundColor(paletteBackgroundColor());
+ to1Label->setPaletteBackgroundColor(paletteBackgroundColor());
+ subject1Label->setPaletteBackgroundColor(paletteBackgroundColor());
+ from2Label->setPaletteBackgroundColor(paletteBackgroundColor());
+ to2Label->setPaletteBackgroundColor(paletteBackgroundColor());
+ subject2Label->setPaletteBackgroundColor(paletteBackgroundColor());
+
+ // A QComboBox accepts a new line through copy/paste.
+ QRegExp rxNoNewLine("[^\\n\\r]*");
+ callComboBox->setValidator(new QRegExpValidator(rxNoNewLine, this));
+
+ if (sys_config->get_gui_use_systray()) {
+ // Create system tray icon
+ sysTray = new t_twinkle_sys_tray(this, "twinkle_sys_tray");
+ MEMMAN_NEW(sysTray);
+ sysTray->setPixmap(
+ QPixmap::fromMimeSource("sys_idle_dis.png"));
+ sysTray->setCaption(PRODUCT_NAME);
+ QToolTip::add(sysTray, PRODUCT_NAME);
+
+ // Add items to the system tray menu
+#ifdef HAVE_KDE
+ KPopupMenu *menu;
+#else
+ QPopupMenu *menu;
+#endif
+ menu = sysTray->contextMenu();
+
+ // Call menu
+ callInvite->addTo(menu);
+ callAnswer->addTo(menu);
+ callBye->addTo(menu);
+ callReject->addTo(menu);
+ callRedirect->addTo(menu);
+ callTransfer->addTo(menu);
+ callHold->addTo(menu);
+ callConference->addTo(menu);
+ callMute->addTo(menu);
+ callDTMF->addTo(menu);
+ callRedial->addTo(menu);
+
+ menu->insertSeparator();
+
+ // Messaging
+ actionSendMsg->addTo(menu);
+
+ menu->insertSeparator();
+
+ // Line activation
+ actgrActivateLine->addTo(menu);
+
+ menu->insertSeparator();
+
+ // Service menu
+ serviceDnd->addTo(menu);
+ serviceRedirection->addTo(menu);
+ serviceAutoAnswer->addTo(menu);
+ servicesVoice_mailAction->addTo(menu);
+
+ menu->insertSeparator();
+
+ // View menu
+ viewCall_HistoryAction->addTo(menu);
+
+ menu->insertSeparator();
+
+ // Diamondcard menu
+ menu->insertItem("Diamondcard", Diamondcard);
+
+ // Exit application when user selects Quit from the tray menu
+ connect(sysTray, SIGNAL(quitSelected()),
+ this, SLOT(fileExit()));
+
+ sysTray->dock();
+ sysTray->show();
+ }
+}
+
+void MphoneForm::destroy()
+{
+ if (dtmfForm) {
+ MEMMAN_DELETE(dtmfForm);
+ delete dtmfForm;
+ }
+ if (inviteForm) {
+ MEMMAN_DELETE(inviteForm);
+ delete inviteForm;
+ }
+ if (redirectForm) {
+ MEMMAN_DELETE(redirectForm);
+ delete redirectForm;
+ }
+ if (termCapForm) {
+ MEMMAN_DELETE(termCapForm);
+ delete termCapForm;
+ }
+ if (srvRedirectForm) {
+ MEMMAN_DELETE(srvRedirectForm);
+ delete srvRedirectForm;
+ }
+ if (userProfileForm) {
+ MEMMAN_DELETE(userProfileForm);
+ delete userProfileForm;
+ }
+ if (transferForm) {
+ MEMMAN_DELETE(transferForm);
+ delete transferForm;
+ }
+ if (sysSettingsForm) {
+ MEMMAN_DELETE(sysSettingsForm);
+ delete sysSettingsForm;
+ }
+ if (logViewForm) {
+ if (logViewForm->isShown()) logViewForm->close();
+ MEMMAN_DELETE(logViewForm);
+ delete logViewForm;
+ }
+ if (historyForm) {
+ if (historyForm->isShown()) historyForm->close();
+ MEMMAN_DELETE(historyForm);
+ delete historyForm;
+ }
+ if (selectUserForm) {
+ MEMMAN_DELETE(selectUserForm);
+ delete selectUserForm;
+ }
+ if (selectProfileForm) {
+ MEMMAN_DELETE(selectProfileForm);
+ delete selectProfileForm;
+ }
+ if (getAddressForm) {
+ MEMMAN_DELETE(getAddressForm);
+ delete getAddressForm;
+ }
+ if (sysTray) {
+ MEMMAN_DELETE(sysTray);
+ delete sysTray;
+ }
+
+ if (lineTimer1) {
+ MEMMAN_DELETE(lineTimer1);
+ delete lineTimer1;
+ }
+ if (lineTimer2) {
+ MEMMAN_DELETE(lineTimer2);
+ delete lineTimer2;
+ }
+ MEMMAN_DELETE(hideLineTimer1);
+ delete hideLineTimer1;
+ MEMMAN_DELETE(hideLineTimer2);
+ delete hideLineTimer2;
+ MEMMAN_DELETE(buddyPopupMenu);
+ delete buddyPopupMenu;
+ MEMMAN_DELETE(changeAvailabilityPopupMenu);
+ delete changeAvailabilityPopupMenu;
+ MEMMAN_DELETE(buddyListPopupMenu);
+ delete buddyListPopupMenu;
+ MEMMAN_DELETE(buddyToolTip);
+ delete buddyToolTip;
+}
+
+QString MphoneForm::lineSubstate2str( int line) {
+ QString reason;
+
+ t_call_info call_info = phone->get_call_info(line);
+
+ switch(phone->get_line_substate(line)) {
+ case LSSUB_IDLE:
+ return tr("idle");
+ case LSSUB_SEIZED:
+ return tr("dialing");
+ case LSSUB_OUTGOING_PROGRESS:
+ reason = call_info.last_provisional_reason.c_str();
+ if (reason == "") {
+ return tr("attempting call, please wait");
+ }
+ return reason;
+ case LSSUB_INCOMING_PROGRESS:
+ return QString("<font color=red>") + tr("incoming call") + "</font>";
+ case LSSUB_ANSWERING:
+ return tr("establishing call, please wait");
+ case LSSUB_ESTABLISHED:
+ if (phone->has_line_media(line)) {
+ return tr("established");
+ } else {
+ return tr("established (waiting for media)");
+ }
+ break;
+ case LSSUB_RELEASING:
+ return tr("releasing call, please wait");
+ default:
+ return tr("unknown state");
+ }
+}
+
+void MphoneForm::closeEvent( QCloseEvent *e )
+{
+ if (sysTray && sys_config->get_gui_hide_on_close()) {
+ hide();
+ } else {
+ fileExit();
+ }
+}
+
+void MphoneForm::fileExit()
+{
+ hide();
+ QApplication::exit(0);
+}
+
+// Append a string to the display window
+void MphoneForm::display( const QString &s )
+{
+ displayContents.push_back(s);
+ if (displayContents.size() > 100) {
+ displayContents.pop_front();
+ }
+
+ displayTextEdit->setText(displayContents.join("\n"));
+
+ // Set cursor position at the end of text
+ displayTextEdit->setCursorPosition(displayTextEdit->paragraphs() - 1, 0);
+}
+
+// Print message header on display
+void MphoneForm::displayHeader()
+{
+ display("");
+ display(current_time2str("%a %H:%M:%S").c_str());
+}
+
+// Update the conversation timer
+void MphoneForm::showLineTimer(int line)
+{
+ struct timeval t;
+ gettimeofday(&t, NULL);
+
+ QLabel *timerLabel;
+
+ if (line == 0) {
+ timerLabel = timer1TextLabel;
+ } else {
+ timerLabel = timer2TextLabel;
+ }
+
+ // Calculate duration of call
+ t_call_record cr = phone->get_call_hist(line);
+ unsigned long duration = t.tv_sec - cr.time_answer;
+
+ timerLabel->setText(timer2str(duration).c_str());
+}
+
+void MphoneForm::showLineTimer1()
+{
+ showLineTimer(0);
+}
+
+void MphoneForm::showLineTimer2()
+{
+ showLineTimer(1);
+}
+
+// Update visibility of the conversation timer for a line
+// Initialize the timer for a new established call.
+void MphoneForm::updateLineTimer(int line)
+{
+ QLabel *timerLabel;
+ QTimer **timer;
+ QTimer *hideLineTimer;
+
+ if (line == 0) {
+ timerLabel = timer1TextLabel;
+ timer = &lineTimer1;
+ hideLineTimer = hideLineTimer1;
+ } else {
+ timerLabel = timer2TextLabel;
+ timer = &lineTimer2;
+ hideLineTimer = hideLineTimer2;
+ }
+
+ t_line_substate line_substate = phone->get_line_substate(line);
+
+ // Stop hide timer if necessary
+ switch(line_substate) {
+ case LSSUB_IDLE:
+ case LSSUB_RELEASING:
+ // Timer can be shown as long as line is idle or releasing.
+ break;
+ default:
+ // The timer showing the call duration should only stay
+ // for a few seconds as long as the line is idle or being
+ // released.
+ // If a new call arrives on the line, the hide timer should
+ // be stopped, otherwise the timer of the new call will
+ // automatically disappear.
+ if (hideLineTimer->isActive()) {
+ hideLineTimer->stop();
+ if (*timer == NULL) timerLabel->hide();
+ }
+ break;
+ }
+
+ switch(line_substate) {
+ case LSSUB_ESTABLISHED:
+ // Initialize and show call duration timer
+ if (*timer == NULL) {
+ timerLabel->setText(timer2str(0).c_str());
+ timerLabel->show();
+ *timer = new QTimer(this);
+ MEMMAN_NEW(*timer);
+
+ if (line == 0) {
+ connect(*timer, SIGNAL(timeout()), this,
+ SLOT(showLineTimer1()));
+ } else {
+ connect(*timer, SIGNAL(timeout()), this,
+ SLOT(showLineTimer2()));
+ }
+
+ // Update timer every 1s
+ (*timer)->start(1000, false);
+ }
+ break;
+ default:
+ // Hide call duration timer
+ if (*timer != NULL) {
+ // Hide the timer after a few seconds
+ hideLineTimer->start(HIDE_LINE_TIMER_AFTER * 1000, true);
+ (*timer)->stop();
+ MEMMAN_DELETE(*timer);
+ *timer = NULL;
+ }
+ break;
+ }
+}
+
+void MphoneForm::updateLineEncryptionState(int line)
+{
+ QLabel *cryptLabel, *sasLabel;
+ if (line == 0) {
+ cryptLabel = crypt1Label;
+ sasLabel = line1SasLabel;
+ } else {
+ cryptLabel = crypt2Label;
+ sasLabel = line2SasLabel;
+ }
+
+ t_audio_session *as = phone->get_line(line)->get_audio_session();
+ if (as && phone->is_line_encrypted(line)) {
+ string zrtp_sas = as->get_zrtp_sas();
+ bool zrtp_sas_confirmed = as->get_zrtp_sas_confirmed();
+ string srtp_cipher_mode = as->get_srtp_cipher_mode();
+
+ QToolTip::remove(cryptLabel);
+ QString toolTip = tr("Voice is encrypted") + " (";
+ toolTip.append(srtp_cipher_mode.c_str()).append(")");
+
+ if (!zrtp_sas.empty()) {
+ // Set tool tip on encryption icon
+ toolTip.append("\nSAS = ");
+ toolTip.append(zrtp_sas.c_str());
+
+ // Show SAS
+ sasLabel->setText(zrtp_sas.c_str());
+ sasLabel->show();
+ } else {
+ sasLabel->hide();
+ }
+
+ if (!zrtp_sas_confirmed) {
+ toolTip.append("\n").append(tr("Click to confirm SAS."));
+ cryptLabel->setFrameStyle(QFrame::Panel | QFrame::Raised);
+ cryptLabel->setPixmap(
+ QPixmap::fromMimeSource("encrypted.png"));
+ } else {
+ toolTip.append("\n").append(tr("Click to clear SAS verification."));
+ cryptLabel->setFrameStyle(QFrame::NoFrame);
+ cryptLabel->setPixmap(
+ QPixmap::fromMimeSource("encrypted_verified.png"));
+ }
+
+ QToolTip::add(cryptLabel, toolTip);
+ cryptLabel->show();
+ } else {
+ cryptLabel->hide();
+ sasLabel->hide();
+ }
+}
+
+void MphoneForm::updateLineStatus(int line)
+{
+ QString state;
+ bool on_hold; // indicates if a line is put on-hold
+ bool in_conference; // indicates if a line is in a conference
+ bool is_muted; // indicates is a line is muted
+ t_refer_state refer_state; // indicates if a call transfer is in progress
+ bool is_transfer_consult; // indicates if the call is a consultation
+ bool to_be_transferred; // indicates if the line is to be transferred after consultation
+ t_call_info call_info;
+ unsigned short dummy;
+
+ QLabel *statLabel, *holdLabel, *muteLabel, *confLabel, *referLabel, *statusTextLabel;
+
+ if (line == 0) {
+ statLabel = line1StatLabel;
+ holdLabel = line1HoldLabel;
+ muteLabel = line1MuteLabel;
+ confLabel = line1ConfLabel;
+ referLabel = line1ReferLabel;
+ statusTextLabel = status1TextLabel;
+ } else {
+ statLabel = line2StatLabel;
+ holdLabel = line2HoldLabel;
+ muteLabel = line2MuteLabel;
+ confLabel = line2ConfLabel;
+ referLabel = line2ReferLabel;
+ statusTextLabel = status2TextLabel;
+ }
+
+ state = lineSubstate2str(line);
+ on_hold = phone->is_line_on_hold(line);
+ if (on_hold) {
+ holdLabel->show();
+ } else {
+ holdLabel->hide();
+ }
+ in_conference = phone->part_of_3way(line);
+ if (in_conference) {
+ confLabel->show();
+ } else {
+ confLabel->hide();
+ }
+ is_muted = phone->is_line_muted(line);
+ if (is_muted) {
+ muteLabel->show();
+ } else {
+ muteLabel->hide();
+ }
+ refer_state = phone->get_line_refer_state(line);
+ is_transfer_consult = phone->is_line_transfer_consult(line, dummy);
+ to_be_transferred = phone->line_to_be_transferred(line, dummy);
+ if (refer_state != REFST_NULL || is_transfer_consult || to_be_transferred) {
+ QString toolTip;
+ QToolTip::remove(referLabel);
+ referLabel->show();
+ if (is_transfer_consult) {
+ referLabel->setPixmap(
+ QPixmap::fromMimeSource("consult-xfer.png"));
+ toolTip = tr("Transfer consultation");
+ } else {
+ referLabel->setPixmap(
+ QPixmap::fromMimeSource("cf.png"));
+ toolTip = tr("Transferring call");
+ }
+ QToolTip::add(referLabel, toolTip);
+ } else {
+ referLabel->hide();
+ }
+
+ statusTextLabel->setText(state);
+
+ t_line_substate line_substate;
+ line_substate = phone->get_line_substate(line);
+ switch (line_substate) {
+ case LSSUB_IDLE:
+ ((t_gui *)ui)->clearLineFields(line);
+ statLabel->hide();
+ break;
+ case LSSUB_SEIZED:
+ case LSSUB_OUTGOING_PROGRESS:
+ statLabel->setPixmap(QPixmap::fromMimeSource("stat_outgoing.png"));
+ statLabel->show();
+ break;
+ case LSSUB_INCOMING_PROGRESS:
+ statLabel->setPixmap(QPixmap::fromMimeSource("stat_ringing.png"));
+ statLabel->show();
+ break;
+ case LSSUB_ANSWERING:
+ statLabel->setPixmap(QPixmap::fromMimeSource("gear.png"));
+ statLabel->show();
+ break;
+ case LSSUB_ESTABLISHED:
+ if (phone->has_line_media(line)) {
+ statLabel->setPixmap(QPixmap::fromMimeSource(
+ "stat_established.png"));
+ } else {
+ statLabel->setPixmap(QPixmap::fromMimeSource(
+ "stat_established_nomedia.png"));
+ }
+ statLabel->show();
+ break;
+ case LSSUB_RELEASING:
+ statLabel->setPixmap(QPixmap::fromMimeSource("gear.png"));
+ statLabel->show();
+ break;
+ default:
+ statLabel->hide();
+ break;
+ }
+
+ updateLineEncryptionState(line);
+ updateLineTimer(line);
+}
+
+// Update line state and enable/disable buttons depending on state
+void MphoneForm::updateState()
+{
+ QString state;
+ int line, other_line;
+ bool on_hold; // indicates if a line is put on-hold
+ bool in_conference; // indicates if a line is in a conference
+ bool is_muted; // indicates is a line is muted
+ t_refer_state refer_state; // indicates if a call transfer is in progress
+ bool is_transfer_consult; // indicates if the call is a consultation
+ bool to_be_transferred; // indicates if the line is to be transferred after consultation
+ bool has_media; // indicates if a media stream is present
+ t_call_info call_info;
+ unsigned short dummy;
+
+ // Update status of line 1
+ updateLineStatus(0);
+
+ // Update status of line 2
+ updateLineStatus(1);
+
+ // Disable/enable controls depending on the active line state
+ t_line_substate line_substate;
+ line = phone->get_active_line();
+ line_substate = phone->get_line_substate(line);
+ on_hold = phone->is_line_on_hold(line);
+ in_conference = phone->part_of_3way(line);
+ is_muted = phone->is_line_muted(line);
+ refer_state = phone->get_line_refer_state(line);
+ is_transfer_consult = phone->is_line_transfer_consult(line, dummy);
+ to_be_transferred = phone->line_to_be_transferred(line, dummy);
+ has_media = phone->has_line_media(line);
+ other_line = (line == 0 ? 1 : 0);
+ call_info = phone->get_call_info(line);
+ t_user *user_config = phone->get_line_user(line);
+
+ // The active line may change when one of the parties in a conference
+ // releases the call. If this happens, then update the state of the
+ // line radio buttons.
+ if (line == 0 && line2RadioButton->isOn())
+ {
+ line1RadioButton->setChecked(true);
+ } else if (line == 1 && line1RadioButton->isOn())
+ {
+ line2RadioButton->setChecked(true);
+ }
+
+ // Same logic for the activate line menu items
+ if (line == 0 && actionLine2->isOn())
+ {
+ actionLine1->setOn(true);
+ } else if (line == 1 && actionLine1->isOn())
+ {
+ actionLine2->setOn(true);
+ }
+
+ switch(line_substate) {
+ case LSSUB_IDLE:
+ enableCallOptions(true);
+ callAnswer->setEnabled(false);
+ callBye->setEnabled(false);
+ callReject->setEnabled(false);
+ callRedirect->setEnabled(false);
+ callTransfer->setEnabled(false);
+ callHold->setEnabled(false);
+ callConference->setEnabled(false);
+ callMute->setEnabled(false);
+ callDTMF->setEnabled(false);
+ callRedial->setEnabled(ui->can_redial());
+ break;
+ case LSSUB_OUTGOING_PROGRESS:
+ enableCallOptions(false);
+ callAnswer->setEnabled(false);
+ callBye->setEnabled(true);
+ callReject->setEnabled(false);
+ callRedirect->setEnabled(false);
+
+ if (is_transfer_consult && user_config->get_allow_transfer_consultation_inprog()) {
+ callTransfer->setEnabled(true);
+ } else {
+ callTransfer->setEnabled(false);
+ }
+
+ callHold->setEnabled(false);
+ callConference->setEnabled(false);
+ callMute->setEnabled(false);
+ callDTMF->setEnabled(call_info.dtmf_supported);
+ callRedial->setEnabled(false);
+ break;
+ case LSSUB_INCOMING_PROGRESS:
+ enableCallOptions(false);
+ callAnswer->setEnabled(true);
+ callBye->setEnabled(false);
+ callReject->setEnabled(true);
+ callRedirect->setEnabled(true);
+ callTransfer->setEnabled(false);
+ callHold->setEnabled(false);
+ callConference->setEnabled(false);
+ callMute->setEnabled(false);
+ callDTMF->setEnabled(call_info.dtmf_supported);
+ callRedial->setEnabled(false);
+ break;
+ case LSSUB_ESTABLISHED:
+ enableCallOptions(false);
+ callInvite->setEnabled(false);
+ callAnswer->setEnabled(false);
+ callBye->setEnabled(true);
+ callReject->setEnabled(false);
+ callRedirect->setEnabled(false);
+
+ if (in_conference) {
+ callTransfer->setEnabled(false);
+ callHold->setEnabled(false);
+ callConference->setEnabled(false);
+ callDTMF->setEnabled(false);
+ } else {
+ callTransfer->setEnabled(has_media &&
+ call_info.refer_supported &&
+ refer_state == REFST_NULL &&
+ !to_be_transferred);
+ callHold->setEnabled(has_media);
+ callDTMF->setEnabled(call_info.dtmf_supported);
+
+ if (phone->get_line_substate(other_line) ==
+ LSSUB_ESTABLISHED)
+ {
+ // If one of the lines is transferring a call, then a
+ // conference cannot be setup.
+ if (refer_state != REFST_NULL ||
+ phone->get_line_refer_state(other_line) != REFST_NULL)
+ {
+ callConference->setEnabled(false);
+ } else {
+ callConference->setEnabled(has_media);
+ }
+ } else {
+ callConference->setEnabled(false);
+ }
+ }
+
+ callMute->setEnabled(true);
+ callRedial->setEnabled(false);
+ break;
+ case LSSUB_SEIZED:
+ case LSSUB_ANSWERING:
+ case LSSUB_RELEASING:
+ // During dialing, answering and call release no other actions are
+ // possible
+ enableCallOptions(false);
+ callAnswer->setEnabled(false);
+ callBye->setEnabled(false);
+ callReject->setEnabled(false);
+ callRedirect->setEnabled(false);
+ callTransfer->setEnabled(false);
+ callHold->setEnabled(false);
+ callConference->setEnabled(false);
+ callMute->setEnabled(false);
+ callDTMF->setEnabled(false);
+ callRedial->setEnabled(false);
+ break;
+ default:
+ enableCallOptions(true);
+ callAnswer->setEnabled(true);
+ callBye->setEnabled(true);
+ callReject->setEnabled(true);
+ callRedirect->setEnabled(true);
+ callTransfer->setEnabled(true);
+ callHold->setEnabled(true);
+ callConference->setEnabled(false);
+ callMute->setEnabled(true);
+ callDTMF->setEnabled(true);
+ callRedial->setEnabled(ui->can_redial());
+ }
+
+ // Set hold action in correct state
+ callHold->setOn(on_hold);
+
+ // Set mute action in correct state
+ callMute->setOn(is_muted);
+
+ // Set transfer action in correct state
+ callTransfer->setOn(is_transfer_consult);
+
+ // Hide redirect form if it is still visible, but not applicable anymore
+ if (!callRedirect->isEnabled() && redirectForm &&
+ redirectForm->isVisible())
+ {
+ redirectForm->hide();
+ }
+
+ // Hide transfer form if it is still visible, but not applicable anymore
+ if (!callTransfer->isEnabled() && transferForm &&
+ transferForm->isVisible())
+ {
+ transferForm->hide();
+ }
+
+ // Hide DTMF form if it is still visible, but not applicable anymore
+ if (!callDTMF->isEnabled() && dtmfForm &&
+ dtmfForm->isVisible())
+ {
+ dtmfForm->hide();
+ }
+
+ // Set last called address in the redial tool tip
+ t_url last_url;
+ string last_display;
+ string last_subject;
+ t_user *last_user;
+ bool hide_user;
+ if (callRedial->isEnabled() &&
+ ui->get_last_call_info(last_url, last_display, last_subject, &last_user, hide_user))
+ {
+ QString s = "<b>";
+ s += tr("Repeat last call");
+ s += "</b><br>";
+ s += "<table>";
+
+ s += "<tr><td>";
+ s += tr("User:").append("</td><td>");
+ s += last_user->get_profile_name().c_str();
+ s.append("</td></tr><tr><td>").append(tr("Call:")).append("</td><td>");
+ s += ui->format_sip_address(last_user,
+ last_display, last_url).c_str();
+ s += "</td></tr>";
+
+ if (!last_subject.empty()) {
+ s.append("<tr><td>").append(tr("Subject:")).append("</td><td>");
+ s += last_subject.c_str();
+ s += "</td></tr>";
+ }
+
+ if (hide_user) {
+ s.append("<tr><td colspan=2>").append(tr("Hide identity"));
+ s += "</td></tr>";
+ }
+
+ s += "</table>";
+ callRedial->setToolTip(s);
+ } else {
+ callRedial->setToolTip(tr("Repeat last call"));
+ }
+ callRedial->setStatusTip(tr("Repeat last call"));
+
+ updateSysTrayStatus();
+}
+
+// Update registration status
+void MphoneForm::updateRegStatus()
+{
+ size_t num_registered = 0;
+ size_t num_failed = 0;
+ QString toolTip = "<b>";
+ toolTip.append(tr("Registration status:"));
+ toolTip.append("</b><br>");
+ toolTip.append("<table>");
+
+ // Count number of succesful and failed registrations.
+ // Determine tool tip showing registration details for all users.
+ list<t_user *>user_list = phone->ref_users();
+ for (list<t_user *>::iterator i = user_list.begin(); i != user_list.end(); i++) {
+ toolTip.append("<tr><td>");
+ toolTip.append((*i)->get_profile_name().c_str());
+ toolTip.append("</td><td>");
+ if (phone->get_is_registered(*i)) {
+ num_registered++;
+ toolTip.append(tr("Registered"));
+ } else if (phone->get_last_reg_failed(*i)) {
+ num_failed++;
+ toolTip.append(tr("Failed"));
+ } else {
+ toolTip.append(tr("Not registered").replace(' ', "&nbsp;"));
+ }
+ toolTip.append("</td></tr>");
+ }
+ toolTip.append("</table><br>");
+ toolTip.append("<i>");
+ toolTip.append(tr("Click to show registrations.").replace(' ', "&nbsp;"));
+ toolTip.append("</i>");
+
+ // Set registration status
+ if (num_registered == user_list.size()) {
+ // All users are registered
+ statRegLabel->setPixmap(QPixmap::fromMimeSource("twinkle16.png"));
+ } else if (num_failed == user_list.size()) {
+ // All users failed to register
+ statRegLabel->setPixmap(QPixmap::fromMimeSource("reg_failed.png"));
+ } else if (num_registered > 0) {
+ // Some users are registered
+ statRegLabel->setPixmap(QPixmap::fromMimeSource(
+ "twinkle16.png"));
+ } else if (num_failed > 0) {
+ // Some users failed, none are registered
+ statRegLabel->setPixmap(QPixmap::fromMimeSource("reg_failed.png"));
+ } else {
+ // No users are registered, no users failed
+ statRegLabel->setPixmap(QPixmap::fromMimeSource("twinkle16-disabled.png"));
+ }
+
+ // Set tool tip with detailed info.
+ QToolTip::remove(statRegLabel);
+
+ if (num_registered > 0 || num_failed > 0) {
+ QToolTip::add(statRegLabel, toolTip);
+ } else {
+ QToolTip::add(statRegLabel, tr("No users are registered."));
+ }
+
+ updateSysTrayStatus();
+}
+
+// Create a status message based on the number of waiting messages.
+// On return, msg_waiting will indicate if the MWI indicator should show
+// waiting messages.
+QString MphoneForm::getMWIStatus(const t_mwi &mwi, bool &msg_waiting) const
+{
+ QString status;
+ msg_waiting = false;
+ t_msg_summary summary = mwi.get_voice_msg_summary();
+
+ if (summary.newmsgs > 0 && summary.oldmsgs > 0) {
+ if (summary.oldmsgs == 1) {
+ status = tr("%1 new, 1 old message").
+ arg(summary.newmsgs);
+ } else {
+ status = tr("%1 new, %2 old messages").
+ arg(summary.newmsgs).
+ arg(summary.oldmsgs);
+ }
+ msg_waiting = true;
+ } else if (summary.newmsgs > 0 && summary.oldmsgs == 0) {
+ if (summary.newmsgs == 1) {
+ status = tr("1 new message");
+ } else {
+ status = tr("%1 new messages").
+ arg(summary.newmsgs);
+ }
+ msg_waiting = true;
+ } else if (summary.oldmsgs > 0) {
+ if (summary.oldmsgs == 1) {
+ status = tr("1 old message");
+ } else {
+ status = tr("%1 old messages").
+ arg(summary.oldmsgs);
+ }
+ } else {
+ if (mwi.get_msg_waiting()) {
+ status = tr("Messages waiting");
+ msg_waiting = true;
+ } else {
+ status = tr("No messages");
+ }
+ }
+
+ return status.replace(' ', "&nbsp;");
+}
+
+// Flash the MWI icon
+void MphoneForm::flashMWI()
+{
+ if (mwiFlashStatus) {
+ mwiFlashStatus = false;
+ statMWILabel->setPixmap(QPixmap::fromMimeSource(
+ "mwi_none16.png"));
+ } else {
+ mwiFlashStatus = true;
+ statMWILabel->setPixmap(QPixmap::fromMimeSource(
+ "mwi_new16.png"));
+ }
+}
+
+// Update MWI
+void MphoneForm::updateMwi()
+{
+ bool mwi_known = false;
+ bool mwi_new_msgs = false;
+ bool mwi_failure = false;
+
+ // Determine tool tip
+ QString toolTip = tr("<b>Voice mail status:</b>").append("\n");
+ toolTip.append("<br><table>");
+ list<t_user *>user_list = phone->ref_users();
+ for (list<t_user *>::iterator i = user_list.begin(); i != user_list.end(); i++) {
+ toolTip.append("<tr><td>");
+ toolTip.append((*i)->get_profile_name().c_str());
+ t_mwi mwi = phone->get_mwi(*i);
+ toolTip.append("</td><td>");
+ if (phone->is_mwi_subscribed(*i)) {
+ if (mwi.get_status() == t_mwi::MWI_KNOWN) {
+ bool new_msgs;
+ QString status = getMWIStatus(mwi, new_msgs);
+ toolTip.append(status);
+ mwi_known = true;
+ mwi_new_msgs |= new_msgs;
+ } else if (mwi.get_status() == t_mwi::MWI_FAILED) {
+ toolTip.append(tr("Failure"));
+ mwi_failure = true;
+ } else {
+ toolTip.append(tr("Unknown"));
+ }
+ } else {
+ if ((*i)->get_mwi_sollicited()) {
+ if (mwi.get_status() == t_mwi::MWI_FAILED) {
+ toolTip.append(tr("Failure"));
+ mwi_failure = true;
+ } else {
+ toolTip.append(tr("Unknown"));
+ }
+ } else {
+ // Unsollicited MWI
+ if (mwi.get_status() == t_mwi::MWI_KNOWN) {
+ bool new_msgs;
+ QString status = getMWIStatus(mwi, new_msgs);
+ toolTip.append(status);
+ mwi_known = true;
+ mwi_new_msgs |= new_msgs;
+ } else {
+ toolTip.append(tr("Unknown"));
+ }
+ }
+ }
+ toolTip.append("</td></tr>");
+ }
+
+ toolTip.append("</table><br>");
+ toolTip.append("<i>");
+ toolTip.append(tr("Click to access voice mail.").replace(' ', "&nbsp;"));
+ toolTip.append("</i>");
+
+ // Set MWI icon
+ if (mwi_new_msgs) {
+ statMWILabel->setPixmap(QPixmap::fromMimeSource(
+ "mwi_new16.png"));
+ mwiFlashStatus = true;
+
+ // Start the flash MWI timer to flash the indicator
+ tmrFlashMWI.start(1000);
+ } else if (mwi_failure) {
+ tmrFlashMWI.stop();
+ statMWILabel->setPixmap(QPixmap::fromMimeSource(
+ "mwi_failure16.png"));
+ } else if (mwi_known) {
+ tmrFlashMWI.stop();
+ statMWILabel->setPixmap(QPixmap::fromMimeSource(
+ "mwi_none16.png"));
+ } else {
+ tmrFlashMWI.stop();
+ statMWILabel->setPixmap(QPixmap::fromMimeSource(
+ "mwi_none16_dis.png"));
+ }
+
+ // Set tool tip
+ QToolTip::remove(statMWILabel);
+ QToolTip::add(statMWILabel, toolTip);
+
+ updateSysTrayStatus();
+}
+
+// Update active services status
+void MphoneForm::updateServicesStatus()
+{
+ size_t num_dnd = 0;
+ size_t num_cf = 0;
+ size_t num_auto_answer = 0;
+ QString tipDnd = "<b>";
+ tipDnd += tr("Do not disturb active for:").replace(' ', "&nbsp;");
+ tipDnd += "</b><br>\n<table>";
+ QString tipCf = "<b>";
+ tipCf += tr("Redirection active for:").replace(' ', "&nbsp;");
+ tipCf += "</b><br>\n<table>";
+ QString tipAa = "<b>";
+ tipAa += tr("Auto answer active for:").replace(' ', "&nbsp;");
+ tipAa += "</b><br>\n<table>";
+
+ // Calculate number of services active.
+ // Determine tool tips with detailed service status for all users.
+ list<t_user *>user_list = phone->ref_users();
+ for (list<t_user *>::iterator i = user_list.begin(); i != user_list.end(); i++) {
+ if (phone->ref_service(*i)->is_dnd_active()) {
+ num_dnd++;
+ tipDnd.append("<tr><td>");
+ tipDnd.append((*i)->get_profile_name().c_str());
+ tipDnd.append("</td></tr>");
+ }
+ if (phone->ref_service(*i)->is_cf_active()) {
+ num_cf++;
+ tipCf.append("<tr><td>");
+ tipCf.append((*i)->get_profile_name().c_str());
+ tipCf.append("</td></tr>");
+ }
+ if (phone->ref_service(*i)->is_auto_answer_active()) {
+ num_auto_answer++;
+ tipAa.append("<tr><td>");
+ tipAa.append((*i)->get_profile_name().c_str());
+ tipAa.append("</td></tr>");
+ }
+ }
+
+ QString footer = "<i>";
+ footer += tr("Click to activate/deactivate").replace(' ', "&nbsp;");
+ footer += "</i>";
+
+ tipDnd.append("</table><br>");
+ tipDnd.append(footer);
+ tipCf.append("</table><br>");
+ tipCf.append(footer);
+ tipAa.append("</table><br>");
+ tipAa.append(footer);
+
+ // Set service status
+ if (num_dnd == user_list.size()) {
+ // All users enabled dnd
+ statDndLabel->setPixmap(QPixmap::fromMimeSource("cancel.png"));
+ } else if (num_dnd > 0) {
+ // Some users enabled dnd
+ statDndLabel->setPixmap(QPixmap::fromMimeSource("cancel.png"));
+ } else {
+ // No users enabeld dnd
+ statDndLabel->setPixmap(QPixmap::fromMimeSource("cancel-disabled.png"));
+ }
+
+ if (num_cf == user_list.size()) {
+ // All users enabled redirecton
+ statCfLabel->setPixmap(QPixmap::fromMimeSource("cf.png"));
+ } else if (num_cf > 0) {
+ // Some users enabled redirection
+ statCfLabel->setPixmap(QPixmap::fromMimeSource("cf.png"));
+ } else {
+ // No users enabled redirection
+ statCfLabel->setPixmap(QPixmap::fromMimeSource("cf-disabled.png"));
+ }
+
+ if (num_auto_answer == user_list.size()) {
+ // All users enabled auto answer
+ statAaLabel->setPixmap(QPixmap::fromMimeSource("auto_answer.png"));
+ } else if (num_auto_answer > 0) {
+ // Some users enabled auto answer
+ statAaLabel->setPixmap(QPixmap::fromMimeSource(
+ "auto_answer.png"));
+ } else {
+ // No users enabeld auto answer
+ statAaLabel->setPixmap(QPixmap::fromMimeSource(
+ "auto_answer-disabled.png"));
+ }
+
+ // Set tool tip with detailed info for multiple users.
+ QToolTip::remove(statDndLabel);
+ QToolTip::remove(statCfLabel);
+ QToolTip::remove(statAaLabel);
+
+ QString clickToActivate("<i>");
+ clickToActivate += tr("Click to activate").replace(' ', "&nbsp;");
+ clickToActivate += "</i>";
+ if (num_dnd > 0) {
+ QToolTip::add(statDndLabel, tipDnd);
+ } else {
+ QString status("<p>");
+ status += tr("Do not disturb is not active.").replace(' ', "&nbsp;");
+ status += "</p>";
+ status += clickToActivate;
+ QToolTip::add(statDndLabel, status);
+ }
+
+ if (num_cf > 0) {
+ QToolTip::add(statCfLabel, tipCf);
+ } else {
+ QString status("<p>");
+ status += tr("Redirection is not active.").replace(' ', "&nbsp;");
+ status += "</p>";
+ status += clickToActivate;
+ QToolTip::add(statCfLabel, status);
+ }
+
+ if (num_auto_answer > 0) {
+ QToolTip::add(statAaLabel, tipAa);
+ } else {
+ QString status("<p>");
+ status += tr("Auto answer is not active.").replace(' ', "&nbsp;");
+ status += "</p>";
+ status += clickToActivate;
+ QToolTip::add(statAaLabel, status);
+ }
+
+ updateSysTrayStatus();
+}
+
+void MphoneForm::updateMissedCallStatus(int num_missed_calls)
+{
+ QToolTip::remove(statMissedLabel);
+
+ QString clickDetails("<i>");
+ clickDetails += tr("Click to see call history for details.").replace(' ', "&nbsp;");
+ clickDetails += "</i>";
+ if (num_missed_calls == 0) {
+ statMissedLabel->setPixmap(QPixmap::fromMimeSource("missed-disabled.png"));
+ QString status("<p>");
+ status += tr("You have no missed calls.").replace(' ', "&nbsp;");
+ status += "</p>";
+ status += clickDetails;
+ QToolTip::add(statMissedLabel, status);
+ } else {
+ statMissedLabel->setPixmap(
+ QPixmap::fromMimeSource("missed.png"));
+
+ QString tip("<p>");
+ if (num_missed_calls == 1) {
+ tip += tr("You missed 1 call.").replace(' ', "&nbsp;");
+ } else {
+ tip += tr("You missed %1 calls.").arg(num_missed_calls).
+ replace(' ', "&nbsp;");
+ }
+ tip += "</p>";
+ tip += clickDetails;
+ QToolTip::add(statMissedLabel, tip);
+ }
+
+ updateSysTrayStatus();
+}
+
+// Update system tray status
+void MphoneForm::updateSysTrayStatus()
+{
+ QString icon_name;
+ bool cf_active = false;
+ bool dnd_active = false;
+ bool auto_answer_active = false;
+ bool multi_services = false;
+ int num_services;
+ bool msg_waiting = false;
+
+ if (!sysTray) return;
+
+ // Get status of active line
+ int line = phone->get_active_line();
+ t_line_substate line_substate = phone->get_line_substate(line);
+
+ list<t_user *> user_list = phone->ref_users();
+
+ switch(line_substate) {
+ case LSSUB_IDLE:
+ case LSSUB_SEIZED:
+ // Determine MWI and service status
+ user_list = phone->ref_users();
+ for (list<t_user *>::iterator i = user_list.begin(); i != user_list.end(); i++) {
+ t_mwi mwi = phone->get_mwi(*i);
+ if (mwi.get_status() == t_mwi::MWI_KNOWN &&
+ mwi.get_msg_waiting() &&
+ mwi.get_voice_msg_summary().newmsgs > 0)
+ {
+ msg_waiting = true;
+ } else if (phone->ref_service(*i)->multiple_services_active()) {
+ multi_services = true;
+ } else {
+ if (phone->ref_service(*i)->is_dnd_active()) {
+ dnd_active = true;
+ }
+ if (phone->ref_service(*i)->is_cf_active()) {
+ cf_active = true;
+ }
+ if (phone->ref_service(*i)->is_auto_answer_active()) {
+ auto_answer_active = true;
+ }
+ }
+ }
+
+ // If there are messages waiting, then show MWI icon
+ if (msg_waiting) {
+ icon_name = "sys_mwi";
+ break;
+ }
+
+ // If there are missed calls, then show the missed call icon
+ if (call_history->get_num_missed_calls() > 0) {
+ icon_name = "sys_missed";
+ break;
+ }
+
+ // If a service is active, then show the service icon
+ num_services = (dnd_active ? 1 : 0) + (cf_active ? 1 : 0) +
+ (auto_answer_active ? 1 : 0);
+
+ if (multi_services || num_services > 1) {
+ icon_name = "sys_services";
+ } else if (dnd_active) {
+ icon_name = "sys_dnd";
+ } else if (cf_active) {
+ icon_name = "sys_redir";
+ } else if (auto_answer_active) {
+ icon_name = "sys_auto_ans";
+ } else {
+ // No service is active, show the idle icon
+ if (icon_name.isEmpty()) icon_name = "sys_idle";
+ }
+
+ break;
+ case LSSUB_ESTABLISHED:
+ if (phone->is_line_on_hold(line)) {
+ icon_name = "sys_hold";
+ } else if (phone->is_line_muted(line)) {
+ icon_name = "sys_mute";
+ } else if (phone->is_line_encrypted(line)) {
+ t_audio_session *as = phone->get_line(line)->get_audio_session();
+ if (as && as->get_zrtp_sas_confirmed()) {
+ icon_name = "sys_encrypted_verified";
+ } else {
+ icon_name = "sys_encrypted";
+ }
+ } else {
+ icon_name = "sys_busy_estab";
+ }
+ break;
+ default:
+ // Line is in a busy transient state
+ icon_name = "sys_busy_trans";
+ }
+
+ // Based on the registration status use the active or disabled version
+ // of the icon.
+ bool registered = false;
+ for (list<t_user *>::iterator i = user_list.begin(); i != user_list.end(); i++) {
+ if (phone->get_is_registered(*i)) {
+ registered = true;
+ break;
+ }
+ }
+
+ if (registered) {
+ icon_name += ".png";
+ } else {
+ icon_name += "_dis.png";
+ }
+
+ sysTray->setPixmap(QPixmap::fromMimeSource(icon_name));
+}
+
+// Update menu status based on the number of active users
+void MphoneForm::updateMenuStatus()
+{
+ // Some menu options should be toggle actions when there is only
+ // 1 user active, but they should be normal actions when there are
+ // multiple users.
+ disconnect(serviceDnd, 0, 0, 0);
+ disconnect(serviceAutoAnswer, 0, 0, 0);
+ if (phone->ref_users().size() == 1) {
+ t_service *srv = phone->ref_service(phone->ref_users().front());
+
+ serviceDnd->setToggleAction(true);
+ serviceDnd->setOn(srv->is_dnd_active());
+ connect(serviceDnd, SIGNAL(toggled(bool)),
+ this, SLOT(srvDnd(bool)));
+
+ serviceAutoAnswer->setToggleAction(true);
+ serviceAutoAnswer->setOn(srv->is_auto_answer_active());
+ connect(serviceAutoAnswer, SIGNAL(toggled(bool)),
+ this, SLOT(srvAutoAnswer(bool)));
+ } else {
+ serviceDnd->setOn(false);
+ serviceDnd->setToggleAction(false);
+ connect(serviceDnd, SIGNAL(activated()),
+ this, SLOT(srvDnd()));
+
+ serviceAutoAnswer->setOn(false);
+ serviceAutoAnswer->setToggleAction(false);
+ connect(serviceAutoAnswer, SIGNAL(activated()),
+ this, SLOT(srvAutoAnswer()));
+ }
+
+ updateDiamondcardMenu();
+}
+
+void MphoneForm::updateDiamondcardMenu()
+{
+ // If one Diamondcard user is active, then create actions in the Diamondcard
+ // main menu for recharging, call history, etc. These actions will show the
+ // Diamondcard web page.
+ // If multiple Diamondcard users are active then create a submenu of each
+ // Diamondcard action. In each submenu create an item for each user.
+ // When a user item is clicked, the web page for the action and that user is
+ // shown.
+ list<t_user *> diamondcard_users = diamondcard_get_users(phone);
+
+ // Menu item identifiers
+ static int rechargeId = -1;
+ static int balanceHistoryId = -1;
+ static int callHistoryId = -1;
+ static int adminCenterId = -1;
+
+ // Sub menu's
+ static QPopupMenu *rechargeMenu = NULL;
+ static QPopupMenu *balanceHistoryMenu = NULL;
+ static QPopupMenu *callHistoryMenu = NULL;
+ static QPopupMenu *adminCenterMenu = NULL;
+
+ // Clear old menu
+ removeDiamondcardAction(rechargeId);
+ removeDiamondcardAction(balanceHistoryId);
+ removeDiamondcardAction(callHistoryId);
+ removeDiamondcardAction(adminCenterId);
+ removeDiamondcardMenu(rechargeMenu);
+ removeDiamondcardMenu(balanceHistoryMenu);
+ removeDiamondcardMenu(callHistoryMenu);
+ removeDiamondcardMenu(adminCenterMenu);
+
+ if (diamondcard_users.size() <= 1)
+ {
+ rechargeId = Diamondcard->insertItem(tr("Recharge..."), this, SLOT(DiamondcardRecharge(int)));
+ Diamondcard->setItemParameter(rechargeId, 0);
+ balanceHistoryId = Diamondcard->insertItem(tr("Balance history..."), this, SLOT(DiamondcardBalanceHistory(int)));
+ Diamondcard->setItemParameter(balanceHistoryId, 0);
+ callHistoryId = Diamondcard->insertItem(tr("Call history..."), this, SLOT(DiamondcardCallHistory(int)));
+ Diamondcard->setItemParameter(callHistoryId, 0);
+ adminCenterId = Diamondcard->insertItem(tr("Admin center..."), this, SLOT(DiamondcardAdminCenter(int)));
+ Diamondcard->setItemParameter(adminCenterId, 0);
+
+ // Disable actions as there is no active Diamondcard users.
+ if (diamondcard_users.empty()) {
+ Diamondcard->setItemEnabled(rechargeId, false);
+ Diamondcard->setItemEnabled(balanceHistoryId, false);
+ Diamondcard->setItemEnabled(callHistoryId, false);
+ Diamondcard->setItemEnabled(adminCenterId, false);
+ }
+ }
+ else
+ {
+ rechargeMenu = new QPopupMenu(this);
+ balanceHistoryMenu = new QPopupMenu(this);
+ callHistoryMenu = new QPopupMenu(this);
+ adminCenterMenu = new QPopupMenu(this);
+ // No MEMMAN registration as the popup menu may be automatically
+ // deleted by Qt on application close down. This would show up as
+ // a memory leak in MEMMAN.
+
+ // Insert a menu item for each Diamondcard user.
+ int idx = 0;
+ for (list<t_user *>::const_iterator it = diamondcard_users.begin();
+ it != diamondcard_users.end(); ++it)
+ {
+ int menuId;
+ t_user *user = *it;
+
+ // Set the index in the user list as parameter to the menu item.
+ // When the menu item gets clicked, then the receiver of the signal
+ // received this parameter and can use it as an index in the user list
+ // to find the user.
+
+ menuId = rechargeMenu->insertItem(user->get_profile_name().c_str(), this,
+ SLOT(DiamondcardRecharge(int)));
+ rechargeMenu->setItemParameter(menuId, idx);
+ menuId = balanceHistoryMenu->insertItem(user->get_profile_name().c_str(), this,
+ SLOT(DiamondcardBalanceHistory(int)));
+ balanceHistoryMenu->setItemParameter(menuId, idx);
+ menuId = callHistoryMenu->insertItem(user->get_profile_name().c_str(), this,
+ SLOT(DiamondcardCallHistory(int)));
+ callHistoryMenu->setItemParameter(menuId, idx);
+ menuId = adminCenterMenu->insertItem(user->get_profile_name().c_str(), this,
+ SLOT(DiamondcardAdminCenter(int)));
+ adminCenterMenu->setItemParameter(menuId, idx);
+
+ ++idx;
+ }
+
+ // Add the Diamondcard popup menus to the main Diamondcard menu.
+ Diamondcard->insertItem(tr("Recharge"), rechargeMenu);
+ Diamondcard->insertItem(tr("Balance history"), balanceHistoryMenu);
+ Diamondcard->insertItem(tr("Call history"), callHistoryMenu);
+ Diamondcard->insertItem(tr("Admin center"), adminCenterMenu);
+ }
+}
+
+void MphoneForm::removeDiamondcardAction(int &id)
+{
+ if (id != -1) {
+ Diamondcard->removeItem(id);
+ id = -1;
+ }
+}
+
+void MphoneForm::removeDiamondcardMenu(QPopupMenu* &menu)
+{
+ if (menu) {
+ delete menu;
+ menu = NULL;
+ }
+}
+
+void MphoneForm::phoneRegister()
+{
+ t_gui *gui = (t_gui *)ui;
+ list<t_user *> user_list = phone->ref_users();
+
+ if (user_list.size() > 1) {
+ if (selectUserForm) {
+ MEMMAN_DELETE(selectUserForm);
+ delete (selectUserForm);
+ }
+
+ selectUserForm = new SelectUserForm(this, "register", true);
+ MEMMAN_NEW(selectUserForm);
+
+ connect(selectUserForm, SIGNAL(selection(list<t_user *>)), this,
+ SLOT(do_phoneRegister(list<t_user *>)));
+ selectUserForm->show(SELECT_REGISTER);
+ } else {
+ gui->action_register(user_list);
+ }
+}
+
+void MphoneForm::do_phoneRegister(list<t_user *> user_list)
+{
+ ((t_gui *)ui)->action_register(user_list);
+}
+
+void MphoneForm::phoneDeregister()
+{
+ t_gui *gui = (t_gui *)ui;
+ list<t_user *> user_list = phone->ref_users();
+
+ if (user_list.size() > 1) {
+ if (selectUserForm) {
+ MEMMAN_DELETE(selectUserForm);
+ delete (selectUserForm);
+ }
+
+ selectUserForm = new SelectUserForm(this, "deregister", true);
+ MEMMAN_NEW(selectUserForm);
+
+ connect(selectUserForm, SIGNAL(selection(list<t_user *>)), this,
+ SLOT(do_phoneDeregister(list<t_user *>)));
+ selectUserForm->show(SELECT_DEREGISTER);
+ } else {
+ gui->action_deregister(user_list, false);
+ }
+}
+
+void MphoneForm::do_phoneDeregister(list<t_user *> user_list)
+{
+ ((t_gui *)ui)->action_deregister(user_list, false);
+}
+
+void MphoneForm::phoneDeregisterAll()
+{
+ t_gui *gui = (t_gui *)ui;
+ list<t_user *> user_list = phone->ref_users();
+
+ if (user_list.size() > 1) {
+ if (selectUserForm) {
+ MEMMAN_DELETE(selectUserForm);
+ delete (selectUserForm);
+ }
+
+ selectUserForm = new SelectUserForm(this, "deregister all", true);
+ MEMMAN_NEW(selectUserForm);
+
+ connect(selectUserForm, SIGNAL(selection(list<t_user *>)), this,
+ SLOT(do_phoneDeregisterAll(list<t_user *>)));
+ selectUserForm->show(SELECT_DEREGISTER_ALL);
+ } else {
+ gui->action_deregister(user_list, true);
+ }
+}
+
+void MphoneForm::do_phoneDeregisterAll(list<t_user *> user_list)
+{
+ ((t_gui *)ui)->action_deregister(user_list, true);
+}
+
+void MphoneForm::phoneShowRegistrations()
+{
+ list<t_user *> user_list = phone->ref_users();
+ ((t_gui *)ui)->action_show_registrations(user_list);
+}
+
+
+// Show the semi-modal invite window
+void MphoneForm::phoneInvite(t_user * user_config,
+ const QString &dest, const QString &subject, bool anonymous)
+{
+ // Seize the line, so no incoming call can take the line
+ if (!((t_gui *)ui)->action_seize()) return;
+
+ if (inviteForm) {
+ inviteForm->clear();
+ } else {
+ inviteForm = new InviteForm(this, "invite", true);
+ MEMMAN_NEW(inviteForm);
+
+ // Initialize the destination history list
+ for (int i = callComboBox->count() - 1; i >= 0; i--) {
+ inviteForm->addToInviteComboBox(callComboBox->text(i));
+ }
+
+ connect(inviteForm,
+ SIGNAL(destination(t_user *, const QString &, const t_url &,
+ const QString &, bool)),
+ this,
+ SLOT(do_phoneInvite(t_user *, const QString &,
+ const t_url &, const QString &, bool)));
+
+ connect(inviteForm, SIGNAL(raw_destination(const QString &)),
+ this, SLOT(addToCallComboBox(const QString &)));
+ }
+
+ inviteForm->show(user_config, dest, subject, anonymous);
+ updateState();
+}
+
+void MphoneForm::phoneInvite(const QString &dest, const QString &subject, bool anonymous)
+{
+ t_user *user = phone->ref_user_profile(userComboBox->currentText().ascii());
+ if (!user) {
+ log_file->write_report("Cannot find user profile.",
+ "MphoneForm::phoneInvite",
+ LOG_NORMAL, LOG_CRITICAL);
+ return;
+ }
+ phoneInvite(user, dest, subject, anonymous);
+}
+
+void MphoneForm::phoneInvite()
+{
+ t_user *user = phone->ref_user_profile(userComboBox->currentText().ascii());
+ if (!user) {
+ log_file->write_report("Cannot find user profile.",
+ "MphoneForm::phoneInvite",
+ LOG_NORMAL, LOG_CRITICAL);
+ return;
+ }
+ phoneInvite(user, "", "", false);
+}
+
+// Execute the invite action. This slot is connected to the destination
+// signal of the invite window.
+void MphoneForm::do_phoneInvite(t_user *user_config, const QString &display,
+ const t_url &destination, const QString &subject,
+ bool anonymous)
+{
+ ((t_gui *)ui)->action_invite(user_config, destination, display.ascii(), subject.ascii(),
+ anonymous);
+ updateState();
+}
+
+// Redial last call
+void MphoneForm::phoneRedial(void)
+{
+ t_url url;
+ string display, subject;
+ t_user *user_config;
+ bool hide_user;
+
+ if (!ui->get_last_call_info(url, display, subject, &user_config, hide_user)) return;
+ ((t_gui *)ui)->action_invite(user_config, url, display, subject, hide_user);
+ updateState();
+}
+
+
+void MphoneForm::phoneAnswer()
+{
+ ((t_gui *)ui)->action_answer();
+ updateState();
+}
+
+// A call can be answered from the systray popup. The user may have
+// switched lines, the systray popup answer button should answer the
+// correct line.
+void MphoneForm::phoneAnswerFromSystrayPopup()
+{
+#ifdef HAVE_KDE
+ unsigned short line = ((t_gui *)ui)->get_line_sys_tray_popup();
+ unsigned short active_line = phone->get_active_line();
+
+ if (line != active_line) {
+ ((t_gui *)ui)->action_activate_line(line);
+ }
+
+ ((t_gui *)ui)->action_answer();
+ updateState();
+#endif
+}
+
+void MphoneForm::phoneBye()
+{
+ ((t_gui *)ui)->action_bye();
+ updateState();
+}
+
+
+void MphoneForm::phoneReject()
+{
+ ((t_gui *)ui)->action_reject();
+ updateState();
+}
+
+// A call can be rejected from the systray popup. The user may have
+// switched lines, the systray popup reject button should answer the
+// correct line.
+void MphoneForm::phoneRejectFromSystrayPopup()
+{
+#ifdef HAVE_KDE
+ unsigned short line = ((t_gui *)ui)->get_line_sys_tray_popup();
+ ((t_gui *)ui)->action_reject(line);
+ updateState();
+#endif
+}
+
+
+// Show the semi-modal redirect form
+void MphoneForm::phoneRedirect(const list<string> &contacts)
+{
+ int active_line = phone->get_active_line();
+ t_user *user_config = phone->get_line_user(active_line);
+
+ if (redirectForm) {
+ MEMMAN_DELETE(redirectForm);
+ delete (redirectForm);
+ }
+
+ redirectForm = new RedirectForm(this, "redirect", true);
+ MEMMAN_NEW(redirectForm);
+ connect(redirectForm, SIGNAL(destinations(const list<t_display_url> &)),
+ this, SLOT(do_phoneRedirect(const list<t_display_url> &)));
+
+ redirectForm->show(user_config, contacts);
+}
+
+void MphoneForm::phoneRedirect()
+{
+ const list<string> l;
+ phoneRedirect(l);
+}
+
+// Execute the redirect action.
+void MphoneForm::do_phoneRedirect(const list<t_display_url> &destinations)
+{
+ ((t_gui *)ui)->action_redirect(destinations);
+ updateState();
+}
+
+// Show the semi-modal call transfer window
+void MphoneForm::phoneTransfer(const string &dest, t_transfer_type transfer_type)
+{
+ int active_line = phone->get_active_line();
+ t_user *user_config = phone->get_line_user(active_line);
+
+ // Hold the call if setting in user profile indicates call hold
+ if (user_config->get_referrer_hold()) {
+ phoneHold(true);
+ }
+
+ if (transferForm) {
+ MEMMAN_DELETE(transferForm);
+ delete transferForm;
+ }
+
+ transferForm = new TransferForm(this, "transfer", true);
+ MEMMAN_NEW(transferForm);
+ connect(transferForm, SIGNAL(destination(const t_display_url &, t_transfer_type)),
+ this, SLOT(do_phoneTransfer(const t_display_url &, t_transfer_type)));
+
+ if (dest.empty() && transfer_type == TRANSFER_BASIC) {
+ // Let form pick a default transfer type based on the current
+ // call status.
+ transferForm->show(user_config);
+ } else {
+ // Set passed destination and transfer type in form
+ transferForm->show(user_config, dest, transfer_type);
+ }
+ updateState();
+}
+
+void MphoneForm::phoneTransfer()
+{
+ unsigned short active_line = phone->get_active_line();
+ unsigned short dummy;
+
+ if (phone->is_line_transfer_consult(active_line, dummy)) {
+ do_phoneTransferLine();
+ } else {
+ phoneTransfer("", TRANSFER_BASIC);
+ }
+}
+
+// Execute the transfer action. This slot is connected to the destination
+// signal of the transfer window.
+void MphoneForm::do_phoneTransfer(const t_display_url &destination,
+ t_transfer_type transfer_type)
+{
+ unsigned short active_line;
+ unsigned short other_line;
+
+ switch (transfer_type) {
+ case TRANSFER_BASIC:
+ ((t_gui *)ui)->action_refer(destination.url, destination.display);
+ break;
+ case TRANSFER_CONSULT:
+ ((t_gui *)ui)->action_setup_consultation_call(
+ destination.url, destination.display);
+ break;
+ case TRANSFER_OTHER_LINE:
+ active_line = phone->get_active_line();
+ other_line = (active_line == 0 ? 1 : 0);
+
+ if (phone->get_line_substate(other_line) == LSSUB_ESTABLISHED) {
+ ((t_gui *)ui)->action_refer(active_line, other_line);
+ } else {
+ // The other line was released while the user was entering
+ // the refer-target.
+ t_user *user_config = phone->get_line_user(active_line);
+ if (user_config->get_referrer_hold()) {
+ phoneHold(false);
+ }
+ }
+ break;
+ default:
+ assert(false);
+ }
+
+ updateState();
+}
+
+// Transfer the remote party on the held line to the remote party on the
+// active line.
+void MphoneForm::do_phoneTransferLine()
+{
+ unsigned short active_line = phone->get_active_line();
+ unsigned short line_to_be_transferred;
+
+ if (!phone->is_line_transfer_consult(active_line, line_to_be_transferred)) {
+ // Somehow the line is not a consultation call.
+ updateState();
+ return;
+ }
+
+ ((t_gui *)ui)->action_refer(line_to_be_transferred, active_line);
+ updateState();
+}
+
+void MphoneForm::phoneHold(bool on)
+{
+ if (on) {
+ ((t_gui *)ui)->action_hold();
+ } else {
+ ((t_gui *)ui)->action_retrieve();
+ }
+
+ updateState();
+}
+
+void MphoneForm::phoneConference()
+{
+ ((t_gui *)ui)->action_conference();
+ updateState();
+}
+
+void MphoneForm::phoneMute(bool on)
+{
+ ((t_gui *)ui)->action_mute(on);
+ updateState();
+}
+
+void MphoneForm::phoneTermCap(const QString &dest)
+{
+ // In-dialog OPTIONS request
+ int line = phone->get_active_line();
+ if (phone->get_line_substate(line) == LSSUB_ESTABLISHED) {
+ ((t_gui *)ui)->action_options();
+ return;
+ }
+
+ // Out-of-dialog OPTIONS request
+ if (termCapForm) {
+ MEMMAN_DELETE(termCapForm);
+ delete (termCapForm);
+ }
+
+ termCapForm = new TermCapForm(this, "termcap", true);
+ MEMMAN_NEW(termCapForm);
+ connect(termCapForm, SIGNAL(destination(t_user *, const t_url &)),
+ this, SLOT(do_phoneTermCap(t_user *, const t_url &)));
+
+ t_user *user = phone->ref_user_profile(userComboBox->currentText().ascii());
+ if (!user) {
+ log_file->write_report("Cannot find user profile.",
+ "MphoneForm::phoneTermcap",
+ LOG_NORMAL, LOG_CRITICAL);
+ return;
+ }
+ termCapForm->show(user, dest);
+}
+
+void MphoneForm::phoneTermCap()
+{
+ phoneTermCap("");
+}
+
+void MphoneForm::do_phoneTermCap(t_user *user_config, const t_url &destination)
+{
+ ((t_gui *)ui)->action_options(user_config, destination);
+}
+
+void MphoneForm::phoneDTMF()
+{
+ if (!dtmfForm) {
+ dtmfForm = new DtmfForm(this);
+ MEMMAN_NEW(dtmfForm);
+ connect(dtmfForm, SIGNAL(digits(const QString &)),
+ this, SLOT(sendDTMF(const QString &)));
+ }
+
+ dtmfForm->show();
+}
+
+void MphoneForm::sendDTMF(const QString &digits)
+{
+ ((t_gui *)ui)->action_dtmf(digits.ascii());
+}
+
+void MphoneForm::startMessageSession(void)
+{
+ t_user *user = phone->ref_user_profile(userComboBox->currentText().ascii());
+ if (!user) {
+ log_file->write_report("Cannot find user profile.",
+ "MphoneForm::startMessageSession",
+ LOG_NORMAL, LOG_CRITICAL);
+ return;
+ }
+
+ im::t_msg_session *session = new im::t_msg_session(user);
+ MEMMAN_NEW(session);
+ ((t_gui *)ui)->addMessageSession(session);
+ MessageFormView *messageFormView = new MessageFormView(NULL, session);
+ MEMMAN_NEW(messageFormView);
+ messageFormView->show();
+}
+
+void MphoneForm::startMessageSession(t_buddy *buddy)
+{
+ t_user *user_config = buddy->get_user_profile();
+ t_url dest_url(ui->expand_destination(user_config, buddy->get_sip_address()));
+ if (!dest_url.is_valid()) return;
+ string display = buddy->get_name();
+
+ // Find an existing session
+ im::t_msg_session *session = ((t_gui *)ui)->getMessageSession(user_config, dest_url, display);
+ if (!session) {
+ // There is no session yet, create one.
+ session = new im::t_msg_session(user_config, t_display_url(dest_url, display));
+ MEMMAN_NEW(session);
+ ((t_gui *)ui)->addMessageSession(session);
+ MessageFormView *view = new MessageFormView(NULL, session);
+ MEMMAN_NEW(view);
+ view->show();
+ }
+}
+
+void MphoneForm::phoneConfirmZrtpSas(int line)
+{
+ ((t_gui *)ui)->action_confirm_zrtp_sas(line);
+ updateState();
+}
+
+void MphoneForm::phoneConfirmZrtpSas()
+{
+ ((t_gui *)ui)->action_confirm_zrtp_sas();
+ updateState();
+}
+
+void MphoneForm::phoneResetZrtpSasConfirmation(int line)
+{
+ ((t_gui *)ui)->action_reset_zrtp_sas_confirmation(line);
+ updateState();
+}
+
+void MphoneForm::phoneResetZrtpSasConfirmation()
+{
+ ((t_gui *)ui)->action_reset_zrtp_sas_confirmation();
+ updateState();
+}
+
+void MphoneForm::phoneEnableZrtp(bool on)
+{
+ if (on) {
+ ((t_gui *)ui)->action_enable_zrtp();
+ } else {
+ ((t_gui *)ui)->action_zrtp_request_go_clear();
+ }
+
+ updateState();
+}
+
+void MphoneForm::phoneZrtpGoClearOk(unsigned short line)
+{
+ ((t_gui *)ui)->action_zrtp_go_clear_ok(line);
+ updateState();
+}
+
+// Radio button for line 1 changed state
+void MphoneForm::line1rbChangedState( bool on )
+{
+ // If the radio button is switched off, then return, the toggle
+ // on the other line will handle the action
+ if (!on) return;
+
+ ((t_gui *)ui)->action_activate_line(0);
+}
+
+void MphoneForm::line2rbChangedState( bool on )
+{
+ // If the radio button is switched off, then return, the toggle
+ // on the other line will handle the action
+ if (!on) return;
+
+ ((t_gui *)ui)->action_activate_line(1);
+}
+
+void MphoneForm::actionLine1Toggled( bool on)
+{
+ if (!on) return;
+ ((t_gui *)ui)->action_activate_line(0);
+}
+
+void MphoneForm::actionLine2Toggled( bool on)
+{
+ if (!on) return;
+ ((t_gui *)ui)->action_activate_line(1);
+}
+
+// Enable/disable dnd when there is 1 user active
+void MphoneForm::srvDnd( bool on )
+{
+ ((t_gui *)ui)->srv_dnd(phone->ref_users(), on);
+ updateServicesStatus();
+}
+
+// Enable/disable dnd when there are multiple users active
+void MphoneForm::srvDnd()
+{
+ if (selectUserForm) {
+ MEMMAN_DELETE(selectUserForm);
+ delete (selectUserForm);
+ }
+
+ selectUserForm = new SelectUserForm(this, "dnd", true);
+ MEMMAN_NEW(selectUserForm);
+
+ connect(selectUserForm, SIGNAL(selection(list<t_user *>)), this,
+ SLOT(do_srvDnd_enable(list<t_user *>)));
+ connect(selectUserForm, SIGNAL(not_selected(list<t_user *>)), this,
+ SLOT(do_srvDnd_disable(list<t_user *>)));
+
+ selectUserForm->show(SELECT_DND);
+}
+
+void MphoneForm::do_srvDnd_enable(list<t_user *> user_list) {
+ ((t_gui *)ui)->srv_dnd(user_list, true);
+ updateServicesStatus();
+}
+
+void MphoneForm::do_srvDnd_disable(list<t_user *> user_list) {
+ ((t_gui *)ui)->srv_dnd(user_list, false);
+ updateServicesStatus();
+}
+
+// Enable/disable auto answer when there is 1 user active
+void MphoneForm::srvAutoAnswer( bool on )
+{
+ ((t_gui *)ui)->srv_auto_answer(phone->ref_users(), on);
+ updateServicesStatus();
+}
+
+// Enable/disable auto answer when there are multiple users active
+void MphoneForm::srvAutoAnswer()
+{
+ if (selectUserForm) {
+ MEMMAN_DELETE(selectUserForm);
+ delete (selectUserForm);
+ }
+
+ selectUserForm = new SelectUserForm(this, "auto answer", true);
+ MEMMAN_NEW(selectUserForm);
+
+ connect(selectUserForm, SIGNAL(selection(list<t_user *>)), this,
+ SLOT(do_srvAutoAnswer_enable(list<t_user *>)));
+ connect(selectUserForm, SIGNAL(not_selected(list<t_user *>)), this,
+ SLOT(do_srvAutoAnswer_disable(list<t_user *>)));
+
+ selectUserForm->show(SELECT_AUTO_ANSWER);
+}
+
+void MphoneForm::do_srvAutoAnswer_enable(list<t_user *> user_list) {
+ ((t_gui *)ui)->srv_auto_answer(user_list, true);
+ updateServicesStatus();
+}
+
+void MphoneForm::do_srvAutoAnswer_disable(list<t_user *> user_list) {
+ ((t_gui *)ui)->srv_auto_answer(user_list, false);
+ updateServicesStatus();
+}
+
+void MphoneForm::srvRedirect()
+{
+ if (!srvRedirectForm) {
+ srvRedirectForm = new SrvRedirectForm(this, "call redirection", true);
+ MEMMAN_NEW(srvRedirectForm);
+ connect(srvRedirectForm,
+ SIGNAL(destinations(t_user *,
+ const list<t_display_url> &,
+ const list<t_display_url> &,
+ const list<t_display_url> &)),
+ this,
+ SLOT(do_srvRedirect(t_user *,
+ const list<t_display_url> &,
+ const list<t_display_url> &,
+ const list<t_display_url> &)));
+ }
+
+ srvRedirectForm->show();
+}
+
+void MphoneForm::do_srvRedirect(t_user *user_config,
+ const list<t_display_url> &always,
+ const list<t_display_url> &busy,
+ const list<t_display_url> &noanswer)
+{
+ // Redirection always
+ if (always.empty()) {
+ ((t_gui *)ui)->srv_disable_cf(user_config, CF_ALWAYS);
+ } else {
+ ((t_gui *)ui)->srv_enable_cf(user_config, CF_ALWAYS, always);
+ }
+
+ // Redirection busy
+ if (busy.empty()) {
+ ((t_gui *)ui)->srv_disable_cf(user_config, CF_BUSY);
+ } else {
+ ((t_gui *)ui)->srv_enable_cf(user_config, CF_BUSY, busy);
+ }
+
+ // Redirection no answer
+ if (noanswer.empty()) {
+ ((t_gui *)ui)->srv_disable_cf(user_config, CF_NOANSWER);
+ } else {
+ ((t_gui *)ui)->srv_enable_cf(user_config, CF_NOANSWER, noanswer);
+ }
+
+ updateServicesStatus();
+}
+
+
+void MphoneForm::about()
+{
+ QString s = sys_config->about(true).c_str();
+
+ QMessageBox mbAbout(PRODUCT_NAME, s.replace(' ', "&nbsp;"),
+ QMessageBox::Information,
+ QMessageBox::Ok | QMessageBox::Default,
+ QMessageBox::NoButton, QMessageBox::NoButton);
+ mbAbout.setIconPixmap(QPixmap::fromMimeSource("twinkle48.png"));
+ mbAbout.exec();
+}
+
+void MphoneForm::aboutQt()
+{
+ QMessageBox::aboutQt(this, PRODUCT_NAME);
+}
+
+void MphoneForm::manual()
+{
+ ((t_gui *)ui)->open_url_in_browser("http://www.twinklephone.com");
+}
+
+void MphoneForm::editUserProfile()
+{
+ if (!userProfileForm) {
+ userProfileForm = new UserProfileForm(this, "user profile", true);
+ MEMMAN_NEW(userProfileForm);
+
+ connect(userProfileForm,
+ SIGNAL(authCredentialsChanged(t_user *, const string&)),
+ this,
+ SLOT(updateAuthCache(t_user *, const string&)));
+
+ connect(userProfileForm,
+ SIGNAL(stunServerChanged(t_user *)),
+ this,
+ SLOT(updateStunSettings(t_user *)));
+
+ // MWI settings change triggers an unsubscribe
+ connect(userProfileForm,
+ SIGNAL(mwiChangeUnsubscribe(t_user *)),
+ this,
+ SLOT(unsubscribeMWI(t_user *)));
+
+ // MWI settings change triggers a subscribe
+ connect(userProfileForm,
+ SIGNAL(mwiChangeSubscribe(t_user *)),
+ this,
+ SLOT(subscribeMWI(t_user *)));
+ }
+
+ userProfileForm->show(phone->ref_users(),
+ userComboBox->currentText());
+}
+
+void MphoneForm::editSysSettings()
+{
+ if (!sysSettingsForm) {
+ sysSettingsForm = new SysSettingsForm(this, "system settings", true);
+ MEMMAN_NEW(sysSettingsForm);
+ connect(sysSettingsForm, SIGNAL(sipUdpPortChanged()),
+ this, SLOT(updateSipUdpPort()));
+ connect(sysSettingsForm, SIGNAL(rtpPortChanged()),
+ this, SLOT(updateRtpPorts()));
+ }
+
+ sysSettingsForm->show();
+}
+
+void MphoneForm::selectProfile()
+{
+ if (!selectProfileForm) {
+ selectProfileForm = new SelectProfileForm(this, "select profile", true);
+ MEMMAN_NEW(selectProfileForm);
+ connect(selectProfileForm, SIGNAL(selection(const list<string> &)),
+ this, SLOT(newUsers(const list<string> &)));
+ connect(selectProfileForm, SIGNAL(profileRenamed()),
+ this, SLOT(updateUserComboBox()));
+ connect(selectProfileForm, SIGNAL(profileRenamed()),
+ this, SLOT(populateBuddyList()));
+ }
+
+ selectProfileForm->showForm(this);
+}
+
+// A new set of users has been selected.
+// Remove users from the current user set that are not in the selection.
+// Add users from the selection that are not in the current set of users.
+void MphoneForm::newUsers(const list<string> &profiles)
+{
+ string error_msg;
+
+ // NOTE: First users must be removed. It could be that a
+ // user profile of an active was renamed. In this case, the user
+ // with the old profile name is first removed and then added again.
+
+ list<t_user *> user_list = phone->ref_users();
+
+ // Remove current users that are not selected anymore.
+ for (list<t_user *>::iterator i = user_list.begin(); i != user_list.end(); i++) {
+ if (std::find(profiles.begin(), profiles.end(),
+ (*i)->get_filename().c_str()) == profiles.end())
+ {
+ // User is not selected anymore.
+ // Unsubscribe MWI
+ if (phone->is_mwi_subscribed(*i)) {
+ phone->pub_unsubscribe_mwi(*i);
+ }
+
+ // Unpublish presence of user
+ phone->pub_unpublish_presence(*i);
+
+ // Unsubscribe presence
+ phone->pub_unsubscribe_presence(*i);
+
+ // Deregister user
+ if (phone->get_is_registered(*i)) {
+ phone->pub_registration(*i, REG_DEREGISTER);
+ }
+
+ log_file->write_header("MphoneForm::newUsers");
+ log_file->write_raw("Stop user profile: ");
+ log_file->write_raw((*i)->get_profile_name());
+ log_file->write_endl();
+ log_file->write_footer();
+ phone->remove_phone_user(*(*i));
+ }
+ }
+
+ // Determine which users to add
+ list<string> add_profile_list;
+ for (list<string>::const_iterator i = profiles.begin(); i != profiles.end(); i++) {
+ QString profile = (*i).c_str();
+ // Strip off the .cfg extension
+ profile.truncate(profile.length() - 4);
+
+ if (!phone->ref_user_profile(profile.ascii())) {
+ add_profile_list.push_back(*i);
+ }
+ }
+
+ // Add new phone users
+ QProgressDialog progress(tr("Starting user profiles..."), "Abort", add_profile_list.size(), this,
+ "starting user profiles", true);
+ progress.setCaption(PRODUCT_NAME);
+ progress.setMinimumDuration(200);
+ int progressStep = 0;
+ for (list<string>::iterator i = add_profile_list.begin(); i != add_profile_list.end(); i++) {
+ progress.setProgress(progressStep);
+ qApp->processEvents();
+
+ if (progress.wasCancelled()) {
+ log_file->write_report("User aborted startup of new users.",
+ "MphoneForm::newUsers");
+ break;
+ }
+
+ t_user user_config;
+
+ // Read user configuration
+ if (user_config.read_config(*i, error_msg)) {
+ t_user *dup_user;
+
+ log_file->write_header("MphoneForm::newUsers");
+ log_file->write_raw("Run user profile: ");
+ log_file->write_raw(user_config.get_profile_name());
+ log_file->write_endl();
+ log_file->write_footer();
+
+ if (phone->add_phone_user(user_config, &dup_user))
+ {
+ // NAT discovery
+ if (!phone->stun_discover_nat(&user_config, error_msg))
+ {
+ // Warn user that the STUN settings will not work.
+ ((t_gui *)ui)->cb_show_msg(this, error_msg,
+ MSG_WARNING);
+ }
+
+ // Register at startup
+ if (user_config.get_register_at_startup()) {
+ phone->pub_registration(&user_config,
+ REG_REGISTER,
+ DUR_REGISTRATION(&user_config));
+ } else {
+ // No registration needed, initialize extensions now.
+ phone->init_extensions(&user_config);
+ }
+
+ // Extension initialization will be done after
+ // registration succeeded.
+ } else {
+ error_msg = tr("The following profiles are both for user %1").arg(user_config.get_name().c_str()).ascii();
+ error_msg += '@';
+ error_msg += user_config.get_domain();
+ error_msg += ":\n\n";
+ error_msg += user_config.get_profile_name();
+ error_msg += "\n";
+ error_msg += dup_user->get_profile_name();
+ error_msg += "\n\n";
+ error_msg += tr("You can only run multiple profiles for different users.");
+
+ log_file->write_report(error_msg,
+ "MphoneForm::newUsers",
+ LOG_NORMAL, LOG_WARNING);
+ ui->cb_display_msg(error_msg, MSG_WARNING);
+ }
+ } else {
+ log_file->write_report(error_msg,
+ "MphoneForm::newUsers",
+ LOG_NORMAL, LOG_CRITICAL);
+ ui->cb_display_msg(error_msg, MSG_CRITICAL);
+ }
+
+ progressStep++;
+ }
+ progress.setProgress(add_profile_list.size());
+
+ populateBuddyList();
+ updateUserComboBox();
+ updateRegStatus();
+ updateMwi();
+ updateServicesStatus();
+ updateSysTrayStatus();
+ updateMenuStatus();
+ updateState();
+
+ call_history->clear_num_missed_calls();
+}
+
+void MphoneForm::updateUserComboBox()
+{
+ QString current_user;
+
+ if (userComboBox->count() == 0) {
+ // The last used profile
+ current_user = sys_config->get_last_used_profile().c_str();
+ } else {
+ // Keep the current active profile
+ current_user = userComboBox->currentText();
+ }
+
+ ((t_gui *)ui)->fill_user_combo(userComboBox);
+
+ // If previous selected user is still active, make it the current user
+ for (int i = 0; i < userComboBox->count(); i++) {
+ if (userComboBox->text(i) == current_user) {
+ userComboBox->setCurrentItem(i);
+ }
+ }
+}
+
+void MphoneForm::updateSipUdpPort()
+{
+ ((t_gui *)ui)->cb_show_msg(sysSettingsForm,
+ tr("You have changed the SIP UDP port. This setting will only become "\
+ "active when you restart Twinkle.").ascii(),
+ MSG_INFO);
+}
+
+void MphoneForm::updateRtpPorts()
+{
+ phone->init_rtp_ports();
+}
+
+void MphoneForm::updateStunSettings(t_user *user_config)
+{
+ string s;
+ if (!phone->stun_discover_nat(user_config, s)) {
+ // Warn user that the STUN settings will not work.
+ ((t_gui *)ui)->cb_show_msg(this, s, MSG_WARNING);
+ }
+
+ if (!user_config->get_use_stun()) {
+ // Disable STUN
+ phone->disable_stun(user_config);
+ }
+
+ // Synchronize the sending of NAT keep alives with the user profile settings.
+ phone->sync_nat_keepalive(user_config);
+}
+
+void MphoneForm::updateAuthCache(t_user *user_config, const string &realm)
+{
+ phone->remove_cached_credentials(user_config, realm);
+}
+
+void MphoneForm::unsubscribeMWI(t_user *user_config)
+{
+ phone->pub_unsubscribe_mwi(user_config);
+}
+
+void MphoneForm::subscribeMWI(t_user *user_config)
+{
+ phone->pub_subscribe_mwi(user_config);
+}
+
+void MphoneForm::viewLog()
+{
+ if (!logViewForm) {
+ logViewForm = new LogViewForm(NULL);
+ MEMMAN_NEW(logViewForm);
+ }
+
+ logViewForm->show();
+}
+
+void MphoneForm::updateLog(bool log_zapped)
+{
+ if (logViewForm) logViewForm->update(log_zapped);
+}
+
+void MphoneForm::viewHistory()
+{
+ if (!historyForm) {
+ historyForm = new HistoryForm(NULL);
+ MEMMAN_NEW(historyForm);
+ }
+
+ connect(historyForm,
+ SIGNAL(call(t_user *, const QString &, const QString &, bool)), this,
+ SLOT(phoneInvite(t_user *, const QString &, const QString &, bool)));
+
+ historyForm->show();
+}
+
+void MphoneForm::updateCallHistory()
+{
+ if (historyForm) historyForm->update();
+}
+
+t_twinkle_sys_tray *MphoneForm::getSysTray()
+{
+ return sysTray;
+}
+
+// Execute call directly from the main window (press call button)
+void MphoneForm::quickCall()
+{
+ string display, dest_str;
+
+ t_user *from_user = phone->ref_user_profile(
+ userComboBox->currentText().ascii());
+ if (!from_user) {
+ log_file->write_report("Cannot find user profile.",
+ "MphoneForm::quickCall",
+ LOG_NORMAL, LOG_CRITICAL);
+ return;
+ }
+
+ ui->expand_destination(from_user,
+ callComboBox->currentText().stripWhiteSpace().ascii(),
+ display, dest_str);
+ t_url dest(dest_str);
+
+ if (dest.is_valid()) {
+ QString destination = callComboBox->currentText();
+ addToCallComboBox(destination);
+ if (inviteForm) inviteForm->addToInviteComboBox(destination);
+ callComboBox->setFocus();
+ do_phoneInvite(from_user, display.c_str(), dest, "", false);
+ }
+}
+
+// Add a destination to the list of callComboBox
+void MphoneForm::addToCallComboBox(const QString &destination)
+{
+ // Remove duplicate entries
+ for (int i = callComboBox->count() - 1; i >= 0; i--) {
+ if (callComboBox->text(i) == destination) {
+ callComboBox->removeItem(i);
+ }
+ }
+
+ // Add entry
+ callComboBox->insertItem(destination, 0);
+ callComboBox->setCurrentItem(0);
+
+ // Remove last entry is list exceeds maximum size
+ if (callComboBox->count() > SIZE_REDIAL_LIST) {
+ callComboBox->removeItem(callComboBox->count() - 1);
+ }
+
+ // Clearing the edit line must be done here as this function is
+ // also called when a call is made through the inviteForm.
+ // The insertItem puts the text also in the edit field. So it must
+ // be cleared here.
+ callComboBox->clearEdit();
+}
+
+void MphoneForm::showAddressBook()
+{
+ if (!getAddressForm) {
+ getAddressForm = new GetAddressForm(
+ this, "select address", true);
+ MEMMAN_NEW(getAddressForm);
+ }
+
+ connect(getAddressForm,
+ SIGNAL(address(const QString &)),
+ this, SLOT(selectedAddress(const QString &)));
+
+ getAddressForm->show();
+}
+
+void MphoneForm::selectedAddress(const QString &address)
+{
+ callComboBox->setEditText(address);
+}
+
+// Enable/disable the various call widgets
+void MphoneForm::enableCallOptions(bool enable)
+{
+ // Enable/disable widgets
+ callInvite->setEnabled(enable);
+ callPushButton->setEnabled(enable);
+ callComboBox->setEnabled(enable);
+ addressToolButton->setEnabled(enable);
+
+ // Set focus on callComboBox
+ if (enable) {
+ callComboBox->setFocus();
+ }
+}
+
+void MphoneForm::keyPressEvent(QKeyEvent *e)
+{
+ if (callPushButton->isEnabled()) {
+ // Quick dial
+ switch (e->key()) {
+ case Qt::Key_Return:
+ case Qt::Key_Enter:
+ quickCall();
+ break;
+ default:
+ e->ignore();
+ }
+ } else if (callDTMF->isEnabled()) {
+ // DTMF keys
+ switch (e->key()) {
+ case Qt::Key_1:
+ sendDTMF("1");
+ break;
+ case Qt::Key_2:
+ case Qt::Key_A:
+ case Qt::Key_B:
+ case Qt::Key_C:
+ sendDTMF("2");
+ break;
+ case Qt::Key_3:
+ case Qt::Key_D:
+ case Qt::Key_E:
+ case Qt::Key_F:
+ sendDTMF("3");
+ break;
+ case Qt::Key_4:
+ case Qt::Key_G:
+ case Qt::Key_H:
+ case Qt::Key_I:
+ sendDTMF("4");
+ break;
+ case Qt::Key_5:
+ case Qt::Key_J:
+ case Qt::Key_K:
+ case Qt::Key_L:
+ sendDTMF("5");
+ break;
+ case Qt::Key_6:
+ case Qt::Key_M:
+ case Qt::Key_N:
+ case Qt::Key_O:
+ sendDTMF("6");
+ break;
+ case Qt::Key_7:
+ case Qt::Key_P:
+ case Qt::Key_Q:
+ case Qt::Key_R:
+ case Qt::Key_S:
+ sendDTMF("7");
+ break;
+ case Qt::Key_8:
+ case Qt::Key_T:
+ case Qt::Key_U:
+ case Qt::Key_V:
+ sendDTMF("8");
+ break;
+ case Qt::Key_9:
+ case Qt::Key_W:
+ case Qt::Key_X:
+ case Qt::Key_Y:
+ case Qt::Key_Z:
+ sendDTMF("9");
+ break;
+ case Qt::Key_0:
+ case Qt::Key_Space:
+ sendDTMF("0");
+ break;
+ case Qt::Key_Asterisk:
+ sendDTMF("*");
+ break;
+ case Qt::Key_NumberSign:
+ sendDTMF("#");
+ break;
+ default:
+ e->ignore();
+ }
+ } else {
+ e->ignore();
+ }
+}
+
+// QLabels do not have mouse click events. I want the status labels
+// to be clickable however. Explicitly check here if a status label has
+// been clicked.
+void MphoneForm::mouseReleaseEvent(QMouseEvent *e)
+{
+ if (e->button() == Qt::LeftButton && e->type() == QEvent::MouseButtonRelease) {
+ processLeftMouseButtonRelease(e);
+ } else if (e->button() == Qt::RightButton && e->type() == QEvent::MouseButtonRelease) {
+ processRightMouseButtonRelease(e);
+ } else {
+ e->ignore();
+ }
+}
+
+void MphoneForm::processLeftMouseButtonRelease(QMouseEvent *e)
+{
+ if (statAaLabel->hasMouse()) {
+ if (phone->ref_users().size() == 1) {
+ bool enable = !serviceAutoAnswer->isOn();
+ srvAutoAnswer(enable);
+ serviceAutoAnswer->setOn(enable);
+ } else {
+ srvAutoAnswer();
+ }
+ } else if (statDndLabel->hasMouse()) {
+ if (phone->ref_users().size() == 1) {
+ bool enable = !serviceDnd->isOn();
+ srvDnd(enable);
+ serviceDnd->setOn(enable);
+ } else {
+ srvDnd();
+ }
+ } else if (statCfLabel->hasMouse()) {
+ srvRedirect();
+ } else if (statMWILabel->hasMouse()) {
+ popupMenuVoiceMail(e->globalPos());
+ } else if (statMissedLabel->hasMouse()) {
+ // Open the history form, when the user clicks on the
+ // missed calls indication.
+ viewHistory();
+ } else if (statRegLabel->hasMouse()) {
+ // Fetch registration status
+ phoneShowRegistrations();
+ } else if (crypt1Label->hasMouse()) {
+ processCryptLabelClick(0);
+ } else if (crypt2Label->hasMouse()) {
+ processCryptLabelClick(1);
+ } else {
+ e->ignore();
+ }
+}
+
+void MphoneForm::processRightMouseButtonRelease(QMouseEvent *e)
+{
+ e->ignore();
+}
+
+void MphoneForm::processCryptLabelClick(int line)
+{
+ t_audio_session *as = phone->get_line(line)->get_audio_session();
+ if (!as) return;
+
+ if (as->get_zrtp_sas_confirmed()) {
+ phoneResetZrtpSasConfirmation(line);
+ } else {
+ phoneConfirmZrtpSas(line);
+ }
+}
+
+// Show popup menu to access voice mail
+void MphoneForm::popupMenuVoiceMail(const QPoint &pos)
+{
+ QPopupMenu menu(this);
+ QIconSet vmIcon(QPixmap::fromMimeSource("mwi_none16.png"));
+ vmIcon.setPixmap(QPixmap::fromMimeSource("mwi_none16_dis.png"),
+ QIconSet::Automatic, QIconSet::Disabled);
+
+ list<t_user *>user_list = phone->ref_users();
+ map<int, t_user *> vm;
+ for (list<t_user *>::iterator i = user_list.begin(); i != user_list.end(); ++i) {
+ QString address = (*i)->get_mwi_vm_address().c_str();
+ QString entry = (*i)->get_profile_name().c_str();
+ entry += " - ";
+ if (address.isEmpty()) {
+ entry += tr("not provisioned");
+ } else {
+ entry += address;
+ }
+
+ int id = menu.insertItem(vmIcon, entry);
+ if (address.isEmpty()) {
+ menu.setItemEnabled(id, false);
+ }
+
+ vm.insert(make_pair(id, *i));
+ }
+
+ int selected;
+
+ // If multiple profiles are active, then show the popup menu.
+ // If one profile is active, then call voice mail immediately.
+ if (user_list.size() > 1) {
+ selected = menu.exec(pos);
+ if (selected == -1) return;
+ } else {
+ if (vm.begin()->second->get_mwi_vm_address().empty()) {
+ ui->cb_show_msg(
+ tr("You must provision your voice mail address in your "
+ "user profile, before you can access it.").ascii(),
+ MSG_INFO);
+ return;
+ }
+ selected = vm.begin()->first;
+ }
+
+ // Call can only be made if line is idle
+ int line = phone->get_active_line();
+ if (phone->get_line_state(line) == LS_BUSY) {
+ ui->cb_show_msg(tr("The line is busy. Cannot access voice mail.").ascii(),
+ MSG_WARNING);
+ return;
+ }
+
+ t_user *selectedUser = vm[selected];
+ string display, dest_str;
+ ui->expand_destination(selectedUser,
+ selectedUser->get_mwi_vm_address(),
+ display, dest_str);
+ t_url dest(dest_str);
+
+ if (dest.is_valid()) {
+ QString destination = selectedUser->get_mwi_vm_address().c_str();
+ addToCallComboBox(destination);
+ if (inviteForm) inviteForm->addToInviteComboBox(destination);
+ callComboBox->setFocus();
+ do_phoneInvite(selectedUser, display.c_str(), dest, "", false);
+ } else {
+ QString msg(tr("The voice mail address %1 is an invalid address. "
+ "Please provision a valid address in your user profile."));
+ ui->cb_show_msg(msg.arg(selectedUser->get_mwi_vm_address().c_str()).ascii(),
+ MSG_CRITICAL);
+ }
+}
+
+void MphoneForm::popupMenuVoiceMail(void)
+{
+ popupMenuVoiceMail(QCursor::pos());
+}
+
+void MphoneForm::showDisplay(bool on)
+{
+ if (on) {
+ displayGroupBox->show();
+ } else {
+ int hDisplay = displayGroupBox->height();
+ displayGroupBox->hide();
+
+ if (hDisplay < minimumHeight()) {
+ setMinimumHeight(minimumHeight() - hDisplay);
+ }
+ resize(width(), minimumHeight());
+ }
+
+ viewDisplay = on;
+ viewDisplayAction->setOn(on);
+}
+
+void MphoneForm::showBuddyList(bool on)
+{
+ if (on) {
+ buddyListView->show();
+ } else {
+ buddyListView->hide();
+ }
+
+ viewBuddyList = on;
+ viewBuddyListAction->setOn(on);
+}
+
+void MphoneForm::showCompactLineStatus(bool on)
+{
+ if (on) {
+ int hLabels = fromhead1Label->height() +
+ tohead1Label->height() +
+ subjecthead1Label->height() +
+ fromhead2Label->height() +
+ tohead2Label->height() +
+ subjecthead2Label->height();
+
+ fromhead1Label->hide();
+ tohead1Label->hide();
+ subjecthead1Label->hide();
+ from1Label->hide();
+ to1Label->hide();
+ subject1Label->hide();
+ photo1Label->hide();
+ fromhead2Label->hide();
+ tohead2Label->hide();
+ subjecthead2Label->hide();
+ from2Label->hide();
+ to2Label->hide();
+ subject2Label->hide();
+ photo2Label->hide();
+
+ if (hLabels < minimumHeight()) {
+ setMinimumHeight(minimumHeight() - hLabels);
+ }
+ resize(width(), minimumHeight());
+ } else {
+ fromhead1Label->show();
+ tohead1Label->show();
+ subjecthead1Label->show();
+ from1Label->show();
+ to1Label->show();
+ subject1Label->show();
+ fromhead2Label->show();
+ tohead2Label->show();
+ subjecthead2Label->show();
+ from2Label->show();
+ to2Label->show();
+ subject2Label->show();
+ }
+
+ viewCompactLineStatus = on;
+ //viewCompactLineStatusAction->setOn(on);
+}
+
+bool MphoneForm::getViewDisplay()
+{
+ return viewDisplay;
+}
+
+bool MphoneForm::getViewBuddyList()
+{
+ return viewBuddyList;
+}
+
+bool MphoneForm::getViewCompactLineStatus()
+{
+ return viewCompactLineStatus;
+}
+
+void MphoneForm::populateBuddyList()
+{
+ buddyListView->clear();
+
+ list<t_user *> user_list = phone->ref_users();
+ for (list<t_user *>::iterator i = user_list.begin(); i != user_list.end(); ++i) {
+ t_presence_epa *epa = phone->ref_presence_epa(*i);
+ if (!epa) continue;
+
+ BLViewUserItem *profileItem = new BLViewUserItem(buddyListView, epa);
+ t_buddy_list *buddy_list = phone->ref_buddy_list(*i);
+
+ list<t_buddy> *buddies = buddy_list->get_records();
+ for (list<t_buddy>::iterator bit = buddies->begin(); bit != buddies->end(); ++bit) {
+ QString name = bit->get_name().c_str();
+ new BuddyListViewItem(profileItem, &(*bit));
+ }
+
+ profileItem->setOpen(true);
+ }
+}
+
+void MphoneForm::showBuddyListPopupMenu(QListViewItem *item, const QPoint &pos)
+{
+ if (!item) return;
+
+ BuddyListViewItem *buddyItem = dynamic_cast<BuddyListViewItem *>(item);
+ if (buddyItem) {
+ buddyPopupMenu->popup(pos);
+ } else {
+ buddyListPopupMenu->popup(pos);
+ }
+}
+
+void MphoneForm::doCallBuddy()
+{
+ QListViewItem *qitem = buddyListView->currentItem();
+ BuddyListViewItem *item = dynamic_cast<BuddyListViewItem *>(qitem);
+ if (!item) return;
+
+ t_buddy *buddy = item->get_buddy();
+ t_user *user_config = buddy->get_user_profile();
+
+ phoneInvite(user_config, buddy->get_sip_address().c_str(), "", false);
+}
+
+void MphoneForm::doMessageBuddy(QListViewItem *qitem)
+{
+ BuddyListViewItem *item = dynamic_cast<BuddyListViewItem *>(qitem);
+ if (!item) return;
+
+ t_buddy *buddy = item->get_buddy();
+
+ startMessageSession(buddy);
+}
+
+void MphoneForm::doMessageBuddy()
+{
+ QListViewItem *item = buddyListView->currentItem();
+ doMessageBuddy(item);
+}
+
+void MphoneForm::doEditBuddy()
+{
+ QListViewItem *qitem = buddyListView->currentItem();
+ BuddyListViewItem *item = dynamic_cast<BuddyListViewItem *>(qitem);
+ if (!item) return;
+
+ t_buddy *buddy = item->get_buddy();
+
+ BuddyForm *form = new BuddyForm(this, "new_buddy", true, Qt::WDestructiveClose);
+ // Do not call MEMMAN as this form will be deleted automatically.
+ form->showEdit(*buddy);
+}
+
+void MphoneForm::doDeleteBuddy()
+{
+ QListViewItem *qitem = buddyListView->currentItem();
+ BuddyListViewItem *item = dynamic_cast<BuddyListViewItem *>(qitem);
+ if (!item) return;
+
+ t_buddy *buddy = item->get_buddy();
+ t_buddy_list *buddy_list = buddy->get_buddy_list();
+
+ // Delete the list item before deleting the buddy as
+ // deleting the item will detach the item from the buddy.
+ delete item;
+
+ if (buddy->is_presence_terminated()) {
+ buddy_list->del_buddy(*buddy);
+ } else {
+ buddy->unsubscribe_presence(true);
+ }
+
+ string err_msg;
+ if (!buddy_list->save(err_msg)) {
+ QString msg = tr("Failed to save buddy list: %1").arg(err_msg.c_str());
+ ((t_gui *)ui)->cb_show_msg(this, msg.ascii(), MSG_CRITICAL);
+ }
+}
+
+void MphoneForm::doAddBuddy()
+{
+ QListViewItem *qitem = buddyListView->currentItem();
+ BLViewUserItem *item = dynamic_cast<BLViewUserItem *>(qitem);
+ if (!item) return;
+
+ t_phone_user *pu = item->get_presence_epa()->get_phone_user();
+ if (!pu) return;
+ t_buddy_list *buddy_list = pu->get_buddy_list();
+ if (!buddy_list) return;
+
+ BuddyForm *form = new BuddyForm(this, "new_buddy", true, Qt::WDestructiveClose);
+ // Do not call MEMMAN as this form will be deleted automatically.
+ form->showNew(*buddy_list, item);
+}
+
+void MphoneForm::doAvailabilityOffline()
+{
+ QListViewItem *qitem = buddyListView->currentItem();
+ BLViewUserItem *item = dynamic_cast<BLViewUserItem *>(qitem);
+ if (!item) return;
+
+ t_phone_user *pu = item->get_presence_epa()->get_phone_user();
+ if (!pu) return;
+
+ pu->publish_presence(t_presence_state::ST_BASIC_CLOSED);
+}
+
+void MphoneForm::doAvailabilityOnline()
+{
+ QListViewItem *qitem = buddyListView->currentItem();
+ BLViewUserItem *item = dynamic_cast<BLViewUserItem *>(qitem);
+ if (!item) return;
+
+ t_phone_user *pu = item->get_presence_epa()->get_phone_user();
+ if (!pu) return;
+
+ pu->publish_presence(t_presence_state::ST_BASIC_OPEN);
+}
+
+void MphoneForm::DiamondcardSignUp()
+{
+ DiamondcardProfileForm *f = new DiamondcardProfileForm(this, "select profile", true,
+ Qt::WDestructiveClose);
+
+ connect(f, SIGNAL(newDiamondcardProfile(const QString&)),
+ this, SLOT(newDiamondcardUser(const QString &)));
+
+ f->show(NULL);
+}
+
+void MphoneForm::newDiamondcardUser(const QString &filename)
+{
+ list<string> profileFilenames;
+ list<t_user *> users = phone->ref_users();
+
+ for (list<t_user *>::const_iterator it = users.begin(); it != users.end(); ++it) {
+ t_user *user = *it;
+ profileFilenames.push_back(user->get_filename());
+ }
+
+ profileFilenames.push_back(filename.ascii());
+ newUsers(profileFilenames);
+}
+
+void MphoneForm::DiamondcardAction(t_dc_action action, int userIdx)
+{
+ list<t_user *> diamondcard_users = diamondcard_get_users(phone);
+ vector<t_user *> v(diamondcard_users.begin(), diamondcard_users.end());
+
+ if (userIdx < 0 || (unsigned int)userIdx >= v.size()) return;
+
+ t_user *user = v[userIdx];
+ QString url(diamondcard_url(action, user->get_name(), user->get_auth_pass()).c_str());
+ ((t_gui *)ui)->open_url_in_browser(url);
+}
+
+void MphoneForm::DiamondcardRecharge(int userIdx)
+{
+ DiamondcardAction(DC_ACT_RECHARGE, userIdx);
+}
+
+void MphoneForm::DiamondcardBalanceHistory(int userIdx)
+{
+ DiamondcardAction(DC_ACT_BALANCE_HISTORY, userIdx);
+}
+
+void MphoneForm::DiamondcardCallHistory(int userIdx)
+{
+ DiamondcardAction(DC_ACT_CALL_HISTORY, userIdx);
+}
+
+void MphoneForm::DiamondcardAdminCenter(int userIdx)
+{
+ DiamondcardAction(DC_ACT_ADMIN_CENTER, userIdx);
+}
diff --git a/src/gui/numberconversionform.ui b/src/gui/numberconversionform.ui
new file mode 100644
index 0000000..5ad490c
--- /dev/null
+++ b/src/gui/numberconversionform.ui
@@ -0,0 +1,175 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>NumberConversionForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>NumberConversionForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>436</width>
+ <height>122</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Number conversion</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout43</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>exprTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Match expression:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>exprLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>replaceTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Replace:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>replaceLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>replaceLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Perl style format string for the replacement number.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>exprLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Perl style regular expression matching the number format you want to modify.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer62</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout44</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer61</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>71</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string>Alt+O</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string>Alt+C</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>NumberConversionForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>NumberConversionForm</receiver>
+ <slot>validate()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>exprLineEdit</tabstop>
+ <tabstop>replaceLineEdit</tabstop>
+ <tabstop>okPushButton</tabstop>
+ <tabstop>cancelPushButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">qstring.h</include>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">boost/regex.hpp</include>
+ <include location="local" impldecl="in implementation">qregexp.h</include>
+ <include location="local" impldecl="in implementation">qvalidator.h</include>
+ <include location="local" impldecl="in implementation">numberconversionform.ui.h</include>
+</includes>
+<slots>
+ <slot>validate()</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function returnType="int">exec( QString &amp; expr, QString &amp; replace )</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/numberconversionform.ui.h b/src/gui/numberconversionform.ui.h
new file mode 100644
index 0000000..6bbdaec
--- /dev/null
+++ b/src/gui/numberconversionform.ui.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you want to add, delete, or rename functions or slots, use
+** Qt Designer to update this file, preserving your code.
+**
+** You should not define a constructor or destructor in this file.
+** Instead, write your code in functions called init() and destroy().
+** These will automatically be called by the form's constructor and
+** destructor.
+*****************************************************************************/
+
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+void NumberConversionForm::init()
+{
+ QRegExp rxNoAtSign("[^@]*");
+
+ exprLineEdit->setValidator(new QRegExpValidator(rxNoAtSign, this));
+ replaceLineEdit->setValidator(new QRegExpValidator(rxNoAtSign, this));
+}
+
+int NumberConversionForm::exec(QString &expr, QString &replace)
+{
+ exprLineEdit->setText(expr);
+ replaceLineEdit->setText(replace);
+ int retval = QDialog::exec();
+
+ if (retval == QDialog::Accepted) {
+ expr = exprLineEdit->text();
+ replace = replaceLineEdit->text();
+ }
+
+ return retval;
+}
+
+void NumberConversionForm::validate()
+{
+ QString expr = exprLineEdit->text();
+ QString replace = replaceLineEdit->text();
+
+ if (expr.isEmpty()) {
+ ((t_gui *)ui)->cb_show_msg(this,
+ tr("Match expression may not be empty.").ascii(), MSG_CRITICAL);
+ exprLineEdit->setFocus();
+ exprLineEdit->selectAll();
+ return;
+ }
+
+ if (replace.isEmpty()) {
+ ((t_gui *)ui)->cb_show_msg(this,
+ tr("Replace value may not be empty.").ascii(), MSG_CRITICAL);
+ replaceLineEdit->setFocus();
+ replaceLineEdit->selectAll();
+ return;
+ }
+
+ try {
+ boost::regex re(expr.ascii());
+ } catch (boost::bad_expression) {
+ ((t_gui *)ui)->cb_show_msg(this,
+ tr("Invalid regular expression.").ascii(), MSG_CRITICAL);
+ exprLineEdit->setFocus();
+ return;
+ }
+
+ accept();
+}
diff --git a/src/gui/qt_translator.h b/src/gui/qt_translator.h
new file mode 100644
index 0000000..c896d4c
--- /dev/null
+++ b/src/gui/qt_translator.h
@@ -0,0 +1,43 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef _QT_TRANSLATOR_H
+#define _QT_TRANSLATOR_H
+
+#include <qapplication.h>
+#include "translator.h"
+
+// This class provides the translation service from Qt to the
+// core of Twinkle.
+class t_qt_translator : public t_translator {
+public:
+ t_qt_translator(QApplication *qa) : _qa(qa) {};
+
+ virtual string translate(const string &s) {
+ return _qa->translate("TwinkleCore", s.c_str()).ascii();
+ };
+
+ virtual string translate2(const string &context, const string &s) {
+ return _qa->translate(context.c_str(), s.c_str()).ascii();
+ };
+
+private:
+ QApplication *_qa;
+};
+
+#endif
diff --git a/src/gui/redirectform.ui b/src/gui/redirectform.ui
new file mode 100644
index 0000000..e3f1e53
--- /dev/null
+++ b/src/gui/redirectform.ui
@@ -0,0 +1,308 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>RedirectForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>RedirectForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>588</width>
+ <height>190</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Redirect</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>redirectGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Redirect incoming call to</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>contact3LineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>contact3TextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;3rd choice destination:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>contact3LineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>contact2TextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;2nd choice destination:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>contact2LineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>contact2LineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>contact1LineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>contact1TextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;1st choice destination:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>contact1LineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="0" column="2">
+ <property name="name">
+ <cstring>address1ToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>F10</string>
+ </property>
+ <property name="iconSet">
+ <iconset>kontact_contacts.png</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Address book</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select an address from the address book.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="2" column="2">
+ <property name="name">
+ <cstring>address3ToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>F12</string>
+ </property>
+ <property name="iconSet">
+ <iconset>kontact_contacts.png</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Address book</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select an address from the address book.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="1" column="2">
+ <property name="name">
+ <cstring>address2ToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>F11</string>
+ </property>
+ <property name="iconSet">
+ <iconset>kontact_contacts.png</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Address book</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select an address from the address book.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer14</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout15</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>361</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>RedirectForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>RedirectForm</receiver>
+ <slot>validate()</slot>
+ </connection>
+ <connection>
+ <sender>address1ToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>RedirectForm</receiver>
+ <slot>showAddressBook1()</slot>
+ </connection>
+ <connection>
+ <sender>address2ToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>RedirectForm</receiver>
+ <slot>showAddressBook2()</slot>
+ </connection>
+ <connection>
+ <sender>address3ToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>RedirectForm</receiver>
+ <slot>showAddressBook3()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>contact1LineEdit</tabstop>
+ <tabstop>contact2LineEdit</tabstop>
+ <tabstop>contact3LineEdit</tabstop>
+ <tabstop>address1ToolButton</tabstop>
+ <tabstop>address2ToolButton</tabstop>
+ <tabstop>address3ToolButton</tabstop>
+ <tabstop>okPushButton</tabstop>
+ <tabstop>cancelPushButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">audits/memman.h</include>
+ <include location="global" impldecl="in declaration">list</include>
+ <include location="local" impldecl="in declaration">sockets/url.h</include>
+ <include location="local" impldecl="in declaration">getaddressform.h</include>
+ <include location="local" impldecl="in declaration">user.h</include>
+ <include location="local" impldecl="in implementation">redirectform.ui.h</include>
+</includes>
+<variables>
+ <variable access="private">GetAddressForm *getAddressForm;</variable>
+ <variable access="private">int nrAddressBook;</variable>
+ <variable access="private">t_user *user_config;</variable>
+</variables>
+<signals>
+ <signal>destinations(const list&lt;t_display_url&gt; &amp;)</signal>
+</signals>
+<slots>
+ <slot>show( t_user * user, const list&lt;string&gt; &amp; contacts )</slot>
+ <slot>validate()</slot>
+ <slot>showAddressBook()</slot>
+ <slot>showAddressBook1()</slot>
+ <slot>showAddressBook2()</slot>
+ <slot>showAddressBook3()</slot>
+ <slot>selectedAddress( const QString &amp; address )</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function access="private" specifier="non virtual">destroy()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/redirectform.ui.h b/src/gui/redirectform.ui.h
new file mode 100644
index 0000000..d29a874
--- /dev/null
+++ b/src/gui/redirectform.ui.h
@@ -0,0 +1,157 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+void RedirectForm::init()
+{
+ // Keeps track of which address book tool button is clicked.
+ nrAddressBook = 0;
+
+ getAddressForm = 0;
+
+ // Set toolbutton icons for disabled options.
+ QIconSet i;
+ i = address1ToolButton->iconSet();
+ i.setPixmap(QPixmap::fromMimeSource("kontact_contacts-disabled.png"),
+ QIconSet::Automatic, QIconSet::Disabled);
+ address1ToolButton->setIconSet(i);
+ address2ToolButton->setIconSet(i);
+ address3ToolButton->setIconSet(i);
+}
+
+void RedirectForm::destroy()
+{
+ if (getAddressForm) {
+ MEMMAN_DELETE(getAddressForm);
+ delete getAddressForm;
+ }
+}
+
+void RedirectForm::show(t_user *user, const list<string> &contacts)
+{
+ user_config = user;
+
+ int num = 0;
+ for (list<string>::const_iterator i = contacts.begin();
+ i != contacts.end(); i++, num++)
+ {
+ if (num == 0) contact1LineEdit->setText(i->c_str());
+ if (num == 1) contact2LineEdit->setText(i->c_str());
+ if (num == 2) contact3LineEdit->setText(i->c_str());
+ }
+
+ QDialog::show();
+}
+
+void RedirectForm::validate()
+{
+ t_display_url destination;
+ list<t_display_url> dest_list;
+
+ // 1st choice destination
+ ui->expand_destination(user_config, contact1LineEdit->text().stripWhiteSpace().ascii(),
+ destination);
+ if (destination.is_valid()) {
+ dest_list.push_back(destination);
+ } else {
+ contact1LineEdit->selectAll();
+ return;
+ }
+
+ // 2nd choice destination
+ if (!contact2LineEdit->text().isEmpty()) {
+ ui->expand_destination(user_config,
+ contact2LineEdit->text().stripWhiteSpace().ascii(), destination);
+ if (destination.is_valid()) {
+ dest_list.push_back(destination);
+ } else {
+ contact2LineEdit->selectAll();
+ return;
+ }
+ }
+
+ // 3rd choice destination
+ if (!contact3LineEdit->text().isEmpty()) {
+ ui->expand_destination(user_config,
+ contact3LineEdit->text().stripWhiteSpace().ascii(), destination);
+ if (destination.is_valid()) {
+ dest_list.push_back(destination);
+ } else {
+ contact3LineEdit->selectAll();
+ return;
+ }
+ }
+
+ emit destinations(dest_list);
+ accept();
+}
+
+void RedirectForm::showAddressBook()
+{
+ if (!getAddressForm) {
+ getAddressForm = new GetAddressForm(
+ this, "select address", true);
+ MEMMAN_NEW(getAddressForm);
+ }
+
+ connect(getAddressForm,
+ SIGNAL(address(const QString &)),
+ this, SLOT(selectedAddress(const QString &)));
+
+ getAddressForm->show();
+}
+
+void RedirectForm::showAddressBook1()
+{
+ nrAddressBook = 1;
+ showAddressBook();
+}
+
+void RedirectForm::showAddressBook2()
+{
+ nrAddressBook = 2;
+ showAddressBook();
+}
+
+void RedirectForm::showAddressBook3()
+{
+ nrAddressBook = 3;
+ showAddressBook();
+}
+
+void RedirectForm::selectedAddress(const QString &address)
+{
+ switch(nrAddressBook) {
+ case 1:
+ contact1LineEdit->setText(address);
+ break;
+ case 2:
+ contact2LineEdit->setText(address);
+ break;
+ case 3:
+ contact3LineEdit->setText(address);
+ break;
+ }
+}
diff --git a/src/gui/selectnicform.ui b/src/gui/selectnicform.ui
new file mode 100644
index 0000000..7f10220
--- /dev/null
+++ b/src/gui/selectnicform.ui
@@ -0,0 +1,212 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SelectNicForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SelectNicForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>482</width>
+ <height>144</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Select NIC</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>nicIconTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>kcmpci.png</pixmap>
+ </property>
+ </widget>
+ <spacer row="1" column="0" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>spacer53</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>41</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layout42</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>selectTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Select the network interface/IP address that you want to use:</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignTop</set>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>nicListBox</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>spacer9</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="2" column="1">
+ <property name="name">
+ <cstring>layout11</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>defaultIpPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Set as default &amp;IP</string>
+ </property>
+ <property name="accel">
+ <string>Alt+I</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Make the selected IP address the default IP address. The next time you start Twinkle, this IP address will be automatically selected.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>defaultNicPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Set as default &amp;NIC</string>
+ </property>
+ <property name="accel">
+ <string>Alt+N</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Make the selected network interface the default interface. The next time you start Twinkle, this interface will be automatically selected.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string>Alt+O</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SelectNicForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>nicListBox</sender>
+ <signal>selected(const QString&amp;)</signal>
+ <receiver>SelectNicForm</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>defaultIpPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SelectNicForm</receiver>
+ <slot>setAsDefaultIp()</slot>
+ </connection>
+ <connection>
+ <sender>defaultNicPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SelectNicForm</receiver>
+ <slot>setAsDefaultNic()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">qmessagebox.h</include>
+ <include location="local" impldecl="in implementation">sys_settings.h</include>
+ <include location="local" impldecl="in implementation">selectnicform.ui.h</include>
+</includes>
+<variables>
+ <variable access="private">int idxDefault;</variable>
+</variables>
+<slots>
+ <slot>setAsDefault( bool setIp )</slot>
+ <slot>setAsDefaultIp()</slot>
+ <slot>setAsDefaultNic()</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/selectnicform.ui.h b/src/gui/selectnicform.ui.h
new file mode 100644
index 0000000..9dc0a35
--- /dev/null
+++ b/src/gui/selectnicform.ui.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+void SelectNicForm::init()
+{
+ idxDefault = -1;
+}
+
+void SelectNicForm::setAsDefault(bool setIp)
+{
+#if 0
+ // DEPRECATED
+ // Only show the information when the default button is
+ // pressed for the first time.
+ if (idxDefault == -1) {
+ QMessageBox::information(this, PRODUCT_NAME, tr(
+ "If you want to remove or "
+ "change the default at a later time, you can do that "
+ "via the system settings."));
+ }
+
+ // Store current index as the changeItem method also changes
+ // the current index as a side effect.
+ int idxNewDefault = nicListBox->currentItem();
+
+ // Restore pixmap of the old default
+ if (idxDefault != -1) {
+ nicListBox->changeItem(
+ QPixmap::fromMimeSource("kcmpci16.png"),
+ nicListBox->text(idxDefault),
+ idxDefault);
+ }
+
+ // Set pixmap of the default
+ idxDefault = idxNewDefault;
+ nicListBox->changeItem(
+ QPixmap::fromMimeSource("twinkle16.png"),
+ nicListBox->text(idxDefault),
+ idxDefault);
+
+ // Write default to system settings
+ int pos = nicListBox->currentText().findRev(':');
+ if (setIp) {
+ sys_config->set_start_user_host(nicListBox->currentText().mid(pos + 1).ascii());
+ sys_config->set_start_user_nic("");
+ } else {
+ sys_config->set_start_user_nic(nicListBox->currentText().left(pos).ascii());
+ sys_config->set_start_user_host("");
+ }
+ string error_msg;
+ if (!sys_config->write_config(error_msg)) {
+ // Failed to write config file
+ ((t_gui *)ui)->cb_show_msg(this, error_msg, MSG_CRITICAL);
+ }
+#endif
+}
+
+void SelectNicForm::setAsDefaultIp()
+{
+ setAsDefault(true);
+}
+
+void SelectNicForm::setAsDefaultNic()
+{
+ setAsDefault(false);
+}
diff --git a/src/gui/selectprofileform.ui b/src/gui/selectprofileform.ui
new file mode 100644
index 0000000..9efb522
--- /dev/null
+++ b/src/gui/selectprofileform.ui
@@ -0,0 +1,414 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SelectProfileForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SelectProfileForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>501</width>
+ <height>513</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Select user profile</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>selectTextLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Select user profile(s) to run:</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QListView" row="1" column="0">
+ <column>
+ <property name="text">
+ <string>User profile</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>profileListView</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Tick the check boxes of the user profiles that you want to run and press run.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>layout78</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer17</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>newProfileGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Create profile</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>newPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Ed&amp;itor</string>
+ </property>
+ <property name="accel">
+ <string>Alt+I</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Create a new profile with the profile editor.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>wizardPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Wizard</string>
+ </property>
+ <property name="accel">
+ <string>Alt+W</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Create a new profile with the wizard.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>diamondcardPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Dia&amp;mondcard</string>
+ </property>
+ <property name="accel">
+ <string>Alt+M</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>modifyProfileGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Modify profile</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>editPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Edit</string>
+ </property>
+ <property name="accel">
+ <string>Alt+E</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Edit the highlighted profile.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>deletePushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Delete</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Delete the highlighted profile.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>renamePushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Ren&amp;ame</string>
+ </property>
+ <property name="accel">
+ <string>Alt+A</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Rename the highlighted profile.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>startupProfileGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Startup profile</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>defaultPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Set as default</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Make the selected profiles the default profiles. The next time you start Twinkle, these profiles will be automatically run.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>runPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Run</string>
+ </property>
+ <property name="accel">
+ <string>Alt+R</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Run Twinkle with the selected profiles.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>sysPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>S&amp;ystem settings</string>
+ </property>
+ <property name="accel">
+ <string>Alt+Y</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Edit the system settings.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string>Alt+C</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SelectProfileForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>runPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SelectProfileForm</receiver>
+ <slot>runProfile()</slot>
+ </connection>
+ <connection>
+ <sender>editPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SelectProfileForm</receiver>
+ <slot>editProfile()</slot>
+ </connection>
+ <connection>
+ <sender>newPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SelectProfileForm</receiver>
+ <slot>newProfile()</slot>
+ </connection>
+ <connection>
+ <sender>deletePushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SelectProfileForm</receiver>
+ <slot>deleteProfile()</slot>
+ </connection>
+ <connection>
+ <sender>renamePushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SelectProfileForm</receiver>
+ <slot>renameProfile()</slot>
+ </connection>
+ <connection>
+ <sender>wizardPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SelectProfileForm</receiver>
+ <slot>wizardProfile()</slot>
+ </connection>
+ <connection>
+ <sender>defaultPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SelectProfileForm</receiver>
+ <slot>setAsDefault()</slot>
+ </connection>
+ <connection>
+ <sender>sysPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SelectProfileForm</receiver>
+ <slot>sysSettings()</slot>
+ </connection>
+ <connection>
+ <sender>profileListView</sender>
+ <signal>doubleClicked(QListViewItem*)</signal>
+ <receiver>SelectProfileForm</receiver>
+ <slot>toggleItem(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>diamondcardPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SelectProfileForm</receiver>
+ <slot>diamondcardProfile()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>profileListView</tabstop>
+ <tabstop>newPushButton</tabstop>
+ <tabstop>wizardPushButton</tabstop>
+ <tabstop>diamondcardPushButton</tabstop>
+ <tabstop>editPushButton</tabstop>
+ <tabstop>deletePushButton</tabstop>
+ <tabstop>renamePushButton</tabstop>
+ <tabstop>defaultPushButton</tabstop>
+ <tabstop>runPushButton</tabstop>
+ <tabstop>sysPushButton</tabstop>
+ <tabstop>cancelPushButton</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in declaration">list</include>
+ <include location="global" impldecl="in declaration">string</include>
+ <include location="local" impldecl="in declaration">phone.h</include>
+ <include location="local" impldecl="in declaration">qmainwindow.h</include>
+ <include location="local" impldecl="in implementation">qdir.h</include>
+ <include location="local" impldecl="in implementation">user.h</include>
+ <include location="local" impldecl="in implementation">qstringlist.h</include>
+ <include location="local" impldecl="in implementation">qmessagebox.h</include>
+ <include location="local" impldecl="in implementation">protocol.h</include>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">userprofileform.h</include>
+ <include location="local" impldecl="in implementation">getprofilenameform.h</include>
+ <include location="local" impldecl="in implementation">audits/memman.h</include>
+ <include location="local" impldecl="in implementation">wizardform.h</include>
+ <include location="local" impldecl="in implementation">syssettingsform.h</include>
+ <include location="local" impldecl="in implementation">qlistview.h</include>
+ <include location="global" impldecl="in implementation">cstring</include>
+ <include location="local" impldecl="in implementation">service.h</include>
+ <include location="local" impldecl="in implementation">presence/buddy.h</include>
+ <include location="local" impldecl="in implementation">diamondcardprofileform.h</include>
+ <include location="local" impldecl="in implementation">selectprofileform.ui.h</include>
+</includes>
+<forwards>
+ <forward>extern t_phone *phone;</forward>
+</forwards>
+<variables>
+ <variable access="public">std::list&lt;std::string&gt; selectedProfiles;</variable>
+ <variable access="private">bool defaultSet;</variable>
+ <variable access="private">t_user *user_config;</variable>
+ <variable access="private">QMainWindow *mainWindow;</variable>
+</variables>
+<signals>
+ <signal>selection(const list&lt;string&gt; &amp;)</signal>
+ <signal>profileRenamed()</signal>
+</signals>
+<slots>
+ <slot>showForm( QMainWindow * _mainWindow )</slot>
+ <slot>runProfile()</slot>
+ <slot>editProfile()</slot>
+ <slot>newProfile()</slot>
+ <slot>newProfile( bool exec_mode )</slot>
+ <slot>newProfileCreated()</slot>
+ <slot>deleteProfile()</slot>
+ <slot>renameProfile()</slot>
+ <slot>setAsDefault()</slot>
+ <slot>wizardProfile()</slot>
+ <slot>wizardProfile( bool exec_mode )</slot>
+ <slot>diamondcardProfile()</slot>
+ <slot>diamondcardProfile( bool exec_mode )</slot>
+ <slot>sysSettings()</slot>
+ <slot>fillProfileListView( const QStringList &amp; profiles )</slot>
+ <slot>toggleItem( QListViewItem * item )</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function access="private" specifier="non virtual">destroy()</function>
+ <function returnType="int">execForm()</function>
+ <function specifier="static" returnType="bool">getUserProfiles( QStringList &amp; profiles, QString &amp; error )</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/selectprofileform.ui.h b/src/gui/selectprofileform.ui.h
new file mode 100644
index 0000000..1586227
--- /dev/null
+++ b/src/gui/selectprofileform.ui.h
@@ -0,0 +1,631 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+void SelectProfileForm::init()
+{
+ user_config = 0;
+}
+
+void SelectProfileForm::destroy()
+{
+ if (user_config) {
+ MEMMAN_DELETE(user_config);
+ delete user_config;
+ }
+}
+
+// The exec() method is called at startup
+int SelectProfileForm::execForm()
+{
+ mainWindow = 0;
+ profileListView->clear();
+ defaultSet = false; // no default has been set
+
+ // Get list of all profiles
+ QStringList profiles;
+ QString error;
+ if (!SelectProfileForm::getUserProfiles(profiles, error)) {
+ QMessageBox::critical(this, PRODUCT_NAME, error);
+ return QDialog::Rejected;
+ }
+
+ // If there are no profiles then the user has to create one
+ if (profiles.isEmpty()) {
+ QMessageBox::information(this, PRODUCT_NAME, tr(
+ "<html>"\
+ "Before you can use Twinkle, you must create a user "\
+ "profile.<br>Click OK to create a profile.</html>"));
+
+ int newProfileMethod = QMessageBox::question(this, PRODUCT_NAME, tr(
+ "<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>"\
+ "Choose what method you wish to use.</html>"),
+ tr("&Wizard"), tr("&Profile editor"), tr("&Diamondcard"));
+
+ switch (newProfileMethod) {
+ case 0:
+ wizardProfile(true);
+ break;
+ case 1:
+ newProfile(true);
+ break;
+ case 2:
+ diamondcardProfile(true);
+ break;
+ default:
+ return QDialog::Rejected;
+ }
+
+ if (profileListView->childCount() == 0) {
+ // No profile has been created.
+ return QDialog::Rejected;
+ }
+
+ // Select the created profile
+ QCheckListItem *item = (QCheckListItem *)profileListView->currentItem();
+ QString profile = item->text();
+ profile.append(USER_FILE_EXT);
+ selectedProfiles.clear();
+ selectedProfiles.push_back(profile.ascii());
+
+ QMessageBox::information(this, PRODUCT_NAME, tr(
+ "<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>"));
+
+ SysSettingsForm f(this, "system settings", true);
+ f.exec();
+
+ return QDialog::Accepted;
+ }
+
+ fillProfileListView(profiles);
+ sysPushButton->show();
+ runPushButton->setFocus();
+
+ // Show the modal dialog
+ return QDialog::exec();
+}
+
+// The showForm() method is called from File menu when Twinkle is running.
+// The execForm() method cannot be used as it will block the Qt event loop.
+// NOTE: the method show() is not re-implemented as Qt calls this method
+// from exec() internally.
+void SelectProfileForm::showForm(QMainWindow *_mainWindow)
+{
+ mainWindow = _mainWindow;
+ profileListView->clear();
+ defaultSet = false;
+
+ // Get list of all profiles
+ QStringList profiles;
+ QString error;
+ if (!SelectProfileForm::getUserProfiles(profiles, error)) {
+ QMessageBox::critical(this, PRODUCT_NAME, error);
+ return;
+ }
+
+ // Initialize profile list view
+ fillProfileListView(profiles);
+ QListViewItemIterator j(profileListView);
+ while (j.current()) {
+ QCheckListItem *item = (QCheckListItem *)j.current();
+ QString profile = item->text();
+
+ // Set pixmap of default profile
+ list<string> l = sys_config->get_start_user_profiles();
+ if (std::find(l.begin(), l.end(), profile.ascii()) != l.end())
+ {
+ item->setPixmap(0, QPixmap::fromMimeSource("twinkle16.png"));
+ defaultSet = true;
+ }
+
+ // Tick check box of active profile
+ if (phone->ref_user_profile(profile.ascii())) {
+ item->setOn(true);
+ }
+
+ j++;
+ }
+
+ sysPushButton->hide();
+ runPushButton->setText("&OK");
+ runPushButton->setFocus();
+ QDialog::show();
+}
+
+void SelectProfileForm::runProfile()
+{
+ selectedProfiles.clear();
+ QListViewItemIterator i(profileListView, QListViewItemIterator::Checked);
+ while (i.current()) {
+ QCheckListItem *item = (QCheckListItem *)i.current();
+ QString profile =item->text();
+ profile.append(USER_FILE_EXT);
+ selectedProfiles.push_back(profile.ascii());
+ i++;
+ }
+
+ if (selectedProfiles.empty()) {
+ QMessageBox::warning(this, PRODUCT_NAME, tr(
+ "You did not select any user profile to run.\n"\
+ "Please select a profile."));
+ return;
+ }
+
+ // This signal will be caught when Twinkle is running.
+ // At startup the selectedProfiles attribute is read.
+ emit selection(selectedProfiles);
+
+ accept();
+}
+
+void SelectProfileForm::editProfile()
+{
+ QCheckListItem *item = (QCheckListItem *)profileListView->currentItem();
+ QString profile = item->text();
+
+ // If the profile to edit is currently active, then edit the in-memory
+ // user profile owned by the t_phone_user object
+ if (mainWindow) {
+ t_user *active_user = phone->ref_user_profile(profile.ascii());
+ if (active_user) {
+ list<t_user *> user_list;
+ user_list.push_back(active_user);
+ UserProfileForm *f = new UserProfileForm(this,
+ "edit user profile", true,
+ Qt::WDestructiveClose);
+
+ connect(f, SIGNAL(authCredentialsChanged(t_user *, const string&)),
+ mainWindow,
+ SLOT(updateAuthCache(t_user *, const string&)));
+
+ connect(f, SIGNAL(stunServerChanged(t_user *)),
+ mainWindow, SLOT(updateStunSettings(t_user *)));
+
+ f->show(user_list, "");
+ return;
+ }
+ }
+
+ // Edit the user profile from disk.
+ profile.append(USER_FILE_EXT);
+
+ // Read selected config file
+ string error_msg;
+
+ if (user_config) {
+ MEMMAN_DELETE(user_config);
+ delete user_config;
+ }
+ user_config = new t_user();
+ MEMMAN_NEW(user_config);
+
+ if (!user_config->read_config(profile.ascii(), error_msg)) {
+ ((t_gui *)ui)->cb_show_msg(this, error_msg, MSG_WARNING);
+ return;
+ }
+
+ // Show the edit user profile form (modal dialog)
+ list<t_user *> user_list;
+ user_list.push_back(user_config);
+ UserProfileForm *f = new UserProfileForm(this, "edit user profile", true,
+ Qt::WDestructiveClose);
+ f->show(user_list, "");
+}
+
+void SelectProfileForm::newProfile()
+{
+ newProfile(false);
+}
+
+void SelectProfileForm::newProfile(bool exec_mode)
+{
+ // Ask user for a profile name
+ GetProfileNameForm getProfileNameForm(this, "get profile name", true);
+ if (!getProfileNameForm.execNewName()) return;
+
+ // Create file name
+ QString profile = getProfileNameForm.getProfileName();
+ QString filename = profile;
+ filename.append(USER_FILE_EXT);
+
+ // Create a new user config
+ if (user_config) {
+ MEMMAN_DELETE(user_config);
+ delete user_config;
+ }
+ user_config = new t_user();
+ MEMMAN_NEW(user_config);
+ user_config->set_config(filename.ascii());
+
+ // Show the edit user profile form (modal dialog)
+ list<t_user *> user_list;
+ user_list.push_back(user_config);
+ UserProfileForm *f = new UserProfileForm(this, "edit user profile", true,
+ Qt::WDestructiveClose);
+ connect(f, SIGNAL(success()), this, SLOT(newProfileCreated()));
+
+ if (exec_mode) {
+ f->exec(user_list, "");
+ } else {
+ f->show(user_list, "");
+ }
+}
+
+void SelectProfileForm::newProfileCreated()
+{
+ // New profile created
+ // Add the new profile to the profile list box
+ QCheckListItem *item = new QCheckListItem(profileListView,
+ user_config->get_profile_name().c_str(),
+ QCheckListItem::CheckBox);
+ item->setPixmap(0, QPixmap::fromMimeSource("penguin-small.png"));
+
+ // Make the new profile the selected profile
+ // Do not change this without changing the exec method.
+ // When there are no profiles, the exec methods relies on the
+ // fact that afer creation of the profile it is selected.
+ profileListView->setSelected(item, true);
+
+ // Enable buttons that act on a profile
+ editPushButton->setEnabled(true);
+ deletePushButton->setEnabled(true);
+ renamePushButton->setEnabled(true);
+ defaultPushButton->setEnabled(true);
+ runPushButton->setEnabled(true);
+}
+
+void SelectProfileForm::deleteProfile()
+{
+ QCheckListItem *item = (QCheckListItem *)profileListView->currentItem();
+ QString profile = item->text();
+ QString msg = tr("Are you sure you want to delete profile '%1'?").arg(profile);
+ QMessageBox *mb = new QMessageBox(tr("Delete profile"), msg,
+ QMessageBox::Warning,
+ QMessageBox::Yes,
+ QMessageBox::No,
+ QMessageBox::NoButton,
+ this);
+ MEMMAN_NEW(mb);
+ if (mb->exec() == QMessageBox::Yes) {
+ // Delete file
+ QDir d = QDir::home();
+ d.cd(USER_DIR);
+ QString filename = profile;
+ filename.append(USER_FILE_EXT);
+ QString fullname = d.filePath(filename);
+ if (!QFile::remove(fullname)) {
+ // Failed to delete file
+ QMessageBox::critical(this, PRODUCT_NAME,
+ tr("Failed to delete profile."));
+ } else {
+ // Delete possible backup of the profile
+ QString backupname = fullname;
+ backupname.append("~");
+ (void)QFile::remove(backupname);
+
+ // Delete service files
+ filename = profile;
+ filename.append(SVC_FILE_EXT);
+ fullname = d.filePath(filename);
+ (void)QFile::remove(fullname);
+ fullname.append("~");
+ (void)QFile::remove(fullname);
+
+ // Delete profile from list of default profiles in
+ // system settings
+ list<string> l = sys_config->get_start_user_profiles();
+ if (std::find(l.begin(), l.end(), profile.ascii()) != l.end()) {
+ l.remove(profile.ascii());
+ sys_config->set_start_user_profiles(l);
+
+ string error_msg;
+ if (!sys_config->write_config(error_msg)) {
+ // Failed to write config file
+ ((t_gui *)ui)->cb_show_msg(this,
+ error_msg, MSG_CRITICAL);
+ }
+ }
+
+ // Delete profile from profile list box
+ QCheckListItem *item = (QCheckListItem *)profileListView->
+ currentItem();
+ delete item;
+ if (profileListView->childCount() == 0) {
+ // There are no profiles anymore
+ // Disable buttons that act on a profile
+ editPushButton->setEnabled(false);
+ deletePushButton->setEnabled(false);
+ renamePushButton->setEnabled(false);
+ defaultPushButton->setEnabled(false);
+ runPushButton->setEnabled(false);
+ } else {
+ profileListView->setSelected(profileListView->
+ firstChild(), true);
+ }
+ }
+ }
+
+ MEMMAN_DELETE(mb);
+ delete mb;
+}
+
+void SelectProfileForm::renameProfile()
+{
+ QCheckListItem *item = (QCheckListItem *)profileListView->currentItem();
+ QString oldProfile = item->text();
+
+ // Ask user for a new profile name
+ GetProfileNameForm getProfileNameForm(this, "get profile name", true);
+ if (!getProfileNameForm.execRename(oldProfile)) return;
+
+ // Create file name for the new profile
+ QString newProfile = getProfileNameForm.getProfileName();
+ QString newFilename = newProfile;
+ newFilename.append(USER_FILE_EXT);
+
+ // Create file name for the old profile
+ QString oldFilename = oldProfile;
+ oldFilename.append(USER_FILE_EXT);
+
+ // Rename the file
+ QDir d = QDir::home();
+ d.cd(USER_DIR);
+ if (!d.rename(oldFilename, newFilename)) {
+ // Failed to delete file
+ QMessageBox::critical(this, PRODUCT_NAME,
+ tr("Failed to rename profile."));
+ } else {
+ // If there is a backup of the profile, rename it too.
+ QString oldBackupFilename = oldFilename;
+ oldBackupFilename.append("~");
+ QString oldBackupFullname = d.filePath(oldBackupFilename);
+ if (QFile::exists(oldBackupFullname)) {
+ QString newBackupFilename = newFilename;
+ newBackupFilename.append("~");
+ d.rename(oldBackupFilename, newBackupFilename);
+ }
+
+ // Rename service files
+ oldFilename = oldProfile;
+ oldFilename.append(SVC_FILE_EXT);
+ QString oldFullname = d.filePath(oldFilename);
+ if (QFile::exists(oldFullname)) {
+ newFilename = newProfile;
+ newFilename.append(SVC_FILE_EXT);
+ d.rename(oldFilename, newFilename);
+ }
+
+ // Rename service backup file
+ oldFilename.append("~");
+ oldFullname = d.filePath(oldFilename);
+ if (QFile::exists(oldFullname)) {
+ newFilename.append("~");
+ d.rename(oldFilename, newFilename);
+ }
+
+ // Rename buddy list file
+ oldFilename = oldProfile;
+ oldFilename.append(BUDDY_FILE_EXT);
+ oldFullname = d.filePath(oldFilename);
+ if (QFile::exists(oldFullname)) {
+ newFilename = newProfile;
+ newFilename.append(BUDDY_FILE_EXT);
+ d.rename(oldFilename, newFilename);
+ }
+
+ // Rename profile in list of default profiles in
+ // system settings
+ list<string> l = sys_config->get_start_user_profiles();
+ if (std::find(l.begin(), l.end(), oldProfile.ascii()) != l.end())
+ {
+ std::replace(l.begin(), l.end(), oldProfile.ascii(), newProfile.ascii());
+ sys_config->set_start_user_profiles(l);
+
+ string error_msg;
+ if (!sys_config->write_config(error_msg)) {
+ // Failed to write config file
+ ((t_gui *)ui)->cb_show_msg(this,
+ error_msg, MSG_CRITICAL);
+ }
+ }
+
+ emit profileRenamed();
+
+ // Change profile name in the list box
+ QCheckListItem *item = (QCheckListItem *)profileListView->currentItem();
+ item->setText(0, newProfile);
+ }
+}
+
+void SelectProfileForm::setAsDefault()
+{
+ // Only show the information when the default button is
+ // pressed for the first time.
+ if (!defaultSet) {
+ QMessageBox::information(this, PRODUCT_NAME, tr(
+ "<p>"
+ "If you want to remove or "
+ "change the default at a later time, you can do that "
+ "via the system settings."
+ "</p>"));
+ }
+
+ defaultSet = true;
+
+ // Restore all pixmaps
+ QListViewItemIterator i(profileListView);
+ while (i.current()) {
+ i.current()->setPixmap(0, QPixmap::fromMimeSource("penguin-small.png"));
+ i++;
+ }
+
+ // Set pixmap of the default profiles.
+ // Set default profiles in system settings.
+ list<string> l;
+ QListViewItemIterator j(profileListView, QListViewItemIterator::Checked);
+ while (j.current()) {
+ QCheckListItem *item = (QCheckListItem *)j.current();
+ item->setPixmap(0, QPixmap::fromMimeSource("twinkle16.png"));
+ l.push_back(item->text().ascii());
+ j++;
+ }
+ sys_config->set_start_user_profiles(l);
+
+ // Write default to system settings
+ string error_msg;
+ if (!sys_config->write_config(error_msg)) {
+ // Failed to write config file
+ ((t_gui *)ui)->cb_show_msg(this, error_msg, MSG_CRITICAL);
+ }
+}
+
+void SelectProfileForm::wizardProfile()
+{
+ wizardProfile(false);
+}
+
+void SelectProfileForm::wizardProfile(bool exec_mode)
+{
+ // Ask user for a profile name
+ GetProfileNameForm getProfileNameForm(this, "get profile name", true);
+ if (!getProfileNameForm.execNewName()) return;
+
+ // Create file name
+ QString profile = getProfileNameForm.getProfileName();
+ QString filename = profile;
+ filename.append(USER_FILE_EXT);
+
+ // Create a new user config
+ if (user_config) {
+ MEMMAN_DELETE(user_config);
+ delete user_config;
+ }
+ user_config = new t_user();
+ MEMMAN_NEW(user_config);
+ user_config->set_config(filename.ascii());
+
+ // Show the wizard form (modal dialog)
+ WizardForm *f = new WizardForm(this, "wizard", true, Qt::WDestructiveClose);
+ connect(f, SIGNAL(success()), this, SLOT(newProfileCreated()));
+
+ if (exec_mode) {
+ f->exec(user_config);
+ } else {
+ f->show(user_config);
+ }
+}
+
+void SelectProfileForm::diamondcardProfile()
+{
+ diamondcardProfile(false);
+}
+
+void SelectProfileForm::diamondcardProfile(bool exec_mode)
+{
+ // Create a new user config
+ if (user_config) {
+ MEMMAN_DELETE(user_config);
+ delete user_config;
+ }
+ user_config = new t_user();
+ MEMMAN_NEW(user_config);
+
+ // Show the diamondcard profile form (modal dialog)
+ DiamondcardProfileForm *f = new DiamondcardProfileForm(this, "diamondcard",
+ true, Qt::WDestructiveClose);
+ connect(f, SIGNAL(success()), this, SLOT(newProfileCreated()));
+
+ if (exec_mode) {
+ f->exec(user_config);
+ } else {
+ f->show(user_config);
+ }
+}
+
+
+void SelectProfileForm::sysSettings()
+{
+ SysSettingsForm *f = new SysSettingsForm(this, "system settings", true,
+ Qt::WDestructiveClose);
+ f->show();
+}
+
+// Get a list of all profiles. Returns false if there is an error.
+bool SelectProfileForm::getUserProfiles(QStringList &profiles, QString &error)
+{
+ // Find the .twinkle directory in HOME
+ QDir d = QDir::home();
+ if (!d.cd(USER_DIR)) {
+ error = tr("Cannot find .twinkle directory in your home directory.");
+ return false;
+ }
+
+ // Select all config files
+ QString filterName = "*";
+ filterName.append(USER_FILE_EXT);
+ d.setFilter(QDir::Files);
+ d.setNameFilter(filterName);
+ d.setSorting(QDir::Name | QDir::IgnoreCase);
+ profiles = d.entryList();
+
+ return true;
+}
+
+void SelectProfileForm::fillProfileListView(const QStringList &profiles)
+{
+ // Put the profiles in the profile list view
+ for (QStringList::ConstIterator i = profiles.begin(); i != profiles.end(); i++) {
+ // Strip off the user file extension
+ QString profile = *i;
+ profile.truncate(profile.length() - strlen(USER_FILE_EXT));
+ QCheckListItem *item = new QCheckListItem(
+ profileListView, profile, QCheckListItem::CheckBox);
+ item->setPixmap(0, QPixmap::fromMimeSource("penguin-small.png"));
+ }
+
+ // Highlight the first profile
+ profileListView->setSelected(profileListView->firstChild(), true);
+}
+
+void SelectProfileForm::toggleItem(QListViewItem *item)
+{
+ QCheckListItem *checkItem = (QCheckListItem *)item;
+ checkItem->setOn(!checkItem->isOn());
+}
+
diff --git a/src/gui/selectuserform.ui b/src/gui/selectuserform.ui
new file mode 100644
index 0000000..19a7ff7
--- /dev/null
+++ b/src/gui/selectuserform.ui
@@ -0,0 +1,206 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SelectUserForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SelectUserForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>584</width>
+ <height>228</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Select user</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="1" column="4">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string>Alt+C</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="0">
+ <property name="name">
+ <cstring>selectPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Select all</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ </widget>
+ <spacer row="1" column="2">
+ <property name="name">
+ <cstring>spacer47</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="1" column="3">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string>Alt+O</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>clearPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>C&amp;lear all</string>
+ </property>
+ <property name="accel">
+ <string>Alt+L</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="5">
+ <property name="name">
+ <cstring>layout100</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>purposeTextLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>purpose</string>
+ <comment>No need to translate</comment>
+ </property>
+ </widget>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>User</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>userListView</cstring>
+ </property>
+ <property name="resizePolicy">
+ <enum>Manual</enum>
+ </property>
+ <property name="selectionMode">
+ <enum>NoSelection</enum>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SelectUserForm</receiver>
+ <slot>validate()</slot>
+ </connection>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SelectUserForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>selectPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SelectUserForm</receiver>
+ <slot>selectAll()</slot>
+ </connection>
+ <connection>
+ <sender>clearPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SelectUserForm</receiver>
+ <slot>clearAll()</slot>
+ </connection>
+ <connection>
+ <sender>userListView</sender>
+ <signal>doubleClicked(QListViewItem*)</signal>
+ <receiver>SelectUserForm</receiver>
+ <slot>toggle(QListViewItem*)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>userListView</tabstop>
+ <tabstop>selectPushButton</tabstop>
+ <tabstop>clearPushButton</tabstop>
+ <tabstop>okPushButton</tabstop>
+ <tabstop>cancelPushButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in declaration">user.h</include>
+ <include location="local" impldecl="in declaration">phone.h</include>
+ <include location="local" impldecl="in declaration">gui.h</include>
+ <include location="global" impldecl="in implementation">cassert</include>
+ <include location="local" impldecl="in implementation">qlistview.h</include>
+ <include location="local" impldecl="in implementation">selectuserform.ui.h</include>
+</includes>
+<forwards>
+ <forward>extern t_phone *phone;</forward>
+</forwards>
+<signals>
+ <signal>selection(list&lt;t_user *&gt;)</signal>
+ <signal>not_selected(list&lt;t_user*&gt;)</signal>
+</signals>
+<slots>
+ <slot>show( t_select_purpose purpose )</slot>
+ <slot>validate()</slot>
+ <slot>selectAll()</slot>
+ <slot>clearAll()</slot>
+ <slot>toggle( QListViewItem * item )</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/selectuserform.ui.h b/src/gui/selectuserform.ui.h
new file mode 100644
index 0000000..3b2862d
--- /dev/null
+++ b/src/gui/selectuserform.ui.h
@@ -0,0 +1,138 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you want to add, delete, or rename functions or slots, use
+** Qt Designer to update this file, preserving your code.
+**
+** You should not define a constructor or destructor in this file.
+** Instead, write your code in functions called init() and destroy().
+** These will automatically be called by the form's constructor and
+** destructor.
+*****************************************************************************/
+
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+void SelectUserForm::init()
+{
+ // Disable sorting
+ userListView->setSorting(-1);
+}
+
+void SelectUserForm::show(t_select_purpose purpose)
+{
+ QString title, msg_purpose;
+
+ // Set dialog caption and purpose
+ title = PRODUCT_NAME;
+ title += " - ";
+ switch (purpose) {
+ case SELECT_REGISTER:
+ title.append(tr("Register"));
+ msg_purpose = tr("Select users that you want to register.");
+ break;
+ case SELECT_DEREGISTER:
+ title.append(tr("Deregister"));
+ msg_purpose = tr("Select users that you want to deregister.");
+ break;
+ case SELECT_DEREGISTER_ALL:
+ title.append(tr("Deregister all devices"));
+ msg_purpose = tr("Select users for which you want to deregister all devices.");
+ break;
+ case SELECT_DND:
+ title.append(tr("Do not disturb"));
+ msg_purpose = tr("Select users for which you want to enable 'do not disturb'.");
+ break;
+ case SELECT_AUTO_ANSWER:
+ title.append(tr("Auto answer"));
+ msg_purpose = tr("Select users for which you want to enable 'auto answer'.");
+ break;
+ default:
+ assert(false);
+ }
+ setCaption(title);
+ purposeTextLabel->setText(msg_purpose);
+
+ // Fill list view
+ list<t_user *> user_list = phone->ref_users();
+ for (list<t_user *>::reverse_iterator i = user_list.rbegin(); i != user_list.rend(); i++) {
+ QCheckListItem *item = new QCheckListItem(userListView,
+ (*i)->get_profile_name().c_str(), QCheckListItem::CheckBox);
+
+ switch (purpose) {
+ case SELECT_DND:
+ item->setOn(phone->ref_service(*i)->is_dnd_active());
+ break;
+ case SELECT_AUTO_ANSWER:
+ item->setOn(phone->ref_service(*i)->is_auto_answer_active());
+ break;
+ default:
+ break;
+ }
+ }
+
+ QDialog::show();
+}
+
+void SelectUserForm::validate()
+{
+ list<t_user *> selected_list, not_selected_list;
+
+ QListViewItemIterator i(userListView);
+ while (i.current()) {
+ QCheckListItem *item = (QCheckListItem *)(i.current());
+ if (item->isOn()) {
+ selected_list.push_back(phone->
+ ref_user_profile(item->text().ascii()));
+ } else {
+ not_selected_list.push_back(phone->
+ ref_user_profile(item->text().ascii()));
+ }
+ i++;
+ }
+
+ emit (selection(selected_list));
+ emit (not_selected(not_selected_list));
+ accept();
+}
+
+void SelectUserForm::selectAll()
+{
+ QListViewItemIterator i(userListView);
+ while (i.current()) {
+ QCheckListItem *item = (QCheckListItem *)(i.current());
+ item->setOn(true);
+ i++;
+ }
+}
+
+void SelectUserForm::clearAll()
+{
+ QListViewItemIterator i(userListView);
+ while (i.current()) {
+ QCheckListItem *item = (QCheckListItem *)(i.current());
+ item->setOn(false);
+ i++;
+ }
+}
+
+void SelectUserForm::toggle(QListViewItem *item)
+{
+ QCheckListItem *checkItem = (QCheckListItem *)item;
+ checkItem->setOn(!checkItem->isOn());
+}
diff --git a/src/gui/sendfileform.ui b/src/gui/sendfileform.ui
new file mode 100644
index 0000000..748459b
--- /dev/null
+++ b/src/gui/sendfileform.ui
@@ -0,0 +1,217 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SendFileForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SendFileForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>461</width>
+ <height>127</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Send File</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout166</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QToolButton" row="1" column="2">
+ <property name="name">
+ <cstring>fileToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>fileopen.png</iconset>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select file to send.</string>
+ </property>
+ </widget>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>spacer62</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Minimum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>28</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>fileTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;File:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>fileLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>subjectTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Subject:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>subjectLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>fileLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>subjectLineEdit</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer66</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout59</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer65</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>141</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string>Alt+O</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string>Alt+C</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SendFileForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SendFileForm</receiver>
+ <slot>signalSelectedInfo()</slot>
+ </connection>
+ <connection>
+ <sender>fileToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SendFileForm</receiver>
+ <slot>chooseFile()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>subjectLineEdit</tabstop>
+ <tabstop>fileLineEdit</tabstop>
+ <tabstop>okPushButton</tabstop>
+ <tabstop>cancelPushButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in declaration">qstring.h</include>
+ <include location="local" impldecl="in implementation">audits/memman.h</include>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">qfile.h</include>
+ <include location="local" impldecl="in implementation">qfiledialog.h</include>
+ <include location="local" impldecl="in implementation">sendfileform.ui.h</include>
+</includes>
+<variables>
+ <variable access="private">QDialog *_chooseFileDialog;</variable>
+</variables>
+<signals>
+ <signal>selected(const QString &amp;filename, const QString &amp;subject)</signal>
+</signals>
+<slots>
+ <slot>signalSelectedInfo()</slot>
+ <slot>chooseFile()</slot>
+ <slot>setFilename()</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function access="private" specifier="non virtual">destroy()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/sendfileform.ui.h b/src/gui/sendfileform.ui.h
new file mode 100644
index 0000000..067b6dd
--- /dev/null
+++ b/src/gui/sendfileform.ui.h
@@ -0,0 +1,106 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you want to add, delete, or rename functions or slots, use
+** Qt Designer to update this file, preserving your code.
+**
+** You should not define a constructor or destructor in this file.
+** Instead, write your code in functions called init() and destroy().
+** These will automatically be called by the form's constructor and
+** destructor.
+*****************************************************************************/
+
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifdef HAVE_KDE
+#include <kfiledialog.h>
+#endif
+
+void SendFileForm::init()
+{
+ setWFlags(getWFlags() | Qt::WDestructiveClose);
+ _chooseFileDialog = NULL;
+}
+
+void SendFileForm::destroy()
+{
+ // Auto destruct window
+ MEMMAN_DELETE(this);
+
+ if (_chooseFileDialog) {
+ MEMMAN_DELETE(_chooseFileDialog);
+ delete _chooseFileDialog;
+ }
+}
+
+/** Signal the selected information to an observer. */
+void SendFileForm::signalSelectedInfo()
+{
+ if (!QFile::exists(fileLineEdit->text())) {
+ ((t_gui *)ui)->cb_show_msg(this, tr("File does not exist.").ascii(), MSG_WARNING);
+ return;
+ }
+
+ emit selected(fileLineEdit->text(), subjectLineEdit->text());
+ accept();
+}
+
+/** Choose a file from a file dialog. */
+void SendFileForm::chooseFile()
+{
+#ifdef HAVE_KDE
+ KFileDialog *d = new KFileDialog(QString::null, QString::null, this, 0, true);
+ MEMMAN_NEW(d);
+
+ d->setOperationMode(KFileDialog::Other);
+ connect(d, SIGNAL(okClicked()), this, SLOT(setFilename()));
+#else
+ QFileDialog *d = new QFileDialog(QString::null, QString::null, this, 0, true);
+ MEMMAN_NEW(d);
+
+ connect(d, SIGNAL(fileSelected(const QString &)), this, SLOT(setFilename()));
+#endif
+ d->setCaption(tr("Send file..."));
+
+ if (_chooseFileDialog) {
+ MEMMAN_DELETE(_chooseFileDialog);
+ delete _chooseFileDialog;
+ }
+ _chooseFileDialog = d;
+
+ d->show();
+}
+
+/**
+ * Set the filename value.
+ * @param filename [in] The value to set.
+ */
+void SendFileForm::setFilename()
+{
+ QString filename;
+#ifdef HAVE_KDE
+ KFileDialog *d = dynamic_cast<KFileDialog *>(_chooseFileDialog);
+ filename = d->selectedFile();
+#else
+ QFileDialog *d = dynamic_cast<QFileDialog *>(_chooseFileDialog);
+ filename = d->selectedFile();
+#endif
+
+ fileLineEdit->setText(filename);
+}
diff --git a/src/gui/srvredirectform.ui b/src/gui/srvredirectform.ui
new file mode 100644
index 0000000..6f0430e
--- /dev/null
+++ b/src/gui/srvredirectform.ui
@@ -0,0 +1,819 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SrvRedirectForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SrvRedirectForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>648</width>
+ <height>315</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Call Redirection</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout114</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>userTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>User:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>userComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>userComboBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>cfTabWidget</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>There are 3 redirect services:&lt;p&gt;
+&lt;b&gt;Unconditional:&lt;/b&gt; redirect all calls
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Busy:&lt;/b&gt; redirect a call if both lines are busy
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;No answer:&lt;/b&gt; redirect a call when the no-answer timer expires
+&lt;/p&gt;</string>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Unconditional</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>cfAlwaysCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Redirect all calls</string>
+ </property>
+ <property name="accel">
+ <string>Alt+R</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Activate the unconditional redirection service.</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>cfAlwaysGroupBox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="title">
+ <string>Redirect to</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>cfAlwaysDst1LineEdit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="frameShape">
+ <enum>LineEditPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>cfAlwaysDst2LineEdit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>cfAlwaysDst3TextLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>&amp;3rd choice destination:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>cfAlwaysDst3LineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>cfAlwaysDst3LineEdit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>cfAlwaysDst2TextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;2nd choice destination:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>cfAlwaysDst2LineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>cfAlwaysDst1TextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;1st choice destination:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>cfAlwaysDst1LineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="0" column="2">
+ <property name="name">
+ <cstring>addrAlways1ToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>F10</string>
+ </property>
+ <property name="iconSet">
+ <iconset>kontact_contacts.png</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Address book</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="1" column="2">
+ <property name="name">
+ <cstring>addrAlways2ToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>F11</string>
+ </property>
+ <property name="iconSet">
+ <iconset>kontact_contacts.png</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Address book</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select an address from the address book.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="2" column="2">
+ <property name="name">
+ <cstring>addrAlways3ToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>F12</string>
+ </property>
+ <property name="iconSet">
+ <iconset>kontact_contacts.png</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Address book</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select an address from the address book.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Busy</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>cfBusyCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Redirect calls when I am busy</string>
+ </property>
+ <property name="accel">
+ <string>Alt+R</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Activate the redirection when busy service.</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>cfBusyGroupBox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="title">
+ <string>Redirect to</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>cfBusyDst2LineEdit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>cfBusyDst3TextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;3rd choice destination:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>cfAlwaysDst3LineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>cfBusyDst3LineEdit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>cfBusyDst2TextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;2nd choice destination:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>cfAlwaysDst2LineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>cfBusyDst1TextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;1st choice destination:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>cfAlwaysDst1LineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>cfBusyDst1LineEdit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="0" column="2">
+ <property name="name">
+ <cstring>addrBusy1ToolButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>kontact_contacts.png</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Address book</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select an address from the address book.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="1" column="2">
+ <property name="name">
+ <cstring>addrBusy2ToolButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>kontact_contacts.png</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Address book</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select an address from the address book.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="2" column="2">
+ <property name="name">
+ <cstring>addrBusy3ToolButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>kontact_contacts.png</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Address book</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select an address from the address book.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;No answer</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>cfNoanswerCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Redirect calls when I do not answer</string>
+ </property>
+ <property name="accel">
+ <string>Alt+R</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Activate the redirection on no answer service.</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>cfNoanswerGroupBox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="title">
+ <string>Redirect to</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>cfNoanswerDst2LineEdit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>cfNoanswerDst3TextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;3rd choice destination:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>cfAlwaysDst3LineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>cfNoanswerDst2TextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;2nd choice destination:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>cfAlwaysDst2LineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>cfNoanswerDst1TextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;1st choice destination:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>cfAlwaysDst1LineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>cfNoanswerDst1LineEdit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>cfNoanswerDst3LineEdit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="0" column="2">
+ <property name="name">
+ <cstring>addrNoanswer1ToolButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>kontact_contacts.png</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Address book</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select an address from the address book.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="1" column="2">
+ <property name="name">
+ <cstring>addrNoanswer2ToolButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>kontact_contacts.png</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Address book</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select an address from the address book.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="2" column="2">
+ <property name="name">
+ <cstring>addrNoanswer3ToolButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>kontact_contacts.png</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Address book</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select an address from the address book.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer14</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout23</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer13</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>261</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string>Alt+O</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Accept and save all changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string>Alt+C</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Undo your changes and close the window.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SrvRedirectForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SrvRedirectForm</receiver>
+ <slot>validate()</slot>
+ </connection>
+ <connection>
+ <sender>cfAlwaysCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>SrvRedirectForm</receiver>
+ <slot>toggleAlways(bool)</slot>
+ </connection>
+ <connection>
+ <sender>cfBusyCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>SrvRedirectForm</receiver>
+ <slot>toggleBusy(bool)</slot>
+ </connection>
+ <connection>
+ <sender>cfNoanswerCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>SrvRedirectForm</receiver>
+ <slot>toggleNoanswer(bool)</slot>
+ </connection>
+ <connection>
+ <sender>addrAlways1ToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SrvRedirectForm</receiver>
+ <slot>showAddressBook1()</slot>
+ </connection>
+ <connection>
+ <sender>addrAlways2ToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SrvRedirectForm</receiver>
+ <slot>showAddressBook2()</slot>
+ </connection>
+ <connection>
+ <sender>addrAlways3ToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SrvRedirectForm</receiver>
+ <slot>showAddressBook3()</slot>
+ </connection>
+ <connection>
+ <sender>addrBusy1ToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SrvRedirectForm</receiver>
+ <slot>showAddressBook4()</slot>
+ </connection>
+ <connection>
+ <sender>addrBusy2ToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SrvRedirectForm</receiver>
+ <slot>showAddressBook5()</slot>
+ </connection>
+ <connection>
+ <sender>addrBusy3ToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SrvRedirectForm</receiver>
+ <slot>showAddressBook6()</slot>
+ </connection>
+ <connection>
+ <sender>addrNoanswer1ToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SrvRedirectForm</receiver>
+ <slot>showAddressBook7()</slot>
+ </connection>
+ <connection>
+ <sender>addrNoanswer2ToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SrvRedirectForm</receiver>
+ <slot>showAddressBook8()</slot>
+ </connection>
+ <connection>
+ <sender>addrNoanswer3ToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SrvRedirectForm</receiver>
+ <slot>showAddressBook9()</slot>
+ </connection>
+ <connection>
+ <sender>userComboBox</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>SrvRedirectForm</receiver>
+ <slot>changedUser(const QString&amp;)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>cfTabWidget</tabstop>
+ <tabstop>cfAlwaysCheckBox</tabstop>
+ <tabstop>cfAlwaysDst1LineEdit</tabstop>
+ <tabstop>cfAlwaysDst2LineEdit</tabstop>
+ <tabstop>cfAlwaysDst3LineEdit</tabstop>
+ <tabstop>cfBusyCheckBox</tabstop>
+ <tabstop>cfBusyDst1LineEdit</tabstop>
+ <tabstop>cfBusyDst2LineEdit</tabstop>
+ <tabstop>cfBusyDst3LineEdit</tabstop>
+ <tabstop>cfNoanswerCheckBox</tabstop>
+ <tabstop>cfNoanswerDst1LineEdit</tabstop>
+ <tabstop>cfNoanswerDst2LineEdit</tabstop>
+ <tabstop>cfNoanswerDst3LineEdit</tabstop>
+ <tabstop>okPushButton</tabstop>
+ <tabstop>cancelPushButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">phone.h</include>
+ <include location="local" impldecl="in implementation">qgroupbox.h</include>
+ <include location="local" impldecl="in implementation">qcheckbox.h</include>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">audits/memman.h</include>
+ <include location="local" impldecl="in declaration">sockets/url.h</include>
+ <include location="global" impldecl="in declaration">list</include>
+ <include location="local" impldecl="in declaration">qlineedit.h</include>
+ <include location="local" impldecl="in declaration">getaddressform.h</include>
+ <include location="local" impldecl="in declaration">user.h</include>
+ <include location="local" impldecl="in declaration">phone.h</include>
+ <include location="local" impldecl="in implementation">srvredirectform.ui.h</include>
+</includes>
+<forwards>
+ <forward>extern t_phone *phone;</forward>
+</forwards>
+<variables>
+ <variable access="private">int nrAddressBook;</variable>
+ <variable access="private">GetAddressForm *getAddressForm;</variable>
+ <variable access="private">t_user *current_user;</variable>
+ <variable access="private">int current_user_idx;</variable>
+</variables>
+<signals>
+ <signal>destinations(t_user *, const list&lt;t_display_url&gt; &amp;always, const list&lt;t_display_url&gt; &amp;busy, const list&lt;t_display_url&gt; &amp;noanswer)</signal>
+</signals>
+<slots>
+ <slot>show()</slot>
+ <slot>populate()</slot>
+ <slot>validate()</slot>
+ <slot>toggleAlways( bool on )</slot>
+ <slot>toggleBusy( bool on )</slot>
+ <slot>toggleNoanswer( bool on )</slot>
+ <slot>changedUser( const QString &amp; user_display_uri )</slot>
+ <slot>showAddressBook()</slot>
+ <slot>showAddressBook1()</slot>
+ <slot>showAddressBook2()</slot>
+ <slot>showAddressBook3()</slot>
+ <slot>showAddressBook4()</slot>
+ <slot>showAddressBook5()</slot>
+ <slot>showAddressBook6()</slot>
+ <slot>showAddressBook7()</slot>
+ <slot>showAddressBook8()</slot>
+ <slot>showAddressBook9()</slot>
+ <slot>selectedAddress( const QString &amp; address )</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function access="private" specifier="non virtual">destroy()</function>
+ <function returnType="bool">validateValues()</function>
+ <function returnType="bool">validate( bool cf_active, QLineEdit * dst1, QLineEdit * dst2, QLineEdit * dst3, list&lt;t_display_url&gt; &amp; dest_list )</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/srvredirectform.ui.h b/src/gui/srvredirectform.ui.h
new file mode 100644
index 0000000..ecbadb7
--- /dev/null
+++ b/src/gui/srvredirectform.ui.h
@@ -0,0 +1,389 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+
+void SrvRedirectForm::init()
+{
+ cfAlwaysGroupBox->setEnabled(false);
+ cfBusyGroupBox->setEnabled(false);
+ cfNoanswerGroupBox->setEnabled(false);
+
+ // Keeps track of which address book tool button is clicked.
+ nrAddressBook = 0;
+
+ getAddressForm = 0;
+
+ // Set toolbutton icons for disabled options.
+ QIconSet i;
+ i = addrAlways1ToolButton->iconSet();
+ i.setPixmap(QPixmap::fromMimeSource("kontact_contacts-disabled.png"),
+ QIconSet::Automatic, QIconSet::Disabled);
+ addrAlways1ToolButton->setIconSet(i);
+ addrAlways2ToolButton->setIconSet(i);
+ addrAlways3ToolButton->setIconSet(i);
+ addrBusy1ToolButton->setIconSet(i);
+ addrBusy2ToolButton->setIconSet(i);
+ addrBusy3ToolButton->setIconSet(i);
+ addrNoanswer1ToolButton->setIconSet(i);
+ addrNoanswer2ToolButton->setIconSet(i);
+ addrNoanswer3ToolButton->setIconSet(i);
+}
+
+void SrvRedirectForm::destroy()
+{
+ if (getAddressForm) {
+ MEMMAN_DELETE(getAddressForm);
+ delete getAddressForm;
+ }
+}
+
+void SrvRedirectForm::show()
+{
+ current_user_idx = -1;
+ ((t_gui *)ui)->fill_user_combo(userComboBox);
+ userComboBox->setEnabled(userComboBox->count() > 1);
+ current_user = phone->ref_users().front();
+ current_user_idx = 0;
+ populate();
+
+ QDialog::show();
+}
+
+void SrvRedirectForm::populate()
+{
+ t_service *srv = phone->ref_service(current_user);
+ bool cf_active;
+ list<t_display_url> dest_list;
+ int field;
+
+ // Call forwarding unconditional
+ cf_active = srv->get_cf_active(CF_ALWAYS, dest_list);
+ cfAlwaysDst1LineEdit->clear();
+ cfAlwaysDst2LineEdit->clear();
+ cfAlwaysDst3LineEdit->clear();
+ cfAlwaysCheckBox->setChecked(cf_active);
+ if (cf_active) {
+ field = 1;
+ for (list<t_display_url>::iterator i = dest_list.begin(); i != dest_list.end(); i++) {
+ if (field == 1) cfAlwaysDst1LineEdit->setText(i->encode().c_str());
+ if (field == 2) cfAlwaysDst2LineEdit->setText(i->encode().c_str());
+ if (field == 3) cfAlwaysDst3LineEdit->setText(i->encode().c_str());
+ field++;
+ }
+ }
+
+ // Call forwarding busy
+ cf_active = srv->get_cf_active(CF_BUSY, dest_list);
+ cfBusyDst1LineEdit->clear();
+ cfBusyDst2LineEdit->clear();
+ cfBusyDst3LineEdit->clear();
+ cfBusyCheckBox->setChecked(cf_active);
+ if (cf_active) {
+ field = 1;
+ for (list<t_display_url>::iterator i = dest_list.begin(); i != dest_list.end(); i++) {
+ if (field == 1) cfBusyDst1LineEdit->setText(i->encode().c_str());
+ if (field == 2) cfBusyDst2LineEdit->setText(i->encode().c_str());
+ if (field == 3) cfBusyDst3LineEdit->setText(i->encode().c_str());
+ field++;
+ }
+ }
+
+ // Call forwarding no answer
+ cf_active = srv->get_cf_active(CF_NOANSWER, dest_list);
+ cfNoanswerDst1LineEdit->clear();
+ cfNoanswerDst2LineEdit->clear();
+ cfNoanswerDst3LineEdit->clear();
+ cfNoanswerCheckBox->setChecked(cf_active);
+ if (cf_active) {
+ field = 1;
+ for (list<t_display_url>::iterator i = dest_list.begin(); i != dest_list.end(); i++) {
+ if (field == 1) cfNoanswerDst1LineEdit->setText(i->encode().c_str());
+ if (field == 2) cfNoanswerDst2LineEdit->setText(i->encode().c_str());
+ if (field == 3) cfNoanswerDst3LineEdit->setText(i->encode().c_str());
+ field++;
+ }
+ }
+}
+
+void SrvRedirectForm::validate()
+{
+ if (validateValues()) {
+ accept();
+ } else {
+ ((t_gui *)ui)->cb_show_msg(this,
+ tr("You have entered an invalid destination.").ascii(),
+ MSG_WARNING);
+ }
+}
+
+bool SrvRedirectForm::validateValues()
+{
+ list<t_display_url> cfDestAlways, cfDestBusy, cfDestNoanswer;
+ bool valid = false;
+
+ // Redirect unconditional
+ valid = validate(cfAlwaysCheckBox->isChecked(),
+ cfAlwaysDst1LineEdit, cfAlwaysDst2LineEdit, cfAlwaysDst3LineEdit,
+ cfDestAlways);
+ if (!valid) {
+ cfTabWidget->setCurrentPage(0);
+ return false;
+ }
+
+ // Redirect busy
+ valid = validate(cfBusyCheckBox->isChecked(),
+ cfBusyDst1LineEdit, cfBusyDst2LineEdit, cfBusyDst3LineEdit,
+ cfDestBusy);
+ if (!valid) {
+ cfTabWidget->setCurrentPage(1);
+ return false;
+ }
+
+ // Redirect no answer
+ valid = validate(cfNoanswerCheckBox->isChecked(),
+ cfNoanswerDst1LineEdit, cfNoanswerDst2LineEdit,
+ cfNoanswerDst3LineEdit,
+ cfDestNoanswer);
+ if (!valid) {
+ cfTabWidget->setCurrentPage(2);
+ return false;
+ }
+
+ emit destinations(current_user, cfDestAlways, cfDestBusy, cfDestNoanswer);
+ return true;
+}
+
+
+// Validate 3 destinations if cf_active is true.
+// Returns true when all destinations are valid (first must be set, others may be empty)
+// dest_list containst the encoded destinations when valid.
+// If cf_active is false then the 3 destinations will be cleared.
+bool SrvRedirectForm::validate(bool cf_active,
+ QLineEdit *dst1, QLineEdit *dst2, QLineEdit *dst3,
+ list<t_display_url> &dest_list)
+{
+ t_display_url destination;
+
+ dest_list.clear();
+
+ if (!cf_active) {
+ dst1->clear();
+ dst2->clear();
+ dst3->clear();
+ return true;
+ }
+
+ // 1st choice destination
+ ui->expand_destination(current_user, dst1->text().stripWhiteSpace().ascii(), destination);
+ if (destination.is_valid()) {
+ dest_list.push_back(destination);
+ } else {
+ dst1->selectAll();
+ return false;
+ }
+
+ // 2nd choice destination
+ if (!dst2->text().isEmpty()) {
+ ui->expand_destination(current_user,
+ dst2->text().stripWhiteSpace().ascii(), destination);
+ if (destination.is_valid()) {
+ dest_list.push_back(destination);
+ } else {
+ dst2->selectAll();
+ return false;
+ }
+ }
+
+ // 3rd choice destination
+ if (!dst3->text().isEmpty()) {
+ ui->expand_destination(current_user,
+ dst3->text().stripWhiteSpace().ascii(), destination);
+ if (destination.is_valid()) {
+ dest_list.push_back(destination);
+ } else {
+ dst3->selectAll();
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void SrvRedirectForm::toggleAlways(bool on)
+{
+ if (on) {
+ cfAlwaysGroupBox->setEnabled(true);
+ } else {
+ cfAlwaysGroupBox->setEnabled(false);
+ }
+}
+
+void SrvRedirectForm::toggleBusy(bool on)
+{
+ if (on) {
+ cfBusyGroupBox->setEnabled(true);
+ } else {
+ cfBusyGroupBox->setEnabled(false);
+ }
+}
+
+void SrvRedirectForm::toggleNoanswer(bool on)
+{
+ if (on) {
+ cfNoanswerGroupBox->setEnabled(true);
+ } else {
+ cfNoanswerGroupBox->setEnabled(false);
+ }
+}
+
+void SrvRedirectForm::changedUser(const QString &user_profile)
+{
+ if (current_user_idx == -1) {
+ // Initializing combo box
+ return;
+ }
+
+ t_user *new_user = phone->ref_user_profile(user_profile.ascii());
+ if (!new_user) {
+ userComboBox->setCurrentItem(current_user_idx);
+ return;
+ }
+
+ if (!validateValues()) {
+ userComboBox->setCurrentItem(current_user_idx);
+ ((t_gui *)ui)->cb_show_msg(this,
+ tr("You have entered an invalid destination.").ascii(),
+ MSG_WARNING);
+ return;
+ }
+
+ // Change current user
+ current_user_idx = userComboBox->currentItem();
+ current_user = new_user;
+ populate();
+}
+
+void SrvRedirectForm::showAddressBook()
+{
+ if (!getAddressForm) {
+ getAddressForm = new GetAddressForm(
+ this, "select address", true);
+ MEMMAN_NEW(getAddressForm);
+ }
+
+ connect(getAddressForm,
+ SIGNAL(address(const QString &)),
+ this, SLOT(selectedAddress(const QString &)));
+
+ getAddressForm->show();
+}
+
+void SrvRedirectForm::showAddressBook1()
+{
+ nrAddressBook = 1;
+ showAddressBook();
+}
+
+void SrvRedirectForm::showAddressBook2()
+{
+ nrAddressBook = 2;
+ showAddressBook();
+}
+
+void SrvRedirectForm::showAddressBook3()
+{
+ nrAddressBook = 3;
+ showAddressBook();
+}
+
+void SrvRedirectForm::showAddressBook4()
+{
+ nrAddressBook = 4;
+ showAddressBook();
+}
+
+void SrvRedirectForm::showAddressBook5()
+{
+ nrAddressBook = 5;
+ showAddressBook();
+}
+
+void SrvRedirectForm::showAddressBook6()
+{
+ nrAddressBook = 6;
+ showAddressBook();
+}
+
+void SrvRedirectForm::showAddressBook7()
+{
+ nrAddressBook = 7;
+ showAddressBook();
+}
+
+void SrvRedirectForm::showAddressBook8()
+{
+ nrAddressBook = 8;
+ showAddressBook();
+}
+
+void SrvRedirectForm::showAddressBook9()
+{
+ nrAddressBook = 9;
+ showAddressBook();
+}
+
+void SrvRedirectForm::selectedAddress(const QString &address)
+{
+ switch(nrAddressBook) {
+ case 1:
+ cfAlwaysDst1LineEdit->setText(address);
+ break;
+ case 2:
+ cfAlwaysDst2LineEdit->setText(address);
+ break;
+ case 3:
+ cfAlwaysDst3LineEdit->setText(address);
+ break;
+ case 4:
+ cfBusyDst1LineEdit->setText(address);
+ break;
+ case 5:
+ cfBusyDst2LineEdit->setText(address);
+ break;
+ case 6:
+ cfBusyDst3LineEdit->setText(address);
+ break;
+ case 7:
+ cfNoanswerDst1LineEdit->setText(address);
+ break;
+ case 8:
+ cfNoanswerDst2LineEdit->setText(address);
+ break;
+ case 9:
+ cfNoanswerDst3LineEdit->setText(address);
+ break;
+ }
+}
diff --git a/src/gui/syssettingsform.ui b/src/gui/syssettingsform.ui
new file mode 100644
index 0000000..300bf89
--- /dev/null
+++ b/src/gui/syssettingsform.ui
@@ -0,0 +1,1854 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SysSettingsForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SysSettingsForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>765</width>
+ <height>624</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Twinkle - System Settings</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListBox" row="0" column="0">
+ <item>
+ <property name="text">
+ <string>General</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>twinkle32.png</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Audio</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>kmix.png</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Ring tones</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>knotify.png</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Address book</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>kontact_contacts32.png</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Network</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>network.png</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Log</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>log.png</pixmap>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>categoryListBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select a category for which you want to see or modify the settings.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout38</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer98</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>321</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string>Alt+O</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Accept and save your changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string>Alt+C</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Undo all your changes and close the window.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QWidgetStack" row="0" column="1">
+ <property name="name">
+ <cstring>settingsWidgetStack</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageAudio</cstring>
+ </property>
+ <attribute name="id">
+ <number>0</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>audioTitleTextLabel</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>Audio</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>soundcardGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Sound Card</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>ringtoneComboBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select the sound card for playing the ring tone for incoming calls.</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="4" column="1">
+ <property name="name">
+ <cstring>micComboBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select the sound card to which your microphone is connected.</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="2" column="1">
+ <property name="name">
+ <cstring>speakerComboBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select the sound card for the speaker function during a call.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>speakerTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Speaker:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>speakerComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>ringtoneTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Ring tone:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>ringtoneComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>otherRingtoneTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Other device:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>otherRingtoneLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>otherSpeakerTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Other device:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>otherSpeakerLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>otherMicTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Other device:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>otherMicLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>micTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Microphone:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>micComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>otherRingtoneLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="5" column="1">
+ <property name="name">
+ <cstring>otherMicLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>otherSpeakerLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="7" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>validateAudioCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Validate devices before usage</string>
+ </property>
+ <property name="accel">
+ <string>Alt+V</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+Twinkle validates the audio devices before usage to avoid an established call without an audio channel.
+&lt;p&gt;
+On startup of Twinkle a warning is given if an audio device is inaccessible.
+&lt;p&gt;
+If before making a call, the microphone or speaker appears to be invalid, a warning is given and no call can be made.
+&lt;p&gt;
+If before answering a call, the microphone or speaker appears to be invalid, a warning is given and the call will not be answered.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>advancedSoundGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Advanced</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout31</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>ossFragmnetTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>OSS &amp;fragment size:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>ossFragmentComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="1">
+ <item>
+ <property name="text">
+ <string>16</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>32</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>64</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>128</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>256</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>alsaPlayPeriodComboBox</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>alsaPlayPeriodTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>ALSA &amp;play period size:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>alsaPlayPeriodComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>alsaCapturePeriosTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;ALSA capture period size:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>alsaCapturePeriodComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <item>
+ <property name="text">
+ <string>16</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>32</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>64</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>128</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>256</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>ossFragmentComboBox</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="2" column="1">
+ <item>
+ <property name="text">
+ <string>16</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>32</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>64</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>128</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>256</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>alsaCapturePeriodComboBox</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer27</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>121</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer97</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageLog</cstring>
+ </property>
+ <attribute name="id">
+ <number>1</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>logTitleTextLabel</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>Log</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>logMaxSizeTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Max log size:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>logMaxSizeSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>logMaxSizeSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>100</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="lineStep">
+ <number>5</number>
+ </property>
+ <property name="value">
+ <number>5</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>logSizeMbTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>MB</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>211</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>logDebugCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Log &amp;debug reports</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Indicates if reports marked as "debug" will be logged.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>logSipCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Log &amp;SIP reports</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Indicates if SIP messages will be logged.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>logStunCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Log S&amp;TUN reports</string>
+ </property>
+ <property name="accel">
+ <string>Alt+T</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Indicates if STUN messages will be logged.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>logMemoryCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Log m&amp;emory reports</string>
+ </property>
+ <property name="accel">
+ <string>Alt+E</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Indicates if reports concerning memory management will be logged.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>61</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageGeneral</cstring>
+ </property>
+ <attribute name="id">
+ <number>2</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>generalTitleTextLabel</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>General</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>systrayGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>System tray</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>guiUseSystrayCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Create &amp;system tray icon on startup</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enable this option if you want a system tray icon for Twinkle. The system tray icon is created when you start Twinkle.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>guiHideCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Hide in system tray when closing main window</string>
+ </property>
+ <property name="accel">
+ <string>Alt+H</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Enable this option if you want Twinkle to hide in the system tray when you close the main window.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>startupGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Startup</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>startHiddenCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>S&amp;tartup hidden in system tray</string>
+ </property>
+ <property name="accel">
+ <string>Alt+T</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Next time you start Twinkle it will immediately hide in the system tray. This works best when you also select a default user profile.</string>
+ </property>
+ </widget>
+ <widget class="QListView" row="1" column="0" rowspan="1" colspan="2">
+ <column>
+ <property name="text">
+ <string>Default user profiles</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>profileListView</cstring>
+ </property>
+ <property name="selectionMode">
+ <enum>NoSelection</enum>
+ </property>
+ <property name="resizeMode">
+ <enum>LastColumn</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>srvGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Services</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>callWaitingCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Call &amp;waiting</string>
+ </property>
+ <property name="accel">
+ <string>Alt+W</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>hangupBothCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Hang up &amp;both lines when ending a 3-way conference call.</string>
+ </property>
+ <property name="accel">
+ <string>Alt+B</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout23</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>histSizeTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Maximum calls in call history:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>histSizeSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>histSizeSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>1000</number>
+ </property>
+ <property name="lineStep">
+ <number>10</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The maximum number of calls that will be kept in the call history.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer73</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>191</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout21</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>autoShowCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Auto show main window on incoming call after</string>
+ </property>
+ <property name="accel">
+ <string>Alt+A</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When the main window is hidden, it will be automatically shown on an incoming call after the number of specified seconds.</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>autoShowTimeoutSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>60</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Number of seconds after which the main window should be shown.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>secAutoShowTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>secs</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer14</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>29</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout34</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>browserTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>W&amp;eb browser command:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>browserLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>browserLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Command to start your web browser. If you leave this field empty Twinkle will try to figure out your default web browser.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageNetwork</cstring>
+ </property>
+ <attribute name="id">
+ <number>3</number>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>networkTitleTextLabel</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>Network</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <spacer row="5" column="3">
+ <property name="name">
+ <cstring>spacer9</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>230</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="2" column="2" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer8</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>314</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLineEdit" row="3" column="3">
+ <property name="name">
+ <cstring>maxUdpSizeLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Maximum allowed size (0-65535) in bytes of an incoming SIP message over UDP.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>sipUdpPortTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;SIP port:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>sipUdpPortSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>rtpPortTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;RTP port:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>rtpPortSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>maxTcpSizeTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Max. SIP message size (&amp;TCP):</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>maxTcpSizeLineEdit</cstring>
+ </property>
+ </widget>
+ <spacer row="1" column="2" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer7_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>314</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QSpinBox" row="1" column="1">
+ <property name="name">
+ <cstring>sipUdpPortSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ <property name="minValue">
+ <number>1025</number>
+ </property>
+ <property name="value">
+ <number>5060</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The UDP/TCP port used for sending and receiving SIP messages.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>maxUdpSizeTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Max. SIP message size (&amp;UDP):</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>maxUdpSizeLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="4" column="3">
+ <property name="name">
+ <cstring>maxTcpSizeLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Maximum allowed size (0-4294967295) in bytes of an incoming SIP message over TCP.</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="2" column="1">
+ <property name="name">
+ <cstring>rtpPortSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ <property name="minValue">
+ <number>1025</number>
+ </property>
+ <property name="lineStep">
+ <number>2</number>
+ </property>
+ <property name="value">
+ <number>8000</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageRingtones</cstring>
+ </property>
+ <attribute name="id">
+ <number>4</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>ringtonesTitleTextLabel</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>Ring tones</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>ringtoneButtonGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Ring tone</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>playRingtoneCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Play ring tone on incoming call</string>
+ </property>
+ <property name="accel">
+ <string>Alt+P</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Indicates if a ring tone should be played when a call comes in.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>defaultRingtoneRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Default ring tone</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Play the default ring tone when a call comes in.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>customRingtoneRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>C&amp;ustom ring tone</string>
+ </property>
+ <property name="accel">
+ <string>Alt+U</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Play a custom ring tone when a call comes in.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout16</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer21</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>ringtoneLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Specify the file name of a .wav file that you want to be played as ring tone.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>openRingtoneToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>fileopen.png</iconset>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select ring tone file.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>ringbackButtonGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Ring back tone</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>playRingbackCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>P&amp;lay ring back tone when network does not play ring back tone</string>
+ </property>
+ <property name="accel">
+ <string>Alt+L</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+Play ring back tone while you are waiting for the far-end to answer your call.
+&lt;/p&gt;
+&lt;p&gt;
+Depending on your SIP provider the network might provide ring back tone or an announcement.
+&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>defaultRingbackRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>D&amp;efault ring back tone</string>
+ </property>
+ <property name="accel">
+ <string>Alt+E</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Play the default ring back tone.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>customRingbackRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>Cu&amp;stom ring back tone</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Play a custom ring back tone.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout16_2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer21_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>ringbackLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Specify the file name of a .wav file that you want to be played as ring back tone.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>openRingbackToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>fileopen.png</iconset>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select ring back tone file.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer23</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageAddressBook</cstring>
+ </property>
+ <attribute name="id">
+ <number>5</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>ringtonesTitleTextLabel_2</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>Address book</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>abLookupNameCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Lookup name for incoming call</string>
+ </property>
+ <property name="accel">
+ <string>Alt+L</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>abOverrideDisplayCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Ove&amp;rride received display name</string>
+ </property>
+ <property name="accel">
+ <string>Alt+R</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>abLookupPhotoCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Lookup &amp;photo for incoming call</string>
+ </property>
+ <property name="accel">
+ <string>Alt+P</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Lookup the photo of a caller in your address book and display it on an incoming call.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer61</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>121</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SysSettingsForm</receiver>
+ <slot>validate()</slot>
+ </connection>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SysSettingsForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>categoryListBox</sender>
+ <signal>highlighted(int)</signal>
+ <receiver>SysSettingsForm</receiver>
+ <slot>showCategory(int)</slot>
+ </connection>
+ <connection>
+ <sender>guiUseSystrayCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>guiHideCheckBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>guiUseSystrayCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>guiHideCheckBox</receiver>
+ <slot>setChecked(bool)</slot>
+ </connection>
+ <connection>
+ <sender>guiUseSystrayCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>startHiddenCheckBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>playRingtoneCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>customRingtoneRadioButton</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>playRingtoneCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>defaultRingtoneRadioButton</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>playRingtoneCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>SysSettingsForm</receiver>
+ <slot>playRingToneCheckBoxToggles(bool)</slot>
+ </connection>
+ <connection>
+ <sender>playRingtoneCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>openRingtoneToolButton</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>playRingbackCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>customRingbackRadioButton</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>playRingbackCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>defaultRingbackRadioButton</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>playRingbackCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>SysSettingsForm</receiver>
+ <slot>playRingBackToneCheckBoxToggles(bool)</slot>
+ </connection>
+ <connection>
+ <sender>playRingbackCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>openRingbackToolButton</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>openRingtoneToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SysSettingsForm</receiver>
+ <slot>chooseRingtone()</slot>
+ </connection>
+ <connection>
+ <sender>openRingbackToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>SysSettingsForm</receiver>
+ <slot>chooseRingback()</slot>
+ </connection>
+ <connection>
+ <sender>customRingtoneRadioButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>ringtoneLineEdit</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>customRingtoneRadioButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>openRingtoneToolButton</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>customRingbackRadioButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>ringbackLineEdit</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>customRingbackRadioButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>openRingbackToolButton</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>abLookupNameCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>abOverrideDisplayCheckBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>ringtoneComboBox</sender>
+ <signal>activated(int)</signal>
+ <receiver>SysSettingsForm</receiver>
+ <slot>devRingtoneSelected(int)</slot>
+ </connection>
+ <connection>
+ <sender>speakerComboBox</sender>
+ <signal>activated(int)</signal>
+ <receiver>SysSettingsForm</receiver>
+ <slot>devSpeakerSelected(int)</slot>
+ </connection>
+ <connection>
+ <sender>micComboBox</sender>
+ <signal>activated(int)</signal>
+ <receiver>SysSettingsForm</receiver>
+ <slot>devMicSelected(int)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>categoryListBox</tabstop>
+ <tabstop>guiUseSystrayCheckBox</tabstop>
+ <tabstop>guiHideCheckBox</tabstop>
+ <tabstop>startHiddenCheckBox</tabstop>
+ <tabstop>profileListView</tabstop>
+ <tabstop>callWaitingCheckBox</tabstop>
+ <tabstop>hangupBothCheckBox</tabstop>
+ <tabstop>histSizeSpinBox</tabstop>
+ <tabstop>autoShowCheckBox</tabstop>
+ <tabstop>autoShowTimeoutSpinBox</tabstop>
+ <tabstop>ringtoneComboBox</tabstop>
+ <tabstop>otherRingtoneLineEdit</tabstop>
+ <tabstop>speakerComboBox</tabstop>
+ <tabstop>otherSpeakerLineEdit</tabstop>
+ <tabstop>micComboBox</tabstop>
+ <tabstop>otherMicLineEdit</tabstop>
+ <tabstop>validateAudioCheckBox</tabstop>
+ <tabstop>ossFragmentComboBox</tabstop>
+ <tabstop>alsaPlayPeriodComboBox</tabstop>
+ <tabstop>alsaCapturePeriodComboBox</tabstop>
+ <tabstop>playRingtoneCheckBox</tabstop>
+ <tabstop>defaultRingtoneRadioButton</tabstop>
+ <tabstop>ringtoneLineEdit</tabstop>
+ <tabstop>openRingtoneToolButton</tabstop>
+ <tabstop>playRingbackCheckBox</tabstop>
+ <tabstop>defaultRingbackRadioButton</tabstop>
+ <tabstop>ringbackLineEdit</tabstop>
+ <tabstop>openRingbackToolButton</tabstop>
+ <tabstop>abLookupNameCheckBox</tabstop>
+ <tabstop>abOverrideDisplayCheckBox</tabstop>
+ <tabstop>abLookupPhotoCheckBox</tabstop>
+ <tabstop>sipUdpPortSpinBox</tabstop>
+ <tabstop>rtpPortSpinBox</tabstop>
+ <tabstop>maxUdpSizeLineEdit</tabstop>
+ <tabstop>maxTcpSizeLineEdit</tabstop>
+ <tabstop>logMaxSizeSpinBox</tabstop>
+ <tabstop>logDebugCheckBox</tabstop>
+ <tabstop>logSipCheckBox</tabstop>
+ <tabstop>logStunCheckBox</tabstop>
+ <tabstop>logMemoryCheckBox</tabstop>
+ <tabstop>okPushButton</tabstop>
+ <tabstop>cancelPushButton</tabstop>
+ <tabstop>customRingtoneRadioButton</tabstop>
+ <tabstop>customRingbackRadioButton</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in declaration">sys_settings.h</include>
+ <include location="local" impldecl="in implementation">qlistbox.h</include>
+ <include location="local" impldecl="in implementation">qcombobox.h</include>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">sockets/interfaces.h</include>
+ <include location="local" impldecl="in implementation">selectprofileform.h</include>
+ <include location="local" impldecl="in implementation">qstringlist.h</include>
+ <include location="local" impldecl="in implementation">audits/memman.h</include>
+ <include location="local" impldecl="in implementation">qlistview.h</include>
+ <include location="local" impldecl="in implementation">qspinbox.h</include>
+ <include location="local" impldecl="in implementation">qfiledialog.h</include>
+ <include location="local" impldecl="in implementation">qfileinfo.h</include>
+ <include location="local" impldecl="in implementation">twinkle_config.h</include>
+ <include location="local" impldecl="in implementation">qregexp.h</include>
+ <include location="local" impldecl="in implementation">qvalidator.h</include>
+ <include location="local" impldecl="in implementation">syssettingsform.ui.h</include>
+</includes>
+<variables>
+ <variable access="private">int idxOtherCaptureDevOss;</variable>
+ <variable access="private">int idxOtherCaptureDevAlsa;</variable>
+ <variable access="private">int idxOtherPlaybackDevOss;</variable>
+ <variable access="private">int idxOtherPlaybackDevAlsa;</variable>
+ <variable access="private">list&lt;t_audio_device&gt; list_audio_playback_dev;</variable>
+ <variable access="private">list&lt;t_audio_device&gt; list_audio_capture_dev;</variable>
+</variables>
+<signals>
+ <signal>sipUdpPortChanged()</signal>
+ <signal>rtpPortChanged()</signal>
+</signals>
+<slots>
+ <slot>showCategory( int index )</slot>
+ <slot>populateComboBox( QComboBox * cb, const QString &amp; s )</slot>
+ <slot>populate()</slot>
+ <slot>validate()</slot>
+ <slot>show()</slot>
+ <slot returnType="int">exec()</slot>
+ <slot>chooseRingtone()</slot>
+ <slot>chooseRingback()</slot>
+ <slot>devRingtoneSelected( int idx )</slot>
+ <slot>devSpeakerSelected( int idx )</slot>
+ <slot>devMicSelected( int idx )</slot>
+ <slot>playRingToneCheckBoxToggles( bool on )</slot>
+ <slot>playRingBackToneCheckBoxToggles( bool on )</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function returnType="string">comboItem2audio_dev( QString item, QLineEdit * qleOther, bool playback )</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/syssettingsform.ui.h b/src/gui/syssettingsform.ui.h
new file mode 100644
index 0000000..1e9afda
--- /dev/null
+++ b/src/gui/syssettingsform.ui.h
@@ -0,0 +1,489 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you want to add, delete, or rename functions or slots, use
+** Qt Designer to update this file, preserving your code.
+**
+** You should not define a constructor or destructor in this file.
+** Instead, write your code in functions called init() and destroy().
+** These will automatically be called by the form's constructor and
+** destructor.
+*****************************************************************************/
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+// Indices of categories in the category list box
+#define idxCatGeneral 0
+#define idxCatAudio 1
+#define idxCatRingtones 2
+#define idxCatAddressBook 3
+#define idxCatNetwork 4
+#define idxCatLog 5
+
+void SysSettingsForm::init()
+{
+ // Set toolbutton icons for disabled options.
+ QIconSet i;
+ i = openRingtoneToolButton->iconSet();
+ i.setPixmap(QPixmap::fromMimeSource("fileopen-disabled.png"),
+ QIconSet::Automatic, QIconSet::Disabled);
+ openRingtoneToolButton->setIconSet(i);
+ i = openRingbackToolButton->iconSet();
+ i.setPixmap(QPixmap::fromMimeSource("fileopen-disabled.png"),
+ QIconSet::Automatic, QIconSet::Disabled);
+ openRingbackToolButton->setIconSet(i);
+
+ QRegExp rxNumber("[0-9]+");
+ maxUdpSizeLineEdit->setValidator(new QRegExpValidator(rxNumber, this));
+ maxTcpSizeLineEdit->setValidator(new QRegExpValidator(rxNumber, this));
+}
+
+void SysSettingsForm::showCategory( int index )
+{
+ if (index == idxCatGeneral) {
+ settingsWidgetStack->raiseWidget(pageGeneral);
+ } else if (index == idxCatAudio) {
+ settingsWidgetStack->raiseWidget(pageAudio);
+ } else if (index == idxCatRingtones) {
+ settingsWidgetStack->raiseWidget(pageRingtones);
+ } else if (index == idxCatAddressBook) {
+ settingsWidgetStack->raiseWidget(pageAddressBook);
+ } else if (index == idxCatNetwork) {
+ settingsWidgetStack->raiseWidget(pageNetwork);
+ } else if (index == idxCatLog) {
+ settingsWidgetStack->raiseWidget(pageLog);
+ }
+}
+
+string SysSettingsForm::comboItem2audio_dev(QString item, QLineEdit *qleOther, bool playback)
+{
+ if (item == QString("ALSA: ") + DEV_OTHER) {
+ if (qleOther->text().isEmpty()) return "";
+ return (QString(PFX_ALSA) + qleOther->text()).ascii();
+ }
+
+ if (item == QString("OSS: ") + DEV_OTHER) {
+ if (qleOther->text().isEmpty()) return "";
+ return (QString(PFX_OSS) + qleOther->text()).ascii();
+ }
+
+ list<t_audio_device> &list_audio_dev = (playback ?
+ list_audio_playback_dev : list_audio_capture_dev);
+
+ for (list<t_audio_device>::iterator i = list_audio_dev.begin();
+ i != list_audio_dev.end(); i++)
+ {
+ if (i->get_description() == item.ascii()) {
+ return i->get_settings_value();
+ }
+ }
+
+ return "";
+}
+
+void SysSettingsForm::populateComboBox(QComboBox *cb, const QString &s)
+{
+ for (int i = 0; i < cb->count(); i++) {
+ if (cb->text(i) == s) {
+ cb->setCurrentItem(i);
+ return;
+ }
+ }
+}
+
+void SysSettingsForm::populate()
+{
+ QString msg;
+ int idx;
+
+ // Select the Audio category
+ categoryListBox->setSelected(idxCatGeneral, true);
+ settingsWidgetStack->raiseWidget(pageGeneral);
+
+ // Set focus on first field
+ categoryListBox->setFocus();
+
+ // Audio settings
+ list_audio_playback_dev = sys_config->get_audio_devices(true);
+ list_audio_capture_dev = sys_config->get_audio_devices(false);
+ ringtoneComboBox->clear();
+ speakerComboBox->clear();
+ micComboBox->clear();
+ bool devRingtoneFound = false;
+ bool devSpeakerFound = false;
+ bool devMicFound = false;
+
+ // Playback devices
+ idx = 0;
+ for (list<t_audio_device>::iterator i = list_audio_playback_dev.begin();
+ i != list_audio_playback_dev.end(); i++, idx++) {
+ string item = i->get_description();
+ ringtoneComboBox->insertItem(QString(item.c_str()));
+ speakerComboBox->insertItem(QString(item.c_str()));
+
+ // Select audio device
+ if (sys_config->get_dev_ringtone().device == i->device) {
+ ringtoneComboBox->setCurrentItem(idx);
+ otherRingtoneLineEdit->clear();
+ devRingtoneFound = true;
+ }
+ if (sys_config->get_dev_speaker().device == i->device) {
+ speakerComboBox->setCurrentItem(idx);
+ otherSpeakerLineEdit->clear();
+ devSpeakerFound = true;
+ }
+
+ // Determine index for other non-standard device
+ if (i->device == DEV_OTHER) {
+ if (i->type == t_audio_device::ALSA) {
+ idxOtherPlaybackDevAlsa = idx;
+ } else {
+ idxOtherPlaybackDevOss = idx;
+ }
+ }
+ }
+
+ // Check for non-standard audio devices
+ if (!devRingtoneFound) {
+ t_audio_device dev = sys_config->get_dev_ringtone();
+ otherRingtoneLineEdit->setText(dev.device.c_str());
+ ringtoneComboBox->setCurrentItem(
+ (dev.type == t_audio_device::ALSA ? idxOtherPlaybackDevAlsa : idxOtherPlaybackDevOss));
+ }
+ if (!devSpeakerFound) {
+ t_audio_device dev = sys_config->get_dev_speaker();
+ otherSpeakerLineEdit->setText(dev.device.c_str());
+ speakerComboBox->setCurrentItem(
+ (dev.type == t_audio_device::ALSA ? idxOtherPlaybackDevAlsa : idxOtherPlaybackDevOss));
+ }
+
+ // Capture device
+ idx = 0;
+ for (list<t_audio_device>::iterator i = list_audio_capture_dev.begin();
+ i != list_audio_capture_dev.end(); i++, idx++) {
+ string item = i->get_description();
+ micComboBox->insertItem(QString(item.c_str()));
+
+ // Select audio device
+ if (sys_config->get_dev_mic().device == i->device) {
+ micComboBox->setCurrentItem(idx);
+ otherMicLineEdit->clear();
+ devMicFound = true;
+ }
+
+ // Determine index for other non-standard device
+ if (i->device == DEV_OTHER) {
+ if (i->type == t_audio_device::ALSA) {
+ idxOtherCaptureDevAlsa = idx;
+ } else {
+ idxOtherCaptureDevOss = idx;
+ }
+ }
+ }
+
+ // Check for non-standard audio devices
+ if (!devMicFound) {
+ t_audio_device dev = sys_config->get_dev_mic();
+ otherMicLineEdit->setText(dev.device.c_str());
+ micComboBox->setCurrentItem(
+ (dev.type == t_audio_device::ALSA ? idxOtherCaptureDevAlsa : idxOtherCaptureDevOss));
+ }
+
+ // Enable/disable line edit for non-standard device
+ devRingtoneSelected(ringtoneComboBox->currentItem());
+ devSpeakerSelected(speakerComboBox->currentItem());
+ devMicSelected(micComboBox->currentItem());
+
+ validateAudioCheckBox->setChecked(sys_config->get_validate_audio_dev());
+
+ populateComboBox(ossFragmentComboBox,
+ QString::number(sys_config->get_oss_fragment_size()));
+ populateComboBox(alsaPlayPeriodComboBox,
+ QString::number(sys_config->get_alsa_play_period_size()));
+ populateComboBox(alsaCapturePeriodComboBox,
+ QString::number(sys_config->get_alsa_capture_period_size()));
+
+ // Log settings
+ logMaxSizeSpinBox->setValue(sys_config->get_log_max_size());
+ logDebugCheckBox->setChecked(sys_config->get_log_show_debug());
+ logSipCheckBox->setChecked(sys_config->get_log_show_sip());
+ logStunCheckBox->setChecked(sys_config->get_log_show_stun());
+ logMemoryCheckBox->setChecked(sys_config->get_log_show_memory());
+
+ // General settings
+ 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());
+
+ // Call history
+ histSizeSpinBox->setValue(sys_config->get_ch_max_size());
+
+ // Auto show on incoming call
+ autoShowCheckBox->setChecked(sys_config->get_gui_auto_show_incoming());
+ autoShowTimeoutSpinBox->setValue(sys_config->get_gui_auto_show_timeout());
+
+ // Services
+ callWaitingCheckBox->setChecked(sys_config->get_call_waiting());
+ hangupBothCheckBox->setChecked(sys_config->get_hangup_both_3way());
+
+ // Startup settings
+ startHiddenCheckBox->setChecked(sys_config->get_start_hidden());
+
+ QStringList profiles;
+ if (!SelectProfileForm::getUserProfiles(profiles, msg)) {
+ ((t_gui *)ui)->cb_show_msg(this, msg.ascii(), MSG_CRITICAL);
+ }
+ profileListView->clear();
+ for (QStringList::Iterator i = profiles.begin(); i != profiles.end(); i++) {
+ // Strip off the .cfg suffix
+ QString profile = *i;
+ profile.truncate(profile.length() - 4);
+ QCheckListItem *item = new QCheckListItem(profileListView,
+ profile, QCheckListItem::CheckBox);
+ item->setPixmap(0, QPixmap::fromMimeSource("penguin-small.png"));
+
+ list<string> l = sys_config->get_start_user_profiles();
+ if (std::find(l.begin(), l.end(), profile.ascii()) != l.end())
+ {
+ item->setOn(true);
+ }
+ }
+
+ // Web browser command
+ browserLineEdit->setText(sys_config->get_gui_browser_cmd().c_str());
+
+ // Network settings
+ sipUdpPortSpinBox->setValue(sys_config->get_config_sip_port());
+ rtpPortSpinBox->setValue(sys_config->get_rtp_port());
+
+ maxUdpSizeLineEdit->setText(QString::number(sys_config->get_sip_max_udp_size()));
+ maxTcpSizeLineEdit->setText(QString::number(sys_config->get_sip_max_tcp_size()));
+
+ // Ring tone settings
+ playRingtoneCheckBox->setChecked(sys_config->get_play_ringtone());
+ defaultRingtoneRadioButton->setChecked(sys_config->get_ringtone_file().empty());
+ customRingtoneRadioButton->setChecked(!sys_config->get_ringtone_file().empty());
+ ringtoneLineEdit->setText(sys_config->get_ringtone_file().c_str());
+ defaultRingtoneRadioButton->setEnabled(sys_config->get_play_ringtone());
+ customRingtoneRadioButton->setEnabled(sys_config->get_play_ringtone());
+ ringtoneLineEdit->setEnabled(!sys_config->get_ringtone_file().empty());
+ openRingtoneToolButton->setEnabled(!sys_config->get_ringtone_file().empty());
+
+ playRingbackCheckBox->setChecked(sys_config->get_play_ringback());
+ defaultRingbackRadioButton->setChecked(sys_config->get_ringback_file().empty());
+ customRingbackRadioButton->setChecked(!sys_config->get_ringback_file().empty());
+ ringbackLineEdit->setText(sys_config->get_ringback_file().c_str());
+ defaultRingbackRadioButton->setEnabled(sys_config->get_play_ringback());
+ customRingbackRadioButton->setEnabled(sys_config->get_play_ringback());
+ ringbackLineEdit->setEnabled(!sys_config->get_ringback_file().empty());
+ openRingbackToolButton->setEnabled(!sys_config->get_ringback_file().empty());
+
+ // Address book settings
+ abLookupNameCheckBox->setChecked(sys_config->get_ab_lookup_name());
+ abOverrideDisplayCheckBox->setChecked(sys_config->get_ab_override_display());
+ abOverrideDisplayCheckBox->setEnabled(sys_config->get_ab_lookup_name());
+ abLookupPhotoCheckBox->setChecked(sys_config->get_ab_lookup_photo());
+}
+
+void SysSettingsForm::validate()
+{
+ bool conversion_ok = false;
+ unsigned short sip_max_udp_size = maxUdpSizeLineEdit->text().toUShort(&conversion_ok);
+ if (!conversion_ok) sip_max_udp_size = sys_config->get_sip_max_udp_size();
+
+ unsigned long sip_max_tcp_size = maxTcpSizeLineEdit->text().toULong(&conversion_ok);
+ if (!conversion_ok) sip_max_tcp_size = sys_config->get_sip_max_tcp_size();
+
+ // Audio
+ string dev;
+ dev = comboItem2audio_dev(ringtoneComboBox->currentText(), otherRingtoneLineEdit, true);
+ if (dev != "") sys_config->set_dev_ringtone(sys_config->audio_device(dev));
+ dev = comboItem2audio_dev(speakerComboBox->currentText(), otherSpeakerLineEdit, true);
+ if (dev != "") sys_config->set_dev_speaker(sys_config->audio_device(dev));
+ dev = comboItem2audio_dev(micComboBox->currentText(), otherMicLineEdit, false);
+ if (dev != "") sys_config->set_dev_mic(sys_config->audio_device(dev));
+
+ sys_config->set_validate_audio_dev(validateAudioCheckBox->isChecked());
+
+ sys_config->set_oss_fragment_size(
+ ossFragmentComboBox->currentText().toInt());
+ sys_config->set_alsa_play_period_size(
+ alsaPlayPeriodComboBox->currentText().toInt());
+ sys_config->set_alsa_capture_period_size(
+ alsaCapturePeriodComboBox->currentText().toInt());
+
+ // Log
+ sys_config->set_log_max_size(logMaxSizeSpinBox->value());
+ sys_config->set_log_show_debug(logDebugCheckBox->isChecked());
+ sys_config->set_log_show_sip(logSipCheckBox->isChecked());
+ sys_config->set_log_show_stun(logStunCheckBox->isChecked());
+ sys_config->set_log_show_memory(logMemoryCheckBox->isChecked());
+
+ // General
+ sys_config->set_gui_use_systray(guiUseSystrayCheckBox->isChecked());
+ sys_config->set_gui_hide_on_close(guiHideCheckBox->isChecked());
+
+ // Auto show on incoming call
+ sys_config->set_gui_auto_show_incoming(autoShowCheckBox->isChecked());
+ sys_config->set_gui_auto_show_timeout(autoShowTimeoutSpinBox->value());
+
+ // Call history
+ sys_config->set_ch_max_size(histSizeSpinBox->value());
+
+ // Services
+ sys_config->set_call_waiting(callWaitingCheckBox->isChecked());
+ sys_config->set_hangup_both_3way(hangupBothCheckBox->isChecked());
+
+ // Startup
+ sys_config->set_start_hidden(startHiddenCheckBox->isChecked() &&
+ guiUseSystrayCheckBox->isChecked());
+
+ list<string> start_user_profiles;
+ QListViewItemIterator i(profileListView, QListViewItemIterator::Checked);
+ while (i.current()) {
+ QCheckListItem *item = (QCheckListItem *)i.current();
+ start_user_profiles.push_back(item->text().ascii());
+ i++;
+ }
+ sys_config->set_start_user_profiles(start_user_profiles);
+
+ // Web browser command
+ sys_config->set_gui_browser_cmd(browserLineEdit->text().stripWhiteSpace().ascii());
+
+ // Network
+ if (sys_config->get_config_sip_port() != sipUdpPortSpinBox->value()) {
+ sys_config->set_config_sip_port(sipUdpPortSpinBox->value());
+ emit sipUdpPortChanged();
+ }
+ if (sys_config->get_rtp_port() != rtpPortSpinBox->value()) {
+ sys_config->set_rtp_port(rtpPortSpinBox->value());
+ emit rtpPortChanged();
+ }
+ sys_config->set_sip_max_udp_size(sip_max_udp_size);
+ sys_config->set_sip_max_tcp_size(sip_max_tcp_size);
+
+ // Ring tones
+ sys_config->set_play_ringtone(playRingtoneCheckBox->isChecked());
+ if (sys_config->get_play_ringtone()) {
+ if (defaultRingtoneRadioButton->isOn()) {
+ sys_config->set_ringtone_file("");
+ } else {
+ sys_config->set_ringtone_file(ringtoneLineEdit->
+ text().stripWhiteSpace().ascii());
+ }
+ } else {
+ sys_config->set_ringtone_file("");
+ }
+
+ sys_config->set_play_ringback(playRingbackCheckBox->isChecked());
+ if (sys_config->get_play_ringback()) {
+ if (defaultRingbackRadioButton->isOn()) {
+ sys_config->set_ringback_file("");
+ } else {
+ sys_config->set_ringback_file(ringbackLineEdit->
+ text().stripWhiteSpace().ascii());
+ }
+ } else {
+ sys_config->set_ringback_file("");
+ }
+
+ // Address book settings
+ sys_config->set_ab_lookup_name(abLookupNameCheckBox->isChecked());
+ sys_config->set_ab_override_display(abOverrideDisplayCheckBox->isChecked());
+ sys_config->set_ab_lookup_photo(abLookupPhotoCheckBox->isChecked());
+
+ // Save user config
+ string error_msg;
+ if (!sys_config->write_config(error_msg)) {
+ // Failed to write config file
+ ((t_gui *)ui)->cb_show_msg(this, error_msg, MSG_CRITICAL);
+ return;
+ }
+
+ accept();
+}
+
+void SysSettingsForm::show()
+{
+ populate();
+ QDialog::show();
+}
+
+int SysSettingsForm::exec()
+{
+ populate();
+ return QDialog::exec();
+}
+
+void SysSettingsForm::chooseRingtone()
+{
+ QString file = QFileDialog::getOpenFileName(
+ ((t_gui *)ui)->get_last_file_browse_path(),
+ tr("Ring tones", "Description of .wav files in file dialog").append(" (*.wav)"), this, "ring tone file dialog",
+ tr("Choose ring tone"));
+ if (!file.isEmpty()) {
+ ringtoneLineEdit->setText(file);
+ ((t_gui *)ui)->set_last_file_browse_path(QFileInfo(file).dirPath(true));
+ }
+}
+
+void SysSettingsForm::chooseRingback()
+{
+ QString file = QFileDialog::getOpenFileName(
+ ((t_gui *)ui)->get_last_file_browse_path(),
+ tr("Ring back tones", "Description of .wav files in file dialog").append(" (*.wav)"), this, "ring back file dialog",
+ tr("Choose ring back tone"));
+ if (!file.isEmpty()) {
+ ringbackLineEdit->setText(file);
+ ((t_gui *)ui)->set_last_file_browse_path(QFileInfo(file).dirPath(true));
+ }
+}
+
+void SysSettingsForm::devRingtoneSelected(int idx) {
+ bool b = (idx == idxOtherPlaybackDevAlsa || idx == idxOtherPlaybackDevOss);
+ otherRingtoneTextLabel->setEnabled(b);
+ otherRingtoneLineEdit->setEnabled(b);
+}
+
+void SysSettingsForm::devSpeakerSelected(int idx) {
+ bool b = (idx == idxOtherPlaybackDevAlsa || idx == idxOtherPlaybackDevOss);
+ otherSpeakerTextLabel->setEnabled(b);
+ otherSpeakerLineEdit->setEnabled(b);
+}
+
+void SysSettingsForm::devMicSelected(int idx) {
+ bool b = (idx == idxOtherCaptureDevAlsa || idx == idxOtherCaptureDevOss);
+ otherMicTextLabel->setEnabled(b);
+ otherMicLineEdit->setEnabled(b);
+}
+
+void SysSettingsForm::playRingToneCheckBoxToggles(bool on) {
+ if (on) {
+ ringtoneLineEdit->setEnabled(customRingtoneRadioButton->isChecked());
+ } else {
+ ringtoneLineEdit->setEnabled(false);
+ }
+}
+
+void SysSettingsForm::playRingBackToneCheckBoxToggles(bool on) {
+ if (on) {
+ ringbackLineEdit->setEnabled(customRingbackRadioButton->isChecked());
+ } else {
+ ringbackLineEdit->setEnabled(false);
+ }
+}
diff --git a/src/gui/termcapform.ui b/src/gui/termcapform.ui
new file mode 100644
index 0000000..08f72d0
--- /dev/null
+++ b/src/gui/termcapform.ui
@@ -0,0 +1,241 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>TermCapForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>TermCapForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>581</width>
+ <height>168</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Terminal Capabilities</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout53</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>fromTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;From:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>fromComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>fromComboBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>termCapGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Get terminal capabilities of</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>partyTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;To:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>partyLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>partyLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The address that you want to query for capabilities (OPTION request). This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>addressToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>F10</string>
+ </property>
+ <property name="iconSet">
+ <iconset>kontact_contacts.png</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Address book</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select an address from the address book.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer13</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout15</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer12</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>131</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>TermCapForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>TermCapForm</receiver>
+ <slot>validate()</slot>
+ </connection>
+ <connection>
+ <sender>addressToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>TermCapForm</receiver>
+ <slot>showAddressBook()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>partyLineEdit</tabstop>
+ <tabstop>addressToolButton</tabstop>
+ <tabstop>okPushButton</tabstop>
+ <tabstop>cancelPushButton</tabstop>
+ <tabstop>fromComboBox</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">audits/memman.h</include>
+ <include location="local" impldecl="in declaration">sockets/url.h</include>
+ <include location="local" impldecl="in declaration">getaddressform.h</include>
+ <include location="local" impldecl="in declaration">user.h</include>
+ <include location="local" impldecl="in declaration">phone.h</include>
+ <include location="local" impldecl="in implementation">termcapform.ui.h</include>
+</includes>
+<forwards>
+ <forward>extern t_phone *phone;</forward>
+</forwards>
+<variables>
+ <variable access="private">GetAddressForm *getAddressForm;</variable>
+</variables>
+<signals>
+ <signal>destination(t_user *, const t_url &amp;)</signal>
+</signals>
+<slots>
+ <slot>show( t_user * user_config, const QString &amp; dest )</slot>
+ <slot>validate()</slot>
+ <slot>showAddressBook()</slot>
+ <slot>selectedAddress( const QString &amp; address )</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function access="private" specifier="non virtual">destroy()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/termcapform.ui.h b/src/gui/termcapform.ui.h
new file mode 100644
index 0000000..e04af11
--- /dev/null
+++ b/src/gui/termcapform.ui.h
@@ -0,0 +1,101 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+
+void TermCapForm::init()
+{
+ getAddressForm = 0;
+
+ // Set toolbutton icons for disabled options.
+ setDisabledIcon(addressToolButton, "kontact_contacts-disabled.png");
+}
+
+void TermCapForm::show(t_user *user_config, const QString &dest)
+{
+ ((t_gui *)ui)->fill_user_combo(fromComboBox);
+
+ // Select from user
+ if (user_config) {
+ for (int i = 0; i < fromComboBox->count(); i++) {
+ if (fromComboBox->text(i) ==
+ user_config->get_profile_name().c_str())
+ {
+ fromComboBox->setCurrentItem(i);
+ break;
+ }
+ }
+ }
+
+ partyLineEdit->setText(dest);
+ QDialog::show();
+}
+
+void TermCapForm::destroy()
+{
+ if (getAddressForm) {
+ MEMMAN_DELETE(getAddressForm);
+ delete getAddressForm;
+ }
+}
+
+void TermCapForm::validate()
+{
+ string display, dest_str;
+ t_user *from_user = phone->ref_user_profile(
+ fromComboBox->currentText().ascii());
+
+ ui->expand_destination(from_user,
+ partyLineEdit->text().stripWhiteSpace().ascii(),
+ display, dest_str);
+ t_url dest(dest_str);
+
+ if (dest.is_valid()) {
+ emit destination(from_user, dest);
+ accept();
+ } else {
+ partyLineEdit->selectAll();
+ }
+}
+
+void TermCapForm::showAddressBook()
+{
+ if (!getAddressForm) {
+ getAddressForm = new GetAddressForm(
+ this, "select address", true);
+ MEMMAN_NEW(getAddressForm);
+ }
+
+ connect(getAddressForm,
+ SIGNAL(address(const QString &)),
+ this, SLOT(selectedAddress(const QString &)));
+
+ getAddressForm->show();
+}
+
+void TermCapForm::selectedAddress(const QString &address)
+{
+ partyLineEdit->setText(address);
+}
diff --git a/src/gui/textbrowsernoautolink.h b/src/gui/textbrowsernoautolink.h
new file mode 100644
index 0000000..8b45c4d
--- /dev/null
+++ b/src/gui/textbrowsernoautolink.h
@@ -0,0 +1,48 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you want to add, delete, or rename functions or slots, use
+** Qt Designer to update this file, preserving your code.
+**
+** You should not define a constructor or destructor in this file.
+** Instead, write your code in functions called init() and destroy().
+** These will automatically be called by the form's constructor and
+** destructor.
+*****************************************************************************/
+
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef _TEXTBROWSERNOAUTOLINK_H
+#define _TEXTBROWSERNOAUTOLINK_H
+
+#include <qtextbrowser.h>
+
+/**
+ * A text browser similar to QTextBrowser, but when a user clicks a link
+ * the browser will not automatically load the linked document.
+ */
+class TextBrowserNoAutoLink : public QTextBrowser {
+ Q_OBJECT
+public:
+ TextBrowserNoAutoLink ( QWidget * parent = 0, const char * name = 0 ) :
+ QTextBrowser(parent, name) {};
+ virtual void setSource ( const QString & name ) {};
+};
+
+#endif
diff --git a/src/gui/transferform.ui b/src/gui/transferform.ui
new file mode 100644
index 0000000..dc6b14e
--- /dev/null
+++ b/src/gui/transferform.ui
@@ -0,0 +1,270 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>TransferForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>TransferForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>532</width>
+ <height>251</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Transfer</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>transferGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Transfer call to</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>toLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;To:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>toLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>toLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The address of the person you want to transfer the call to. This can be a full SIP address like &lt;b&gt;sip:example@example.com&lt;/b&gt; 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.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>addressToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="accel">
+ <string>F10</string>
+ </property>
+ <property name="iconSet">
+ <iconset>kontact_contacts.png</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Address book</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select an address from the address book.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>typeButtonGroup2</cstring>
+ </property>
+ <property name="title">
+ <string>Type of transfer</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>basicRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Blind transfer</string>
+ </property>
+ <property name="accel">
+ <string>Alt+B</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Transfer the call to a third party without contacting that third party yourself.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>consultRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>T&amp;ransfer with consultation</string>
+ </property>
+ <property name="accel">
+ <string>Alt+R</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Before transferring the call to a third party, first consult the party yourself.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>otherLineRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>Transfer to other &amp;line</string>
+ </property>
+ <property name="accel">
+ <string>Alt+L</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Connect the remote party on the active line with the remote party on the other line.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer24</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout28</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer23</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>121</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string>Alt+O</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>TransferForm</receiver>
+ <slot>validate()</slot>
+ </connection>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>TransferForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>addressToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>TransferForm</receiver>
+ <slot>showAddressBook()</slot>
+ </connection>
+ <connection>
+ <sender>otherLineRadioButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>TransferForm</receiver>
+ <slot>setOtherLineAddress(bool)</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">audits/memman.h</include>
+ <include location="local" impldecl="in declaration">qstring.h</include>
+ <include location="local" impldecl="in declaration">sockets/url.h</include>
+ <include location="local" impldecl="in declaration">getaddressform.h</include>
+ <include location="local" impldecl="in declaration">user.h</include>
+ <include location="local" impldecl="in declaration">protocol.h</include>
+ <include location="local" impldecl="in declaration">phone.h</include>
+ <include location="local" impldecl="in implementation">transferform.ui.h</include>
+</includes>
+<forwards>
+ <forward>extern t_phone *phone</forward>
+</forwards>
+<variables>
+ <variable access="private">int consult_line;</variable>
+ <variable access="private">t_user *user_config;</variable>
+ <variable access="private">GetAddressForm *getAddressForm;</variable>
+ <variable access="private">QString previousAddress;</variable>
+</variables>
+<signals>
+ <signal>destination(const t_display_url&amp;, t_transfer_type)</signal>
+</signals>
+<slots>
+ <slot>initTransferOptions()</slot>
+ <slot>show( t_user * user )</slot>
+ <slot>show( t_user * user, const string &amp; dest, t_transfer_type transfer_type )</slot>
+ <slot>hide()</slot>
+ <slot>reject()</slot>
+ <slot>validate()</slot>
+ <slot>closeEvent( QCloseEvent * )</slot>
+ <slot>showAddressBook()</slot>
+ <slot>selectedAddress( const QString &amp; address )</slot>
+ <slot>setOtherLineAddress( bool on )</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function access="private" specifier="non virtual">destroy()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/transferform.ui.h b/src/gui/transferform.ui.h
new file mode 100644
index 0000000..a5cdb83
--- /dev/null
+++ b/src/gui/transferform.ui.h
@@ -0,0 +1,195 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+void TransferForm::init()
+{
+ getAddressForm = 0;
+
+ // Set toolbutton icons for disabled options.
+ QIconSet i;
+ i = addressToolButton->iconSet();
+ i.setPixmap(QPixmap::fromMimeSource("kontact_contacts-disabled.png"),
+ QIconSet::Automatic, QIconSet::Disabled);
+ addressToolButton->setIconSet(i);
+}
+
+void TransferForm::destroy()
+{
+ if (getAddressForm) {
+ MEMMAN_DELETE(getAddressForm);
+ delete getAddressForm;
+ }
+}
+
+void TransferForm::initTransferOptions()
+{
+ // Show possible transfer type options
+ // Basic transfer is always possible.
+ // If a line is idle, then a transfer with consultation is possible.
+ // The line will be seized, so an incoming call cannot occupy it.
+ // If both lines are busy, then the active line can be transferred
+ // to the other line.
+ unsigned short idle_line;
+ if (phone->get_idle_line(idle_line)) {
+ consult_line = (int)idle_line;
+ phone->pub_seize(consult_line);
+ consultRadioButton->show();
+ consultRadioButton->setChecked(true);
+ otherLineRadioButton->hide();
+ } else {
+ consult_line = -1;
+ consultRadioButton->hide();
+ otherLineRadioButton->show();
+ otherLineRadioButton->setChecked(true);
+ }
+}
+
+void TransferForm::show(t_user *user)
+{
+ user_config = user;
+ initTransferOptions();
+ QDialog::show();
+}
+
+void TransferForm::show(t_user *user, const string &dest, t_transfer_type transfer_type)
+{
+ user_config = user;
+ initTransferOptions();
+ toLineEdit->setText(dest.c_str());
+
+ switch (transfer_type) {
+ case TRANSFER_CONSULT:
+ consultRadioButton->setChecked(true);
+ break;
+ case TRANSFER_OTHER_LINE:
+ otherLineRadioButton->setChecked(true);
+ break;
+ default:
+ basicRadioButton->setChecked(true);
+ break;
+ }
+
+ QDialog::show();
+}
+
+void TransferForm::hide()
+{
+ if (consult_line > -1) {
+ phone->pub_unseize(consult_line);
+ }
+
+ QDialog::hide();
+}
+
+void TransferForm::reject()
+{
+ if (user_config->get_referrer_hold()) {
+ ((t_gui *)ui)->action_retrieve();
+ }
+
+ if (consult_line > -1) {
+ phone->pub_unseize(consult_line);
+ }
+
+ QDialog::reject();
+}
+
+void TransferForm::validate()
+{
+ t_display_url dest;
+ ui->expand_destination(user_config, toLineEdit->text().stripWhiteSpace().ascii(), dest);
+
+ t_transfer_type transfer_type;
+ if (consultRadioButton->isOn()) {
+ transfer_type = TRANSFER_CONSULT;
+ } else if (otherLineRadioButton->isOn()) {
+ transfer_type = TRANSFER_OTHER_LINE;
+ } else {
+ transfer_type = TRANSFER_BASIC;
+ }
+
+
+ if (transfer_type == TRANSFER_OTHER_LINE || dest.is_valid()) {
+ if (consult_line > -1) {
+ phone->pub_unseize(consult_line);
+ }
+ emit destination(dest, transfer_type);
+ accept();
+ } else {
+ toLineEdit->selectAll();
+ }
+}
+
+void TransferForm::closeEvent(QCloseEvent *)
+{
+ reject();
+}
+
+void TransferForm::showAddressBook()
+{
+ if (!getAddressForm) {
+ getAddressForm = new GetAddressForm(
+ this, "select address", true);
+ MEMMAN_NEW(getAddressForm);
+ }
+
+ connect(getAddressForm,
+ SIGNAL(address(const QString &)),
+ this, SLOT(selectedAddress(const QString &)));
+
+ getAddressForm->show();
+}
+
+void TransferForm::selectedAddress(const QString &address)
+{
+ toLineEdit->setText(address);
+}
+
+void TransferForm::setOtherLineAddress(bool on)
+{
+ if (on) {
+ previousAddress = toLineEdit->text();
+ unsigned short active_line = phone->get_active_line();
+ unsigned short other_line = (active_line == 0 ? 1 : 0);
+ QString address = ui->format_sip_address(user_config,
+ phone->get_remote_display(other_line),
+ phone->get_remote_uri(other_line)).c_str();
+ toLineEdit->setText(address);
+ toLineEdit->setEnabled(false);
+ toLabel->setEnabled(false);
+#ifdef HAVE_KDE
+ addressToolButton->setEnabled(false);
+#endif
+ } else {
+ toLineEdit->setText(previousAddress);
+ toLineEdit->setEnabled(true);
+ toLabel->setEnabled(true);
+#ifdef HAVE_KDE
+ addressToolButton->setEnabled(true);
+#endif
+ }
+}
diff --git a/src/gui/twinkle.pro b/src/gui/twinkle.pro
new file mode 100644
index 0000000..feaf6da
--- /dev/null
+++ b/src/gui/twinkle.pro
@@ -0,0 +1,237 @@
+TEMPLATE = app
+LANGUAGE = C++
+
+CONFIG += qt warn_on release thread
+
+LIBS += ../libtwinkle.a ../parser/libsipparser.a ../sdp/libsdpparser.a ../sockets/libsocket.a ../threads/libthread.a ../audio/libaudio.a ../audits/libaudits.a ../stun/libstun.a ../mwi/libmwi.a ../im/libim.a ../patterns/libpatterns.a ../presence/libpresence.a ../utils/libutils.a -lsndfile -lmagic -lncurses -lreadline
+
+DEFINES += QT_NO_STL
+
+INCLUDEPATH += ..
+
+HEADERS += gui.h \
+ historylistview.h \
+ freedesksystray.h \
+ twinklesystray.h \
+ address_finder.h \
+ qt_translator.h \
+ core_strings.h \
+ addresslistviewitem.h \
+ yesnodialog.h \
+ command_args.h \
+ messageformview.h \
+ buddylistview.h \
+ textbrowsernoautolink.h \
+ twinkleapplication.h
+
+SOURCES += main.cpp \
+ gui.cpp \
+ historylistview.cpp \
+ freedesksystray.cpp \
+ twinklesystray.cpp \
+ address_finder.cpp \
+ addresslistviewitem.cpp \
+ yesnodialog.cpp \
+ messageformview.cpp \
+ buddylistview.cpp \
+ twinkleapplication.cpp
+
+FORMS = mphoneform.ui \
+ inviteform.ui \
+ deregisterform.ui \
+ redirectform.ui \
+ termcapform.ui \
+ dtmfform.ui \
+ selectnicform.ui \
+ srvredirectform.ui \
+ authenticationform.ui \
+ userprofileform.ui \
+ selectprofileform.ui \
+ getprofilenameform.ui \
+ transferform.ui \
+ syssettingsform.ui \
+ logviewform.ui \
+ wizardform.ui \
+ getaddressform.ui \
+ historyform.ui \
+ selectuserform.ui \
+ numberconversionform.ui \
+ addresscardform.ui \
+ messageform.ui \
+ buddyform.ui \
+ sendfileform.ui \
+ diamondcardprofileform.ui
+
+IMAGES = images/filenew \
+ images/filesave \
+ images/print \
+ images/undo \
+ images/redo \
+ images/editcut \
+ images/editcopy \
+ images/editpaste \
+ images/searchfind \
+ images/invite.png \
+ images/answer.png \
+ images/bye.png \
+ images/reject.png \
+ images/redirect.png \
+ images/hold.png \
+ images/dtmf.png \
+ images/bye-disabled.png \
+ images/redial.png \
+ images/redial-disabled.png \
+ images/invite-disabled.png \
+ images/answer-disabled.png \
+ images/reject-disabled.png \
+ images/redirect-disabled.png \
+ images/hold-disabled.png \
+ images/dtmf-disabled.png \
+ images/penguin.png \
+ images/package_network.png \
+ images/kmix.png \
+ images/package_system.png \
+ images/yast_babelfish.png \
+ images/clock.png \
+ images/yast_PhoneTTOffhook.png \
+ images/penguin_big.png \
+ images/password.png \
+ images/kcmpci.png \
+ images/penguin-small.png \
+ images/conf.png \
+ images/conf-disabled.png \
+ images/mute.png \
+ images/mute-disabled.png \
+ images/twinkle16.png \
+ images/twinkle48.png \
+ images/twinkle32.png \
+ images/transfer-disabled.png \
+ images/transfer.png \
+ images/log.png \
+ images/dtmf-2.png \
+ images/dtmf-3.png \
+ images/dtmf-5.png \
+ images/dtmf-6.png \
+ images/dtmf-7.png \
+ images/dtmf-8.png \
+ images/dtmf-9.png \
+ images/dtmf-4.png \
+ images/dtmf-1.png \
+ images/dtmf-0.png \
+ images/dtmf-star.png \
+ images/dtmf-pound.png \
+ images/dtmf-a.png \
+ images/dtmf-b.png \
+ images/dtmf-c.png \
+ images/dtmf-d.png \
+ images/twinkle24.png \
+ images/exit.png \
+ images/kontact_contacts.png \
+ images/ok.png \
+ images/cancel.png \
+ images/1rightarrow.png \
+ images/1leftarrow-yellow.png \
+ images/editdelete.png \
+ images/kcmpci16.png \
+ images/kontact_contacts-disabled.png \
+ images/sys_auto_ans.png \
+ images/sys_auto_ans_dis.png \
+ images/sys_busy_estab.png \
+ images/sys_busy_estab_dis.png \
+ images/sys_busy_trans.png \
+ images/sys_busy_trans_dis.png \
+ images/sys_dnd.png \
+ images/sys_dnd_dis.png \
+ images/sys_idle.png \
+ images/sys_idle_dis.png \
+ images/sys_redir.png \
+ images/sys_redir_dis.png \
+ images/sys_services.png \
+ images/sys_services_dis.png \
+ images/sys_hold.png \
+ images/sys_hold_dis.png \
+ images/sys_mute.png \
+ images/sys_mute_dis.png \
+ images/network.png \
+ images/knotify.png \
+ images/fileopen.png \
+ images/fileopen-disabled.png \
+ images/cf.png \
+ images/auto_answer.png \
+ images/auto_answer-disabled.png \
+ images/cancel-disabled.png \
+ images/cf-disabled.png \
+ images/missed-disabled.png \
+ images/missed.png \
+ images/sys_missed.png \
+ images/sys_missed_dis.png \
+ images/twinkle16-disabled.png \
+ images/gear.png \
+ images/reg_failed-disabled.png \
+ images/reg_failed.png \
+ images/no-indication.png \
+ images/contexthelp.png \
+ images/settings.png \
+ images/reg-query.png \
+ images/log_small.png \
+ images/qt-logo.png \
+ images/1leftarrow.png \
+ images/1uparrow.png \
+ images/1downarrow.png \
+ images/kontact_contacts32.png \
+ images/encrypted.png \
+ images/sys_encrypted.png \
+ images/sys_encrypted_dis.png \
+ images/encrypted32.png \
+ images/encrypted-disabled.png \
+ images/stat_conference.png \
+ images/stat_established.png \
+ images/stat_outgoing.png \
+ images/stat_ringing.png \
+ images/stat_mute.png \
+ images/stat_established_nomedia.png \
+ images/encrypted_verified.png \
+ images/sys_encrypted_verified.png \
+ images/sys_encrypted_verified_dis.png \
+ images/consult-xfer.png \
+ images/mwi_new16.png \
+ images/mwi_none16.png \
+ images/mwi_none16_dis.png \
+ images/sys_mwi.png \
+ images/sys_mwi_dis.png \
+ images/mwi_none.png \
+ images/mwi_failure16.png \
+ images/presence_offline.png \
+ images/presence_online.png \
+ images/presence_failed.png \
+ images/presence_rejected.png \
+ images/presence_unknown.png \
+ images/edit16.png \
+ images/message.png \
+ images/edit.png \
+ images/buddy.png \
+ images/message32.png \
+ images/presence.png \
+ images/save_as.png \
+ images/attach.png \
+ images/mime_application.png \
+ images/mime_audio.png \
+ images/mime_image.png \
+ images/mime_text.png \
+ images/mime_video.png
+
+TRANSLATIONS = lang/twinkle_nl.ts \
+ lang/twinkle_de.ts \
+ lang/twinkle_cs.ts \
+ lang/twinkle_fr.ts \
+ lang/twinkle_ru.ts \
+ lang/twinkle_sv.ts \
+ lang/twinkle_xx.ts
+
+unix {
+ UI_DIR = .ui
+ MOC_DIR = .moc
+ OBJECTS_DIR = .obj
+}
+
+include( ../../qtccxxincl.pro )
diff --git a/src/gui/twinkleapplication.cpp b/src/gui/twinkleapplication.cpp
new file mode 100644
index 0000000..6633031
--- /dev/null
+++ b/src/gui/twinkleapplication.cpp
@@ -0,0 +1,47 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include "twinkleapplication.h"
+
+#include "phone.h"
+#include "sys_settings.h"
+#include "user.h"
+#include "gui.h"
+
+extern t_phone *phone;
+
+#ifdef HAVE_KDE
+t_twinkle_application::t_twinkle_application() : KApplication() {}
+#else
+t_twinkle_application::t_twinkle_application(int &argc, char **argv) :
+ QApplication(argc,argv)
+{}
+#endif
+void t_twinkle_application::commitData (QSessionManager &sm) {
+ sys_config->set_ui_session_id(sessionId().ascii());
+
+ // Create list of active profile file names
+ list<t_user *> user_list = phone->ref_users();
+ list<string> profile_filenames;
+ for (list<t_user *>::const_iterator it = user_list.begin(); it != user_list.end(); ++it) {
+ profile_filenames.push_back((*it)->get_filename());
+ }
+
+ sys_config->set_ui_session_active_profiles(profile_filenames);
+ ((t_gui*)ui)->save_session_state();
+}
diff --git a/src/gui/twinkleapplication.h b/src/gui/twinkleapplication.h
new file mode 100644
index 0000000..e8503f8
--- /dev/null
+++ b/src/gui/twinkleapplication.h
@@ -0,0 +1,44 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef _TWINKLEAPPLICATION_H
+#define _TWINKLEAPPLICATION_H
+
+#include "twinkle_config.h"
+
+#ifdef HAVE_KDE
+#include <kapplication.h>
+#else
+#include <qapplication.h>
+#endif
+
+#ifdef HAVE_KDE
+class t_twinkle_application : public KApplication {
+#else
+class t_twinkle_application : public QApplication {
+#endif
+public:
+#ifdef HAVE_KDE
+ t_twinkle_application();
+#else
+ t_twinkle_application(int &argc, char **argv);
+#endif
+ virtual void commitData ( QSessionManager &sm );
+};
+
+#endif
diff --git a/src/gui/twinklesystray.cpp b/src/gui/twinklesystray.cpp
new file mode 100644
index 0000000..d2873da
--- /dev/null
+++ b/src/gui/twinklesystray.cpp
@@ -0,0 +1,38 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include "twinklesystray.h"
+#include "audits/memman.h"
+
+t_twinkle_sys_tray::t_twinkle_sys_tray(QWidget *pParent, const char *pszName) :
+#ifdef HAVE_KDE
+ KSystemTray(pParent, pszName)
+#else
+ FreeDeskSysTray(pParent, pszName)
+#endif
+{}
+
+t_twinkle_sys_tray::~t_twinkle_sys_tray()
+{}
+
+void t_twinkle_sys_tray::dock()
+{
+#ifndef HAVE_KDE
+ FreeDeskSysTray::dock();
+#endif
+}
diff --git a/src/gui/twinklesystray.h b/src/gui/twinklesystray.h
new file mode 100644
index 0000000..dd03b02
--- /dev/null
+++ b/src/gui/twinklesystray.h
@@ -0,0 +1,47 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef _TWINKLESYSTRAY_H
+#define _TWINKLESYSTRAY_H
+
+#include "twinkle_config.h"
+
+#ifdef HAVE_KDE
+#include <ksystemtray.h>
+#include <kpopupmenu.h>
+#else
+#include "freedesksystray.h"
+#endif
+
+#include "qpopupmenu.h"
+#include "qwidget.h"
+
+#ifdef HAVE_KDE
+class t_twinkle_sys_tray : public KSystemTray {
+#else
+class t_twinkle_sys_tray : public FreeDeskSysTray {
+#endif
+
+public:
+ t_twinkle_sys_tray(QWidget *pParent = 0, const char *pszName = 0);
+ ~t_twinkle_sys_tray();
+
+ void dock();
+};
+
+#endif
diff --git a/src/gui/userprofileform.ui b/src/gui/userprofileform.ui
new file mode 100644
index 0000000..d9f63c2
--- /dev/null
+++ b/src/gui/userprofileform.ui
@@ -0,0 +1,5758 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>UserProfileForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>UserProfileForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>783</width>
+ <height>594</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Twinkle - User Profile</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout142</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>profileTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>User profile:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>profileComboBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select which profile you want to edit.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QListBox" row="1" column="0">
+ <item>
+ <property name="text">
+ <string>User</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>penguin.png</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>SIP server</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>package_network.png</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Voice mail</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>mwi_none.png</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Instant message</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>message32.png</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Presence</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>presence.png</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>RTP audio</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>kmix.png</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>SIP protocol</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>package_system.png</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Transport/NAT</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>yast_babelfish.png</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Address format</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>yast_PhoneTTOffhook.png</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Timers</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>clock.png</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Ring tones</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>knotify.png</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Scripts</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>edit.png</pixmap>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Security</string>
+ </property>
+ <property name="pixmap">
+ <pixmap>encrypted32.png</pixmap>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>categoryListBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>150</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="midLineWidth">
+ <number>0</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select a category for which you want to see or modify the settings.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>layout12</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer8</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>441</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string>Alt+O</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Accept and save your changes.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string>Alt+C</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Undo all your changes and close the window.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QWidgetStack" row="1" column="1" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>settingsWidgetStack</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageUser</cstring>
+ </property>
+ <attribute name="id">
+ <number>0</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>userTitleTextLabel</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>User</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>accountGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>SIP account</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>usernameTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;User name*:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>usernameLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>domainTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Domain*:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>domainLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>organizationTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Or&amp;ganization:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>organizationLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>usernameLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The SIP user name given to you by your provider. It is the user part in your SIP address, &lt;b&gt;username&lt;/b&gt;@domain.com This could be a telephone number.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>domainLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The domain part of your SIP address, username@&lt;b&gt;domain.com&lt;/b&gt;. Instead of a real domain this could also be the hostname or IP address of your &lt;b&gt;SIP proxy&lt;/b&gt;. If you want direct IP phone to IP phone communications then you fill in the hostname or IP address of your computer.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>organizationLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>You may fill in the name of your organization. When you make a call, this might be shown to the called party.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>displayLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>dislpayTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Your name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>displayLineEdit</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>authenticationGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>SIP authentication</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>authRealmTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Realm:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>authRealmLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>authNameTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Authentication &amp;name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>authNameLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>authRealmLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>authNameLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>authAkaAmfTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>AKA AM&amp;F:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>authAkaAmfLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>authAkaOpTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>A&amp;KA OP:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>authAkaOpLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>authPasswordLineEdit</cstring>
+ </property>
+ <property name="echoMode">
+ <enum>Password</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Your password for authentication.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>authPasswordTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Password:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>authPasswordLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="4" column="1">
+ <property name="name">
+ <cstring>authAkaAmfLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Authentication management field for AKAv1-MD5 authentication.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>authAkaOpLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Operator variant key for AKAv1-MD5 authentication.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer9</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>110</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageSipServer</cstring>
+ </property>
+ <attribute name="id">
+ <number>1</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>sipServerTitleTextLabel</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>SIP server</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>registrarGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Registrar</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>registrarTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Registrar:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>registrarLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>registrarLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>expiryTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Expiry:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>expirySpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>layout22</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>expirySpinBox</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>90</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maxValue">
+ <number>999999</number>
+ </property>
+ <property name="lineStep">
+ <number>100</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The registration expiry time that Twinkle will request.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>secondsTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>seconds</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>260</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>regAtStartupCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Re&amp;gister at startup</string>
+ </property>
+ <property name="accel">
+ <string>Alt+G</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout37</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>regAddQvalueCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Add q-value to registration</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>regQvalueLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The q-value is a value between 0.000 and 1.000. A higher value means a higher priority.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer48</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>210</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>outboundProxyGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Outbound Proxy</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>useProxyCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Use outbound proxy</string>
+ </property>
+ <property name="accel">
+ <string>Alt+U</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>proxyTextLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Outbound &amp;proxy:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>proxyLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>proxyNonResolvableCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Don't send a request to proxy if its destination can be resolved locally.</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.)</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>proxyLineEdit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The hostname, domain name or IP address of your outbound proxy.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>allRequestsCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Send in-dialog requests to proxy</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer10</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>100</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageRtpAudio</cstring>
+ </property>
+ <attribute name="id">
+ <number>2</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>rtpAudioTitleTextLabel</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>RTP audio</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>rtpAudioTabWidget</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tabCodecs</cstring>
+ </property>
+ <attribute name="title">
+ <string>Co&amp;decs</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout18</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>ptimeTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;G.711/G.726 payload size:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>ptimeSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>ptimeSpinBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>46</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="maxValue">
+ <number>50</number>
+ </property>
+ <property name="minValue">
+ <number>10</number>
+ </property>
+ <property name="lineStep">
+ <number>10</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The preferred payload size for the G.711 and G.726 codecs.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>payloadMsTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>ms</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer24</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>121</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>inFarEndCodecPrefCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Follow codec preference from far end on incoming calls</string>
+ </property>
+ <property name="accel">
+ <string>Alt+F</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+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.
+&lt;p&gt;
+If you disable this option, then the first codec from the active codecs that is also in the SDP offer is picked.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0">
+ <property name="name">
+ <cstring>outFarEndCodecPrefCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Follow codec &amp;preference from far end on outgoing calls</string>
+ </property>
+ <property name="accel">
+ <string>Alt+P</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+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.
+&lt;p&gt;
+If you disable this option, then the first codec from the active codecs that is also in the SDP answer is picked.</string>
+ </property>
+ </widget>
+ <spacer row="4" column="0">
+ <property name="name">
+ <cstring>spacer38</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>codecsGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Codecs</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout19</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>availCodecTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Available codecs:</string>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <item>
+ <property name="text">
+ <string>G.711 A-law</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>G.711 u-law</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>GSM</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>speex-nb (8 kHz)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>speex-wb (16 kHz)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>speex-uwb (32 kHz)</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>availCodecListBox</cstring>
+ </property>
+ <property name="resizePolicy">
+ <enum>Manual</enum>
+ </property>
+ <property name="hScrollBarMode">
+ <enum>AlwaysOff</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>List of available codecs.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout14</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer17_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>addCodecPushButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>1rightarrow.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Move a codec from the list of available codecs to the list of active codecs.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>rmvCodecPushButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>1leftarrow.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Move a codec from the list of active codecs to the list of available codecs.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer18</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout20</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>useCodecTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Active codecs:</string>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>activeCodecListBox</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout15</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer19_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>upCodecPushButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>1uparrow.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Move a codec upwards in the list of active codecs, i.e. increase its preference of use.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>downCodecPushButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>1downarrow.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Move a codec downwards in the list of active codecs, i.e. decrease its preference of use.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer20_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tabPreprocessing</cstring>
+ </property>
+ <attribute name="title">
+ <string>Prepr&amp;ocessing</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>preprocessingGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Preprocessing (improves quality at remote end)</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout23</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>spxDspAgcCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Automatic gain control</string>
+ </property>
+ <property name="accel">
+ <string>Alt+A</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>spxDspAgcLevelTextLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Automatic gain control &amp;level:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>spxDspAgcLevelSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="0" column="2">
+ <property name="name">
+ <cstring>spxDspAgcLevelSpinBox</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="maxValue">
+ <number>100</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Automatic gain control level represents percentual value of automatic gain setting of a microphone. Recommended value is about 25%.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>spxDspVadCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Voice activity detection</string>
+ </property>
+ <property name="accel">
+ <string>Alt+V</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When enabled, voice activity detection detects whether the input signal represents a speech or a silence/background noise.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>spxDspNrdCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Noise reduction</string>
+ </property>
+ <property name="accel">
+ <string>Alt+N</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The noise reduction can be used to reduce the amount of background noise present in the input signal. This provides higher quality speech.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0">
+ <property name="name">
+ <cstring>spxDspAecCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Acoustic &amp;Echo Cancellation</string>
+ </property>
+ <property name="accel">
+ <string>Alt+E</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer24</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>31</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer25</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>121</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tabIlbc</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;iLBC</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>ilbcGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>iLBC</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout16</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>ilbcPayloadTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>i&amp;LBC payload type:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>ilbcPayloadSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>ilbcPayloadSizeTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>iLBC &amp;payload size (ms):</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>ilbcPayloadSizeComboBox</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout17_2</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>ilbcPayloadSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>127</number>
+ </property>
+ <property name="minValue">
+ <number>96</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The dynamic type value (96 or higher) to be used for iLBC.</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>20</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>30</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>ilbcPayloadSizeComboBox</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The preferred payload size for iLBC.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer26</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>71</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer29_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>81</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tabSpeex</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Speex</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>speexGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Speex</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout17_3</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>spxPenhCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Perceptual &amp;enhancement</string>
+ </property>
+ <property name="accel">
+ <string>Alt+E</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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).</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="1">
+ <property name="name">
+ <cstring>spxUwbPayloadTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Ultra wide band payload type:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>spxUwbPayloadSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="1">
+ <property name="name">
+ <cstring>spxWbPayloadTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Wide band payload type:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>spxWbPayloadSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>spxVbrCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Variable &amp;bit-rate</string>
+ </property>
+ <property name="accel">
+ <string>Alt+B</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="4" column="2">
+ <property name="name">
+ <cstring>spxUwbPayloadSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>127</number>
+ </property>
+ <property name="minValue">
+ <number>96</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The dynamic type value (96 or higher) to be used for speex wide band.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>spxDtxCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Discontinuous &amp;Transmission</string>
+ </property>
+ <property name="accel">
+ <string>Alt+T</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Discontinuous transmission is an addition to VAD/VBR operation, that allows to stop transmitting completely when the background noise is stationary.</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="3" column="2">
+ <property name="name">
+ <cstring>spxWbPayloadSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>127</number>
+ </property>
+ <property name="minValue">
+ <number>96</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The dynamic type value (96 or higher) to be used for speex wide band.</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="2" column="2">
+ <property name="name">
+ <cstring>spxNbPayloadSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>127</number>
+ </property>
+ <property name="minValue">
+ <number>96</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The dynamic type value (96 or higher) to be used for speex narrow band.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>spxQualityTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Quality:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>spxQualitySpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="0" column="2">
+ <property name="name">
+ <cstring>spxQualitySpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>10</number>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Speex is a lossy codec, which means that it achives 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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>spxComplexityTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Co&amp;mplexity:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>spxComplexitySpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="2">
+ <property name="name">
+ <cstring>spxComplexitySpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>10</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="1">
+ <property name="name">
+ <cstring>spxNbPayloadTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Narrow band payload type:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>spxNbPayloadSpinBox</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer23_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>31</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer30_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>121</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tabG726</cstring>
+ </property>
+ <attribute name="title">
+ <string>G.726</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>g726GroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>G.726</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout22</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>g72640PayloadTypeTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>G.726 &amp;40 kbps payload type:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>g72640PayloadSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="3" column="1">
+ <property name="name">
+ <cstring>g72640PayloadSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>127</number>
+ </property>
+ <property name="minValue">
+ <number>96</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The dynamic type value (96 or higher) to be used for G.726 40 kbps.</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="2" column="1">
+ <property name="name">
+ <cstring>g72632PayloadSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>127</number>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The dynamic type value (96 or higher) to be used for G.726 32 kbps.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>g72624PayloadTypeTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>G.726 &amp;24 kbps payload type:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>g72624PayloadSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="1">
+ <property name="name">
+ <cstring>g72624PayloadSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>127</number>
+ </property>
+ <property name="minValue">
+ <number>96</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The dynamic type value (96 or higher) to be used for G.726 24 kbps.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>g72632PayloadTypeTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>G.726 &amp;32 kbps payload type:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>g72632PayloadSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="0" column="1">
+ <property name="name">
+ <cstring>g72616PayloadSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>127</number>
+ </property>
+ <property name="minValue">
+ <number>96</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The dynamic type value (96 or higher) to be used for G.726 16 kbps.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>g72616PayloadTypeTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>G.726 &amp;16 kbps payload type:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>g72616PayloadSpinBox</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="0" column="1">
+ <property name="name">
+ <cstring>spacer31</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>231</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout41</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>g726PackingTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Codeword &amp;packing order:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>g726PackComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>RFC 3551</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>ATM AAL2</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>g726PackComboBox</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer40_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>141</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer32</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>150</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tabDtmf</cstring>
+ </property>
+ <attribute name="title">
+ <string>DT&amp;MF</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>dtmfGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>DTMF</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>spacer17</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>280</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSpinBox" row="0" column="2">
+ <property name="name">
+ <cstring>dtmfPayloadTypeSpinBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>49</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="maxValue">
+ <number>127</number>
+ </property>
+ <property name="minValue">
+ <number>96</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The dynamic type value (96 or higher) to be used for DTMF events (RFC 2833).</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="3">
+ <property name="name">
+ <cstring>dtmfDurationMsTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>ms</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>dtmfVolumeTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>DTMF vo&amp;lume:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>dtmfVolumeSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="3" column="2">
+ <property name="name">
+ <cstring>dtmfVolumeSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>0</number>
+ </property>
+ <property name="minValue">
+ <number>-63</number>
+ </property>
+ <property name="lineStep">
+ <number>10</number>
+ </property>
+ <property name="value">
+ <number>-10</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The power level of the DTMF tone in dB.</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="2" column="2">
+ <property name="name">
+ <cstring>dtmfPauseSpinBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>49</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="maxValue">
+ <number>100</number>
+ </property>
+ <property name="minValue">
+ <number>20</number>
+ </property>
+ <property name="lineStep">
+ <number>10</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The pause after a DTMF tone.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>dtmfDurationTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>DTMF &amp;duration:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>dtmfDurationSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="3">
+ <property name="name">
+ <cstring>dtmfPauseMsTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>ms</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>dtmfPayloadTypeTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>DTMF payload &amp;type:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>dtmfPayloadTypeSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>dtmfPauseTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>DTMF &amp;pause:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>dtmfPauseSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="3">
+ <property name="name">
+ <cstring>dtmfVolDbmTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>dB</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="2">
+ <property name="name">
+ <cstring>dtmfDurationSpinBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>49</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="maxValue">
+ <number>500</number>
+ </property>
+ <property name="minValue">
+ <number>40</number>
+ </property>
+ <property name="lineStep">
+ <number>10</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Duration of a DTMF tone.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout15</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>dtmfTransportTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>DTMF t&amp;ransport:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>dtmfTransportComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>Auto</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>RFC 2833</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Inband</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Out-of-band (SIP INFO)</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>dtmfTransportComboBox</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;h2&gt;RFC 2833&lt;/h2&gt;
+&lt;p&gt;Send DTMF tones as RFC 2833 telephone events.&lt;/p&gt;
+&lt;h2&gt;Inband&lt;/h2&gt;
+&lt;p&gt;Send DTMF inband.&lt;/p&gt;
+&lt;h2&gt;Auto&lt;/h2&gt;
+&lt;p&gt;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.
+&lt;/p&gt;
+&lt;h2&gt;Out-of-band (SIP INFO)&lt;/h2&gt;
+&lt;p&gt;
+Send DTMF out-of-band via a SIP INFO request.
+&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer22_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>161</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer23_3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>120</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageSipProtocol</cstring>
+ </property>
+ <attribute name="id">
+ <number>3</number>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>sipProtocolTitleTextLabel</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>SIP protocol</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QTabWidget" row="1" column="0">
+ <property name="name">
+ <cstring>sipProtoclTabWidget</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>General</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="2" column="1">
+ <property name="name">
+ <cstring>spacer24_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>optionsGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Protocol options</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>holdVariantTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Call &amp;Hold variant:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>holdVariantComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <item>
+ <property name="text">
+ <string>RFC 2543</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>RFC 3264</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>holdVariantComboBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>110</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>70</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>missingContactCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Allow m&amp;issing Contact header in 200 OK on REGISTER</string>
+ </property>
+ <property name="accel">
+ <string>Alt+I</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>maxForwardsCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Max-Forwards header is mandatory</string>
+ </property>
+ <property name="accel">
+ <string>Alt+M</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>regTimeCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Put &amp;registration expiry time in contact header</string>
+ </property>
+ <property name="accel">
+ <string>Alt+R</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="4" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>compactHeadersCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Use compact header names</string>
+ </property>
+ <property name="accel">
+ <string>Alt+U</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Indicates if compact header names should be used for headers that have a compact form.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="7" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>allowSdpChangeCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Allow SDP change during call setup</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;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.&lt;/p&gt;
+&lt;p&gt;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.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="6" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>useDomainInContactCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Use domain &amp;name to create a unique contact header value</string>
+ </property>
+ <property name="accel">
+ <string>Alt+N</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+Twinkle creates a unique contact header value by combining the SIP user name and domain:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;tt&gt;&amp;nbsp;user_domain@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+This way 2 user profiles, having the same user name but different domain names, have unique contact addresses and hence can be activated simultaneously.
+&lt;/p&gt;
+&lt;p&gt;
+Some proxies do not handle a contact header value like this. You can disable this option to get a contact header value like this:
+&lt;/p&gt;
+&lt;p&gt;
+&lt;tt&gt;&amp;nbsp;user@local_ip&lt;/tt&gt;
+&lt;/p&gt;
+&lt;p&gt;
+This format is what most SIP phones use.
+&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="5" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>multiValuesListCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Encode Via, Route, Record-Route as list</string>
+ </property>
+ <property name="accel">
+ <string>Alt+E</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>redirectionGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Redirection</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>allowRedirectionCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Allow redirection</string>
+ </property>
+ <property name="accel">
+ <string>Alt+A</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Indicates if Twinkle should redirect a request if a 3XX response is received.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>askUserRedirectCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Ask user &amp;permission to redirect</string>
+ </property>
+ <property name="accel">
+ <string>Alt+P</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Indicates if Twinkle should ask the user before redirecting a request when a 3XX response is received.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>maxRedirectTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Max re&amp;directions:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>maxRedirectSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="2" column="1">
+ <property name="name">
+ <cstring>maxRedirectSpinBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>46</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maxValue">
+ <number>5</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <spacer row="2" column="2">
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>80</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="1" column="1">
+ <property name="name">
+ <cstring>sipExtensionsGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>SIP extensions</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox" row="0" column="1">
+ <item>
+ <property name="text">
+ <string>disabled</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>supported</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>required</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>preferred</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>ext100relComboBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>120</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Indicates if the 100rel extension (PRACK) is supported:&lt;br&gt;&lt;br&gt;
+&lt;b&gt;disabled&lt;/b&gt;: 100rel extension is disabled
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;supported&lt;/b&gt;: 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.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;required&lt;/b&gt;: 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.
+&lt;br&gt;&lt;br&gt;
+&lt;b&gt;preferred&lt;/b&gt;: 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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>ext100relTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;100 rel (PRACK):</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>ext100relComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>extReplacesCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Replaces</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Indicates if the Replaces-extenstion is supported.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>REFER</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>referGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Call transfer (REFER)</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>allowReferCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Accept call &amp;transfer request (incoming REFER)</string>
+ </property>
+ <property name="accel">
+ <string>Alt+T</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Indicates if Twinkle should transfer a call if a REFER request is received.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>askUserReferCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>As&amp;k user permission to transfer</string>
+ </property>
+ <property name="accel">
+ <string>Alt+K</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Indicates if Twinkle should ask the user before transferring a call when a REFER request is received.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>refereeHoldCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Hold call &amp;with referrer while setting up call to transfer target</string>
+ </property>
+ <property name="accel">
+ <string>Alt+W</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Indicates if Twinkle should put the current call on hold when a REFER request to transfer a call is received.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>referrerHoldCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Ho&amp;ld call with referee before sending REFER</string>
+ </property>
+ <property name="accel">
+ <string>Alt+L</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Indicates if Twinkle should put the current call on hold when you transfer a call.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>refreshReferSubCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Auto re&amp;fresh subscription to refer event while call transfer is not finished</string>
+ </property>
+ <property name="accel">
+ <string>Alt+F</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>referAorCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Attended refer to AoR (Address of Record)</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>transferConsultInprogCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Allow call transfer while consultation in progress</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer25</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>200</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>TabPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Privacy</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>privacyGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Privacy options</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>pPreferredIdCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Send P-Preferred-Identity header when hiding user identity</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Include a P-Preferred-Identity header with your identity in an INVITE request for a call with identity hiding.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer40</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>331</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageNat</cstring>
+ </property>
+ <attribute name="id">
+ <number>4</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>NatTitleTextLabel</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>Transport/NAT</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>transportGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>SIP transport</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox" row="0" column="1" rowspan="1" colspan="2">
+ <item>
+ <property name="text">
+ <string>Auto</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>UDP</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>TCP</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>sipTransportComboBox</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <spacer row="0" column="3">
+ <property name="name">
+ <cstring>spacer46</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>151</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>sipTransportTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>T&amp;ransport protocol:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>sipTransportComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>udpThresholdTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>UDP t&amp;hreshold:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>udpThresholdSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="1">
+ <property name="name">
+ <cstring>udpThresholdSpinBox</cstring>
+ </property>
+ <property name="suffix">
+ <string>bytes</string>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ <property name="lineStep">
+ <number>100</number>
+ </property>
+ <property name="value">
+ <number>1300</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Messages larger than the threshold are sent via TCP. Smaller messages are sent via UDP.</string>
+ </property>
+ </widget>
+ <spacer row="1" column="2" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer47</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>81</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>natTraversalButtonGroup_</cstring>
+ </property>
+ <property name="title">
+ <string>NAT traversal</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>natNoneRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;NAT traversal not needed</string>
+ </property>
+ <property name="accel">
+ <string>Alt+N</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose this option when there is no NAT device between you and your SIP proxy or when your SIP provider offers hosted NAT traversal.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>natStaticRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Use statically configured public IP address inside SIP messages</string>
+ </property>
+ <property name="accel">
+ <string>Alt+U</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.&lt;br&gt;&lt;br&gt;
+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.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout32</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>publicIPTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Public IP address:</string>
+ </property>
+ <property name="indent">
+ <number>21</number>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>publicIPLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>publicIPLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The public IP address of your NAT.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>natStunRadioButton</cstring>
+ </property>
+ <property name="text">
+ <string>Use &amp;STUN (does not work for incoming TCP)</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose this option when your SIP provider offers a STUN server for NAT traversal.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout33</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>stunServerTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>S&amp;TUN server:</string>
+ </property>
+ <property name="indent">
+ <number>21</number>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>stunServerLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>stunServerLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The hostname, domain name or IP address of the STUN server.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>persistentTcpCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>P&amp;ersistent TCP connection</string>
+ </property>
+ <property name="accel">
+ <string>Alt+E</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>natKeepaliveCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Enable NAT &amp;keep alive</string>
+ </property>
+ <property name="accel">
+ <string>Alt+K</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Send UDP NAT keep alive packets.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer19</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>80</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageAddressFormat</cstring>
+ </property>
+ <attribute name="id">
+ <number>5</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>addressFormatTitleTextLabel</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>Address format</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>telNumberGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Telephone numbers</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>displayTelUserCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Only &amp;display user part of URI for telephone number</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>numericalUserIsTelCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;URI with numerical user part is a telephone number</string>
+ </property>
+ <property name="accel">
+ <string>Alt+U</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>removeSpecialCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Remove special symbols from numerical dial strings</string>
+ </property>
+ <property name="accel">
+ <string>Alt+R</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="4" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>useTelUriCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Use tel-URI for telephone &amp;number</string>
+ </property>
+ <property name="accel">
+ <string>Alt+N</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Expand a dialed telephone number to a tel-URI instead of a sip-URI.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>specialTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Special symbols:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>specialLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>specialLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The special symbols that may be part of a telephone number for nice formatting, but must be removed when dialing.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>conversionGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Number conversion</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout29</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Match expression</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Replace</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>conversionListView</cstring>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;p&gt;
+The number conversion rules are also applied to incoming calls, so the numbers are displayed in the format you want.
+&lt;/p&gt;
+&lt;h3&gt;Example 1&lt;/h3&gt;
+&lt;p&gt;
+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'.
+&lt;/p&gt;
+&lt;p&gt;
+The following rules will do the trick:
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expression = \+31([0-9]*) , Replace = 0$1&lt;br&gt;
+Match expression = \+([0-9]*) , Replace = 00$1&lt;/br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;h3&gt;Example 2&lt;/h3&gt;
+&lt;p&gt;
+You are at work and all telephone numbers starting with a 0 should be prefixed with a 9 for an outside line.
+&lt;/p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+Match expression = 0[0-9]* , Replace = 9$&amp;&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout15_2</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer19_2_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>upConversionPushButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>1uparrow.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Move the selected number conversion rule upwards in the list.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>downConversionPushButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>1downarrow.png</pixmap>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Move the selected number conversion rule downwards in the list.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer20_2_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout30</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>addConversionPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Add</string>
+ </property>
+ <property name="accel">
+ <string>Alt+A</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Add a number conversion rule.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>removePushButton</cstring>
+ </property>
+ <property name="text">
+ <string>Re&amp;move</string>
+ </property>
+ <property name="accel">
+ <string>Alt+M</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Remove the selected number conversion rule.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>editConversionPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Edit</string>
+ </property>
+ <property name="accel">
+ <string>Alt+E</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Edit the selected number conversion rule.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer38_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>291</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout24</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>testConversionLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Type a telephone number here an press the Test button to see how it is converted by the list of number conversion rules.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>testConversionPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Test</string>
+ </property>
+ <property name="accel">
+ <string>Alt+T</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Test how a number is converted by the number conversion rules.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer20</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageTimers</cstring>
+ </property>
+ <attribute name="id">
+ <number>6</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>timersTitleTextLabel</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>Timers</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="2">
+ <property name="name">
+ <cstring>secNoanswerTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>seconds</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="1">
+ <property name="name">
+ <cstring>tmrNatKeepaliveSpinBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>55</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>55</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="maxValue">
+ <number>900</number>
+ </property>
+ <property name="minValue">
+ <number>10</number>
+ </property>
+ <property name="lineStep">
+ <number>10</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="0" column="1">
+ <property name="name">
+ <cstring>tmrNoanswerSpinBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>55</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>55</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="maxValue">
+ <number>600</number>
+ </property>
+ <property name="lineStep">
+ <number>10</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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".</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>tmrNatKeepaliveTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>NAT &amp;keep alive:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>tmrNatKeepaliveSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>tmrNoanswerTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;No answer:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>tmrNoanswerSpinBox</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer23</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>270</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer22</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>450</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageRingTones</cstring>
+ </property>
+ <attribute name="id">
+ <number>7</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>ringtonesTitleTextLabel</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>Ring tones</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout18</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QToolButton" row="1" column="2">
+ <property name="name">
+ <cstring>openRingbackToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>fileopen.png</iconset>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select ring back tone file.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="0" column="2">
+ <property name="name">
+ <cstring>openRingtoneToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>fileopen.png</iconset>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select ring tone file.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>ringbackTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Ring &amp;back tone:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>ringbackLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>ringbackLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+Specify the file name of a .wav file that you want to be played as ring back tone for this user.
+&lt;/p&gt;
+&lt;p&gt;
+This ring back tone overrides the ring back tone settings in the system settings.
+&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>ringtoneLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+Specify the file name of a .wav file that you want to be played as ring tone for this user.
+&lt;/p&gt;
+&lt;p&gt;
+This ring tone overrides the ring tone settings in the system settings.
+&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>ringtoneTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Ring tone:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>ringtoneLineEdit</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer30</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>391</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageScripts</cstring>
+ </property>
+ <attribute name="id">
+ <number>8</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>scriptsTitleTextLabel</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>Scripts</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout19</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit" row="6" column="1">
+ <property name="name">
+ <cstring>localReleaseLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+This script is called when you release a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing SIP BYE request are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=local_release&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the BYE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="2" column="2">
+ <property name="name">
+ <cstring>openInCallFailedToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>fileopen.png</iconset>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select script file.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="0" column="2">
+ <property name="name">
+ <cstring>openIncomingCallScriptToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>fileopen.png</iconset>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select script file.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="4" column="2">
+ <property name="name">
+ <cstring>openOutCallAnsweredToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>fileopen.png</iconset>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select script file.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>inCallFailedLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+This script is called when an incoming call fails.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing SIP failure response are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_failed&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; contains the status code of the failure response. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="1" column="2">
+ <property name="name">
+ <cstring>openInCallAnsweredToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>fileopen.png</iconset>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select script file.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="7" column="1">
+ <property name="name">
+ <cstring>remoteReleaseLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+This script is called when the remote party releases a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming SIP BYE request are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=remote_release&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=BYE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the BYE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="3" column="2">
+ <property name="name">
+ <cstring>openOutCallToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>fileopen.png</iconset>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select script file.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>incomingCallScriptLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+You can customize the way Twinkle handles incoming calls. Twinkle can call a script when a call comes in. Based on the ouput 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.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;Note:&lt;/b&gt; 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 &lt;b&gt;end&lt;/b&gt; and keep on running. Twinkle will continue when it receives the &lt;b&gt;end&lt;/b&gt; parameter.
+&lt;/p&gt;
+&lt;p&gt;
+With your script you can customize call handling by outputing one or more of the following parameters to stdout. Each parameter should be on a separate line.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;blockquote&gt;
+&lt;tt&gt;
+action=[ continue | reject | dnd | redirect | autoanswer ]&lt;br&gt;
+reason=&amp;lt;string&amp;gt;&lt;br&gt;
+contact=&amp;lt;address to redirect to&amp;gt;&lt;br&gt;
+caller_name=&amp;lt;name of caller to display&amp;gt;&lt;br&gt;
+ringtone=&amp;lt;file name of .wav file&amp;gt;&lt;br&gt;
+display_msg=&amp;lt;message to show on display&amp;gt;&lt;br&gt;
+end&lt;br&gt;
+&lt;/tt&gt;
+&lt;/blockquote&gt;
+&lt;/p&gt;
+&lt;h2&gt;Parameters&lt;/h2&gt;
+&lt;h3&gt;action&lt;/h3&gt;
+&lt;p&gt;
+&lt;b&gt;continue&lt;/b&gt; - continue call handling as usual&lt;br&gt;
+&lt;b&gt;reject&lt;/b&gt; - reject call&lt;br&gt;
+&lt;b&gt;dnd&lt;/b&gt; - deny call with do not disturb indication&lt;br&gt;
+&lt;b&gt;redirect&lt;/b&gt; - redirect call to address specified by &lt;b&gt;contact&lt;/b&gt;&lt;br&gt;
+&lt;b&gt;autoanswer&lt;/b&gt; - automatically answer a call&lt;br&gt;
+&lt;/p&gt;
+&lt;p&gt;
+When the script does not write an action to stdout, then the default action is continue.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;reason: &lt;/b&gt;
+With the reason parameter you can set the reason string for reject or dnd. This might be shown to the far-end user.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;caller_name: &lt;/b&gt;
+This parameter will override the display name of the caller.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;ringtone: &lt;/b&gt;
+The ringtone parameter specifies the .wav file that will be played as ring tone when action is continue.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+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 &lt;b&gt;SIP_&amp;lt;HEADER_NAME&amp;gt;&lt;/b&gt; E.g. SIP_FROM contains the value of the from header.
+&lt;/p&gt;
+&lt;p&gt;
+TWINKLE_TRIGGER=in_call. SIPREQUEST_METHOD=INVITE. The request-URI of the INVITE will be passed in &lt;b&gt;SIPREQUEST_URI&lt;/b&gt;. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="4" column="1">
+ <property name="name">
+ <cstring>outCallAnsweredLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+This script is called when the remote party answers your call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming 200 OK are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_answered&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>inCallAnsweredLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+This script is called when you answer an incoming call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing 200 OK are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=in_call_answered&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE=200&lt;/b&gt;. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="6" column="0">
+ <property name="name">
+ <cstring>localReleaseTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Call released locall&amp;y:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>inCallFailedLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="5" column="2">
+ <property name="name">
+ <cstring>openOutCallFailedToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>fileopen.png</iconset>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select script file.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="5" column="1">
+ <property name="name">
+ <cstring>outCallFailedLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+This script is called when an outgoing call fails.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the incoming SIP failure response are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call_failed&lt;/b&gt;. &lt;b&gt;SIPSTATUS_CODE&lt;/b&gt; contains the status code of the failure response. &lt;b&gt;SIPSTATUS_REASON&lt;/b&gt; contains the reason phrase. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>outCallLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;
+This script is called when you make a call.
+&lt;/p&gt;
+&lt;h2&gt;Environment variables&lt;/h2&gt;
+&lt;p&gt;
+The values of all SIP headers of the outgoing INVITE are passed in environment variables to your script.
+&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;TWINKLE_TRIGGER=out_call&lt;/b&gt;. &lt;b&gt;SIPREQUEST_METHOD=INVITE&lt;/b&gt;. &lt;b&gt;SIPREQUEST_URI&lt;/b&gt; contains the request-URI of the INVITE. The name of the user profile will be passed in &lt;b&gt;TWINKLE_USER_PROFILE&lt;/b&gt;.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>outCallAnsweredTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Outgoing call a&amp;nswered:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>inCallAnsweredLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>inCallFailedTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Incoming call &amp;failed:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>inCallFailedLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>incomingCallScriptTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Incoming call:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>incomingCallScriptLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="6" column="2">
+ <property name="name">
+ <cstring>openLocalReleaseToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>fileopen.png</iconset>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select script file.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="7" column="0">
+ <property name="name">
+ <cstring>remoteReleaseTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Call released &amp;remotely:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>inCallFailedLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>inCallAnsweredTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Incoming call &amp;answered:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>inCallAnsweredLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="7" column="2">
+ <property name="name">
+ <cstring>openRemoteReleaseToolButton</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>fileopen.png</iconset>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select script file.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>outCallTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>O&amp;utgoing call:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>incomingCallScriptLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>outCallFailedTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Out&amp;going call failed:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>inCallFailedLineEdit</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer29</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>190</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageSecurity</cstring>
+ </property>
+ <attribute name="id">
+ <number>9</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>securityTitleTextLabel</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>Security</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>zrtpEnabledCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Enable ZRTP/SRTP encryption</string>
+ </property>
+ <property name="accel">
+ <string>Alt+E</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>zrtpSettingsGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>ZRTP settings</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>zrtpSendIfSupportedCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>O&amp;nly encrypt audio if remote party indicated ZRTP support in SDP</string>
+ </property>
+ <property name="accel">
+ <string>Alt+N</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>zrtpSdpCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Indicate ZRTP support in SDP</string>
+ </property>
+ <property name="accel">
+ <string>Alt+I</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Twinkle will indicate ZRTP support during call setup in its signalling.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>zrtpGoClearWarningCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Popup warning when remote party disables encryption during call</string>
+ </property>
+ <property name="accel">
+ <string>Alt+P</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer33</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>241</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageVoiceMail</cstring>
+ </property>
+ <attribute name="id">
+ <number>10</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>voiceMailTextLabel</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>Voice mail</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout39</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>vmAddressTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Voice mail address:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>vmAddressLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>vmAddressLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The SIP address or telephone number to access your voice mail.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>layout38</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>Unsollicited</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Sollicited</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>mwiTypeComboBox</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;H2&gt;Message waiting indication type&lt;/H2&gt;
+&lt;p&gt;
+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.
+&lt;/p&gt;
+&lt;H3&gt;Unsollicited&lt;/H3&gt;
+&lt;p&gt;
+Asterisk provides unsollicited message waiting indication.
+&lt;/p&gt;
+&lt;H3&gt;Sollicited&lt;/H3&gt;
+&lt;p&gt;
+Sollicited message waiting indication as specified by RFC 3842.
+&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer39</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>221</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>mwiTypeTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;MWI type:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>mwiTypeComboBox</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>mwiSollicitedGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Sollicited MWI</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout36</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>spacer35</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>120</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>mwiDurationTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Subscription &amp;duration:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>mwiDurationSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>mwiUserTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Mailbox &amp;user name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>mwiUserLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>mwiServerLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The hostname, domain name or IP address of your voice mailbox server.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="1">
+ <property name="name">
+ <cstring>layout35</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>mwiDurationSpinBox</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>90</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maxValue">
+ <number>999999</number>
+ </property>
+ <property name="lineStep">
+ <number>100</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>mwiSecondsTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>seconds</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer36</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>190</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>mwiUserLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Your user name for accessing your voice mailbox.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>mwiServerTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Mailbox &amp;server:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>mwiServerLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="1">
+ <property name="name">
+ <cstring>mwiViaProxyCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Via outbound &amp;proxy</string>
+ </property>
+ <property name="accel">
+ <string>Alt+P</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Check this option if Twinkle should send SIP messages to the mailbox server via the outbound proxy.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer38_3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>211</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pageIM</cstring>
+ </property>
+ <attribute name="id">
+ <number>11</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>imTextLabel</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>Instant message</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout74</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>imMaxSessionsTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Maximum number of sessions:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>imMaxSessionsSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>imMaxSessionsSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>When you have this number of instant message sessions open, new incoming message sessions will be rejected.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer42</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>201</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>isComposingCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Send composing indications when typing a message.</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Twinkle sends a composing indication when you type a message. This way the recipient can see that you are typing.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer40_3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>350</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>pagePresence</cstring>
+ </property>
+ <attribute name="id">
+ <number>12</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>presTextLabel</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>150</red>
+ <green>150</green>
+ <blue>150</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>21</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>Presence</string>
+ </property>
+ <property name="indent">
+ <number>10</number>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>presYourGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Your presence</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>presPublishCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Publish availability at startup</string>
+ </property>
+ <property name="accel">
+ <string>Alt+P</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Publish your availability at startup.</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout75</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>presPublishTimerTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>Publication &amp;refresh interval (sec):</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>presPublishTimeSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>presPublishTimeSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>999999</number>
+ </property>
+ <property name="lineStep">
+ <number>100</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Refresh rate of presence publications.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer43</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>231</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox25</cstring>
+ </property>
+ <property name="title">
+ <string>Buddy presence</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout76</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>presSubscribeTimerTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Subscription refresh interval (sec):</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>presSubscribeTimeSpinBox</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>presSubscribeTimeSpinBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>999999</number>
+ </property>
+ <property name="lineStep">
+ <number>100</number>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Refresh rate of presence subscriptions.</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer44</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>191</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer45</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>281</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>categoryListBox</sender>
+ <signal>highlighted(int)</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>showCategory(int)</slot>
+ </connection>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>validate()</slot>
+ </connection>
+ <connection>
+ <sender>useProxyCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>proxyTextLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>useProxyCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>proxyLineEdit</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>useProxyCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>allRequestsCheckBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>allowRedirectionCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>askUserRedirectCheckBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>allowRedirectionCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>maxRedirectTextLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>allowRedirectionCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>maxRedirectSpinBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>useProxyCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>proxyNonResolvableCheckBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>natStaticRadioButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>publicIPTextLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>natStaticRadioButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>publicIPLineEdit</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>natStunRadioButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>stunServerTextLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>natStunRadioButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>stunServerLineEdit</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>allowReferCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>askUserReferCheckBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>allowReferCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>refereeHoldCheckBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>profileComboBox</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>changeProfile(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>openRingtoneToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>chooseRingtone()</slot>
+ </connection>
+ <connection>
+ <sender>openRingbackToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>chooseRingback()</slot>
+ </connection>
+ <connection>
+ <sender>openIncomingCallScriptToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>chooseIncomingCallScript()</slot>
+ </connection>
+ <connection>
+ <sender>addCodecPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>addCodec()</slot>
+ </connection>
+ <connection>
+ <sender>rmvCodecPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>removeCodec()</slot>
+ </connection>
+ <connection>
+ <sender>upCodecPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>upCodec()</slot>
+ </connection>
+ <connection>
+ <sender>downCodecPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>downCodec()</slot>
+ </connection>
+ <connection>
+ <sender>availCodecListBox</sender>
+ <signal>doubleClicked(QListBoxItem*)</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>addCodec()</slot>
+ </connection>
+ <connection>
+ <sender>activeCodecListBox</sender>
+ <signal>doubleClicked(QListBoxItem*)</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>removeCodec()</slot>
+ </connection>
+ <connection>
+ <sender>openInCallAnsweredToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>chooseInCallAnsweredScript()</slot>
+ </connection>
+ <connection>
+ <sender>openInCallFailedToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>chooseInCallFailedScript()</slot>
+ </connection>
+ <connection>
+ <sender>openLocalReleaseToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>chooseLocalReleaseScript()</slot>
+ </connection>
+ <connection>
+ <sender>openOutCallAnsweredToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>chooseOutCallAnsweredScript()</slot>
+ </connection>
+ <connection>
+ <sender>openOutCallFailedToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>chooseOutCallFailedScript()</slot>
+ </connection>
+ <connection>
+ <sender>openOutCallToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>chooseOutgoingCallScript()</slot>
+ </connection>
+ <connection>
+ <sender>openRemoteReleaseToolButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>chooseRemoteReleaseScript()</slot>
+ </connection>
+ <connection>
+ <sender>upConversionPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>upConversion()</slot>
+ </connection>
+ <connection>
+ <sender>downConversionPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>downConversion()</slot>
+ </connection>
+ <connection>
+ <sender>addConversionPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>addConversion()</slot>
+ </connection>
+ <connection>
+ <sender>editConversionPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>editConversion()</slot>
+ </connection>
+ <connection>
+ <sender>removePushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>removeConversion()</slot>
+ </connection>
+ <connection>
+ <sender>testConversionPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>testConversion()</slot>
+ </connection>
+ <connection>
+ <sender>zrtpEnabledCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>zrtpSettingsGroupBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>mwiTypeComboBox</sender>
+ <signal>activated(int)</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>changeMWIType(int)</slot>
+ </connection>
+ <connection>
+ <sender>regAddQvalueCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>regQvalueLineEdit</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>sipTransportComboBox</sender>
+ <signal>activated(int)</signal>
+ <receiver>UserProfileForm</receiver>
+ <slot>changeSipTransportProtocol(int)</slot>
+ </connection>
+ <connection>
+ <sender>spxDspAgcCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>spxDspAgcLevelTextLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>spxDspAgcCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>spxDspAgcLevelSpinBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>natStunRadioButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>natKeepaliveCheckBox</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>displayLineEdit</tabstop>
+ <tabstop>usernameLineEdit</tabstop>
+ <tabstop>domainLineEdit</tabstop>
+ <tabstop>organizationLineEdit</tabstop>
+ <tabstop>authRealmLineEdit</tabstop>
+ <tabstop>authNameLineEdit</tabstop>
+ <tabstop>authPasswordLineEdit</tabstop>
+ <tabstop>authAkaOpLineEdit</tabstop>
+ <tabstop>authAkaAmfLineEdit</tabstop>
+ <tabstop>registrarLineEdit</tabstop>
+ <tabstop>expirySpinBox</tabstop>
+ <tabstop>regAtStartupCheckBox</tabstop>
+ <tabstop>regAddQvalueCheckBox</tabstop>
+ <tabstop>regQvalueLineEdit</tabstop>
+ <tabstop>useProxyCheckBox</tabstop>
+ <tabstop>proxyLineEdit</tabstop>
+ <tabstop>allRequestsCheckBox</tabstop>
+ <tabstop>proxyNonResolvableCheckBox</tabstop>
+ <tabstop>vmAddressLineEdit</tabstop>
+ <tabstop>mwiTypeComboBox</tabstop>
+ <tabstop>mwiUserLineEdit</tabstop>
+ <tabstop>mwiServerLineEdit</tabstop>
+ <tabstop>mwiViaProxyCheckBox</tabstop>
+ <tabstop>mwiDurationSpinBox</tabstop>
+ <tabstop>imMaxSessionsSpinBox</tabstop>
+ <tabstop>isComposingCheckBox</tabstop>
+ <tabstop>presPublishCheckBox</tabstop>
+ <tabstop>presPublishTimeSpinBox</tabstop>
+ <tabstop>presSubscribeTimeSpinBox</tabstop>
+ <tabstop>rtpAudioTabWidget</tabstop>
+ <tabstop>availCodecListBox</tabstop>
+ <tabstop>addCodecPushButton</tabstop>
+ <tabstop>rmvCodecPushButton</tabstop>
+ <tabstop>activeCodecListBox</tabstop>
+ <tabstop>upCodecPushButton</tabstop>
+ <tabstop>downCodecPushButton</tabstop>
+ <tabstop>ptimeSpinBox</tabstop>
+ <tabstop>inFarEndCodecPrefCheckBox</tabstop>
+ <tabstop>outFarEndCodecPrefCheckBox</tabstop>
+ <tabstop>spxDspAgcCheckBox</tabstop>
+ <tabstop>spxDspAgcLevelSpinBox</tabstop>
+ <tabstop>spxDspVadCheckBox</tabstop>
+ <tabstop>spxDspNrdCheckBox</tabstop>
+ <tabstop>spxDspAecCheckBox</tabstop>
+ <tabstop>ilbcPayloadSpinBox</tabstop>
+ <tabstop>ilbcPayloadSizeComboBox</tabstop>
+ <tabstop>spxVbrCheckBox</tabstop>
+ <tabstop>spxDtxCheckBox</tabstop>
+ <tabstop>spxPenhCheckBox</tabstop>
+ <tabstop>spxQualitySpinBox</tabstop>
+ <tabstop>spxComplexitySpinBox</tabstop>
+ <tabstop>spxNbPayloadSpinBox</tabstop>
+ <tabstop>spxWbPayloadSpinBox</tabstop>
+ <tabstop>spxUwbPayloadSpinBox</tabstop>
+ <tabstop>g72616PayloadSpinBox</tabstop>
+ <tabstop>g72624PayloadSpinBox</tabstop>
+ <tabstop>g72632PayloadSpinBox</tabstop>
+ <tabstop>g72640PayloadSpinBox</tabstop>
+ <tabstop>g726PackComboBox</tabstop>
+ <tabstop>dtmfTransportComboBox</tabstop>
+ <tabstop>dtmfPayloadTypeSpinBox</tabstop>
+ <tabstop>dtmfDurationSpinBox</tabstop>
+ <tabstop>dtmfPauseSpinBox</tabstop>
+ <tabstop>dtmfVolumeSpinBox</tabstop>
+ <tabstop>sipProtoclTabWidget</tabstop>
+ <tabstop>holdVariantComboBox</tabstop>
+ <tabstop>maxForwardsCheckBox</tabstop>
+ <tabstop>missingContactCheckBox</tabstop>
+ <tabstop>regTimeCheckBox</tabstop>
+ <tabstop>compactHeadersCheckBox</tabstop>
+ <tabstop>multiValuesListCheckBox</tabstop>
+ <tabstop>useDomainInContactCheckBox</tabstop>
+ <tabstop>allowSdpChangeCheckBox</tabstop>
+ <tabstop>allowRedirectionCheckBox</tabstop>
+ <tabstop>askUserRedirectCheckBox</tabstop>
+ <tabstop>maxRedirectSpinBox</tabstop>
+ <tabstop>ext100relComboBox</tabstop>
+ <tabstop>extReplacesCheckBox</tabstop>
+ <tabstop>allowReferCheckBox</tabstop>
+ <tabstop>askUserReferCheckBox</tabstop>
+ <tabstop>refereeHoldCheckBox</tabstop>
+ <tabstop>referrerHoldCheckBox</tabstop>
+ <tabstop>refreshReferSubCheckBox</tabstop>
+ <tabstop>referAorCheckBox</tabstop>
+ <tabstop>pPreferredIdCheckBox</tabstop>
+ <tabstop>sipTransportComboBox</tabstop>
+ <tabstop>udpThresholdSpinBox</tabstop>
+ <tabstop>natNoneRadioButton</tabstop>
+ <tabstop>natStaticRadioButton</tabstop>
+ <tabstop>publicIPLineEdit</tabstop>
+ <tabstop>natStunRadioButton</tabstop>
+ <tabstop>stunServerLineEdit</tabstop>
+ <tabstop>persistentTcpCheckBox</tabstop>
+ <tabstop>displayTelUserCheckBox</tabstop>
+ <tabstop>numericalUserIsTelCheckBox</tabstop>
+ <tabstop>removeSpecialCheckBox</tabstop>
+ <tabstop>specialLineEdit</tabstop>
+ <tabstop>useTelUriCheckBox</tabstop>
+ <tabstop>conversionListView</tabstop>
+ <tabstop>upConversionPushButton</tabstop>
+ <tabstop>downConversionPushButton</tabstop>
+ <tabstop>addConversionPushButton</tabstop>
+ <tabstop>removePushButton</tabstop>
+ <tabstop>editConversionPushButton</tabstop>
+ <tabstop>testConversionLineEdit</tabstop>
+ <tabstop>testConversionPushButton</tabstop>
+ <tabstop>tmrNoanswerSpinBox</tabstop>
+ <tabstop>tmrNatKeepaliveSpinBox</tabstop>
+ <tabstop>ringtoneLineEdit</tabstop>
+ <tabstop>ringbackLineEdit</tabstop>
+ <tabstop>openRingtoneToolButton</tabstop>
+ <tabstop>openRingbackToolButton</tabstop>
+ <tabstop>incomingCallScriptLineEdit</tabstop>
+ <tabstop>openIncomingCallScriptToolButton</tabstop>
+ <tabstop>inCallAnsweredLineEdit</tabstop>
+ <tabstop>openInCallAnsweredToolButton</tabstop>
+ <tabstop>inCallFailedLineEdit</tabstop>
+ <tabstop>openInCallFailedToolButton</tabstop>
+ <tabstop>outCallLineEdit</tabstop>
+ <tabstop>openOutCallToolButton</tabstop>
+ <tabstop>outCallAnsweredLineEdit</tabstop>
+ <tabstop>openOutCallAnsweredToolButton</tabstop>
+ <tabstop>outCallFailedLineEdit</tabstop>
+ <tabstop>openOutCallFailedToolButton</tabstop>
+ <tabstop>localReleaseLineEdit</tabstop>
+ <tabstop>openLocalReleaseToolButton</tabstop>
+ <tabstop>remoteReleaseLineEdit</tabstop>
+ <tabstop>openRemoteReleaseToolButton</tabstop>
+ <tabstop>zrtpEnabledCheckBox</tabstop>
+ <tabstop>zrtpSendIfSupportedCheckBox</tabstop>
+ <tabstop>zrtpSdpCheckBox</tabstop>
+ <tabstop>zrtpGoClearWarningCheckBox</tabstop>
+ <tabstop>okPushButton</tabstop>
+ <tabstop>cancelPushButton</tabstop>
+ <tabstop>profileComboBox</tabstop>
+ <tabstop>categoryListBox</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">qlistbox.h</include>
+ <include location="local" impldecl="in implementation">qlineedit.h</include>
+ <include location="local" impldecl="in implementation">qlabel.h</include>
+ <include location="local" impldecl="in implementation">qcombobox.h</include>
+ <include location="local" impldecl="in implementation">qspinbox.h</include>
+ <include location="local" impldecl="in implementation">qregexp.h</include>
+ <include location="local" impldecl="in implementation">sdp/sdp.h</include>
+ <include location="local" impldecl="in implementation">qvalidator.h</include>
+ <include location="local" impldecl="in implementation">protocol.h</include>
+ <include location="local" impldecl="in implementation">qmessagebox.h</include>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">qfiledialog.h</include>
+ <include location="local" impldecl="in implementation">qfileinfo.h</include>
+ <include location="local" impldecl="in implementation">qstringlist.h</include>
+ <include location="local" impldecl="in implementation">twinkle_config.h</include>
+ <include location="local" impldecl="in implementation">qlistview.h</include>
+ <include location="local" impldecl="in implementation">numberconversionform.h</include>
+ <include location="local" impldecl="in implementation">util.h</include>
+ <include location="local" impldecl="in declaration">user.h</include>
+ <include location="local" impldecl="in declaration">qvaluelist.h</include>
+ <include location="global" impldecl="in declaration">map</include>
+ <include location="global" impldecl="in declaration">list</include>
+ <include location="local" impldecl="in implementation">userprofileform.ui.h</include>
+</includes>
+<variables>
+ <variable access="private">map&lt;t_user *, int&gt; map_last_cat;</variable>
+ <variable access="private">t_user *current_profile;</variable>
+ <variable access="private">int current_profile_idx;</variable>
+ <variable access="private">list&lt;t_user *&gt; profile_list;</variable>
+</variables>
+<signals>
+ <signal>stunServerChanged(t_user *)</signal>
+ <signal>authCredentialsChanged(t_user *, const string &amp;)</signal>
+ <signal>sipUserChanged(t_user *)</signal>
+ <signal>success()</signal>
+ <signal>mwiChangeUnsubscribe(t_user *)</signal>
+ <signal>mwiChangeSubscribe(t_user *)</signal>
+</signals>
+<slots>
+ <slot>showCategory( int index )</slot>
+ <slot>populate()</slot>
+ <slot>initProfileList( list&lt;t_user *&gt; profiles, QString show_profile_name )</slot>
+ <slot>show( list&lt;t_user *&gt; profiles, QString show_profile )</slot>
+ <slot>validate()</slot>
+ <slot>changeProfile( const QString &amp; profileName )</slot>
+ <slot>chooseFile( QLineEdit * qle, const QString &amp; filter, const QString &amp; caption )</slot>
+ <slot>chooseRingtone()</slot>
+ <slot>chooseRingback()</slot>
+ <slot>chooseIncomingCallScript()</slot>
+ <slot>chooseInCallAnsweredScript()</slot>
+ <slot>chooseInCallFailedScript()</slot>
+ <slot>chooseOutgoingCallScript()</slot>
+ <slot>chooseOutCallAnsweredScript()</slot>
+ <slot>chooseOutCallFailedScript()</slot>
+ <slot>chooseLocalReleaseScript()</slot>
+ <slot>chooseRemoteReleaseScript()</slot>
+ <slot>addCodec()</slot>
+ <slot>removeCodec()</slot>
+ <slot>upCodec()</slot>
+ <slot>downCodec()</slot>
+ <slot>upConversion()</slot>
+ <slot>downConversion()</slot>
+ <slot>addConversion()</slot>
+ <slot>editConversion()</slot>
+ <slot>removeConversion()</slot>
+ <slot>testConversion()</slot>
+ <slot>changeMWIType( int idxMWIType )</slot>
+ <slot>changeSipTransportProtocol( int idx )</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function returnType="t_audio_codec">label2codec( const QString &amp; label )</function>
+ <function returnType="QString">codec2label( t_audio_codec &amp; codec )</function>
+ <function returnType="int">ext_support2indexComboItem( t_ext_support ext )</function>
+ <function returnType="t_ext_support">indexComboItem2ext_support( int index )</function>
+ <function returnType="int">exec( list&lt;t_user *&gt; profiles, QString show_profile )</function>
+ <function returnType="bool">check_dynamic_payload( QSpinBox * spb, QValueList&lt;int&gt; &amp; checked_list )</function>
+ <function returnType="list&lt;t_number_conversion&gt;">get_number_conversions()</function>
+ <function returnType="bool">validateValues()</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/userprofileform.ui.h b/src/gui/userprofileform.ui.h
new file mode 100644
index 0000000..ad9b5f5
--- /dev/null
+++ b/src/gui/userprofileform.ui.h
@@ -0,0 +1,1458 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+
+// Indices of categories in the category list box
+#define idxCatUser 0
+#define idxCatSipServer 1
+#define idxCatVoiceMail 2
+#define idxCatIM 3
+#define idxCatPresence 4
+#define idxCatRtpAudio 5
+#define idxCatSipProtocol 6
+#define idxCatNat 7
+#define idxCatAddrFmt 8
+#define idxCatTimers 9
+#define idxCatRingTones 10
+#define idxCatScripts 11
+#define idxCatSecurity 12
+
+// Indices of call hold variants in the call hold variant list box
+#define idxHoldRfc2543 0
+#define idxHoldRfc3264 1
+
+// Indices of SIP extension support types in the list box
+#define idxExtDisabled 0
+#define idxExtSupported 1
+#define idxExtRequired 2
+#define idxExtPreferred 3
+
+// Indices of RTP audio tabs
+#define idxRtpCodecs 0
+#define idxRtpPreprocessing 1
+#define idxRtpIlbc 2
+#define idxRtpSpeex 3
+#define idxRtpDtmf 4
+
+// Codec labels
+#define labelCodecG711a "G.711 A-law"
+#define labelCodecG711u "G.711 u-law"
+#define labelCodecGSM "GSM"
+#define labelCodecSpeexNb "speex-nb (8 kHz)"
+#define labelCodecSpeexWb "speex-wb (16 kHz)"
+#define labelCodecSpeexUwb "speex-uwb (32 kHz)"
+#define labelCodecIlbc "iLBC"
+#define labelCodecG726_16 "G.726 16 kbps"
+#define labelCodecG726_24 "G.726 24 kbps"
+#define labelCodecG726_32 "G.726 32 kbps"
+#define labelCodecG726_40 "G.726 40 kbps"
+
+// Indices of iLBC modes
+#define idxIlbcMode20 0
+#define idxIlbcMode30 1
+
+// Indices of G.726 packing modes
+#define idxG726PackRfc3551 0
+#define idxG726PackAal2 1
+
+// Indices of DTMF transport modes in the DTMF transport list box
+#define idxDtmfAuto 0
+#define idxDtmfRfc2833 1
+#define idxDtmfInband 2
+#define idxDtmfInfo 3
+
+// Columns in the number conversion list view
+#define colExpr 0
+#define colReplace 1
+
+// MWI type indices
+#define idxMWIUnsollicited 0
+#define idxMWISollicited 1
+
+// SIP transport protocol indices
+#define idxSipTransportAuto 0
+#define idxSipTransportUDP 1
+#define idxSipTransportTCP 2
+
+void UserProfileForm::init()
+{
+ QRegExp rxNoSpace("\\S*");
+ QRegExp rxNoAtSign("[^@]*");
+ QRegExp rxQvalue("(0\\.[0-9]{0,3})|(1\\.0{0,3})");
+ QRegExp rxAkaOpValue("[a-zA-Z0-9]{0,32}");
+ QRegExp rxAkaAmfValue("[a-zA-Z0-9]{0,4}");
+
+ // Set validators
+ // USER
+ domainLineEdit->setValidator(new QRegExpValidator(rxNoSpace, this));
+ authAkaOpLineEdit->setValidator(new QRegExpValidator(rxAkaOpValue, this));
+ authAkaAmfLineEdit->setValidator(new QRegExpValidator(rxAkaAmfValue, this));
+
+ // SIP SERVER
+ registrarLineEdit->setValidator(new QRegExpValidator(rxNoSpace, this));
+ regQvalueLineEdit->setValidator(new QRegExpValidator(rxQvalue, this));
+ proxyLineEdit->setValidator(new QRegExpValidator(rxNoSpace, this));
+
+ // Voice mail
+ mwiServerLineEdit->setValidator(new QRegExpValidator(rxNoSpace, this));
+
+ // NAT
+ publicIPLineEdit->setValidator(new QRegExpValidator(rxNoSpace, this));
+
+ // Address format
+ testConversionLineEdit->setValidator(new QRegExpValidator(rxNoAtSign, this));
+
+#ifndef HAVE_SPEEX
+ // Speex & (Speex) Preprocessing
+ speexGroupBox->hide();
+ preprocessingGroupBox->hide();
+ rtpAudioTabWidget->setTabEnabled(rtpAudioTabWidget->page(idxRtpSpeex), false);
+ rtpAudioTabWidget->setTabEnabled(rtpAudioTabWidget->page(idxRtpPreprocessing), false);
+#endif
+#ifndef HAVE_ILBC
+ // iLBC
+ ilbcGroupBox->hide();
+ rtpAudioTabWidget->setTabEnabled(rtpAudioTabWidget->page(idxRtpIlbc), false);
+#endif
+#ifndef HAVE_ZRTP
+ // Zrtp
+ zrtpEnabledCheckBox->setEnabled(false);
+ zrtpSettingsGroupBox->hide();
+#endif
+
+ // Set toolbutton icons for disabled options.
+ QIconSet i;
+ i = openRingtoneToolButton->iconSet();
+ i.setPixmap(QPixmap::fromMimeSource("fileopen-disabled.png"),
+ QIconSet::Automatic, QIconSet::Disabled);
+ openRingtoneToolButton->setIconSet(i);
+ openRingbackToolButton->setIconSet(i);
+ openIncomingCallScriptToolButton->setIconSet(i);
+}
+
+void UserProfileForm::showCategory( int index )
+{
+ if (index == idxCatUser) {
+ settingsWidgetStack->raiseWidget(pageUser);
+ } else if (index == idxCatSipServer) {
+ settingsWidgetStack->raiseWidget(pageSipServer);
+ } else if (index == idxCatVoiceMail) {
+ settingsWidgetStack->raiseWidget(pageVoiceMail);
+ } else if (index == idxCatIM) {
+ settingsWidgetStack->raiseWidget(pageIM);
+ } else if (index == idxCatPresence) {
+ settingsWidgetStack->raiseWidget(pagePresence);
+ } else if (index == idxCatRtpAudio) {
+ settingsWidgetStack->raiseWidget(pageRtpAudio);
+ } else if (index == idxCatSipProtocol) {
+ settingsWidgetStack->raiseWidget(pageSipProtocol);
+ } else if (index == idxCatNat) {
+ settingsWidgetStack->raiseWidget(pageNat);
+ } else if (index == idxCatAddrFmt) {
+ settingsWidgetStack->raiseWidget(pageAddressFormat);
+ } else if (index == idxCatTimers) {
+ settingsWidgetStack->raiseWidget(pageTimers);
+ } else if (index == idxCatRingTones) {
+ settingsWidgetStack->raiseWidget(pageRingTones);
+ } else if (index == idxCatScripts) {
+ settingsWidgetStack->raiseWidget(pageScripts);
+ } else if (index == idxCatSecurity) {
+ settingsWidgetStack->raiseWidget(pageSecurity);
+ }
+}
+
+// Convert a label to a codec
+t_audio_codec UserProfileForm::label2codec(const QString &label) {
+ if (label == labelCodecG711a) {
+ return CODEC_G711_ALAW;
+ } else if (label == labelCodecG711u) {
+ return CODEC_G711_ULAW;
+ } else if (label == labelCodecGSM) {
+ return CODEC_GSM;
+ } else if (label == labelCodecSpeexNb) {
+ return CODEC_SPEEX_NB;
+ } else if (label == labelCodecSpeexWb) {
+ return CODEC_SPEEX_WB;
+ } else if (label == labelCodecSpeexUwb) {
+ return CODEC_SPEEX_UWB;
+ } else if (label == labelCodecIlbc) {
+ return CODEC_ILBC;
+ } else if (label == labelCodecG726_16) {
+ return CODEC_G726_16;
+ } else if (label == labelCodecG726_24) {
+ return CODEC_G726_24;
+ } else if (label == labelCodecG726_32) {
+ return CODEC_G726_32;
+ } else if (label == labelCodecG726_40) {
+ return CODEC_G726_40;
+ }
+ return CODEC_NULL;
+}
+
+// Convert a codec to a label
+QString UserProfileForm::codec2label(t_audio_codec &codec) {
+ switch (codec) {
+ case CODEC_G711_ALAW:
+ return labelCodecG711a;
+ case CODEC_G711_ULAW:
+ return labelCodecG711u;
+ case CODEC_GSM:
+ return labelCodecGSM;
+ case CODEC_SPEEX_NB:
+ return labelCodecSpeexNb;
+ case CODEC_SPEEX_WB:
+ return labelCodecSpeexWb;
+ case CODEC_SPEEX_UWB:
+ return labelCodecSpeexUwb;
+ case CODEC_ILBC:
+ return labelCodecIlbc;
+ case CODEC_G726_16:
+ return labelCodecG726_16;
+ case CODEC_G726_24:
+ return labelCodecG726_24;
+ case CODEC_G726_32:
+ return labelCodecG726_32;
+ case CODEC_G726_40:
+ return labelCodecG726_40;
+ default:
+ return "";
+ }
+}
+
+// Convert t_ext_support to an index in the SIP extension combo box
+int UserProfileForm::ext_support2indexComboItem(t_ext_support ext) {
+ switch(ext) {
+ case EXT_DISABLED:
+ return idxExtDisabled;
+ case EXT_SUPPORTED:
+ return idxExtSupported;
+ case EXT_REQUIRED:
+ return idxExtRequired;
+ case EXT_PREFERRED:
+ return idxExtPreferred;
+ default:
+ return idxExtDisabled;
+ }
+
+ return idxExtDisabled;
+}
+
+t_ext_support UserProfileForm::indexComboItem2ext_support(int index) {
+ switch(index) {
+ case idxExtDisabled:
+ return EXT_DISABLED;
+ case idxExtSupported:
+ return EXT_SUPPORTED;
+ case idxExtRequired:
+ return EXT_REQUIRED;
+ case idxExtPreferred:
+ return EXT_PREFERRED;
+ }
+
+ return EXT_DISABLED;
+}
+
+// Populate the form
+void UserProfileForm::populate()
+{
+ QString s;
+
+ // Set user profile name in the titlebar
+ s = PRODUCT_NAME;
+ s.append(" - ").append(tr("User profile:")).append(" ");
+ s.append(current_profile->get_profile_name().c_str());
+ setCaption(s);
+
+ // Select the User category
+ categoryListBox->setSelected(idxCatUser, true);
+ settingsWidgetStack->raiseWidget(pageUser);
+
+ // Set focus on first field
+ displayLineEdit->setFocus();
+
+ // Set the values of the current_profile object in the form
+ // USER
+ displayLineEdit->setText(current_profile->get_display(false).c_str());
+ usernameLineEdit->setText(current_profile->get_name().c_str());
+ domainLineEdit->setText(current_profile->get_domain().c_str());
+ organizationLineEdit->setText(current_profile->get_organization().c_str());
+ authRealmLineEdit->setText(current_profile->get_auth_realm().c_str());
+ authNameLineEdit->setText(current_profile->get_auth_name().c_str());
+ authPasswordLineEdit->setText(current_profile->get_auth_pass().c_str());
+
+ uint8 aka_op[AKA_OPLEN];
+ current_profile->get_auth_aka_op(aka_op);
+ authAkaOpLineEdit->setText(binary2hex(aka_op, AKA_OPLEN).c_str());
+
+ uint8 aka_amf[AKA_AMFLEN];
+ current_profile->get_auth_aka_amf(aka_amf);
+ authAkaAmfLineEdit->setText(binary2hex(aka_amf, AKA_AMFLEN).c_str());
+
+ // SIP SERVER
+ registrarLineEdit->setText(current_profile->get_registrar().encode_noscheme().c_str());
+ expirySpinBox->setValue(current_profile->get_registration_time());
+ regAtStartupCheckBox->setChecked(current_profile->get_register_at_startup());
+ regAddQvalueCheckBox->setChecked(current_profile->get_reg_add_qvalue());
+ regQvalueLineEdit->setEnabled(current_profile->get_reg_add_qvalue());
+ regQvalueLineEdit->setText(float2str(current_profile->get_reg_qvalue(), 3).c_str());
+ useProxyCheckBox->setChecked(current_profile->get_use_outbound_proxy());
+ proxyTextLabel->setEnabled(current_profile->get_use_outbound_proxy());
+ proxyLineEdit->setEnabled(current_profile->get_use_outbound_proxy());
+ if (current_profile->get_use_outbound_proxy()) {
+ proxyLineEdit->setText(current_profile->
+ get_outbound_proxy().encode_noscheme().c_str());
+ } else {
+ proxyLineEdit->clear();
+ }
+ allRequestsCheckBox->setChecked(current_profile->get_all_requests_to_proxy());
+ allRequestsCheckBox->setEnabled(current_profile->get_use_outbound_proxy());
+ proxyNonResolvableCheckBox->setChecked(current_profile->get_non_resolvable_to_proxy());
+ proxyNonResolvableCheckBox->setEnabled(current_profile->get_use_outbound_proxy());
+
+ // VOICE MAIL
+ vmAddressLineEdit->setText(current_profile->get_mwi_vm_address().c_str());
+ if (current_profile->get_mwi_sollicited()) {
+ mwiTypeComboBox->setCurrentItem(idxMWISollicited);
+ mwiSollicitedGroupBox->setEnabled(true);
+ } else {
+ mwiTypeComboBox->setCurrentItem(idxMWIUnsollicited);
+ mwiSollicitedGroupBox->setEnabled(false);
+ }
+ mwiUserLineEdit->setText(current_profile->get_mwi_user().c_str());
+ mwiServerLineEdit->setText(current_profile->
+ get_mwi_server().encode_noscheme().c_str());
+ mwiViaProxyCheckBox->setChecked(current_profile->get_mwi_via_proxy());
+ mwiDurationSpinBox->setValue(current_profile->get_mwi_subscription_time());
+
+ // INSTANT MESSAGE
+ imMaxSessionsSpinBox->setValue(current_profile->get_im_max_sessions());
+ isComposingCheckBox->setChecked(current_profile->get_im_send_iscomposing());
+
+ // PRESENCE
+ presPublishCheckBox->setChecked(current_profile->get_pres_publish_startup());
+ presPublishTimeSpinBox->setValue(current_profile->get_pres_publication_time());
+ presSubscribeTimeSpinBox->setValue(current_profile->get_pres_subscription_time());
+
+ // RTP AUDIO
+ // Codecs
+ QStringList allCodecs;
+ allCodecs.append(labelCodecG711a);
+ allCodecs.append(labelCodecG711u);
+ allCodecs.append(labelCodecGSM);
+#ifdef HAVE_SPEEX
+ allCodecs.append(labelCodecSpeexNb);
+ allCodecs.append(labelCodecSpeexWb);
+ allCodecs.append(labelCodecSpeexUwb);
+#endif
+#ifdef HAVE_ILBC
+ allCodecs.append(labelCodecIlbc);
+#endif
+ allCodecs.append(labelCodecG726_16);
+ allCodecs.append(labelCodecG726_24);
+ allCodecs.append(labelCodecG726_32);
+ allCodecs.append(labelCodecG726_40);
+ activeCodecListBox->clear();
+ list<t_audio_codec> audio_codecs = current_profile->get_codecs();
+ for (list<t_audio_codec>::iterator i = audio_codecs.begin(); i != audio_codecs.end(); i++)
+ {
+ activeCodecListBox->insertItem(codec2label(*i));
+ allCodecs.remove(codec2label(*i));
+ }
+ availCodecListBox->clear();
+ if (!allCodecs.empty()) availCodecListBox->insertStringList(allCodecs);
+
+ // G.711/G.726 ptime
+ ptimeSpinBox->setValue(current_profile->get_ptime());
+
+ // Codec preference
+ inFarEndCodecPrefCheckBox->setChecked(current_profile->get_in_obey_far_end_codec_pref());
+ outFarEndCodecPrefCheckBox->setChecked(current_profile->get_out_obey_far_end_codec_pref());
+
+ // Speex preprocessing and AEC
+ spxDspVadCheckBox->setChecked(current_profile->get_speex_dsp_vad());
+ spxDspAgcCheckBox->setChecked(current_profile->get_speex_dsp_agc());
+ spxDspAecCheckBox->setChecked(current_profile->get_speex_dsp_aec());
+ spxDspNrdCheckBox->setChecked(current_profile->get_speex_dsp_nrd());
+ spxDspAgcLevelSpinBox->setValue(current_profile->get_speex_dsp_agc_level());
+ spxDspAgcLevelTextLabel->setEnabled(current_profile->get_speex_dsp_agc());
+ spxDspAgcLevelSpinBox->setEnabled(current_profile->get_speex_dsp_agc());
+
+ // Speex ([en/de]coding)
+ spxVbrCheckBox->setChecked(current_profile->get_speex_bit_rate_type() == BIT_RATE_VBR);
+ spxDtxCheckBox->setChecked(current_profile->get_speex_dtx());
+ spxPenhCheckBox->setChecked(current_profile->get_speex_penh());
+ spxQualitySpinBox->setValue(current_profile->get_speex_quality());
+ spxComplexitySpinBox->setValue(current_profile->get_speex_complexity());
+ spxNbPayloadSpinBox->setValue(current_profile->get_speex_nb_payload_type());
+ spxWbPayloadSpinBox->setValue(current_profile->get_speex_wb_payload_type());
+ spxUwbPayloadSpinBox->setValue(current_profile->get_speex_uwb_payload_type());
+
+ // iLBC
+ ilbcPayloadSpinBox->setValue(current_profile->get_ilbc_payload_type());
+
+ if (current_profile->get_ilbc_mode() == 20) {
+ ilbcPayloadSizeComboBox->setCurrentItem(idxIlbcMode20);
+ } else {
+ ilbcPayloadSizeComboBox->setCurrentItem(idxIlbcMode30);
+ }
+
+ // G.726
+ g72616PayloadSpinBox->setValue(current_profile->get_g726_16_payload_type());
+ g72624PayloadSpinBox->setValue(current_profile->get_g726_24_payload_type());
+ g72632PayloadSpinBox->setValue(current_profile->get_g726_32_payload_type());
+ g72640PayloadSpinBox->setValue(current_profile->get_g726_40_payload_type());
+
+ if (current_profile->get_g726_packing() == G726_PACK_RFC3551) {
+ g726PackComboBox->setCurrentItem(idxG726PackRfc3551);
+ } else {
+ g726PackComboBox->setCurrentItem(idxG726PackAal2);
+ }
+
+ // DTMF
+ switch (current_profile->get_dtmf_transport()) {
+ case DTMF_RFC2833:
+ dtmfTransportComboBox->setCurrentItem(idxDtmfRfc2833);
+ break;
+ case DTMF_INBAND:
+ dtmfTransportComboBox->setCurrentItem(idxDtmfInband);
+ break;
+ case DTMF_INFO:
+ dtmfTransportComboBox->setCurrentItem(idxDtmfInfo);
+ break;
+ default:
+ dtmfTransportComboBox->setCurrentItem(idxDtmfAuto);
+ break;
+ }
+
+ dtmfPayloadTypeSpinBox->setValue(current_profile->get_dtmf_payload_type());
+ dtmfDurationSpinBox->setValue(current_profile->get_dtmf_duration());
+ dtmfPauseSpinBox->setValue(current_profile->get_dtmf_pause());
+ dtmfVolumeSpinBox->setValue(-(current_profile->get_dtmf_volume()));
+
+ // SIP PROTOCOL
+ switch (current_profile->get_hold_variant()) {
+ case HOLD_RFC2543:
+ holdVariantComboBox->setCurrentItem(idxHoldRfc2543);
+ break;
+ default:
+ holdVariantComboBox->setCurrentItem(idxHoldRfc3264);
+ break;
+ }
+
+ maxForwardsCheckBox->setChecked(current_profile->get_check_max_forwards());
+ missingContactCheckBox->setChecked(current_profile->get_allow_missing_contact_reg());
+ regTimeCheckBox->setChecked(current_profile->get_registration_time_in_contact());
+ compactHeadersCheckBox->setChecked(current_profile->get_compact_headers());
+ multiValuesListCheckBox->setChecked(
+ current_profile->get_encode_multi_values_as_list());
+ useDomainInContactCheckBox->setChecked(
+ current_profile->get_use_domain_in_contact());
+ allowSdpChangeCheckBox->setChecked(current_profile->get_allow_sdp_change());
+ allowRedirectionCheckBox->setChecked(current_profile->get_allow_redirection());
+ askUserRedirectCheckBox->setEnabled(current_profile->get_allow_redirection());
+ askUserRedirectCheckBox->setChecked(current_profile->get_ask_user_to_redirect());
+ maxRedirectTextLabel->setEnabled(current_profile->get_allow_redirection());
+ maxRedirectSpinBox->setEnabled(current_profile->get_allow_redirection());
+ maxRedirectSpinBox->setValue(current_profile->get_max_redirections());
+ ext100relComboBox->setCurrentItem(
+ ext_support2indexComboItem(current_profile->get_ext_100rel()));
+ extReplacesCheckBox->setChecked(current_profile->get_ext_replaces());
+ allowReferCheckBox->setChecked(current_profile->get_allow_refer());
+ askUserReferCheckBox->setEnabled(current_profile->get_allow_refer());
+ askUserReferCheckBox->setChecked(current_profile->get_ask_user_to_refer());
+ refereeHoldCheckBox->setEnabled(current_profile->get_allow_refer());
+ refereeHoldCheckBox->setChecked(current_profile->get_referee_hold());
+ referrerHoldCheckBox->setChecked(current_profile->get_referrer_hold());
+ refreshReferSubCheckBox->setChecked(current_profile->get_auto_refresh_refer_sub());
+ referAorCheckBox->setChecked(current_profile->get_attended_refer_to_aor());
+ transferConsultInprogCheckBox->setChecked(
+ current_profile->get_allow_transfer_consultation_inprog());
+ pPreferredIdCheckBox->setChecked(current_profile->get_send_p_preferred_id());
+
+ // Transport/NAT
+ switch (current_profile->get_sip_transport()) {
+ case SIP_TRANS_UDP:
+ sipTransportComboBox->setCurrentItem(idxSipTransportUDP);
+ break;
+ case SIP_TRANS_TCP:
+ sipTransportComboBox->setCurrentItem(idxSipTransportTCP);
+ break;
+ default:
+ sipTransportComboBox->setCurrentItem(idxSipTransportAuto);
+ break;
+ }
+
+ udpThresholdSpinBox->setValue(current_profile->get_sip_transport_udp_threshold());
+ udpThresholdTextLabel->setEnabled(current_profile->get_sip_transport() == SIP_TRANS_AUTO);
+ udpThresholdSpinBox->setEnabled(current_profile->get_sip_transport() == SIP_TRANS_AUTO);
+
+ if (current_profile->get_use_nat_public_ip()) {
+ natStaticRadioButton->setChecked(true);
+ } else if (current_profile->get_use_stun()) {
+ natStunRadioButton->setChecked(true);
+ } else {
+ natNoneRadioButton->setChecked(true);
+ }
+
+ publicIPTextLabel->setEnabled(current_profile->get_use_nat_public_ip());
+ publicIPLineEdit->setEnabled(current_profile->get_use_nat_public_ip());
+ publicIPLineEdit->setText(current_profile->get_nat_public_ip().c_str());
+ stunServerTextLabel->setEnabled(current_profile->get_use_stun());
+ stunServerLineEdit->setEnabled(current_profile->get_use_stun());
+ stunServerLineEdit->setText(current_profile->get_stun_server().
+ encode_noscheme().c_str());
+ persistentTcpCheckBox->setChecked(current_profile->get_persistent_tcp());
+ persistentTcpCheckBox->setEnabled(current_profile->get_sip_transport() == SIP_TRANS_TCP);
+ natKeepaliveCheckBox->setChecked(current_profile->get_enable_nat_keepalive());
+ natKeepaliveCheckBox->setDisabled(current_profile->get_use_stun());
+
+ // ADDRESS FORMAT
+ displayTelUserCheckBox->setChecked(current_profile->get_display_useronly_phone());
+ numericalUserIsTelCheckBox->setChecked(
+ current_profile->get_numerical_user_is_phone());
+ removeSpecialCheckBox->setChecked(
+ current_profile->get_remove_special_phone_symbols());
+ specialLineEdit->setText(current_profile->get_special_phone_symbols().c_str());
+ useTelUriCheckBox->setChecked(current_profile->get_use_tel_uri_for_phone());
+
+ conversionListView->clear();
+ conversionListView->setSorting(-1);
+ list<t_number_conversion> conversions = current_profile->get_number_conversions();
+ for (list<t_number_conversion>::reverse_iterator i = conversions.rbegin(); i != conversions.rend(); i++)
+ {
+ new QListViewItem(conversionListView, i->re.str().c_str(), i->fmt.c_str());
+ }
+
+ // TIMERS
+ tmrNoanswerSpinBox->setValue(current_profile->get_timer_noanswer());
+ tmrNatKeepaliveSpinBox->setValue(current_profile->get_timer_nat_keepalive());
+
+ // RING TONES
+ ringtoneLineEdit->setText(current_profile->get_ringtone_file().c_str());
+ ringbackLineEdit->setText(current_profile->get_ringback_file().c_str());
+
+ // SCRIPTS
+ incomingCallScriptLineEdit->setText(current_profile->get_script_incoming_call().c_str());
+ inCallAnsweredLineEdit->setText(current_profile->get_script_in_call_answered().c_str());
+ inCallFailedLineEdit->setText(current_profile->get_script_in_call_failed().c_str());
+ outCallLineEdit->setText(current_profile->get_script_outgoing_call().c_str());
+ outCallAnsweredLineEdit->setText(current_profile->get_script_out_call_answered().c_str());
+ outCallFailedLineEdit->setText(current_profile->get_script_out_call_failed().c_str());
+ localReleaseLineEdit->setText(current_profile->get_script_local_release().c_str());
+ remoteReleaseLineEdit->setText(current_profile->get_script_remote_release().c_str());
+
+ // Security
+ zrtpEnabledCheckBox->setChecked(current_profile->get_zrtp_enabled());
+ zrtpSettingsGroupBox->setEnabled(current_profile->get_zrtp_enabled());
+ zrtpSendIfSupportedCheckBox->setChecked(current_profile->get_zrtp_send_if_supported());
+ zrtpSdpCheckBox->setChecked(current_profile->get_zrtp_sdp());
+ zrtpGoClearWarningCheckBox->setChecked(current_profile->get_zrtp_goclear_warning());
+}
+
+void UserProfileForm::initProfileList(list<t_user *> profiles, QString show_profile_name)
+{
+ profile_list = profiles;
+
+ // Initialize user profile combo box
+ current_profile_idx = -1;
+ profileComboBox->clear();
+
+ t_user *show_profile = NULL;
+ int show_idx = 0;
+ int idx = 0;
+ for (list<t_user *>::iterator i = profile_list.begin(); i != profile_list.end(); i++) {
+ profileComboBox->insertItem((*i)->get_profile_name().c_str());
+ if (show_profile_name == (*i)->get_profile_name().c_str()) {
+ show_idx = idx;
+ show_profile = *i;
+ }
+ idx++;
+ }
+
+ profileComboBox->setEnabled(profile_list.size() > 1);
+ current_profile_idx = show_idx;
+
+ if (show_profile == NULL) {
+ current_profile = profile_list.front();
+ } else {
+ current_profile = show_profile;
+ }
+ profileComboBox->setCurrentItem(current_profile_idx);
+}
+
+// Show the form
+void UserProfileForm::show(list<t_user *> profiles, QString show_profile)
+{
+ map_last_cat.clear();
+ initProfileList(profiles, show_profile);
+ populate();
+
+ // Show form
+ QDialog::show();
+}
+
+// Modal execution
+int UserProfileForm::exec(list<t_user *> profiles, QString show_profile)
+{
+ map_last_cat.clear();
+ initProfileList(profiles, show_profile);
+ populate();
+ return QDialog::exec();
+}
+
+bool UserProfileForm::check_dynamic_payload(QSpinBox *spb,
+ QValueList<int> &checked_list)
+{
+ if (checked_list.contains(spb->value())) {
+ categoryListBox->setSelected(idxCatRtpAudio, true);
+ settingsWidgetStack->raiseWidget(pageRtpAudio);
+ QString msg = tr("Dynamic payload type %1 is used more than once.").arg(spb->value());
+ ((t_gui *)ui)->cb_show_msg(this, msg.ascii(), MSG_CRITICAL);
+ spb->setFocus();
+ return false;
+ }
+
+ checked_list.append(spb->value());
+ return true;
+}
+
+list<t_number_conversion> UserProfileForm::get_number_conversions()
+{
+ list<t_number_conversion> conversions;
+ QListViewItemIterator it(conversionListView);
+ while (it.current()) {
+ QListViewItem *item = it.current();
+ t_number_conversion c;
+
+ try {
+ c.re.assign(item->text(colExpr).ascii());
+ c.fmt = item->text(colReplace).ascii();
+ conversions.push_back(c);
+ } catch (boost::bad_expression) {
+ // Should never happen as validity has been
+ // checked already. Just being defensive here.
+ }
+
+ ++it;
+ }
+
+ return conversions;
+}
+
+bool UserProfileForm::validateValues()
+{
+ QString s;
+
+ // Validity check user page
+ // SIP username is mandatory
+ if (usernameLineEdit->text().isEmpty()) {
+ categoryListBox->setSelected(idxCatUser, true);
+ settingsWidgetStack->raiseWidget(pageUser);
+ ((t_gui *)ui)->cb_show_msg(this, tr("You must fill in a user name for your SIP account.").ascii(),
+ MSG_CRITICAL);
+ usernameLineEdit->setFocus();
+ return false;
+ }
+
+ // SIP user domain is mandatory
+ if (domainLineEdit->text().isEmpty()) {
+ categoryListBox->setSelected(idxCatUser, true);
+ settingsWidgetStack->raiseWidget(pageUser);
+ ((t_gui *)ui)->cb_show_msg(this, tr(
+ "You must fill in a domain name for your SIP account.\n"
+ "This could be the hostname or IP address of your PC "
+ "if you want direct PC to PC dialing.").ascii(),
+ MSG_CRITICAL);
+ domainLineEdit->setFocus();
+ return false;
+ }
+
+ // Check validity of domain
+ s = USER_SCHEME;
+ s.append(':').append(domainLineEdit->text());
+ t_url u_domain(s.ascii());
+ if (!u_domain.is_valid() || u_domain.get_user() != "") {
+ categoryListBox->setSelected(idxCatUser, true);
+ settingsWidgetStack->raiseWidget(pageUser);
+ ((t_gui *)ui)->cb_show_msg(this, tr("Invalid domain.").ascii(), MSG_CRITICAL);
+ domainLineEdit->setFocus();
+ return false;
+ }
+
+ // Check validity of user
+ s = USER_SCHEME;
+ s.append(':').append(usernameLineEdit->text()).append('@');
+ s.append(domainLineEdit->text());
+ t_url u_user_domain(s.ascii());
+ if (!u_user_domain.is_valid()) {
+ categoryListBox->setSelected(idxCatUser, true);
+ settingsWidgetStack->raiseWidget(pageUser);
+ ((t_gui *)ui)->cb_show_msg(this, tr("Invalid user name.").ascii(), MSG_CRITICAL);
+ usernameLineEdit->setFocus();
+ return false;
+ }
+
+ // Registrar
+ if (!registrarLineEdit->text().isEmpty()) {
+ s = USER_SCHEME;
+ s.append(':').append(registrarLineEdit->text());
+ t_url u(s.ascii());
+ if (!u.is_valid() || u.get_user() != "") {
+ categoryListBox->setSelected(idxCatSipServer, true);
+ settingsWidgetStack->raiseWidget(pageSipServer);
+ ((t_gui *)ui)->cb_show_msg(this, tr("Invalid value for registrar.").ascii(),
+ MSG_CRITICAL);
+ registrarLineEdit->setFocus();
+ registrarLineEdit->selectAll();
+ return false;
+ }
+ }
+
+ // Outbound proxy
+ if (useProxyCheckBox->isChecked()) {
+ s = USER_SCHEME;
+ s.append(':').append(proxyLineEdit->text());
+ t_url u(s.ascii());
+ if (!u.is_valid() || u.get_user() != "") {
+ categoryListBox->setSelected(idxCatSipServer, true);
+ settingsWidgetStack->raiseWidget(pageSipServer);
+ ((t_gui *)ui)->cb_show_msg(this, tr("Invalid value for outbound proxy.").ascii(),
+ MSG_CRITICAL);
+ proxyLineEdit->setFocus();
+ proxyLineEdit->selectAll();
+ return false;
+ }
+ }
+
+
+ // Validity check voice mail page
+ if (mwiTypeComboBox->currentItem() == idxMWISollicited) {
+ // Mailbox user name is mandatory
+ if (mwiUserLineEdit->text().isEmpty()) {
+ categoryListBox->setSelected(idxCatVoiceMail, true);
+ settingsWidgetStack->raiseWidget(pageVoiceMail);
+ ((t_gui *)ui)->cb_show_msg(this,
+ tr("You must fill in a mailbox user name.").ascii(),
+ MSG_CRITICAL);
+ mwiUserLineEdit->setFocus();
+ return false;
+ }
+
+ // Mailbox server is mandatory
+ if (mwiServerLineEdit->text().isEmpty()) {
+ categoryListBox->setSelected(idxCatVoiceMail, true);
+ settingsWidgetStack->raiseWidget(pageVoiceMail);
+ ((t_gui *)ui)->cb_show_msg(this,
+ tr("You must fill in a mailbox server").ascii(),
+ MSG_CRITICAL);
+ mwiServerLineEdit->setFocus();
+ return false;
+ }
+
+ // Check validity of mailbox server
+ s = USER_SCHEME;
+ s.append(':').append(mwiServerLineEdit->text());
+ t_url u_server(s.ascii());
+ if (!u_server.is_valid() || u_server.get_user() != "") {
+ categoryListBox->setSelected(idxCatVoiceMail, true);
+ settingsWidgetStack->raiseWidget(pageVoiceMail);
+ ((t_gui *)ui)->cb_show_msg(this, tr("Invalid mailbox server.").ascii(),
+ MSG_CRITICAL);
+ mwiServerLineEdit->setFocus();
+ return false;
+ }
+
+ // Check validity of mailbox user name
+ s = USER_SCHEME;
+ s.append(':').append(mwiUserLineEdit->text()).append('@');
+ s.append(mwiServerLineEdit->text());
+ t_url u_user_server(s.ascii());
+ if (!u_user_server.is_valid()) {
+ categoryListBox->setSelected(idxCatVoiceMail, true);
+ settingsWidgetStack->raiseWidget(pageVoiceMail);
+ ((t_gui *)ui)->cb_show_msg(this, tr("Invalid mailbox user name.").ascii(),
+ MSG_CRITICAL);
+ mwiUserLineEdit->setFocus();
+ return false;
+ }
+ }
+
+ // NAT public IP
+ if (natStaticRadioButton->isChecked()) {
+ if (publicIPLineEdit->text().isEmpty()){
+ categoryListBox->setSelected(idxCatNat, true);
+ settingsWidgetStack->raiseWidget(pageNat);
+ ((t_gui *)ui)->cb_show_msg(this, tr("Value for public IP address missing.").ascii(),
+ MSG_CRITICAL);
+ publicIPLineEdit->setFocus();
+ return false;
+ }
+ }
+
+ // Check for double RTP dynamic payload types
+ QValueList<int> checked_types;
+ if (!check_dynamic_payload(spxNbPayloadSpinBox, checked_types) ||
+ !check_dynamic_payload(spxWbPayloadSpinBox, checked_types) ||
+ !check_dynamic_payload(spxUwbPayloadSpinBox, checked_types))
+ {
+ rtpAudioTabWidget->showPage(tabSpeex);
+ return false;
+ }
+
+ if (!check_dynamic_payload(ilbcPayloadSpinBox, checked_types)) {
+ rtpAudioTabWidget->showPage(tabIlbc);
+ return false;
+ }
+
+ if (!check_dynamic_payload(g72616PayloadSpinBox, checked_types) ||
+ !check_dynamic_payload(g72624PayloadSpinBox, checked_types) ||
+ !check_dynamic_payload(g72632PayloadSpinBox, checked_types) ||
+ !check_dynamic_payload(g72640PayloadSpinBox, checked_types)) {
+ rtpAudioTabWidget->showPage(tabG726);
+ return false;
+ }
+
+ if (!check_dynamic_payload(dtmfPayloadTypeSpinBox, checked_types)) {
+ rtpAudioTabWidget->showPage(tabDtmf);
+ return false;
+ }
+
+ // STUN server
+ if (natStunRadioButton->isChecked()) {
+ s = "stun:";
+ s.append(stunServerLineEdit->text());
+ t_url u(s.ascii());
+ if (!u.is_valid() || u.get_user() != "") {
+ categoryListBox->setSelected(idxCatNat, true);
+ settingsWidgetStack->raiseWidget(pageNat);
+ ((t_gui *)ui)->cb_show_msg(this, tr("Invalid value for STUN server.").ascii(),
+ MSG_CRITICAL);
+ stunServerLineEdit->setFocus();
+ stunServerLineEdit->selectAll();
+ return false;
+ }
+ }
+
+ // Clear outbound proxy if not used
+ if (!useProxyCheckBox->isChecked()) {
+ proxyLineEdit->clear();
+ }
+
+ // Clear sollicited MWI settings if unsollicited MWI is used
+ if (mwiTypeComboBox->currentItem() == idxMWIUnsollicited) {
+ t_user user_default;
+ mwiUserLineEdit->clear();
+ mwiServerLineEdit->clear();
+ mwiViaProxyCheckBox->setChecked(user_default.get_mwi_via_proxy());
+ mwiDurationSpinBox->setValue(user_default.get_mwi_subscription_time());
+ }
+
+ // Clear NAT public IP if not used
+ if (!natStaticRadioButton->isChecked()) {
+ publicIPLineEdit->clear();
+ }
+
+ // Clear STUN server if not used
+ if (!natStunRadioButton->isChecked()) {
+ stunServerLineEdit->clear();
+ }
+
+ // Set all values in the current_profile object
+ // USER
+ if (current_profile->get_name() != usernameLineEdit->text().ascii() ||
+ current_profile->get_display(false) != displayLineEdit->text().ascii() ||
+ current_profile->get_domain() != domainLineEdit->text().ascii())
+ {
+ current_profile->set_display(displayLineEdit->text().ascii());
+ current_profile->set_name(usernameLineEdit->text().ascii());
+ current_profile->set_domain (domainLineEdit->text().ascii());
+ emit sipUserChanged(current_profile);
+ }
+
+ current_profile->set_organization(organizationLineEdit->text().ascii());
+
+ uint8 new_aka_op[AKA_OPLEN];
+ uint8 new_aka_amf[AKA_AMFLEN];
+ uint8 current_aka_op[AKA_OPLEN];
+ uint8 current_aka_amf[AKA_AMFLEN];
+
+ hex2binary(padleft(authAkaOpLineEdit->text().ascii(), '0', 32), new_aka_op);
+ hex2binary(padleft(authAkaAmfLineEdit->text().ascii(), '0', 4), new_aka_amf);
+ current_profile->get_auth_aka_op(current_aka_op);
+ current_profile->get_auth_aka_amf(current_aka_amf);
+
+ if (current_profile->get_auth_realm() != authRealmLineEdit->text().ascii() ||
+ current_profile->get_auth_name() != authNameLineEdit->text().ascii() ||
+ current_profile->get_auth_pass() != authPasswordLineEdit->text().ascii() ||
+ memcmp(current_aka_op, new_aka_op, AKA_OPLEN) != 0 ||
+ memcmp(current_aka_amf, new_aka_amf, AKA_AMFLEN) != 0)
+ {
+ emit authCredentialsChanged(current_profile,
+ current_profile->get_auth_realm());
+
+ current_profile->set_auth_realm(authRealmLineEdit->text().ascii());
+ current_profile->set_auth_name(authNameLineEdit->text().ascii());
+ current_profile->set_auth_pass(authPasswordLineEdit->text().ascii());
+ current_profile->set_auth_aka_op(new_aka_op);
+ current_profile->set_auth_aka_amf(new_aka_amf);
+ }
+
+ // SIP SERVER
+ current_profile->set_use_registrar(!registrarLineEdit->text().isEmpty());
+ s = USER_SCHEME;
+ s.append(':').append(registrarLineEdit->text());
+ current_profile->set_registrar(t_url(s.ascii()));
+ current_profile->set_registration_time(expirySpinBox->value());
+ current_profile->set_register_at_startup(regAtStartupCheckBox->isChecked());
+ current_profile->set_reg_add_qvalue(regAddQvalueCheckBox->isChecked());
+ current_profile->set_reg_qvalue(atof(regQvalueLineEdit->text().ascii()));
+
+ current_profile->set_use_outbound_proxy(useProxyCheckBox->isChecked());
+ s = USER_SCHEME;
+ s.append(':').append(proxyLineEdit->text());
+ current_profile->set_outbound_proxy(t_url(s.ascii()));
+ current_profile->set_all_requests_to_proxy(allRequestsCheckBox->isChecked());
+ current_profile->set_non_resolvable_to_proxy(
+ proxyNonResolvableCheckBox->isChecked());
+
+ // VOICE MAIL
+ current_profile->set_mwi_vm_address(vmAddressLineEdit->text().ascii());
+
+ bool mustTriggerMWISubscribe = false;
+ bool mwiSollicited = (mwiTypeComboBox->currentItem() == idxMWISollicited);
+ if (mwiSollicited) {
+ if (!current_profile->get_mwi_sollicited()) {
+ // Sollicited MWI now enabled. Subscribe after all MWI
+ // settings have been changed.
+ mustTriggerMWISubscribe = true;
+ } else {
+ s = USER_SCHEME;
+ s.append(':').append(mwiServerLineEdit->text());
+ if (mwiUserLineEdit->text().ascii() != current_profile->get_mwi_user() ||
+ t_url(s.ascii()) != current_profile->get_mwi_server() ||
+ mwiViaProxyCheckBox->isChecked() != current_profile->get_mwi_via_proxy())
+ {
+ // Sollicited MWI settings changed. Trigger unsubscribe
+ // of current MWI subscription.
+ emit mwiChangeUnsubscribe(current_profile);
+
+ // Subscribe after the settings have been changed.
+ mustTriggerMWISubscribe = true;
+ }
+ }
+ } else {
+ if (current_profile->get_mwi_sollicited()) {
+ // MWI type changes to unsollicited. Trigger unsubscribe of
+ // current MWI subscription.
+ emit mwiChangeUnsubscribe(current_profile);
+ }
+ }
+
+ current_profile->set_mwi_sollicited(mwiSollicited);
+ current_profile->set_mwi_user(mwiUserLineEdit->text().ascii());
+ s = USER_SCHEME;
+ s.append(':').append(mwiServerLineEdit->text());
+ current_profile->set_mwi_server(t_url(s.ascii()));
+ current_profile->set_mwi_via_proxy(mwiViaProxyCheckBox->isChecked());
+ current_profile->set_mwi_subscription_time(mwiDurationSpinBox->value());
+
+ if (mustTriggerMWISubscribe) {
+ emit mwiChangeSubscribe(current_profile);
+ }
+
+ // INSTANT MESSAGE
+ current_profile->set_im_max_sessions(imMaxSessionsSpinBox->value());
+ current_profile->set_im_send_iscomposing(isComposingCheckBox->isChecked());
+
+ // PRESENCE
+ current_profile->set_pres_publish_startup(presPublishCheckBox->isChecked());
+ current_profile->set_pres_publication_time(presPublishTimeSpinBox->value());
+ current_profile->set_pres_subscription_time(presSubscribeTimeSpinBox->value());
+
+ // RTP AUDIO
+ // Codecs
+ list<t_audio_codec> audio_codecs;
+ for (size_t i = 0; i < activeCodecListBox->count(); i++) {
+ audio_codecs.push_back(label2codec(activeCodecListBox->text(i)));
+ }
+ current_profile->set_codecs(audio_codecs);
+
+ // G.711/G.726 ptime
+ current_profile->set_ptime(ptimeSpinBox->value());
+
+ // Codec preference
+ current_profile->set_in_obey_far_end_codec_pref(inFarEndCodecPrefCheckBox->isChecked());
+ current_profile->set_out_obey_far_end_codec_pref(outFarEndCodecPrefCheckBox->isChecked());
+
+ // Speex preprocessing & AEC
+ current_profile->set_speex_dsp_vad(spxDspVadCheckBox->isChecked());
+ current_profile->set_speex_dsp_agc(spxDspAgcCheckBox->isChecked());
+ current_profile->set_speex_dsp_aec(spxDspAecCheckBox->isChecked());
+ current_profile->set_speex_dsp_nrd(spxDspNrdCheckBox->isChecked());
+ current_profile->set_speex_dsp_agc_level(spxDspAgcLevelSpinBox->value());
+
+ // Speex ([en/de]coding)
+ current_profile->set_speex_bit_rate_type((spxVbrCheckBox->isChecked() ? BIT_RATE_VBR : BIT_RATE_CBR));
+ current_profile->set_speex_dtx(spxDtxCheckBox->isChecked());
+ current_profile->set_speex_penh(spxPenhCheckBox->isChecked());
+ current_profile->set_speex_quality(spxQualitySpinBox->value());
+ current_profile->set_speex_complexity(spxComplexitySpinBox->value());
+ current_profile->set_speex_nb_payload_type(spxNbPayloadSpinBox->value());
+ current_profile->set_speex_wb_payload_type(spxWbPayloadSpinBox->value());
+ current_profile->set_speex_uwb_payload_type(spxUwbPayloadSpinBox->value());
+
+ // iLBC
+ current_profile->set_ilbc_payload_type(ilbcPayloadSpinBox->value());
+ switch (ilbcPayloadSizeComboBox->currentItem()) {
+ case idxIlbcMode20:
+ current_profile->set_ilbc_mode(20);
+ break;
+ default:
+ current_profile->set_ilbc_mode(30);
+ break;
+ }
+
+ // G726
+ current_profile->set_g726_16_payload_type(g72616PayloadSpinBox->value());
+ current_profile->set_g726_24_payload_type(g72624PayloadSpinBox->value());
+ current_profile->set_g726_32_payload_type(g72632PayloadSpinBox->value());
+ current_profile->set_g726_40_payload_type(g72640PayloadSpinBox->value());
+
+ switch (g726PackComboBox->currentItem()) {
+ case idxG726PackRfc3551:
+ current_profile->set_g726_packing(G726_PACK_RFC3551);
+ break;
+ default:
+ current_profile->set_g726_packing(G726_PACK_AAL2);
+ break;
+ }
+
+ // DTMF
+ switch (dtmfTransportComboBox->currentItem()) {
+ case idxDtmfRfc2833:
+ current_profile->set_dtmf_transport(DTMF_RFC2833);
+ break;
+ case idxDtmfInband:
+ current_profile->set_dtmf_transport(DTMF_INBAND);
+ break;
+ case idxDtmfInfo:
+ current_profile->set_dtmf_transport(DTMF_INFO);
+ break;
+ default:
+ current_profile->set_dtmf_transport(DTMF_AUTO);
+ break;
+ }
+
+ current_profile->set_dtmf_payload_type(dtmfPayloadTypeSpinBox->value());
+ current_profile->set_dtmf_duration(dtmfDurationSpinBox->value());
+ current_profile->set_dtmf_pause(dtmfPauseSpinBox->value());
+ current_profile->set_dtmf_volume(-(dtmfVolumeSpinBox->value()));
+
+ // SIP PROTOCOL
+ switch (holdVariantComboBox->currentItem()) {
+ case idxHoldRfc2543:
+ current_profile->set_hold_variant(HOLD_RFC2543);
+ break;
+ default:
+ current_profile->set_hold_variant(HOLD_RFC3264);
+ break;
+ }
+
+ current_profile->set_check_max_forwards(maxForwardsCheckBox->isChecked());
+ current_profile->set_allow_missing_contact_reg(missingContactCheckBox->isChecked());
+ current_profile->set_registration_time_in_contact(regTimeCheckBox->isChecked());
+ current_profile->set_compact_headers(compactHeadersCheckBox->isChecked());
+ current_profile->set_encode_multi_values_as_list(
+ multiValuesListCheckBox->isChecked());
+ current_profile->set_use_domain_in_contact(
+ useDomainInContactCheckBox->isChecked());
+ current_profile->set_allow_sdp_change(allowSdpChangeCheckBox->isChecked());
+ current_profile->set_allow_redirection(allowRedirectionCheckBox->isChecked());
+ current_profile->set_ask_user_to_redirect(askUserRedirectCheckBox->isChecked());
+ current_profile->set_max_redirections(maxRedirectSpinBox->value());
+ current_profile->set_ext_100rel(indexComboItem2ext_support(
+ ext100relComboBox->currentItem()));
+ current_profile->set_ext_replaces(extReplacesCheckBox->isChecked());
+ current_profile->set_allow_refer(allowReferCheckBox->isChecked());
+ current_profile->set_ask_user_to_refer(askUserReferCheckBox->isChecked());
+ current_profile->set_referee_hold(refereeHoldCheckBox->isChecked());
+ current_profile->set_referrer_hold(referrerHoldCheckBox->isChecked());
+ current_profile->set_auto_refresh_refer_sub(refreshReferSubCheckBox->isChecked());
+ current_profile->set_attended_refer_to_aor(referAorCheckBox->isChecked());
+ current_profile->set_allow_transfer_consultation_inprog(
+ transferConsultInprogCheckBox->isChecked());
+ current_profile->set_send_p_preferred_id(pPreferredIdCheckBox->isChecked());
+
+ // Transport/NAT
+ switch (sipTransportComboBox->currentItem()) {
+ case idxSipTransportUDP:
+ current_profile->set_sip_transport(SIP_TRANS_UDP);
+ break;
+ case idxSipTransportTCP:
+ current_profile->set_sip_transport(SIP_TRANS_TCP);
+ break;
+ default:
+ current_profile->set_sip_transport(SIP_TRANS_AUTO);
+ break;
+ }
+
+ current_profile->set_sip_transport_udp_threshold(udpThresholdSpinBox->value());
+
+ current_profile->set_use_nat_public_ip(natStaticRadioButton->isChecked());
+ current_profile->set_nat_public_ip(publicIPLineEdit->text().ascii());
+ current_profile->set_use_stun(natStunRadioButton->isChecked());
+
+ if (current_profile->get_stun_server().encode_noscheme() != stunServerLineEdit->text().ascii() ||
+ current_profile->get_enable_nat_keepalive() != natKeepaliveCheckBox->isChecked())
+ {
+ s = "stun:";
+ s.append(stunServerLineEdit->text());
+ current_profile->set_stun_server(t_url(s.ascii()));
+ current_profile->set_enable_nat_keepalive(natKeepaliveCheckBox->isChecked());
+ emit stunServerChanged(current_profile);
+ }
+
+ current_profile->set_persistent_tcp(persistentTcpCheckBox->isChecked());
+
+ // ADDRESS FORMAT
+ current_profile->set_display_useronly_phone(
+ displayTelUserCheckBox->isChecked());
+ current_profile->set_numerical_user_is_phone(
+ numericalUserIsTelCheckBox->isChecked());
+ current_profile->set_remove_special_phone_symbols(
+ removeSpecialCheckBox->isChecked());
+ current_profile->set_special_phone_symbols(
+ specialLineEdit->text().stripWhiteSpace().ascii());
+ current_profile->set_number_conversions(get_number_conversions());
+ current_profile->set_use_tel_uri_for_phone(useTelUriCheckBox->isChecked());
+
+ // TIMERS
+ current_profile->set_timer_noanswer(tmrNoanswerSpinBox->value());
+ current_profile->set_timer_nat_keepalive(tmrNatKeepaliveSpinBox->value());
+
+ // RING TONES
+ current_profile->set_ringtone_file(ringtoneLineEdit->text().stripWhiteSpace().ascii());
+ current_profile->set_ringback_file(ringbackLineEdit->text().stripWhiteSpace().ascii());
+
+ // SCRIPTS
+ current_profile->set_script_incoming_call(incomingCallScriptLineEdit->
+ text().stripWhiteSpace().ascii());
+ current_profile->set_script_in_call_answered(inCallAnsweredLineEdit->
+ text().stripWhiteSpace().ascii());
+ current_profile->set_script_in_call_failed(inCallFailedLineEdit->
+ text().stripWhiteSpace().ascii());
+ current_profile->set_script_outgoing_call(outCallLineEdit->
+ text().stripWhiteSpace().ascii());
+ current_profile->set_script_out_call_answered(outCallAnsweredLineEdit->
+ text().stripWhiteSpace().ascii());
+ current_profile->set_script_out_call_failed(outCallFailedLineEdit->
+ text().stripWhiteSpace().ascii());
+ current_profile->set_script_local_release(localReleaseLineEdit->
+ text().stripWhiteSpace().ascii());
+ current_profile->set_script_remote_release(remoteReleaseLineEdit->
+ text().stripWhiteSpace().ascii());
+
+ // Security
+ current_profile->set_zrtp_enabled(zrtpEnabledCheckBox->isChecked());
+ current_profile->set_zrtp_send_if_supported(zrtpSendIfSupportedCheckBox->isChecked());
+ current_profile->set_zrtp_sdp(zrtpSdpCheckBox->isChecked());
+ current_profile->set_zrtp_goclear_warning(zrtpGoClearWarningCheckBox->isChecked());
+
+ // Save user config
+ string error_msg;
+ if (!current_profile->write_config(current_profile->get_filename(), error_msg)) {
+ // Failed to write config file
+ ((t_gui *)ui)->cb_show_msg(this, error_msg, MSG_CRITICAL);
+ return false;
+ }
+
+ return true;
+}
+
+void UserProfileForm::validate() {
+ if (validateValues()) {
+ emit success();
+ accept();
+ }
+}
+
+// User wants to change to another profile
+void UserProfileForm::changeProfile(const QString &profileName) {
+ if (current_profile_idx == -1) {
+ // Initializing combo box
+ return;
+ }
+
+ // Make the current profile permanent.
+ if (!validateValues()) {
+ // Current values are not valid.
+ // Do not change to the new profile.
+ profileComboBox->setCurrentItem(current_profile_idx);
+ return;
+ }
+
+ // Store the current viewed category
+ map_last_cat[current_profile] = categoryListBox->index(categoryListBox->selectedItem());
+
+ // Change to new profile.
+ for (list<t_user *>::iterator i = profile_list.begin(); i != profile_list.end(); i++) {
+ if ((*i)->get_profile_name() == profileName.ascii()) {
+ current_profile = *i;
+ break;
+ }
+ }
+
+ current_profile_idx = profileComboBox->currentItem();
+ populate();
+
+ // Restore last viewed category
+ int idxCat = map_last_cat[current_profile];
+ categoryListBox->setSelected(idxCat, true);
+ showCategory(idxCat);
+}
+
+void UserProfileForm::chooseFile(QLineEdit *qle, const QString &filter, const QString &caption)
+{
+ QString file = QFileDialog::getOpenFileName(
+ ((t_gui *)ui)->get_last_file_browse_path(),
+ filter, this, "open file dialog",
+ caption);
+ if (!file.isEmpty()) {
+ qle->setText(file);
+ ((t_gui *)ui)->set_last_file_browse_path(QFileInfo(file).dirPath(true));
+ }
+}
+
+void UserProfileForm::chooseRingtone()
+{
+ chooseFile(ringtoneLineEdit, tr("Ring tones", "Description of .wav files in file dialog").append(" (*.wav)"), tr("Choose ring tone"));
+}
+
+void UserProfileForm::chooseRingback()
+{
+ chooseFile(ringbackLineEdit, tr("Ring back tones", "Description of .wav files in file dialog").append(" (*.wav)"), "Choose ring back tone");
+}
+
+void UserProfileForm::chooseIncomingCallScript()
+{
+ chooseFile(incomingCallScriptLineEdit, tr("All files").append(" (*)"), tr("Choose incoming call script"));
+}
+
+void UserProfileForm::chooseInCallAnsweredScript()
+{
+ chooseFile(inCallAnsweredLineEdit, tr("All files").append(" (*)"), tr("Choose incoming call answered script"));
+}
+
+void UserProfileForm::chooseInCallFailedScript()
+{
+ chooseFile(inCallFailedLineEdit, tr("All files").append(" (*)"), tr("Choose incoming call failed script"));
+}
+
+void UserProfileForm::chooseOutgoingCallScript()
+{
+ chooseFile(outCallLineEdit, tr("All files").append(" (*)"), tr("Choose outgoing call script"));
+}
+
+void UserProfileForm::chooseOutCallAnsweredScript()
+{
+ chooseFile(outCallAnsweredLineEdit, tr("All files").append(" (*)"), tr("Choose outgoing call answered script"));
+}
+
+void UserProfileForm::chooseOutCallFailedScript()
+{
+ chooseFile(outCallFailedLineEdit, tr("All files").append(" (*)"), tr("Choose outgoing call failed script"));
+}
+
+void UserProfileForm::chooseLocalReleaseScript()
+{
+ chooseFile(localReleaseLineEdit, tr("All files").append(" (*)"), tr("Choose local release script"));
+}
+
+void UserProfileForm::chooseRemoteReleaseScript()
+{
+ chooseFile(remoteReleaseLineEdit, tr("All files").append(" (*)"), tr("Choose remote release script"));
+}
+
+void UserProfileForm::addCodec() {
+ for (size_t i = 0; i < availCodecListBox->count(); i++) {
+ if (availCodecListBox->isSelected(i)) {
+ activeCodecListBox->insertItem(availCodecListBox->text(i));
+ activeCodecListBox->setSelected(
+ activeCodecListBox->count() - 1, true);
+ availCodecListBox->removeItem(i);
+ return;
+ }
+ }
+}
+
+void UserProfileForm::removeCodec() {
+ for (size_t i = 0; i < activeCodecListBox->count(); i++) {
+ if (activeCodecListBox->isSelected(i)) {
+ availCodecListBox->insertItem(activeCodecListBox->text(i));
+ availCodecListBox->setSelected(
+ availCodecListBox->count() - 1, true);
+ activeCodecListBox->removeItem(i);
+ return;
+ }
+ }
+}
+
+void UserProfileForm::upCodec() {
+ QListBoxItem *lbi = activeCodecListBox->selectedItem();
+ if (!lbi) return;
+
+ int idx = activeCodecListBox->index(lbi);
+ if (idx == 0) return;
+
+ QString label = lbi->text();
+ activeCodecListBox->removeItem(idx);
+ activeCodecListBox->insertItem(label, idx - 1);
+ activeCodecListBox->setSelected(idx - 1, true);
+}
+
+void UserProfileForm::downCodec() {
+ QListBoxItem *lbi = activeCodecListBox->selectedItem();
+ if (!lbi) return;
+
+ size_t idx = activeCodecListBox->index(lbi);
+ if (idx == activeCodecListBox->count() - 1) return;
+
+ QString label = lbi->text();
+ activeCodecListBox->removeItem(idx);
+ activeCodecListBox->insertItem(label, idx + 1);
+ activeCodecListBox->setSelected(idx + 1, true);
+}
+
+void UserProfileForm::upConversion() {
+ QListViewItem *lvi = conversionListView->selectedItem();
+ if (!lvi) return;
+
+ QListViewItem *above = lvi->itemAbove();
+ if (!above) return;
+
+ QListViewItem *newAbove = above->itemAbove();
+
+ if (newAbove) {
+ lvi->moveItem(newAbove);
+ } else {
+ above->moveItem(lvi);
+ }
+
+ lvi->setSelected(true);
+}
+
+void UserProfileForm::downConversion() {
+ QListViewItem *lvi = conversionListView->selectedItem();
+ if (!lvi) return;
+
+ QListViewItem *below = lvi->itemBelow();
+ if (!below) return;
+
+ lvi->moveItem(below);
+ lvi->setSelected(true);
+}
+
+void UserProfileForm::addConversion() {
+ QString expr;
+ QString replace;
+
+ NumberConversionForm f;
+ if (f.exec(expr, replace) == QDialog::Accepted) {
+ QListViewItem *last = conversionListView->lastItem();
+ if (last) {
+ new QListViewItem(conversionListView, last, expr, replace);
+ } else {
+ new QListViewItem(conversionListView, expr, replace);
+ }
+ }
+}
+
+void UserProfileForm::editConversion() {
+ QListViewItem *lvi = conversionListView->selectedItem();
+ if (!lvi) return;
+
+ QString expr = lvi->text(colExpr);
+ QString replace = lvi->text(colReplace);
+
+ NumberConversionForm f;
+ if (f.exec(expr, replace) == QDialog::Accepted) {
+ lvi->setText(colExpr, expr);
+ lvi->setText(colReplace, replace);
+ }
+}
+
+void UserProfileForm::removeConversion() {
+ QListViewItem *lvi = conversionListView->selectedItem();
+ if (!lvi) return;
+ delete lvi;
+}
+
+void UserProfileForm::testConversion() {
+ QString number = testConversionLineEdit->text();
+ if (number.isEmpty()) return;
+
+ bool remove_special_phone_symbols = removeSpecialCheckBox->isChecked();
+ QString special_phone_symbols = specialLineEdit->text();
+
+ number = remove_white_space(number.ascii()).c_str();
+
+ // Remove special symbols
+ if (remove_special_phone_symbols &&
+ looks_like_phone(number.ascii(), special_phone_symbols.ascii()))
+ {
+ number = remove_symbols(
+ number.ascii(), special_phone_symbols.ascii()).c_str();
+ }
+
+ QString msg = tr("%1 converts to %2")
+ .arg(number)
+ .arg(current_profile->convert_number(number.ascii(), get_number_conversions()).c_str());
+
+ ((t_gui *)ui)->cb_show_msg(this, msg.ascii(), MSG_INFO);
+}
+
+void UserProfileForm::changeMWIType(int idxMWIType) {
+ if (idxMWIType == idxMWISollicited) {
+ mwiSollicitedGroupBox->setEnabled(true);
+
+ // Set defaults
+ if (mwiUserLineEdit->text().isEmpty()) {
+ mwiUserLineEdit->setText(usernameLineEdit->text());
+ }
+ if (mwiServerLineEdit->text().isEmpty()) {
+ mwiServerLineEdit->setText(domainLineEdit->text());
+ mwiViaProxyCheckBox->setChecked(useProxyCheckBox->isChecked());
+ }
+ } else {
+ mwiSollicitedGroupBox->setEnabled(false);
+ }
+}
+
+void UserProfileForm::changeSipTransportProtocol(int idx) {
+ udpThresholdTextLabel->setEnabled(idx == idxSipTransportAuto);
+ udpThresholdSpinBox->setEnabled(idx == idxSipTransportAuto);
+ persistentTcpCheckBox->setEnabled(idx == idxSipTransportTCP);
+}
diff --git a/src/gui/wizardform.ui b/src/gui/wizardform.ui
new file mode 100644
index 0000000..aa50690
--- /dev/null
+++ b/src/gui/wizardform.ui
@@ -0,0 +1,367 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>WizardForm</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>WizardForm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>596</width>
+ <height>321</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Twinkle - Wizard</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout15</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit" row="8" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>stunServerLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The hostname, domain name or IP address of the STUN server.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="8" column="0">
+ <property name="name">
+ <cstring>stunServerTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>S&amp;TUN server:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>stunServerLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>usernameLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The SIP user name given to you by your provider. It is the user part in your SIP address, &lt;b&gt;username&lt;/b&gt;@domain.com This could be a telephone number.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>domainTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Domain*:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>domainLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>serviceProviderComboBox</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Choose your SIP service provider. If your SIP service provider is not in the list, then select &lt;b&gt;Other&lt;/b&gt; and fill in the settings you received from your provider.&lt;br&gt;&lt;br&gt;
+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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>authNameTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Authentication name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>authNameLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>dislpayTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Your name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>displayLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="4" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>authNameLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Your SIP authentication name. Quite often this is the same as your SIP user name. It can be a different name though.</string>
+ </property>
+ </widget>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>spacer22</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>206</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLineEdit" row="3" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>domainLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The domain part of your SIP address, username@&lt;b&gt;domain.com&lt;/b&gt;. Instead of a real domain this could also be the hostname or IP address of your &lt;b&gt;SIP proxy&lt;/b&gt;. If you want direct IP phone to IP phone communications then you fill in the hostname or IP address of your computer.
+&lt;br&gt;&lt;br&gt;
+This field is mandatory.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>displayLineEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="6" column="0" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>proxyTextLabel</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>SIP pro&amp;xy:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>proxyLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="7" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>proxyLineEdit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>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.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>serviceProviderTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;SIP service provider:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>serviceProviderComboBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>authPasswordTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Password:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>authPasswordLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>usernameTextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;User name*:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>usernameLineEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="5" column="1" rowspan="2" colspan="2">
+ <property name="name">
+ <cstring>authPasswordLineEdit</cstring>
+ </property>
+ <property name="echoMode">
+ <enum>Password</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Your password for authentication.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer23</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout14</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer20</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>371</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string>Alt+O</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelPushButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string>Alt+C</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>WizardForm</receiver>
+ <slot>validate()</slot>
+ </connection>
+ <connection>
+ <sender>cancelPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>WizardForm</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>usernameLineEdit</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>WizardForm</receiver>
+ <slot>updateAuthName(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>serviceProviderComboBox</sender>
+ <signal>activated(const QString&amp;)</signal>
+ <receiver>WizardForm</receiver>
+ <slot>update(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>authNameLineEdit</sender>
+ <signal>lostFocus()</signal>
+ <receiver>WizardForm</receiver>
+ <slot>disableSuggestAuthName()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>serviceProviderComboBox</tabstop>
+ <tabstop>displayLineEdit</tabstop>
+ <tabstop>usernameLineEdit</tabstop>
+ <tabstop>domainLineEdit</tabstop>
+ <tabstop>authNameLineEdit</tabstop>
+ <tabstop>authPasswordLineEdit</tabstop>
+ <tabstop>proxyLineEdit</tabstop>
+ <tabstop>stunServerLineEdit</tabstop>
+ <tabstop>okPushButton</tabstop>
+ <tabstop>cancelPushButton</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in declaration">map</include>
+ <include location="local" impldecl="in declaration">user.h</include>
+ <include location="local" impldecl="in implementation">qregexp.h</include>
+ <include location="local" impldecl="in implementation">qlineedit.h</include>
+ <include location="local" impldecl="in implementation">qlabel.h</include>
+ <include location="local" impldecl="in implementation">qvalidator.h</include>
+ <include location="local" impldecl="in implementation">qcombobox.h</include>
+ <include location="local" impldecl="in implementation">gui.h</include>
+ <include location="local" impldecl="in implementation">qfile.h</include>
+ <include location="local" impldecl="in implementation">wizardform.ui.h</include>
+</includes>
+<forwards>
+ <forward>struct t_provider;</forward>
+</forwards>
+<variables>
+ <variable access="private">bool suggestAuthName;</variable>
+ <variable access="private">std::map&lt;QString, t_provider&gt; mapProviders;</variable>
+ <variable access="private">t_user *user_config;</variable>
+</variables>
+<signals>
+ <signal>success()</signal>
+</signals>
+<slots>
+ <slot>initProviders()</slot>
+ <slot returnType="int">exec( t_user * user )</slot>
+ <slot>update( const QString &amp; item )</slot>
+ <slot>updateAuthName( const QString &amp; s )</slot>
+ <slot>disableSuggestAuthName()</slot>
+ <slot>validate()</slot>
+</slots>
+<functions>
+ <function access="private" specifier="non virtual">init()</function>
+ <function>show( t_user * user )</function>
+</functions>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/wizardform.ui.h b/src/gui/wizardform.ui.h
new file mode 100644
index 0000000..2d0f652
--- /dev/null
+++ b/src/gui/wizardform.ui.h
@@ -0,0 +1,263 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you want to add, delete, or rename functions or slots, use
+** Qt Designer to update this file, preserving your code.
+**
+** You should not define a constructor or destructor in this file.
+** Instead, write your code in functions called init() and destroy().
+** These will automatically be called by the form's constructor and
+** destructor.
+*****************************************************************************/
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#define PROV_NONE QT_TRANSLATE_NOOP("WizardForm", "None (direct IP to IP calls)")
+#define PROV_OTHER QT_TRANSLATE_NOOP("WizardForm", "Other")
+
+struct t_provider {
+ QString domain;
+ QString sip_proxy;
+ QString stun_server;
+};
+
+void WizardForm::init()
+{
+ QRegExp rxNoSpace("\\S*");
+
+ // Set validators
+ usernameLineEdit->setValidator(new QRegExpValidator(rxNoSpace, this));
+ domainLineEdit->setValidator(new QRegExpValidator(rxNoSpace, this));
+ authNameLineEdit->setValidator(new QRegExpValidator(rxNoSpace, this));
+ proxyLineEdit->setValidator(new QRegExpValidator(rxNoSpace, this));
+
+ initProviders();
+ serviceProviderComboBox->setCurrentItem(serviceProviderComboBox->count() - 1);
+ update(tr(PROV_OTHER));
+}
+
+void WizardForm::initProviders()
+{
+ serviceProviderComboBox->clear();
+ serviceProviderComboBox->insertItem(tr(PROV_NONE));
+
+ QString fname = sys_config->get_dir_share().c_str();
+ fname.append("/").append(FILE_PROVIDERS);
+ QFile providersFile(fname);
+ if (providersFile.open(IO_ReadOnly)) {
+ QTextStream providersStream(&providersFile);
+ QString entry;
+ while ((entry = providersStream.readLine()) != QString::null) {
+ // Skip comment
+ if (entry[0] == '#') continue;
+
+ QStringList l = QStringList::split(";", entry, true);
+
+ // Skip invalid lines
+ if (l.size() != 4) continue;
+
+ t_provider p;
+ p.domain = l[1];
+ p.sip_proxy = l[2];
+ p.stun_server = l[3];
+ mapProviders[l[0]] = p;
+
+ serviceProviderComboBox->insertItem(l[0]);
+ }
+ providersFile.close();
+ }
+
+ serviceProviderComboBox->insertItem(tr(PROV_OTHER));
+}
+
+int WizardForm::exec(t_user *user)
+{
+ user_config = user;
+
+ // Set user profile name in the titlebar
+ QString s = PRODUCT_NAME;
+ s.append(" - ").append(tr("User profile wizard:")).append(" ");
+ s.append(user_config->get_profile_name().c_str());
+ setCaption(s);
+
+ return QDialog::exec();
+}
+
+void WizardForm::show(t_user *user)
+{
+ user_config = user;
+
+ // Set user profile name in the titlebar
+ QString s = PRODUCT_NAME;
+ s.append(" - ").append(tr("User profile wizard:")).append(" ");
+ s.append(user_config->get_profile_name().c_str());
+ setCaption(s);
+
+ QDialog::show();
+}
+
+void WizardForm::update(const QString &item)
+{
+ // Disable/Enable controls
+ if (item == tr(PROV_NONE)) {
+ suggestAuthName = false;
+ authNameTextLabel->setEnabled(false);
+ authNameLineEdit->setEnabled(false);
+ authPasswordTextLabel->setEnabled(false);
+ authPasswordLineEdit->setEnabled(false);
+ proxyTextLabel->setEnabled(false);
+ proxyLineEdit->setEnabled(false);
+ stunServerTextLabel->setEnabled(false);
+ stunServerLineEdit->setEnabled(false);
+ } else {
+ if (usernameLineEdit->text() == authNameLineEdit->text()) {
+ suggestAuthName = true;
+ } else {
+ suggestAuthName = false;
+ }
+
+ authNameTextLabel->setEnabled(true);
+ authNameLineEdit->setEnabled(true);
+ authPasswordTextLabel->setEnabled(true);
+ authPasswordLineEdit->setEnabled(true);
+ proxyTextLabel->setEnabled(true);
+ proxyLineEdit->setEnabled(true);
+ stunServerTextLabel->setEnabled(true);
+ stunServerLineEdit->setEnabled(true);
+ }
+
+ // Set values
+ if (item == tr(PROV_NONE)) {
+ domainLineEdit->clear();
+ authNameLineEdit->clear();
+ authPasswordLineEdit->clear();
+ proxyLineEdit->clear();
+ stunServerLineEdit->clear();
+ } else if (item == tr(PROV_OTHER)) {
+ domainLineEdit->clear();
+ stunServerLineEdit->clear();
+ proxyLineEdit->clear();
+ } else {
+ t_provider p = mapProviders[item];
+ domainLineEdit->setText(p.domain);
+ proxyLineEdit->setText(p.sip_proxy);
+ stunServerLineEdit->setText(p.stun_server);
+ }
+}
+
+void WizardForm::updateAuthName(const QString &s)
+{
+ if (suggestAuthName) {
+ authNameLineEdit->setText(s);
+ }
+}
+
+void WizardForm::disableSuggestAuthName()
+{
+ suggestAuthName = false;
+}
+
+void WizardForm::validate()
+{
+ QString s;
+
+ // Validity check user page
+ // SIP username is mandatory
+ if (usernameLineEdit->text().isEmpty()) {
+ ((t_gui *)ui)->cb_show_msg(this, tr("You must fill in a user name for your SIP account.").ascii(),
+ MSG_CRITICAL);
+ usernameLineEdit->setFocus();
+ return;
+ }
+
+ // SIP user domain is mandatory
+ if (domainLineEdit->text().isEmpty()) {
+ ((t_gui *)ui)->cb_show_msg(this, tr(
+ "You must fill in a domain name for your SIP account.\n"
+ "This could be the hostname or IP address of your PC "
+ "if you want direct PC to PC dialing.").ascii(),
+ MSG_CRITICAL);
+ domainLineEdit->setFocus();
+ return;
+ }
+
+ // SIP proxy
+ if (proxyLineEdit->text() != "") {
+ s = USER_SCHEME;
+ s.append(':').append(proxyLineEdit->text());
+ t_url u(s.ascii());
+ if (!u.is_valid() || u.get_user() != "") {
+ ((t_gui *)ui)->cb_show_msg(this, tr("Invalid value for SIP proxy.").ascii(),
+ MSG_CRITICAL);
+ proxyLineEdit->setFocus();
+ proxyLineEdit->selectAll();
+ return;
+ }
+ }
+
+ // Register and publish presence at startup
+ if (serviceProviderComboBox->currentText() == tr(PROV_NONE)) {
+ user_config->set_register_at_startup(false);
+ user_config->set_pres_publish_startup(false);
+ }
+
+ // STUN server
+ if (stunServerLineEdit->text() != "") {
+ s = "stun:";
+ s.append(stunServerLineEdit->text());
+ t_url u(s.ascii());
+ if (!u.is_valid() || u.get_user() != "") {
+ ((t_gui *)ui)->cb_show_msg(this, tr("Invalid value for STUN server.").ascii(),
+ MSG_CRITICAL);
+ stunServerLineEdit->setFocus();
+ stunServerLineEdit->selectAll();
+ return;
+ }
+ }
+
+ // Set all values in the user_config object
+ // USER
+ user_config->set_display(displayLineEdit->text().ascii());
+ user_config->set_name(usernameLineEdit->text().ascii());
+ user_config->set_domain(domainLineEdit->text().ascii());
+ user_config->set_auth_name(authNameLineEdit->text().ascii());
+ user_config->set_auth_pass(authPasswordLineEdit->text().ascii());
+
+ // SIP SERVER
+ user_config->set_use_outbound_proxy(!proxyLineEdit->text().isEmpty());
+ s = USER_SCHEME;
+ s.append(':').append(proxyLineEdit->text());
+ user_config->set_outbound_proxy(t_url(s.ascii()));
+
+ // NAT
+ user_config->set_use_stun(!stunServerLineEdit->text().isEmpty());
+ s = "stun:";
+ s.append(stunServerLineEdit->text());
+ user_config->set_stun_server(t_url(s.ascii()));
+
+ // Save user config
+ string error_msg;
+ if (!user_config->write_config(user_config->get_filename(), error_msg)) {
+ // Failed to write config file
+ ((t_gui *)ui)->cb_show_msg(this, error_msg, MSG_CRITICAL);
+ return;
+ }
+
+ emit success();
+ accept();
+}
diff --git a/src/gui/yesnodialog.cpp b/src/gui/yesnodialog.cpp
new file mode 100644
index 0000000..408f93e
--- /dev/null
+++ b/src/gui/yesnodialog.cpp
@@ -0,0 +1,86 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include "yesnodialog.h"
+
+#include "qlabel.h"
+#include "qlayout.h"
+
+#include "userintf.h"
+
+// class YesNoDialog
+
+void YesNoDialog::actionYes() {
+ QDialog::accept();
+}
+
+void YesNoDialog::actionNo() {
+ QDialog::reject();
+}
+
+YesNoDialog::YesNoDialog() {
+ new QDialog(NULL, NULL, true, Qt::WDestructiveClose);
+}
+
+YesNoDialog::YesNoDialog(QWidget *parent, const QString &caption, const QString &text) :
+ QDialog(parent, NULL, true, Qt::WDestructiveClose)
+{
+ setCaption(caption);
+ QBoxLayout *vb = new QVBoxLayout(this, 11, 6);
+ QLabel *lblQuestion = new QLabel(text, this);
+ vb->addWidget(lblQuestion);
+ QHBoxLayout *hb = new QHBoxLayout(NULL, 0, 6);
+ QSpacerItem *spacer1 = new QSpacerItem(1, 1, QSizePolicy::Expanding,
+ QSizePolicy::Minimum );
+ hb->addItem(spacer1);
+ pbYes = new QPushButton(tr("&Yes"), this);
+ hb->addWidget(pbYes);
+ pbNo = new QPushButton(tr("&No"), this);
+ hb->addWidget(pbNo);
+ QSpacerItem *spacer2 = new QSpacerItem(1, 1, QSizePolicy::Expanding,
+ QSizePolicy::Minimum );
+ hb->addItem(spacer2);
+ vb->addLayout(hb);
+
+ connect(pbYes, SIGNAL(clicked()), this, SLOT(actionYes()));
+ connect(pbNo, SIGNAL(clicked()), this, SLOT(actionNo()));
+}
+
+YesNoDialog::~YesNoDialog() {}
+
+void YesNoDialog::reject() {
+ pbNo->animateClick();
+}
+
+
+// class ReferPermissionDialog
+
+void ReferPermissionDialog::actionYes() {
+ ui->send_refer_permission(true);
+ YesNoDialog::actionYes();
+}
+
+void ReferPermissionDialog::actionNo() {
+ ui->send_refer_permission(false);
+ YesNoDialog::actionNo();
+}
+
+ReferPermissionDialog::ReferPermissionDialog(QWidget *parent, const QString &caption,
+ const QString &text) :
+ YesNoDialog(parent, caption, text)
+{}
diff --git a/src/gui/yesnodialog.h b/src/gui/yesnodialog.h
new file mode 100644
index 0000000..c196772
--- /dev/null
+++ b/src/gui/yesnodialog.h
@@ -0,0 +1,56 @@
+/*
+ Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com>
+
+ 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef _YESNODIALOG_H
+#define _YESNODIALOG_H
+
+#include "qdialog.h"
+#include "qpushbutton.h"
+#include "qstring.h"
+
+class YesNoDialog : public QDialog {
+private:
+ Q_OBJECT
+ QPushButton *pbYes;
+ QPushButton *pbNo;
+
+protected slots:
+ virtual void actionYes();
+ virtual void actionNo();
+
+public:
+ YesNoDialog();
+ YesNoDialog(QWidget *parent, const QString &caption, const QString &text);
+ virtual ~YesNoDialog();
+
+ void reject();
+};
+
+class ReferPermissionDialog : public YesNoDialog {
+private:
+ Q_OBJECT
+
+protected slots:
+ virtual void actionYes();
+ virtual void actionNo();
+
+public:
+ ReferPermissionDialog(QWidget *parent, const QString &caption, const QString &text);
+};
+
+#endif