Compare commits

...
Sign in to create a new pull request.

221 commits

Author SHA1 Message Date
mj
94dd3be54f Merge pull request #423 from TiagoDanin-Forks/README
README: Fix Markdown
2017-10-17 07:52:34 +02:00
Tiago Danin
0e0958753c README: Fix Markdown 2017-10-15 19:01:24 -03:00
mj
5876c98f8a Merge pull request #422 from unansweredocd/add-remove-session-in-faq
Add remove old session info to README
2017-10-15 21:23:31 +02:00
Sam Form
d286c1f338 use the more common purple directory 2017-10-15 20:52:24 +02:00
Sam Form
a54c4e7dd2 add info on how to clean the telegram-purple directory to deal with revoked sessions 2017-10-15 20:07:03 +02:00
Ben Wiederhake
7aa6874074 Update nsi file to reflect changes in po/LINGUAS 2017-04-10 22:54:08 +02:00
Ben Wiederhake
065e0b7ac9 Silence warnings about bad .po files
Sadly, Transifex doesn't seem to acknowledge that the generated files
are bad.  Also, I don't want to introduce any infrastructure to
fix the files every time after I download them.
So they stay broken, and the warnings must be silenced.
Sadly, this means that future warnings will get ignored, too.
Let's hope this won't go too bad.
2017-04-10 22:17:54 +02:00
mjentsch
6fd109bfca Increase version to 1.3.1 2017-04-09 13:48:52 +02:00
Ben Wiederhake
ada2c9aa1f AppStream: import translations from Transifex. Thanks to samant! 2017-03-13 23:36:27 +01:00
Ben Wiederhake
42c9ea8a3a AppStream: fix target order
Ahh, right, thankyou make, for reminding me that 'all' isn't actually
any automagically chosen target that is chosen when no target has been
specified.  No, instead, the first target is chosen.
And not just any target!  Only the first non-templated target is chosen,
so in this case: po/telegram-purple.metainfo.xml.pot .

However, in our case that's utterly pointless, so 'all' needs to
be on top again.  I should have known there was an important reason.
2017-03-13 23:35:59 +01:00
Ben Wiederhake
2ffa9e176a Import translations from Transifex. Thanks to eischmann, raven, savant! 2017-03-13 23:30:39 +01:00
mjentsch
77d50c3ae1 Merge branch 'EionRobb-group-typing-notifications' into dev-1.4.0
Merges pull request #359
2017-03-13 22:32:15 +01:00
mjentsch
ea0efaeab7 Merge branch 'dev-1.4.0' of https://github.com/majn/telegram-purple into dev-1.4.0 2017-03-13 22:28:38 +01:00
mjentsch
942e7c6244 Include autoloading for all types of documents and improve document captions 2017-03-13 22:28:10 +01:00
mjentsch
72151e7cbd Increase default file size download threshold
Far too many files are bigger than 8mb, we need a more pleasant default behavior
2017-03-13 21:56:49 +01:00
Eion Robb
0446ca2b9b Support typing notifications using the group-typing-notifications plugin
See https://github.com/EionRobb/pidgin-groupchat-typing-notifications
2017-03-13 22:27:01 +13:00
Ben Wiederhake
653eb902ce Import tgl updates 2017-03-06 22:01:07 +01:00
mjentsch
ab5b444e26 code style 2017-03-06 20:13:45 +01:00
mjentsch
014145c8ee Include libtgl crash and c++ compilation fixes 2017-03-02 20:34:02 +01:00
mjentsch
1cb22c9df1 Fix debug message 2017-03-02 20:24:33 +01:00
mjentsch
5a59dc100c Include pull request #302 by EionRobb 2017-03-02 20:23:17 +01:00
Ben Wiederhake
1842756995 Import plugin translations from Transifex. Thanks to all translators!
Also removed outdated HOWTO.md; and deprecated pt_BR,
as it fell below the 75% mark.
2017-02-27 11:47:10 +01:00
Ben Wiederhake
ea697f1cc7 Import AppStream translations from Transifex. Thanks to all translators! 2017-02-27 10:57:41 +01:00
Samuel Vandamme
20c78ce94c Added missing dependencies for Debian/Ubuntu 2017-02-24 22:30:37 +01:00
mjentsch
c0210af0b9 Fix crash on joining non-existing chat 2017-02-11 12:51:33 +01:00
mjentsch
aa3e220738 Increase version of OSX SDK for Adium bundle 2017-02-11 12:51:33 +01:00
mjentsch
4980fa460c Fix crash on duplicated peer name in peer tree 2017-02-11 12:51:33 +01:00
Ben Wiederhake
d8a040b5d5 tgl patch for OpenSSL variant 2017-01-22 22:09:04 +01:00
Ben Wiederhake
c5929af862 Merge branch 'master' into dev-1.4.0 2017-01-22 22:07:52 +01:00
mj
766335c34d Update README.md 2017-01-16 12:18:34 +01:00
mj
2ca2c46807 Merge pull request #342 from redsn0w0/patch-1
Update README.md
2017-01-16 10:54:59 +01:00
redsn0w
6234a65228 Update README.md
Fixed the telegram group invite link.
2017-01-14 12:15:44 +01:00
Ben Wiederhake
f45ed4572a Print some info when running into 'Sending message failed' errors
Related to #339
2017-01-09 18:22:17 +01:00
Ben Wiederhake
5de79c45a6 Merge branch 'master' into dev-1.4.0 2017-01-09 17:42:44 +01:00
mj
c52854ae51 Fix group chat link 2017-01-02 15:15:30 +01:00
mj
1dc5e2ba46 Merge pull request #334 from stefan2904/patch-1
updated readme to telegram-adium-1.3.0
2016-12-13 08:05:24 +01:00
Stefan
345006633c updated readme to telegram-adium-1.3.0 2016-12-13 00:31:12 +01:00
Ben Wiederhake
bb215b59d3 Import translations form Transifex. Thanks to all translators!
I'm aware that the new PO files are fishy and throw a lot of warnings.
I've created a ticket with Transifex, as their new PO-generation routine
seems to be bug-ridden.

However, until they fix it, we have to use the ugly value for msgid "".
2016-11-28 01:09:43 +01:00
Ben Wiederhake
59ec18fe1b Merge branch 'dev-1.3.0' into dev-1.4.0 2016-11-27 23:53:54 +01:00
mjentsch
7744facaec Merge branch 'chat-kick-c' of https://github.com/EionRobb/telegram-purple into dev-1.4.0 2016-11-13 19:26:55 +01:00
Eion Robb
71276b109e Add support for a /kick command in chat rooms 2016-11-13 09:22:28 +13:00
mj
cd451723ef Update README.md
Update chat link
2016-10-29 19:09:01 +02:00
Ben Wiederhake
a904aa37da Enable stack smashing protection (#315)
Check "by example" whether `-fstack-protector-strong` is supported.
2016-10-13 16:02:37 +02:00
Alain
ab7dcb8ee6 Changed check if -fstack-protector-strong is supported 2016-10-13 15:41:22 +02:00
Alain
0d0a2cbbd7 Check if gcc >= 5.0 before enabling stack smashing protection 2016-10-13 13:48:06 +02:00
Alain
9d86bf2af6 Enhance security using stack protector and -D_FORTIFY_SOURCE 2016-10-13 12:38:07 +02:00
Ben Wiederhake
23864bf541 Only load photos for non-deleted users 2016-10-11 00:13:09 +02:00
Ben Wiederhake
5fea0dae38 Merge Pull Request #304 from EionRobb/patch-4 2016-09-04 21:54:16 +02:00
Ben Wiederhake
82a5cbbf5a Merge Pull Request #303 from EionRobb/patch-3 2016-09-04 21:53:56 +02:00
Ben Wiederhake
6f89e259df Update tgl (32-bit BN2ull) 2016-09-04 21:52:41 +02:00
Eion Robb
f4b47623cf Compile tgp-info on Windows 2016-09-02 20:52:39 +12:00
Eion Robb
8b46df36b6 tgl Windows Makefile no longer needs scheme version
This change was made a while ago in the Makefile.in but not brought through to the mingw Makefile
2016-09-02 20:51:34 +12:00
Ben Wiederhake
f75e3e9954 Produce new master-pot 2016-08-31 22:55:47 +02:00
Ben Wiederhake
b7283219c0 Makefile: remove superfluous indirection 2016-08-30 00:39:29 +02:00
Ben Wiederhake
80d3146ebb Fix tgl build (don't dep on xxd, don't create empty file)
Fixes #298.
2016-08-30 00:26:12 +02:00
Ben Wiederhake
150f0c48cc Only build required libraries 2016-08-22 22:38:31 +02:00
Ben Wiederhake
4d8995d565 Merge pull request #299 from ilario/master
README.md: add submodule update in Debian package build instructions
2016-08-19 21:48:11 +02:00
Ilario Gelmetti
1798a43d91 README.md: add submodule update in Debian package build instructions 2016-08-19 17:14:45 +02:00
Ben Wiederhake
0340e4f14b Fix description how to build Debian package 2016-08-08 10:53:04 +02:00
Ben Wiederhake
43e5f81683 build: properly clean up 2016-08-08 10:53:04 +02:00
Ben Wiederhake
be0d4cd299 build: proper recursion in make 2016-08-08 10:53:04 +02:00
Ben Wiederhake
de3100e6f2 Minor typos 2016-08-08 10:25:11 +02:00
mjentsch
bf837abf38 Update CHANGELOG 2016-08-08 00:57:04 +02:00
mjentsch
0926d27195 Fix dropped HTML messages
Remove ability to send bold and italic messages to quick-fix a bug that causes
messages with unknown formatting to be dropped by libtgl.
2016-08-08 00:03:19 +02:00
mjentsch
1c32a0ef9e Fix clang warnings. 2016-08-02 01:27:00 +02:00
Ben Wiederhake
99d684bf89 Check for error return values of tgl_init 2016-08-02 01:10:02 +02:00
Ben Wiederhake
f2431f3a3a Fix tgl for OpenSSL-mode 2016-08-02 00:40:41 +02:00
Ben Wiederhake
a6b2ea20e1 Update LINGUAS 2016-08-02 00:04:45 +02:00
Ben Wiederhake
e1242691d2 Comments shouldn't be printed 2016-08-02 00:04:45 +02:00
Ben Wiederhake
b15d0a3f86 Import from Transifex: updated translations. Thank you! 2016-08-02 00:04:45 +02:00
Ben Wiederhake
9a2c6a73ac Import intermediate translation 2016-08-02 00:04:45 +02:00
mjentsch
35faf09857 Merge important crash fixes in tgl 2016-08-01 23:57:13 +02:00
mjentsch
11631ace8b Merge branch 'master' of https://github.com/majn/telegram-purple into dev-1.3.0 2016-08-01 23:28:26 +02:00
mjentsch
7463ef080e Merge HTML href fix in libtgl 2016-07-22 21:05:45 +02:00
mjentsch
e926b216b6 Fix code style 2016-06-30 19:29:55 +02:00
mjentsch
6940278a51 Merge HTML fixes in libtgl 2016-04-10 18:27:21 +02:00
mjentsch
daeb7db701 Only fetch history for joined channels
Prevent loading history for non-joined channels that may occur when messages forwarded for non-joined channels are being fetched.
2016-04-03 17:16:13 +02:00
mjentsch
786394bb3e Fix history in Adium, store channel sequence as account options instead of the blist 2016-04-03 17:04:35 +02:00
mjentsch
01104c87d3 Disable style tags in Adium, not working with Telegram 2016-04-02 22:37:57 +02:00
mjentsch
413e449112 cleanup 2016-04-02 22:28:03 +02:00
mjentsch
5f7da0ab50 Fix use-after-free, improve forward messages 2016-04-02 22:00:08 +02:00
mjentsch
e73e247444 Auto-load audio, video and animated messages up to 8mb
Reduce the amount of annoying popup messages for file transfers. Don't do it for Adium, which doesn't support file-links for security reasons. Make the threshold configurable.
2016-04-02 21:58:08 +02:00
mjentsch
921db6bc5c Fix outgoing message handling 2016-03-28 01:12:35 +02:00
mjentsch
a35c6cdd3b Support sending code tags and improve inline image handling
Properly parse inline img tags in messages to support multiple inline messages in one message.
Adium: remove adium-specific code path and allow embedding markup in outgoing message
2016-03-27 03:00:23 +02:00
Eion Robb
7205b4df1b Update telegram-purple.c to say that the connection supports HTML messages 2016-03-27 03:00:23 +02:00
Eion Robb
952a41f1ed Update tgp-msg.c to flag outgoing messages as HTML 2016-03-27 03:00:23 +02:00
Ben Wiederhake
81f33055b5 Use constant instead of magic string 2016-03-23 16:32:07 +01:00
Ben Wiederhake
7103bf9bfe Remove unused file 2016-03-23 16:32:07 +01:00
Ben Wiederhake
e828fc36ef Allow out-of-vcs builds 2016-03-23 16:32:07 +01:00
Ben Wiederhake
70340d7b55 Extract script to generate origtar 2016-03-23 16:32:07 +01:00
Ben Wiederhake
7439a68b09 Extract script to generate commit.h 2016-03-23 16:32:07 +01:00
Ben Wiederhake
6684a75865 Include HACKING files
Closes #242 by keeping track of all requirements, rationals,
and approaches in a version-controlled file.
2016-03-23 16:32:07 +01:00
Ben Wiederhake
4de2a69ac1 Use correct repository 2016-03-23 16:31:10 +01:00
mjentsch
6a6bff563b Merge branch 'dev-1.3.0' of https://github.com/majn/telegram-purple into dev-1.3.0 2016-03-23 14:00:48 +01:00
mjentsch
c595e9ef14 Always load channel history on startup 2016-03-23 12:57:27 +01:00
mjentsch
236083e217 Fix coding guidelines 2016-03-23 12:49:16 +01:00
mjentsch
aa87311f6d Fix crash on deleted chat 2016-03-23 12:48:14 +01:00
mjentsch
236153cee7 Reduce the amount of needless read recipes being sent 2016-03-23 12:47:24 +01:00
mjentsch
dc9dac44ff Fix compiling Adium plugin 2016-03-23 12:46:29 +01:00
mjentsch
004f84b544 Experimental support for channel history
Fetch missing channel history, keep track of message IDs. Still broken in Adium.
2016-03-23 12:46:04 +01:00
mjentsch
a3341cb5cf Merge branch 'master' into dev-1.3.0 2016-03-20 17:18:37 +01:00
Ben Wiederhake
ee2a6fb740 Merge pull request #254 from rshadow/master
Fix README.md prerequires for deb
2016-03-17 11:21:07 +01:00
Roman V. Nikolaev
ff66ed2512 Fix README.md prerequires for deb 2016-03-17 01:10:35 +03:00
Ben Wiederhake
1388bc6ed7 Fix empty group handling
Fixes #203.
2016-03-11 15:06:35 +01:00
mjentsch
54cfce4df2 Bump version to 1.2.6 2016-03-11 13:10:14 +01:00
mjentsch
d020f9c32a Fix Adium bundle breaking on library version jumps
Link against the generic libpurple and glib bundled with Adium instead of the specific version number to avoid breakage on version updates.
2016-03-11 12:18:08 +01:00
mjentsch
3107a601eb Merge libtgl fix use-after-not-created for photos 2016-02-27 17:59:03 +01:00
mj
cb12fbf4f9 Update group chat link 2016-02-27 17:55:01 +01:00
mj
a0ecd0c66d Merge pull request #246 from khorben/khorben/configure-equals
Portability fix for POSIX shells
2016-02-24 10:28:45 +01:00
Pierre Pronchery
a61c9db881 Portability fix for POSIX shells
Only a handful of shells support the "==" comparison operator for
the "test" built-in. The standard, portable operator is "=" instead.
2016-02-24 03:39:01 +01:00
Ben Wiederhake
0c1623a8f6 Fix the system one more time
Closes #242. Hopefully.
2016-02-19 01:54:07 +01:00
Ben Wiederhake
d4f52a175c Generate and upload new potfile for 1.3.0 2016-02-18 21:41:59 +01:00
Ben Wiederhake
37438544df AppStream: auto-generate translated file 2016-02-18 21:41:59 +01:00
Ben Wiederhake
b45e494771 AppStream: import translations from transifex. Thank you all! 2016-02-18 21:41:59 +01:00
Ben Wiederhake
e5adfc1bd6 Let autogen.sh take care of the .nsi 2016-02-18 21:41:59 +01:00
Ben Wiederhake
5828496b52 Auto-generate .nsi via awk script
Fixes #195
2016-02-18 21:41:59 +01:00
Ben Wiederhake
1398ab1362 README.md: uniform orig-tarball generation 2016-02-18 21:41:59 +01:00
Ben Wiederhake
b30905ef41 Add safety belts when building .orig.tar.gz 2016-02-18 21:41:59 +01:00
Ben Wiederhake
f872bb9bc3 Create a .orig.tar.gz reproducibly
Where "reproducible" means:
Every execution on every machine will always
generate the exact same, bitwise identical result,
when at the same git commit.

Closes #100.
2016-02-18 21:41:59 +01:00
Ben Wiederhake
a00d1ee6c6 Update README.md for Debian installation 2016-02-18 21:41:59 +01:00
Ben Wiederhake
84f742de3a AppStream: add German language 2016-02-18 21:41:59 +01:00
Ben Wiederhake
26e5b2de9f Fix gitignore patterns for *.mo 2016-02-18 21:41:59 +01:00
Ben Wiederhake
8779215927 AppStream: allow for translations
Fixes #211
2016-02-18 21:41:59 +01:00
Ben Wiederhake
cc8873682a AppStream: Add bugtracker, fix XML
Note: I don't care what the header looks like.
I just want the diff between "with translation" and
"without translation" to be as small as possible.
2016-02-18 21:41:59 +01:00
Ben Wiederhake
9b4fa898a9 Reflow AppStream file 2016-02-18 21:41:59 +01:00
Ben Wiederhake
dd349ff7cb Fix typos and errors in strings 2016-02-18 21:41:59 +01:00
Ben Wiederhake
5c88b021af Clean up 'clean' target 2016-02-18 21:41:59 +01:00
Ben Wiederhake
f648686f1b Correctly build commit.h without complaining
The old version threw ugly warnings when commit.h didn't exist (ugh),
and it depended on ifneq, which I don't really like (second ugh).
2016-02-18 21:41:59 +01:00
mjentsch
4e3b913a9d Remove unneeded code 2016-02-17 20:53:20 +01:00
mjentsch
0a786049fc Fix auto-join and bookmarks in Adium
Fix a regression that was caused by automatically adding all chats to the blist. Adiums method for joining chats by name assumes that an existing chat in the blist means we already joined and not join the chat.
2016-02-17 20:52:45 +01:00
mjentsch
abbaad7a0c Support leaving channels and exporting channel invite links 2016-02-14 00:34:30 +01:00
mjentsch
496eb6328f Add hint for phone number 2016-02-10 23:23:54 +01:00
mjentsch
581e024254 Display chat and channel icons, refactor image loading code 2016-02-10 02:03:46 +01:00
mjentsch
1070b5a6e7 Cleanup and add a few notes 2016-02-07 18:23:12 +01:00
mjentsch
e8005883ab Display channels and supergroups in roomlist 2016-02-07 00:40:48 +01:00
mjentsch
fbe3a7fbba Support supergroups and displaying channel members
Change all channels to be chats instead of regular buddies and implement fetching channel memberships. Remove some unneeded code scraps from old channel handling.
2016-02-07 00:04:31 +01:00
mjentsch
4ef719cd3a Emphasize that just the contact will be deleted, not the dialogue list entry. 2016-01-25 23:23:34 +01:00
mjentsch
69acd90512 Support deleting contacts, handle deletions of chats and channels
When a user deletes a buddy list entry, ask if the chat or channel should be destroyed / left or the contact should be deleted. In many cases, deleting a buddy from the blist would have no effect, since the buddy would show up again on the next startup, which is most likely confusing to the user. Just destroying the chat or the channel is dangerous too, so ask for confirmation every time this happens to let the user choose what to do with that entry.
2016-01-25 00:59:56 +01:00
mjentsch
8100114319 Handle contacts added on different devices
Assure to add contacts, even when they are not in the dialog list. Refactor contact handling.
2016-01-25 00:51:33 +01:00
mjentsch
00b709e39f Display incoming read recipes for secret chats
Outgoing still don't work they aren't implemented in libtgl yet.
2016-01-24 22:16:20 +01:00
mjentsch
af70b22699 Handle group chats more intuitively
Remove all left chats from buddy list when selecting to auto-join chats and also make that option default.
2016-01-24 21:36:41 +01:00
mjentsch
660376b9df Remove all left chats
Use new TGLCF_LEFT instead of user count to determine left chats more reliably.
2016-01-24 21:29:48 +01:00
mjentsch
4e08542823 Change version back to 1.3.0 2016-01-24 21:23:35 +01:00
mjentsch
9edcd8f6e5 Fix run scheme in Adium 2016-01-24 21:19:59 +01:00
mjentsch
90a4286e90 Fix compilation error 2016-01-24 20:40:36 +01:00
mjentsch
ac1c748650 Merge branch 'master' into dev-1.3.0 2016-01-24 18:22:18 +01:00
mjentsch
df29bbcda1 Update bundle link 2016-01-24 16:17:10 +01:00
mjentsch
68b71dae70 Fix tgp version displayed as NULL in sessions
Set telegram-purple version in app data, to make the correct version
show up in the session dialogue.
2016-01-24 16:11:33 +01:00
mjentsch
9208d9b1e9 Show version in Adium Xtras
Until now the adium plugin version was only shown in the bundle info,
not inside Adium.
2016-01-24 15:41:15 +01:00
mjentsch
fc0b402d72 Increase version to 1.2.5 2016-01-24 15:17:54 +01:00
mjentsch
9cd264dea6 Still display the message when the chat info cannot be fetched
User objects will be allocated once they send a message that needs to be displayed, until then the users will just not show up in the user list of the chat.
2016-01-24 15:17:54 +01:00
mjentsch
739f2b7e46 Improve error handling a little more 2016-01-24 15:17:54 +01:00
mjentsch
1808ca4984 Automatically refresh revoked sessions and prompt for a new code 2016-01-24 15:17:54 +01:00
mjentsch
6a8760d5d3 Graceful error handling
Never kill process on issues, always log errors and write errors instead of failed messages.
2016-01-24 15:17:54 +01:00
mjentsch
625374fbc4 Include libtgl fix for channel messages 2016-01-24 15:17:54 +01:00
mj
65105dd11b Fix group chat link 2016-01-15 18:20:03 +01:00
mjentsch
6eee0c3c43 Use flags instead of users_num to check if a chat is already left 2016-01-12 23:53:49 +01:00
mj
2c74a733d5 Update chat link 2016-01-12 11:15:53 +01:00
mjentsch
9ad31b041a Update submodule branch to include all fixes 2016-01-10 02:12:27 +01:00
mjentsch
ff7300f6c9 Merge branch 'dev-1.2.5' into dev-1.3.0 2016-01-10 01:45:57 +01:00
mjentsch
d032f3a237 cleanup 2016-01-10 01:27:38 +01:00
mjentsch
d8fc5281ce Fix buddy icon refreshing and refactor user info and icon handling
Keep track of loaded pictures to refresh user pictures more reliably. Create new file tgp-info to contain all code related to user information and icons. Clean up the messy code for fetching user info and user pictures and provide a streamlined function in tg-info.
2016-01-10 01:27:38 +01:00
mjentsch
4438dcae0e Include libtgl fix for channel messages 2016-01-09 18:33:31 +01:00
Ben Wiederhake
8e3cebf165 Output commit in debug message on startup
Fixes #214.
2016-01-07 10:53:07 +01:00
Ben Wiederhake
dec3a260c4 Make tgl in appropriate place
Fixes #206.
2016-01-07 10:51:24 +01:00
Ben Wiederhake
a8cf6f88d0 Typos, email-addresses, trailing spaces 2016-01-07 10:51:24 +01:00
Ben Wiederhake
f4f058edb5 Add target noicon_install
This moves the feature #100 from the ./configure option to a make target,
which reduces the combinatory explosion of the ./configure options.
2016-01-07 10:51:24 +01:00
Ben Wiederhake
f958dfe2bc Re-order Makefile to be more sensible 2016-01-06 12:32:06 +01:00
Ben Wiederhake
1e78c9685c Merge branch 'master' into dev-1.3.0
Conflicts:
  rpm/purple-telegram.spec
  tgl
  tgp-ft.c
2016-01-06 12:30:35 +01:00
mj
cf851ad630 Remove Webupd8 PPA until it contains the hotfix 2016-01-06 10:59:46 +01:00
mj
4079aea8c0 Merge pull request #208 from tuxmaster/master
Fix appdata build for rpm.
2016-01-05 11:44:36 +01:00
tuxmaster
e4d04d990b Fix appdata build. 2016-01-05 07:01:14 +01:00
mj
7611afc323 Update README.md 2016-01-05 00:34:35 +01:00
Ben Wiederhake
a22204df13 Don't hardcode paths
Sometimes I'm really, really dumb.
2016-01-02 00:58:54 +01:00
Ben Wiederhake
d498c116ed Active logging on Travis 2016-01-02 00:58:54 +01:00
Ben Wiederhake
ef7a655dea Add new test with dummy frontend 2016-01-02 00:58:34 +01:00
Ben Wiederhake
0a349cc38e Fix name of test, fix clean target
Since this is a trivial change, [skip ci]
2016-01-02 00:22:17 +01:00
Ben Wiederhake
f41571934a Slim down combinations
Can't 'skip' this build: the .travis.yml still needs to be checked.
2016-01-02 00:22:17 +01:00
Ben Wiederhake
a0a03fe35e Include new test goals, integrate with Travis 2016-01-02 00:22:17 +01:00
Ben Wiederhake
7ce2d397b8 Implement very basic test.
This can only detect missing symbols or other severe failures.
2016-01-02 00:22:17 +01:00
Ben Wiederhake
cf121a5d59 Build all combinations 2016-01-02 00:22:17 +01:00
Ben Wiederhake
7d7f67f227 Build on trusty 2016-01-02 00:22:17 +01:00
Ben Wiederhake
2d4c06883f gcrypt20 not available in U12.04.5 2016-01-02 00:22:17 +01:00
Ben Wiederhake
9d8db69aad Broken submodule support, need to mention apt-get explicitely 2016-01-02 00:22:17 +01:00
Ben Wiederhake
fbba265512 First version for Travis 2016-01-02 00:22:17 +01:00
Ben Wiederhake
be4f5877c4 Fix compilation error 2016-01-02 00:22:17 +01:00
Ben Wiederhake
26669c8a6c Remove private files 2016-01-02 00:22:17 +01:00
Ben Wiederhake
39177beff9 Refresh/harden .gitignore-files 2016-01-02 00:22:17 +01:00
mjentsch
97f26e9b24 Merge branch 'master' into dev-1.3.0 2016-01-02 00:09:57 +01:00
mjentsch
3b3a4eafc2 Merge branch 'dev-1.2.3' into dev-1.3.0 2015-12-30 16:32:28 +01:00
mjentsch
b828460886 Merge branch 'dev-1.2.3' into dev-1.3.0 2015-12-19 22:02:54 +01:00
mjentsch
65c96cae5a Fix secret chats not being properly canceled 2015-12-19 02:25:04 +01:00
mjentsch
00bf713c43 Fix secret chat not being removed when the other peer ends it 2015-12-19 02:25:04 +01:00
mjentsch
f2fd8a981b coding style 2015-12-19 02:25:04 +01:00
Ben Wiederhake
233e6c2811 Generate and upload new potfile for 1.3.0 2015-12-18 13:51:54 +01:00
mj
b818752acc Merge pull request #181 from tuxmaster/dev-1.3.0
Prepare for 1.3.0
2015-12-13 13:42:52 +01:00
tuxmaster
b61131c7e1 Prepare for 1.3.0 2015-12-10 12:30:31 +01:00
mjentsch
de72552309 Ignore the file containing the current commit hash 2015-12-08 11:24:56 +01:00
mjentsch
b1fb7e500c Improve logging of peer flags 2015-12-08 11:24:01 +01:00
mjentsch
c8befa2c9e Display correct display time for special chats
Bug was introduced a few commits earlier in the test branch during refactoring.
2015-12-07 23:45:15 +01:00
mjentsch
85e7f17e65 Display newly added channels as online 2015-12-07 23:39:53 +01:00
mjentsch
618cbf7001 Handle channel photo updates and channel deletions
Change channel photo on update, delete channels from blist when leaving.
2015-12-07 23:15:17 +01:00
mjentsch
d1d03da879 Create a channel that is created in other clients during the session 2015-12-07 22:28:09 +01:00
mjentsch
60d6b3c8e5 Improve error handling when sending to non-ready secret chats 2015-12-07 00:32:54 +01:00
mjentsch
bab470cf1f Support posting documents to channels 2015-12-07 00:27:16 +01:00
mjentsch
350bdad82e Improve error handling for channels 2015-12-07 00:26:21 +01:00
mjentsch
5bd31bdae0 Add basic channel support 2015-12-06 23:46:09 +01:00
mjentsch
498f87eff5 Remove code duplication 2015-12-06 22:57:50 +01:00
mjentsch
a1f49d4748 Translate plugin description and update version/authors 2015-12-06 22:20:01 +01:00
mjentsch
5d6f9f35bb Remove migration for translated group names
Keep it maintainable and non-intrusive, the affected users can easily move the buddies into the new chat.
2015-12-06 22:04:54 +01:00
mjentsch
b2194b6a5d Translate group names 2015-12-06 20:38:06 +01:00
mjentsch
51e7d211fe Improve logging 2015-12-06 19:21:58 +01:00
mjentsch
7a6792ff04 Update copyright strings
Add current year where its left out, add missing authors and remove authors without any contributions in that file.
2015-12-05 20:40:08 +01:00
mjentsch
0bb5b0121d Make gettext dependency optional 2015-12-05 20:31:08 +01:00
mjentsch
53c6b384ec Clean up comments in Makefile.in 2015-12-05 16:56:40 +01:00
mjentsch
7d5722462f Display git commit in commit.h 2015-12-05 16:55:03 +01:00
mjentsch
b2845e41aa Clean up code
Order update callbacks just like in libtgl.h
2015-12-05 12:31:18 +01:00
mjentsch
fc1863cca9 Remove (now) unused function declaration. 2015-12-05 11:27:54 +01:00
mjentsch
9019ee1038 Comment-out unused function 2015-12-05 10:48:31 +01:00
mjentsch
eebd337929 Upgrade libtgl that supports layer 42 2015-12-03 23:16:28 +01:00
mjentsch
3670c41f41 Push partial implementation of displaying forwarded messages 2015-12-03 21:31:00 +01:00
97 changed files with 9010 additions and 2868 deletions

25
.gitignore vendored
View file

@ -1,14 +1,11 @@
*.o
*.so
*.mo
tg/
auto/
autom4te.cache/
config.h
config.h.in~
dep/
libs/
bin/
config.log
config.status
Makefile
/objs/
/autom4te.cache/
/config.h
*~
/dep/
/libs/
/bin/
/config.log
/config.status
/Makefile
/commit.h

48
.travis.yml Normal file
View file

@ -0,0 +1,48 @@
language: c
# Select Trusty Tahr.
sudo: required
dist: trusty
# Travis' git submodule support is ... broken? half-broken? Maybe intentional?
git:
submodules: false
depth: 3
before_install:
- git submodule update --init --recursive
- sudo apt-get update -qq
- sudo apt-get install -qq libssl-dev libgcrypt20-dev libpurple-dev libwebp-dev
script:
- ./configure $CONFIGURE_FLAGS
- make -j2
- make check
compiler:
- clang
- gcc
env:
# Try to be nice to the builder
- CONFIGURE_FLAGS=""
- CONFIGURE_FLAGS="--disable-gcrypt"
- CONFIGURE_FLAGS=" --disable-libwebp"
# - CONFIGURE_FLAGS="--disable-gcrypt --disable-libwebp"
- CONFIGURE_FLAGS=" --disable-translation"
# - CONFIGURE_FLAGS="--disable-gcrypt --disable-translation"
# - CONFIGURE_FLAGS=" --disable-libwebp --disable-translation"
- CONFIGURE_FLAGS="--disable-gcrypt --disable-libwebp --disable-translation"
matrix:
# Be even nicer by excluding half of the combinations
exclude:
- compiler: clang
env: CONFIGURE_FLAGS=""
- compiler: gcc
env: CONFIGURE_FLAGS="--disable-gcrypt"
- compiler: clang
env: CONFIGURE_FLAGS=" --disable-libwebp"
# - compiler: XXX
# env: CONFIGURE_FLAGS="--disable-gcrypt --disable-libwebp"
- compiler: gcc
env: CONFIGURE_FLAGS=" --disable-translation"
# - compiler: clang
# env: CONFIGURE_FLAGS="--disable-gcrypt --disable-translation"
# - compiler: gcc
# env: CONFIGURE_FLAGS=" --disable-libwebp --disable-translation"
- compiler: clang
env: CONFIGURE_FLAGS="--disable-gcrypt --disable-libwebp --disable-translation"

45
AppStream/Makefile Normal file
View file

@ -0,0 +1,45 @@
# This file is part of telegram-purple
#
# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
#
# Copyright Ben Wiederhake 2016
# This file is NOT meant for inclusion into the main Makefile.
LOCALES=$(shell cat po/LINGUAS)
LOCALE_MOS=$(addprefix po/,$(addsuffix .mo,$(LOCALES)))
# Hardcoded, since this should only be run on very few machines anyway,
# which are expected to have msgfmt on their $PATH
MSGFMT_PATH=msgfmt
all: translate
po/%.mo: po/%.po
${MSGFMT_PATH} -cf -o $@ $<
po/telegram-purple.metainfo.xml.pot: telegram-purple.metainfo.untranslated.xml as-metainfo.its
itstool -i as-metainfo.its -o $@ $<
# CAREFUL WHEN EDITING!
# "-j raw.xml *.mo" must be the last options!
telegram-purple.metainfo.xml: as-metainfo.its telegram-purple.metainfo.untranslated.xml $(LOCALE_MOS) po/LINGUAS
itstool -i as-metainfo.its -o $@ \
-j telegram-purple.metainfo.untranslated.xml $(LOCALE_MOS)
.PHONY: potfile
potfile: po/telegram-purple.metainfo.xml.pot
.PHONY: translate
translate: telegram-purple.metainfo.xml

23
AppStream/as-metainfo.its Normal file
View file

@ -0,0 +1,23 @@
<!-- Copyright © 2012-2015 Matthias Klumpp.
This material may only be distributed subject to the terms and
conditions set forth in the GNU Free Documentation License (GFDL),
V1.2 with no invariant sections or later (the latest version is
presently available at http://www.gnu.org/licenses/fdl.txt).
This file bases on the "Quickstart Translation using itstool":
http://www.freedesktop.org/software/appstream/docs/sect-Quickstart-Translation.html
The copyright for the base transformer was found at:
http://www.freedesktop.org/software/appstream/docs/index.html
-->
<its:rules
xmlns:its="http://www.w3.org/2005/11/its"
version="1.0">
<its:translateRule translate="no" selector="/component"/>
<its:translateRule translate="yes"
selector="/component/name |
/component/summary |
/component/description |
/component/screenshots/screenshot/caption |
/component/developer_name"/>
</its:rules>

1
AppStream/po/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/*.mo

12
AppStream/po/LINGUAS Normal file
View file

@ -0,0 +1,12 @@
bg
cs_CZ
de_DE
es
es_AR
fr
it_IT
nl
pl_PL
ru_RU
sq
uk

25
AppStream/po/bg.po Normal file
View file

@ -0,0 +1,25 @@
#
# Translators:
# Любомир Василев, 2016
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"POT-Creation-Date: 2016-01-07 23:23+0100\n"
"PO-Revision-Date: 2016-10-19 14:07+0000\n"
"Last-Translator: Любомир Василев\n"
"Language-Team: Bulgarian (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/bg/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. (itstool) path: component/name
#: telegram-purple.metainfo.untranslated.xml:9
msgid "Telegram"
msgstr "Telegram"
#. (itstool) path: component/summary
#: telegram-purple.metainfo.untranslated.xml:10
msgid "A plugin that adds support for Telegram"
msgstr "Добавка, която добавя поддръжка на Telegram"

25
AppStream/po/cs_CZ.po Normal file
View file

@ -0,0 +1,25 @@
#
# Translators:
# Jan Breuer <j123b567@jaybee.cz>, 2016
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"POT-Creation-Date: 2016-01-07 23:23+0100\n"
"PO-Revision-Date: 2016-02-18 14:45+0000\n"
"Last-Translator: Jan Breuer <j123b567@jaybee.cz>\n"
"Language-Team: Czech (Czech Republic) (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/cs_CZ/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: cs_CZ\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
#. (itstool) path: component/name
#: telegram-purple.metainfo.untranslated.xml:9
msgid "Telegram"
msgstr "Telegram"
#. (itstool) path: component/summary
#: telegram-purple.metainfo.untranslated.xml:10
msgid "A plugin that adds support for Telegram"
msgstr "Zásuvný modul, který přidá podporu pro Telegram"

25
AppStream/po/de_DE.po Normal file
View file

@ -0,0 +1,25 @@
#
# Translators:
# Ben Wiederhake <BenWiederhake.GitHub@gmx.de>, 2016
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"POT-Creation-Date: 2016-01-07 23:23+0100\n"
"PO-Revision-Date: 2016-01-09 13:14+0000\n"
"Last-Translator: Ben Wiederhake <BenWiederhake.GitHub@gmx.de>\n"
"Language-Team: German (Germany) (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/de_DE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de_DE\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. (itstool) path: component/name
#: telegram-purple.metainfo.untranslated.xml:9
msgid "Telegram"
msgstr "Telegram"
#. (itstool) path: component/summary
#: telegram-purple.metainfo.untranslated.xml:10
msgid "A plugin that adds support for Telegram"
msgstr "Plugin zur Unterstützung von Telegram"

25
AppStream/po/es.po Normal file
View file

@ -0,0 +1,25 @@
#
# Translators:
# aguador <aguador@openmailbox.org>, 2017
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"POT-Creation-Date: 2016-01-07 23:23+0100\n"
"PO-Revision-Date: 2017-02-27 09:08+0000\n"
"Last-Translator: aguador <aguador@openmailbox.org>\n"
"Language-Team: Spanish (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. (itstool) path: component/name
#: telegram-purple.metainfo.untranslated.xml:9
msgid "Telegram"
msgstr "Telegram"
#. (itstool) path: component/summary
#: telegram-purple.metainfo.untranslated.xml:10
msgid "A plugin that adds support for Telegram"
msgstr "Un plugin que añade soporte para Telegram"

25
AppStream/po/es_AR.po Normal file
View file

@ -0,0 +1,25 @@
#
# Translators:
# KNTRO <kntro@msn.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"POT-Creation-Date: 2016-01-07 23:23+0100\n"
"PO-Revision-Date: 2016-10-08 19:37+0000\n"
"Last-Translator: KNTRO <kntro@msn.com>\n"
"Language-Team: Spanish (Argentina) (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/es_AR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es_AR\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. (itstool) path: component/name
#: telegram-purple.metainfo.untranslated.xml:9
msgid "Telegram"
msgstr "Telegram"
#. (itstool) path: component/summary
#: telegram-purple.metainfo.untranslated.xml:10
msgid "A plugin that adds support for Telegram"
msgstr "Un plugin que agrega soporte para Telegram"

25
AppStream/po/fr.po Normal file
View file

@ -0,0 +1,25 @@
#
# Translators:
# Javier Sixto, 2016
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"POT-Creation-Date: 2016-01-07 23:23+0100\n"
"PO-Revision-Date: 2016-04-14 19:51+0000\n"
"Last-Translator: Javier Sixto\n"
"Language-Team: French (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#. (itstool) path: component/name
#: telegram-purple.metainfo.untranslated.xml:9
msgid "Telegram"
msgstr "Telegram"
#. (itstool) path: component/summary
#: telegram-purple.metainfo.untranslated.xml:10
msgid "A plugin that adds support for Telegram"
msgstr "Une extension qui ajoute le support pour Telegram"

25
AppStream/po/it_IT.po Normal file
View file

@ -0,0 +1,25 @@
#
# Translators:
# Giuseppe Pignataro (Fasbyte01) <rogepix@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"POT-Creation-Date: 2016-01-07 23:23+0100\n"
"PO-Revision-Date: 2017-02-27 09:08+0000\n"
"Last-Translator: Giuseppe Pignataro (Fasbyte01) <rogepix@gmail.com>\n"
"Language-Team: Italian (Italy) (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/it_IT/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it_IT\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. (itstool) path: component/name
#: telegram-purple.metainfo.untranslated.xml:9
msgid "Telegram"
msgstr "Telegram"
#. (itstool) path: component/summary
#: telegram-purple.metainfo.untranslated.xml:10
msgid "A plugin that adds support for Telegram"
msgstr "Un plugin che aggiunge il supporto per Telegram"

25
AppStream/po/nl.po Normal file
View file

@ -0,0 +1,25 @@
#
# Translators:
# justin [notsupplied] <inactive+justin50@transifex.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"POT-Creation-Date: 2016-01-07 23:23+0100\n"
"PO-Revision-Date: 2016-10-19 17:56+0000\n"
"Last-Translator: justin [notsupplied] <inactive+justin50@transifex.com>\n"
"Language-Team: Dutch (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. (itstool) path: component/name
#: telegram-purple.metainfo.untranslated.xml:9
msgid "Telegram"
msgstr "Telegram"
#. (itstool) path: component/summary
#: telegram-purple.metainfo.untranslated.xml:10
msgid "A plugin that adds support for Telegram"
msgstr "Een plug-in die ondersteuning voor Telegram toevoegt"

25
AppStream/po/pl_PL.po Normal file
View file

@ -0,0 +1,25 @@
#
# Translators:
# Piotr Drąg <piotrdrag@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"POT-Creation-Date: 2016-01-07 23:23+0100\n"
"PO-Revision-Date: 2017-02-27 09:08+0000\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish (Poland) (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/pl_PL/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pl_PL\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>=14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
#. (itstool) path: component/name
#: telegram-purple.metainfo.untranslated.xml:9
msgid "Telegram"
msgstr "Telegram"
#. (itstool) path: component/summary
#: telegram-purple.metainfo.untranslated.xml:10
msgid "A plugin that adds support for Telegram"
msgstr "Wtyczka dodająca obsługę protokołu Telegram"

25
AppStream/po/ru_RU.po Normal file
View file

@ -0,0 +1,25 @@
#
# Translators:
# Vladimir <TurbaVladimir@yandex.ru>, 2016
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"POT-Creation-Date: 2016-01-07 23:23+0100\n"
"PO-Revision-Date: 2016-02-18 14:45+0000\n"
"Last-Translator: Vladimir <TurbaVladimir@yandex.ru>\n"
"Language-Team: Russian (Russia) (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/ru_RU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru_RU\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
#. (itstool) path: component/name
#: telegram-purple.metainfo.untranslated.xml:9
msgid "Telegram"
msgstr "Telegram"
#. (itstool) path: component/summary
#: telegram-purple.metainfo.untranslated.xml:10
msgid "A plugin that adds support for Telegram"
msgstr "Плагин, добавляющий поддержку Telegram"

25
AppStream/po/sq.po Normal file
View file

@ -0,0 +1,25 @@
#
# Translators:
# Besnik <besnik@programeshqip.org>, 2016
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"POT-Creation-Date: 2016-01-07 23:23+0100\n"
"PO-Revision-Date: 2016-02-18 14:45+0000\n"
"Last-Translator: Besnik <besnik@programeshqip.org>\n"
"Language-Team: Albanian (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/sq/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sq\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. (itstool) path: component/name
#: telegram-purple.metainfo.untranslated.xml:9
msgid "Telegram"
msgstr "Telegram"
#. (itstool) path: component/summary
#: telegram-purple.metainfo.untranslated.xml:10
msgid "A plugin that adds support for Telegram"
msgstr "Një shtojcë që shton mbulim për Telegram-in"

View file

@ -0,0 +1,21 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2016-01-07 23:23+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#. (itstool) path: component/name
#: telegram-purple.metainfo.untranslated.xml:9
msgid "Telegram"
msgstr ""
#. (itstool) path: component/summary
#: telegram-purple.metainfo.untranslated.xml:10
msgid "A plugin that adds support for Telegram"
msgstr ""

25
AppStream/po/uk.po Normal file
View file

@ -0,0 +1,25 @@
#
# Translators:
# Самохвалов Антон <samant.ua@mail.ru>, 2017
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"POT-Creation-Date: 2016-01-07 23:23+0100\n"
"PO-Revision-Date: 2017-03-04 06:36+0000\n"
"Last-Translator: Самохвалов Антон <samant.ua@mail.ru>\n"
"Language-Team: Ukrainian (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/uk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: uk\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#. (itstool) path: component/name
#: telegram-purple.metainfo.untranslated.xml:9
msgid "Telegram"
msgstr "Телеграм"
#. (itstool) path: component/summary
#: telegram-purple.metainfo.untranslated.xml:10
msgid "A plugin that adds support for Telegram"
msgstr "Плагін, що додає підтримку у Телеграм"

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2015 Jiri Eischmann <eischmann@redhat.com>
It is very important that this file does *not* receive any
Invariant Sections as per GFDL.
-->
<component type="addon">
<id>telegram-purple</id>
<extends>pidgin.desktop</extends>
<name>Telegram</name>
<summary>A plugin that adds support for Telegram</summary>
<url type="homepage">https://github.com/majn/telegram-purple</url>
<url type="bugtracker">https://github.com/majn/telegram-purple/issues/</url>
<metadata_license>GFDL-1.3</metadata_license>
<project_license>GPL-2.0+</project_license>
<update_contact>eischmann_at_redhat.com</update_contact>
</component>

View file

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2015 Jiri Eischmann <eischmann@redhat.com>
It is very important that this file does *not* receive any
Invariant Sections as per GFDL.
-->
<component type="addon">
<id>telegram-purple</id>
<extends>pidgin.desktop</extends>
<name>Telegram</name>
<name xml:lang="bg">Telegram</name>
<name xml:lang="cs-CZ">Telegram</name>
<name xml:lang="de-DE">Telegram</name>
<name xml:lang="es">Telegram</name>
<name xml:lang="es-AR">Telegram</name>
<name xml:lang="fr">Telegram</name>
<name xml:lang="it-IT">Telegram</name>
<name xml:lang="nl">Telegram</name>
<name xml:lang="pl-PL">Telegram</name>
<name xml:lang="ru-RU">Telegram</name>
<name xml:lang="sq">Telegram</name>
<name xml:lang="uk">Телеграм</name>
<summary>A plugin that adds support for Telegram</summary>
<summary xml:lang="bg">Добавка, която добавя поддръжка на Telegram</summary>
<summary xml:lang="cs-CZ">Zásuvný modul, který přidá podporu pro Telegram</summary>
<summary xml:lang="de-DE">Plugin zur Unterstützung von Telegram</summary>
<summary xml:lang="es">Un plugin que añade soporte para Telegram</summary>
<summary xml:lang="es-AR">Un plugin que agrega soporte para Telegram</summary>
<summary xml:lang="fr">Une extension qui ajoute le support pour Telegram</summary>
<summary xml:lang="it-IT">Un plugin che aggiunge il supporto per Telegram</summary>
<summary xml:lang="nl">Een plug-in die ondersteuning voor Telegram toevoegt</summary>
<summary xml:lang="pl-PL">Wtyczka dodająca obsługę protokołu Telegram</summary>
<summary xml:lang="ru-RU">Плагин, добавляющий поддержку Telegram</summary>
<summary xml:lang="sq">Një shtojcë që shton mbulim për Telegram-in</summary>
<summary xml:lang="uk">Плагін, що додає підтримку у Телеграм</summary>
<url type="homepage">https://github.com/majn/telegram-purple</url>
<url type="bugtracker">https://github.com/majn/telegram-purple/issues/</url>
<metadata_license>GFDL-1.3</metadata_license>
<project_license>GPL-2.0+</project_license>
<update_contact>eischmann_at_redhat.com</update_contact>
</component>

View file

@ -1,6 +1,57 @@
Changelog
---------
##### 1.3.1
- Stability improvements
- Support auto-loading for documents
- Add support for "typing" in group chats (using group-typing-notifications plugin)
- Add support for /kick command in group chats
##### 1.3.0
- channel/supergroup support
- support sending code tags in markdown "backtick" format (see README for example)
- reduce amount of file-transfer popups in Pidgin, auto-load media in the background
- fix stability issues for the win32 build
- fix multiple crashes in libtgl
##### 1.2.6
- Include libtgl bugfix "use-after-not-created for photos"
- Fix Adium bundle version incompatibillity for newest version
##### 1.2.5
- Include libtgl fix to prevent crashes on certain channel messages
- Improve error handling to be more graceful
##### 1.2.4
- Fix crash on unknown media type
- Fix crash on logout after cancelling a file transfer
##### 1.2.3
- Build: Allow compilation on Windows #52 Thanks Eion!
- Build: Drop dependency on LodePNG, Thanks Ben!
- Build: Gettext is now optional
- Fix issue that prevented to send messages to deleted users in certain cases (#174)
- Fix own user being added to the buddy list in certain cases
- Fix that read recipes of own messages are being displayed (#139)
- Fix encoding inconsistencies with Unicode characters (#177)
- Fix auto-joining for chats (#179)
- Fix client not reconnecting anymore under certain circumstances (#173)
- Fix crash on compat-verification (PullRequest #183)
- Remove pointless "create chat" confirmation dialogue
- Improve logging messages
- Always send read recipes when the user is typing or sending a message
- Improve translation and user messages (#139)
- Use native password prompts (Adium)
##### 1.2.2
- fix some licensing issues by not depending on OpenSSL any longer (thanks Ben!)

38
HACKING.BUILD.md Normal file
View file

@ -0,0 +1,38 @@
# Hacking on the build system
This list was previously maintained as [issue #242](https://github.com/majn/telegram-purple/issues/242), until we realized that this needs proper version-control. (Duh!)
## Exhaustive list of requirements on the build system:
1. `commit.h` must change whenever it disagrees with the current git commit
1. `commit.h` must not change whenever it agrees with the current git commit
1. Must call `cd tgl && ./configure` with appropriate options whenever `tgl/Makefile` is missing, or notices that `./configure` was run. ("Too often" is acceptable as long as `make && make` isn't violated.)
1. Must call `make -C tgl` whenever this might have any effect. ("Too often" is acceptable as long as `make && make` isn't violated.)
1. Any changes due to `make -C tgl` must cause all necessary rebuilds in telegram-purple during the same invocation of make. ("Too often" is acceptable as long as `make && make` isn't violated.)
1. If `tgl/Makefile.in` is missing, explain that we need submodules, and stop.
1. `make -j12` must work fine
1. Must support out-of-CVS builds.
## While ensuring that:
- Must not `-include tgl/Makefile` as it doesn't really support that, and I'm not going to try and convince @vysheng to do that. Also, it's too fragile. You know how he ticks.
- `make && make` must not create any files in the second run (otherwise, `sudo make install` would become hairy)
- Compatibility with other makes
## Approach:
- `commit.h` is a regular file which depends on a .PHONY target `commit`. Building `commit.h` *only* touches `commit.h` if necessary and possible. (=> 1, 2, half of 8)
- Have a target `tgl/Makefile` which depends on `Makefile`. (=> 3)
- The central target `${PRPL_LIBNAME}` shall depend on the .PHONY `submade`, which depends on `tgl/Makefile`, and essentially executes `make -C tgl`. (=> 4, time constraint of 5)
- All objects of telegram-purple depend on `tgl/libs/libtgl.a`. Rationale: if `tgl/libs/libtgl.a` stays the same, then nothing in tgl changed. If `tgl/libs/libtgl.a` changes, then due to lots of black preprocessor magic within tgl, it can't be safely determined which, if any, objects of telegram-purple can be re-used. Also, if tgl got recompiled (~ 1 minute), then tgp can be recompiled, too (~ 5 seconds). (=> dependency constraint of 5)
- Let `tgl/Makefile` depend on `tgl/Makefile.in`, and put the warning into the rule for the latter. (=> 6)
- The above already implies a dependency DAG that is completely known to make; except at one point: let `tgl/libs/libtgl.a` depend on `submade`, without any own code. Now make ensure thread-safety on it's own. (=> 7)
- Bundle commit.h into the origtar (=> other half of 8)
## Side effects:
- Should be ultimately robust. Then again, that's what I thought about the last few attempts, and they didn't last long.
- This reduces the number of .PHONYs drastically, making it easier to read, and making it easier to prove that `make && make` doesn't change anything.
- Even though `submade` should trigger once and only once, this can handle multiple invocations just fine, too.
- All files dependent on `commit.h` need to be mentioned explicitly as dependents in the Makefile. This is ugly, but (as far as I can see) unavoidable. Thankfully, any errors here will get detected by automated testing.
- We currently use only one GNU make specific extension. See https://github.com/majn/telegram-purple/issues/137#issuecomment-167970054

20
HACKING.md Normal file
View file

@ -0,0 +1,20 @@
# Contributing
This is Open Source Software. We realized that we didn't pass the Patch Test
## What to contribute
Here's a few places to start:
- Report any bugs you find.
- No, seriously! Most of the bugs don't even get reported, or the reporter only writes "Doesn't work for me" and then vanishes.
- ["help wanted" issues](https://github.com/majn/telegram-purple/issues?utf8=%E2%9C%93&q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+-label%3A%22in-pipeline%22), especially automated testing
- ["secret chat" issues](https://github.com/majn/telegram-purple/issues?utf8=%E2%9C%93&q=is%3Aopen+is%3Aissue+label%3A%22secret+chats%22+-label%3A%22in-pipeline%22+)
- Portability (especially endianness) of tgl (external project)
- [Issues of tgl](https://github.com/vysheng/tgl/issues) -- lots and lots of false or obsolete reports
- Slim down the size of the generated files in `tgl/auto`, as this currently dominates the build time. Yuk!
- Make sure that the libpurple-devs don't break libpurple any further.
## How to contribute
Write [an issue](https://github.com/majn/telegram-purple/issues/new), shoot us a mail (scrape the address from the git history), or contact us in dev chat (changing URL, see README for that).

View file

@ -22,7 +22,7 @@ datarootdir=@datarootdir@
localedir=@localedir@
gettext_package=@GETTEXT_PACKAGE@
CFLAGS=@CFLAGS@ @PURPLE_CFLAGS@ @DEFS@ -DENABLE_NLS -DLOCALEDIR='"$(localedir)"' -Wall -Wextra -Wno-deprecated-declarations -Wno-unused-parameter -I${srcdir} -I. -fno-strict-aliasing -fPIC
CFLAGS=@CFLAGS@ @PURPLE_CFLAGS@ @DEFS@ -DENABLE_NLS -DLOCALEDIR='"$(localedir)"' -Wall -Wextra -Wno-deprecated-declarations -Wno-unused-parameter -I${srcdir} -I. -fno-strict-aliasing -fPIC -D_FORTIFY_SOURCE=2
LDFLAGS=@LDFLAGS@ @OPENSSL_LIBS@ @PURPLE_LIBS@ @LIBS@ -rdynamic -ggdb
DIR_PERM=0755
FILE_PERM=0644
@ -31,13 +31,18 @@ CC=@CC@
PKG_CONFIG=@PKG_CONFIG@
MSGFMT_PATH=@MSGFMT_PATH@
# Check if -fstack-protector-strong is supported before enabling it
SPUNSUPPORTED = $(shell $(CC) -fstack-protector-strong 2>&1 | grep -c 'stack-protector-strong')
ifeq "$(SPUNSUPPORTED)" "0"
CFLAGS += -fstack-protector-strong
endif
DEP=dep
EXE=bin
OBJ=objs
LIB=libs
DIR_LIST=${DEP} ${EXE} ${OBJ} ${LIB}
DIR_LIST=${DEP} ${EXE} ${OBJ}
PLUGIN_OBJECTS=${OBJ}/tgp-net.o ${OBJ}/tgp-timers.o ${OBJ}/msglog.o ${OBJ}/telegram-base.o ${OBJ}/telegram-purple.o ${OBJ}/tgp-2prpl.o ${OBJ}/tgp-structs.o ${OBJ}/tgp-utils.o ${OBJ}/tgp-chat.o ${OBJ}/tgp-ft.o ${OBJ}/tgp-msg.o ${OBJ}/tgp-request.o ${OBJ}/tgp-blist.o
PLUGIN_OBJECTS=${OBJ}/tgp-net.o ${OBJ}/tgp-timers.o ${OBJ}/msglog.o ${OBJ}/telegram-base.o ${OBJ}/telegram-purple.o ${OBJ}/tgp-2prpl.o ${OBJ}/tgp-structs.o ${OBJ}/tgp-utils.o ${OBJ}/tgp-chat.o ${OBJ}/tgp-ft.o ${OBJ}/tgp-msg.o ${OBJ}/tgp-request.o ${OBJ}/tgp-blist.o ${OBJ}/tgp-info.o
ALL_OBJS=${PLUGIN_OBJECTS}
ifdef MSGFMT_PATH
@ -55,9 +60,14 @@ all: ${PRPL_LIBNAME} $(LOCALE_MOS)
PLUGIN_DIR_PURPLE=$(shell ${PKG_CONFIG} --variable=plugindir purple)
DATA_ROOT_DIR_PURPLE=$(shell ${PKG_CONFIG} --variable=datarootdir purple)
COPY_ICONS=@COPY_ICONS@
CRYPTO_FLAG=@CRYPTO_FLAG@
### == 'Magic' targets and infrastructure. == ###
# Here be dragons! See https://github.com/majn/telegram-purple/issues/242
# For the full list of requirements, goals, and rationale.
.PHONY: create_dirs
create_dirs: ${DIR_LIST}
${DIR_LIST}:
@ -67,80 +77,93 @@ DEPENDENCE=$(subst ${OBJ}/,${DEP}/,$(patsubst %.o,%.d,${ALL_OBJS}))
DEPENDENCE_LIST=${DEPENDENCE}
-include ${DEPENDENCE_LIST}
# The dependency on tgl/libs/libtgl.a ensures that "make -C tgl" was called,
# and most importantly: It ensures that all automatic headers exist.
${PLUGIN_OBJECTS}: ${OBJ}/%.o: ${srcdir}/%.c ${LIB}/libtgl.a | create_dirs
echo $@ && ${CC} ${CFLAGS} ${CPPFLAGS} -I ${srcdir}/tgl -c -MP -MD -MF ${DEP}/$*.d -MQ ${OBJ}/$*.o -o $@ $<
tgl/Makefile.in:
@echo "tgl/Makefile.in not found. Maybe you need to 'git submodule update --init --recursive' ?" && exit 1
tgl/Makefile: tgl/Makefile.in
tgl/Makefile: tgl/Makefile.in Makefile
cd tgl && ./configure -q ${CRYPTO_FLAG} --disable-extf CFLAGS="@CFLAGS@" LDFLAGS="@LDFLAGS@"
tgl/libs/libtgl.a: tgl/Makefile
+make -C tgl
+${MAKE} -C tgl libs/libtgl.a
.PHONY: commit
commit:
# The *commands* for commit.h shall always be executed, but the
# *file* commit.h should only be considered to have changed in rare cases.
GIT_COMMIT=$(shell git rev-parse HEAD | cut -c1-10)
commit.h: commit
@./commit.h.gen
# Ugly, but necessary, because otherwise commit.h would not get generated:
test/loadtest.c: commit.h
# Ugly, but necessary, because otherwise commit.h would not get generated:
telegram-purple.c: commit.h
### == 'Normal' build. == ###
${PLUGIN_OBJECTS}: ${OBJ}/%.o: ${srcdir}/%.c tgl/libs/libtgl.a | create_dirs
echo $@ && ${CC} ${CFLAGS} ${CPPFLAGS} -I ${srcdir}/tgl -c -MP -MD -MF ${DEP}/$*.d -MQ ${OBJ}/$*.o -o $@ $<
po/%.mo: po/%.po
${MSGFMT_PATH} -cf -o $@ $<
${MSGFMT_PATH} -cf -o $@ $< >/dev/null 2>&1
${LIB}/libtgl.a: tgl/libs/libtgl.a | create_dirs
cp $< $@
${PRPL_LIBNAME}: ${PLUGIN_OBJECTS} ${LIB}/libtgl.a | create_dirs
${PRPL_LIBNAME}: ${PLUGIN_OBJECTS} tgl/libs/libtgl.a | create_dirs
${CC} -shared -o $@ $^ ${LDFLAGS}
.PHONY: plugin
plugin: $(PRPL_LIBNAME)
### == noicon_{,un}install targets. Use only if you know that you don't need icons. Note that pidgin uses those files. == ###
.PHONY: strip
strip: $(PRPL_LIBNAME)
$(STRIP) --strip-unneeded $(PRPL_LIBNAME)
.PHONY: install
install: $(PRPL_LIBNAME) $(LOCALE_MOS)
.PHONY: noicon_install
noicon_install: $(PRPL_LIBNAME) $(LOCALE_MOS)
mkdir -m $(DIR_PERM) -p $(DESTDIR)$(PLUGIN_DIR_PURPLE)
install -m $(FILE_PERM) $(PRPL_LIBNAME) $(DESTDIR)$(PLUGIN_DIR_PURPLE)/$(PRPL_NAME)
mkdir -m $(DIR_PERM) -p $(DESTDIR)/etc/telegram-purple
install -m $(FILE_PERM) tg-server.tglpub $(DESTDIR)/etc/telegram-purple/server.tglpub
mkdir -m $(DIR_PERM) -p $(DESTDIR)$(datarootdir)/appdata
install -m $(FILE_PERM) telegram-purple.metainfo.xml $(DESTDIR)$(datarootdir)/appdata/telegram-purple.metainfo.xml
ifeq ($(COPY_ICONS),no)
@echo "Not copying icons due to configure-option --disable-icons."
@echo " If you're using Finch, Empathy, or Telepathy, then this is a good idea."
@echo " If you're using Pidgin, then this is a bad idea."
@echo " If you're using Adium, read the README.md: You're using the wrong build system!"
else
mkdir -m $(DIR_PERM) -p $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/16
install -m $(FILE_PERM) imgs/telegram16.png $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/16/telegram.png
mkdir -m $(DIR_PERM) -p $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/22
install -m $(FILE_PERM) imgs/telegram22.png $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/22/telegram.png
mkdir -m $(DIR_PERM) -p $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/48
install -m $(FILE_PERM) imgs/telegram48.png $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/48/telegram.png
endif
# Assume that the user does not use AppStream if she doesn't want icons
@for lang in $(LOCALES); do \
mkdir -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \
echo "installing po/$$lang.mo to $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(gettext_package).mo"; \
install -m $(FILE_PERM) po/$$lang.mo $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(gettext_package).mo; \
done
.PHONY: uninstall
uninstall:
.PHONY: noicon_uninstall
noicon_uninstall:
rm -f $(DESTDIR)$(PLUGIN_DIR_PURPLE)/$(PRPL_NAME)
rm -f $(DESTDIR)/etc/telegram-purple/server.pub # TODO: Remove this in later versions
rm -f $(DESTDIR)/etc/telegram-purple/server.tglpub
rm -f $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/16/telegram.png
rm -f $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/22/telegram.png
rm -f $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/48/telegram.png
rm -f $(DESTDIR)$(datarootdir)/appdata/telegram-purple.metainfo.xml
# TODO: Delete all installed .mo's, no matter what LINGUAS says.
@for lang in $(LOCALES); do \
echo "removing $(localedir)/$$lang/LC_MESSAGES/$(gettext_package).mo"; \
rm -f $(localedir)/$$lang/LC_MESSAGES/$(gettext_package).mo; \
done
### == Main {,un}install targets. This should satisfy most needs. == ###
.PHONY: install
install: noicon_install
mkdir -m $(DIR_PERM) -p $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/16
install -m $(FILE_PERM) imgs/telegram16.png $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/16/telegram.png
mkdir -m $(DIR_PERM) -p $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/22
install -m $(FILE_PERM) imgs/telegram22.png $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/22/telegram.png
mkdir -m $(DIR_PERM) -p $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/48
install -m $(FILE_PERM) imgs/telegram48.png $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/48/telegram.png
mkdir -m $(DIR_PERM) -p $(DESTDIR)$(datarootdir)/appdata
install -m $(FILE_PERM) AppStream/telegram-purple.metainfo.xml $(DESTDIR)$(datarootdir)/appdata/telegram-purple.metainfo.xml
.PHONY: uninstall
uninstall: noicon_uninstall
rm -f $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/16/telegram.png
rm -f $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/22/telegram.png
rm -f $(DESTDIR)$(DATA_ROOT_DIR_PURPLE)/pixmaps/pidgin/protocols/48/telegram.png
rm -f $(DESTDIR)$(datarootdir)/appdata/telegram-purple.metainfo.xml
### == The local_{,un}install targets, in case you're not root. == ###
.PHONY: local_install
local_install:
mkdir -m $(DIR_PERM) -p $(DESTDIR)$(HOME)/.purple/plugins
@ -154,6 +177,20 @@ local_uninstall:
rm -f $(DESTDIR)$(HOME)/.purple/plugins/$(PRPL_NAME)
rm -f $(DESTDIR)$(HOME)/.purple/telegram-purple/server.tglpub
### == Handling and maintenance. Subject to rapid change, shouldn't be used in scripts. == ###
.PHONY: plugin
plugin: $(PRPL_LIBNAME)
.PHONY: strip
strip: $(PRPL_LIBNAME)
$(STRIP) --strip-unneeded $(PRPL_LIBNAME)
.PHONY: build-nsi
build-nsi: telegram-purple.nsi.awk telegram-purple.nsi.awk-in
awk -f telegram-purple.nsi.awk telegram-purple.nsi.awk-in > telegram-purple.nsi
.PHONY: run
run:
pidgin -d | grep 'telegram\|plugin\|proxy'
@ -162,10 +199,36 @@ run:
debug: install
ddd pidgin
DIST_ERR_MSG="Working directory is not git clean.\
Run 'git status' to show what files are causing this.\
Please note that 'make dist' packages the state in git, not the one on your disk."
SUBMOD_ERR_MSG="Couldn't find tgl/tl-parser/tl-parser.c\
Are all submodules properly initialized and updated?"
# Not PHONY
.git:
@echo "Not in a git folder. Features that require git are disabled."; exit 1
.PHONY: check-clean
check-clean: .git
@test "x" = x"`git status --porcelain`" || (echo ${DIST_ERR_MSG}; exit 1)
@test -r tgl/tl-parser/.git || (echo ${SUBMOD_ERR_MSG}; exit 1)
# Feel free to remove the "check-clean" dependency if you know what you're doing.
.PHONY: dist
dist: check-clean commit.h .git create_dirs
./gen-origtar
### == Cleaning in various flavors == ###
.PHONY: clean-here
clean-here:
rm -rf ${DIR_LIST} config.log config.status $(PRPL_C_OBJS) $(PRPL_LIBNAME) po/*.mo
rm -rf ${DIR_LIST} $(PRPL_LIBNAME) po/*.mo autom4te.cache AppStream/po/*.mo
-include test/Makefile
.PHONY: clean
clean: clean-here tgl/Makefile
+make -C tgl clean
clean: clean-here clean-test tgl/Makefile
+${MAKE} -C tgl clean

View file

@ -41,7 +41,7 @@ LIB=libs
DIR_LIST=${DEP} ${EXE} ${OBJ} ${LIB} ${DEP}/lodepng ${OBJ}/lodepng
PLUGIN_OBJECTS=${OBJ}/tgp-net.o ${OBJ}/tgp-timers.o ${OBJ}/msglog.o ${OBJ}/telegram-base.o ${OBJ}/telegram-purple.o ${OBJ}/tgp-2prpl.o ${OBJ}/tgp-structs.o ${OBJ}/tgp-utils.o ${OBJ}/tgp-chat.o ${OBJ}/tgp-ft.o ${OBJ}/tgp-msg.o ${OBJ}/tgp-request.o ${OBJ}/tgp-blist.o ${OBJ}/lodepng/lodepng.o
ALL_OBJS=${PLUGIN_OBJECTS}
ALL_OBJS=${PLUGIN_OBJECTS} ${OBJ}/tgp-info.o
LOCALES=$(patsubst %.po, %.mo, $(wildcard po/*.po))

View file

@ -18,9 +18,6 @@
srcdir=.
SCHEME_VERSION = 38
ENCRYPTED_SCHEME_VERSION = 23
WIN32_DEV_TOP ?= ../../win32-dev
@ -92,7 +89,7 @@ ${EXE}/generate: ${GENERATE_OBJECTS} ${COMMON_OBJECTS}
${AUTO}/scheme.tlo: ${AUTO}/scheme.tl ${EXE}/tl-parser
${EXE}/tl-parser -e $@ ${AUTO}/scheme.tl
${AUTO}/scheme.tl: ${srcdir}/scheme$(SCHEME_VERSION).tl ${srcdir}/encrypted_scheme$(ENCRYPTED_SCHEME_VERSION).tl ${srcdir}/binlog.tl ${srcdir}/mtproto.tl ${srcdir}/append.tl | ${AUTO}
${AUTO}/scheme.tl: ${srcdir}/scheme.tl ${srcdir}/encrypted_scheme.tl ${srcdir}/binlog.tl ${srcdir}/mtproto.tl ${srcdir}/append.tl | ${AUTO}
cat $^ > $@
${AUTO}/scheme2.tl: ${AUTO}/scheme.tl ${EXE}/tl-parser

138
README.md
View file

@ -3,8 +3,7 @@ Telegram-Purple Unofficial (Beta)
Telegram-purple is a Libpurple protocol plugin that adds support for the Telegram messenger.
I keep getting many questions about this plugin in my E-mail, so I've created a
[telegram group chat](https://goo.gl/bhmM7N) for
I keep getting many questions about this plugin in my E-mail, so I've created a [telegram group chat](https://goo.gl/VudXys) for
telegram-purple related discussions or questions.
Installation
@ -12,12 +11,12 @@ Installation
If you are just interested in using the plugin you probably want to use one of the following binary distributions. Please note that I do not control most of those package sources and the version may lag behind.
If your plattform is not supported or you want to contribute by testing or development, scroll down to "Building form Source".
If your platform is not supported or you want to contribute by testing or development, scroll down to "Building form Source".
#### OSX (Adium)
1. Download and execute the [Telegram-Adium bundle] (https://github.com/majn/telegram-purple/releases/download/v1.2.3/telegram-adium-1.2.3.zip)
1. Download and execute the [Telegram-Adium bundle] (https://github.com/majn/telegram-purple/releases/download/v1.3.0/telegram-adium-1.3.0.AdiumLibpurplePlugin.zip)
2. Restart Adium
#### Windows
@ -35,20 +34,19 @@ The package is available in the Fedora 22 and 23 testing repositories:
dnf install purple-telegram
#### Ubuntu/Mint PPA
Webupd8 provides PPAs for installation, see the [article](http://www.webupd8.org/2014/11/add-telegram-support-to-pidgin-with.html) for additional instructions:
sudo add-apt-repository ppa:nilarimogard/webupd8
sudo apt-get update
sudo apt-get install telegram-purple
#### Arch Linux (AUR)
https://aur.archlinux.org/packages/telegram-purple/
#### Debian
At the time of writing, the package hasn't been accepted yet.
Please first check if it's already available to you: `sudo apt-get install telegram-purple`
If this doesn't work because the package doesn't exist (yet), please build it from source.
Building From Source
--------------------
@ -63,6 +61,21 @@ This repository has submodules, so you need to clone recursively.
cd telegram-purple
#### 1b. Cloning if you're a packager
If you are unsure about whether you need this, then you are not a
packager and don't have any use for this.
If you need an "orig-tarball", it can be generated by `make dist`. Note
that this automatically generates an appropriate version number like
`1.2.4-58-g8e3cebf`. You can truncate the git suffix (`-g8e3cebf`). If
the `-58` part exists, it means that you're using a development
version, which is probably not what you want. If you still want to
package this, please leave the commit number (i.e., `58`) intact, as
this indicates that this version is in fact much further than just
`1.2.4`.
#### 2. Fetch all dependencies
##### Fedora
@ -78,13 +91,14 @@ If the above works, then you should stop here: It is now installed.
If the above fails: Don't worry, just continue building it by yourself. Next you need to install these dependencies:
sudo apt-get install libgcrypt20-dev libpurple-dev libwebp-dev
sudo apt-get install libgcrypt20-dev libpurple-dev libwebp-dev gettext build-essential
##### OpenSUSE
sudo zypper install gcc glib glib-devel libpurple libpurple-devel zlib-devel libwebp-devel
And the development files for gcrypt, probably `gcrypt-devel` or something.
And the development files for gcrypt, probably `gcrypt-devel` or something. (FIXME)
#### 3. Compile and install
@ -113,9 +127,9 @@ Usage
#### First Login
The username is your current phone number, including your full country prefix. For Germany, this would be '+49', resulting in a user name like '+49151123456'. Telegram will verify your phone number by sending you a code via sms. You will be prompted for this code, once that happens.
The username is your current phone number, including your full country prefix. For Germany, this would be '+49', resulting in a user name like '+49151123456'. Telegram will verify your phone number by sending you a code via SMS. You will be prompted for this code, once that happens.
#### Buddy List
#### Buddy List
Like in the official Telegram apps, the displayed buddy list consists of all active conversations.
@ -133,7 +147,7 @@ Self destructive messages will be ignored, since I don't know any way to delete
##### Confirming the key authenticity
Click on the buddy in the buddy list and click on "Show Info" to visualize the key fingerprint.
Click on the buddy in the buddy list and click on "Show Info" to visualize the key fingerprint.
##### Initiate secret chats
@ -150,6 +164,24 @@ The Telegram phone applications for iOS and Android make use of standardized Uni
does not display those smileys natively, but you can install a custom smiley theme like (https://github.com/stv0g/unicode-emoji) or (https://github.com/VxJasonxV/emoji-for-pidgin) and activate it under Settings > Themes > Smiley Theme.
#### Code-Tags
Since 1.3.0 it is possible to write messages in monospaced fonts using the markdown backtick syntax.
##### Example
``` if (true) {
// do smth
}```
##### Result
if (true) {
// do smth
}
Building the Adium Plugin
-------------------------
@ -168,7 +200,7 @@ Compiling with XCode is a little bit problematic, since it requires you to compi
brew update
brew upgrade webp libgcrypt
6. Installwith homebrew and move it into the appropriate directory so that XCode can find them. Note that the versions might differ, use the one that is
6. Install with homebrew and move it into the appropriate directory so that XCode can find them. Note that the versions might differ, use the one that is
mkdir -p ./telegram-adium/Frameworks/Adium
cp /usr/local/Cellar/webp/0.4.3/lib/libwebp.a ./telegram-adium/Frameworks
@ -190,7 +222,9 @@ Building the Debian Package
If you just need a `.deb`, simply do:
sudo apt-get install debhelper
git checkout debian-master
git submodule update --recursive
fakeroot ./debian/rules binary
And you're done! The `.deb` is in the directory at which you started.
@ -208,50 +242,28 @@ maintainer), you need to produce a lot more files than that.
Here's how you can generate a `.orig.tar.gz`:
debian/genorigtar.sh
make dist
Note that these are incompatible with the old `debian/genorigtar.sh`
tarballs, and can't be made compatible easily. If you need the tarball
from "back then", see the documentation there.
This command requires the original tar to exist (and will fail otherwise,
although the error message will be misleading) will build all further files,
specifically `.debian.tar.xz`,`.dsc`, `.deb`, and `.changes`:
specifically `.debian.tar.xz`, `.dsc`, `.deb`, and `.changes`:
dpkg-buildpackage
And that already covers the official part of the work-flow. Of course,
you can call small parts of the build process directly, in order to avoid
For the upload, you should use `pbuilder` and similar to build the package
in a more minimalistic environment. That covers the official part of the work-flow.
Of course, you can call small parts of the build process directly, in order to avoid
overhead like rebuilding. For example, if you only need the `.debian.tar.xz`
and `.dsc` files, do this:
debian/genorigtar.sh
( cd .. && dpkg-source -b telegram-purple )
Note that the parenthesis are important.
1.2.4
-----
- Fix crash on unknown media type
- Fix crash on logout after cancelling a file transfer
1.2.3
-----
- Build: Allow compilation on Windows #52 Thanks Eion!
- Build: Drop dependency on LodePNG, Thanks Ben!
- Build: Gettext is now optional
- Fix issue that prevented to send messages to deleted users in certain cases (#174)
- Fix own user being added to the buddy list in certain cases
- Fix that read recipes of own messages are being displayed (#139)
- Fix encoding inconsistencies with Unicode characters (#177)
- Fix auto-joining for chats (#179)
- Fix client not reconnecting anymore under certain circumstances (#173)
- Fix crash on compat-verification (PullRequest #183)
- Remove pointless "create chat" confirmation dialogue
- Improve logging messages
- Always send read recipes when the user is typing or sending a message
- Improve translation and user messages (#139)
- Use native password prompts (Adium)
make dist
false # Move tar to parent directory, by hand
dpkg-source -b .
Discussion / Help
@ -261,7 +273,7 @@ Discussion / Help
As we want to avoid OpenSSL, it has become necessary to replace the PEM file format. This means that if you use a custom pubkey (which you really REALLY shouldn't be doing), you have to adapt, sorry.
We no longer ship `tg-server.pub` (old format), but instead `tg-server.tlgpub` (new format). If you have a `.pub` and want to continue using telegram-purple, please use this (hopefully highly portable) tool: [pem2bignum](https://github.com/BenWiederhake/pem2bignum)
We no longer ship `tg-server.pub` (old format), but instead `tg-server.tglpub` (new format). If you have a `.pub` and want to continue using telegram-purple, please use this (hopefully highly portable) tool: [pem2bignum](https://github.com/BenWiederhake/pem2bignum)
You can also write your own conversion tool if you prefer. The format is really simple:
@ -278,11 +290,20 @@ FAQ
- I receive pictures in a chat, but they aren't showing up
* A: Make sure that you don't have a plugin like "Conversation Colors" that strips HTML from messages and removes the pictures.
- I receive RPC_CALL_FAIL_401: SESSION REVOKED
* A: This basically means your session has been terminated but the program
doesn't handle terminated sessions properly yet. You have to clean the
~/.purple/telegram-purple/$PHONENUMBER directory to fix this issue.
For Arch Linux users that use Bitlbee you can find this directory in
`/var/lib/bitlbee/purple/telegram-purple/`
#### Group chat
Telegram group chat for telegram-purple or libtgl related discussions or questions:
- https://goo.gl/bhmM7N
- https://goo.gl/VudXys
Submitting Bug Reports
@ -300,7 +321,7 @@ Empathy / libtelepathy
----------------------
Empathy doesn't natively support libpurple plugins since its based on libtelepathy, but there is a compatibillity layer called telepathy-haze that can be used to execute libpurple
plugins. This means that you can basically run this plugin thanks to telepathy-haze but you will usually get less features and worse usabillity compared to real libpurple clients. If you use Empathy (or anything else based on libtelepathy) I recommend [telepathy-morse](https://projects.kde.org/projects/playground/network/telepathy/telepathy-morse/repository) which is a connection manager written specifically for your messenger.
plugins. This means that you can basically run this plugin thanks to telepathy-haze but you will usually get less features and worse usability compared to real libpurple clients. If you use Empathy (or anything else based on libtelepathy) I recommend [telepathy-morse](https://projects.kde.org/projects/playground/network/telepathy/telepathy-morse/repository) which is a connection manager written specifically for your messenger.
Authors
-------
@ -309,10 +330,9 @@ Telegram-Purple was written by:
- Matthias Jentsch <mtthsjntsch@gmail.com>
- Vitaly Valtman
- Ben Wiederhake
- Ben Wiederhake <Ben.Wiederhake@gmail.com>
- Christopher Althaus <althaus.christopher@gmail.com>
Acknowledgements
----------------

View file

@ -1,21 +1,16 @@
#!/bin/sh
set -e
autoreconf
echo bootstrapping translation files ...
(
cd po
export XGETTEXT="xgettext -kP_:1,2"
intltool-update --pot
## Translations are managed at https://www.transifex.com/telegram-purple-developers/telegram-purple/
## To update the .po files, download it from there, since intltool, msginit, and transifex produce slightly different files, and I'd like to avoid gigantic git diffs that only change indentation or similar things.
#for lang in $(cat LINGUAS); do
# if [ -e "$lang.po" ]
# then
# echo "updating language file $lang.po ..."
# intltool-update "$lang"
# else
# echo "creating new language file $lang.po ..."
# msginit --locale="$lang"
# fi
#done
cd ..
)
test -r Makefile || (echo "Autoreconf didn't create Makefile?!"; exit 1)
make --quiet build-nsi

45
commit.h.gen Executable file
View file

@ -0,0 +1,45 @@
#!/bin/sh
# This file is part of telegram-purple
#
# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
#
# Copyright Matthias Jentsch, Ben Wiederhake 2016
set -e
if ! (command -v git && git status) >/dev/null 2>&1
then
if test -r commit.h
then
echo "No git available. Assuming everything is up-to-date."
exit 0
else
echo >&2 "No git available. Can't reconstruct commit.h"
exit 1
fi
fi
GIT_COMMIT=`git rev-parse HEAD | cut -c1-10`
if grep -scq "${GIT_COMMIT}" commit.h
then
echo "commit.h is up-to-date"
else
echo "Refresh commit.h"
echo "#ifndef GIT_COMMIT" > commit.h
echo "# define GIT_COMMIT \"${GIT_COMMIT}\"" >> commit.h
echo "#endif" >> commit.h
fi

37
configure vendored
View file

@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for telegram-purple 1.2.4.
# Generated by GNU Autoconf 2.69 for telegram-purple 1.3.1.
#
#
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@ -577,8 +577,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='telegram-purple'
PACKAGE_TARNAME='telegram-purple'
PACKAGE_VERSION='1.2.4'
PACKAGE_STRING='telegram-purple 1.2.4'
PACKAGE_VERSION='1.3.1'
PACKAGE_STRING='telegram-purple 1.3.1'
PACKAGE_BUGREPORT=''
PACKAGE_URL=''
@ -625,7 +625,6 @@ MSGFMT_PATH
CHECK_GETTEXT
PURPLE_CPPFLAGS
LIBOBJS
COPY_ICONS
PURPLE_LIBS
PURPLE_CFLAGS
PKG_CONFIG_LIBDIR
@ -1250,7 +1249,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
\`configure' configures telegram-purple 1.2.4 to adapt to many kinds of systems.
\`configure' configures telegram-purple 1.3.1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1311,7 +1310,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
short | recursive ) echo "Configuration of telegram-purple 1.2.4:";;
short | recursive ) echo "Configuration of telegram-purple 1.3.1:";;
esac
cat <<\_ACEOF
@ -1323,10 +1322,8 @@ Optional Features:
DISTRIBUTE BINARIES!
--disable-libwebp Disable libwebp, stickers won't be displayed in the
chat
--disable-icons Don't copy the protocol icons for Pidgin. Only
useful if you're using Finch of telepathy-haze.
(Adium users shouldn't be using this build system at
all.)
--disable-icons Unsupported option. Use 'make noicon_install'
instead.
--disable-translation Disable gettext translation
Optional Packages:
@ -1421,7 +1418,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
telegram-purple configure 1.2.4
telegram-purple configure 1.3.1
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@ -1840,7 +1837,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by telegram-purple $as_me 1.2.4, which was
It was created by telegram-purple $as_me 1.3.1, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@ -4407,19 +4404,14 @@ fi
fi
COPY_ICONS=yes
# Check whether --enable-icons was given.
if test "${enable_icons+set}" = set; then :
enableval=$enable_icons;
fi
if test "x$enable_icons" == "xno"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Icons are deactivated. Pidgin needs icons. Finch and telepathy-haze don't." >&5
$as_echo "$as_me: WARNING: Icons are deactivated. Pidgin needs icons. Finch and telepathy-haze don't." >&2;}
COPY_ICONS=no
if test "x$enable_icons" == "xno"; then :
as_fn_error $? "--disable-icons is now obsolete. Please use 'make noicon_install' for the same effect." "$LINENO" 5
fi
@ -5106,7 +5098,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by telegram-purple $as_me 1.2.4, which was
This file was extended by telegram-purple $as_me 1.3.1, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@ -5168,7 +5160,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
telegram-purple config.status 1.2.4
telegram-purple config.status 1.3.1
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
@ -5878,6 +5870,3 @@ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
rm -f tgl/Makefile

View file

@ -20,7 +20,7 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([telegram-purple], [1.2.4])
AC_INIT([telegram-purple], [1.3.1])
AC_CONFIG_SRCDIR([config.h.in])
AC_CONFIG_HEADERS([config.h])
@ -62,13 +62,11 @@ AS_IF([test "x$enable_libwebp" != "xno"], [
AC_CHECK_LIB([webp], [WebPDecodeRGBA], [], [AC_MSG_ERROR([no libwebp found, try --disable-libwebp, but stickers won't be displayed in the chat])])
])
AC_SUBST([COPY_ICONS], [yes])
AC_ARG_ENABLE([icons],
AS_HELP_STRING([--disable-icons], [Don't copy the protocol icons for Pidgin. Only useful if you're using Finch of telepathy-haze. (Adium users shouldn't be using this build system at all.)]))
AS_IF([test "x$enable_icons" == "xno"], [
AC_WARN([Icons are deactivated. Pidgin needs icons. Finch and telepathy-haze don't.])
AC_SUBST([COPY_ICONS], [no])
])
AS_HELP_STRING([--disable-icons], [Unsupported option. Use 'make noicon_install' instead.]))
AS_IF([test "x$enable_icons" == "xno"], [
AC_MSG_ERROR([--disable-icons is now obsolete. Please use 'make noicon_install' for the same effect.])
])
# Checks for header files.
AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h sys/time.h unistd.h])
@ -101,6 +99,3 @@ AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, ["$GETTEXT_PACKAGE"], [Define the gettext pa
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
rm -f tgl/Makefile

53
gen-origtar Executable file
View file

@ -0,0 +1,53 @@
#!/bin/sh
# This file is part of telegram-purple
#
# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
#
# Copyright Matthias Jentsch, Ben Wiederhake 2016
set -e
# -- Cleanup possibly left-over artifacts
rm -f bin/tgl_tl-parser.tar bin/tgl.tar bin/commit.h.tar bin/result.tar bin/result.tar.gz
# -- Create parts
# Abuse the "bin" dir for temporary files.
( cd tgl/tl-parser && git archive --prefix=telegram-purple/tgl/tl-parser/ --output=../../bin/tgl_tl-parser.tar HEAD )
( cd tgl && git archive --prefix=telegram-purple/tgl/ --output=../bin/tgl.tar HEAD )
git archive --prefix=telegram-purple/ --output=bin/result.tar HEAD
# This is a lot of options. Here's why.
# --sort --mtime --owner --group => be reproducible (same commit produces binarily identical files)
# --transform => be in the same "tar-folder" as the rest
# (absence of --numeric-ids) => have identical behavior as git-archive
# --mode=664 => have identical behavior as git-archive
# http://www.gelato.unsw.edu.au/archives/git/0701/36326.html
# This is hacky. TODO: Find a better way to unify permissions.
tar --sort=name --mtime="1970-01-01 00:00Z" --owner=root --group=root --transform s%^%telegram-purple/% --mode=664 -cf bin/commit.h.tar commit.h
# -- Concatenate it all
tar --concatenate -f bin/result.tar bin/tgl.tar
tar --concatenate -f bin/result.tar bin/tgl_tl-parser.tar
tar --concatenate -f bin/result.tar bin/commit.h.tar
gzip -n bin/result.tar
# -- Determine name and move
TARNAME="telegram-purple_`git describe --tags | sed s/^v// `.orig.tar.gz"
# "mv -f" means "overwrite, if necessary"
echo mv -f bin/result.tar.gz $TARNAME
mv -f bin/result.tar.gz $TARNAME
# -- Cleanup (never fail)
rm -f bin/tgl_tl-parser.tar bin/tgl.tar bin/commit.h.tar bin/result.tar bin/result.tar.gz || true

View file

@ -1 +0,0 @@
tgl/mime.types

100
msglog.c
View file

@ -72,9 +72,85 @@ void fatal(const char* format, ...) {
info ("\n");
}
const char *print_flags_update (unsigned flags) {
const char *print_flags (const char **names, int len, unsigned flags) {
static char *text = NULL;
const char *names[16] = {
if (text) {
g_free (text);
text = NULL;
}
int i;
for (i = 0; i < len; i ++) {
if (flags & 1) {
char *new;
if (text) {
new = g_strconcat (text, " ", names[i], NULL);
g_free (text);
} else {
new = g_strdup (names[i]);
}
text = new;
}
flags >>= 1;
}
return (const char*)text;
}
const char *print_flags_peer (unsigned flags) {
const char *names[] = {
"CREATED",
"HAS_PHOTO",
"DELETED",
"OFFICIAL",
"KICKED",
"ADMIN",
"CREATOR",
"LEFT",
"DEACTIVATED"
};
return print_flags (names, 9, flags);
}
const char *print_flags_channel (unsigned flags) {
static char *text;
if (text) {
g_free (text);
text = NULL;
}
const char *names[] = {
"BROADCAST",
"EDITOR",
"MODERATOR",
"MEGAGROUP"
};
text = g_strdup (print_flags_peer (flags));
char *old = text;
text = g_strconcat (text, " ", print_flags (names, 4, flags >> 16), NULL);
g_free (old);
return text;
}
const char *print_flags_user (unsigned flags) {
static char *text;
if (text) {
g_free (text);
text = NULL;
}
const char *names[] = {
"CONTACT",
"MUTUAL_CONTACT",
"BLOCKED",
"SELF",
"BOT"
};
text = g_strdup (print_flags_peer (flags));
char *old = text;
text = g_strconcat (text, " ", print_flags (names, 5, flags >> 16), NULL);
g_free (old);
return text;
}
const char *print_flags_update (unsigned flags) {
const char *names[] = {
"CREATED",
"DELETED",
"PHONE",
@ -92,23 +168,5 @@ const char *print_flags_update (unsigned flags) {
"ACCESS_HASH",
"USERNAME"
};
if (text) {
g_free (text);
text = NULL;
}
int i;
for (i = 0; i < 16; i ++) {
if (flags & 1) {
char *new;
if (text) {
new = g_strconcat (text, " ", names[i], NULL);
g_free (text);
} else {
new = g_strdup (names[i]);
}
text = new;
}
flags >>= 1;
}
return (const char*)text;
return print_flags (names, 16, flags);
}

View file

@ -25,3 +25,6 @@ void warning(const char* format, ...);
void failure(const char* format, ...);
void fatal(const char* format, ...);
const char *print_flags_update (unsigned update);
const char *print_flags_channel (unsigned flags);
const char *print_flags_peer (unsigned flags);
const char *print_flags_user (unsigned flags);

1
po/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/*.mo

View file

@ -1,17 +0,0 @@
Translation Howto
=================
To add the new language, append the language code LL to po/LINGUAS, and run autogen.sh. You
rill be prompted for a contact email. The .po files for the language should then show up in ./po/LL.po
echo LL >> po/LINGUAS
./autogen.sh
To update the translatable strings:
./autogen.sh

View file

@ -1,7 +1,11 @@
bg
cs_CZ
de_DE
es_AR
fr
it_IT
nl
pl_PL
pt_BR
ru_RU
sq
uk

View file

@ -2,6 +2,5 @@
# If you would like to improve the state of this, please see the translation page:
# https://www.transifex.com/telegram-purple-developers/telegram-purple/
da # Only 56% complete
fr # Bad grammar, see https://github.com/majn/telegram-purple/pull/193
it_IT # Only 82% complete
da # < 55% complete
pt_BR # < 75% complete

614
po/bg.po Normal file
View file

@ -0,0 +1,614 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-31 22:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Любомир Василев <lyubomirv@abv.bg>, 2016\n"
"Language-Team: Bulgarian (https://www.transifex.com/telegram-purple-developers/teams/53149/bg/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../telegram-base.c:500
msgid "Couldn't create group"
msgstr "Неуспешно създаване на група"
#: ../telegram-base.c:501
msgid "Please select at least one other user."
msgstr "Моля, изберете поне един друг потребител:"
#: ../telegram-base.c:555
msgid "Query Failed"
msgstr "Заявката беше неуспешна"
#: ../telegram-purple.c:162
msgid "Secret chat ready."
msgstr "Тайният разговор е готов."
#: ../telegram-purple.c:170
msgid "Secret chat terminated."
msgstr "Тайният разговор беше приключен."
#: ../telegram-purple.c:182
msgid "Telegram"
msgstr "Telegram"
#: ../telegram-purple.c:229
msgid "Message marked as read."
msgstr "Съобщението е отбелязано като прочетено."
#: ../telegram-purple.c:339
#, c-format
msgid "Invite link: %s"
msgstr "Връзка за покана: %s"
#. FIXME: Can TGLCHF_MODERATOR export links?
#: ../telegram-purple.c:350
msgid "Creating chat link failed"
msgstr "Създаването на връзка беше неуспешно"
#: ../telegram-purple.c:351
msgid "You need to be admin of the group to do that."
msgstr "Само администраторите на групата могат да правят това."
#: ../telegram-purple.c:416
msgid "Chat joined"
msgstr "Присъединихте се към разговора"
#: ../telegram-purple.c:417
msgid "Chat added to list of chat rooms."
msgstr "Разговорът беше добавен към списъка от стаи за разговори."
#: ../telegram-purple.c:443
msgid "Start secret chat..."
msgstr "Започване на таен разговор…"
#. Generate Public Link
#: ../telegram-purple.c:450
msgid "Invite users by link..."
msgstr "Покана на потребители чрез връзка…"
#. Delete self from chat
#: ../telegram-purple.c:458
msgid "Delete and exit..."
msgstr "Изтриване и изход…"
#: ../telegram-purple.c:546
#, c-format
msgid "Unable to sign on as %s: file (public key) not found."
msgstr "Неуспешно вписване като %s: файлът (публичният ключ) не беше открит."
#: ../telegram-purple.c:550
#, c-format
msgid ""
"Make sure telegram-purple is installed properly,\n"
"including the .tglpub file.\n"
"If you're running SELinux (e.g. when using Tails),\n"
"try 'make local_install', or simply copy\n"
"%1$s to %2$s."
msgstr ""
"Уверете се, че „telegram-purple“ е инсталирано правилно,\n"
"включително файлът „.tglpub“.\n"
"Ако използвате SELinux (наприбер при използване на „Tails“),\n"
"опитайте „make local_install“ или просто копирайте\n"
"%1$s в %2$s."
#: ../telegram-purple.c:572
#, c-format
msgid ""
"Unable to sign on as %s: problem in the underlying library 'tgl'. Please "
"submit a bug report with the debug log."
msgstr ""
"Неуспешно вписване като %s: има проблем с вътрешната библиотека „tgl“. Моля,"
" изпратете доклад за грешката, заедно с журнала."
#: ../telegram-purple.c:576
msgid "Problem in tgl"
msgstr "Проблем в „tgl“"
#. TRANSLATORS: Please fill in your own prefix!
#: ../telegram-purple.c:584
#, c-format
msgid ""
"Unable to sign on as %s: phone number lacks country prefix. Numbers must "
"start with the full international prefix code, e.g. +1 for USA."
msgstr ""
"Неуспешно вписване като %s: телефонният код не съдържа код на страната. "
"Номерата трябва да започват с пълния международен телефонен код на страната,"
" например +359 за България."
#: ../telegram-purple.c:589
msgid "Incomplete phone number"
msgstr "Непълен телефонен номер"
#: ../telegram-purple.c:642
msgid "Secret chat was already deleted"
msgstr "Тайният разговор вече е изтрит"
#: ../telegram-purple.c:644
msgid "Secret chat is not ready"
msgstr "Тайният разговор не е готов"
#: ../telegram-purple.c:652
msgid "Only the creator of a channel can post messages."
msgstr "Само създателят на канала може да публикува съобщения."
#: ../telegram-purple.c:695
msgid "Cannot invite buddy to chat"
msgstr "Неуспешно канене на приятел в разговора"
#: ../telegram-purple.c:696
msgid "Specified user does not exist."
msgstr "Посоченият потребител не съществува."
#: ../telegram-purple.c:709
msgid "phone no. (+ country prefix)"
msgstr "тел. номер (+ код на страната)"
#. Login
#: ../telegram-purple.c:817
msgid "Password (two factor authentication)"
msgstr "Парола (двустепенно удостоверяване)"
#: ../telegram-purple.c:822
msgid ""
"Fallback SMS verification\n"
"(Helps when not using Pidgin and you aren't being prompted for the code)"
msgstr ""
"Резервно удостоверяване чрез КС\n"
"(Помага, когато не използвате „Pidgin“ и от Вас не се изисква кода)"
#: ../telegram-purple.c:828
msgid "always"
msgstr "винаги"
#: ../telegram-purple.c:829
msgid "never"
msgstr "никога"
#: ../telegram-purple.c:830
msgid "ask"
msgstr "питане всеки път"
#: ../telegram-purple.c:832
msgid "Accept secret chats"
msgstr "Приемане на тайни разговори"
#: ../telegram-purple.c:836
msgid "Display buddies offline after (days)"
msgstr "Показване на приятелите извън линия след (брой дни)"
#: ../telegram-purple.c:840
msgid ""
"Don't fetch history older than (days)\n"
"(0 for unlimited)"
msgstr ""
"Да не се изтегля историята, по-стара от (брой дни)\n"
"(0 = неограничено)"
#. Media
#: ../telegram-purple.c:845
msgid "Autoload media size (kb)"
msgstr "Размер за авто. зареждане на медийни файлове (кбит)"
#. Chats
#: ../telegram-purple.c:850
msgid "Add all group chats to buddy list"
msgstr "Добавяне на всички групови разговори в списъка с приятели"
#. Read notifications
#: ../telegram-purple.c:855
msgid "Display notices of receipt"
msgstr "Показване на уведомления за получаване"
#: ../telegram-purple.c:859
msgid "Send notices of receipt when present"
msgstr "Изпращане на уведомления за получаване при присъствие"
#: ../telegram-purple.c:884
msgid "Telegram Protocol Plugin."
msgstr "Добавка за протокола „Telegram“."
#: ../tgp-msg.c:58
#, c-format
msgid "%2$s created chat %1$s."
msgstr "%2$s създаде разговор %1$s."
#: ../tgp-msg.c:61
#, c-format
msgid "%2$s changed title to %1$s."
msgstr "%2$s промени заглавието на „%1$s“."
#: ../tgp-msg.c:64
#, c-format
msgid "%s changed photo."
msgstr "%s промени снимката си."
#: ../tgp-msg.c:67
#, c-format
msgid "%s deleted photo."
msgstr "%s изтри снимка."
#: ../tgp-msg.c:75
#, c-format
msgid "%1$s added user %2$s by link."
msgstr "%1$s добави потребителя %2$s чрез връзка."
#: ../tgp-msg.c:90
#, c-format
msgid "%2$s added user %1$s."
msgstr "%2$s добави потребителя %1$s."
#: ../tgp-msg.c:114 ../tgp-msg.c:131
#, c-format
msgid "%2$s deleted user %1$s."
msgstr "%2$s изтри потребителя %1$s."
#: ../tgp-msg.c:138
#, c-format
msgid "%2$s set self destruction timer to %1$d second."
msgid_plural "%2$s set self destruction timer to %1$d seconds."
msgstr[0] "%2$s настрои брояч за самоунищожение на %1$d секунда."
msgstr[1] "%2$s настрои брояч за самоунищожение на %1$d секунди."
#: ../tgp-msg.c:144
#, c-format
msgid "%2$s marked %1$d message read."
msgid_plural "%2$s marked %1$d messages read."
msgstr[0] "%2$s отбеляза %1$d съобщение като прочетено."
msgstr[1] "%2$s отбеляза %1$d съобщения като прочетени."
#: ../tgp-msg.c:150
#, c-format
msgid "%2$s deleted %1$d message."
msgid_plural "%2$s deleted %1$d messages."
msgstr[0] "%2$s изтри %1$d съобщение."
msgstr[1] "%2$s изтри %1$d съобщения."
#: ../tgp-msg.c:156
#, c-format
msgid "%2$s made a screenshot of %1$d message."
msgid_plural "%2$s made a screenshot of %1$d messages."
msgstr[0] "%2$s направи снимка на %1$d съобщение."
msgstr[1] "%2$s направи снимка на %1$d съобщения."
#: ../tgp-msg.c:162
#, c-format
msgid "Channel %1$s created"
msgstr "Каналът „%1$s“ беше създаден"
#. FIXME: check if this makes sense
#: ../tgp-msg.c:165 ../tgp-chat.c:124 ../tgp-chat.c:576
msgid "Telegram Channels"
msgstr "Канали в Telegram"
#: ../tgp-msg.c:191
msgid "Sending message failed."
msgstr "Неуспешно изпращане на съобщението."
#: ../tgp-msg.c:253
msgid "Sending image failed."
msgstr "Неуспешно изпращане на изображениео."
#: ../tgp-msg.c:417
#, c-format
msgid "%s sent a sticker."
msgstr "%s изпрати стикер."
#: ../tgp-msg.c:463
msgid "failed loading message"
msgstr "неуспешно зареждане на съобщение"
#: ../tgp-msg.c:498
msgid "[animation]"
msgstr "[анимация]"
#: ../tgp-msg.c:515
msgid "[audio]"
msgstr "[звук]"
#: ../tgp-msg.c:515
msgid "[video]"
msgstr "[видео]"
#: ../tgp-msg.c:604
#, c-format
msgid "<b>Forwarded message from: %s</b><br>%s"
msgstr "<b>Препратено съобщение от: %s</b><br>%s"
#. FIXME: sometimes users aren't part of the response when receiving a
#. forwarded message
#: ../tgp-msg.c:607
#, c-format
msgid "<b>Forwarded message:</b><br>%s"
msgstr "<b>Препратено съобщение:</b><br>%s"
#: ../tgp-msg.c:720
msgid "loading document or picture failed"
msgstr "неуспешно зареждане на документ или изображение"
#: ../tgp-net.c:281
msgid "Cannot connect to main server"
msgstr "Неуспешно свързване с главния сървър"
#: ../tgp-net.c:322
msgid "Cannot connect to server: Ping timeout."
msgstr "Неуспешно свързване със сървъра. Изтече времето за изчакване."
#: ../tgp-net.c:365
msgid "Lost connection to the server..."
msgstr "Връзката със сървъра беше прекъсната…"
#: ../tgp-request.c:51
msgid ""
"Telegram wants to verify your identity. Please enter the login code that you"
" have received via SMS."
msgstr ""
"Telegram иска да потвърди самоличността Ви. Моля, въведете кода за влизане, "
"който трябва да сте получили чрез КС."
#: ../tgp-request.c:54
msgid "Login code"
msgstr "Код за влизане"
#: ../tgp-request.c:54
msgid "Enter login code"
msgstr "Въведете кода за влизане"
#: ../tgp-request.c:54
msgid "the code"
msgstr "кодът"
#: ../tgp-request.c:54 ../tgp-request.c:104 ../tgp-request.c:198
#: ../tgp-request.c:233 ../tgp-request.c:263
msgid "OK"
msgstr "Добре"
#: ../tgp-request.c:55 ../tgp-request.c:104 ../tgp-request.c:123
#: ../tgp-request.c:199 ../tgp-request.c:234 ../tgp-request.c:264
msgid "Cancel"
msgstr "Отказ"
#: ../tgp-request.c:95
msgid "Registration"
msgstr "Регистрация"
#: ../tgp-request.c:96
msgid "First name"
msgstr "Собствено име"
#: ../tgp-request.c:99
msgid "Last name"
msgstr "Фамилия"
#: ../tgp-request.c:103
msgid "Register"
msgstr "Регистриране"
#: ../tgp-request.c:103
msgid "Please register your phone number."
msgstr "Моля, регистрирайте телефонния си номер"
#. purple_request API not available
#: ../tgp-request.c:108
msgid ""
"Phone number is not registered. Please register your phone on a different "
"client."
msgstr ""
"Телефонният номер не е регистриран. Моля, регистрирайте телефона си чрез "
"друг клиент."
#: ../tgp-request.c:110
msgid "Not registered"
msgstr "Нерегистриран"
#: ../tgp-request.c:122
msgid "Password needed"
msgstr "Нужна е парола"
#: ../tgp-request.c:122
msgid "Enter password for two factor authentication"
msgstr "Въведете парола за двустепенно удостоверяване"
#: ../tgp-request.c:123
msgid "Ok"
msgstr "Добре"
#: ../tgp-request.c:125
msgid ""
"No password set for two factor authentication. Please enter it in the "
"extended settings."
msgstr ""
"Няма зададена парола за двустепенно удостоверяване. Моля, въведете я в "
"разширените настройки."
#: ../tgp-request.c:127
msgid "Password invalid"
msgstr "Паролата е грешна"
#: ../tgp-request.c:150
#, c-format
msgid "Accept secret chat '%s' on this device?"
msgstr "Приемане на тайния разговор „%s“ на това устройство?"
#: ../tgp-request.c:151
msgid "Secret chat"
msgstr "Таен разговор"
#: ../tgp-request.c:151
msgid ""
"Secret chats can only have one end point. If you accept a secret chat on "
"this device, its messages will not be available anywhere else. If you "
"decline, you can still accept the chat on other devices."
msgstr ""
"Тайните разговори могат да се провеждат само на едно устройство. Ако "
"приемете таен разговор на това устройство, той няма да бъде достъпен никъде "
"другаде. Ако откажете, ще можете да го приемете на друго устройство."
#: ../tgp-request.c:182
msgid ""
"Invite at least one additional user by specifying\n"
" their full name (autocompletion available).\n"
"You can add more users once the chat was created."
msgstr ""
"Поканете поне още един потребител, като посочите\n"
" пълното му име (разполагате с авт. допълване).\n"
"Можете да добавите повече потребители и след началото на разговора."
#: ../tgp-request.c:185 ../tgp-request.c:189 ../tgp-request.c:193
msgid "Username"
msgstr "Потребителско име"
#: ../tgp-request.c:198
msgid "Create group chat"
msgstr "Създаване на групов разговор"
#: ../tgp-request.c:198
msgid "Invite users"
msgstr "Канене на потребители"
#: ../tgp-request.c:217 ../tgp-request.c:232
msgid "Change password"
msgstr "Промяна на паролата"
#: ../tgp-request.c:219
msgid "Current"
msgstr "Текуща"
#: ../tgp-request.c:223 ../tgp-request.c:253
msgid "Password"
msgstr "Парола"
#: ../tgp-request.c:227 ../tgp-request.c:257
msgid "Confirm"
msgstr "Потвърждаване"
#: ../tgp-request.c:251 ../tgp-request.c:262
msgid "New password"
msgstr "Нова парола"
#. if we arrive here for the second time the specified phone number is not
#. valid. We do not
#. ask for the phone number directly, cause in that case the account would
#. still be created
#. named with the invalid phone number, even though the login will work
#: ../tgp-request.c:300
msgid "Invalid phone number"
msgstr "Грешен телефонен номер"
#: ../tgp-request.c:301
msgid ""
"Please enter only numbers in the international phone number format, a leading + following by the country prefix and the phone number.\n"
"Do not use any other special chars."
msgstr ""
"Моля, въвеждайте само цифри във формата за международен телефонен номер: знака +, следван от кода на страната и телефонния номер.\n"
"Не използвайте други специални знаци."
#: ../tgp-request.c:370
msgid "Leave Chat"
msgstr "Напускане на разговора"
#: ../tgp-request.c:372
msgid "Do you want to leave this chat permantently?"
msgstr "Наистина ли искате да напуснете този разговор завинаги?"
#: ../tgp-request.c:377
msgid "Abort Secret Chat"
msgstr "Край на тайния разговор"
#: ../tgp-request.c:379
msgid "Do you want to terminate this secret chat permantently?"
msgstr "Наистина ли искате да прекратите този таен разговор завинаги?"
#: ../tgp-request.c:384
msgid "Delete Contact"
msgstr "Изтриване на контакта"
#: ../tgp-request.c:386
msgid "Do you want to remove this user from your global contact list?"
msgstr ""
"Наистина ли искате да премахнете този потребител от общия си списък с "
"контакти?"
#: ../tgp-request.c:401
msgid "Leave Channel"
msgstr "Напускане на канала"
#: ../tgp-request.c:403
msgid "Do you want to leave this channel?"
msgstr "Наистина ли искате да напуснете този канал?"
#. This should be the language's timestamp format. This is preceded by a
#. colon.
#: ../tgp-utils.c:27
msgid "%d.%m.%Y %H:%M"
msgstr "%d.%m.%Y %H:%M"
#. This is preceded by a colon.
#: ../tgp-utils.c:48
msgid "recently"
msgstr "наскоро"
#. This is preceded by a colon.
#: ../tgp-utils.c:52
msgid "last week"
msgstr "последната седмица"
#. This is preceded by a colon.
#: ../tgp-utils.c:56
msgid "last month"
msgstr "последния месец"
#. This is preceded by a colon. It refers to a point on time.
#: ../tgp-utils.c:60
msgid "unknown"
msgstr "неизвестно"
#: ../tgp-chat.c:108 ../tgp-chat.c:582
msgid "Telegram Chats"
msgstr "Разговори в Telegram"
#: ../tgp-chat.c:113
msgid "You have already left this chat."
msgstr "Вече сте напуснали този разговор"
#: ../tgp-chat.c:224
msgid "Subject:"
msgstr "Тема:"
#: ../tgp-chat.c:230
msgid "Invite link:"
msgstr "Връзка за покана:"
#: ../tgp-chat.c:236
msgid "Chat ID:"
msgstr "Ид. на разговора:"
#: ../tgp-chat.c:342
msgid "Supergroup"
msgstr "Надгрупа"
#: ../tgp-chat.c:342
msgid "Channel"
msgstr "Канал"
#: ../tgp-chat.c:345
msgid "Group"
msgstr "Група"
#: ../tgp-chat.c:367
msgid "Users in chat"
msgstr "Потребители в разговора"
#: ../tgp-chat.c:370
msgid "Type"
msgstr "Вид"

616
po/cs_CZ.po Normal file
View file

@ -0,0 +1,616 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-31 22:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Jiri Eischmann <jiri@eischmann.cz>, 2017\n"
"Language-Team: Czech (Czech Republic) (https://www.transifex.com/telegram-purple-developers/teams/53149/cs_CZ/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: cs_CZ\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
#: ../telegram-base.c:500
msgid "Couldn't create group"
msgstr "Nelze vytvořit skupinu"
#: ../telegram-base.c:501
msgid "Please select at least one other user."
msgstr "Prosím vyberte alespoň jednoho dalšího uživatele."
#: ../telegram-base.c:555
msgid "Query Failed"
msgstr "Dotaz selhal"
#: ../telegram-purple.c:162
msgid "Secret chat ready."
msgstr "Tajný chat připraven."
#: ../telegram-purple.c:170
msgid "Secret chat terminated."
msgstr "Tajný chat ukončen."
#: ../telegram-purple.c:182
msgid "Telegram"
msgstr "Telegram"
#: ../telegram-purple.c:229
msgid "Message marked as read."
msgstr "Zpráva označena jako přečtená."
#: ../telegram-purple.c:339
#, c-format
msgid "Invite link: %s"
msgstr "Odkaz pozvánky: %s"
#. FIXME: Can TGLCHF_MODERATOR export links?
#: ../telegram-purple.c:350
msgid "Creating chat link failed"
msgstr "Vytváření odkazu pro chat selhalo"
#: ../telegram-purple.c:351
msgid "You need to be admin of the group to do that."
msgstr "K tomuto úkonu potřebujete být administrátorem skupiny."
#: ../telegram-purple.c:416
msgid "Chat joined"
msgstr "Připojeno k chatu"
#: ../telegram-purple.c:417
msgid "Chat added to list of chat rooms."
msgstr "Chat přidán do seznamu chatovacích místností"
#: ../telegram-purple.c:443
msgid "Start secret chat..."
msgstr "Začít tajný chat..."
#. Generate Public Link
#: ../telegram-purple.c:450
msgid "Invite users by link..."
msgstr "Pozvat uživatele odkazem..."
#. Delete self from chat
#: ../telegram-purple.c:458
msgid "Delete and exit..."
msgstr "Smazat a ukončit..."
#: ../telegram-purple.c:546
#, c-format
msgid "Unable to sign on as %s: file (public key) not found."
msgstr "Nelze se přihlásit jako %s: soubor (veřejný klíč) nenalezen."
#: ../telegram-purple.c:550
#, c-format
msgid ""
"Make sure telegram-purple is installed properly,\n"
"including the .tglpub file.\n"
"If you're running SELinux (e.g. when using Tails),\n"
"try 'make local_install', or simply copy\n"
"%1$s to %2$s."
msgstr ""
"Ověřte, jestli je telegram-purple nainstalován správně\n"
"včetně souboru .tglpub.\n"
"Pokud používáte SELinux (například při použití Tails),\n"
"zkuste 'make local_install', nebo jen nakopírujte\n"
"%1$s do %2$s."
#: ../telegram-purple.c:572
#, c-format
msgid ""
"Unable to sign on as %s: problem in the underlying library 'tgl'. Please "
"submit a bug report with the debug log."
msgstr ""
"Nelze se přihlásit jako %s: problém v použité knihovně \"tgl\". Prosím "
"nahlaste chybu včetně chybového protokolu."
#: ../telegram-purple.c:576
msgid "Problem in tgl"
msgstr "Problém v tgl"
#. TRANSLATORS: Please fill in your own prefix!
#: ../telegram-purple.c:584
#, c-format
msgid ""
"Unable to sign on as %s: phone number lacks country prefix. Numbers must "
"start with the full international prefix code, e.g. +1 for USA."
msgstr ""
"Nelze se přihlásit jako %s: telefonnímu číslu chybí předčíslí země. Čísla "
"musí začínat s plným mezinárodním předčíslím, např. +420 pro Českou "
"republiku."
#: ../telegram-purple.c:589
msgid "Incomplete phone number"
msgstr "Nekompletní telefonní číslo"
#: ../telegram-purple.c:642
msgid "Secret chat was already deleted"
msgstr "Tajný chat byl již smazán"
#: ../telegram-purple.c:644
msgid "Secret chat is not ready"
msgstr "Tajný chat není připraven"
#: ../telegram-purple.c:652
msgid "Only the creator of a channel can post messages."
msgstr "Pouze tvůrce kanálu může zasílat zprávy."
#: ../telegram-purple.c:695
msgid "Cannot invite buddy to chat"
msgstr "Nelze pozvat kamaráda do chatu"
#: ../telegram-purple.c:696
msgid "Specified user does not exist."
msgstr "Zadaný uživatel neexistuje."
#: ../telegram-purple.c:709
msgid "phone no. (+ country prefix)"
msgstr "telefonní číslo (+ předčíslí země)"
#. Login
#: ../telegram-purple.c:817
msgid "Password (two factor authentication)"
msgstr "Heslo (dvoufaktorová autentizace)"
#: ../telegram-purple.c:822
msgid ""
"Fallback SMS verification\n"
"(Helps when not using Pidgin and you aren't being prompted for the code)"
msgstr ""
"Záložní ověřovací SMS\n"
"(Pomáhá, když nepoužíváte Pidgin a nejste vyzváni k zadání kódu)"
#: ../telegram-purple.c:828
msgid "always"
msgstr "vždy"
#: ../telegram-purple.c:829
msgid "never"
msgstr "nikdy"
#: ../telegram-purple.c:830
msgid "ask"
msgstr "zeptat se"
#: ../telegram-purple.c:832
msgid "Accept secret chats"
msgstr "Přijímat tajné chaty"
#: ../telegram-purple.c:836
msgid "Display buddies offline after (days)"
msgstr "Zobrazit odpojené kamarády po (dny)"
#: ../telegram-purple.c:840
msgid ""
"Don't fetch history older than (days)\n"
"(0 for unlimited)"
msgstr ""
"Nestahovat historii starší než (dny)\n"
"(0 pro neomezeně)"
#. Media
#: ../telegram-purple.c:845
msgid "Autoload media size (kb)"
msgstr "Velikost automaticky nahraných médií (kb)"
#. Chats
#: ../telegram-purple.c:850
msgid "Add all group chats to buddy list"
msgstr "Přidat všechny chatovací skupiny do seznamu kamarádů"
#. Read notifications
#: ../telegram-purple.c:855
msgid "Display notices of receipt"
msgstr "Zobrazit oznámení o doručení"
#: ../telegram-purple.c:859
msgid "Send notices of receipt when present"
msgstr "V přítomnosti zasílat oznámení o doručení"
#: ../telegram-purple.c:884
msgid "Telegram Protocol Plugin."
msgstr "Zásuvný modul protokolu Telegram."
#: ../tgp-msg.c:58
#, c-format
msgid "%2$s created chat %1$s."
msgstr "%2$s vytvořil(a) chat %1$s."
#: ../tgp-msg.c:61
#, c-format
msgid "%2$s changed title to %1$s."
msgstr "%2$s změnil(a) titulek na %1$s."
#: ../tgp-msg.c:64
#, c-format
msgid "%s changed photo."
msgstr "%s změnil(a) fotografii."
#: ../tgp-msg.c:67
#, c-format
msgid "%s deleted photo."
msgstr "%s smazal(a) fotografii."
#: ../tgp-msg.c:75
#, c-format
msgid "%1$s added user %2$s by link."
msgstr "%1$s přidal(a) uživatele %2$s odkazem."
#: ../tgp-msg.c:90
#, c-format
msgid "%2$s added user %1$s."
msgstr "%2$s přidal(a) uživatele %1$s."
#: ../tgp-msg.c:114 ../tgp-msg.c:131
#, c-format
msgid "%2$s deleted user %1$s."
msgstr "%2$s smazal(a) uživatele %1$s."
#: ../tgp-msg.c:138
#, c-format
msgid "%2$s set self destruction timer to %1$d second."
msgid_plural "%2$s set self destruction timer to %1$d seconds."
msgstr[0] "%2$s nastavil(a) sebedestrukční časovač na %1$d sekundu."
msgstr[1] "%2$s nastavil(a) sebedestrukční časovač na %1$d sekundy."
msgstr[2] "%2$s nastavil(a) sebedestrukční časovač na %1$d sekund."
#: ../tgp-msg.c:144
#, c-format
msgid "%2$s marked %1$d message read."
msgid_plural "%2$s marked %1$d messages read."
msgstr[0] "%2$s označil(a) %1$d zprávu jako přečtenou."
msgstr[1] "%2$s označil(a) %1$d zprávy jako přečtené."
msgstr[2] "%2$s označil(a) %1$d zpráv jako přečtené."
#: ../tgp-msg.c:150
#, c-format
msgid "%2$s deleted %1$d message."
msgid_plural "%2$s deleted %1$d messages."
msgstr[0] "%2$s smazal(a) %1$d zprávu."
msgstr[1] "%2$s smazal(a) %1$d zprávy."
msgstr[2] "%2$s smazal(a) %1$d zpráv."
#: ../tgp-msg.c:156
#, c-format
msgid "%2$s made a screenshot of %1$d message."
msgid_plural "%2$s made a screenshot of %1$d messages."
msgstr[0] "%2$s vytvořil(a) screenshot %1$d zprávy."
msgstr[1] "%2$s vytvořil(a) screenshot %1$d zpráv."
msgstr[2] "%2$s vytvořil(a) screenshot %1$d zpráv."
#: ../tgp-msg.c:162
#, c-format
msgid "Channel %1$s created"
msgstr "Kanál %1$s vytvořen"
#. FIXME: check if this makes sense
#: ../tgp-msg.c:165 ../tgp-chat.c:124 ../tgp-chat.c:576
msgid "Telegram Channels"
msgstr "Kanály Telegramu"
#: ../tgp-msg.c:191
msgid "Sending message failed."
msgstr "Odeslání zprávy selhalo."
#: ../tgp-msg.c:253
msgid "Sending image failed."
msgstr "Odeslání obrázku selhalo."
#: ../tgp-msg.c:417
#, c-format
msgid "%s sent a sticker."
msgstr "%s odeslal nálepku."
#: ../tgp-msg.c:463
msgid "failed loading message"
msgstr "selhalo načítání zprávy"
#: ../tgp-msg.c:498
msgid "[animation]"
msgstr "[animace]"
#: ../tgp-msg.c:515
msgid "[audio]"
msgstr "[audio]"
#: ../tgp-msg.c:515
msgid "[video]"
msgstr "[video]"
#: ../tgp-msg.c:604
#, c-format
msgid "<b>Forwarded message from: %s</b><br>%s"
msgstr "<b>Zpráva přeposlaná od:%s</b><br>%s"
#. FIXME: sometimes users aren't part of the response when receiving a
#. forwarded message
#: ../tgp-msg.c:607
#, c-format
msgid "<b>Forwarded message:</b><br>%s"
msgstr "<b>Přeposlaná zpráva:</b><br>%s"
#: ../tgp-msg.c:720
msgid "loading document or picture failed"
msgstr "nahrávání dokumentu nebo obrázku sehlalo"
#: ../tgp-net.c:281
msgid "Cannot connect to main server"
msgstr "Nelze se připojit k hlavnímu serveru"
#: ../tgp-net.c:322
msgid "Cannot connect to server: Ping timeout."
msgstr "Nelze se připojit k serveru: Vypršel časový limit pingu"
#: ../tgp-net.c:365
msgid "Lost connection to the server..."
msgstr "Ztraceno spojení se serverem..."
#: ../tgp-request.c:51
msgid ""
"Telegram wants to verify your identity. Please enter the login code that you"
" have received via SMS."
msgstr ""
"Telegram potřebuje ověřit identitu. Prosím zadejte přihlašovací kód, který "
"jste obdrželi v SMS."
#: ../tgp-request.c:54
msgid "Login code"
msgstr "Přihlašovací kód"
#: ../tgp-request.c:54
msgid "Enter login code"
msgstr "Zadejte přihlašovací kód"
#: ../tgp-request.c:54
msgid "the code"
msgstr "kód"
#: ../tgp-request.c:54 ../tgp-request.c:104 ../tgp-request.c:198
#: ../tgp-request.c:233 ../tgp-request.c:263
msgid "OK"
msgstr "OK"
#: ../tgp-request.c:55 ../tgp-request.c:104 ../tgp-request.c:123
#: ../tgp-request.c:199 ../tgp-request.c:234 ../tgp-request.c:264
msgid "Cancel"
msgstr "Zrušit"
#: ../tgp-request.c:95
msgid "Registration"
msgstr "Registrace"
#: ../tgp-request.c:96
msgid "First name"
msgstr "Jméno"
#: ../tgp-request.c:99
msgid "Last name"
msgstr "Příjmení"
#: ../tgp-request.c:103
msgid "Register"
msgstr "Registrovat"
#: ../tgp-request.c:103
msgid "Please register your phone number."
msgstr "Prosím zaregistrujte své telefonní číslo."
#. purple_request API not available
#: ../tgp-request.c:108
msgid ""
"Phone number is not registered. Please register your phone on a different "
"client."
msgstr ""
"Telefonní číslo není zaregistrované. Prosím zaregistrujte své telefonní "
"číslo v jiné aplikaci."
#: ../tgp-request.c:110
msgid "Not registered"
msgstr "Neregistrován"
#: ../tgp-request.c:122
msgid "Password needed"
msgstr "Vyžadováno heslo"
#: ../tgp-request.c:122
msgid "Enter password for two factor authentication"
msgstr "Zadejte heslo pro dvoufaktorovou autentizaci"
#: ../tgp-request.c:123
msgid "Ok"
msgstr "Ok"
#: ../tgp-request.c:125
msgid ""
"No password set for two factor authentication. Please enter it in the "
"extended settings."
msgstr ""
"Není zadáno heslo pro dvoufaktorovou autentizaci. Prosím zadejte jej v "
"pokročilém nastavení."
#: ../tgp-request.c:127
msgid "Password invalid"
msgstr "Neplatné heslo"
#: ../tgp-request.c:150
#, c-format
msgid "Accept secret chat '%s' on this device?"
msgstr "Přijmout tajný chat '%s' na tomto zařízení?"
#: ../tgp-request.c:151
msgid "Secret chat"
msgstr "Tajný chat"
#: ../tgp-request.c:151
msgid ""
"Secret chats can only have one end point. If you accept a secret chat on "
"this device, its messages will not be available anywhere else. If you "
"decline, you can still accept the chat on other devices."
msgstr ""
"Tajný chat může mít pouze jeden koncový bod. Pokud přijmete tajný chat na "
"tomto zařízení, zprávy nebudou dostupné nikde jinde. Pokud odmítnete, můžete"
" stále přijmout chat na jiném zařízení."
#: ../tgp-request.c:182
msgid ""
"Invite at least one additional user by specifying\n"
" their full name (autocompletion available).\n"
"You can add more users once the chat was created."
msgstr ""
"Pozvěte minimálně jednoho dalšího uživatele tím,\n"
"že zadáte jeho celé jméno (automatické doplňování dostupné).\n"
"Můžete přidat více uživatelů po té, co je chat vytvořen."
#: ../tgp-request.c:185 ../tgp-request.c:189 ../tgp-request.c:193
msgid "Username"
msgstr "Uživatelské jméno"
#: ../tgp-request.c:198
msgid "Create group chat"
msgstr "Vytvořit skupinový chat"
#: ../tgp-request.c:198
msgid "Invite users"
msgstr "Pozvat uživatele"
#: ../tgp-request.c:217 ../tgp-request.c:232
msgid "Change password"
msgstr "Změnit heslo"
#: ../tgp-request.c:219
msgid "Current"
msgstr "Aktuální"
#: ../tgp-request.c:223 ../tgp-request.c:253
msgid "Password"
msgstr "Heslo"
#: ../tgp-request.c:227 ../tgp-request.c:257
msgid "Confirm"
msgstr "Potvrdit"
#: ../tgp-request.c:251 ../tgp-request.c:262
msgid "New password"
msgstr "Nové heslo"
#. if we arrive here for the second time the specified phone number is not
#. valid. We do not
#. ask for the phone number directly, cause in that case the account would
#. still be created
#. named with the invalid phone number, even though the login will work
#: ../tgp-request.c:300
msgid "Invalid phone number"
msgstr "Neplatné telefonní číslo"
#: ../tgp-request.c:301
msgid ""
"Please enter only numbers in the international phone number format, a leading + following by the country prefix and the phone number.\n"
"Do not use any other special chars."
msgstr ""
"Prosím zadejte pouze čísla v mezinárodním telefonním formátu, počáteční + následované mezinárodním předčíslím a telefonním číslem.\n"
"Nepoužívejte žádné jiné speciální znaky."
#: ../tgp-request.c:370
msgid "Leave Chat"
msgstr "Opustit chat"
#: ../tgp-request.c:372
msgid "Do you want to leave this chat permantently?"
msgstr "Chcete tento chat opustit trvale?"
#: ../tgp-request.c:377
msgid "Abort Secret Chat"
msgstr "Ukončit tajný chat"
#: ../tgp-request.c:379
msgid "Do you want to terminate this secret chat permantently?"
msgstr "Chcete ukončit tento tajný chat trvale?"
#: ../tgp-request.c:384
msgid "Delete Contact"
msgstr "Smazat kontant"
#: ../tgp-request.c:386
msgid "Do you want to remove this user from your global contact list?"
msgstr "Chcete tohoto uživatele odstranit ze seznamu kontaktů?"
#: ../tgp-request.c:401
msgid "Leave Channel"
msgstr "Opustit kanál"
#: ../tgp-request.c:403
msgid "Do you want to leave this channel?"
msgstr "Chcete opustit tento kanál?"
#. This should be the language's timestamp format. This is preceded by a
#. colon.
#: ../tgp-utils.c:27
msgid "%d.%m.%Y %H:%M"
msgstr "%d.%m.%Y %H:%M"
#. This is preceded by a colon.
#: ../tgp-utils.c:48
msgid "recently"
msgstr "nedávno"
#. This is preceded by a colon.
#: ../tgp-utils.c:52
msgid "last week"
msgstr "poslední týden"
#. This is preceded by a colon.
#: ../tgp-utils.c:56
msgid "last month"
msgstr "poslední měsíc"
#. This is preceded by a colon. It refers to a point on time.
#: ../tgp-utils.c:60
msgid "unknown"
msgstr "neznámé"
#: ../tgp-chat.c:108 ../tgp-chat.c:582
msgid "Telegram Chats"
msgstr "Chaty Telegramu"
#: ../tgp-chat.c:113
msgid "You have already left this chat."
msgstr "Již jste tento chat opistili."
#: ../tgp-chat.c:224
msgid "Subject:"
msgstr "Předmět:"
#: ../tgp-chat.c:230
msgid "Invite link:"
msgstr "Odkaz pozvánky:"
#: ../tgp-chat.c:236
msgid "Chat ID:"
msgstr "ID Chatu:"
#: ../tgp-chat.c:342
msgid "Supergroup"
msgstr "Superskupina"
#: ../tgp-chat.c:342
msgid "Channel"
msgstr "Kanál"
#: ../tgp-chat.c:345
msgid "Group"
msgstr "Skupina"
#: ../tgp-chat.c:367
msgid "Users in chat"
msgstr "Uživatelé v chatu"
#: ../tgp-chat.c:370
msgid "Type"
msgstr "Typ"

419
po/da.po
View file

@ -1,88 +1,93 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Titanus Eramius <titanus@aptget.dk>, 2015
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-21 14:37+0100\n"
"PO-Revision-Date: 2015-12-18 13:05+0000\n"
"Last-Translator: Ben Wiederhake <BenWiederhake.GitHub@gmx.de>\n"
"Language-Team: Danish (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/da/)\n"
"POT-Creation-Date: 2016-08-31 22:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: TitanusEramius <titanus@aptget.dk>, 2016\n"
"Language-Team: Danish (https://www.transifex.com/telegram-purple-developers/teams/53149/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: da\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../telegram-base.c:515
#: ../telegram-base.c:500
msgid "Couldn't create group"
msgstr "Kunne ikke lave gruppe"
#: ../telegram-base.c:515
#: ../telegram-base.c:501
msgid "Please select at least one other user."
msgstr ""
msgstr "Vælg mindst én anden bruger."
#: ../telegram-base.c:570
#: ../telegram-base.c:555
msgid "Query Failed"
msgstr ""
msgstr "Forespørgsel fejlede"
#: ../telegram-purple.c:193
#: ../telegram-purple.c:162
msgid "Secret chat ready."
msgstr ""
msgstr "Hemmelig chat klar."
#: ../telegram-purple.c:200
#: ../telegram-purple.c:170
msgid "Secret chat terminated."
msgstr "Hemmelig chat afsluttet."
#: ../telegram-purple.c:268
#: ../telegram-purple.c:182
msgid "Telegram"
msgstr "Telegram"
#: ../telegram-purple.c:229
msgid "Message marked as read."
msgstr "Besked markeret som læst."
#: ../telegram-purple.c:486
#: ../telegram-purple.c:339
#, c-format
msgid "Invite link: %s"
msgstr "Invitationslink: %s"
#: ../telegram-purple.c:506 ../telegram-purple.c:507
#. FIXME: Can TGLCHF_MODERATOR export links?
#: ../telegram-purple.c:350
msgid "Creating chat link failed"
msgstr "Oprettelse af chatlink fejlede"
#: ../telegram-purple.c:508
#: ../telegram-purple.c:351
msgid "You need to be admin of the group to do that."
msgstr ""
#: ../telegram-purple.c:531
#: ../telegram-purple.c:416
msgid "Chat joined"
msgstr "Chat tilsluttet"
#: ../telegram-purple.c:532
#: ../telegram-purple.c:417
msgid "Chat added to list of chat rooms."
msgstr "Chat tilføjet listen af chatrum."
#: ../telegram-purple.c:552
#: ../telegram-purple.c:443
msgid "Start secret chat..."
msgstr ""
msgstr "Start hemmelig chat..."
#. Generate Public Link
#: ../telegram-purple.c:558
#: ../telegram-purple.c:450
msgid "Invite users by link..."
msgstr ""
msgstr "Invitér brugere med link..."
#. Delete self from chat
#: ../telegram-purple.c:564
#: ../telegram-purple.c:458
msgid "Delete and exit..."
msgstr ""
msgstr "Slet og afslut..."
#: ../telegram-purple.c:632
#: ../telegram-purple.c:546
#, c-format
msgid "Unable to sign on as %s: pubkey not found."
msgid "Unable to sign on as %s: file (public key) not found."
msgstr ""
#: ../telegram-purple.c:636
#: ../telegram-purple.c:550
#, c-format
msgid ""
"Make sure telegram-purple is installed properly,\n"
@ -92,334 +97,380 @@ msgid ""
"%1$s to %2$s."
msgstr ""
#: ../telegram-purple.c:657
#: ../telegram-purple.c:572
#, c-format
msgid ""
"Unable to sign on as %s: problem in the underlying library 'tgl'. Please "
"submit a bug report with the debug log."
msgstr ""
#: ../telegram-purple.c:576
msgid "Problem in tgl"
msgstr "Problem i tgl"
#. TRANSLATORS: Please fill in your own prefix!
#: ../telegram-purple.c:584
#, c-format
msgid ""
"Unable to sign on as %s: phone number lacks country prefix. Numbers must "
"start with the full international prefix code, e.g. +49 for Germany."
"start with the full international prefix code, e.g. +1 for USA."
msgstr ""
#: ../telegram-purple.c:662
#: ../telegram-purple.c:589
msgid "Incomplete phone number"
msgstr ""
msgstr "Ugyldigt telefonnummer"
#: ../telegram-purple.c:788 ../telegram-purple.c:789
#: ../telegram-purple.c:642
msgid "Secret chat was already deleted"
msgstr "Hemmelig chat er allerede slettet"
#: ../telegram-purple.c:644
msgid "Secret chat is not ready"
msgstr "Hemmelig chat er ikke klar"
#: ../telegram-purple.c:652
msgid "Only the creator of a channel can post messages."
msgstr "Kun den der opretter en kanal kan skrive beskeder."
#: ../telegram-purple.c:695
msgid "Cannot invite buddy to chat"
msgstr "Kan ikke invitere ven til chat"
#: ../telegram-purple.c:790
#: ../telegram-purple.c:696
msgid "Specified user does not exist."
msgstr "Angivet bruger eksisterer ikke."
#: ../telegram-purple.c:709
msgid "phone no. (+ country prefix)"
msgstr "Telefon nr. (+ landekode)"
#. Login
#: ../telegram-purple.c:932
#: ../telegram-purple.c:817
msgid "Password (two factor authentication)"
msgstr "Kodeord (to-vejs godkendelse)"
#: ../telegram-purple.c:938
#: ../telegram-purple.c:822
msgid ""
"Fallback SMS verification\n"
"(Helps when not using Pidgin and you aren't being prompted for the code)"
msgstr ""
#: ../telegram-purple.c:946
msgid "ask"
msgstr "spørg"
#: ../telegram-purple.c:947
#: ../telegram-purple.c:828
msgid "always"
msgstr "altid"
#: ../telegram-purple.c:948
#: ../telegram-purple.c:829
msgid "never"
msgstr "aldrig"
#: ../telegram-purple.c:950
#: ../telegram-purple.c:830
msgid "ask"
msgstr "spørg"
#: ../telegram-purple.c:832
msgid "Accept secret chats"
msgstr "Acceptér hemmelige chats"
#: ../telegram-purple.c:955
#: ../telegram-purple.c:836
msgid "Display buddies offline after (days)"
msgstr ""
msgstr "Vis venner som offline efter (dage)"
#: ../telegram-purple.c:960
msgid "Fetch past history on first login"
msgstr "Hent historie ved første log ind"
#: ../telegram-purple.c:965
#: ../telegram-purple.c:840
msgid ""
"Don't fetch history older than (days)\n"
"(0 for unlimited)"
msgstr "Hent ikke historie ældre end (dage)\n(0 for ubegrænset)"
msgstr ""
"Hent ikke historie ældre end (dage)\n"
"(0 for ubegrænset)"
#. Media
#: ../telegram-purple.c:845
msgid "Autoload media size (kb)"
msgstr ""
#. Chats
#: ../telegram-purple.c:973
#: ../telegram-purple.c:850
msgid "Add all group chats to buddy list"
msgstr ""
#. Read notifications
#: ../telegram-purple.c:981
#: ../telegram-purple.c:855
msgid "Display notices of receipt"
msgstr "Vis modtagelseskvittering"
#: ../telegram-purple.c:986
#: ../telegram-purple.c:859
msgid "Send notices of receipt when present"
msgstr ""
#: ../tgp-2prpl.c:178 ../tgp-request.c:108
msgid "First name"
msgstr "Fornavn"
#: ../tgp-2prpl.c:179 ../tgp-request.c:111
msgid "Last name"
msgstr "Efternavn"
#: ../tgp-2prpl.c:181
msgid "Name"
msgstr "Navn"
#: ../tgp-2prpl.c:186 ../tgp-request.c:197 ../tgp-request.c:201
#: ../tgp-request.c:205
msgid "Username"
msgstr "Brugernavn"
#: ../tgp-2prpl.c:191
msgid "Last seen"
msgstr "Sidst set"
#: ../tgp-2prpl.c:196
msgid "Phone"
msgstr "Telefon"
#: ../tgp-2prpl.c:208
msgid "Waiting for the user to get online..."
#: ../telegram-purple.c:884
msgid "Telegram Protocol Plugin."
msgstr ""
#: ../tgp-2prpl.c:212
msgid "Self destruction timer"
msgstr ""
#: ../tgp-2prpl.c:218
msgid "Timer is not enabled."
msgstr ""
#: ../tgp-2prpl.c:225
msgid "Secret key"
msgstr "Hemmelig nøgle"
#: ../tgp-msg.c:72
#: ../tgp-msg.c:58
#, c-format
msgid "%2$s created chat %1$s."
msgstr "%2$s oprettede chat %1$s."
#: ../tgp-msg.c:75
#: ../tgp-msg.c:61
#, c-format
msgid "%2$s changed title to %1$s."
msgstr "%2$s ændrede titel til %1$s."
#: ../tgp-msg.c:78
#: ../tgp-msg.c:64
#, c-format
msgid "%s changed photo."
msgstr "%s ændrede foto."
#: ../tgp-msg.c:81
#: ../tgp-msg.c:67
#, c-format
msgid "%s deleted photo."
msgstr "%s slettede foto."
#: ../tgp-msg.c:89
#: ../tgp-msg.c:75
#, c-format
msgid "%1$s added user %2$s by link."
msgstr "%1$s tilføjede bruger %2$s med link."
#: ../tgp-msg.c:102
#: ../tgp-msg.c:90
#, c-format
msgid "%2$s added user %1$s."
msgstr "%2$s tilføjede bruger %1$s."
#: ../tgp-msg.c:125 ../tgp-msg.c:140
#: ../tgp-msg.c:114 ../tgp-msg.c:131
#, c-format
msgid "%2$s deleted user %1$s."
msgstr "%2$s slettede bruger %1$s."
#: ../tgp-msg.c:146
#: ../tgp-msg.c:138
#, c-format
msgid "%2$s set self destruction timer to %1$d second."
msgid_plural "%2$s set self destruction timer to %1$d seconds."
msgstr[0] ""
msgstr[1] ""
#: ../tgp-msg.c:152
#: ../tgp-msg.c:144
#, c-format
msgid "%2$s marked %1$d message read."
msgid_plural "%2$s marked %1$d messages read."
msgstr[0] ""
msgstr[1] ""
#: ../tgp-msg.c:158
#: ../tgp-msg.c:150
#, c-format
msgid "%2$s deleted %1$d message."
msgid_plural "%2$s deleted %1$d messages."
msgstr[0] ""
msgstr[1] ""
#: ../tgp-msg.c:164
#: ../tgp-msg.c:156
#, c-format
msgid "%2$s made a screenshot of %1$d message."
msgid_plural "%2$s made a screenshot of %1$d messages."
msgstr[0] ""
msgstr[1] ""
#: ../tgp-msg.c:162
#, c-format
msgid "Channel %1$s created"
msgstr ""
#. FIXME: check if this makes sense
#: ../tgp-msg.c:165 ../tgp-chat.c:124 ../tgp-chat.c:576
msgid "Telegram Channels"
msgstr ""
#: ../tgp-msg.c:191
msgid "Sending message failed."
msgstr ""
#: ../tgp-msg.c:296
#: ../tgp-msg.c:253
msgid "Sending image failed."
msgstr "Afsendelse af billede fejlede."
#: ../tgp-msg.c:310
msgid "Sorry, sending documents to encrypted chats not yet supported."
msgstr ""
#: ../tgp-msg.c:400
#: ../tgp-msg.c:417
#, c-format
msgid "%s sent a sticker."
msgstr ""
#: ../tgp-net.c:286
#: ../tgp-msg.c:463
msgid "failed loading message"
msgstr ""
#: ../tgp-msg.c:498
msgid "[animation]"
msgstr ""
#: ../tgp-msg.c:515
msgid "[audio]"
msgstr ""
#: ../tgp-msg.c:515
msgid "[video]"
msgstr ""
#: ../tgp-msg.c:604
#, c-format
msgid "<b>Forwarded message from: %s</b><br>%s"
msgstr ""
#. FIXME: sometimes users aren't part of the response when receiving a
#. forwarded message
#: ../tgp-msg.c:607
#, c-format
msgid "<b>Forwarded message:</b><br>%s"
msgstr ""
#: ../tgp-msg.c:720
msgid "loading document or picture failed"
msgstr ""
#: ../tgp-net.c:281
msgid "Cannot connect to main server"
msgstr ""
#: ../tgp-net.c:342
#: ../tgp-net.c:322
msgid "Cannot connect to server: Ping timeout."
msgstr ""
#: ../tgp-net.c:387
#: ../tgp-net.c:365
msgid "Lost connection to the server..."
msgstr ""
#: ../tgp-request.c:64
#: ../tgp-request.c:51
msgid ""
"Telegram wants to verify your identity. Please enter the login code that you"
" have received via SMS."
msgstr ""
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Login code"
msgstr "Log ind kode"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Enter login code"
msgstr "Indtast log ind kode"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "the code"
msgstr "koden"
#: ../tgp-request.c:67 ../tgp-request.c:116 ../tgp-request.c:210
#: ../tgp-request.c:245 ../tgp-request.c:275
#: ../tgp-request.c:54 ../tgp-request.c:104 ../tgp-request.c:198
#: ../tgp-request.c:233 ../tgp-request.c:263
msgid "OK"
msgstr "OK"
#: ../tgp-request.c:68 ../tgp-request.c:116 ../tgp-request.c:135
#: ../tgp-request.c:211 ../tgp-request.c:246 ../tgp-request.c:276
#: ../tgp-request.c:55 ../tgp-request.c:104 ../tgp-request.c:123
#: ../tgp-request.c:199 ../tgp-request.c:234 ../tgp-request.c:264
msgid "Cancel"
msgstr "Afbryd"
#: ../tgp-request.c:107
#: ../tgp-request.c:95
msgid "Registration"
msgstr "Registrering"
#: ../tgp-request.c:115
#: ../tgp-request.c:96
msgid "First name"
msgstr "Fornavn"
#: ../tgp-request.c:99
msgid "Last name"
msgstr "Efternavn"
#: ../tgp-request.c:103
msgid "Register"
msgstr "Registrér"
#: ../tgp-request.c:115
#: ../tgp-request.c:103
msgid "Please register your phone number."
msgstr "Registrér venligst dit telefonnummer"
#. purple_request API not available
#: ../tgp-request.c:120
#: ../tgp-request.c:108
msgid ""
"Phone number is not registered. Please register your phone on a different "
"client."
msgstr ""
#: ../tgp-request.c:122
#: ../tgp-request.c:110
msgid "Not registered"
msgstr ""
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Password needed"
msgstr ""
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Enter password for two factor authentication"
msgstr "Indtast kodeord til to-vejs godkendelse"
#: ../tgp-request.c:135
#: ../tgp-request.c:123
msgid "Ok"
msgstr ""
#: ../tgp-request.c:137
#: ../tgp-request.c:125
msgid ""
"No password set for two factor authentication. Please enter it in the "
"extended settings."
msgstr "Intet kodeord sat til to-vejs godkendelse. Indtast det venligst i de udvidede indstillinger."
msgstr ""
"Intet kodeord sat til to-vejs godkendelse. Indtast det venligst i de "
"udvidede indstillinger."
#: ../tgp-request.c:139
#: ../tgp-request.c:127
msgid "Password invalid"
msgstr "Ugyldigt kodeord"
#: ../tgp-request.c:162
#: ../tgp-request.c:150
#, c-format
msgid "Accept secret chat '%s' on this device?"
msgstr ""
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid "Secret chat"
msgstr ""
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid ""
"Secret chats can only have one end point. If you accept a secret chat on "
"this device, its messages will not be available anywhere else. If you "
"decline, you can still accept the chat on other devices."
msgstr ""
#: ../tgp-request.c:194
#: ../tgp-request.c:182
msgid ""
"Invite at least one additional user by specifying\n"
" their full name (autocompletion available).\n"
"You can add more users once the chat was created."
msgstr ""
#: ../tgp-request.c:210
#: ../tgp-request.c:185 ../tgp-request.c:189 ../tgp-request.c:193
msgid "Username"
msgstr "Brugernavn"
#: ../tgp-request.c:198
msgid "Create group chat"
msgstr "Lav gruppechat"
#: ../tgp-request.c:210
#: ../tgp-request.c:198
msgid "Invite users"
msgstr "Invitér brugere"
#: ../tgp-request.c:229 ../tgp-request.c:244
#: ../tgp-request.c:217 ../tgp-request.c:232
msgid "Change password"
msgstr ""
#: ../tgp-request.c:231
#: ../tgp-request.c:219
msgid "Current"
msgstr ""
#: ../tgp-request.c:235 ../tgp-request.c:265
#: ../tgp-request.c:223 ../tgp-request.c:253
msgid "Password"
msgstr "Kodeord"
#: ../tgp-request.c:239 ../tgp-request.c:269
#: ../tgp-request.c:227 ../tgp-request.c:257
msgid "Confirm"
msgstr ""
#: ../tgp-request.c:263 ../tgp-request.c:274
#: ../tgp-request.c:251 ../tgp-request.c:262
msgid "New password"
msgstr ""
@ -428,58 +479,110 @@ msgstr ""
#. ask for the phone number directly, cause in that case the account would
#. still be created
#. named with the invalid phone number, even though the login will work
#: ../tgp-request.c:312
#: ../tgp-request.c:300
msgid "Invalid phone number"
msgstr "Ugyldigt telefonnummer"
#: ../tgp-request.c:313
#: ../tgp-request.c:301
msgid ""
"Please enter only numbers in the international phone number format, a leading + following by the country prefix and the phone number.\n"
"Do not use any other special chars."
msgstr ""
#: ../tgp-request.c:370
msgid "Leave Chat"
msgstr ""
#: ../tgp-request.c:372
msgid "Do you want to leave this chat permantently?"
msgstr ""
#: ../tgp-request.c:377
msgid "Abort Secret Chat"
msgstr ""
#: ../tgp-request.c:379
msgid "Do you want to terminate this secret chat permantently?"
msgstr ""
#: ../tgp-request.c:384
msgid "Delete Contact"
msgstr ""
#: ../tgp-request.c:386
msgid "Do you want to remove this user from your global contact list?"
msgstr ""
#: ../tgp-request.c:401
msgid "Leave Channel"
msgstr ""
#: ../tgp-request.c:403
msgid "Do you want to leave this channel?"
msgstr ""
#. This should be the language's timestamp format. This is preceded by a
#. colon.
#: ../tgp-utils.c:32
#: ../tgp-utils.c:27
msgid "%d.%m.%Y %H:%M"
msgstr "%d.%m.%Y %H:%M"
#. This is preceded by a colon.
#: ../tgp-utils.c:53
#: ../tgp-utils.c:48
msgid "recently"
msgstr "for nyligt"
#. This is preceded by a colon.
#: ../tgp-utils.c:57
#: ../tgp-utils.c:52
msgid "last week"
msgstr "sidste uge"
#. This is preceded by a colon.
#: ../tgp-utils.c:61
#: ../tgp-utils.c:56
msgid "last month"
msgstr "sidste måned"
#. This is preceded by a colon. It refers to a point on time.
#: ../tgp-utils.c:65
#: ../tgp-utils.c:60
msgid "unknown"
msgstr "ukendt"
#: ../tgp-chat.c:79
#: ../tgp-chat.c:108 ../tgp-chat.c:582
msgid "Telegram Chats"
msgstr ""
#: ../tgp-chat.c:113
msgid "You have already left this chat."
msgstr "Du har allerede forladt denne chat."
#: ../tgp-chat.c:127
#: ../tgp-chat.c:224
msgid "Subject:"
msgstr "Emne:"
#: ../tgp-chat.c:133
#: ../tgp-chat.c:230
msgid "Invite link:"
msgstr "Invitationslink:"
#: ../tgp-chat.c:139
#: ../tgp-chat.c:236
msgid "Chat ID:"
msgstr "Chat ID:"
#: ../tgp-chat.c:238
#: ../tgp-chat.c:342
msgid "Supergroup"
msgstr ""
#: ../tgp-chat.c:342
msgid "Channel"
msgstr ""
#: ../tgp-chat.c:345
msgid "Group"
msgstr ""
#: ../tgp-chat.c:367
msgid "Users in chat"
msgstr ""
#: ../tgp-chat.c:370
msgid "Type"
msgstr ""

View file

@ -1,89 +1,94 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Ben Wiederhake <BenWiederhake.GitHub@gmx.de>, 2015
# M J <mtthsjntsch@gmail.com>, 2015
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-21 14:37+0100\n"
"PO-Revision-Date: 2015-12-18 13:05+0000\n"
"Last-Translator: Ben Wiederhake <BenWiederhake.GitHub@gmx.de>\n"
"Language-Team: German (Germany) (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/de_DE/)\n"
"POT-Creation-Date: 2016-08-31 22:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Ben Wiederhake <BenWiederhake.GitHub@gmx.de>, 2016\n"
"Language-Team: German (Germany) (https://www.transifex.com/telegram-purple-developers/teams/53149/de_DE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de_DE\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../telegram-base.c:515
#: ../telegram-base.c:500
msgid "Couldn't create group"
msgstr "Konnte Gruppe nicht erstellen."
#: ../telegram-base.c:515
#: ../telegram-base.c:501
msgid "Please select at least one other user."
msgstr "Wählen Sie mindestens einen weiteren Benutzer."
#: ../telegram-base.c:570
#: ../telegram-base.c:555
msgid "Query Failed"
msgstr "Anfrage fehlgeschlagen"
#: ../telegram-purple.c:193
#: ../telegram-purple.c:162
msgid "Secret chat ready."
msgstr "Geheimer Chat ist bereit."
#: ../telegram-purple.c:200
#: ../telegram-purple.c:170
msgid "Secret chat terminated."
msgstr "Geheimer Chat wurde beendet."
#: ../telegram-purple.c:268
#: ../telegram-purple.c:182
msgid "Telegram"
msgstr "Telegram"
#: ../telegram-purple.c:229
msgid "Message marked as read."
msgstr "Nachricht als gelesen markiert."
#: ../telegram-purple.c:486
#: ../telegram-purple.c:339
#, c-format
msgid "Invite link: %s"
msgstr "Einladungslink: %s"
#: ../telegram-purple.c:506 ../telegram-purple.c:507
#. FIXME: Can TGLCHF_MODERATOR export links?
#: ../telegram-purple.c:350
msgid "Creating chat link failed"
msgstr "Konnte keinen Link zum Chat erstellen"
#: ../telegram-purple.c:508
#: ../telegram-purple.c:351
msgid "You need to be admin of the group to do that."
msgstr "Sie müssen Gruppenadmin sein, um das zu tun."
#: ../telegram-purple.c:531
#: ../telegram-purple.c:416
msgid "Chat joined"
msgstr "Chat beigetreten"
#: ../telegram-purple.c:532
#: ../telegram-purple.c:417
msgid "Chat added to list of chat rooms."
msgstr "Chat der Liste von Chat-Räumen hinzugefügt."
#: ../telegram-purple.c:552
#: ../telegram-purple.c:443
msgid "Start secret chat..."
msgstr "Beginne geheimen Chat ..."
#. Generate Public Link
#: ../telegram-purple.c:558
#: ../telegram-purple.c:450
msgid "Invite users by link..."
msgstr "Nutzer per Link einladen ..."
#. Delete self from chat
#: ../telegram-purple.c:564
#: ../telegram-purple.c:458
msgid "Delete and exit..."
msgstr "Löschen und verlassen ..."
#: ../telegram-purple.c:632
#: ../telegram-purple.c:546
#, c-format
msgid "Unable to sign on as %s: pubkey not found."
msgstr "Konnte nicht als %s einloggen: Öffentlichen Schlüssel nicht gefunden"
msgid "Unable to sign on as %s: file (public key) not found."
msgstr ""
"Konnte nicht als %s einloggen: Datei (öffentlichen Schlüssel) nicht gefunden"
#: ../telegram-purple.c:636
#: ../telegram-purple.c:550
#, c-format
msgid ""
"Make sure telegram-purple is installed properly,\n"
@ -91,336 +96,408 @@ msgid ""
"If you're running SELinux (e.g. when using Tails),\n"
"try 'make local_install', or simply copy\n"
"%1$s to %2$s."
msgstr "Stellen Sie eine korrekte Installation sicher,\ninklusive der .tglpub-Datei.\nFalls Sie SELinux benutzen (z.B. innerhalb von Tails),\nversuchen Sie 'make local_install', oder kopieren Sie einfach\n%1$s nach %2$s."
msgstr ""
"Stellen Sie eine korrekte Installation sicher,\n"
"inklusive der .tglpub-Datei.\n"
"Falls Sie SELinux benutzen (z.B. innerhalb von Tails),\n"
"versuchen Sie 'make local_install', oder kopieren Sie einfach\n"
"%1$s nach %2$s."
#: ../telegram-purple.c:657
#: ../telegram-purple.c:572
#, c-format
msgid ""
"Unable to sign on as %s: problem in the underlying library 'tgl'. Please "
"submit a bug report with the debug log."
msgstr ""
"Konnte nicht als %s einloggen: Problem in der Bibliothek 'tgl'. Bitte "
"erstelle einen Bigreport mit Debug-Log."
#: ../telegram-purple.c:576
msgid "Problem in tgl"
msgstr "Problem in tgl"
#. TRANSLATORS: Please fill in your own prefix!
#: ../telegram-purple.c:584
#, c-format
msgid ""
"Unable to sign on as %s: phone number lacks country prefix. Numbers must "
"start with the full international prefix code, e.g. +49 for Germany."
msgstr "Konnte nicht als %s einloggen: Telefonnummer hat scheinbar keinen internationalen\nPräfix-Code, z.B. +49 für Deutschland."
"start with the full international prefix code, e.g. +1 for USA."
msgstr ""
"Konnte nicht als %s einloggen: Telefonnummer hat kein Präfix. Telefonnummern"
" müssen mit dem vollen internationalen Präfix-Code starten, z.B. +49 für "
"Deutschland."
#: ../telegram-purple.c:662
#: ../telegram-purple.c:589
msgid "Incomplete phone number"
msgstr "Unvollständige Telefonnummer"
#: ../telegram-purple.c:788 ../telegram-purple.c:789
#: ../telegram-purple.c:642
msgid "Secret chat was already deleted"
msgstr "Geheimer Chat wurde bereits gelöscht."
#: ../telegram-purple.c:644
msgid "Secret chat is not ready"
msgstr "Geheimer Chat ist noch nicht bereit."
#: ../telegram-purple.c:652
msgid "Only the creator of a channel can post messages."
msgstr "Nur der Ersteller eines Kanals kann Nachrichten senden."
#: ../telegram-purple.c:695
msgid "Cannot invite buddy to chat"
msgstr "Kann den Freund nicht zum Chat einladen"
#: ../telegram-purple.c:790
#: ../telegram-purple.c:696
msgid "Specified user does not exist."
msgstr "Angegebener Benutzer existiert nicht."
#: ../telegram-purple.c:709
msgid "phone no. (+ country prefix)"
msgstr "Telefonnummer (+ Länder-Präfix)"
#. Login
#: ../telegram-purple.c:932
#: ../telegram-purple.c:817
msgid "Password (two factor authentication)"
msgstr "Passwort (Zwei-Faktor-Authentifizierung)"
#: ../telegram-purple.c:938
#: ../telegram-purple.c:822
msgid ""
"Fallback SMS verification\n"
"(Helps when not using Pidgin and you aren't being prompted for the code)"
msgstr "Ausweich SMS-Verifizierung\n(Hilfreich wenn Sie nicht Pidgin verwenden, und die Frage\nnach dem SMS-Code aus bleibt)"
msgstr ""
"Ausweich SMS-Verifizierung\n"
"(Hilfreich wenn Sie nicht Pidgin verwenden, und die Frage\n"
"nach dem SMS-Code aus bleibt)"
#: ../telegram-purple.c:946
msgid "ask"
msgstr "nachfragen"
#: ../telegram-purple.c:947
#: ../telegram-purple.c:828
msgid "always"
msgstr "immer"
#: ../telegram-purple.c:948
#: ../telegram-purple.c:829
msgid "never"
msgstr "nie"
#: ../telegram-purple.c:950
#: ../telegram-purple.c:830
msgid "ask"
msgstr "nachfragen"
#: ../telegram-purple.c:832
msgid "Accept secret chats"
msgstr "Geheime Chats akzeptieren"
#: ../telegram-purple.c:955
#: ../telegram-purple.c:836
msgid "Display buddies offline after (days)"
msgstr "Freunde als offline anzeigen nach (Tage)"
#: ../telegram-purple.c:960
msgid "Fetch past history on first login"
msgstr "Abrufen des bisherigen Verlaufs beim ersten Login"
#: ../telegram-purple.c:965
#: ../telegram-purple.c:840
msgid ""
"Don't fetch history older than (days)\n"
"(0 for unlimited)"
msgstr "Abrufen des Verlaufs begrenzen auf (Tage)\n(0 für unbegrenzt)"
msgstr ""
"Abrufen des Verlaufs begrenzen auf (Tage)\n"
"(0 für unbegrenzt)"
#. Media
#: ../telegram-purple.c:845
msgid "Autoload media size (kb)"
msgstr "Lade automatisch ab Größe (KB)"
#. Chats
#: ../telegram-purple.c:973
#: ../telegram-purple.c:850
msgid "Add all group chats to buddy list"
msgstr "Alle Gruppenchats in die Freundesliste einfügen"
#. Read notifications
#: ../telegram-purple.c:981
#: ../telegram-purple.c:855
msgid "Display notices of receipt"
msgstr "Empfangsbestätigungen anzeigen"
#: ../telegram-purple.c:986
#: ../telegram-purple.c:859
msgid "Send notices of receipt when present"
msgstr "Empfangsbestätigungen senden wenn anwesend"
#: ../tgp-2prpl.c:178 ../tgp-request.c:108
msgid "First name"
msgstr "Vorname"
#: ../telegram-purple.c:884
msgid "Telegram Protocol Plugin."
msgstr "Plugin für das Telegram Protokoll."
#: ../tgp-2prpl.c:179 ../tgp-request.c:111
msgid "Last name"
msgstr "Nachname"
#: ../tgp-2prpl.c:181
msgid "Name"
msgstr "Name"
#: ../tgp-2prpl.c:186 ../tgp-request.c:197 ../tgp-request.c:201
#: ../tgp-request.c:205
msgid "Username"
msgstr "Benutzername"
#: ../tgp-2prpl.c:191
msgid "Last seen"
msgstr "Zuletzt gesehen"
#: ../tgp-2prpl.c:196
msgid "Phone"
msgstr "Telefonnummer"
#: ../tgp-2prpl.c:208
msgid "Waiting for the user to get online..."
msgstr "Warte auf Anmeldung des Benutzers ..."
#: ../tgp-2prpl.c:212
msgid "Self destruction timer"
msgstr "Selbstzerstörungs-Timer"
#: ../tgp-2prpl.c:218
msgid "Timer is not enabled."
msgstr "Timer ist nicht aktiv."
#: ../tgp-2prpl.c:225
msgid "Secret key"
msgstr "Geheimer Schlüssel"
#: ../tgp-msg.c:72
#: ../tgp-msg.c:58
#, c-format
msgid "%2$s created chat %1$s."
msgstr "%2$s hat den Chat %1$s erstellt."
#: ../tgp-msg.c:75
#: ../tgp-msg.c:61
#, c-format
msgid "%2$s changed title to %1$s."
msgstr "%2$s hat den Titel zu %1$s geändert."
#: ../tgp-msg.c:78
#: ../tgp-msg.c:64
#, c-format
msgid "%s changed photo."
msgstr "%s hat das Photo geändert."
#: ../tgp-msg.c:81
#: ../tgp-msg.c:67
#, c-format
msgid "%s deleted photo."
msgstr "%s hat das Photo gelöscht."
#: ../tgp-msg.c:89
#: ../tgp-msg.c:75
#, c-format
msgid "%1$s added user %2$s by link."
msgstr "%1$s fügte Benutzer %2$s per Link hinzu."
#: ../tgp-msg.c:102
#: ../tgp-msg.c:90
#, c-format
msgid "%2$s added user %1$s."
msgstr "%2$s hat den Nutzer %1$s hinzufügt."
#: ../tgp-msg.c:125 ../tgp-msg.c:140
#: ../tgp-msg.c:114 ../tgp-msg.c:131
#, c-format
msgid "%2$s deleted user %1$s."
msgstr "%2$s entfernte Benutzer %1$s."
#: ../tgp-msg.c:146
#: ../tgp-msg.c:138
#, c-format
msgid "%2$s set self destruction timer to %1$d second."
msgid_plural "%2$s set self destruction timer to %1$d seconds."
msgstr[0] "%2$s setzte Selbstzerstörungs-Timer auf %1$d Sekunde."
msgstr[1] "%2$s setzte Selbstzerstörungs-Timer auf %1$d Sekunden."
#: ../tgp-msg.c:152
#: ../tgp-msg.c:144
#, c-format
msgid "%2$s marked %1$d message read."
msgid_plural "%2$s marked %1$d messages read."
msgstr[0] "%2$s markierte %1$d Nachricht als gelesen."
msgstr[1] "%2$s markierte %1$d Nachrichten als gelesen."
#: ../tgp-msg.c:158
#: ../tgp-msg.c:150
#, c-format
msgid "%2$s deleted %1$d message."
msgid_plural "%2$s deleted %1$d messages."
msgstr[0] "%2$s entfernte %1$d Nachricht."
msgstr[1] "%2$s entfernte %1$d Nachrichten."
#: ../tgp-msg.c:164
#: ../tgp-msg.c:156
#, c-format
msgid "%2$s made a screenshot of %1$d message."
msgid_plural "%2$s made a screenshot of %1$d messages."
msgstr[0] "%2$s machte einen Screenshot von %1$d Nachricht."
msgstr[1] "%2$s machte einen Screenshot von %1$d Nachrichten."
#: ../tgp-msg.c:162
#, c-format
msgid "Channel %1$s created"
msgstr "Kanal %1$s erstellt"
#. FIXME: check if this makes sense
#: ../tgp-msg.c:165 ../tgp-chat.c:124 ../tgp-chat.c:576
msgid "Telegram Channels"
msgstr "Telegram Kanäle"
#: ../tgp-msg.c:191
msgid "Sending message failed."
msgstr "Absenden der Nachricht fehlgeschlagen."
#: ../tgp-msg.c:296
#: ../tgp-msg.c:253
msgid "Sending image failed."
msgstr "Absenden des Bilds fehlgeschlagen."
#: ../tgp-msg.c:310
msgid "Sorry, sending documents to encrypted chats not yet supported."
msgstr "Tut uns Leid, aber das Versenden von Dokumenten in verschlüsselten Chats wird noch nicht unterstützt."
#: ../tgp-msg.c:400
#: ../tgp-msg.c:417
#, c-format
msgid "%s sent a sticker."
msgstr "%s hat einen Sticker gesendet."
#: ../tgp-net.c:286
#: ../tgp-msg.c:463
msgid "failed loading message"
msgstr "konnte Nachricht nicht laden."
#: ../tgp-msg.c:498
msgid "[animation]"
msgstr "[Animation]"
#: ../tgp-msg.c:515
msgid "[audio]"
msgstr "[Audio]"
#: ../tgp-msg.c:515
msgid "[video]"
msgstr "[Video]"
#: ../tgp-msg.c:604
#, c-format
msgid "<b>Forwarded message from: %s</b><br>%s"
msgstr "<b>Weitergeleitet von: %s</b> %s"
#. FIXME: sometimes users aren't part of the response when receiving a
#. forwarded message
#: ../tgp-msg.c:607
#, c-format
msgid "<b>Forwarded message:</b><br>%s"
msgstr "<b>Weitergeleitete Nachricht:</b> %s"
#: ../tgp-msg.c:720
msgid "loading document or picture failed"
msgstr "konnte Dokument oder Datei nicht laden"
#: ../tgp-net.c:281
msgid "Cannot connect to main server"
msgstr "Keine Verbindung zum Haupt-Server"
#: ../tgp-net.c:342
#: ../tgp-net.c:322
msgid "Cannot connect to server: Ping timeout."
msgstr "Keine Verbindung zum Server: Zeitpüberschreitung"
msgstr "Keine Verbindung zum Server: Zeitüberschreitung"
#: ../tgp-net.c:387
#: ../tgp-net.c:365
msgid "Lost connection to the server..."
msgstr "Verbindung zum Server verloren ..."
#: ../tgp-request.c:64
#: ../tgp-request.c:51
msgid ""
"Telegram wants to verify your identity. Please enter the login code that you"
" have received via SMS."
msgstr "Telegram möchte Ihre Identität prüfen. Bitte geben Sie den Login-Code ein, den Sie per SMS erhalten haben."
msgstr ""
"Telegram möchte Ihre Identität prüfen. Bitte geben Sie den Login-Code ein, "
"den Sie per SMS erhalten haben."
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Login code"
msgstr "Login-Code"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Enter login code"
msgstr "Login-Code eingeben"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "the code"
msgstr "der Login-Code"
#: ../tgp-request.c:67 ../tgp-request.c:116 ../tgp-request.c:210
#: ../tgp-request.c:245 ../tgp-request.c:275
#: ../tgp-request.c:54 ../tgp-request.c:104 ../tgp-request.c:198
#: ../tgp-request.c:233 ../tgp-request.c:263
msgid "OK"
msgstr "Ok"
#: ../tgp-request.c:68 ../tgp-request.c:116 ../tgp-request.c:135
#: ../tgp-request.c:211 ../tgp-request.c:246 ../tgp-request.c:276
#: ../tgp-request.c:55 ../tgp-request.c:104 ../tgp-request.c:123
#: ../tgp-request.c:199 ../tgp-request.c:234 ../tgp-request.c:264
msgid "Cancel"
msgstr "Abbrechen"
#: ../tgp-request.c:107
#: ../tgp-request.c:95
msgid "Registration"
msgstr "Anmeldung"
#: ../tgp-request.c:115
#: ../tgp-request.c:96
msgid "First name"
msgstr "Vorname"
#: ../tgp-request.c:99
msgid "Last name"
msgstr "Nachname"
#: ../tgp-request.c:103
msgid "Register"
msgstr "Anmelden"
#: ../tgp-request.c:115
#: ../tgp-request.c:103
msgid "Please register your phone number."
msgstr "Bitte registriere deine Telefonnummer."
#. purple_request API not available
#: ../tgp-request.c:120
#: ../tgp-request.c:108
msgid ""
"Phone number is not registered. Please register your phone on a different "
"client."
msgstr "Telefonnummer wurde noch nicht bei Telegram registriert. Bitte registrieren Sie Ihre Telefonnummer mit einem anderen Client."
msgstr ""
"Telefonnummer wurde noch nicht bei Telegram registriert. Bitte registrieren "
"Sie Ihre Telefonnummer mit einem anderen Client."
#: ../tgp-request.c:122
#: ../tgp-request.c:110
msgid "Not registered"
msgstr "Nicht registriert"
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Password needed"
msgstr "Passwort benötigt"
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Enter password for two factor authentication"
msgstr "Passwort für die Zwei-Faktor-Authentifizierung angeben"
#: ../tgp-request.c:135
#: ../tgp-request.c:123
msgid "Ok"
msgstr "Ok"
#: ../tgp-request.c:137
#: ../tgp-request.c:125
msgid ""
"No password set for two factor authentication. Please enter it in the "
"extended settings."
msgstr "Kein Passwort für die Zwei-Faktor-Authentifizierung gesetzt, bitte\nspezifizieren Sie dies in den erweiterten Einstellungen."
msgstr ""
"Kein Passwort für die Zwei-Faktor-Authentifizierung gesetzt, bitte\n"
"spezifizieren Sie dies in den erweiterten Einstellungen."
#: ../tgp-request.c:139
#: ../tgp-request.c:127
msgid "Password invalid"
msgstr "Passwort ungültig"
#: ../tgp-request.c:162
#: ../tgp-request.c:150
#, c-format
msgid "Accept secret chat '%s' on this device?"
msgstr "Geheimen Chat '%s' auf diesem Gerät akzeptieren?"
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid "Secret chat"
msgstr "Geheimer Chat"
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid ""
"Secret chats can only have one end point. If you accept a secret chat on "
"this device, its messages will not be available anywhere else. If you "
"decline, you can still accept the chat on other devices."
msgstr "Geheime Chats können nur einen Endpunkt haben. Wenn du den geheimen Chat auf diesem Geräte akzeptierst werden die Nachrichten nirgendwo anders verfügbar sein. Wenn du ablehnst kannst du den Chat immernoch auf anderen Geräten akzeptieren."
msgstr ""
"Geheime Chats können nur einen Endpunkt haben. Wenn du den geheimen Chat auf"
" diesem Geräte akzeptierst werden die Nachrichten nirgendwo anders verfügbar"
" sein. Wenn du ablehnst kannst du den Chat immernoch auf anderen Geräten "
"akzeptieren."
#: ../tgp-request.c:194
#: ../tgp-request.c:182
msgid ""
"Invite at least one additional user by specifying\n"
" their full name (autocompletion available).\n"
"You can add more users once the chat was created."
msgstr "Lade noch mindestens einen zusätzlichen Benutzer\ndurch Eingabe des vollständigen Namens ein\n(Autovervollständigung verfügbar).\nSie können später weitere Nutzer einladen, sobald\nder Chat erstellt wurde."
msgstr ""
"Lade noch mindestens einen zusätzlichen Benutzer\n"
"durch Eingabe des vollständigen Namens ein\n"
"(Autovervollständigung verfügbar).\n"
"Sie können später weitere Nutzer einladen, sobald\n"
"der Chat erstellt wurde."
#: ../tgp-request.c:210
#: ../tgp-request.c:185 ../tgp-request.c:189 ../tgp-request.c:193
msgid "Username"
msgstr "Benutzername"
#: ../tgp-request.c:198
msgid "Create group chat"
msgstr "Gruppenchat erstellen"
#: ../tgp-request.c:210
#: ../tgp-request.c:198
msgid "Invite users"
msgstr "Benutzer einladen"
#: ../tgp-request.c:229 ../tgp-request.c:244
#: ../tgp-request.c:217 ../tgp-request.c:232
msgid "Change password"
msgstr "Passwort ändern"
#: ../tgp-request.c:231
#: ../tgp-request.c:219
msgid "Current"
msgstr "Momentan"
#: ../tgp-request.c:235 ../tgp-request.c:265
#: ../tgp-request.c:223 ../tgp-request.c:253
msgid "Password"
msgstr "Passwort"
#: ../tgp-request.c:239 ../tgp-request.c:269
#: ../tgp-request.c:227 ../tgp-request.c:257
msgid "Confirm"
msgstr "Bestätigen"
#: ../tgp-request.c:263 ../tgp-request.c:274
#: ../tgp-request.c:251 ../tgp-request.c:262
msgid "New password"
msgstr "Neues Passwort"
@ -429,58 +506,112 @@ msgstr "Neues Passwort"
#. ask for the phone number directly, cause in that case the account would
#. still be created
#. named with the invalid phone number, even though the login will work
#: ../tgp-request.c:312
#: ../tgp-request.c:300
msgid "Invalid phone number"
msgstr "Ungültige Telefonnummer"
#: ../tgp-request.c:313
#: ../tgp-request.c:301
msgid ""
"Please enter only numbers in the international phone number format, a leading + following by the country prefix and the phone number.\n"
"Do not use any other special chars."
msgstr "Bitte geben Sie Telefonnummern im internationalen Format ein, bestehend aus einem führenden + gefolgt vom Länderprefix\nund der Rufnummer. Verwenden Sie keine anderen Sonderzeichen."
msgstr ""
"Bitte geben Sie Telefonnummern im internationalen Format ein, bestehend aus einem führenden + gefolgt vom Länderpräfix\n"
"und der Rufnummer. Verwenden Sie keine anderen Sonderzeichen."
#: ../tgp-request.c:370
msgid "Leave Chat"
msgstr "Chat verlassen"
#: ../tgp-request.c:372
msgid "Do you want to leave this chat permantently?"
msgstr "Möchten Sie diesen Chat dauerhaft verlassen?"
#: ../tgp-request.c:377
msgid "Abort Secret Chat"
msgstr "Geheimen Chat abbrechen"
#: ../tgp-request.c:379
msgid "Do you want to terminate this secret chat permantently?"
msgstr "Möchten Sie diesen geheimen Chat dauerhaft verlassen?"
#: ../tgp-request.c:384
msgid "Delete Contact"
msgstr "Kontakt löschen"
#: ../tgp-request.c:386
msgid "Do you want to remove this user from your global contact list?"
msgstr "Möchten Sie diesen Kontakt global löschen?"
#: ../tgp-request.c:401
msgid "Leave Channel"
msgstr "Kanal verlassen"
#: ../tgp-request.c:403
msgid "Do you want to leave this channel?"
msgstr "Möchten Sie diesen Kanal dauerhaft verlassen?"
#. This should be the language's timestamp format. This is preceded by a
#. colon.
#: ../tgp-utils.c:32
#: ../tgp-utils.c:27
msgid "%d.%m.%Y %H:%M"
msgstr "%d.%m.%Y %H:%M"
#. This is preceded by a colon.
#: ../tgp-utils.c:53
#: ../tgp-utils.c:48
msgid "recently"
msgstr "Kürzlich"
#. This is preceded by a colon.
#: ../tgp-utils.c:57
#: ../tgp-utils.c:52
msgid "last week"
msgstr "Letzte Woche"
#. This is preceded by a colon.
#: ../tgp-utils.c:61
#: ../tgp-utils.c:56
msgid "last month"
msgstr "Letzten Monat"
#. This is preceded by a colon. It refers to a point on time.
#: ../tgp-utils.c:65
#: ../tgp-utils.c:60
msgid "unknown"
msgstr "Unbekannt"
#: ../tgp-chat.c:79
#: ../tgp-chat.c:108 ../tgp-chat.c:582
msgid "Telegram Chats"
msgstr "Telegram Unterhaltugen"
#: ../tgp-chat.c:113
msgid "You have already left this chat."
msgstr "Du hast diesen Chat bereits verlassen."
#: ../tgp-chat.c:127
#: ../tgp-chat.c:224
msgid "Subject:"
msgstr "Thema:"
#: ../tgp-chat.c:133
#: ../tgp-chat.c:230
msgid "Invite link:"
msgstr "Einladungslink:"
#: ../tgp-chat.c:139
#: ../tgp-chat.c:236
msgid "Chat ID:"
msgstr "Chat ID:"
#: ../tgp-chat.c:238
#: ../tgp-chat.c:342
msgid "Supergroup"
msgstr "Über-Gruppe"
#: ../tgp-chat.c:342
msgid "Channel"
msgstr "Kanal"
#: ../tgp-chat.c:345
msgid "Group"
msgstr "Gruppe"
#: ../tgp-chat.c:367
msgid "Users in chat"
msgstr "Benutzer im Chat"
#: ../tgp-chat.c:370
msgid "Type"
msgstr "Typ"

615
po/es.po Normal file
View file

@ -0,0 +1,615 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-31 22:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: aguador <aguador@openmailbox.org>, 2017\n"
"Language-Team: Spanish (https://www.transifex.com/telegram-purple-developers/teams/53149/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../telegram-base.c:500
msgid "Couldn't create group"
msgstr "No se pudo crear el grupo"
#: ../telegram-base.c:501
msgid "Please select at least one other user."
msgstr "Por favor, seleccioná al menos otro usuario."
#: ../telegram-base.c:555
msgid "Query Failed"
msgstr "Falló la consulta"
#: ../telegram-purple.c:162
msgid "Secret chat ready."
msgstr "Conversación secreta lista."
#: ../telegram-purple.c:170
msgid "Secret chat terminated."
msgstr "Finalizó la conversación secreta."
#: ../telegram-purple.c:182
msgid "Telegram"
msgstr "Telegram"
#: ../telegram-purple.c:229
msgid "Message marked as read."
msgstr "Mensaje marcado como leído."
#: ../telegram-purple.c:339
#, c-format
msgid "Invite link: %s"
msgstr "Enlace de invitación: %s"
#. FIXME: Can TGLCHF_MODERATOR export links?
#: ../telegram-purple.c:350
msgid "Creating chat link failed"
msgstr "Falló la creación del enlace de converesación"
#: ../telegram-purple.c:351
msgid "You need to be admin of the group to do that."
msgstr "Necesite ser administrador del grupo para hacer eso."
#: ../telegram-purple.c:416
msgid "Chat joined"
msgstr "Unido a la conversación"
#: ../telegram-purple.c:417
msgid "Chat added to list of chat rooms."
msgstr "Conversación agregada a la lista de salas de conversaciones."
#: ../telegram-purple.c:443
msgid "Start secret chat..."
msgstr "Iniciar conversación secreta..."
#. Generate Public Link
#: ../telegram-purple.c:450
msgid "Invite users by link..."
msgstr "Invitar a usuarios por enlace..."
#. Delete self from chat
#: ../telegram-purple.c:458
msgid "Delete and exit..."
msgstr "Eliminar y salir..."
#: ../telegram-purple.c:546
#, c-format
msgid "Unable to sign on as %s: file (public key) not found."
msgstr ""
"No se pudo iniciar sesión como %s: no se encontró el archivo (clave "
"pública)."
#: ../telegram-purple.c:550
#, c-format
msgid ""
"Make sure telegram-purple is installed properly,\n"
"including the .tglpub file.\n"
"If you're running SELinux (e.g. when using Tails),\n"
"try 'make local_install', or simply copy\n"
"%1$s to %2$s."
msgstr ""
"Asegurarse de que telegram-purple está instalado apropiadamente,\n"
"incluyendo el archivo .tglpub.\n"
"Si esta ejecutando SELinux (por ejemplo, al usar Tails),\n"
"intente probar 'make local_install', o simplemente copie\n"
"%1$s a %2$s."
#: ../telegram-purple.c:572
#, c-format
msgid ""
"Unable to sign on as %s: problem in the underlying library 'tgl'. Please "
"submit a bug report with the debug log."
msgstr ""
"No se pudo iniciar sesión como %s: problema con la biblioteca 'tgl'. Por "
"favor, envíe un informe de error con el registro de depuración."
#: ../telegram-purple.c:576
msgid "Problem in tgl"
msgstr "Problema en tgl"
#. TRANSLATORS: Please fill in your own prefix!
#: ../telegram-purple.c:584
#, c-format
msgid ""
"Unable to sign on as %s: phone number lacks country prefix. Numbers must "
"start with the full international prefix code, e.g. +1 for USA."
msgstr ""
"No se pudo iniciar sesión como %s: al número de teléfono le falta el prefijo"
" del país. Los números deben comenzar con el código de prefijo "
"internacional, por ejemplo: +34 para España."
#: ../telegram-purple.c:589
msgid "Incomplete phone number"
msgstr "Número de teléfono incompleto"
#: ../telegram-purple.c:642
msgid "Secret chat was already deleted"
msgstr "Ya se eliminó la conversación secreta"
#: ../telegram-purple.c:644
msgid "Secret chat is not ready"
msgstr "La conversación secreta no está lista"
#: ../telegram-purple.c:652
msgid "Only the creator of a channel can post messages."
msgstr "Sólo el creador de un canal puede publicar mensajes."
#: ../telegram-purple.c:695
msgid "Cannot invite buddy to chat"
msgstr "No se pudo invitar al contacto a la conversación"
#: ../telegram-purple.c:696
msgid "Specified user does not exist."
msgstr "El usuario especificado no existe."
#: ../telegram-purple.c:709
msgid "phone no. (+ country prefix)"
msgstr "Núm. tlf. (+ prefijo país)"
#. Login
#: ../telegram-purple.c:817
msgid "Password (two factor authentication)"
msgstr "Contraseña (autenticación de dos pasos)"
#: ../telegram-purple.c:822
msgid ""
"Fallback SMS verification\n"
"(Helps when not using Pidgin and you aren't being prompted for the code)"
msgstr ""
"Verificación por mensaje de texto\n"
"(Sirve para cuando no está usando Pidgin y no se le pido el código)"
#: ../telegram-purple.c:828
msgid "always"
msgstr "siempre"
#: ../telegram-purple.c:829
msgid "never"
msgstr "nunca"
#: ../telegram-purple.c:830
msgid "ask"
msgstr "pedir"
#: ../telegram-purple.c:832
msgid "Accept secret chats"
msgstr "Aceptar conversaciones secretas"
#: ../telegram-purple.c:836
msgid "Display buddies offline after (days)"
msgstr "Mostrar contactos desconectados después de (días)"
#: ../telegram-purple.c:840
msgid ""
"Don't fetch history older than (days)\n"
"(0 for unlimited)"
msgstr ""
"No recuperar el historial anterior a (días)\n"
"(introducir '0' para no aplicar límites)"
#. Media
#: ../telegram-purple.c:845
msgid "Autoload media size (kb)"
msgstr "Tamaño del medio de carga automático (kb)"
#. Chats
#: ../telegram-purple.c:850
msgid "Add all group chats to buddy list"
msgstr "Agregar todas las conversaciones grupales a la lista del contacto"
#. Read notifications
#: ../telegram-purple.c:855
msgid "Display notices of receipt"
msgstr "Mostrar acuses de recibo"
#: ../telegram-purple.c:859
msgid "Send notices of receipt when present"
msgstr "Enviar acuses de recibo al estar presente"
#: ../telegram-purple.c:884
msgid "Telegram Protocol Plugin."
msgstr "Plugin de protocolo de Telegram."
#: ../tgp-msg.c:58
#, c-format
msgid "%2$s created chat %1$s."
msgstr "%2$s creó la conversación %1$s."
#: ../tgp-msg.c:61
#, c-format
msgid "%2$s changed title to %1$s."
msgstr "%2$s cambió el título a %1$s."
#: ../tgp-msg.c:64
#, c-format
msgid "%s changed photo."
msgstr "%s cambió la foto."
#: ../tgp-msg.c:67
#, c-format
msgid "%s deleted photo."
msgstr "%s eliminó la foto."
#: ../tgp-msg.c:75
#, c-format
msgid "%1$s added user %2$s by link."
msgstr "%1$s agregó al usuario %2$s mediante un enlace."
#: ../tgp-msg.c:90
#, c-format
msgid "%2$s added user %1$s."
msgstr "%2$s agregó al usuario %1$s."
#: ../tgp-msg.c:114 ../tgp-msg.c:131
#, c-format
msgid "%2$s deleted user %1$s."
msgstr "%2$s eliminó al usuario %1$s."
#: ../tgp-msg.c:138
#, c-format
msgid "%2$s set self destruction timer to %1$d second."
msgid_plural "%2$s set self destruction timer to %1$d seconds."
msgstr[0] "%2$s estableció un temporizador autodestructivo a %1$d segundo."
msgstr[1] "%2$s estableció un temporizador autodestructivo a %1$d segundos."
#: ../tgp-msg.c:144
#, c-format
msgid "%2$s marked %1$d message read."
msgid_plural "%2$s marked %1$d messages read."
msgstr[0] "%2$s marcó %1$d mensaje como leído."
msgstr[1] "%2$s marcó %1$d mensajes como leídos."
#: ../tgp-msg.c:150
#, c-format
msgid "%2$s deleted %1$d message."
msgid_plural "%2$s deleted %1$d messages."
msgstr[0] "%2$s eliminó %1$d mensaje."
msgstr[1] "%2$s eliminó %1$d mensajes."
#: ../tgp-msg.c:156
#, c-format
msgid "%2$s made a screenshot of %1$d message."
msgid_plural "%2$s made a screenshot of %1$d messages."
msgstr[0] "%2$s tomó una captura de pantalla de %1$d mensaje."
msgstr[1] "%2$s tomó una captura de pantalla de %1$d mensajes."
#: ../tgp-msg.c:162
#, c-format
msgid "Channel %1$s created"
msgstr "Canal %1$s creado"
#. FIXME: check if this makes sense
#: ../tgp-msg.c:165 ../tgp-chat.c:124 ../tgp-chat.c:576
msgid "Telegram Channels"
msgstr "Canales de Telegram"
#: ../tgp-msg.c:191
msgid "Sending message failed."
msgstr "Falló el envío de mensajes."
#: ../tgp-msg.c:253
msgid "Sending image failed."
msgstr "Falló el envío de imágenes."
#: ../tgp-msg.c:417
#, c-format
msgid "%s sent a sticker."
msgstr "%s envió un sticker."
#: ../tgp-msg.c:463
msgid "failed loading message"
msgstr "falló la carga del mensaje"
#: ../tgp-msg.c:498
msgid "[animation]"
msgstr "[animación]"
#: ../tgp-msg.c:515
msgid "[audio]"
msgstr "[audio]"
#: ../tgp-msg.c:515
msgid "[video]"
msgstr "[vídeo]"
#: ../tgp-msg.c:604
#, c-format
msgid "<b>Forwarded message from: %s</b><br>%s"
msgstr "<b>Mensaje reenviado de: %s</b><br>%s"
#. FIXME: sometimes users aren't part of the response when receiving a
#. forwarded message
#: ../tgp-msg.c:607
#, c-format
msgid "<b>Forwarded message:</b><br>%s"
msgstr "<b>Mensaje reenviado:</b><br>%s"
#: ../tgp-msg.c:720
msgid "loading document or picture failed"
msgstr "falló la carga del documento o imagen"
#: ../tgp-net.c:281
msgid "Cannot connect to main server"
msgstr "No se puede conectar al servidor principal"
#: ../tgp-net.c:322
msgid "Cannot connect to server: Ping timeout."
msgstr "No se puede conectar al servidor: tiempo de espera agotado."
#: ../tgp-net.c:365
msgid "Lost connection to the server..."
msgstr "Se perdió la conexión con el servidor..."
#: ../tgp-request.c:51
msgid ""
"Telegram wants to verify your identity. Please enter the login code that you"
" have received via SMS."
msgstr ""
"Telegram quiere verificar su identidad. Por favor, introduce el código que "
"recibió en un mensaje de texto."
#: ../tgp-request.c:54
msgid "Login code"
msgstr "Código de inicio de sesión"
#: ../tgp-request.c:54
msgid "Enter login code"
msgstr "Intoducir código de inicio de sesión"
#: ../tgp-request.c:54
msgid "the code"
msgstr "el código"
#: ../tgp-request.c:54 ../tgp-request.c:104 ../tgp-request.c:198
#: ../tgp-request.c:233 ../tgp-request.c:263
msgid "OK"
msgstr "Aceptar"
#: ../tgp-request.c:55 ../tgp-request.c:104 ../tgp-request.c:123
#: ../tgp-request.c:199 ../tgp-request.c:234 ../tgp-request.c:264
msgid "Cancel"
msgstr "Cancelar"
#: ../tgp-request.c:95
msgid "Registration"
msgstr "Registro"
#: ../tgp-request.c:96
msgid "First name"
msgstr "Nombre"
#: ../tgp-request.c:99
msgid "Last name"
msgstr "Apellido"
#: ../tgp-request.c:103
msgid "Register"
msgstr "Registrar"
#: ../tgp-request.c:103
msgid "Please register your phone number."
msgstr "Por favor, registre su número de teléfono."
#. purple_request API not available
#: ../tgp-request.c:108
msgid ""
"Phone number is not registered. Please register your phone on a different "
"client."
msgstr ""
"No se registró el número de teléfono. Por favor, registre su teléfono en un "
"cliente diferente."
#: ../tgp-request.c:110
msgid "Not registered"
msgstr "No registrado"
#: ../tgp-request.c:122
msgid "Password needed"
msgstr "Se necesita la contraseña"
#: ../tgp-request.c:122
msgid "Enter password for two factor authentication"
msgstr "Introducir contraseña para la autenticación de dos pasos"
#: ../tgp-request.c:123
msgid "Ok"
msgstr "Aceptar"
#: ../tgp-request.c:125
msgid ""
"No password set for two factor authentication. Please enter it in the "
"extended settings."
msgstr ""
"No se estableció contraseña para la autenticación de dos pasos. Por favor, "
"introdúcela en la configuración extendida."
#: ../tgp-request.c:127
msgid "Password invalid"
msgstr "Contraseña no válida"
#: ../tgp-request.c:150
#, c-format
msgid "Accept secret chat '%s' on this device?"
msgstr "¿Acepte la conversación secreta '%s' en este dispositivo?"
#: ../tgp-request.c:151
msgid "Secret chat"
msgstr "Conversación secreta"
#: ../tgp-request.c:151
msgid ""
"Secret chats can only have one end point. If you accept a secret chat on "
"this device, its messages will not be available anywhere else. If you "
"decline, you can still accept the chat on other devices."
msgstr ""
"Las conversaciones secretas son uno a uno. Si acepte una conversación "
"secreta en este dispositivo, la misma no estará disponible en ningún otro "
"lado. Si decline, pueda aceptar la conversación en otro dispositivo."
#: ../tgp-request.c:182
msgid ""
"Invite at least one additional user by specifying\n"
" their full name (autocompletion available).\n"
"You can add more users once the chat was created."
msgstr ""
"Invite al menos a un usuario más especificando\n"
"su nombre completo (disponible autocompletado).\n"
"Pueda agregar más usuarios una vez que se cree la conversación."
#: ../tgp-request.c:185 ../tgp-request.c:189 ../tgp-request.c:193
msgid "Username"
msgstr "Nombre de usuario"
#: ../tgp-request.c:198
msgid "Create group chat"
msgstr "Crear conversación grupal"
#: ../tgp-request.c:198
msgid "Invite users"
msgstr "Invitar a los usuarios"
#: ../tgp-request.c:217 ../tgp-request.c:232
msgid "Change password"
msgstr "Cambiar contraseña"
#: ../tgp-request.c:219
msgid "Current"
msgstr "Actual"
#: ../tgp-request.c:223 ../tgp-request.c:253
msgid "Password"
msgstr "Contraseña"
#: ../tgp-request.c:227 ../tgp-request.c:257
msgid "Confirm"
msgstr "Confirmar"
#: ../tgp-request.c:251 ../tgp-request.c:262
msgid "New password"
msgstr "Nueva contraseña"
#. if we arrive here for the second time the specified phone number is not
#. valid. We do not
#. ask for the phone number directly, cause in that case the account would
#. still be created
#. named with the invalid phone number, even though the login will work
#: ../tgp-request.c:300
msgid "Invalid phone number"
msgstr "Número de teléfono no válido"
#: ../tgp-request.c:301
msgid ""
"Please enter only numbers in the international phone number format, a leading + following by the country prefix and the phone number.\n"
"Do not use any other special chars."
msgstr ""
"Por favor, introduce sólo números en el formato de números de teléfono internacional, con el signo '+' seguido del código de país [más prefijo para el acceso a la red celular, si corresponde] y el número de teléfono.\n"
"No use ningún otro carácter."
#: ../tgp-request.c:370
msgid "Leave Chat"
msgstr "Abandonar conversación"
#: ../tgp-request.c:372
msgid "Do you want to leave this chat permantently?"
msgstr "¿Querés abandonar esta conversación permanentemente?"
#: ../tgp-request.c:377
msgid "Abort Secret Chat"
msgstr "Cancelar conversación secreta"
#: ../tgp-request.c:379
msgid "Do you want to terminate this secret chat permantently?"
msgstr ""
"¿Esté seguro que quiere eliminar esta conversación secreta permanentemente?"
#: ../tgp-request.c:384
msgid "Delete Contact"
msgstr "Eliminar contacto"
#: ../tgp-request.c:386
msgid "Do you want to remove this user from your global contact list?"
msgstr "¿Quiere quitar este usuario de su lista global de contactos?"
#: ../tgp-request.c:401
msgid "Leave Channel"
msgstr "Abandonar canal"
#: ../tgp-request.c:403
msgid "Do you want to leave this channel?"
msgstr "¿Quiere abandonar este canal?"
#. This should be the language's timestamp format. This is preceded by a
#. colon.
#: ../tgp-utils.c:27
msgid "%d.%m.%Y %H:%M"
msgstr "%d.%m.%Y - %H:%M"
#. This is preceded by a colon.
#: ../tgp-utils.c:48
msgid "recently"
msgstr "recientemente"
#. This is preceded by a colon.
#: ../tgp-utils.c:52
msgid "last week"
msgstr "la semana pasada"
#. This is preceded by a colon.
#: ../tgp-utils.c:56
msgid "last month"
msgstr "el mes pasado"
#. This is preceded by a colon. It refers to a point on time.
#: ../tgp-utils.c:60
msgid "unknown"
msgstr "desconocido"
#: ../tgp-chat.c:108 ../tgp-chat.c:582
msgid "Telegram Chats"
msgstr "Conversaciones de Telegram"
#: ../tgp-chat.c:113
msgid "You have already left this chat."
msgstr "Ya ha abandonado esta conversación."
#: ../tgp-chat.c:224
msgid "Subject:"
msgstr "Asunto:"
#: ../tgp-chat.c:230
msgid "Invite link:"
msgstr "Enlace de invitación:"
#: ../tgp-chat.c:236
msgid "Chat ID:"
msgstr "Identificación de conversación:"
#: ../tgp-chat.c:342
msgid "Supergroup"
msgstr "Súpergrupo"
#: ../tgp-chat.c:342
msgid "Channel"
msgstr "Canal"
#: ../tgp-chat.c:345
msgid "Group"
msgstr "Grupo"
#: ../tgp-chat.c:367
msgid "Users in chat"
msgstr "Usuarios en la conversación"
#: ../tgp-chat.c:370
msgid "Type"
msgstr "Tipo"

View file

@ -1,88 +1,95 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# KNTRO <tskuhn@gmail.com>, 2015
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-21 14:37+0100\n"
"PO-Revision-Date: 2015-12-18 17:23+0000\n"
"Last-Translator: KNTRO <tskuhn@gmail.com>\n"
"Language-Team: Spanish (Argentina) (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/es_AR/)\n"
"POT-Creation-Date: 2016-08-31 22:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: KNTRO <kntro@msn.com>, 2016\n"
"Language-Team: Spanish (Argentina) (https://www.transifex.com/telegram-purple-developers/teams/53149/es_AR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es_AR\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../telegram-base.c:515
#: ../telegram-base.c:500
msgid "Couldn't create group"
msgstr "No se pudo crear el grupo"
#: ../telegram-base.c:515
#: ../telegram-base.c:501
msgid "Please select at least one other user."
msgstr "Por favor, seleccioná al menos otro usuario."
#: ../telegram-base.c:570
#: ../telegram-base.c:555
msgid "Query Failed"
msgstr "Falló la consulta"
#: ../telegram-purple.c:193
#: ../telegram-purple.c:162
msgid "Secret chat ready."
msgstr "Conversación secreta lista."
#: ../telegram-purple.c:200
#: ../telegram-purple.c:170
msgid "Secret chat terminated."
msgstr "Finalizó la conversación secreta."
#: ../telegram-purple.c:268
#: ../telegram-purple.c:182
msgid "Telegram"
msgstr "Telegram"
#: ../telegram-purple.c:229
msgid "Message marked as read."
msgstr "Mensaje marcado como leído."
#: ../telegram-purple.c:486
#: ../telegram-purple.c:339
#, c-format
msgid "Invite link: %s"
msgstr "Enlace de invitación: %s"
#: ../telegram-purple.c:506 ../telegram-purple.c:507
#. FIXME: Can TGLCHF_MODERATOR export links?
#: ../telegram-purple.c:350
msgid "Creating chat link failed"
msgstr "Falló la creación del enlace de conversación"
#: ../telegram-purple.c:508
#: ../telegram-purple.c:351
msgid "You need to be admin of the group to do that."
msgstr "Necesitás ser administrador del grupo para hacer eso."
#: ../telegram-purple.c:531
#: ../telegram-purple.c:416
msgid "Chat joined"
msgstr "Unido a la conversación"
#: ../telegram-purple.c:532
#: ../telegram-purple.c:417
msgid "Chat added to list of chat rooms."
msgstr "Conversación agregada a la lista de salas de conversaciones."
#: ../telegram-purple.c:552
#: ../telegram-purple.c:443
msgid "Start secret chat..."
msgstr "Iniciar conversación secreta"
msgstr "Iniciar conversación secreta..."
#. Generate Public Link
#: ../telegram-purple.c:558
#: ../telegram-purple.c:450
msgid "Invite users by link..."
msgstr "Invitar a usuarios por enlace"
msgstr "Invitar a usuarios por enlace..."
#. Delete self from chat
#: ../telegram-purple.c:564
#: ../telegram-purple.c:458
msgid "Delete and exit..."
msgstr "Eliminar y salir"
msgstr "Eliminar y salir..."
#: ../telegram-purple.c:632
#: ../telegram-purple.c:546
#, c-format
msgid "Unable to sign on as %s: pubkey not found."
msgstr "No se pudo iniciar sesión como %s: no se encontró la clave pública."
msgid "Unable to sign on as %s: file (public key) not found."
msgstr ""
"No se pudo iniciar sesión como %s: no se encontró el archivo (clave "
"pública)."
#: ../telegram-purple.c:636
#: ../telegram-purple.c:550
#, c-format
msgid ""
"Make sure telegram-purple is installed properly,\n"
@ -90,336 +97,405 @@ msgid ""
"If you're running SELinux (e.g. when using Tails),\n"
"try 'make local_install', or simply copy\n"
"%1$s to %2$s."
msgstr "Asegurate de que telegram-purple está instalado apropiadamente,\nincluyendo el archivo .tglpub.\nSi estás ejecutando SELinux (por ejemplo, al usar Tails),\nintentá probar \"make local:_install\", o simplemente copiá\n%1$s a %2$s."
msgstr ""
"Asegurate de que telegram-purple está instalado apropiadamente,\n"
"incluyendo el archivo .tglpub.\n"
"Si estás ejecutando SELinux (por ejemplo, al usar Tails),\n"
"intentá probar \"make local:_install\", o simplemente copiá\n"
"%1$s a %2$s."
#: ../telegram-purple.c:657
#: ../telegram-purple.c:572
#, c-format
msgid ""
"Unable to sign on as %s: problem in the underlying library 'tgl'. Please "
"submit a bug report with the debug log."
msgstr ""
"No se pudo iniciar sesión como %s: hay un problema con la biblioteca "
"\"tgl\". Por favor, enviá un informe de errores con el registro de "
"depuración."
#: ../telegram-purple.c:576
msgid "Problem in tgl"
msgstr "Problema en tgl"
#. TRANSLATORS: Please fill in your own prefix!
#: ../telegram-purple.c:584
#, c-format
msgid ""
"Unable to sign on as %s: phone number lacks country prefix. Numbers must "
"start with the full international prefix code, e.g. +49 for Germany."
msgstr "No se pudo iniciar sesión como %s: al número de teléfono le falta el prefijo del país. Los números deben comenzar con el código de prefijo internacional, por ejemplo: +54 para Argentina."
"start with the full international prefix code, e.g. +1 for USA."
msgstr ""
"No se pudo iniciar sesión como %s: al número de teléfono le falta el prefijo"
" del país. Los números deben comenzar con el código de prefijo "
"internacional, por ejemplo: +54 para Argentina."
#: ../telegram-purple.c:662
#: ../telegram-purple.c:589
msgid "Incomplete phone number"
msgstr "Número de teléfono incompleto"
#: ../telegram-purple.c:788 ../telegram-purple.c:789
#: ../telegram-purple.c:642
msgid "Secret chat was already deleted"
msgstr "Ya se eliminó la conversación secreta"
#: ../telegram-purple.c:644
msgid "Secret chat is not ready"
msgstr "La conversación secreta no está lista"
#: ../telegram-purple.c:652
msgid "Only the creator of a channel can post messages."
msgstr "Sólo el creador de un canal puede publicar mensajes."
#: ../telegram-purple.c:695
msgid "Cannot invite buddy to chat"
msgstr "No se pudo invitar al contacto a la conversación"
#: ../telegram-purple.c:790
#: ../telegram-purple.c:696
msgid "Specified user does not exist."
msgstr "El usuario especificado no existe."
#: ../telegram-purple.c:709
msgid "phone no. (+ country prefix)"
msgstr "Número de teléfono (+ prefijo de país)"
#. Login
#: ../telegram-purple.c:932
#: ../telegram-purple.c:817
msgid "Password (two factor authentication)"
msgstr "Contraseña (autenticación de 2 pasos)"
#: ../telegram-purple.c:938
#: ../telegram-purple.c:822
msgid ""
"Fallback SMS verification\n"
"(Helps when not using Pidgin and you aren't being prompted for the code)"
msgstr "Verificación por mensaje de texto\n(Sirve para cuando no estás usando Pidgin y no se te pide el código)"
msgstr ""
"Verificación por mensaje de texto\n"
"(Sirve para cuando no estás usando Pidgin y no se te pide el código)"
#: ../telegram-purple.c:946
msgid "ask"
msgstr "pedir"
#: ../telegram-purple.c:947
#: ../telegram-purple.c:828
msgid "always"
msgstr "siempre"
#: ../telegram-purple.c:948
#: ../telegram-purple.c:829
msgid "never"
msgstr "nunca"
#: ../telegram-purple.c:950
#: ../telegram-purple.c:830
msgid "ask"
msgstr "preguntar"
#: ../telegram-purple.c:832
msgid "Accept secret chats"
msgstr "Aceptar conversaciones secretas"
#: ../telegram-purple.c:955
#: ../telegram-purple.c:836
msgid "Display buddies offline after (days)"
msgstr "Mostrar contactos desconectados después de (días)"
#: ../telegram-purple.c:960
msgid "Fetch past history on first login"
msgstr "Recuperar historial en el primer inicio de sesión"
#: ../telegram-purple.c:965
#: ../telegram-purple.c:840
msgid ""
"Don't fetch history older than (days)\n"
"(0 for unlimited)"
msgstr "No recuperar el historial anterior a (días)\n(ingresá \"0\" para no aplicar límites)"
msgstr ""
"No recuperar el historial anterior a (días)\n"
"(ingresá \"0\" para no aplicar límites)"
#. Media
#: ../telegram-purple.c:845
msgid "Autoload media size (kb)"
msgstr "Tamaño de medio de descarga automática (kb)"
#. Chats
#: ../telegram-purple.c:973
#: ../telegram-purple.c:850
msgid "Add all group chats to buddy list"
msgstr "Agregar todas las conversaciones grupales a la lista del contacto"
#. Read notifications
#: ../telegram-purple.c:981
#: ../telegram-purple.c:855
msgid "Display notices of receipt"
msgstr "Mostrar acuses de recibo"
#: ../telegram-purple.c:986
#: ../telegram-purple.c:859
msgid "Send notices of receipt when present"
msgstr "Enviar acuses de recibo al estar presente"
#: ../tgp-2prpl.c:178 ../tgp-request.c:108
msgid "First name"
msgstr "Nombre"
#: ../telegram-purple.c:884
msgid "Telegram Protocol Plugin."
msgstr "Plugin de protocolo de Telegram."
#: ../tgp-2prpl.c:179 ../tgp-request.c:111
msgid "Last name"
msgstr "Apellido"
#: ../tgp-2prpl.c:181
msgid "Name"
msgstr "Apodo"
#: ../tgp-2prpl.c:186 ../tgp-request.c:197 ../tgp-request.c:201
#: ../tgp-request.c:205
msgid "Username"
msgstr "Nombre de usuario"
#: ../tgp-2prpl.c:191
msgid "Last seen"
msgstr "Último inicio de sesión"
#: ../tgp-2prpl.c:196
msgid "Phone"
msgstr "Teléfono"
#: ../tgp-2prpl.c:208
msgid "Waiting for the user to get online..."
msgstr "Esperando a que el usuario se conecte…"
#: ../tgp-2prpl.c:212
msgid "Self destruction timer"
msgstr "Contador autodestructivo"
#: ../tgp-2prpl.c:218
msgid "Timer is not enabled."
msgstr "El temporizador no está habilitado."
#: ../tgp-2prpl.c:225
msgid "Secret key"
msgstr "Clave secreta"
#: ../tgp-msg.c:72
#: ../tgp-msg.c:58
#, c-format
msgid "%2$s created chat %1$s."
msgstr "%2$s creó la conversación %1$s."
#: ../tgp-msg.c:75
#: ../tgp-msg.c:61
#, c-format
msgid "%2$s changed title to %1$s."
msgstr "%2$s cambió el título a %1$s."
#: ../tgp-msg.c:78
#: ../tgp-msg.c:64
#, c-format
msgid "%s changed photo."
msgstr "%s cambió la foto."
#: ../tgp-msg.c:81
#: ../tgp-msg.c:67
#, c-format
msgid "%s deleted photo."
msgstr "%s eliminó la foto."
#: ../tgp-msg.c:89
#: ../tgp-msg.c:75
#, c-format
msgid "%1$s added user %2$s by link."
msgstr "%1$s agregó al usuario %2$s mediante un enlace."
#: ../tgp-msg.c:102
#: ../tgp-msg.c:90
#, c-format
msgid "%2$s added user %1$s."
msgstr "%2$s agregó al usuario %1$s."
#: ../tgp-msg.c:125 ../tgp-msg.c:140
#: ../tgp-msg.c:114 ../tgp-msg.c:131
#, c-format
msgid "%2$s deleted user %1$s."
msgstr "%2$s eliminó al usuario %1$s."
#: ../tgp-msg.c:146
#: ../tgp-msg.c:138
#, c-format
msgid "%2$s set self destruction timer to %1$d second."
msgid_plural "%2$s set self destruction timer to %1$d seconds."
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%2$s estableció un contador autodestructivo a %1$d segundo."
msgstr[1] "%2$s estableció un contador autodestructivo a %1$d segundos."
#: ../tgp-msg.c:152
#: ../tgp-msg.c:144
#, c-format
msgid "%2$s marked %1$d message read."
msgid_plural "%2$s marked %1$d messages read."
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%2$s marcó %1$d mensaje como leído."
msgstr[1] "%2$s marcó %1$d mensajes como leídos."
#: ../tgp-msg.c:158
#: ../tgp-msg.c:150
#, c-format
msgid "%2$s deleted %1$d message."
msgid_plural "%2$s deleted %1$d messages."
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%2$s eliminó %1$d mensaje."
msgstr[1] "%2$s eliminó %1$d mensajes."
#: ../tgp-msg.c:164
#: ../tgp-msg.c:156
#, c-format
msgid "%2$s made a screenshot of %1$d message."
msgid_plural "%2$s made a screenshot of %1$d messages."
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%2$s tomó una captura de pantalla de %1$d mensaje."
msgstr[1] "%2$s tomó una captura de pantalla de %1$d mensajes."
#: ../tgp-msg.c:162
#, c-format
msgid "Channel %1$s created"
msgstr "Canal %1$s creado"
#. FIXME: check if this makes sense
#: ../tgp-msg.c:165 ../tgp-chat.c:124 ../tgp-chat.c:576
msgid "Telegram Channels"
msgstr "Canales de Telegram"
#: ../tgp-msg.c:191
msgid "Sending message failed."
msgstr "Falló el envío de mensajes."
#: ../tgp-msg.c:296
#: ../tgp-msg.c:253
msgid "Sending image failed."
msgstr "Falló el envío de imágenes."
#: ../tgp-msg.c:310
msgid "Sorry, sending documents to encrypted chats not yet supported."
msgstr "Lo sentimos, pero no se soporta el envío de documentos a conversaciones cifradas."
#: ../tgp-msg.c:400
#: ../tgp-msg.c:417
#, c-format
msgid "%s sent a sticker."
msgstr "%s envió un sticker."
#: ../tgp-net.c:286
#: ../tgp-msg.c:463
msgid "failed loading message"
msgstr "falló la carga del mensaje"
#: ../tgp-msg.c:498
msgid "[animation]"
msgstr "[animación]"
#: ../tgp-msg.c:515
msgid "[audio]"
msgstr "[audio]"
#: ../tgp-msg.c:515
msgid "[video]"
msgstr "[video]"
#: ../tgp-msg.c:604
#, c-format
msgid "<b>Forwarded message from: %s</b><br>%s"
msgstr "<b>Mensaje reenviado de: %s</b><br>%s"
#. FIXME: sometimes users aren't part of the response when receiving a
#. forwarded message
#: ../tgp-msg.c:607
#, c-format
msgid "<b>Forwarded message:</b><br>%s"
msgstr "<b>Mensaje reenviado:</b><br>%s"
#: ../tgp-msg.c:720
msgid "loading document or picture failed"
msgstr "falló la carga del documento o imagen"
#: ../tgp-net.c:281
msgid "Cannot connect to main server"
msgstr "No se puede conectar al servidor principal"
#: ../tgp-net.c:342
#: ../tgp-net.c:322
msgid "Cannot connect to server: Ping timeout."
msgstr "No se puede conectar al servidor: tiempo agotado de ping."
msgstr "No se puede conectar al servidor: tiempo de respuesta agotado."
#: ../tgp-net.c:387
#: ../tgp-net.c:365
msgid "Lost connection to the server..."
msgstr "Se perdió la conexión con el servidor…"
msgstr "Se perdió la conexión con el servidor..."
#: ../tgp-request.c:64
#: ../tgp-request.c:51
msgid ""
"Telegram wants to verify your identity. Please enter the login code that you"
" have received via SMS."
msgstr "Telegram quiere verificar tu identidad. Por favor, ingresá el código que recibiste en un mensaje de texto."
msgstr ""
"Telegram quiere verificar tu identidad. Por favor, ingresá el código que "
"recibiste en un mensaje de texto."
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Login code"
msgstr "Código de inicio de sesión"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Enter login code"
msgstr "Ingresar código de inicio de sesión"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "the code"
msgstr "el código"
#: ../tgp-request.c:67 ../tgp-request.c:116 ../tgp-request.c:210
#: ../tgp-request.c:245 ../tgp-request.c:275
#: ../tgp-request.c:54 ../tgp-request.c:104 ../tgp-request.c:198
#: ../tgp-request.c:233 ../tgp-request.c:263
msgid "OK"
msgstr "Aceptar"
#: ../tgp-request.c:68 ../tgp-request.c:116 ../tgp-request.c:135
#: ../tgp-request.c:211 ../tgp-request.c:246 ../tgp-request.c:276
#: ../tgp-request.c:55 ../tgp-request.c:104 ../tgp-request.c:123
#: ../tgp-request.c:199 ../tgp-request.c:234 ../tgp-request.c:264
msgid "Cancel"
msgstr "Cancelar"
#: ../tgp-request.c:107
#: ../tgp-request.c:95
msgid "Registration"
msgstr "Registro"
#: ../tgp-request.c:115
#: ../tgp-request.c:96
msgid "First name"
msgstr "Nombre"
#: ../tgp-request.c:99
msgid "Last name"
msgstr "Apellido"
#: ../tgp-request.c:103
msgid "Register"
msgstr "Registrar"
#: ../tgp-request.c:115
#: ../tgp-request.c:103
msgid "Please register your phone number."
msgstr "Por favor, registrá tu número de teléfono."
#. purple_request API not available
#: ../tgp-request.c:120
#: ../tgp-request.c:108
msgid ""
"Phone number is not registered. Please register your phone on a different "
"client."
msgstr "No se registró el número de teléfono. Por favor, registrá tu teléfono en un cliente diferente."
msgstr ""
"No se registró el número de teléfono. Por favor, registrá tu teléfono en un "
"cliente diferente."
#: ../tgp-request.c:122
#: ../tgp-request.c:110
msgid "Not registered"
msgstr "No registrado"
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Password needed"
msgstr "Se necesita la contraseña"
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Enter password for two factor authentication"
msgstr "Ingresar contraseña para la autenticación de 2 pasos"
#: ../tgp-request.c:135
#: ../tgp-request.c:123
msgid "Ok"
msgstr "Aceptar"
#: ../tgp-request.c:137
#: ../tgp-request.c:125
msgid ""
"No password set for two factor authentication. Please enter it in the "
"extended settings."
msgstr "No se estableció contraseña para la autenticación de 2 pasos. Por favor, ingresala en la configuración extendida."
msgstr ""
"No se estableció contraseña para la autenticación de 2 pasos. Por favor, "
"ingresala en la configuración extendida."
#: ../tgp-request.c:139
#: ../tgp-request.c:127
msgid "Password invalid"
msgstr "Contraseña no válida"
#: ../tgp-request.c:162
#: ../tgp-request.c:150
#, c-format
msgid "Accept secret chat '%s' on this device?"
msgstr "¿Aceptás la conversación secreta \"%s\" en este dispositivo?"
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid "Secret chat"
msgstr "Conversación secreta"
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid ""
"Secret chats can only have one end point. If you accept a secret chat on "
"this device, its messages will not be available anywhere else. If you "
"decline, you can still accept the chat on other devices."
msgstr "Las conversaciones secretas son uno a uno. Si aceptás una conversación secreta en este dispositivo, la misma no estará disponible en ningún otro lado. Si declinás, podés aceptar la conversación en otro dispositivo."
msgstr ""
"Las conversaciones secretas son uno a uno. Si aceptás una conversación "
"secreta en este dispositivo, la misma no estará disponible en ningún otro "
"lado. Si declinás, podés aceptar la conversación en otro dispositivo."
#: ../tgp-request.c:194
#: ../tgp-request.c:182
msgid ""
"Invite at least one additional user by specifying\n"
" their full name (autocompletion available).\n"
"You can add more users once the chat was created."
msgstr "Invitá al menos a un usuario más especificando\nsu nombre completo (disponible autocompletado).\nPodés agregar más usuarios una vez que se cree la conversación."
msgstr ""
"Invitá al menos a un usuario más especificando\n"
"su nombre completo (disponible autocompletado).\n"
"Podés agregar más usuarios una vez que se cree la conversación."
#: ../tgp-request.c:210
#: ../tgp-request.c:185 ../tgp-request.c:189 ../tgp-request.c:193
msgid "Username"
msgstr "Nombre de usuario"
#: ../tgp-request.c:198
msgid "Create group chat"
msgstr "Crear conversación grupal"
#: ../tgp-request.c:210
#: ../tgp-request.c:198
msgid "Invite users"
msgstr "Invitar a usuarios"
#: ../tgp-request.c:229 ../tgp-request.c:244
#: ../tgp-request.c:217 ../tgp-request.c:232
msgid "Change password"
msgstr "Cambiar contraseña"
#: ../tgp-request.c:231
#: ../tgp-request.c:219
msgid "Current"
msgstr "Actual"
#: ../tgp-request.c:235 ../tgp-request.c:265
#: ../tgp-request.c:223 ../tgp-request.c:253
msgid "Password"
msgstr "Contraseña"
#: ../tgp-request.c:239 ../tgp-request.c:269
#: ../tgp-request.c:227 ../tgp-request.c:257
msgid "Confirm"
msgstr "Confirmar"
#: ../tgp-request.c:263 ../tgp-request.c:274
#: ../tgp-request.c:251 ../tgp-request.c:262
msgid "New password"
msgstr "Nueva contraseña"
@ -428,58 +504,113 @@ msgstr "Nueva contraseña"
#. ask for the phone number directly, cause in that case the account would
#. still be created
#. named with the invalid phone number, even though the login will work
#: ../tgp-request.c:312
#: ../tgp-request.c:300
msgid "Invalid phone number"
msgstr "Número de teléfono no válido"
#: ../tgp-request.c:313
#: ../tgp-request.c:301
msgid ""
"Please enter only numbers in the international phone number format, a leading + following by the country prefix and the phone number.\n"
"Do not use any other special chars."
msgstr "Por favor, ingresá sólo números en el formato de números de teléfono internacional, con el signo \"+\" seguido del código de país [más prefijo para el acceso a la red celular, si corresponde] y el número de teléfono.\nNo usés ningún otro caracter."
msgstr ""
"Por favor, ingresá sólo números en el formato de números de teléfono internacional, con el signo \"+\" seguido del código de país [más prefijo para el acceso a la red celular, si corresponde] y el número de teléfono.\n"
"No usés ningún otro caracter."
#: ../tgp-request.c:370
msgid "Leave Chat"
msgstr "Abandonar conversación"
#: ../tgp-request.c:372
msgid "Do you want to leave this chat permantently?"
msgstr "¿Querés abandonar esta conversación permanentemente?"
#: ../tgp-request.c:377
msgid "Abort Secret Chat"
msgstr "Cancelar conversación secreta"
#: ../tgp-request.c:379
msgid "Do you want to terminate this secret chat permantently?"
msgstr ""
"¿Estás seguro que querés eliminar esta conversación secreta permanentemente?"
#: ../tgp-request.c:384
msgid "Delete Contact"
msgstr "Eliminar contacto"
#: ../tgp-request.c:386
msgid "Do you want to remove this user from your global contact list?"
msgstr "¿Querés quitar este usuario de tu lista global de contactos?"
#: ../tgp-request.c:401
msgid "Leave Channel"
msgstr "Abandonar canal"
#: ../tgp-request.c:403
msgid "Do you want to leave this channel?"
msgstr "¿Querés abandonar este canal?"
#. This should be the language's timestamp format. This is preceded by a
#. colon.
#: ../tgp-utils.c:32
#: ../tgp-utils.c:27
msgid "%d.%m.%Y %H:%M"
msgstr "%Y.%m.%d - %H:%M"
#. This is preceded by a colon.
#: ../tgp-utils.c:53
#: ../tgp-utils.c:48
msgid "recently"
msgstr "recientemente"
#. This is preceded by a colon.
#: ../tgp-utils.c:57
#: ../tgp-utils.c:52
msgid "last week"
msgstr "la semana pasada"
#. This is preceded by a colon.
#: ../tgp-utils.c:61
#: ../tgp-utils.c:56
msgid "last month"
msgstr "el mes pasado"
#. This is preceded by a colon. It refers to a point on time.
#: ../tgp-utils.c:65
#: ../tgp-utils.c:60
msgid "unknown"
msgstr "[desconocido]"
#: ../tgp-chat.c:79
#: ../tgp-chat.c:108 ../tgp-chat.c:582
msgid "Telegram Chats"
msgstr "Conversaciones de Telegram"
#: ../tgp-chat.c:113
msgid "You have already left this chat."
msgstr "Ya abandonaste esta conversación."
#: ../tgp-chat.c:127
#: ../tgp-chat.c:224
msgid "Subject:"
msgstr "Asunto:"
#: ../tgp-chat.c:133
#: ../tgp-chat.c:230
msgid "Invite link:"
msgstr "Enlace de invitación:"
#: ../tgp-chat.c:139
#: ../tgp-chat.c:236
msgid "Chat ID:"
msgstr "Identificación de conversación:"
#: ../tgp-chat.c:238
#: ../tgp-chat.c:342
msgid "Supergroup"
msgstr "Súpergrupo"
#: ../tgp-chat.c:342
msgid "Channel"
msgstr "Canal"
#: ../tgp-chat.c:345
msgid "Group"
msgstr "Grupo"
#: ../tgp-chat.c:367
msgid "Users in chat"
msgstr "Usuarios en la conversación"
#: ../tgp-chat.c:370
msgid "Type"
msgstr "Tipo"

542
po/fr.po
View file

@ -1,88 +1,94 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Hugues Morisset <hugues.m@hotmail.fr>, 2015
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-21 14:37+0100\n"
"PO-Revision-Date: 2015-12-19 05:23+0000\n"
"Last-Translator: Hugues Morisset <hugues.m@hotmail.fr>\n"
"Language-Team: French (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/fr/)\n"
"POT-Creation-Date: 2016-08-31 22:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: kekh <tukhnet@gmail.com>, 2016\n"
"Language-Team: French (https://www.transifex.com/telegram-purple-developers/teams/53149/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: ../telegram-base.c:515
#: ../telegram-base.c:500
msgid "Couldn't create group"
msgstr "N'a pas pu créer le groupe"
#: ../telegram-base.c:515
#: ../telegram-base.c:501
msgid "Please select at least one other user."
msgstr "Veuillez sélectionné au moins un autre utilisateur."
msgstr "Veuillez sélectionner au moins un autre utilisateur."
#: ../telegram-base.c:570
#: ../telegram-base.c:555
msgid "Query Failed"
msgstr "Requête échoué"
msgstr "Requête échouée"
#: ../telegram-purple.c:193
#: ../telegram-purple.c:162
msgid "Secret chat ready."
msgstr "Conversation secrète prête."
#: ../telegram-purple.c:200
#: ../telegram-purple.c:170
msgid "Secret chat terminated."
msgstr "Conversation secrète terminé."
msgstr "Conversation secrète terminée."
#: ../telegram-purple.c:268
#: ../telegram-purple.c:182
msgid "Telegram"
msgstr "Telegram"
#: ../telegram-purple.c:229
msgid "Message marked as read."
msgstr "Message marqué comme lu."
#: ../telegram-purple.c:486
#: ../telegram-purple.c:339
#, c-format
msgid "Invite link: %s"
msgstr "Lien d'invitation: %s"
msgstr "Lien d'invitation : %s"
#: ../telegram-purple.c:506 ../telegram-purple.c:507
#. FIXME: Can TGLCHF_MODERATOR export links?
#: ../telegram-purple.c:350
msgid "Creating chat link failed"
msgstr "Création du lien d'invitation échoué"
msgstr "Création du lien d'invitation échouée"
#: ../telegram-purple.c:508
#: ../telegram-purple.c:351
msgid "You need to be admin of the group to do that."
msgstr "Vous devez être administrateur du groupe pour faire cela."
#: ../telegram-purple.c:531
#: ../telegram-purple.c:416
msgid "Chat joined"
msgstr "Conversation jointe."
msgstr "Conversation atteinte."
#: ../telegram-purple.c:532
#: ../telegram-purple.c:417
msgid "Chat added to list of chat rooms."
msgstr "Conversation ajouté dans la liste de conversations."
msgstr "Conversation ajoutée dans la liste des conversations."
#: ../telegram-purple.c:552
#: ../telegram-purple.c:443
msgid "Start secret chat..."
msgstr "Commencé une conversation secrète ..."
msgstr "Commencer une conversation secrète..."
#. Generate Public Link
#: ../telegram-purple.c:558
#: ../telegram-purple.c:450
msgid "Invite users by link..."
msgstr "Invité des utilisateurs avec un lien ..."
msgstr "Inviter des utilisateurs avec un lien..."
#. Delete self from chat
#: ../telegram-purple.c:564
#: ../telegram-purple.c:458
msgid "Delete and exit..."
msgstr "Supprimer et quitter ..."
msgstr "Supprimer et quitter..."
#: ../telegram-purple.c:632
#: ../telegram-purple.c:546
#, c-format
msgid "Unable to sign on as %s: pubkey not found."
msgstr "Impossible de se connecté comme %s: clé publique manquante."
msgid "Unable to sign on as %s: file (public key) not found."
msgstr ""
"Impossible de se connecter comme %s : fichier de clé publique manquant."
#: ../telegram-purple.c:636
#: ../telegram-purple.c:550
#, c-format
msgid ""
"Make sure telegram-purple is installed properly,\n"
@ -90,336 +96,405 @@ msgid ""
"If you're running SELinux (e.g. when using Tails),\n"
"try 'make local_install', or simply copy\n"
"%1$s to %2$s."
msgstr "Soyez sur que telegram-purple est installé proprement,\nparticulièrement le fichier .tglpub.\nSi vous avez SELinux (ex: En utilisant Tails),\nessayer 'make local_install', ou copier simplement\n%1$s dans %2$s."
msgstr ""
"Soyez sûr que telegram-purple est installé proprement,\n"
"particulièrement le fichier .tglpub.\n"
"Si vous avez SELinux (ex: En utilisant Tails),\n"
"essayez 'make local_install', ou copiez simplement\n"
"%1$s dans %2$s."
#: ../telegram-purple.c:657
#: ../telegram-purple.c:572
#, c-format
msgid ""
"Unable to sign on as %s: problem in the underlying library 'tgl'. Please "
"submit a bug report with the debug log."
msgstr ""
"Impossible de s'identifier comme %s : Problème avec la librairie sous-"
"jacente 'tgl'. Veuillez svp soumettre un rapport de bug incluant des "
"informations de débug."
#: ../telegram-purple.c:576
msgid "Problem in tgl"
msgstr "Problème relatif à Tgl"
#. TRANSLATORS: Please fill in your own prefix!
#: ../telegram-purple.c:584
#, c-format
msgid ""
"Unable to sign on as %s: phone number lacks country prefix. Numbers must "
"start with the full international prefix code, e.g. +49 for Germany."
msgstr "Impossible de se connecter avec %s: le préfixe de pays est manquant. Le numéro de téléphone doit commencé avec le numéro de préfixe international, ex: +33 pour la France."
"start with the full international prefix code, e.g. +1 for USA."
msgstr ""
"Impossible de se connecter avec %s : le préfixe de pays est manquant. Le "
"numéro de téléphone doit commencer avec le numéro de préfixe international, "
"ex: +33 pour la France."
#: ../telegram-purple.c:662
#: ../telegram-purple.c:589
msgid "Incomplete phone number"
msgstr "Numéro de téléphone incomplet"
#: ../telegram-purple.c:788 ../telegram-purple.c:789
msgid "Cannot invite buddy to chat"
msgstr "Impossible d'ajouté le contact á la conversation"
#: ../telegram-purple.c:642
msgid "Secret chat was already deleted"
msgstr "Conversation secrète déjà supprimée."
#: ../telegram-purple.c:790
#: ../telegram-purple.c:644
msgid "Secret chat is not ready"
msgstr "Conversation secrète non prête"
#: ../telegram-purple.c:652
msgid "Only the creator of a channel can post messages."
msgstr "Seul le créateur du canal peut publier des messages"
#: ../telegram-purple.c:695
msgid "Cannot invite buddy to chat"
msgstr "Impossible d'ajouter le contact à la conversation"
#: ../telegram-purple.c:696
msgid "Specified user does not exist."
msgstr "L'utilisateur spécifier n'existe pas."
msgstr "L'utilisateur spécifié n'existe pas."
#: ../telegram-purple.c:709
msgid "phone no. (+ country prefix)"
msgstr "n° téléphone (+ préfixe pays)"
#. Login
#: ../telegram-purple.c:932
#: ../telegram-purple.c:817
msgid "Password (two factor authentication)"
msgstr "Mot de passe (authentification á deux facteurs)"
msgstr "Mot de passe (authentification à deux facteurs)"
#: ../telegram-purple.c:938
#: ../telegram-purple.c:822
msgid ""
"Fallback SMS verification\n"
"(Helps when not using Pidgin and you aren't being prompted for the code)"
msgstr "Vérification par SMS\n(Cela aide si vous nutilisé pas Pidgin et que vous n'êtes pas notifier pour le code)"
msgstr ""
"Vérification par SMS\n"
"(Cela aide si vous nutilisez pas Pidgin et que vous n'êtes pas notifié pour le code)"
#: ../telegram-purple.c:946
msgid "ask"
msgstr "demander"
#: ../telegram-purple.c:947
#: ../telegram-purple.c:828
msgid "always"
msgstr "toujours"
#: ../telegram-purple.c:948
#: ../telegram-purple.c:829
msgid "never"
msgstr "jamais"
#: ../telegram-purple.c:950
#: ../telegram-purple.c:830
msgid "ask"
msgstr "demander"
#: ../telegram-purple.c:832
msgid "Accept secret chats"
msgstr "Accepté la conversation secrète"
msgstr "Accepter la conversation secrète"
#: ../telegram-purple.c:955
#: ../telegram-purple.c:836
msgid "Display buddies offline after (days)"
msgstr "Affiché les contact déconnecté après (jours)"
msgstr "Afficher les contacts déconnectés après (jours)"
#: ../telegram-purple.c:960
msgid "Fetch past history on first login"
msgstr "Récupérer l'historique á la première connexion"
#: ../telegram-purple.c:965
#: ../telegram-purple.c:840
msgid ""
"Don't fetch history older than (days)\n"
"(0 for unlimited)"
msgstr "Ne pas récupérer l'historique plus vieux de (jours)\n(0 pour infinie)"
msgstr ""
"Ne pas récupérer l'historique plus vieux que (jours)\n"
"(0 pour infinie)"
#. Media
#: ../telegram-purple.c:845
msgid "Autoload media size (kb)"
msgstr "Taille max. chargement auto. des médias (Kb)"
#. Chats
#: ../telegram-purple.c:973
#: ../telegram-purple.c:850
msgid "Add all group chats to buddy list"
msgstr "Ajouté tous les membre de la conversation dans la liste de contact"
msgstr "Ajouter tous les membres de la conversation dans la liste de contact"
#. Read notifications
#: ../telegram-purple.c:981
#: ../telegram-purple.c:855
msgid "Display notices of receipt"
msgstr "Affiché les notifications de réception"
msgstr "Afficher les notifications de réception"
#: ../telegram-purple.c:986
#: ../telegram-purple.c:859
msgid "Send notices of receipt when present"
msgstr "Envoyé des notification de réception quand vous êtes présent."
msgstr "Envoyer des notifications de réception quand vous êtes présent."
#: ../tgp-2prpl.c:178 ../tgp-request.c:108
msgid "First name"
msgstr "Prénom"
#: ../telegram-purple.c:884
msgid "Telegram Protocol Plugin."
msgstr "Extension Protocole Telegram"
#: ../tgp-2prpl.c:179 ../tgp-request.c:111
msgid "Last name"
msgstr "Nom de famille"
#: ../tgp-2prpl.c:181
msgid "Name"
msgstr "Nom"
#: ../tgp-2prpl.c:186 ../tgp-request.c:197 ../tgp-request.c:201
#: ../tgp-request.c:205
msgid "Username"
msgstr "Nom d'utilisateur"
#: ../tgp-2prpl.c:191
msgid "Last seen"
msgstr "Dernière fois vu"
#: ../tgp-2prpl.c:196
msgid "Phone"
msgstr "Téléphone"
#: ../tgp-2prpl.c:208
msgid "Waiting for the user to get online..."
msgstr "En attente de connexion de l'utilisateur ..."
#: ../tgp-2prpl.c:212
msgid "Self destruction timer"
msgstr "Compte a rebours dauto destruction"
#: ../tgp-2prpl.c:218
msgid "Timer is not enabled."
msgstr "Le minuteur n'est pas activé."
#: ../tgp-2prpl.c:225
msgid "Secret key"
msgstr "Clé secrète"
#: ../tgp-msg.c:72
#: ../tgp-msg.c:58
#, c-format
msgid "%2$s created chat %1$s."
msgstr "%2$s a créer la conversation %1$s."
msgstr "%2$s a créé la conversation %1$s."
#: ../tgp-msg.c:75
#: ../tgp-msg.c:61
#, c-format
msgid "%2$s changed title to %1$s."
msgstr "%2$s a changé le titre pour %1$s."
#: ../tgp-msg.c:78
#: ../tgp-msg.c:64
#, c-format
msgid "%s changed photo."
msgstr "%s á changé ca photo."
msgstr "%s a changé sa photo."
#: ../tgp-msg.c:81
#: ../tgp-msg.c:67
#, c-format
msgid "%s deleted photo."
msgstr "%s a supprimé la photo."
#: ../tgp-msg.c:89
#: ../tgp-msg.c:75
#, c-format
msgid "%1$s added user %2$s by link."
msgstr "%1$s a ajouté l'utilisateur %2$s avec un lien."
#: ../tgp-msg.c:102
#: ../tgp-msg.c:90
#, c-format
msgid "%2$s added user %1$s."
msgstr "%2$s a ajouté l'utilisateur %1$s."
#: ../tgp-msg.c:125 ../tgp-msg.c:140
#: ../tgp-msg.c:114 ../tgp-msg.c:131
#, c-format
msgid "%2$s deleted user %1$s."
msgstr "%2$s a supprimé l'utilisateur %1$s."
#: ../tgp-msg.c:146
#: ../tgp-msg.c:138
#, c-format
msgid "%2$s set self destruction timer to %1$d second."
msgid_plural "%2$s set self destruction timer to %1$d seconds."
msgstr[0] "%2$s a mis le compte a rebours d'auto destruction a %1$d secondes."
msgstr[1] "%2$s a mis le compte a rebours d'auto destruction a %1$d secondes."
msgstr[0] "%2$s a mis le compte a rebours d'auto destruction à %1$d secondes."
msgstr[1] "%2$s a mis le compte à rebours d'auto destruction à %1$d secondes."
#: ../tgp-msg.c:152
#: ../tgp-msg.c:144
#, c-format
msgid "%2$s marked %1$d message read."
msgid_plural "%2$s marked %1$d messages read."
msgstr[0] "%2$s a marqué les messages de %1$d lu."
msgstr[1] "%2$s a marqué les messages de %1$d lu."
msgstr[1] "%2$s a marqué les messages de %1$d lus."
#: ../tgp-msg.c:158
#: ../tgp-msg.c:150
#, c-format
msgid "%2$s deleted %1$d message."
msgid_plural "%2$s deleted %1$d messages."
msgstr[0] "%2$s a supprimé les messages de %1$d."
msgstr[1] "%2$s a supprimé les messages de %1$d."
#: ../tgp-msg.c:164
#: ../tgp-msg.c:156
#, c-format
msgid "%2$s made a screenshot of %1$d message."
msgid_plural "%2$s made a screenshot of %1$d messages."
msgstr[0] "%2$s a pris un copie d'écran des messages de %1$d."
msgstr[1] "%2$s a pris un copie d'écran des messages de %1$d."
msgstr[1] "%2$s a pris une copie d'écran des messages de %1$d."
#: ../tgp-msg.c:162
#, c-format
msgid "Channel %1$s created"
msgstr "Canal %1$s créé"
#. FIXME: check if this makes sense
#: ../tgp-msg.c:165 ../tgp-chat.c:124 ../tgp-chat.c:576
msgid "Telegram Channels"
msgstr "Canaux Telegram"
#: ../tgp-msg.c:191
msgid "Sending message failed."
msgstr "L'envoie du message a échoué."
msgstr "L'envoi du message a échoué."
#: ../tgp-msg.c:296
#: ../tgp-msg.c:253
msgid "Sending image failed."
msgstr "L'envoie de l'image á échoué."
msgstr "L'envoi de l'image a échoué."
#: ../tgp-msg.c:310
msgid "Sorry, sending documents to encrypted chats not yet supported."
msgstr "Envoyé des documents dans un conversation secrète n'est pas encore supporté."
#: ../tgp-msg.c:400
#: ../tgp-msg.c:417
#, c-format
msgid "%s sent a sticker."
msgstr "%s a envoyé un sticker."
#: ../tgp-net.c:286
#: ../tgp-msg.c:463
msgid "failed loading message"
msgstr "échec au chargement du message"
#: ../tgp-msg.c:498
msgid "[animation]"
msgstr "[animation]"
#: ../tgp-msg.c:515
msgid "[audio]"
msgstr "[audio]"
#: ../tgp-msg.c:515
msgid "[video]"
msgstr "[video]"
#: ../tgp-msg.c:604
#, c-format
msgid "<b>Forwarded message from: %s</b><br>%s"
msgstr "<b>Message transféré depuis : %s</b><br>%s"
#. FIXME: sometimes users aren't part of the response when receiving a
#. forwarded message
#: ../tgp-msg.c:607
#, c-format
msgid "<b>Forwarded message:</b><br>%s"
msgstr "<b>Message transféré :</b><br>%s"
#: ../tgp-msg.c:720
msgid "loading document or picture failed"
msgstr "échec au chargement du document ou de l'image"
#: ../tgp-net.c:281
msgid "Cannot connect to main server"
msgstr "Impossible de se connecté au serveur principal"
msgstr "Impossible de se connecter au serveur principal"
#: ../tgp-net.c:342
#: ../tgp-net.c:322
msgid "Cannot connect to server: Ping timeout."
msgstr "Impossible de se connecté avec le serveur: Délai d'attente dépassé."
msgstr "Impossible de se connecter avec le serveur : Délai d'attente dépassé."
#: ../tgp-net.c:387
#: ../tgp-net.c:365
msgid "Lost connection to the server..."
msgstr "Connexion au serveur perdu ..."
msgstr "Connexion au serveur perdue..."
#: ../tgp-request.c:64
#: ../tgp-request.c:51
msgid ""
"Telegram wants to verify your identity. Please enter the login code that you"
" have received via SMS."
msgstr "Telegram veut vérifié votre identité, Entré le code que vous avez reçu par SMS."
msgstr ""
"Telegram veut vérifier votre identité, Entrez le code que vous avez reçu par"
" SMS."
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Login code"
msgstr "Code de connexion"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Enter login code"
msgstr "Entré le code de connexion"
msgstr "Entrez le code de connexion"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "the code"
msgstr "le code"
#: ../tgp-request.c:67 ../tgp-request.c:116 ../tgp-request.c:210
#: ../tgp-request.c:245 ../tgp-request.c:275
#: ../tgp-request.c:54 ../tgp-request.c:104 ../tgp-request.c:198
#: ../tgp-request.c:233 ../tgp-request.c:263
msgid "OK"
msgstr "OK"
#: ../tgp-request.c:68 ../tgp-request.c:116 ../tgp-request.c:135
#: ../tgp-request.c:211 ../tgp-request.c:246 ../tgp-request.c:276
#: ../tgp-request.c:55 ../tgp-request.c:104 ../tgp-request.c:123
#: ../tgp-request.c:199 ../tgp-request.c:234 ../tgp-request.c:264
msgid "Cancel"
msgstr "Annulé"
msgstr "Annuler"
#: ../tgp-request.c:107
#: ../tgp-request.c:95
msgid "Registration"
msgstr "Enregistrement"
#: ../tgp-request.c:115
msgid "Register"
msgstr "Enregistré"
#: ../tgp-request.c:96
msgid "First name"
msgstr "Prénom"
#: ../tgp-request.c:115
#: ../tgp-request.c:99
msgid "Last name"
msgstr "Nom de famille"
#: ../tgp-request.c:103
msgid "Register"
msgstr "Enregistrer"
#: ../tgp-request.c:103
msgid "Please register your phone number."
msgstr "Enregistré votre numéro de téléphone."
msgstr "Enregistrez votre numéro de téléphone."
#. purple_request API not available
#: ../tgp-request.c:120
#: ../tgp-request.c:108
msgid ""
"Phone number is not registered. Please register your phone on a different "
"client."
msgstr "Numéro téléphone non enregistré. Enregistré un numéro de téléphone sur un appareils différent."
msgstr ""
"Numéro de téléphone non enregistré. Enregistrez un numéro de téléphone sur "
"un appareil différent."
#: ../tgp-request.c:122
#: ../tgp-request.c:110
msgid "Not registered"
msgstr "Non enregistré"
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Password needed"
msgstr "Besoin du mot de passe"
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Enter password for two factor authentication"
msgstr "Entré le mot de passe pour l'authentification a deux facteur"
msgstr "Entrez le mot de passe pour l'authentification à deux facteurs"
#: ../tgp-request.c:135
#: ../tgp-request.c:123
msgid "Ok"
msgstr "Ok"
#: ../tgp-request.c:137
#: ../tgp-request.c:125
msgid ""
"No password set for two factor authentication. Please enter it in the "
"extended settings."
msgstr "Pas de mot de passe a deux facteur spécifié. Entré en un dans la configuration étendu."
msgstr ""
"Pas de mot de passe à deux facteurs spécifié. Entrez-en un dans la "
"configuration étendue."
#: ../tgp-request.c:139
#: ../tgp-request.c:127
msgid "Password invalid"
msgstr "Mot de passe invalide"
#: ../tgp-request.c:162
#: ../tgp-request.c:150
#, c-format
msgid "Accept secret chat '%s' on this device?"
msgstr "Accepté la conversation secrète %s sur cette appareil ? "
msgstr "Accepter la conversation secrète %s sur cet appareil ?"
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid "Secret chat"
msgstr "Conversation secrète"
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid ""
"Secret chats can only have one end point. If you accept a secret chat on "
"this device, its messages will not be available anywhere else. If you "
"decline, you can still accept the chat on other devices."
msgstr "Les conversation secrète ne peuvent être vu que sur un seul appareil. Si vous accepté la conversation secrète sur cette appareil, elle ne sera pas disponible ailleurs. Si vous refusé, vous pourrai toujours accepté cette conversation sur un autre appareil."
msgstr ""
"Les conversations secrètes ne peuvent être vues que sur un seul appareil. Si"
" vous acceptez la conversation secrète sur cet appareil, elle ne sera pas "
"disponible ailleurs. Si vous refusez, vous pourrez toujours accepter cette "
"conversation sur un autre appareil."
#: ../tgp-request.c:194
#: ../tgp-request.c:182
msgid ""
"Invite at least one additional user by specifying\n"
" their full name (autocompletion available).\n"
"You can add more users once the chat was created."
msgstr "Invité au moins un autre utilisateur (auto-complétion disponible).\nVous pouvez ajouté plus d'utilisateur une fois la conversation créer."
msgstr ""
"Invitez au moins un autre utilisateur (auto-complétion disponible).\n"
"Vous pouvez ajouter plus d'utilisateurs une fois la conversation créée."
#: ../tgp-request.c:210
#: ../tgp-request.c:185 ../tgp-request.c:189 ../tgp-request.c:193
msgid "Username"
msgstr "Nom d'utilisateur"
#: ../tgp-request.c:198
msgid "Create group chat"
msgstr "Créer un groupe de conversation"
msgstr "Créer une conversation de groupe"
#: ../tgp-request.c:210
#: ../tgp-request.c:198
msgid "Invite users"
msgstr "Invité des utilisateurs"
msgstr "Inviter des utilisateurs"
#: ../tgp-request.c:229 ../tgp-request.c:244
#: ../tgp-request.c:217 ../tgp-request.c:232
msgid "Change password"
msgstr "Changé le mot de passe"
msgstr "Changer le mot de passe"
#: ../tgp-request.c:231
#: ../tgp-request.c:219
msgid "Current"
msgstr "Courent"
msgstr "Courrant"
#: ../tgp-request.c:235 ../tgp-request.c:265
#: ../tgp-request.c:223 ../tgp-request.c:253
msgid "Password"
msgstr "Mot de passe"
#: ../tgp-request.c:239 ../tgp-request.c:269
#: ../tgp-request.c:227 ../tgp-request.c:257
msgid "Confirm"
msgstr "Confirmer"
#: ../tgp-request.c:263 ../tgp-request.c:274
#: ../tgp-request.c:251 ../tgp-request.c:262
msgid "New password"
msgstr "Nouveau mot de passe"
@ -428,58 +503,113 @@ msgstr "Nouveau mot de passe"
#. ask for the phone number directly, cause in that case the account would
#. still be created
#. named with the invalid phone number, even though the login will work
#: ../tgp-request.c:312
#: ../tgp-request.c:300
msgid "Invalid phone number"
msgstr "Numéro de téléphone invalide"
#: ../tgp-request.c:313
#: ../tgp-request.c:301
msgid ""
"Please enter only numbers in the international phone number format, a leading + following by the country prefix and the phone number.\n"
"Do not use any other special chars."
msgstr "Entré seulement des numéro dans le champs pour le numéro international, un + suivi du préfixe de pays et du numéro de téléphone.\nNutilise aucun autre caractère spécial."
msgstr ""
"Entrez seulement des numéros dans le champs pour le numéro international, un + suivi du préfixe de pays et du numéro de téléphone.\n"
"N'utilisez aucun autre caractère spécial."
#: ../tgp-request.c:370
msgid "Leave Chat"
msgstr "Quitter la conversation"
#: ../tgp-request.c:372
msgid "Do you want to leave this chat permantently?"
msgstr "Voulez-vous quitter cette discussion définitivement ?"
#: ../tgp-request.c:377
msgid "Abort Secret Chat"
msgstr "Abandonner la conversation secrète"
#: ../tgp-request.c:379
msgid "Do you want to terminate this secret chat permantently?"
msgstr "Voulez-vous clore cette conversation définitivement ?"
#: ../tgp-request.c:384
msgid "Delete Contact"
msgstr "Supprimer ce contact"
#: ../tgp-request.c:386
msgid "Do you want to remove this user from your global contact list?"
msgstr ""
"Voulez-vous supprimer cet utilisateur de votre liste de contacts globale ?"
#: ../tgp-request.c:401
msgid "Leave Channel"
msgstr "Quitter le canal"
#: ../tgp-request.c:403
msgid "Do you want to leave this channel?"
msgstr "Voulez-vous quitter ce canal ?"
#. This should be the language's timestamp format. This is preceded by a
#. colon.
#: ../tgp-utils.c:32
#: ../tgp-utils.c:27
msgid "%d.%m.%Y %H:%M"
msgstr "%d.%m.%Y %H:%M"
#. This is preceded by a colon.
#: ../tgp-utils.c:53
#: ../tgp-utils.c:48
msgid "recently"
msgstr "récamment"
msgstr "récemment"
#. This is preceded by a colon.
#: ../tgp-utils.c:57
#: ../tgp-utils.c:52
msgid "last week"
msgstr "semaine précédente"
#. This is preceded by a colon.
#: ../tgp-utils.c:61
#: ../tgp-utils.c:56
msgid "last month"
msgstr "mois précédent"
#. This is preceded by a colon. It refers to a point on time.
#: ../tgp-utils.c:65
#: ../tgp-utils.c:60
msgid "unknown"
msgstr "inconnue"
#: ../tgp-chat.c:79
#: ../tgp-chat.c:108 ../tgp-chat.c:582
msgid "Telegram Chats"
msgstr "Conversations de Telegram"
#: ../tgp-chat.c:113
msgid "You have already left this chat."
msgstr "Vous avez déjá quitté cette conversation."
msgstr "Vous avez déjà quitté cette conversation."
#: ../tgp-chat.c:127
#: ../tgp-chat.c:224
msgid "Subject:"
msgstr "Sujet:"
msgstr "Sujet :"
#: ../tgp-chat.c:133
#: ../tgp-chat.c:230
msgid "Invite link:"
msgstr "Lien d'invitation:"
msgstr "Lien d'invitation :"
#: ../tgp-chat.c:139
#: ../tgp-chat.c:236
msgid "Chat ID:"
msgstr "Chat ID:"
msgstr "Chat ID :"
#: ../tgp-chat.c:238
#: ../tgp-chat.c:342
msgid "Supergroup"
msgstr "Supergroup"
#: ../tgp-chat.c:342
msgid "Channel"
msgstr "Canal"
#: ../tgp-chat.c:345
msgid "Group"
msgstr "Groupe"
#: ../tgp-chat.c:367
msgid "Users in chat"
msgstr "Utilisateurs dans la conversation"
#: ../tgp-chat.c:370
msgid "Type"
msgstr "Type"

View file

@ -1,89 +1,93 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Giuseppe Pignataro <rogepix@gmail.com>, 2015
# Ste <plurimoste@openmailbox.org>, 2015
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-21 14:37+0100\n"
"PO-Revision-Date: 2015-12-18 13:05+0000\n"
"Last-Translator: Ben Wiederhake <BenWiederhake.GitHub@gmx.de>\n"
"Language-Team: Italian (Italy) (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/it_IT/)\n"
"POT-Creation-Date: 2016-08-31 22:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Giuseppe Pignataro (Fasbyte01) <rogepix@gmail.com>, 2017\n"
"Language-Team: Italian (Italy) (https://www.transifex.com/telegram-purple-developers/teams/53149/it_IT/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it_IT\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../telegram-base.c:515
#: ../telegram-base.c:500
msgid "Couldn't create group"
msgstr "Impossibile creare un gruppo"
#: ../telegram-base.c:515
#: ../telegram-base.c:501
msgid "Please select at least one other user."
msgstr "Seleziona almeno un altro utente"
#: ../telegram-base.c:570
#: ../telegram-base.c:555
msgid "Query Failed"
msgstr "Richiesta fallita"
#: ../telegram-purple.c:193
#: ../telegram-purple.c:162
msgid "Secret chat ready."
msgstr ""
msgstr "Chat segreta pronta."
#: ../telegram-purple.c:200
#: ../telegram-purple.c:170
msgid "Secret chat terminated."
msgstr "Chat segreta terminata."
#: ../telegram-purple.c:268
#: ../telegram-purple.c:182
msgid "Telegram"
msgstr "Telegram"
#: ../telegram-purple.c:229
msgid "Message marked as read."
msgstr "Messaggio contrassegnato come letto."
#: ../telegram-purple.c:486
#: ../telegram-purple.c:339
#, c-format
msgid "Invite link: %s"
msgstr "Link d'invito: %s"
#: ../telegram-purple.c:506 ../telegram-purple.c:507
#. FIXME: Can TGLCHF_MODERATOR export links?
#: ../telegram-purple.c:350
msgid "Creating chat link failed"
msgstr "Creazione del link della chat fallito"
#: ../telegram-purple.c:508
#: ../telegram-purple.c:351
msgid "You need to be admin of the group to do that."
msgstr ""
msgstr "Devi essere admin del gruppo per eseguire questa operazione."
#: ../telegram-purple.c:531
#: ../telegram-purple.c:416
msgid "Chat joined"
msgstr "Entrato nella chat"
#: ../telegram-purple.c:532
#: ../telegram-purple.c:417
msgid "Chat added to list of chat rooms."
msgstr "Chat aggiunta alla lista delle chat rooms"
#: ../telegram-purple.c:552
#: ../telegram-purple.c:443
msgid "Start secret chat..."
msgstr ""
msgstr "Inizia chat segreta..."
#. Generate Public Link
#: ../telegram-purple.c:558
#: ../telegram-purple.c:450
msgid "Invite users by link..."
msgstr ""
msgstr "Invita utenti tramite link..."
#. Delete self from chat
#: ../telegram-purple.c:564
#: ../telegram-purple.c:458
msgid "Delete and exit..."
msgstr ""
msgstr "Elimina ed esci..."
#: ../telegram-purple.c:632
#: ../telegram-purple.c:546
#, c-format
msgid "Unable to sign on as %s: pubkey not found."
msgstr ""
msgid "Unable to sign on as %s: file (public key) not found."
msgstr "Impossibile accedere come %s: file (chiave pubblica) non trovato."
#: ../telegram-purple.c:636
#: ../telegram-purple.c:550
#, c-format
msgid ""
"Make sure telegram-purple is installed properly,\n"
@ -92,395 +96,518 @@ msgid ""
"try 'make local_install', or simply copy\n"
"%1$s to %2$s."
msgstr ""
"Assicurati che telegram-purple sia installato correttamente,\n"
"includendo il file .tglpub.\n"
"Se hai avviato SELinux (p.e. quando si usa Tails),\n"
"prova 'make local_install', o semplicemente copia\n"
"%1$s a %2$s."
#: ../telegram-purple.c:657
#: ../telegram-purple.c:572
#, c-format
msgid ""
"Unable to sign on as %s: problem in the underlying library 'tgl'. Please "
"submit a bug report with the debug log."
msgstr ""
"Impossibile entrare come %s: problema con la libreria 'tgl'. Invia un bug "
"report con il log di debug."
#: ../telegram-purple.c:576
msgid "Problem in tgl"
msgstr "Problema in tgl"
#. TRANSLATORS: Please fill in your own prefix!
#: ../telegram-purple.c:584
#, c-format
msgid ""
"Unable to sign on as %s: phone number lacks country prefix. Numbers must "
"start with the full international prefix code, e.g. +49 for Germany."
msgstr "Impossibile accedere come %s: il numero telefonico manca del prefisso internazionale.I numeri devono iniziare con il prefisso internazionale completo, e.s. +39 per Italia."
"start with the full international prefix code, e.g. +1 for USA."
msgstr ""
"Impossibile accedere come %s: il numero telefonico manca del prefisso "
"internazionale.I numeri devono iniziare con il prefisso internazionale "
"completo, p.e. +39 per Italia."
#: ../telegram-purple.c:662
#: ../telegram-purple.c:589
msgid "Incomplete phone number"
msgstr "Numero di telefono incompleto"
#: ../telegram-purple.c:788 ../telegram-purple.c:789
#: ../telegram-purple.c:642
msgid "Secret chat was already deleted"
msgstr "La chat segreta è già stata eliminata"
#: ../telegram-purple.c:644
msgid "Secret chat is not ready"
msgstr "La chat segreta non è pronta"
#: ../telegram-purple.c:652
msgid "Only the creator of a channel can post messages."
msgstr "Solo il creatore di un canale può postare messaggi."
#: ../telegram-purple.c:695
msgid "Cannot invite buddy to chat"
msgstr "Impossibile invitare il contatto alla chat."
#: ../telegram-purple.c:790
#: ../telegram-purple.c:696
msgid "Specified user does not exist."
msgstr "L'utente specificato non esiste."
#: ../telegram-purple.c:709
msgid "phone no. (+ country prefix)"
msgstr "num. telefono ( + prefisso internazionale)"
#. Login
#: ../telegram-purple.c:932
#: ../telegram-purple.c:817
msgid "Password (two factor authentication)"
msgstr "Password (autenticazione a due fattori)"
#: ../telegram-purple.c:938
#: ../telegram-purple.c:822
msgid ""
"Fallback SMS verification\n"
"(Helps when not using Pidgin and you aren't being prompted for the code)"
msgstr "Verifica via SMS di scorta.\n(Aiuta quando non si usa Pidgin e non viene richiesto il codice)"
msgstr ""
"Verifica via SMS di scorta.\n"
"(Aiuta quando non si usa Pidgin e non viene richiesto il codice)"
#: ../telegram-purple.c:946
msgid "ask"
msgstr "chiedi"
#: ../telegram-purple.c:947
#: ../telegram-purple.c:828
msgid "always"
msgstr "sempre"
#: ../telegram-purple.c:948
#: ../telegram-purple.c:829
msgid "never"
msgstr "mai"
#: ../telegram-purple.c:950
#: ../telegram-purple.c:830
msgid "ask"
msgstr "chiedi"
#: ../telegram-purple.c:832
msgid "Accept secret chats"
msgstr "Accetta chat segrete"
#: ../telegram-purple.c:955
#: ../telegram-purple.c:836
msgid "Display buddies offline after (days)"
msgstr "Mostra utenti offline dopo (giorni)"
#: ../telegram-purple.c:960
msgid "Fetch past history on first login"
msgstr "Mostra la cronologia passata al primo accesso"
#: ../telegram-purple.c:965
#: ../telegram-purple.c:840
msgid ""
"Don't fetch history older than (days)\n"
"(0 for unlimited)"
msgstr "Non recuperare la cronologia meno recente che (giorni)\n(0 per illimitato)"
msgstr ""
"Non recuperare la cronologia meno recente che (giorni)\n"
"(0 per illimitato)"
#. Media
#: ../telegram-purple.c:845
msgid "Autoload media size (kb)"
msgstr "Grandezza media autocaricato (kb)"
#. Chats
#: ../telegram-purple.c:973
#: ../telegram-purple.c:850
msgid "Add all group chats to buddy list"
msgstr "Aggiungi tutte le chat di gruppo alla lista contatti"
#. Read notifications
#: ../telegram-purple.c:981
#: ../telegram-purple.c:855
msgid "Display notices of receipt"
msgstr "Mostra notifiche di ricezione"
#: ../telegram-purple.c:986
#: ../telegram-purple.c:859
msgid "Send notices of receipt when present"
msgstr "Invia notifiche di ricezione quando presente"
#: ../tgp-2prpl.c:178 ../tgp-request.c:108
msgid "First name"
msgstr "Nome"
#: ../telegram-purple.c:884
msgid "Telegram Protocol Plugin."
msgstr "Plugin di protocollo Telegram"
#: ../tgp-2prpl.c:179 ../tgp-request.c:111
msgid "Last name"
msgstr "Cognome"
#: ../tgp-2prpl.c:181
msgid "Name"
msgstr "Nome"
#: ../tgp-2prpl.c:186 ../tgp-request.c:197 ../tgp-request.c:201
#: ../tgp-request.c:205
msgid "Username"
msgstr "Nome utente"
#: ../tgp-2prpl.c:191
msgid "Last seen"
msgstr "Visto l'ultima volta"
#: ../tgp-2prpl.c:196
msgid "Phone"
msgstr "Telefono"
#: ../tgp-2prpl.c:208
msgid "Waiting for the user to get online..."
msgstr ""
#: ../tgp-2prpl.c:212
msgid "Self destruction timer"
msgstr "Timer di autodistruzione"
#: ../tgp-2prpl.c:218
msgid "Timer is not enabled."
msgstr "Timer non attivato."
#: ../tgp-2prpl.c:225
msgid "Secret key"
msgstr "Chiave segreta"
#: ../tgp-msg.c:72
#: ../tgp-msg.c:58
#, c-format
msgid "%2$s created chat %1$s."
msgstr "%2$s ha creato la chat %1$s."
#: ../tgp-msg.c:75
#: ../tgp-msg.c:61
#, c-format
msgid "%2$s changed title to %1$s."
msgstr "%2$s ha cambiato titolo a %1$s."
#: ../tgp-msg.c:78
#: ../tgp-msg.c:64
#, c-format
msgid "%s changed photo."
msgstr "%s ha cambiato la foto."
#: ../tgp-msg.c:81
#: ../tgp-msg.c:67
#, c-format
msgid "%s deleted photo."
msgstr "%s ha cancellato la foto."
#: ../tgp-msg.c:89
#: ../tgp-msg.c:75
#, c-format
msgid "%1$s added user %2$s by link."
msgstr "%1$s ha aggiunto l'utente %2$s tramite link."
#: ../tgp-msg.c:102
#: ../tgp-msg.c:90
#, c-format
msgid "%2$s added user %1$s."
msgstr "%2$s ha aggiunto l'utente %1$s."
#: ../tgp-msg.c:125 ../tgp-msg.c:140
#: ../tgp-msg.c:114 ../tgp-msg.c:131
#, c-format
msgid "%2$s deleted user %1$s."
msgstr "%2$s ha eliminato l'utente %1$s."
#: ../tgp-msg.c:146
#: ../tgp-msg.c:138
#, c-format
msgid "%2$s set self destruction timer to %1$d second."
msgid_plural "%2$s set self destruction timer to %1$d seconds."
msgstr[0] "%2$s ha impostato il timer di autodistruzione a %1$d secondi."
msgstr[1] "%2$s ha impostato il timer di autodistruzione a %1$d secondi."
#: ../tgp-msg.c:152
#: ../tgp-msg.c:144
#, c-format
msgid "%2$s marked %1$d message read."
msgid_plural "%2$s marked %1$d messages read."
msgstr[0] "%2$s ha contrassegnato come letti i messaggi %1$d "
msgstr[1] "%2$s ha contrassegnato come letti i messaggi %1$d "
#: ../tgp-msg.c:158
#: ../tgp-msg.c:150
#, c-format
msgid "%2$s deleted %1$d message."
msgid_plural "%2$s deleted %1$d messages."
msgstr[0] "%2$s ha cancellato %1$d messaggi."
msgstr[1] "%2$s ha cancellato %1$d messaggi."
#: ../tgp-msg.c:164
#: ../tgp-msg.c:156
#, c-format
msgid "%2$s made a screenshot of %1$d message."
msgid_plural "%2$s made a screenshot of %1$d messages."
msgstr[0] "%2$s ha creato una immagine dello schermo dei messaggi %1$d."
msgstr[1] "%2$s ha creato una immagine dello schermo dei messaggi %1$d."
#: ../tgp-msg.c:162
#, c-format
msgid "Channel %1$s created"
msgstr "Canale %1$s creato"
#. FIXME: check if this makes sense
#: ../tgp-msg.c:165 ../tgp-chat.c:124 ../tgp-chat.c:576
msgid "Telegram Channels"
msgstr "Canali Telegram"
#: ../tgp-msg.c:191
msgid "Sending message failed."
msgstr "Invio immagine fallito."
#: ../tgp-msg.c:296
#: ../tgp-msg.c:253
msgid "Sending image failed."
msgstr "Invio immagine fallito."
#: ../tgp-msg.c:310
msgid "Sorry, sending documents to encrypted chats not yet supported."
msgstr "Spiacente, l'invio di documenti nelle chat criptate non ancora supportato."
#: ../tgp-msg.c:400
#: ../tgp-msg.c:417
#, c-format
msgid "%s sent a sticker."
msgstr "%s ha inviato uno sticker."
#: ../tgp-net.c:286
#: ../tgp-msg.c:463
msgid "failed loading message"
msgstr "caricamento del messaggio fallito"
#: ../tgp-msg.c:498
msgid "[animation]"
msgstr "[animazione]"
#: ../tgp-msg.c:515
msgid "[audio]"
msgstr "[audio]"
#: ../tgp-msg.c:515
msgid "[video]"
msgstr "[video]"
#: ../tgp-msg.c:604
#, c-format
msgid "<b>Forwarded message from: %s</b><br>%s"
msgstr "<b>Messaggio inoltrato da: %s</b><br>%s"
#. FIXME: sometimes users aren't part of the response when receiving a
#. forwarded message
#: ../tgp-msg.c:607
#, c-format
msgid "<b>Forwarded message:</b><br>%s"
msgstr "<b>Messaggio inoltrato:</b><br>%s"
#: ../tgp-msg.c:720
msgid "loading document or picture failed"
msgstr "caricamento del documento o della foto fallito"
#: ../tgp-net.c:281
msgid "Cannot connect to main server"
msgstr "Impossibile connettersi col server"
#: ../tgp-net.c:342
#: ../tgp-net.c:322
msgid "Cannot connect to server: Ping timeout."
msgstr "Impossibile connettersi col server: Ping timeout."
msgstr "Impossibile connettersi al server: Ping timeout."
#: ../tgp-net.c:387
#: ../tgp-net.c:365
msgid "Lost connection to the server..."
msgstr ""
msgstr "Connessione al server fallita..."
#: ../tgp-request.c:64
#: ../tgp-request.c:51
msgid ""
"Telegram wants to verify your identity. Please enter the login code that you"
" have received via SMS."
msgstr "Telegram vuole verificare la tua identità, Prego inserisci il codice ricevuto via SMS."
msgstr ""
"Telegram vuole verificare la tua identità, Prego inserisci il codice "
"ricevuto via SMS."
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Login code"
msgstr "Codice di accesso (login)"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Enter login code"
msgstr "Inserire codice d'accesso (login)"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "the code"
msgstr "il codice"
#: ../tgp-request.c:67 ../tgp-request.c:116 ../tgp-request.c:210
#: ../tgp-request.c:245 ../tgp-request.c:275
#: ../tgp-request.c:54 ../tgp-request.c:104 ../tgp-request.c:198
#: ../tgp-request.c:233 ../tgp-request.c:263
msgid "OK"
msgstr "OK"
#: ../tgp-request.c:68 ../tgp-request.c:116 ../tgp-request.c:135
#: ../tgp-request.c:211 ../tgp-request.c:246 ../tgp-request.c:276
#: ../tgp-request.c:55 ../tgp-request.c:104 ../tgp-request.c:123
#: ../tgp-request.c:199 ../tgp-request.c:234 ../tgp-request.c:264
msgid "Cancel"
msgstr "Annulla"
#: ../tgp-request.c:107
#: ../tgp-request.c:95
msgid "Registration"
msgstr "Registrazione"
#: ../tgp-request.c:115
#: ../tgp-request.c:96
msgid "First name"
msgstr "Nome"
#: ../tgp-request.c:99
msgid "Last name"
msgstr "Cognome"
#: ../tgp-request.c:103
msgid "Register"
msgstr "Registrati"
#: ../tgp-request.c:115
#: ../tgp-request.c:103
msgid "Please register your phone number."
msgstr "Per favore registra il tuo numero di telefono."
#. purple_request API not available
#: ../tgp-request.c:120
#: ../tgp-request.c:108
msgid ""
"Phone number is not registered. Please register your phone on a different "
"client."
msgstr "Numero telefonico non registrato. Per favore registra il tuo numero telefonico con un client differente."
msgstr ""
"Numero telefonico non registrato. Per favore registra il tuo numero "
"telefonico con un client differente."
#: ../tgp-request.c:122
#: ../tgp-request.c:110
msgid "Not registered"
msgstr "Non registrato"
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Password needed"
msgstr ""
msgstr "Password necessaria"
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Enter password for two factor authentication"
msgstr "Inserire password per autenticazione a due fattori"
#: ../tgp-request.c:135
#: ../tgp-request.c:123
msgid "Ok"
msgstr ""
msgstr "Ok"
#: ../tgp-request.c:137
#: ../tgp-request.c:125
msgid ""
"No password set for two factor authentication. Please enter it in the "
"extended settings."
msgstr "Nessuna password impostata per l'autenticazione a due fattori.Prego impostarla nelle impostazioni estese"
msgstr ""
"Nessuna password impostata per l'autenticazione a due fattori.Prego "
"impostarla nelle impostazioni estese"
#: ../tgp-request.c:139
#: ../tgp-request.c:127
msgid "Password invalid"
msgstr "Password non valida"
#: ../tgp-request.c:162
#: ../tgp-request.c:150
#, c-format
msgid "Accept secret chat '%s' on this device?"
msgstr "Accetti la Chat Segreta '%s'?"
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid "Secret chat"
msgstr "Chat Segreta"
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid ""
"Secret chats can only have one end point. If you accept a secret chat on "
"this device, its messages will not be available anywhere else. If you "
"decline, you can still accept the chat on other devices."
msgstr "Le Chat Segrete possono avere un solo punto terminale. Se accetti la chat segreta su questo dispositivo, i messaggi dentro di essa non saranno disponibili da nessun altra parte. Se declini, potrai accettare la chat su altri dispositivi."
msgstr ""
"Le Chat Segrete possono avere un solo punto terminale. Se accetti la chat "
"segreta su questo dispositivo, i messaggi dentro di essa non saranno "
"disponibili da nessun altra parte. Se declini, potrai accettare la chat su "
"altri dispositivi."
#: ../tgp-request.c:194
#: ../tgp-request.c:182
msgid ""
"Invite at least one additional user by specifying\n"
" their full name (autocompletion available).\n"
"You can add more users once the chat was created."
msgstr ""
"Invita almeno un altro utente specificando\n"
" il suo nome completo (autocompletamento disponibile).\n"
"Puoi aggiungere più utenti una volta che la chat è stata creata."
#: ../tgp-request.c:210
#: ../tgp-request.c:185 ../tgp-request.c:189 ../tgp-request.c:193
msgid "Username"
msgstr "Nome utente"
#: ../tgp-request.c:198
msgid "Create group chat"
msgstr "Crea chat di gruppo"
#: ../tgp-request.c:210
#: ../tgp-request.c:198
msgid "Invite users"
msgstr "Invita utenti"
#: ../tgp-request.c:229 ../tgp-request.c:244
#: ../tgp-request.c:217 ../tgp-request.c:232
msgid "Change password"
msgstr ""
msgstr "Cambia password"
#: ../tgp-request.c:231
#: ../tgp-request.c:219
msgid "Current"
msgstr ""
msgstr "Corrente"
#: ../tgp-request.c:235 ../tgp-request.c:265
#: ../tgp-request.c:223 ../tgp-request.c:253
msgid "Password"
msgstr "Password"
#: ../tgp-request.c:239 ../tgp-request.c:269
#: ../tgp-request.c:227 ../tgp-request.c:257
msgid "Confirm"
msgstr ""
msgstr "Conferma"
#: ../tgp-request.c:263 ../tgp-request.c:274
#: ../tgp-request.c:251 ../tgp-request.c:262
msgid "New password"
msgstr ""
msgstr "Nuova password"
#. if we arrive here for the second time the specified phone number is not
#. valid. We do not
#. ask for the phone number directly, cause in that case the account would
#. still be created
#. named with the invalid phone number, even though the login will work
#: ../tgp-request.c:312
#: ../tgp-request.c:300
msgid "Invalid phone number"
msgstr "Numero di telefono non valido"
#: ../tgp-request.c:313
#: ../tgp-request.c:301
msgid ""
"Please enter only numbers in the international phone number format, a leading + following by the country prefix and the phone number.\n"
"Do not use any other special chars."
msgstr ""
"Inserire solo numeri nel formato telefonico internazionale, un + iniziale, seguito dal prefisso internazionale e al numero telefonico completo. \n"
"Non usare altri caratteri speciali."
#: ../tgp-request.c:370
msgid "Leave Chat"
msgstr "Lascia chat"
#: ../tgp-request.c:372
msgid "Do you want to leave this chat permantently?"
msgstr "Vuoi lasciare questa chat in modo permanente?"
#: ../tgp-request.c:377
msgid "Abort Secret Chat"
msgstr "Annulla Chat Segreta"
#: ../tgp-request.c:379
msgid "Do you want to terminate this secret chat permantently?"
msgstr "Vuoi terminare questa chat segreta in modo permanente?"
#: ../tgp-request.c:384
msgid "Delete Contact"
msgstr "Elimina contatto"
#: ../tgp-request.c:386
msgid "Do you want to remove this user from your global contact list?"
msgstr "Vuoi rimuovere questo utente dal tuo elenco dei contatti globale?"
#: ../tgp-request.c:401
msgid "Leave Channel"
msgstr "Lascia il canale"
#: ../tgp-request.c:403
msgid "Do you want to leave this channel?"
msgstr "Vuoi lasciare questo canale?"
#. This should be the language's timestamp format. This is preceded by a
#. colon.
#: ../tgp-utils.c:32
#: ../tgp-utils.c:27
msgid "%d.%m.%Y %H:%M"
msgstr "%d.%m.%Y %H:%M"
#. This is preceded by a colon.
#: ../tgp-utils.c:53
#: ../tgp-utils.c:48
msgid "recently"
msgstr "recentemente"
#. This is preceded by a colon.
#: ../tgp-utils.c:57
#: ../tgp-utils.c:52
msgid "last week"
msgstr "ultima settimana"
#. This is preceded by a colon.
#: ../tgp-utils.c:61
#: ../tgp-utils.c:56
msgid "last month"
msgstr "ultimo mese"
#. This is preceded by a colon. It refers to a point on time.
#: ../tgp-utils.c:65
#: ../tgp-utils.c:60
msgid "unknown"
msgstr "sconosciuto"
#: ../tgp-chat.c:79
#: ../tgp-chat.c:108 ../tgp-chat.c:582
msgid "Telegram Chats"
msgstr "Chat di Telegram"
#: ../tgp-chat.c:113
msgid "You have already left this chat."
msgstr "Hai già lasciato questa chat."
#: ../tgp-chat.c:127
#: ../tgp-chat.c:224
msgid "Subject:"
msgstr "Oggetto:"
#: ../tgp-chat.c:133
#: ../tgp-chat.c:230
msgid "Invite link:"
msgstr "Link d'invito:"
#: ../tgp-chat.c:139
#: ../tgp-chat.c:236
msgid "Chat ID:"
msgstr "ID chat:"
#: ../tgp-chat.c:238
#: ../tgp-chat.c:342
msgid "Supergroup"
msgstr "Supergruppo"
#: ../tgp-chat.c:342
msgid "Channel"
msgstr "Canale"
#: ../tgp-chat.c:345
msgid "Group"
msgstr "Gruppo"
#: ../tgp-chat.c:367
msgid "Users in chat"
msgstr "Utenti in chat."
#: ../tgp-chat.c:370
msgid "Type"
msgstr "Tipo"

613
po/nl.po Normal file
View file

@ -0,0 +1,613 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-31 22:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: justin [notsupplied] <inactive+justin50@transifex.com>, 2016\n"
"Language-Team: Dutch (https://www.transifex.com/telegram-purple-developers/teams/53149/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../telegram-base.c:500
msgid "Couldn't create group"
msgstr "Kon groep niet aanmaken"
#: ../telegram-base.c:501
msgid "Please select at least one other user."
msgstr "Selecteer minimaal één andere gebruiker."
#: ../telegram-base.c:555
msgid "Query Failed"
msgstr "Zoekopdracht mislukt"
#: ../telegram-purple.c:162
msgid "Secret chat ready."
msgstr "Geheime chat gereed."
#: ../telegram-purple.c:170
msgid "Secret chat terminated."
msgstr "Geheime chat beëindigd."
#: ../telegram-purple.c:182
msgid "Telegram"
msgstr "Telegram"
#: ../telegram-purple.c:229
msgid "Message marked as read."
msgstr "Bericht gemarkeerd als gelezen."
#: ../telegram-purple.c:339
#, c-format
msgid "Invite link: %s"
msgstr "Uitnodigingkoppeling: %s"
#. FIXME: Can TGLCHF_MODERATOR export links?
#: ../telegram-purple.c:350
msgid "Creating chat link failed"
msgstr "Chatkoppeling aanmaken mislukt"
#: ../telegram-purple.c:351
msgid "You need to be admin of the group to do that."
msgstr "U moet administrator van de groep zijn om dat te kunnen doen."
#: ../telegram-purple.c:416
msgid "Chat joined"
msgstr "Bij chat binnengekomen"
#: ../telegram-purple.c:417
msgid "Chat added to list of chat rooms."
msgstr "Chat toegevoegd aan de chatruimtelijst."
#: ../telegram-purple.c:443
msgid "Start secret chat..."
msgstr "Geheime chat starten..."
#. Generate Public Link
#: ../telegram-purple.c:450
msgid "Invite users by link..."
msgstr "Gebruikers met koppeling uitnodigen..."
#. Delete self from chat
#: ../telegram-purple.c:458
msgid "Delete and exit..."
msgstr "Verwijderen en afsluiten..."
#: ../telegram-purple.c:546
#, c-format
msgid "Unable to sign on as %s: file (public key) not found."
msgstr "Kan niet aanmelden als %s: (publieke sleutel) niet gevonden."
#: ../telegram-purple.c:550
#, c-format
msgid ""
"Make sure telegram-purple is installed properly,\n"
"including the .tglpub file.\n"
"If you're running SELinux (e.g. when using Tails),\n"
"try 'make local_install', or simply copy\n"
"%1$s to %2$s."
msgstr ""
"Zorg ervoor dat telegram-purple juist is \n"
"geïnstalleerd, alsmede het .tglpub-bestand.\n"
"Als u SELinux uitvoert (bijv. bij gebruik van Tails),\n"
"probeer make local_install, of kopieer simpelweg\n"
"%1$s naar %2$s."
#: ../telegram-purple.c:572
#, c-format
msgid ""
"Unable to sign on as %s: problem in the underlying library 'tgl'. Please "
"submit a bug report with the debug log."
msgstr ""
"Kon niet aanmelden als %s: probleem in de onderliggende bibliotheek tgl. "
"Verstuur alstublieft een foutenrapport met het debuglogboek."
#: ../telegram-purple.c:576
msgid "Problem in tgl"
msgstr "Probleem in tgl"
#. TRANSLATORS: Please fill in your own prefix!
#: ../telegram-purple.c:584
#, c-format
msgid ""
"Unable to sign on as %s: phone number lacks country prefix. Numbers must "
"start with the full international prefix code, e.g. +1 for USA."
msgstr ""
"Kon niet aanmelden als %s: landnummer ontbreekt in telefoonnummer. Nummers "
"moeten starten met het volledige internationale landnummer, bijvoorbeeld +31"
" voor Nederland."
#: ../telegram-purple.c:589
msgid "Incomplete phone number"
msgstr "Onvolledig telefoonnummer"
#: ../telegram-purple.c:642
msgid "Secret chat was already deleted"
msgstr "Geheime chat was al verwijderd"
#: ../telegram-purple.c:644
msgid "Secret chat is not ready"
msgstr "Geheime chat is niet gereed"
#: ../telegram-purple.c:652
msgid "Only the creator of a channel can post messages."
msgstr "Alleen de maker van een kanaal kan berichten plaatsen."
#: ../telegram-purple.c:695
msgid "Cannot invite buddy to chat"
msgstr "Kan vriend niet uitnodigen om te chatten"
#: ../telegram-purple.c:696
msgid "Specified user does not exist."
msgstr "Opgegeven gebruiker bestaat niet."
#: ../telegram-purple.c:709
msgid "phone no. (+ country prefix)"
msgstr "telefoonnummer (+ landnummer)"
#. Login
#: ../telegram-purple.c:817
msgid "Password (two factor authentication)"
msgstr "Wachtwoord (authentificatie in twee stappen)"
#: ../telegram-purple.c:822
msgid ""
"Fallback SMS verification\n"
"(Helps when not using Pidgin and you aren't being prompted for the code)"
msgstr ""
"SMS-verificatie om op terug te vallen\n"
"(Helpt wanneer u Pidgin niet gebruikt en niet wordt gevraagd om de code)"
#: ../telegram-purple.c:828
msgid "always"
msgstr "altijd"
#: ../telegram-purple.c:829
msgid "never"
msgstr "nooit"
#: ../telegram-purple.c:830
msgid "ask"
msgstr "vragen"
#: ../telegram-purple.c:832
msgid "Accept secret chats"
msgstr "Geheime chats accepteren"
#: ../telegram-purple.c:836
msgid "Display buddies offline after (days)"
msgstr "Vrienden offline weergeven na (dagen)"
#: ../telegram-purple.c:840
msgid ""
"Don't fetch history older than (days)\n"
"(0 for unlimited)"
msgstr ""
"Geschiedenis niet ophalen voor ouder\n"
"dan (dagen) (0 voor oneindig)"
#. Media
#: ../telegram-purple.c:845
msgid "Autoload media size (kb)"
msgstr "Mediagrootte automatisch laden (kb)"
#. Chats
#: ../telegram-purple.c:850
msgid "Add all group chats to buddy list"
msgstr "Alle groepschats aan de vriendenlijst toevoegen"
#. Read notifications
#: ../telegram-purple.c:855
msgid "Display notices of receipt"
msgstr "Ontvangstmeldingen tonen"
#: ../telegram-purple.c:859
msgid "Send notices of receipt when present"
msgstr "Ontvangstmeldingen versturen indien aanwezig"
#: ../telegram-purple.c:884
msgid "Telegram Protocol Plugin."
msgstr "Telegram-protocol-plug-in."
#: ../tgp-msg.c:58
#, c-format
msgid "%2$s created chat %1$s."
msgstr "%2$s heeft geheime chat %1$s aangemaakt."
#: ../tgp-msg.c:61
#, c-format
msgid "%2$s changed title to %1$s."
msgstr "%2$s heeft titel naar %1$s gewijzigd."
#: ../tgp-msg.c:64
#, c-format
msgid "%s changed photo."
msgstr "%s heeft foto gewijzigd."
#: ../tgp-msg.c:67
#, c-format
msgid "%s deleted photo."
msgstr "%s heeft foto verwijderd."
#: ../tgp-msg.c:75
#, c-format
msgid "%1$s added user %2$s by link."
msgstr "%1$s heeft gebruiker %2$s toegevoegd met koppeling."
#: ../tgp-msg.c:90
#, c-format
msgid "%2$s added user %1$s."
msgstr "%2$s heeft gebruiker %1$s toegevoegd."
#: ../tgp-msg.c:114 ../tgp-msg.c:131
#, c-format
msgid "%2$s deleted user %1$s."
msgstr "%2$s heeft gebruiker %1$s verwijderd."
#: ../tgp-msg.c:138
#, c-format
msgid "%2$s set self destruction timer to %1$d second."
msgid_plural "%2$s set self destruction timer to %1$d seconds."
msgstr[0] "%2$s heeft zelfvernietigingstimer ingesteld op %1$d seconde."
msgstr[1] "%2$s heeft zelfvernietigingstimer ingesteld op %1$d seconden."
#: ../tgp-msg.c:144
#, c-format
msgid "%2$s marked %1$d message read."
msgid_plural "%2$s marked %1$d messages read."
msgstr[0] "%2$s heeft %1$d bericht als gelezen gemarkeerd."
msgstr[1] "%2$s heeft %1$d berichten als gelezen gemarkeerd."
#: ../tgp-msg.c:150
#, c-format
msgid "%2$s deleted %1$d message."
msgid_plural "%2$s deleted %1$d messages."
msgstr[0] "%2$s heeft %1$d bericht verwijderd."
msgstr[1] "%2$s heeft %1$d berichten verwijderd."
#: ../tgp-msg.c:156
#, c-format
msgid "%2$s made a screenshot of %1$d message."
msgid_plural "%2$s made a screenshot of %1$d messages."
msgstr[0] "%2$s heeft een schermafdruk gemaakt van %1$d bericht."
msgstr[1] "%2$s heeft een schermafdruk gemaakt van %1$d berichten."
#: ../tgp-msg.c:162
#, c-format
msgid "Channel %1$s created"
msgstr "Kanaal %1$s aangemaakt"
#. FIXME: check if this makes sense
#: ../tgp-msg.c:165 ../tgp-chat.c:124 ../tgp-chat.c:576
msgid "Telegram Channels"
msgstr "Telegram-kanalen"
#: ../tgp-msg.c:191
msgid "Sending message failed."
msgstr "Bericht versturen mislukt."
#: ../tgp-msg.c:253
msgid "Sending image failed."
msgstr "Afbeelding versturen mislukt."
#: ../tgp-msg.c:417
#, c-format
msgid "%s sent a sticker."
msgstr "%s heeft een sticker verzonden."
#: ../tgp-msg.c:463
msgid "failed loading message"
msgstr "bericht laden mislukt"
#: ../tgp-msg.c:498
msgid "[animation]"
msgstr "[animatie]"
#: ../tgp-msg.c:515
msgid "[audio]"
msgstr "[audio]"
#: ../tgp-msg.c:515
msgid "[video]"
msgstr "[video]"
#: ../tgp-msg.c:604
#, c-format
msgid "<b>Forwarded message from: %s</b><br>%s"
msgstr "<b>Doorgestuurd bericht van: %s</b><br>%s"
#. FIXME: sometimes users aren't part of the response when receiving a
#. forwarded message
#: ../tgp-msg.c:607
#, c-format
msgid "<b>Forwarded message:</b><br>%s"
msgstr "<b>Doorgestuurd bericht:</b><br>%s"
#: ../tgp-msg.c:720
msgid "loading document or picture failed"
msgstr "document of foto laden mislukt"
#: ../tgp-net.c:281
msgid "Cannot connect to main server"
msgstr "Kan niet verbinden met hoofdserver"
#: ../tgp-net.c:322
msgid "Cannot connect to server: Ping timeout."
msgstr "Kan niet verbinden met server: ping-timeout"
#: ../tgp-net.c:365
msgid "Lost connection to the server..."
msgstr "Verbinding met de server verloren..."
#: ../tgp-request.c:51
msgid ""
"Telegram wants to verify your identity. Please enter the login code that you"
" have received via SMS."
msgstr ""
"Telegram wil uw identiteit graag controleren. Voer de inlogcode in die u per"
" SMS heeft ontvangen."
#: ../tgp-request.c:54
msgid "Login code"
msgstr "Inlogcode"
#: ../tgp-request.c:54
msgid "Enter login code"
msgstr "Inlogcode invoeren"
#: ../tgp-request.c:54
msgid "the code"
msgstr "de code"
#: ../tgp-request.c:54 ../tgp-request.c:104 ../tgp-request.c:198
#: ../tgp-request.c:233 ../tgp-request.c:263
msgid "OK"
msgstr "Ok"
#: ../tgp-request.c:55 ../tgp-request.c:104 ../tgp-request.c:123
#: ../tgp-request.c:199 ../tgp-request.c:234 ../tgp-request.c:264
msgid "Cancel"
msgstr "Annuleren"
#: ../tgp-request.c:95
msgid "Registration"
msgstr "Registratie"
#: ../tgp-request.c:96
msgid "First name"
msgstr "Voornaam"
#: ../tgp-request.c:99
msgid "Last name"
msgstr "Achternaam"
#: ../tgp-request.c:103
msgid "Register"
msgstr "Registreren"
#: ../tgp-request.c:103
msgid "Please register your phone number."
msgstr "Registreer uw telefoonnummer."
#. purple_request API not available
#: ../tgp-request.c:108
msgid ""
"Phone number is not registered. Please register your phone on a different "
"client."
msgstr ""
"Uw telefoonnummer is niet geregistreerd. Registreer uw telefoon op een ander"
" apparaat."
#: ../tgp-request.c:110
msgid "Not registered"
msgstr "Niet geregistreerd"
#: ../tgp-request.c:122
msgid "Password needed"
msgstr "Wachtwoord benodigd"
#: ../tgp-request.c:122
msgid "Enter password for two factor authentication"
msgstr "Wachtwoord invoeren voor authentificatie in twee stappen"
#: ../tgp-request.c:123
msgid "Ok"
msgstr "Ok"
#: ../tgp-request.c:125
msgid ""
"No password set for two factor authentication. Please enter it in the "
"extended settings."
msgstr ""
"Geen wachtwoord ingesteld voor authentificatie in twee stappen. Voer deze in"
" bij de uitgebreide instellingen."
#: ../tgp-request.c:127
msgid "Password invalid"
msgstr "Wachtwoord ongeldig"
#: ../tgp-request.c:150
#, c-format
msgid "Accept secret chat '%s' on this device?"
msgstr "Geheime chat %s op dit apparaat accepteren?"
#: ../tgp-request.c:151
msgid "Secret chat"
msgstr "Geheime chat"
#: ../tgp-request.c:151
msgid ""
"Secret chats can only have one end point. If you accept a secret chat on "
"this device, its messages will not be available anywhere else. If you "
"decline, you can still accept the chat on other devices."
msgstr ""
"Geheime chat kunnen slechts één afleverpunt bevatten. Als u een geheime chat"
" op dit apparaat accepteert kunt u deze berichten nergens anders bekijken. "
"Als u weigert kunt u de chat nog steeds op andere apparaten accepteren."
#: ../tgp-request.c:182
msgid ""
"Invite at least one additional user by specifying\n"
" their full name (autocompletion available).\n"
"You can add more users once the chat was created."
msgstr ""
"Nodig minimaal één andere gebruiker uit door\n"
" volledige namen op te geven (automatisch \n"
"aanvullen is beschikbaar). U kunt meer gebruikers\n"
"toevoegen als de chat aangemaakt is."
#: ../tgp-request.c:185 ../tgp-request.c:189 ../tgp-request.c:193
msgid "Username"
msgstr "Gebruikersnaam"
#: ../tgp-request.c:198
msgid "Create group chat"
msgstr "Groepschat aanmaken"
#: ../tgp-request.c:198
msgid "Invite users"
msgstr "Gebruikers uitnodigen"
#: ../tgp-request.c:217 ../tgp-request.c:232
msgid "Change password"
msgstr "Wachtwoord wijzigen"
#: ../tgp-request.c:219
msgid "Current"
msgstr "Huidig"
#: ../tgp-request.c:223 ../tgp-request.c:253
msgid "Password"
msgstr "Wachtwoord"
#: ../tgp-request.c:227 ../tgp-request.c:257
msgid "Confirm"
msgstr "Bevestigen"
#: ../tgp-request.c:251 ../tgp-request.c:262
msgid "New password"
msgstr "Nieuw wachtwoord"
#. if we arrive here for the second time the specified phone number is not
#. valid. We do not
#. ask for the phone number directly, cause in that case the account would
#. still be created
#. named with the invalid phone number, even though the login will work
#: ../tgp-request.c:300
msgid "Invalid phone number"
msgstr "Onvolledig telefoonnummer"
#: ../tgp-request.c:301
msgid ""
"Please enter only numbers in the international phone number format, a leading + following by the country prefix and the phone number.\n"
"Do not use any other special chars."
msgstr ""
"Voer alleen cijfers in in het internationale telefoonnummerformaat, dus om te beginnen een + gevolgd door het landnummer en het telefoonnummer.\n"
"Gebruik geen andere speciale tekens."
#: ../tgp-request.c:370
msgid "Leave Chat"
msgstr "Chat verlaten"
#: ../tgp-request.c:372
msgid "Do you want to leave this chat permantently?"
msgstr "Wilt u deze chat permanent verlaten?"
#: ../tgp-request.c:377
msgid "Abort Secret Chat"
msgstr "Geheime chat beëindigen"
#: ../tgp-request.c:379
msgid "Do you want to terminate this secret chat permantently?"
msgstr "Wilt u deze geheime chat permanent beëindigen?"
#: ../tgp-request.c:384
msgid "Delete Contact"
msgstr "Contact verwijderen"
#: ../tgp-request.c:386
msgid "Do you want to remove this user from your global contact list?"
msgstr "Wil u deze gebruiker uit uw algemene contactenlijst verwijderen?"
#: ../tgp-request.c:401
msgid "Leave Channel"
msgstr "Kanaal verlaten"
#: ../tgp-request.c:403
msgid "Do you want to leave this channel?"
msgstr "Wilt u dit kanaal verlaten?"
#. This should be the language's timestamp format. This is preceded by a
#. colon.
#: ../tgp-utils.c:27
msgid "%d.%m.%Y %H:%M"
msgstr "%d-%m-%Y %H:%M"
#. This is preceded by a colon.
#: ../tgp-utils.c:48
msgid "recently"
msgstr "recent"
#. This is preceded by a colon.
#: ../tgp-utils.c:52
msgid "last week"
msgstr "afgelopen week"
#. This is preceded by a colon.
#: ../tgp-utils.c:56
msgid "last month"
msgstr "afgelopen maand"
#. This is preceded by a colon. It refers to a point on time.
#: ../tgp-utils.c:60
msgid "unknown"
msgstr "onbekend"
#: ../tgp-chat.c:108 ../tgp-chat.c:582
msgid "Telegram Chats"
msgstr "Telegram-chats"
#: ../tgp-chat.c:113
msgid "You have already left this chat."
msgstr "U heeft dit kanaal al verlaten."
#: ../tgp-chat.c:224
msgid "Subject:"
msgstr "Onderwerp:"
#: ../tgp-chat.c:230
msgid "Invite link:"
msgstr "Uitnodigingskoppeling:"
#: ../tgp-chat.c:236
msgid "Chat ID:"
msgstr "Chat-ID:"
#: ../tgp-chat.c:342
msgid "Supergroup"
msgstr "Supergroep"
#: ../tgp-chat.c:342
msgid "Channel"
msgstr "Kanaal"
#: ../tgp-chat.c:345
msgid "Group"
msgstr "Groep"
#: ../tgp-chat.c:367
msgid "Users in chat"
msgstr "Gebruikers in chat"
#: ../tgp-chat.c:370
msgid "Type"
msgstr "Soort"

View file

@ -1,88 +1,94 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Piotr Drąg <piotrdrag@gmail.com>, 2015
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-21 14:37+0100\n"
"PO-Revision-Date: 2015-12-18 13:05+0000\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish (Poland) (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/pl_PL/)\n"
"POT-Creation-Date: 2016-08-31 22:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>, 2016\n"
"Language-Team: Polish (Poland) (https://www.transifex.com/telegram-purple-developers/teams/53149/pl_PL/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pl_PL\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>=14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
#: ../telegram-base.c:515
#: ../telegram-base.c:500
msgid "Couldn't create group"
msgstr "Nie można utworzyć grupy"
#: ../telegram-base.c:515
#: ../telegram-base.c:501
msgid "Please select at least one other user."
msgstr "Należy wybrać co najmniej jednego użytkownika."
#: ../telegram-base.c:570
#: ../telegram-base.c:555
msgid "Query Failed"
msgstr "Zapytanie się nie powiodło"
#: ../telegram-purple.c:193
#: ../telegram-purple.c:162
msgid "Secret chat ready."
msgstr "Tajna rozmowa jest gotowa."
#: ../telegram-purple.c:200
#: ../telegram-purple.c:170
msgid "Secret chat terminated."
msgstr "Zakończono tajną rozmowę."
#: ../telegram-purple.c:268
#: ../telegram-purple.c:182
msgid "Telegram"
msgstr "Telegram"
#: ../telegram-purple.c:229
msgid "Message marked as read."
msgstr "Oznaczono wiadomość jako przeczytaną."
#: ../telegram-purple.c:486
#: ../telegram-purple.c:339
#, c-format
msgid "Invite link: %s"
msgstr "Odnośnik do zaproszenia: %s"
#: ../telegram-purple.c:506 ../telegram-purple.c:507
#. FIXME: Can TGLCHF_MODERATOR export links?
#: ../telegram-purple.c:350
msgid "Creating chat link failed"
msgstr "Utworzenie odnośnika do rozmowy się nie powiodło"
#: ../telegram-purple.c:508
#: ../telegram-purple.c:351
msgid "You need to be admin of the group to do that."
msgstr "Należy być administratorem grupy, aby to zrobić."
#: ../telegram-purple.c:531
#: ../telegram-purple.c:416
msgid "Chat joined"
msgstr "Dołączono do rozmowy"
#: ../telegram-purple.c:532
#: ../telegram-purple.c:417
msgid "Chat added to list of chat rooms."
msgstr "Dodano rozmowę do listy pokojów rozmów."
#: ../telegram-purple.c:552
#: ../telegram-purple.c:443
msgid "Start secret chat..."
msgstr "Rozpocznij tajną rozmowę…"
#. Generate Public Link
#: ../telegram-purple.c:558
#: ../telegram-purple.c:450
msgid "Invite users by link..."
msgstr "Zaproś użytkowników przez odnośnik…"
#. Delete self from chat
#: ../telegram-purple.c:564
#: ../telegram-purple.c:458
msgid "Delete and exit..."
msgstr "Usuń i wyjdź…"
msgstr "Usuń i wyjdź…"
#: ../telegram-purple.c:632
#: ../telegram-purple.c:546
#, c-format
msgid "Unable to sign on as %s: pubkey not found."
msgstr "Nie można zalogować jako %s: nie odnaleziono klucza publicznego."
msgid "Unable to sign on as %s: file (public key) not found."
msgstr ""
"Nie można zalogować jako %s: nie odnaleziono pliku (klucza publicznego)."
#: ../telegram-purple.c:636
#: ../telegram-purple.c:550
#, c-format
msgid ""
"Make sure telegram-purple is installed properly,\n"
@ -90,340 +96,414 @@ msgid ""
"If you're running SELinux (e.g. when using Tails),\n"
"try 'make local_install', or simply copy\n"
"%1$s to %2$s."
msgstr "Proszę się upewnić, że telegram-purple jest poprawnie zainstalowane,\nw tym plik .tglpub.\nJeśli używany jest SELinux (np. podczas używania Tails),\nto proszę spróbować polecenia „make local_install” lub po prostu skopiować\n%1$s do %2$s."
msgstr ""
"Proszę się upewnić, że telegram-purple jest poprawnie zainstalowane,\n"
"w tym plik .tglpub.\n"
"Jeśli używany jest SELinux (np. podczas używania Tails),\n"
"to proszę spróbować polecenia „make local_install” lub po prostu skopiować\n"
"%1$s do %2$s."
#: ../telegram-purple.c:657
#: ../telegram-purple.c:572
#, c-format
msgid ""
"Unable to sign on as %s: problem in the underlying library 'tgl'. Please "
"submit a bug report with the debug log."
msgstr ""
"Nie można zalogować jako %s: problem w bibliotece „tgl”. Proszę zgłosić błąd"
" z dziennikiem debugowania."
#: ../telegram-purple.c:576
msgid "Problem in tgl"
msgstr "Problem w bibliotece tgl"
#. TRANSLATORS: Please fill in your own prefix!
#: ../telegram-purple.c:584
#, c-format
msgid ""
"Unable to sign on as %s: phone number lacks country prefix. Numbers must "
"start with the full international prefix code, e.g. +49 for Germany."
msgstr "Nie można zalogować jako %s: numer telefonu nie ma przedrostka kraju. Numery muszą zaczynać się od pełnego międzynarodowego przedrostka, np. +48 dla Polski."
"start with the full international prefix code, e.g. +1 for USA."
msgstr ""
"Nie można zalogować jako %s: numer telefonu nie ma przedrostka kraju. Numery"
" muszą zaczynać się od pełnego międzynarodowego przedrostka, np. +48 dla "
"Polski."
#: ../telegram-purple.c:662
#: ../telegram-purple.c:589
msgid "Incomplete phone number"
msgstr "Niepełny numer telefonu"
#: ../telegram-purple.c:788 ../telegram-purple.c:789
#: ../telegram-purple.c:642
msgid "Secret chat was already deleted"
msgstr "Już usunięto tajną rozmowę"
#: ../telegram-purple.c:644
msgid "Secret chat is not ready"
msgstr "Tajna rozmowa nie jest gotowa"
#: ../telegram-purple.c:652
msgid "Only the creator of a channel can post messages."
msgstr "Tylko twórca kanału może wysyłać wiadomości."
#: ../telegram-purple.c:695
msgid "Cannot invite buddy to chat"
msgstr "Nie można zaprosić znajomego do rozmowy"
#: ../telegram-purple.c:790
#: ../telegram-purple.c:696
msgid "Specified user does not exist."
msgstr "Podany użytkownik nie istnieje."
#: ../telegram-purple.c:709
msgid "phone no. (+ country prefix)"
msgstr "numer telefonu (+ przedrostek kraju)"
#. Login
#: ../telegram-purple.c:932
#: ../telegram-purple.c:817
msgid "Password (two factor authentication)"
msgstr "Hasło (uwierzytelnianie dwustopniowe)"
#: ../telegram-purple.c:938
#: ../telegram-purple.c:822
msgid ""
"Fallback SMS verification\n"
"(Helps when not using Pidgin and you aren't being prompted for the code)"
msgstr "Zapasowa weryfikacja przez SMS\n(Pomaga w przypadkach, kiedy nie jest używany program Pidgin i użytkownik nie jest pytany o kod)"
msgstr ""
"Zapasowa weryfikacja przez SMS\n"
"(Pomaga w przypadkach, kiedy nie jest używany program Pidgin i użytkownik nie jest pytany o kod)"
#: ../telegram-purple.c:946
msgid "ask"
msgstr "pytanie"
#: ../telegram-purple.c:947
#: ../telegram-purple.c:828
msgid "always"
msgstr "zawsze"
#: ../telegram-purple.c:948
#: ../telegram-purple.c:829
msgid "never"
msgstr "nigdy"
#: ../telegram-purple.c:950
#: ../telegram-purple.c:830
msgid "ask"
msgstr "pytanie"
#: ../telegram-purple.c:832
msgid "Accept secret chats"
msgstr "Akceptowanie tajnych rozmów"
msgstr "Odbieranie tajnych rozmów"
#: ../telegram-purple.c:955
#: ../telegram-purple.c:836
msgid "Display buddies offline after (days)"
msgstr "Wyświetlanie znajomych jako w trybie offline po (w dniach)"
msgstr "Wyświetlanie znajomych jako w trybie offline po (w dniach)"
#: ../telegram-purple.c:960
msgid "Fetch past history on first login"
msgstr "Pobieranie historii podczas pierwszego logowania"
#: ../telegram-purple.c:965
#: ../telegram-purple.c:840
msgid ""
"Don't fetch history older than (days)\n"
"(0 for unlimited)"
msgstr "Bez pobierania historii starszej niż (w dniach)\n(0 oznacza brak ograniczenia)"
msgstr ""
"Bez pobierania historii starszej niż (w dniach)\n"
"(0 oznacza brak ograniczenia)"
#. Media
#: ../telegram-purple.c:845
msgid "Autoload media size (kb)"
msgstr "Rozmiar automatycznie wczytywanych multimediów (w kilobajtach)"
#. Chats
#: ../telegram-purple.c:973
#: ../telegram-purple.c:850
msgid "Add all group chats to buddy list"
msgstr "Dodawanie wszystkich rozmów grupowych do listy znajomych"
#. Read notifications
#: ../telegram-purple.c:981
#: ../telegram-purple.c:855
msgid "Display notices of receipt"
msgstr "Wyświetlanie powiadomień o odebraniu"
msgstr "Wyświetlanie powiadomień o odebraniu"
#: ../telegram-purple.c:986
#: ../telegram-purple.c:859
msgid "Send notices of receipt when present"
msgstr "Wysyłanie powiadomień o odebraniu podczas obecności"
msgstr "Wysyłanie powiadomień o odebraniu podczas obecności"
#: ../tgp-2prpl.c:178 ../tgp-request.c:108
msgid "First name"
msgstr "Imię"
#: ../telegram-purple.c:884
msgid "Telegram Protocol Plugin."
msgstr "Wtyczka protokołu Telegram."
#: ../tgp-2prpl.c:179 ../tgp-request.c:111
msgid "Last name"
msgstr "Nazwisko"
#: ../tgp-2prpl.c:181
msgid "Name"
msgstr "Nazwa"
#: ../tgp-2prpl.c:186 ../tgp-request.c:197 ../tgp-request.c:201
#: ../tgp-request.c:205
msgid "Username"
msgstr "Nazwa użytkownika"
#: ../tgp-2prpl.c:191
msgid "Last seen"
msgstr "Ostatnio widziany"
#: ../tgp-2prpl.c:196
msgid "Phone"
msgstr "Telefon"
#: ../tgp-2prpl.c:208
msgid "Waiting for the user to get online..."
msgstr "Oczekiwanie, aż użytkownik przejdzie do trybu online…"
#: ../tgp-2prpl.c:212
msgid "Self destruction timer"
msgstr "Czas samozniszczenia"
#: ../tgp-2prpl.c:218
msgid "Timer is not enabled."
msgstr "Licznik nie jest włączony."
#: ../tgp-2prpl.c:225
msgid "Secret key"
msgstr "Tajny klucz"
#: ../tgp-msg.c:72
#: ../tgp-msg.c:58
#, c-format
msgid "%2$s created chat %1$s."
msgstr "Użytkownik %2$s utworzył rozmowę %1$s."
#: ../tgp-msg.c:75
#: ../tgp-msg.c:61
#, c-format
msgid "%2$s changed title to %1$s."
msgstr "Użytkownik %2$s zmienił tytuł na %1$s."
#: ../tgp-msg.c:78
#: ../tgp-msg.c:64
#, c-format
msgid "%s changed photo."
msgstr "Użytkownik %s zmienił zdjęcie."
#: ../tgp-msg.c:81
#: ../tgp-msg.c:67
#, c-format
msgid "%s deleted photo."
msgstr "Użytkownik %s usunął zdjęcie."
#: ../tgp-msg.c:89
#: ../tgp-msg.c:75
#, c-format
msgid "%1$s added user %2$s by link."
msgstr "Użytkownik %1$s dodał użytkownika %2$s przez odnośnik."
#: ../tgp-msg.c:102
#: ../tgp-msg.c:90
#, c-format
msgid "%2$s added user %1$s."
msgstr "Użytkownik %2$s dodał użytkownika %1$s."
#: ../tgp-msg.c:125 ../tgp-msg.c:140
#: ../tgp-msg.c:114 ../tgp-msg.c:131
#, c-format
msgid "%2$s deleted user %1$s."
msgstr "Użytkownik %2$s usunął użytkownika %1$s."
#: ../tgp-msg.c:146
#: ../tgp-msg.c:138
#, c-format
msgid "%2$s set self destruction timer to %1$d second."
msgid_plural "%2$s set self destruction timer to %1$d seconds."
msgstr[0] "Użytkownik %2$s ustawił czas samozniszczenia na %1$d sekundę."
msgstr[1] "Użytkownik %2$s ustawił czas samozniszczenia na %1$d sekundy."
msgstr[2] "Użytkownik %2$s ustawił czas samozniszczenia na %1$d sekund."
msgstr[3] "Użytkownik %2$s ustawił czas samozniszczenia na %1$d sekund."
#: ../tgp-msg.c:152
#: ../tgp-msg.c:144
#, c-format
msgid "%2$s marked %1$d message read."
msgid_plural "%2$s marked %1$d messages read."
msgstr[0] "Użytkownik %2$s oznaczył %1$d wiadomość jako przeczytaną."
msgstr[1] "Użytkownik %2$s oznaczył %1$d wiadomości jako przeczytane."
msgstr[2] "Użytkownik %2$s oznaczył %1$d wiadomości jako przeczytane."
msgstr[3] "Użytkownik %2$s oznaczył %1$d wiadomości jako przeczytane."
#: ../tgp-msg.c:158
#: ../tgp-msg.c:150
#, c-format
msgid "%2$s deleted %1$d message."
msgid_plural "%2$s deleted %1$d messages."
msgstr[0] "Użytkownik %2$s usunął %1$d wiadomość."
msgstr[1] "Użytkownik %2$s usunął %1$d wiadomości."
msgstr[2] "Użytkownik %2$s usunął %1$d wiadomości."
msgstr[3] "Użytkownik %2$s usunął %1$d wiadomości."
#: ../tgp-msg.c:164
#: ../tgp-msg.c:156
#, c-format
msgid "%2$s made a screenshot of %1$d message."
msgid_plural "%2$s made a screenshot of %1$d messages."
msgstr[0] "Użytkownik %2$s utworzył zrzut ekranu %1$d wiadomości."
msgstr[1] "Użytkownik %2$s utworzył zrzut ekranu %1$d wiadomości."
msgstr[2] "Użytkownik %2$s utworzył zrzut ekranu %1$d wiadomości."
msgstr[3] "Użytkownik %2$s utworzył zrzut ekranu %1$d wiadomości."
#: ../tgp-msg.c:162
#, c-format
msgid "Channel %1$s created"
msgstr "Utworzono kanał %1$s"
#. FIXME: check if this makes sense
#: ../tgp-msg.c:165 ../tgp-chat.c:124 ../tgp-chat.c:576
msgid "Telegram Channels"
msgstr "Kanały Telegram"
#: ../tgp-msg.c:191
msgid "Sending message failed."
msgstr "Wysłanie wiadomości się nie powiodło."
#: ../tgp-msg.c:296
#: ../tgp-msg.c:253
msgid "Sending image failed."
msgstr "Wysłanie obrazu się nie powiodło."
#: ../tgp-msg.c:310
msgid "Sorry, sending documents to encrypted chats not yet supported."
msgstr "Wysyłanie dokumentów do zaszyfrowanych rozmów nie jest jeszcze obsługiwane."
#: ../tgp-msg.c:400
#: ../tgp-msg.c:417
#, c-format
msgid "%s sent a sticker."
msgstr "Użytkownik %s wysłał naklejkę."
#: ../tgp-net.c:286
#: ../tgp-msg.c:463
msgid "failed loading message"
msgstr "wczytanie wiadomości się nie powiodło"
#: ../tgp-msg.c:498
msgid "[animation]"
msgstr "[animacja]"
#: ../tgp-msg.c:515
msgid "[audio]"
msgstr "[dźwięk]"
#: ../tgp-msg.c:515
msgid "[video]"
msgstr "[film]"
#: ../tgp-msg.c:604
#, c-format
msgid "<b>Forwarded message from: %s</b><br>%s"
msgstr "<b>Przekazana wiadomość od: %s</b><br>%s"
#. FIXME: sometimes users aren't part of the response when receiving a
#. forwarded message
#: ../tgp-msg.c:607
#, c-format
msgid "<b>Forwarded message:</b><br>%s"
msgstr "<b>Przekazana wiadomość:</b><br>%s"
#: ../tgp-msg.c:720
msgid "loading document or picture failed"
msgstr "wczytywanie dokumentu lub obrazu się nie powiodło"
#: ../tgp-net.c:281
msgid "Cannot connect to main server"
msgstr "Nie można połączyć z głównym serwerem"
msgstr "Nie można połączyć z głównym serwerem"
#: ../tgp-net.c:342
#: ../tgp-net.c:322
msgid "Cannot connect to server: Ping timeout."
msgstr "Nie można połączyć z serwerem: przekroczono czas oczekiwania na ping."
msgstr ""
"Nie można połączyć z serwerem: przekroczono czas oczekiwania na odpowiedź."
#: ../tgp-net.c:387
#: ../tgp-net.c:365
msgid "Lost connection to the server..."
msgstr "Utracono połączenie z serwerem…"
msgstr "Utracono połączenie z serwerem…"
#: ../tgp-request.c:64
#: ../tgp-request.c:51
msgid ""
"Telegram wants to verify your identity. Please enter the login code that you"
" have received via SMS."
msgstr "Usługa Telegram musi zweryfikować tożsamość użytkownika. Proszę podać kod logowania otrzymany w wiadomości SMS."
msgstr ""
"Usługa Telegram musi zweryfikować tożsamość użytkownika. Proszę podać kod "
"logowania otrzymany w wiadomości SMS."
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Login code"
msgstr "Kod logowania"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Enter login code"
msgstr "Proszę podać kod logowania"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "the code"
msgstr "kod"
#: ../tgp-request.c:67 ../tgp-request.c:116 ../tgp-request.c:210
#: ../tgp-request.c:245 ../tgp-request.c:275
#: ../tgp-request.c:54 ../tgp-request.c:104 ../tgp-request.c:198
#: ../tgp-request.c:233 ../tgp-request.c:263
msgid "OK"
msgstr "OK"
#: ../tgp-request.c:68 ../tgp-request.c:116 ../tgp-request.c:135
#: ../tgp-request.c:211 ../tgp-request.c:246 ../tgp-request.c:276
#: ../tgp-request.c:55 ../tgp-request.c:104 ../tgp-request.c:123
#: ../tgp-request.c:199 ../tgp-request.c:234 ../tgp-request.c:264
msgid "Cancel"
msgstr "Anuluj"
#: ../tgp-request.c:107
#: ../tgp-request.c:95
msgid "Registration"
msgstr "Rejestracja"
#: ../tgp-request.c:115
#: ../tgp-request.c:96
msgid "First name"
msgstr "Imię"
#: ../tgp-request.c:99
msgid "Last name"
msgstr "Nazwisko"
#: ../tgp-request.c:103
msgid "Register"
msgstr "Zarejestruj"
#: ../tgp-request.c:115
#: ../tgp-request.c:103
msgid "Please register your phone number."
msgstr "Proszę zarejestrować numer telefonu."
#. purple_request API not available
#: ../tgp-request.c:120
#: ../tgp-request.c:108
msgid ""
"Phone number is not registered. Please register your phone on a different "
"client."
msgstr "Numer telefonu nie jest zarejestrowany. Proszę go zarejestrować w innym kliencie."
msgstr ""
"Numer telefonu nie jest zarejestrowany. Proszę go zarejestrować w innym "
"kliencie."
#: ../tgp-request.c:122
#: ../tgp-request.c:110
msgid "Not registered"
msgstr "Niezarejestrowany"
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Password needed"
msgstr "Wymagane jest hasło"
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Enter password for two factor authentication"
msgstr "Proszę podać hasło dla uwierzytelniania dwustopniowego"
#: ../tgp-request.c:135
#: ../tgp-request.c:123
msgid "Ok"
msgstr "OK"
#: ../tgp-request.c:137
#: ../tgp-request.c:125
msgid ""
"No password set for two factor authentication. Please enter it in the "
"extended settings."
msgstr "Nie ustawiono hasła dla uwierzytelniania dwustopniowego. Proszę podać je w rozszerzonych ustawieniach."
msgstr ""
"Nie ustawiono hasła dla uwierzytelniania dwustopniowego. Proszę podać je w "
"rozszerzonych ustawieniach."
#: ../tgp-request.c:139
#: ../tgp-request.c:127
msgid "Password invalid"
msgstr "Nieprawidłowe hasło"
#: ../tgp-request.c:162
#: ../tgp-request.c:150
#, c-format
msgid "Accept secret chat '%s' on this device?"
msgstr "Zaakceptować tajną rozmowę „%s” na tym urządzeniu?"
msgstr "Odebrać tajną rozmowę „%s” na tym urządzeniu?"
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid "Secret chat"
msgstr "Tajna rozmowa"
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid ""
"Secret chats can only have one end point. If you accept a secret chat on "
"this device, its messages will not be available anywhere else. If you "
"decline, you can still accept the chat on other devices."
msgstr "Tajne rozmowy mogą mieć tylko jeden punkt wyjściowy. Jeśli tajna rozmowa zostanie zaakceptowana na tym urządzeniu, to jej wiadomości nie będą dostępne nigdzie indziej. Jeśli zostanie odrzucona, to nadal można ją zaakceptować na innych urządzeniach."
msgstr ""
"Tajne rozmowy mogą mieć tylko jeden punkt wyjściowy. Jeśli tajna rozmowa "
"zostanie odebrana na tym urządzeniu, to jej wiadomości nie będą dostępne "
"nigdzie indziej. Jeśli zostanie odrzucona, to nadal można ją odebrać na "
"innych urządzeniach."
#: ../tgp-request.c:194
#: ../tgp-request.c:182
msgid ""
"Invite at least one additional user by specifying\n"
" their full name (autocompletion available).\n"
"You can add more users once the chat was created."
msgstr "Należy zaprosić co najmniej jednego użytkownika podając\njego imię i nazwisko (automatyczne uzupełnianie jest dostępne).\nMożna dodać więcej użytkowników po utworzeniu rozmowy."
msgstr ""
"Należy zaprosić co najmniej jednego użytkownika podając\n"
"jego imię i nazwisko (automatyczne uzupełnianie jest dostępne).\n"
"Można dodać więcej użytkowników po utworzeniu rozmowy."
#: ../tgp-request.c:210
#: ../tgp-request.c:185 ../tgp-request.c:189 ../tgp-request.c:193
msgid "Username"
msgstr "Nazwa użytkownika"
#: ../tgp-request.c:198
msgid "Create group chat"
msgstr "Utwórz rozmowę grupową"
#: ../tgp-request.c:210
#: ../tgp-request.c:198
msgid "Invite users"
msgstr "Zaproś użytkowników"
#: ../tgp-request.c:229 ../tgp-request.c:244
#: ../tgp-request.c:217 ../tgp-request.c:232
msgid "Change password"
msgstr "Zmień hasło"
#: ../tgp-request.c:231
#: ../tgp-request.c:219
msgid "Current"
msgstr "Bieżące"
#: ../tgp-request.c:235 ../tgp-request.c:265
#: ../tgp-request.c:223 ../tgp-request.c:253
msgid "Password"
msgstr "Hasło"
#: ../tgp-request.c:239 ../tgp-request.c:269
#: ../tgp-request.c:227 ../tgp-request.c:257
msgid "Confirm"
msgstr "Potwierdzenie"
#: ../tgp-request.c:263 ../tgp-request.c:274
#: ../tgp-request.c:251 ../tgp-request.c:262
msgid "New password"
msgstr "Nowe hasło"
@ -432,58 +512,112 @@ msgstr "Nowe hasło"
#. ask for the phone number directly, cause in that case the account would
#. still be created
#. named with the invalid phone number, even though the login will work
#: ../tgp-request.c:312
#: ../tgp-request.c:300
msgid "Invalid phone number"
msgstr "Nieprawidłowy numer telefonu"
#: ../tgp-request.c:313
#: ../tgp-request.c:301
msgid ""
"Please enter only numbers in the international phone number format, a leading + following by the country prefix and the phone number.\n"
"Do not use any other special chars."
msgstr "Proszę podać tylko numery w międzynarodowym formacie numerów telefonu, czyli + z przedrostkiem kraju i numer telefonu.\nNie należy używać innych znaków specjalnych."
msgstr ""
"Proszę podać tylko numery w międzynarodowym formacie numerów telefonu, czyli + z przedrostkiem kraju i numer telefonu.\n"
"Nie należy używać innych znaków specjalnych."
#: ../tgp-request.c:370
msgid "Leave Chat"
msgstr "Opuść rozmowę"
#: ../tgp-request.c:372
msgid "Do you want to leave this chat permantently?"
msgstr "Trwale opuścić tę rozmowę?"
#: ../tgp-request.c:377
msgid "Abort Secret Chat"
msgstr "Przerwij tajną rozmowę"
#: ../tgp-request.c:379
msgid "Do you want to terminate this secret chat permantently?"
msgstr "Trwale zakończyć tę tajną rozmowę?"
#: ../tgp-request.c:384
msgid "Delete Contact"
msgstr "Usuń kontakt"
#: ../tgp-request.c:386
msgid "Do you want to remove this user from your global contact list?"
msgstr "Usunąć tego użytkownika z globalnej listy kontaktów?"
#: ../tgp-request.c:401
msgid "Leave Channel"
msgstr "Opuść kanał"
#: ../tgp-request.c:403
msgid "Do you want to leave this channel?"
msgstr "Opuścić ten kanał?"
#. This should be the language's timestamp format. This is preceded by a
#. colon.
#: ../tgp-utils.c:32
#: ../tgp-utils.c:27
msgid "%d.%m.%Y %H:%M"
msgstr "%d.%m.%Y %H%M"
#. This is preceded by a colon.
#: ../tgp-utils.c:53
#: ../tgp-utils.c:48
msgid "recently"
msgstr "niedawno"
#. This is preceded by a colon.
#: ../tgp-utils.c:57
#: ../tgp-utils.c:52
msgid "last week"
msgstr "ostatni tydzień"
#. This is preceded by a colon.
#: ../tgp-utils.c:61
#: ../tgp-utils.c:56
msgid "last month"
msgstr "ostatni miesiąc"
#. This is preceded by a colon. It refers to a point on time.
#: ../tgp-utils.c:65
#: ../tgp-utils.c:60
msgid "unknown"
msgstr "nieznane"
#: ../tgp-chat.c:79
#: ../tgp-chat.c:108 ../tgp-chat.c:582
msgid "Telegram Chats"
msgstr "Rozmowy Telegram"
#: ../tgp-chat.c:113
msgid "You have already left this chat."
msgstr "Już opuszczoną tę rozmowę."
#: ../tgp-chat.c:127
#: ../tgp-chat.c:224
msgid "Subject:"
msgstr "Temat:"
#: ../tgp-chat.c:133
#: ../tgp-chat.c:230
msgid "Invite link:"
msgstr "Odnośnik do zaproszenia:"
#: ../tgp-chat.c:139
#: ../tgp-chat.c:236
msgid "Chat ID:"
msgstr "Identyfikator rozmowy:"
#: ../tgp-chat.c:238
#: ../tgp-chat.c:342
msgid "Supergroup"
msgstr "Supergrupa"
#: ../tgp-chat.c:342
msgid "Channel"
msgstr "Kanał"
#: ../tgp-chat.c:345
msgid "Group"
msgstr "Grupa"
#: ../tgp-chat.c:367
msgid "Users in chat"
msgstr "Użytkownicy w rozmowie"
msgstr "Użytkownicy w rozmowie"
#: ../tgp-chat.c:370
msgid "Type"
msgstr "Typ"

View file

@ -1,89 +1,93 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Denis Brandl <denisbr@gmail.com>, 2015
# Gilberto Coutinho <gilberto.jsc@gmail.com>, 2015
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-21 14:37+0100\n"
"PO-Revision-Date: 2015-12-18 13:05+0000\n"
"Last-Translator: Gilberto Coutinho <gilberto.jsc@gmail.com>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/pt_BR/)\n"
"POT-Creation-Date: 2016-08-31 22:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Ben Wiederhake <BenWiederhake.GitHub@gmx.de>, 2016\n"
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/telegram-purple-developers/teams/53149/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: ../telegram-base.c:515
#: ../telegram-base.c:500
msgid "Couldn't create group"
msgstr "Não foi possível criar o grupo"
#: ../telegram-base.c:515
#: ../telegram-base.c:501
msgid "Please select at least one other user."
msgstr "Por favor, selecione pelo menos 1 usuário."
#: ../telegram-base.c:570
#: ../telegram-base.c:555
msgid "Query Failed"
msgstr "Falha na fila"
#: ../telegram-purple.c:193
#: ../telegram-purple.c:162
msgid "Secret chat ready."
msgstr "Conversa secreta pronta"
#: ../telegram-purple.c:200
#: ../telegram-purple.c:170
msgid "Secret chat terminated."
msgstr "Conversa secreta terminada."
#: ../telegram-purple.c:268
#: ../telegram-purple.c:182
msgid "Telegram"
msgstr ""
#: ../telegram-purple.c:229
msgid "Message marked as read."
msgstr "Mensagem marcada como \"lida\"."
#: ../telegram-purple.c:486
#: ../telegram-purple.c:339
#, c-format
msgid "Invite link: %s"
msgstr "Link de convite: %s"
#: ../telegram-purple.c:506 ../telegram-purple.c:507
#. FIXME: Can TGLCHF_MODERATOR export links?
#: ../telegram-purple.c:350
msgid "Creating chat link failed"
msgstr "Falha na criação do link para a conversa"
#: ../telegram-purple.c:508
#: ../telegram-purple.c:351
msgid "You need to be admin of the group to do that."
msgstr "Você precisa ser Administrador do grupo para fazer isso"
#: ../telegram-purple.c:531
#: ../telegram-purple.c:416
msgid "Chat joined"
msgstr "Entrou na conversa"
#: ../telegram-purple.c:532
#: ../telegram-purple.c:417
msgid "Chat added to list of chat rooms."
msgstr "Conversa adicionada a listas de salas de conversa"
#: ../telegram-purple.c:552
#: ../telegram-purple.c:443
msgid "Start secret chat..."
msgstr "Começar conversa secreta..."
#. Generate Public Link
#: ../telegram-purple.c:558
#: ../telegram-purple.c:450
msgid "Invite users by link..."
msgstr "Convidar usuários pelo link..."
#. Delete self from chat
#: ../telegram-purple.c:564
#: ../telegram-purple.c:458
msgid "Delete and exit..."
msgstr "Deletar e sair..."
#: ../telegram-purple.c:632
#: ../telegram-purple.c:546
#, c-format
msgid "Unable to sign on as %s: pubkey not found."
msgstr "Impossível de assinar como %s: chave-pública não encontrada"
msgid "Unable to sign on as %s: file (public key) not found."
msgstr ""
#: ../telegram-purple.c:636
#: ../telegram-purple.c:550
#, c-format
msgid ""
"Make sure telegram-purple is installed properly,\n"
@ -91,336 +95,400 @@ msgid ""
"If you're running SELinux (e.g. when using Tails),\n"
"try 'make local_install', or simply copy\n"
"%1$s to %2$s."
msgstr "Tenha certeza que o telegram-purple está devidamente instalado,\nincluindo o arquivo .tglpub.\nSe vocês estiver rodando SELinux (por exemplo: quando usa o Tails),\ntente fazer uma \"instalação local\", ou simplesmente compie\n%1$s para %2$s."
msgstr ""
"Tenha certeza que o telegram-purple está devidamente instalado,\n"
"incluindo o arquivo .tglpub.\n"
"Se vocês estiver rodando SELinux (por exemplo: quando usa o Tails),\n"
"tente fazer uma \"instalação local\", ou simplesmente compie\n"
"%1$s para %2$s."
#: ../telegram-purple.c:657
#: ../telegram-purple.c:572
#, c-format
msgid ""
"Unable to sign on as %s: problem in the underlying library 'tgl'. Please "
"submit a bug report with the debug log."
msgstr ""
#: ../telegram-purple.c:576
msgid "Problem in tgl"
msgstr ""
#. TRANSLATORS: Please fill in your own prefix!
#: ../telegram-purple.c:584
#, c-format
msgid ""
"Unable to sign on as %s: phone number lacks country prefix. Numbers must "
"start with the full international prefix code, e.g. +49 for Germany."
msgstr "Não é possível assinar como %s: número de telefone sem prefixo do país.\nNúmeros precisam começar com o prefixo internacional,\npor exemplo: +55 para o Brasil."
"start with the full international prefix code, e.g. +1 for USA."
msgstr ""
#: ../telegram-purple.c:662
#: ../telegram-purple.c:589
msgid "Incomplete phone number"
msgstr "Número de telefone inválido"
#: ../telegram-purple.c:788 ../telegram-purple.c:789
#: ../telegram-purple.c:642
msgid "Secret chat was already deleted"
msgstr ""
#: ../telegram-purple.c:644
msgid "Secret chat is not ready"
msgstr ""
#: ../telegram-purple.c:652
msgid "Only the creator of a channel can post messages."
msgstr ""
#: ../telegram-purple.c:695
msgid "Cannot invite buddy to chat"
msgstr "Não foi possível convidar o amigo para a conversa"
#: ../telegram-purple.c:790
#: ../telegram-purple.c:696
msgid "Specified user does not exist."
msgstr "O usuário especificado não existe."
#: ../telegram-purple.c:709
msgid "phone no. (+ country prefix)"
msgstr ""
#. Login
#: ../telegram-purple.c:932
#: ../telegram-purple.c:817
msgid "Password (two factor authentication)"
msgstr "Senha (dois processos de autenticação)"
#: ../telegram-purple.c:938
#: ../telegram-purple.c:822
msgid ""
"Fallback SMS verification\n"
"(Helps when not using Pidgin and you aren't being prompted for the code)"
msgstr "Retorno de verificaçao via SMS\n(Ajuda quando não estiver usando o Pidgin e não é apresentado a janela com o código)"
msgstr ""
"Retorno de verificaçao via SMS\n"
"(Ajuda quando não estiver usando o Pidgin e não é apresentado a janela com o código)"
#: ../telegram-purple.c:946
msgid "ask"
msgstr "pergunta"
#: ../telegram-purple.c:947
#: ../telegram-purple.c:828
msgid "always"
msgstr "sempre"
#: ../telegram-purple.c:948
#: ../telegram-purple.c:829
msgid "never"
msgstr "nunca"
#: ../telegram-purple.c:950
#: ../telegram-purple.c:830
msgid "ask"
msgstr "pergunta"
#: ../telegram-purple.c:832
msgid "Accept secret chats"
msgstr "Aceitar conversa secrete"
#: ../telegram-purple.c:955
#: ../telegram-purple.c:836
msgid "Display buddies offline after (days)"
msgstr "Mostrar período que os amigos estão offline (dias)"
#: ../telegram-purple.c:960
msgid "Fetch past history on first login"
msgstr "Trazer histórico no primeio login"
#: ../telegram-purple.c:965
#: ../telegram-purple.c:840
msgid ""
"Don't fetch history older than (days)\n"
"(0 for unlimited)"
msgstr "Não trazer históricos mais velhos que (dias)\n(0 para não limitar)"
msgstr ""
"Não trazer históricos mais velhos que (dias)\n"
"(0 para não limitar)"
#. Media
#: ../telegram-purple.c:845
msgid "Autoload media size (kb)"
msgstr ""
#. Chats
#: ../telegram-purple.c:973
#: ../telegram-purple.c:850
msgid "Add all group chats to buddy list"
msgstr "Adicinar todos os grupos de conversa a lista de amigos"
#. Read notifications
#: ../telegram-purple.c:981
#: ../telegram-purple.c:855
msgid "Display notices of receipt"
msgstr "Mostrar avisos de recebimento"
#: ../telegram-purple.c:986
#: ../telegram-purple.c:859
msgid "Send notices of receipt when present"
msgstr "Mandar avisos de recebimento quando estiver online"
#: ../tgp-2prpl.c:178 ../tgp-request.c:108
msgid "First name"
msgstr "Primeiro nome"
#: ../telegram-purple.c:884
msgid "Telegram Protocol Plugin."
msgstr ""
#: ../tgp-2prpl.c:179 ../tgp-request.c:111
msgid "Last name"
msgstr "Último nome"
#: ../tgp-2prpl.c:181
msgid "Name"
msgstr "Nome"
#: ../tgp-2prpl.c:186 ../tgp-request.c:197 ../tgp-request.c:201
#: ../tgp-request.c:205
msgid "Username"
msgstr "Nome de usuário"
#: ../tgp-2prpl.c:191
msgid "Last seen"
msgstr "Visto em"
#: ../tgp-2prpl.c:196
msgid "Phone"
msgstr "Fone"
#: ../tgp-2prpl.c:208
msgid "Waiting for the user to get online..."
msgstr "Esperando pelo usuário ficar online..."
#: ../tgp-2prpl.c:212
msgid "Self destruction timer"
msgstr "Tempo para auto destruição"
#: ../tgp-2prpl.c:218
msgid "Timer is not enabled."
msgstr "Cronômetro não habilitado."
#: ../tgp-2prpl.c:225
msgid "Secret key"
msgstr "Chave secreta"
#: ../tgp-msg.c:72
#: ../tgp-msg.c:58
#, c-format
msgid "%2$s created chat %1$s."
msgstr "%2$s criouo a conversa %1$s."
#: ../tgp-msg.c:75
#: ../tgp-msg.c:61
#, c-format
msgid "%2$s changed title to %1$s."
msgstr "%2$s mudou o assunto para %1$s,"
#: ../tgp-msg.c:78
#: ../tgp-msg.c:64
#, c-format
msgid "%s changed photo."
msgstr "%s mudou a foto."
#: ../tgp-msg.c:81
#: ../tgp-msg.c:67
#, c-format
msgid "%s deleted photo."
msgstr "%s deletou a foto."
#: ../tgp-msg.c:89
#: ../tgp-msg.c:75
#, c-format
msgid "%1$s added user %2$s by link."
msgstr "%1$s adicionou o usuário %2$s por link."
#: ../tgp-msg.c:102
#: ../tgp-msg.c:90
#, c-format
msgid "%2$s added user %1$s."
msgstr "%2$s adicionou o usuário %1$s."
#: ../tgp-msg.c:125 ../tgp-msg.c:140
#: ../tgp-msg.c:114 ../tgp-msg.c:131
#, c-format
msgid "%2$s deleted user %1$s."
msgstr "%2$s reoveu o usuário %1$s"
#: ../tgp-msg.c:146
#: ../tgp-msg.c:138
#, c-format
msgid "%2$s set self destruction timer to %1$d second."
msgid_plural "%2$s set self destruction timer to %1$d seconds."
msgstr[0] "%2$s tempo para auto destruição configurado para %1$d segundos."
msgstr[1] "%2$s tempo para auto destruição configurado para %1$d segundos."
#: ../tgp-msg.c:152
#: ../tgp-msg.c:144
#, c-format
msgid "%2$s marked %1$d message read."
msgid_plural "%2$s marked %1$d messages read."
msgstr[0] "%2$s marcou %1$d mensagens como lidas."
msgstr[1] "%2$s marcou %1$d mensagens como lidas."
#: ../tgp-msg.c:158
#: ../tgp-msg.c:150
#, c-format
msgid "%2$s deleted %1$d message."
msgid_plural "%2$s deleted %1$d messages."
msgstr[0] "%2$s deletou %1$d mensagens."
msgstr[1] "%2$s deletou %1$d mensagens."
#: ../tgp-msg.c:164
#: ../tgp-msg.c:156
#, c-format
msgid "%2$s made a screenshot of %1$d message."
msgid_plural "%2$s made a screenshot of %1$d messages."
msgstr[0] "%2$s capturou a tela de %1$d mensagens."
msgstr[1] "%2$s capturou a tela de %1$d mensagens."
#: ../tgp-msg.c:162
#, c-format
msgid "Channel %1$s created"
msgstr ""
#. FIXME: check if this makes sense
#: ../tgp-msg.c:165 ../tgp-chat.c:124 ../tgp-chat.c:576
msgid "Telegram Channels"
msgstr ""
#: ../tgp-msg.c:191
msgid "Sending message failed."
msgstr "Envio de imagem falhou."
#: ../tgp-msg.c:296
#: ../tgp-msg.c:253
msgid "Sending image failed."
msgstr "Envio de imagem falhou."
#: ../tgp-msg.c:310
msgid "Sorry, sending documents to encrypted chats not yet supported."
msgstr "Desculpe, envio de documentos para conversas encriptadas"
#: ../tgp-msg.c:400
#: ../tgp-msg.c:417
#, c-format
msgid "%s sent a sticker."
msgstr "%s enviou um adesivo."
#: ../tgp-net.c:286
#: ../tgp-msg.c:463
msgid "failed loading message"
msgstr ""
#: ../tgp-msg.c:498
msgid "[animation]"
msgstr ""
#: ../tgp-msg.c:515
msgid "[audio]"
msgstr ""
#: ../tgp-msg.c:515
msgid "[video]"
msgstr ""
#: ../tgp-msg.c:604
#, c-format
msgid "<b>Forwarded message from: %s</b><br>%s"
msgstr ""
#. FIXME: sometimes users aren't part of the response when receiving a
#. forwarded message
#: ../tgp-msg.c:607
#, c-format
msgid "<b>Forwarded message:</b><br>%s"
msgstr ""
#: ../tgp-msg.c:720
msgid "loading document or picture failed"
msgstr ""
#: ../tgp-net.c:281
msgid "Cannot connect to main server"
msgstr "Não pode se conectar no servidor principal"
#: ../tgp-net.c:342
#: ../tgp-net.c:322
msgid "Cannot connect to server: Ping timeout."
msgstr "Não pode se conectar no servidor: Ping timeout."
#: ../tgp-net.c:387
#: ../tgp-net.c:365
msgid "Lost connection to the server..."
msgstr "Conexão com o servidor foi perdida..."
#: ../tgp-request.c:64
#: ../tgp-request.c:51
msgid ""
"Telegram wants to verify your identity. Please enter the login code that you"
" have received via SMS."
msgstr "Telegram quer confirmar sua identidade. Por favor insira o código recebido por SMS."
msgstr ""
"Telegram quer confirmar sua identidade. Por favor insira o código recebido "
"por SMS."
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Login code"
msgstr "Código de login"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Enter login code"
msgstr "Insira o código de login"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "the code"
msgstr "o código"
#: ../tgp-request.c:67 ../tgp-request.c:116 ../tgp-request.c:210
#: ../tgp-request.c:245 ../tgp-request.c:275
#: ../tgp-request.c:54 ../tgp-request.c:104 ../tgp-request.c:198
#: ../tgp-request.c:233 ../tgp-request.c:263
msgid "OK"
msgstr "OK"
#: ../tgp-request.c:68 ../tgp-request.c:116 ../tgp-request.c:135
#: ../tgp-request.c:211 ../tgp-request.c:246 ../tgp-request.c:276
#: ../tgp-request.c:55 ../tgp-request.c:104 ../tgp-request.c:123
#: ../tgp-request.c:199 ../tgp-request.c:234 ../tgp-request.c:264
msgid "Cancel"
msgstr "Cancelar"
#: ../tgp-request.c:107
#: ../tgp-request.c:95
msgid "Registration"
msgstr "Registrar"
#: ../tgp-request.c:115
#: ../tgp-request.c:96
msgid "First name"
msgstr "Primeiro nome"
#: ../tgp-request.c:99
msgid "Last name"
msgstr "Último nome"
#: ../tgp-request.c:103
msgid "Register"
msgstr "Registrar"
#: ../tgp-request.c:115
#: ../tgp-request.c:103
msgid "Please register your phone number."
msgstr "Por favor registre seu número de telefone."
#. purple_request API not available
#: ../tgp-request.c:120
#: ../tgp-request.c:108
msgid ""
"Phone number is not registered. Please register your phone on a different "
"client."
msgstr "Número de telefone não registrado. Por favor registre seu número de telefone com um cliente diferente."
msgstr ""
"Número de telefone não registrado. Por favor registre seu número de telefone"
" com um cliente diferente."
#: ../tgp-request.c:122
#: ../tgp-request.c:110
msgid "Not registered"
msgstr "Não Registrado"
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Password needed"
msgstr "Senha necessária"
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Enter password for two factor authentication"
msgstr "Insira a senha para o processo de autenticação dupla"
#: ../tgp-request.c:135
#: ../tgp-request.c:123
msgid "Ok"
msgstr "OK"
#: ../tgp-request.c:137
#: ../tgp-request.c:125
msgid ""
"No password set for two factor authentication. Please enter it in the "
"extended settings."
msgstr "Não há senha configurado para o processo de autenticação dupla. Por favor insira nas configurações expandidas."
msgstr ""
"Não há senha configurado para o processo de autenticação dupla. Por favor "
"insira nas configurações expandidas."
#: ../tgp-request.c:139
#: ../tgp-request.c:127
msgid "Password invalid"
msgstr "Senha inválida."
#: ../tgp-request.c:162
#: ../tgp-request.c:150
#, c-format
msgid "Accept secret chat '%s' on this device?"
msgstr "Aceitar conversa Secreta '%s'?"
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid "Secret chat"
msgstr "Conversa Secreta"
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid ""
"Secret chats can only have one end point. If you accept a secret chat on "
"this device, its messages will not be available anywhere else. If you "
"decline, you can still accept the chat on other devices."
msgstr "Conversas secretas podem ocorrer em apenas um local. Se você aceitar uma conversa secreta nesse dispositivo, essas mensagens não estarão disponíveis em nenhum outro local. Se você rejeitar, pode aceitar a conversa em outros dispositivos."
msgstr ""
"Conversas secretas podem ocorrer em apenas um local. Se você aceitar uma "
"conversa secreta nesse dispositivo, essas mensagens não estarão disponíveis "
"em nenhum outro local. Se você rejeitar, pode aceitar a conversa em outros "
"dispositivos."
#: ../tgp-request.c:194
#: ../tgp-request.c:182
msgid ""
"Invite at least one additional user by specifying\n"
" their full name (autocompletion available).\n"
"You can add more users once the chat was created."
msgstr "Convidar ao menos mais um usuário\npelo nome completo (autocompletar disponível).\nVocê pode adicionar mais usuários depois que a conversa for criada."
msgstr ""
"Convidar ao menos mais um usuário\n"
"pelo nome completo (autocompletar disponível).\n"
"Você pode adicionar mais usuários depois que a conversa for criada."
#: ../tgp-request.c:210
#: ../tgp-request.c:185 ../tgp-request.c:189 ../tgp-request.c:193
msgid "Username"
msgstr "Nome de usuário"
#: ../tgp-request.c:198
msgid "Create group chat"
msgstr "Criar conversa em grupo"
#: ../tgp-request.c:210
#: ../tgp-request.c:198
msgid "Invite users"
msgstr "Convidar usuários"
#: ../tgp-request.c:229 ../tgp-request.c:244
#: ../tgp-request.c:217 ../tgp-request.c:232
msgid "Change password"
msgstr "Mudar senha"
#: ../tgp-request.c:231
#: ../tgp-request.c:219
msgid "Current"
msgstr "Atual"
#: ../tgp-request.c:235 ../tgp-request.c:265
#: ../tgp-request.c:223 ../tgp-request.c:253
msgid "Password"
msgstr "Senha"
#: ../tgp-request.c:239 ../tgp-request.c:269
#: ../tgp-request.c:227 ../tgp-request.c:257
msgid "Confirm"
msgstr "Confirma"
#: ../tgp-request.c:263 ../tgp-request.c:274
#: ../tgp-request.c:251 ../tgp-request.c:262
msgid "New password"
msgstr "Nova senha"
@ -429,58 +497,112 @@ msgstr "Nova senha"
#. ask for the phone number directly, cause in that case the account would
#. still be created
#. named with the invalid phone number, even though the login will work
#: ../tgp-request.c:312
#: ../tgp-request.c:300
msgid "Invalid phone number"
msgstr "Número de telefone inválido"
#: ../tgp-request.c:313
#: ../tgp-request.c:301
msgid ""
"Please enter only numbers in the international phone number format, a leading + following by the country prefix and the phone number.\n"
"Do not use any other special chars."
msgstr "Por favor insira apenas número no formato de número telefônico internacional, começando com + seguido pelo código do país e o número do telefone.\nNão use caractéres especiais."
msgstr ""
"Por favor insira apenas número no formato de número telefônico internacional, começando com + seguido pelo código do país e o número do telefone.\n"
"Não use caractéres especiais."
#: ../tgp-request.c:370
msgid "Leave Chat"
msgstr ""
#: ../tgp-request.c:372
msgid "Do you want to leave this chat permantently?"
msgstr ""
#: ../tgp-request.c:377
msgid "Abort Secret Chat"
msgstr ""
#: ../tgp-request.c:379
msgid "Do you want to terminate this secret chat permantently?"
msgstr ""
#: ../tgp-request.c:384
msgid "Delete Contact"
msgstr ""
#: ../tgp-request.c:386
msgid "Do you want to remove this user from your global contact list?"
msgstr ""
#: ../tgp-request.c:401
msgid "Leave Channel"
msgstr ""
#: ../tgp-request.c:403
msgid "Do you want to leave this channel?"
msgstr ""
#. This should be the language's timestamp format. This is preceded by a
#. colon.
#: ../tgp-utils.c:32
#: ../tgp-utils.c:27
msgid "%d.%m.%Y %H:%M"
msgstr "%d.%m.%Y %H:%M"
#. This is preceded by a colon.
#: ../tgp-utils.c:53
#: ../tgp-utils.c:48
msgid "recently"
msgstr "recentemente"
#. This is preceded by a colon.
#: ../tgp-utils.c:57
#: ../tgp-utils.c:52
msgid "last week"
msgstr "semana passada"
#. This is preceded by a colon.
#: ../tgp-utils.c:61
#: ../tgp-utils.c:56
msgid "last month"
msgstr "mês passado"
#. This is preceded by a colon. It refers to a point on time.
#: ../tgp-utils.c:65
#: ../tgp-utils.c:60
msgid "unknown"
msgstr "desconhecido"
#: ../tgp-chat.c:79
#: ../tgp-chat.c:108 ../tgp-chat.c:582
msgid "Telegram Chats"
msgstr ""
#: ../tgp-chat.c:113
msgid "You have already left this chat."
msgstr "Você já saiu dessa conversa."
#: ../tgp-chat.c:127
#: ../tgp-chat.c:224
msgid "Subject:"
msgstr "Assunto:"
#: ../tgp-chat.c:133
#: ../tgp-chat.c:230
msgid "Invite link:"
msgstr "Link do convite:"
#: ../tgp-chat.c:139
#: ../tgp-chat.c:236
msgid "Chat ID:"
msgstr "Identificação da conversa:"
#: ../tgp-chat.c:238
#: ../tgp-chat.c:342
msgid "Supergroup"
msgstr ""
#: ../tgp-chat.c:342
msgid "Channel"
msgstr ""
#: ../tgp-chat.c:345
msgid "Group"
msgstr ""
#: ../tgp-chat.c:367
msgid "Users in chat"
msgstr "Usuários no chat."
#: ../tgp-chat.c:370
msgid "Type"
msgstr ""

View file

@ -1,90 +1,93 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Vladimir <TurbaVladimir@yandex.ru>, 2015
# Yan Pas, 2015
# Сергей <djam5@ya.ru>, 2015
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-21 14:37+0100\n"
"PO-Revision-Date: 2015-12-18 13:13+0000\n"
"Last-Translator: Vladimir <TurbaVladimir@yandex.ru>\n"
"Language-Team: Russian (Russia) (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/ru_RU/)\n"
"POT-Creation-Date: 2016-08-31 22:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: SergeyDjam <djam5@ya.ru>, 2016\n"
"Language-Team: Russian (Russia) (https://www.transifex.com/telegram-purple-developers/teams/53149/ru_RU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru_RU\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
#: ../telegram-base.c:515
#: ../telegram-base.c:500
msgid "Couldn't create group"
msgstr "Не удалось создать группу"
#: ../telegram-base.c:515
#: ../telegram-base.c:501
msgid "Please select at least one other user."
msgstr "Пожалуйста, выберите хотя бы одного другого пользователя."
#: ../telegram-base.c:570
#: ../telegram-base.c:555
msgid "Query Failed"
msgstr "Ошибка запроса"
#: ../telegram-purple.c:193
#: ../telegram-purple.c:162
msgid "Secret chat ready."
msgstr "Секретный чат готов."
#: ../telegram-purple.c:200
#: ../telegram-purple.c:170
msgid "Secret chat terminated."
msgstr "Защищенный чат завершен"
#: ../telegram-purple.c:268
#: ../telegram-purple.c:182
msgid "Telegram"
msgstr "Telegram"
#: ../telegram-purple.c:229
msgid "Message marked as read."
msgstr "Сообщение помечено как прочитанное"
#: ../telegram-purple.c:486
#: ../telegram-purple.c:339
#, c-format
msgid "Invite link: %s"
msgstr "Пригласительная ссылка: %s"
#: ../telegram-purple.c:506 ../telegram-purple.c:507
#. FIXME: Can TGLCHF_MODERATOR export links?
#: ../telegram-purple.c:350
msgid "Creating chat link failed"
msgstr "Не удалось создать ссылку чата"
#: ../telegram-purple.c:508
#: ../telegram-purple.c:351
msgid "You need to be admin of the group to do that."
msgstr "Вы должны быть администратором группы, чтобы сделать это."
#: ../telegram-purple.c:531
#: ../telegram-purple.c:416
msgid "Chat joined"
msgstr "Присоединился к чату"
#: ../telegram-purple.c:532
#: ../telegram-purple.c:417
msgid "Chat added to list of chat rooms."
msgstr "Чат добавлен в список чатов."
#: ../telegram-purple.c:552
#: ../telegram-purple.c:443
msgid "Start secret chat..."
msgstr "Начать секретный чат…"
#. Generate Public Link
#: ../telegram-purple.c:558
#: ../telegram-purple.c:450
msgid "Invite users by link..."
msgstr "Пригласить пользователей по ссылке..."
#. Delete self from chat
#: ../telegram-purple.c:564
#: ../telegram-purple.c:458
msgid "Delete and exit..."
msgstr "Удалить и выйти..."
#: ../telegram-purple.c:632
#: ../telegram-purple.c:546
#, c-format
msgid "Unable to sign on as %s: pubkey not found."
msgstr "Не удается войти как %s: публичный ключ не найден."
msgid "Unable to sign on as %s: file (public key) not found."
msgstr "Не удается войти как %s: файл (публичный ключ) не найден."
#: ../telegram-purple.c:636
#: ../telegram-purple.c:550
#, c-format
msgid ""
"Make sure telegram-purple is installed properly,\n"
@ -92,159 +95,162 @@ msgid ""
"If you're running SELinux (e.g. when using Tails),\n"
"try 'make local_install', or simply copy\n"
"%1$s to %2$s."
msgstr "Убедитесь, что telegram-purple установлен правильно,\nвключая .tglpub файл.\nЕсли вы используете SELinux (например при использовании Tails),\nпопробуйте 'make local_install', или просто скопируйте\n%1$s в %2$s."
msgstr ""
"Убедитесь, что telegram-purple установлен правильно,\n"
"включая .tglpub файл.\n"
"Если вы используете SELinux (например при использовании Tails),\n"
"попробуйте 'make local_install', или просто скопируйте\n"
"%1$s в %2$s."
#: ../telegram-purple.c:657
#: ../telegram-purple.c:572
#, c-format
msgid ""
"Unable to sign on as %s: problem in the underlying library 'tgl'. Please "
"submit a bug report with the debug log."
msgstr ""
#: ../telegram-purple.c:576
msgid "Problem in tgl"
msgstr "Проблема в tgl"
#. TRANSLATORS: Please fill in your own prefix!
#: ../telegram-purple.c:584
#, c-format
msgid ""
"Unable to sign on as %s: phone number lacks country prefix. Numbers must "
"start with the full international prefix code, e.g. +49 for Germany."
msgstr "Не удалось войти как %s: номер телефона не содержит кода страны. Номера должны начинаться с международного кода, +7 для России."
"start with the full international prefix code, e.g. +1 for USA."
msgstr ""
"Не удалось войти как %s: номер телефона не содержит кода страны. Номера "
"должны начинаться с международного кода, +7 для России."
#: ../telegram-purple.c:662
#: ../telegram-purple.c:589
msgid "Incomplete phone number"
msgstr "Неполный номер телефона"
#: ../telegram-purple.c:788 ../telegram-purple.c:789
#: ../telegram-purple.c:642
msgid "Secret chat was already deleted"
msgstr "Секретный чат уже был удален"
#: ../telegram-purple.c:644
msgid "Secret chat is not ready"
msgstr "Секретный чат не готов"
#: ../telegram-purple.c:652
msgid "Only the creator of a channel can post messages."
msgstr "Только создатель канала может отправлять сообщения."
#: ../telegram-purple.c:695
msgid "Cannot invite buddy to chat"
msgstr "Не могу пригласить пользователя в чат"
#: ../telegram-purple.c:790
#: ../telegram-purple.c:696
msgid "Specified user does not exist."
msgstr "Указанный пользователь не существует."
#: ../telegram-purple.c:709
msgid "phone no. (+ country prefix)"
msgstr "номер телефона. (+ префикс страны)"
#. Login
#: ../telegram-purple.c:932
#: ../telegram-purple.c:817
msgid "Password (two factor authentication)"
msgstr "Пароль (двухфакторная аутентификация) "
#: ../telegram-purple.c:938
#: ../telegram-purple.c:822
msgid ""
"Fallback SMS verification\n"
"(Helps when not using Pidgin and you aren't being prompted for the code)"
msgstr "Альтернативная СМС верификация\n(Помогает когда не используется pidgin и вас не просило ввести код)"
msgstr ""
"Альтернативная СМС верификация\n"
"(Помогает когда не используется pidgin и вас не просило ввести код)"
#: ../telegram-purple.c:946
msgid "ask"
msgstr "Спрашивать"
#: ../telegram-purple.c:947
#: ../telegram-purple.c:828
msgid "always"
msgstr "всегда"
#: ../telegram-purple.c:948
#: ../telegram-purple.c:829
msgid "never"
msgstr "никогда"
#: ../telegram-purple.c:950
#: ../telegram-purple.c:830
msgid "ask"
msgstr "Спрашивать"
#: ../telegram-purple.c:832
msgid "Accept secret chats"
msgstr "Присоединится к защищенным чатам"
#: ../telegram-purple.c:955
#: ../telegram-purple.c:836
msgid "Display buddies offline after (days)"
msgstr "Показывать друзей оффлайн через(дней)"
#: ../telegram-purple.c:960
msgid "Fetch past history on first login"
msgstr "Загрузить историю при первом входе"
#: ../telegram-purple.c:965
#: ../telegram-purple.c:840
msgid ""
"Don't fetch history older than (days)\n"
"(0 for unlimited)"
msgstr "Не загружать историю старше N дней\n(0 без ограничений)"
msgstr ""
"Не загружать историю старше N дней\n"
"(0 без ограничений)"
#. Media
#: ../telegram-purple.c:845
msgid "Autoload media size (kb)"
msgstr ""
#. Chats
#: ../telegram-purple.c:973
#: ../telegram-purple.c:850
msgid "Add all group chats to buddy list"
msgstr "Добавить все групповые чаты в контактлист"
#. Read notifications
#: ../telegram-purple.c:981
#: ../telegram-purple.c:855
msgid "Display notices of receipt"
msgstr "Показать уведомления о получении"
#: ../telegram-purple.c:986
#: ../telegram-purple.c:859
msgid "Send notices of receipt when present"
msgstr "Показать уведомления о получении"
#: ../tgp-2prpl.c:178 ../tgp-request.c:108
msgid "First name"
msgstr "Имя"
#: ../telegram-purple.c:884
msgid "Telegram Protocol Plugin."
msgstr "Telegram Protocol Плагин."
#: ../tgp-2prpl.c:179 ../tgp-request.c:111
msgid "Last name"
msgstr "Фамилия"
#: ../tgp-2prpl.c:181
msgid "Name"
msgstr "Ник"
#: ../tgp-2prpl.c:186 ../tgp-request.c:197 ../tgp-request.c:201
#: ../tgp-request.c:205
msgid "Username"
msgstr "Пользователь"
#: ../tgp-2prpl.c:191
msgid "Last seen"
msgstr "Последний раз был в сети"
#: ../tgp-2prpl.c:196
msgid "Phone"
msgstr "Телефон"
#: ../tgp-2prpl.c:208
msgid "Waiting for the user to get online..."
msgstr "Ожидание пользователя..."
#: ../tgp-2prpl.c:212
msgid "Self destruction timer"
msgstr "Таймер самоуничтожения"
#: ../tgp-2prpl.c:218
msgid "Timer is not enabled."
msgstr "Таймер не включен."
#: ../tgp-2prpl.c:225
msgid "Secret key"
msgstr "Секретный ключ"
#: ../tgp-msg.c:72
#: ../tgp-msg.c:58
#, c-format
msgid "%2$s created chat %1$s."
msgstr "%2$s создан чат %1$s."
#: ../tgp-msg.c:75
#: ../tgp-msg.c:61
#, c-format
msgid "%2$s changed title to %1$s."
msgstr "%2$s название изменено на %1$s."
#: ../tgp-msg.c:78
#: ../tgp-msg.c:64
#, c-format
msgid "%s changed photo."
msgstr "%s фото изменено."
#: ../tgp-msg.c:81
#: ../tgp-msg.c:67
#, c-format
msgid "%s deleted photo."
msgstr "%s фото удалено."
#: ../tgp-msg.c:89
#: ../tgp-msg.c:75
#, c-format
msgid "%1$s added user %2$s by link."
msgstr "%1$s пользователи добавлены %2$s по ссылке"
#: ../tgp-msg.c:102
#: ../tgp-msg.c:90
#, c-format
msgid "%2$s added user %1$s."
msgstr "%2$s пользователь добавлен %1$s."
#: ../tgp-msg.c:125 ../tgp-msg.c:140
#: ../tgp-msg.c:114 ../tgp-msg.c:131
#, c-format
msgid "%2$s deleted user %1$s."
msgstr "%2$s пользователи удалены %1$s."
#: ../tgp-msg.c:146
#: ../tgp-msg.c:138
#, c-format
msgid "%2$s set self destruction timer to %1$d second."
msgid_plural "%2$s set self destruction timer to %1$d seconds."
@ -253,7 +259,7 @@ msgstr[1] "%2$s установил таймер самоуничтожения
msgstr[2] "%2$s установил таймер самоуничтожения на %1$d секунд."
msgstr[3] "%2$s установил таймер самоуничтожения на %1$d секунд."
#: ../tgp-msg.c:152
#: ../tgp-msg.c:144
#, c-format
msgid "%2$s marked %1$d message read."
msgid_plural "%2$s marked %1$d messages read."
@ -262,7 +268,7 @@ msgstr[1] "%2$s пометил %1$d сообщения прочитанными.
msgstr[2] "%2$s пометил %1$d сообщений прочитанными."
msgstr[3] "%2$s пометил %1$d сообщений прочитанными."
#: ../tgp-msg.c:158
#: ../tgp-msg.c:150
#, c-format
msgid "%2$s deleted %1$d message."
msgid_plural "%2$s deleted %1$d messages."
@ -271,7 +277,7 @@ msgstr[1] "%2$s удалил %1$d сообщения."
msgstr[2] "%2$s удалил %1$d сообщений."
msgstr[3] "%2$s удалил %1$d сообщений."
#: ../tgp-msg.c:164
#: ../tgp-msg.c:156
#, c-format
msgid "%2$s made a screenshot of %1$d message."
msgid_plural "%2$s made a screenshot of %1$d messages."
@ -280,156 +286,218 @@ msgstr[1] "%2$s сделал скриншот %1$d сообщений."
msgstr[2] "%2$s сделал скриншот %1$d сообщений."
msgstr[3] "%2$s сделал скриншот %1$d сообщений."
#: ../tgp-msg.c:162
#, c-format
msgid "Channel %1$s created"
msgstr "Канал %1$s создан"
#. FIXME: check if this makes sense
#: ../tgp-msg.c:165 ../tgp-chat.c:124 ../tgp-chat.c:576
msgid "Telegram Channels"
msgstr "Telegram Каналы"
#: ../tgp-msg.c:191
msgid "Sending message failed."
msgstr "Отправка сообщения не удалась."
#: ../tgp-msg.c:296
#: ../tgp-msg.c:253
msgid "Sending image failed."
msgstr "Ошибка при отправке изображения."
#: ../tgp-msg.c:310
msgid "Sorry, sending documents to encrypted chats not yet supported."
msgstr "Извините, отправка документов в секретных чатах пока не поддерживается."
#: ../tgp-msg.c:400
#: ../tgp-msg.c:417
#, c-format
msgid "%s sent a sticker."
msgstr "%s отправил стикер."
#: ../tgp-net.c:286
#: ../tgp-msg.c:463
msgid "failed loading message"
msgstr "не удалось загрузить сообщения"
#: ../tgp-msg.c:498
msgid "[animation]"
msgstr "[анимация]"
#: ../tgp-msg.c:515
msgid "[audio]"
msgstr "[аудио]"
#: ../tgp-msg.c:515
msgid "[video]"
msgstr "[видео]"
#: ../tgp-msg.c:604
#, c-format
msgid "<b>Forwarded message from: %s</b><br>%s"
msgstr ""
#. FIXME: sometimes users aren't part of the response when receiving a
#. forwarded message
#: ../tgp-msg.c:607
#, c-format
msgid "<b>Forwarded message:</b><br>%s"
msgstr ""
#: ../tgp-msg.c:720
msgid "loading document or picture failed"
msgstr "загрузка документа или изображения не удалась"
#: ../tgp-net.c:281
msgid "Cannot connect to main server"
msgstr "Не удается подключится к главному серверу"
#: ../tgp-net.c:342
#: ../tgp-net.c:322
msgid "Cannot connect to server: Ping timeout."
msgstr "Не удается подключиться к серверу: пинг тайм-аут."
#: ../tgp-net.c:387
#: ../tgp-net.c:365
msgid "Lost connection to the server..."
msgstr "Потеряно соединение с сервером..."
#: ../tgp-request.c:64
#: ../tgp-request.c:51
msgid ""
"Telegram wants to verify your identity. Please enter the login code that you"
" have received via SMS."
msgstr "Telegram хочет проверить вашу личность. Пожалуйста введите код, полученный вами через СМС."
msgstr ""
"Telegram хочет проверить вашу личность. Пожалуйста введите код, полученный "
"вами через СМС."
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Login code"
msgstr "Код входа"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Enter login code"
msgstr "Введите код входа"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "the code"
msgstr "код"
#: ../tgp-request.c:67 ../tgp-request.c:116 ../tgp-request.c:210
#: ../tgp-request.c:245 ../tgp-request.c:275
#: ../tgp-request.c:54 ../tgp-request.c:104 ../tgp-request.c:198
#: ../tgp-request.c:233 ../tgp-request.c:263
msgid "OK"
msgstr "Подтвердить"
#: ../tgp-request.c:68 ../tgp-request.c:116 ../tgp-request.c:135
#: ../tgp-request.c:211 ../tgp-request.c:246 ../tgp-request.c:276
#: ../tgp-request.c:55 ../tgp-request.c:104 ../tgp-request.c:123
#: ../tgp-request.c:199 ../tgp-request.c:234 ../tgp-request.c:264
msgid "Cancel"
msgstr "Отмена"
#: ../tgp-request.c:107
#: ../tgp-request.c:95
msgid "Registration"
msgstr "Регистрация"
#: ../tgp-request.c:115
#: ../tgp-request.c:96
msgid "First name"
msgstr "Имя"
#: ../tgp-request.c:99
msgid "Last name"
msgstr "Фамилия"
#: ../tgp-request.c:103
msgid "Register"
msgstr "Зарегистрирован"
#: ../tgp-request.c:115
#: ../tgp-request.c:103
msgid "Please register your phone number."
msgstr "Пожалуйста, зарегистрируйте свой номер телефона."
#. purple_request API not available
#: ../tgp-request.c:120
#: ../tgp-request.c:108
msgid ""
"Phone number is not registered. Please register your phone on a different "
"client."
msgstr "Номер телефона не зарегистрирован. Пожалуйста зарегистрируйте ваш телефон в другом клиенте."
msgstr ""
"Номер телефона не зарегистрирован. Пожалуйста зарегистрируйте ваш телефон в "
"другом клиенте."
#: ../tgp-request.c:122
#: ../tgp-request.c:110
msgid "Not registered"
msgstr "Не зарегистрирован"
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Password needed"
msgstr "Необходим пароль"
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Enter password for two factor authentication"
msgstr "Введите пароль для двухфакторной аутентификации"
#: ../tgp-request.c:135
#: ../tgp-request.c:123
msgid "Ok"
msgstr "Ок"
#: ../tgp-request.c:137
#: ../tgp-request.c:125
msgid ""
"No password set for two factor authentication. Please enter it in the "
"extended settings."
msgstr "Не указан пароль для двухфакторной аутентификации. Пожалуйста введите его в расширенных настройках."
msgstr ""
"Не указан пароль для двухфакторной аутентификации. Пожалуйста введите его в "
"расширенных настройках."
#: ../tgp-request.c:139
#: ../tgp-request.c:127
msgid "Password invalid"
msgstr "Неверный пароль"
#: ../tgp-request.c:162
#: ../tgp-request.c:150
#, c-format
msgid "Accept secret chat '%s' on this device?"
msgstr "Присоединится к секретному чату '%s' на этом устройстве?"
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid "Secret chat"
msgstr "Секретный чат"
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid ""
"Secret chats can only have one end point. If you accept a secret chat on "
"this device, its messages will not be available anywhere else. If you "
"decline, you can still accept the chat on other devices."
msgstr "Секретные чаты могут иметь только одну конечную точку. Если вы подтвердите секретный чат на этом устройстве, то его сообщения будут недоступны нигде больше. Если вы отклоните, то вы сможете принять этот чат на других устройствах."
msgstr ""
"Секретные чаты могут иметь только одну конечную точку. Если вы подтвердите "
"секретный чат на этом устройстве, то его сообщения будут недоступны нигде "
"больше. Если вы отклоните, то вы сможете принять этот чат на других "
"устройствах."
#: ../tgp-request.c:194
#: ../tgp-request.c:182
msgid ""
"Invite at least one additional user by specifying\n"
" their full name (autocompletion available).\n"
"You can add more users once the chat was created."
msgstr "Пригласите хотя бы одного дополнительного пользователя, указав их полные имена (автодополнение доступно).\nВы можете добавить больше пользователей после создания чата."
msgstr ""
"Пригласите хотя бы одного дополнительного пользователя, указав их полные имена (автодополнение доступно).\n"
"Вы можете добавить больше пользователей после создания чата."
#: ../tgp-request.c:210
#: ../tgp-request.c:185 ../tgp-request.c:189 ../tgp-request.c:193
msgid "Username"
msgstr "Пользователь"
#: ../tgp-request.c:198
msgid "Create group chat"
msgstr "Создать групповой чат"
#: ../tgp-request.c:210
#: ../tgp-request.c:198
msgid "Invite users"
msgstr "Приглашенные собеседники"
#: ../tgp-request.c:229 ../tgp-request.c:244
#: ../tgp-request.c:217 ../tgp-request.c:232
msgid "Change password"
msgstr "Сменить пароль"
#: ../tgp-request.c:231
#: ../tgp-request.c:219
msgid "Current"
msgstr "Текущий"
#: ../tgp-request.c:235 ../tgp-request.c:265
#: ../tgp-request.c:223 ../tgp-request.c:253
msgid "Password"
msgstr "Пароль"
#: ../tgp-request.c:239 ../tgp-request.c:269
#: ../tgp-request.c:227 ../tgp-request.c:257
msgid "Confirm"
msgstr "Подтвердить"
#: ../tgp-request.c:263 ../tgp-request.c:274
#: ../tgp-request.c:251 ../tgp-request.c:262
msgid "New password"
msgstr "Новый пароль"
@ -438,58 +506,114 @@ msgstr "Новый пароль"
#. ask for the phone number directly, cause in that case the account would
#. still be created
#. named with the invalid phone number, even though the login will work
#: ../tgp-request.c:312
#: ../tgp-request.c:300
msgid "Invalid phone number"
msgstr "Неправильный номер телефона"
#: ../tgp-request.c:313
#: ../tgp-request.c:301
msgid ""
"Please enter only numbers in the international phone number format, a leading + following by the country prefix and the phone number.\n"
"Do not use any other special chars."
msgstr "Пожалуйста, введите только цифры в международном формате телефонного номера. Начиная с +, префикса страны и заканчивая телефонным номером. \nНе используйте никакие другие специальные символы."
msgstr ""
"Пожалуйста, введите только цифры в международном формате телефонного номера. Начиная с +, префикса страны и заканчивая телефонным номером. \n"
"Не используйте никакие другие специальные символы."
#: ../tgp-request.c:370
msgid "Leave Chat"
msgstr "Покинуть Чат"
#: ../tgp-request.c:372
msgid "Do you want to leave this chat permantently?"
msgstr "Вы хотите покинуть этот чат навсегда?"
#: ../tgp-request.c:377
msgid "Abort Secret Chat"
msgstr "Отменить Секретный Чат"
#: ../tgp-request.c:379
msgid "Do you want to terminate this secret chat permantently?"
msgstr "Вы хотите отменить этот чат навсегда?"
#: ../tgp-request.c:384
msgid "Delete Contact"
msgstr "Удалить Контакт"
#: ../tgp-request.c:386
msgid "Do you want to remove this user from your global contact list?"
msgstr ""
"Вы хотите удалить этого пользователья из вашего глобального списка контактов"
" навсегда?"
#: ../tgp-request.c:401
msgid "Leave Channel"
msgstr "Покинуть Канал"
#: ../tgp-request.c:403
msgid "Do you want to leave this channel?"
msgstr "Вы хотите покинуть этот канал?"
#. This should be the language's timestamp format. This is preceded by a
#. colon.
#: ../tgp-utils.c:32
#: ../tgp-utils.c:27
msgid "%d.%m.%Y %H:%M"
msgstr "%d.%m.%Y %H:%M"
#. This is preceded by a colon.
#: ../tgp-utils.c:53
#: ../tgp-utils.c:48
msgid "recently"
msgstr "недавно"
#. This is preceded by a colon.
#: ../tgp-utils.c:57
#: ../tgp-utils.c:52
msgid "last week"
msgstr "последняя неделя"
#. This is preceded by a colon.
#: ../tgp-utils.c:61
#: ../tgp-utils.c:56
msgid "last month"
msgstr "последний месяц"
#. This is preceded by a colon. It refers to a point on time.
#: ../tgp-utils.c:65
#: ../tgp-utils.c:60
msgid "unknown"
msgstr "неизвестно"
#: ../tgp-chat.c:79
#: ../tgp-chat.c:108 ../tgp-chat.c:582
msgid "Telegram Chats"
msgstr "Telegram Чаты"
#: ../tgp-chat.c:113
msgid "You have already left this chat."
msgstr "Вы уже покинули этот чат."
#: ../tgp-chat.c:127
#: ../tgp-chat.c:224
msgid "Subject:"
msgstr "Заголовок:"
#: ../tgp-chat.c:133
#: ../tgp-chat.c:230
msgid "Invite link:"
msgstr "Пригласительная ссылка:"
#: ../tgp-chat.c:139
#: ../tgp-chat.c:236
msgid "Chat ID:"
msgstr "Чат ID:"
#: ../tgp-chat.c:238
#: ../tgp-chat.c:342
msgid "Supergroup"
msgstr "Супергруппа"
#: ../tgp-chat.c:342
msgid "Channel"
msgstr "Канал"
#: ../tgp-chat.c:345
msgid "Group"
msgstr "Группа"
#: ../tgp-chat.c:367
msgid "Users in chat"
msgstr "Пользователи в чате"
#: ../tgp-chat.c:370
msgid "Type"
msgstr ""

451
po/sq.po
View file

@ -1,90 +1,93 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Besnik <besnik@programeshqip.org>, 2015
# Besnik <besnik@programeshqip.org>, 2015
# M J <mtthsjntsch@gmail.com>, 2015
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-21 14:37+0100\n"
"PO-Revision-Date: 2015-12-18 13:05+0000\n"
"Last-Translator: Besnik <besnik@programeshqip.org>\n"
"Language-Team: Albanian (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/sq/)\n"
"POT-Creation-Date: 2016-08-31 22:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Besnik <besnik@programeshqip.org>, 2016\n"
"Language-Team: Albanian (https://www.transifex.com/telegram-purple-developers/teams/53149/sq/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sq\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../telegram-base.c:515
#: ../telegram-base.c:500
msgid "Couldn't create group"
msgstr "Su krijua dot grup"
#: ../telegram-base.c:515
#: ../telegram-base.c:501
msgid "Please select at least one other user."
msgstr "Ju lutemi, përzgjidhni të paktën një përdorues tjetër."
#: ../telegram-base.c:570
#: ../telegram-base.c:555
msgid "Query Failed"
msgstr "Kërkesa Dështoi"
#: ../telegram-purple.c:193
#: ../telegram-purple.c:162
msgid "Secret chat ready."
msgstr "Fjalosje e fshehtë gati."
#: ../telegram-purple.c:200
#: ../telegram-purple.c:170
msgid "Secret chat terminated."
msgstr "Fjalosja e fshehtë përfundoi."
#: ../telegram-purple.c:268
#: ../telegram-purple.c:182
msgid "Telegram"
msgstr "Telegram"
#: ../telegram-purple.c:229
msgid "Message marked as read."
msgstr "Mesazh i shënuar si i lexuar."
#: ../telegram-purple.c:486
#: ../telegram-purple.c:339
#, c-format
msgid "Invite link: %s"
msgstr "Lidhje ftese: %s"
#: ../telegram-purple.c:506 ../telegram-purple.c:507
#. FIXME: Can TGLCHF_MODERATOR export links?
#: ../telegram-purple.c:350
msgid "Creating chat link failed"
msgstr "Krijimi i lidhjes së fjalosjes dështoi"
#: ../telegram-purple.c:508
#: ../telegram-purple.c:351
msgid "You need to be admin of the group to do that."
msgstr "Lypset të jeni përgjegjës grupi që të bëni këtë."
#: ../telegram-purple.c:531
#: ../telegram-purple.c:416
msgid "Chat joined"
msgstr "U hy në fjalosje"
#: ../telegram-purple.c:532
#: ../telegram-purple.c:417
msgid "Chat added to list of chat rooms."
msgstr "Fjalosja u shtua te listë dhomash fjalosjeje."
#: ../telegram-purple.c:552
#: ../telegram-purple.c:443
msgid "Start secret chat..."
msgstr "Filloni fjalosje të fshehtë..."
#. Generate Public Link
#: ../telegram-purple.c:558
#: ../telegram-purple.c:450
msgid "Invite users by link..."
msgstr "Ftoni përdorues përmes lidhjesh..."
#. Delete self from chat
#: ../telegram-purple.c:564
#: ../telegram-purple.c:458
msgid "Delete and exit..."
msgstr "Fshije dhe dil..."
#: ../telegram-purple.c:632
#: ../telegram-purple.c:546
#, c-format
msgid "Unable to sign on as %s: pubkey not found."
msgstr "I pazoti të hyjë si %s: su gjet pubkey."
msgid "Unable to sign on as %s: file (public key) not found."
msgstr "Sarrin të bëhet hyrja si %s: su gjet kartelë (kyç publik)."
#: ../telegram-purple.c:636
#: ../telegram-purple.c:550
#, c-format
msgid ""
"Make sure telegram-purple is installed properly,\n"
@ -92,336 +95,406 @@ msgid ""
"If you're running SELinux (e.g. when using Tails),\n"
"try 'make local_install', or simply copy\n"
"%1$s to %2$s."
msgstr "Sigurohuni që telegram-purple është instaluar si duhet,\npërfshi këtu kartelën .tglpub.\nNëse xhironi SELinux (p.sh. kur përdorni Tails),\nprovoni 'make local_install', ose thjesht kopjoni\n%1$s te %2$s."
msgstr ""
"Sigurohuni që telegram-purple është instaluar si duhet,\n"
"përfshi këtu kartelën .tglpub.\n"
"Nëse xhironi SELinux (p.sh. kur përdorni Tails),\n"
"provoni 'make local_install', ose thjesht kopjoni\n"
"%1$s te %2$s."
#: ../telegram-purple.c:657
#: ../telegram-purple.c:572
#, c-format
msgid ""
"Unable to sign on as %s: problem in the underlying library 'tgl'. Please "
"submit a bug report with the debug log."
msgstr ""
"Sarrihet të hyhet si %s: problem në librarinë përkatëse 'tgl'. Ju lutemi, "
"parashtroni një njoftim të metash të shoqëruar nga regjistrimi i "
"diagnostikimit."
#: ../telegram-purple.c:576
msgid "Problem in tgl"
msgstr "Problem në tgl"
#. TRANSLATORS: Please fill in your own prefix!
#: ../telegram-purple.c:584
#, c-format
msgid ""
"Unable to sign on as %s: phone number lacks country prefix. Numbers must "
"start with the full international prefix code, e.g. +49 for Germany."
msgstr "I pazoti të hyjë si %s: numrit të telefonit i mungon prefiksi i vendit. Numrat duhet të fillojnë me kodin e plotë prefiks ndërkombëtar, p.sh. +49 për Gjermaninë."
"start with the full international prefix code, e.g. +1 for USA."
msgstr ""
"I pazoti të hyjë si %s: numrit të telefonit i mungon prefiksi i vendit. "
"Numrat duhet të fillojnë me kodin e plotë prefiksi ndërkombëtar, p.sh. +355 "
"për Shqipërinë."
#: ../telegram-purple.c:662
#: ../telegram-purple.c:589
msgid "Incomplete phone number"
msgstr "Numër telefoni jo i plotë"
#: ../telegram-purple.c:788 ../telegram-purple.c:789
#: ../telegram-purple.c:642
msgid "Secret chat was already deleted"
msgstr "Fjalosja e fshehtë qe fshirë tashmë"
#: ../telegram-purple.c:644
msgid "Secret chat is not ready"
msgstr "Fjalosja e fshehtë sështë gati"
#: ../telegram-purple.c:652
msgid "Only the creator of a channel can post messages."
msgstr "Mesazhe mund të postojë vetëm krijuesi i një kanali."
#: ../telegram-purple.c:695
msgid "Cannot invite buddy to chat"
msgstr "Sftohet dot shok në fjalosje"
#: ../telegram-purple.c:790
#: ../telegram-purple.c:696
msgid "Specified user does not exist."
msgstr "Përdoruesi i treguar nuk ekziston."
#: ../telegram-purple.c:709
msgid "phone no. (+ country prefix)"
msgstr "nr. telefoni (+ prefiks vendi)"
#. Login
#: ../telegram-purple.c:932
#: ../telegram-purple.c:817
msgid "Password (two factor authentication)"
msgstr "Fjalëkalim (mirëfilltësim dyfaktorësh)"
#: ../telegram-purple.c:938
#: ../telegram-purple.c:822
msgid ""
"Fallback SMS verification\n"
"(Helps when not using Pidgin and you aren't being prompted for the code)"
msgstr "Kalim vetvetiu për verfikime SMS\n(I dobishëm kur spërdoret Pidgin-i dhe nuk ju kërkohet kod)"
msgstr ""
"Kalim vetvetiu për verfikime SMS\n"
"(I dobishëm kur spërdoret Pidgin-i dhe nuk ju kërkohet kod)"
#: ../telegram-purple.c:946
msgid "ask"
msgstr "pyet"
#: ../telegram-purple.c:947
#: ../telegram-purple.c:828
msgid "always"
msgstr "përherë"
#: ../telegram-purple.c:948
#: ../telegram-purple.c:829
msgid "never"
msgstr "kurrë"
#: ../telegram-purple.c:950
#: ../telegram-purple.c:830
msgid "ask"
msgstr "pyet"
#: ../telegram-purple.c:832
msgid "Accept secret chats"
msgstr "Prano fjalosje të fshehta"
#: ../telegram-purple.c:955
#: ../telegram-purple.c:836
msgid "Display buddies offline after (days)"
msgstr "Shfaqi shokët si jo të lidhur pas (ditësh)"
#: ../telegram-purple.c:960
msgid "Fetch past history on first login"
msgstr "Sill historik të kaluar gjatë hyrjes së parë"
#: ../telegram-purple.c:965
#: ../telegram-purple.c:840
msgid ""
"Don't fetch history older than (days)\n"
"(0 for unlimited)"
msgstr "Mos sill historik më të vjetë se (ditë)\n(0 për pa kufizim)"
msgstr ""
"Mos sill historik më të vjetë se (ditë)\n"
"(0 për pa kufizim)"
#. Media
#: ../telegram-purple.c:845
msgid "Autoload media size (kb)"
msgstr "Madhësi media që vetëluhet (kb)"
#. Chats
#: ../telegram-purple.c:973
#: ../telegram-purple.c:850
msgid "Add all group chats to buddy list"
msgstr "Shtoji krejt fjalosjet e grupit te lista e shokëve"
#. Read notifications
#: ../telegram-purple.c:981
#: ../telegram-purple.c:855
msgid "Display notices of receipt"
msgstr "Shfaq njoftime dëftese"
#: ../telegram-purple.c:986
#: ../telegram-purple.c:859
msgid "Send notices of receipt when present"
msgstr "Dërgo njoftime dëftese kur ka"
#: ../tgp-2prpl.c:178 ../tgp-request.c:108
msgid "First name"
msgstr "Emër"
#: ../telegram-purple.c:884
msgid "Telegram Protocol Plugin."
msgstr "Shtojcë Protokolli Telegram."
#: ../tgp-2prpl.c:179 ../tgp-request.c:111
msgid "Last name"
msgstr "Mbiemër"
#: ../tgp-2prpl.c:181
msgid "Name"
msgstr "Emër"
#: ../tgp-2prpl.c:186 ../tgp-request.c:197 ../tgp-request.c:201
#: ../tgp-request.c:205
msgid "Username"
msgstr "Emër përdoruesi"
#: ../tgp-2prpl.c:191
msgid "Last seen"
msgstr "Parë së fundi"
#: ../tgp-2prpl.c:196
msgid "Phone"
msgstr "Telefon"
#: ../tgp-2prpl.c:208
msgid "Waiting for the user to get online..."
msgstr "Po pritet që përdoruesit të lidhen në Internet..."
#: ../tgp-2prpl.c:212
msgid "Self destruction timer"
msgstr "Kohëmatës vetëshkatërrimi"
#: ../tgp-2prpl.c:218
msgid "Timer is not enabled."
msgstr "Kohëmatësi sështë aktivizuar."
#: ../tgp-2prpl.c:225
msgid "Secret key"
msgstr "Kyç i fshehtë"
#: ../tgp-msg.c:72
#: ../tgp-msg.c:58
#, c-format
msgid "%2$s created chat %1$s."
msgstr "%2$s krijoi fjalosjen %1$s."
#: ../tgp-msg.c:75
#: ../tgp-msg.c:61
#, c-format
msgid "%2$s changed title to %1$s."
msgstr "%2$s ndryshoi titullin te %1$s."
#: ../tgp-msg.c:78
#: ../tgp-msg.c:64
#, c-format
msgid "%s changed photo."
msgstr "%s ndryshoi foton."
#: ../tgp-msg.c:81
#: ../tgp-msg.c:67
#, c-format
msgid "%s deleted photo."
msgstr "%s fshiu foton."
#: ../tgp-msg.c:89
#: ../tgp-msg.c:75
#, c-format
msgid "%1$s added user %2$s by link."
msgstr "%1$s shtoi përdoruesin %2$s përmes lidhjeje."
#: ../tgp-msg.c:102
#: ../tgp-msg.c:90
#, c-format
msgid "%2$s added user %1$s."
msgstr "%2$s shtoi përdoruesin %1$s."
#: ../tgp-msg.c:125 ../tgp-msg.c:140
#: ../tgp-msg.c:114 ../tgp-msg.c:131
#, c-format
msgid "%2$s deleted user %1$s."
msgstr "%2$s fshiu përdoruesin %1$s."
#: ../tgp-msg.c:146
#: ../tgp-msg.c:138
#, c-format
msgid "%2$s set self destruction timer to %1$d second."
msgid_plural "%2$s set self destruction timer to %1$d seconds."
msgstr[0] "%2$s e vendosi kohëmatësin e vetëshkatërrimit në %1$d sekondë."
msgstr[1] "%2$s e vendosi kohëmatësin e vetëshkatërrimit në %1$d sekonda."
#: ../tgp-msg.c:152
#: ../tgp-msg.c:144
#, c-format
msgid "%2$s marked %1$d message read."
msgid_plural "%2$s marked %1$d messages read."
msgstr[0] "%2$s shënoi %1$d mesazh si të lexuar."
msgstr[1] "%2$s shënoi %1$d mesazhe si të lexuar."
#: ../tgp-msg.c:158
#: ../tgp-msg.c:150
#, c-format
msgid "%2$s deleted %1$d message."
msgid_plural "%2$s deleted %1$d messages."
msgstr[0] "%2$s fshiu %1$d mesazh."
msgstr[1] "%2$s fshiu %1$d mesazhe."
#: ../tgp-msg.c:164
#: ../tgp-msg.c:156
#, c-format
msgid "%2$s made a screenshot of %1$d message."
msgid_plural "%2$s made a screenshot of %1$d messages."
msgstr[0] "%2$s bëri një foto ekrani të %1$d mesazhi."
msgstr[1] "%2$s bëri një foto ekrani të %1$d mesazheve."
#: ../tgp-msg.c:162
#, c-format
msgid "Channel %1$s created"
msgstr "Kanali %1$s u krijua"
#. FIXME: check if this makes sense
#: ../tgp-msg.c:165 ../tgp-chat.c:124 ../tgp-chat.c:576
msgid "Telegram Channels"
msgstr "Kanale Telegram-i"
#: ../tgp-msg.c:191
msgid "Sending message failed."
msgstr "Dërgimi i mesazhit dështoi."
#: ../tgp-msg.c:296
#: ../tgp-msg.c:253
msgid "Sending image failed."
msgstr "Dërgimi i figurës dështoi."
#: ../tgp-msg.c:310
msgid "Sorry, sending documents to encrypted chats not yet supported."
msgstr "Na ndjeni, dërgimi i dokumenteve në fjalosje të fshehtëzuara nuk mbulohet ende."
#: ../tgp-msg.c:400
#: ../tgp-msg.c:417
#, c-format
msgid "%s sent a sticker."
msgstr "%s dërgoi një ngjitëse."
#: ../tgp-net.c:286
#: ../tgp-msg.c:463
msgid "failed loading message"
msgstr "dështoi në ngarkim mesazhi"
#: ../tgp-msg.c:498
msgid "[animation]"
msgstr "[animacion]"
#: ../tgp-msg.c:515
msgid "[audio]"
msgstr "[audio]"
#: ../tgp-msg.c:515
msgid "[video]"
msgstr "[video]"
#: ../tgp-msg.c:604
#, c-format
msgid "<b>Forwarded message from: %s</b><br>%s"
msgstr "<b>Mesazh i përcjellë nga: %s</b><br>%s"
#. FIXME: sometimes users aren't part of the response when receiving a
#. forwarded message
#: ../tgp-msg.c:607
#, c-format
msgid "<b>Forwarded message:</b><br>%s"
msgstr "<b>Mesazh i përcjellë:</b><br>%s"
#: ../tgp-msg.c:720
msgid "loading document or picture failed"
msgstr "Ngarkimi i dokumentit ose fotos dështoi"
#: ../tgp-net.c:281
msgid "Cannot connect to main server"
msgstr "Slidhet dot te shërbyesi kryesor"
#: ../tgp-net.c:342
#: ../tgp-net.c:322
msgid "Cannot connect to server: Ping timeout."
msgstr "Slidhet dot te shërbyesi: Ping-ut i mbaroi koha."
#: ../tgp-net.c:387
#: ../tgp-net.c:365
msgid "Lost connection to the server..."
msgstr "Humbi lidhja me shërbyesin..."
#: ../tgp-request.c:64
#: ../tgp-request.c:51
msgid ""
"Telegram wants to verify your identity. Please enter the login code that you"
" have received via SMS."
msgstr "Telegram-i dëshiron të verifikojë identitetin tuaj. Ju lutemi, jepni kodin e hyrjes që keni marrë përmes SMS-je."
msgstr ""
"Telegram-i dëshiron të verifikojë identitetin tuaj. Ju lutemi, jepni kodin e"
" hyrjes që keni marrë përmes SMS-je."
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Login code"
msgstr "Kod hyrjeje"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Enter login code"
msgstr "Jepni kodin e hyrjes postar"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "the code"
msgstr "kodi"
#: ../tgp-request.c:67 ../tgp-request.c:116 ../tgp-request.c:210
#: ../tgp-request.c:245 ../tgp-request.c:275
#: ../tgp-request.c:54 ../tgp-request.c:104 ../tgp-request.c:198
#: ../tgp-request.c:233 ../tgp-request.c:263
msgid "OK"
msgstr "OK"
#: ../tgp-request.c:68 ../tgp-request.c:116 ../tgp-request.c:135
#: ../tgp-request.c:211 ../tgp-request.c:246 ../tgp-request.c:276
#: ../tgp-request.c:55 ../tgp-request.c:104 ../tgp-request.c:123
#: ../tgp-request.c:199 ../tgp-request.c:234 ../tgp-request.c:264
msgid "Cancel"
msgstr "Anuloje"
#: ../tgp-request.c:107
#: ../tgp-request.c:95
msgid "Registration"
msgstr "Regjistrim"
#: ../tgp-request.c:115
#: ../tgp-request.c:96
msgid "First name"
msgstr "Emër"
#: ../tgp-request.c:99
msgid "Last name"
msgstr "Mbiemër"
#: ../tgp-request.c:103
msgid "Register"
msgstr "Regjistrohuni"
#: ../tgp-request.c:115
#: ../tgp-request.c:103
msgid "Please register your phone number."
msgstr "Ju lutemi, regjistroni numrin tuaj të telefonit."
#. purple_request API not available
#: ../tgp-request.c:120
#: ../tgp-request.c:108
msgid ""
"Phone number is not registered. Please register your phone on a different "
"client."
msgstr "Numri i telefonit sështë i regjistruar. Ju lutemi, regjistroni telefonin tuaj me një klient tjetër."
msgstr ""
"Numri i telefonit sështë i regjistruar. Ju lutemi, regjistroni telefonin "
"tuaj me një klient tjetër."
#: ../tgp-request.c:122
#: ../tgp-request.c:110
msgid "Not registered"
msgstr "I paregjistruar"
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Password needed"
msgstr "Lypset fjalëkalim"
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Enter password for two factor authentication"
msgstr "Jepni fjalëkalim për mirëfilltësim dyfaktorësh"
#: ../tgp-request.c:135
#: ../tgp-request.c:123
msgid "Ok"
msgstr "Ok"
#: ../tgp-request.c:137
#: ../tgp-request.c:125
msgid ""
"No password set for two factor authentication. Please enter it in the "
"extended settings."
msgstr "Pa fjalëkalim të caktuar, për mirëfilltësim dyfaktorësh. Ju lutemi, jepeni te rregullimet e thelluara."
msgstr ""
"Pa fjalëkalim të caktuar, për mirëfilltësim dyfaktorësh. Ju lutemi, jepeni "
"te rregullimet e thelluara."
#: ../tgp-request.c:139
#: ../tgp-request.c:127
msgid "Password invalid"
msgstr "Fjalëkalim i pavlefshëm"
#: ../tgp-request.c:162
#: ../tgp-request.c:150
#, c-format
msgid "Accept secret chat '%s' on this device?"
msgstr "Të pranohet fjalosja e fshehtë '%s' në këtë pajisje?"
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid "Secret chat"
msgstr "Fjalosje e fshehtë"
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid ""
"Secret chats can only have one end point. If you accept a secret chat on "
"this device, its messages will not be available anywhere else. If you "
"decline, you can still accept the chat on other devices."
msgstr "Fjalosjet e fshehta mund të kenë vetëm një pikë marrjeje. Nëse pranoni një fjalosje të fshehtë në këtë pajisje, mesazhet e saj nuk do të jenë të dukshme gjetiu. Nëse nuk e pranoni, mund ta pranoni fjalosjen në pajisje të tjera."
msgstr ""
"Fjalosjet e fshehta mund të kenë vetëm një pikë marrjeje. Nëse pranoni një "
"fjalosje të fshehtë në këtë pajisje, mesazhet e saj nuk do të jenë të "
"dukshme gjetiu. Nëse nuk e pranoni, mund ta pranoni fjalosjen në pajisje të "
"tjera."
#: ../tgp-request.c:194
#: ../tgp-request.c:182
msgid ""
"Invite at least one additional user by specifying\n"
" their full name (autocompletion available).\n"
"You can add more users once the chat was created."
msgstr "Ftoni të paktën një përdorues shtesë duke dhënë\n emrat e tyre të plotë (mund të përdoret vetëplotësimi).\nPasi fjalosja të jetë krijuar, mund të shtoni më tepër përdorues."
msgstr ""
"Ftoni të paktën një përdorues shtesë duke dhënë\n"
" emrat e tyre të plotë (mund të përdoret vetëplotësimi).\n"
"Pasi fjalosja të jetë krijuar, mund të shtoni më tepër përdorues."
#: ../tgp-request.c:210
#: ../tgp-request.c:185 ../tgp-request.c:189 ../tgp-request.c:193
msgid "Username"
msgstr "Emër përdoruesi"
#: ../tgp-request.c:198
msgid "Create group chat"
msgstr "Krijoni fjalosje grupi"
#: ../tgp-request.c:210
#: ../tgp-request.c:198
msgid "Invite users"
msgstr "Ftoni përdorues"
#: ../tgp-request.c:229 ../tgp-request.c:244
#: ../tgp-request.c:217 ../tgp-request.c:232
msgid "Change password"
msgstr "Ndryshoni fjalëkalimin"
#: ../tgp-request.c:231
#: ../tgp-request.c:219
msgid "Current"
msgstr "I tanishmi"
#: ../tgp-request.c:235 ../tgp-request.c:265
#: ../tgp-request.c:223 ../tgp-request.c:253
msgid "Password"
msgstr "Fjalëkalim"
#: ../tgp-request.c:239 ../tgp-request.c:269
#: ../tgp-request.c:227 ../tgp-request.c:257
msgid "Confirm"
msgstr "Ripohojeni"
#: ../tgp-request.c:263 ../tgp-request.c:274
#: ../tgp-request.c:251 ../tgp-request.c:262
msgid "New password"
msgstr "Fjalëkalimi i ri"
@ -430,58 +503,112 @@ msgstr "Fjalëkalimi i ri"
#. ask for the phone number directly, cause in that case the account would
#. still be created
#. named with the invalid phone number, even though the login will work
#: ../tgp-request.c:312
#: ../tgp-request.c:300
msgid "Invalid phone number"
msgstr "Numër telefoni i pavlefshëm"
#: ../tgp-request.c:313
#: ../tgp-request.c:301
msgid ""
"Please enter only numbers in the international phone number format, a leading + following by the country prefix and the phone number.\n"
"Do not use any other special chars."
msgstr "Ju lutemi, jepni vetëm numra në formatin për numra telefonash ndërkombëtarë, një + paraprijës të ndjekur nga prefiksi i vendit dhe numri i telefonit.\nMos përdorni shenja të tjera speciale."
msgstr ""
"Ju lutemi, jepni vetëm numra në formatin për numra telefonash ndërkombëtarë, një + paraprijës të ndjekur nga prefiksi i vendit dhe numri i telefonit.\n"
"Mos përdorni shenja të tjera speciale."
#: ../tgp-request.c:370
msgid "Leave Chat"
msgstr "Braktise Fjalosjen"
#: ../tgp-request.c:372
msgid "Do you want to leave this chat permantently?"
msgstr "Doni të dilni përgjithmonë nga kjo fjalosje?"
#: ../tgp-request.c:377
msgid "Abort Secret Chat"
msgstr "Ndërprite Fjalosjen e Fshehtë"
#: ../tgp-request.c:379
msgid "Do you want to terminate this secret chat permantently?"
msgstr "Doni ta përfundoni përgjithmonë këtë fjalosje të fshehtë?"
#: ../tgp-request.c:384
msgid "Delete Contact"
msgstr "Fshije Kontaktin"
#: ../tgp-request.c:386
msgid "Do you want to remove this user from your global contact list?"
msgstr "Doni të hiqet ky përdorues prej listës suaj globale të kontakteve?"
#: ../tgp-request.c:401
msgid "Leave Channel"
msgstr "Braktise Kanalin"
#: ../tgp-request.c:403
msgid "Do you want to leave this channel?"
msgstr "Doni ta braktisni këtë kanal?"
#. This should be the language's timestamp format. This is preceded by a
#. colon.
#: ../tgp-utils.c:32
#: ../tgp-utils.c:27
msgid "%d.%m.%Y %H:%M"
msgstr "%d.%m.%Y %H:%M"
#. This is preceded by a colon.
#: ../tgp-utils.c:53
#: ../tgp-utils.c:48
msgid "recently"
msgstr "së fundi"
#. This is preceded by a colon.
#: ../tgp-utils.c:57
#: ../tgp-utils.c:52
msgid "last week"
msgstr "javën e fundit"
#. This is preceded by a colon.
#: ../tgp-utils.c:61
#: ../tgp-utils.c:56
msgid "last month"
msgstr "muajin e fundit"
#. This is preceded by a colon. It refers to a point on time.
#: ../tgp-utils.c:65
#: ../tgp-utils.c:60
msgid "unknown"
msgstr "e panjohur"
#: ../tgp-chat.c:79
#: ../tgp-chat.c:108 ../tgp-chat.c:582
msgid "Telegram Chats"
msgstr "Fjalosje Telegram-i"
#: ../tgp-chat.c:113
msgid "You have already left this chat."
msgstr "E keni lëndë tashmë këtë fjalosje."
#: ../tgp-chat.c:127
#: ../tgp-chat.c:224
msgid "Subject:"
msgstr "Subjekt:"
#: ../tgp-chat.c:133
#: ../tgp-chat.c:230
msgid "Invite link:"
msgstr "Lidhje ftese:"
#: ../tgp-chat.c:139
#: ../tgp-chat.c:236
msgid "Chat ID:"
msgstr "ID Fjalosjeje:"
#: ../tgp-chat.c:238
#: ../tgp-chat.c:342
msgid "Supergroup"
msgstr "Supergrup"
#: ../tgp-chat.c:342
msgid "Channel"
msgstr "Kanal"
#: ../tgp-chat.c:345
msgid "Group"
msgstr "Grup"
#: ../tgp-chat.c:367
msgid "Users in chat"
msgstr "Përdorues në fjalosje"
#: ../tgp-chat.c:370
msgid "Type"
msgstr "Lloj"

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-21 14:37+0100\n"
"POT-Creation-Date: 2016-08-31 22:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,71 +18,76 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#: ../telegram-base.c:515
#: ../telegram-base.c:500
msgid "Couldn't create group"
msgstr ""
#: ../telegram-base.c:515
#: ../telegram-base.c:501
msgid "Please select at least one other user."
msgstr ""
#: ../telegram-base.c:570
#: ../telegram-base.c:555
msgid "Query Failed"
msgstr ""
#: ../telegram-purple.c:193
#: ../telegram-purple.c:162
msgid "Secret chat ready."
msgstr ""
#: ../telegram-purple.c:200
#: ../telegram-purple.c:170
msgid "Secret chat terminated."
msgstr ""
#: ../telegram-purple.c:268
#: ../telegram-purple.c:182
msgid "Telegram"
msgstr ""
#: ../telegram-purple.c:229
msgid "Message marked as read."
msgstr ""
#: ../telegram-purple.c:486
#: ../telegram-purple.c:339
#, c-format
msgid "Invite link: %s"
msgstr ""
#: ../telegram-purple.c:506 ../telegram-purple.c:507
#. FIXME: Can TGLCHF_MODERATOR export links?
#: ../telegram-purple.c:350
msgid "Creating chat link failed"
msgstr ""
#: ../telegram-purple.c:508
#: ../telegram-purple.c:351
msgid "You need to be admin of the group to do that."
msgstr ""
#: ../telegram-purple.c:531
#: ../telegram-purple.c:416
msgid "Chat joined"
msgstr ""
#: ../telegram-purple.c:532
#: ../telegram-purple.c:417
msgid "Chat added to list of chat rooms."
msgstr ""
#: ../telegram-purple.c:552
#: ../telegram-purple.c:443
msgid "Start secret chat..."
msgstr ""
#. Generate Public Link
#: ../telegram-purple.c:558
#: ../telegram-purple.c:450
msgid "Invite users by link..."
msgstr ""
#. Delete self from chat
#: ../telegram-purple.c:564
#: ../telegram-purple.c:458
msgid "Delete and exit..."
msgstr ""
#: ../telegram-purple.c:632
#: ../telegram-purple.c:546
#, c-format
msgid "Unable to sign on as %s: pubkey not found."
msgid "Unable to sign on as %s: file (public key) not found."
msgstr ""
#: ../telegram-purple.c:636
#: ../telegram-purple.c:550
#, c-format
msgid ""
"Make sure telegram-purple is installed properly,\n"
@ -92,392 +97,485 @@ msgid ""
"%1$s to %2$s."
msgstr ""
#: ../telegram-purple.c:657
#: ../telegram-purple.c:572
#, c-format
msgid ""
"Unable to sign on as %s: problem in the underlying library 'tgl'. Please "
"submit a bug report with the debug log."
msgstr ""
#: ../telegram-purple.c:576
msgid "Problem in tgl"
msgstr ""
#. TRANSLATORS: Please fill in your own prefix!
#: ../telegram-purple.c:584
#, c-format
msgid ""
"Unable to sign on as %s: phone number lacks country prefix. Numbers must "
"start with the full international prefix code, e.g. +49 for Germany."
"start with the full international prefix code, e.g. +1 for USA."
msgstr ""
#: ../telegram-purple.c:662
#: ../telegram-purple.c:589
msgid "Incomplete phone number"
msgstr ""
#: ../telegram-purple.c:788 ../telegram-purple.c:789
#: ../telegram-purple.c:642
msgid "Secret chat was already deleted"
msgstr ""
#: ../telegram-purple.c:644
msgid "Secret chat is not ready"
msgstr ""
#: ../telegram-purple.c:652
msgid "Only the creator of a channel can post messages."
msgstr ""
#: ../telegram-purple.c:695
msgid "Cannot invite buddy to chat"
msgstr ""
#: ../telegram-purple.c:790
#: ../telegram-purple.c:696
msgid "Specified user does not exist."
msgstr ""
#: ../telegram-purple.c:709
msgid "phone no. (+ country prefix)"
msgstr ""
#. Login
#: ../telegram-purple.c:932
#: ../telegram-purple.c:817
msgid "Password (two factor authentication)"
msgstr ""
#: ../telegram-purple.c:938
#: ../telegram-purple.c:822
msgid ""
"Fallback SMS verification\n"
"(Helps when not using Pidgin and you aren't being prompted for the code)"
msgstr ""
#: ../telegram-purple.c:946
msgid "ask"
msgstr ""
#: ../telegram-purple.c:947
#: ../telegram-purple.c:828
msgid "always"
msgstr ""
#: ../telegram-purple.c:948
#: ../telegram-purple.c:829
msgid "never"
msgstr ""
#: ../telegram-purple.c:950
#: ../telegram-purple.c:830
msgid "ask"
msgstr ""
#: ../telegram-purple.c:832
msgid "Accept secret chats"
msgstr ""
#: ../telegram-purple.c:955
#: ../telegram-purple.c:836
msgid "Display buddies offline after (days)"
msgstr ""
#: ../telegram-purple.c:960
msgid "Fetch past history on first login"
msgstr ""
#: ../telegram-purple.c:965
#: ../telegram-purple.c:840
msgid ""
"Don't fetch history older than (days)\n"
"(0 for unlimited)"
msgstr ""
#. Media
#: ../telegram-purple.c:845
msgid "Autoload media size (kb)"
msgstr ""
#. Chats
#: ../telegram-purple.c:973
#: ../telegram-purple.c:850
msgid "Add all group chats to buddy list"
msgstr ""
#. Read notifications
#: ../telegram-purple.c:981
#: ../telegram-purple.c:855
msgid "Display notices of receipt"
msgstr ""
#: ../telegram-purple.c:986
#: ../telegram-purple.c:859
msgid "Send notices of receipt when present"
msgstr ""
#: ../tgp-2prpl.c:178 ../tgp-request.c:108
msgid "First name"
#: ../telegram-purple.c:884
msgid "Telegram Protocol Plugin."
msgstr ""
#: ../tgp-2prpl.c:179 ../tgp-request.c:111
msgid "Last name"
msgstr ""
#: ../tgp-2prpl.c:181
msgid "Name"
msgstr ""
#: ../tgp-2prpl.c:186 ../tgp-request.c:197 ../tgp-request.c:201
#: ../tgp-request.c:205
msgid "Username"
msgstr ""
#: ../tgp-2prpl.c:191
msgid "Last seen"
msgstr ""
#: ../tgp-2prpl.c:196
msgid "Phone"
msgstr ""
#: ../tgp-2prpl.c:208
msgid "Waiting for the user to get online..."
msgstr ""
#: ../tgp-2prpl.c:212
msgid "Self destruction timer"
msgstr ""
#: ../tgp-2prpl.c:218
msgid "Timer is not enabled."
msgstr ""
#: ../tgp-2prpl.c:225
msgid "Secret key"
msgstr ""
#: ../tgp-msg.c:72
#: ../tgp-msg.c:58
#, c-format
msgid "%2$s created chat %1$s."
msgstr ""
#: ../tgp-msg.c:75
#: ../tgp-msg.c:61
#, c-format
msgid "%2$s changed title to %1$s."
msgstr ""
#: ../tgp-msg.c:78
#: ../tgp-msg.c:64
#, c-format
msgid "%s changed photo."
msgstr ""
#: ../tgp-msg.c:81
#: ../tgp-msg.c:67
#, c-format
msgid "%s deleted photo."
msgstr ""
#: ../tgp-msg.c:89
#: ../tgp-msg.c:75
#, c-format
msgid "%1$s added user %2$s by link."
msgstr ""
#: ../tgp-msg.c:102
#: ../tgp-msg.c:90
#, c-format
msgid "%2$s added user %1$s."
msgstr ""
#: ../tgp-msg.c:125 ../tgp-msg.c:140
#: ../tgp-msg.c:114 ../tgp-msg.c:131
#, c-format
msgid "%2$s deleted user %1$s."
msgstr ""
#: ../tgp-msg.c:146
#: ../tgp-msg.c:138
#, c-format
msgid "%2$s set self destruction timer to %1$d second."
msgid_plural "%2$s set self destruction timer to %1$d seconds."
msgstr[0] ""
msgstr[1] ""
#: ../tgp-msg.c:152
#: ../tgp-msg.c:144
#, c-format
msgid "%2$s marked %1$d message read."
msgid_plural "%2$s marked %1$d messages read."
msgstr[0] ""
msgstr[1] ""
#: ../tgp-msg.c:158
#: ../tgp-msg.c:150
#, c-format
msgid "%2$s deleted %1$d message."
msgid_plural "%2$s deleted %1$d messages."
msgstr[0] ""
msgstr[1] ""
#: ../tgp-msg.c:164
#: ../tgp-msg.c:156
#, c-format
msgid "%2$s made a screenshot of %1$d message."
msgid_plural "%2$s made a screenshot of %1$d messages."
msgstr[0] ""
msgstr[1] ""
#: ../tgp-msg.c:162
#, c-format
msgid "Channel %1$s created"
msgstr ""
#. FIXME: check if this makes sense
#: ../tgp-msg.c:165 ../tgp-chat.c:124 ../tgp-chat.c:576
msgid "Telegram Channels"
msgstr ""
#: ../tgp-msg.c:191
msgid "Sending message failed."
msgstr ""
#: ../tgp-msg.c:296
#: ../tgp-msg.c:253
msgid "Sending image failed."
msgstr ""
#: ../tgp-msg.c:310
msgid "Sorry, sending documents to encrypted chats not yet supported."
msgstr ""
#: ../tgp-msg.c:400
#: ../tgp-msg.c:417
#, c-format
msgid "%s sent a sticker."
msgstr ""
#: ../tgp-net.c:286
#: ../tgp-msg.c:463
msgid "failed loading message"
msgstr ""
#: ../tgp-msg.c:498
msgid "[animation]"
msgstr ""
#: ../tgp-msg.c:515
msgid "[audio]"
msgstr ""
#: ../tgp-msg.c:515
msgid "[video]"
msgstr ""
#: ../tgp-msg.c:604
#, c-format
msgid "<b>Forwarded message from: %s</b><br>%s"
msgstr ""
#. FIXME: sometimes users aren't part of the response when receiving a forwarded message
#: ../tgp-msg.c:607
#, c-format
msgid "<b>Forwarded message:</b><br>%s"
msgstr ""
#: ../tgp-msg.c:720
msgid "loading document or picture failed"
msgstr ""
#: ../tgp-net.c:281
msgid "Cannot connect to main server"
msgstr ""
#: ../tgp-net.c:342
#: ../tgp-net.c:322
msgid "Cannot connect to server: Ping timeout."
msgstr ""
#: ../tgp-net.c:387
#: ../tgp-net.c:365
msgid "Lost connection to the server..."
msgstr ""
#: ../tgp-request.c:64
#: ../tgp-request.c:51
msgid ""
"Telegram wants to verify your identity. Please enter the login code that you "
"have received via SMS."
msgstr ""
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Login code"
msgstr ""
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Enter login code"
msgstr ""
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "the code"
msgstr ""
#: ../tgp-request.c:67 ../tgp-request.c:116 ../tgp-request.c:210
#: ../tgp-request.c:245 ../tgp-request.c:275
#: ../tgp-request.c:54 ../tgp-request.c:104 ../tgp-request.c:198
#: ../tgp-request.c:233 ../tgp-request.c:263
msgid "OK"
msgstr ""
#: ../tgp-request.c:68 ../tgp-request.c:116 ../tgp-request.c:135
#: ../tgp-request.c:211 ../tgp-request.c:246 ../tgp-request.c:276
#: ../tgp-request.c:55 ../tgp-request.c:104 ../tgp-request.c:123
#: ../tgp-request.c:199 ../tgp-request.c:234 ../tgp-request.c:264
msgid "Cancel"
msgstr ""
#: ../tgp-request.c:107
#: ../tgp-request.c:95
msgid "Registration"
msgstr ""
#: ../tgp-request.c:115
#: ../tgp-request.c:96
msgid "First name"
msgstr ""
#: ../tgp-request.c:99
msgid "Last name"
msgstr ""
#: ../tgp-request.c:103
msgid "Register"
msgstr ""
#: ../tgp-request.c:115
#: ../tgp-request.c:103
msgid "Please register your phone number."
msgstr ""
#. purple_request API not available
#: ../tgp-request.c:120
#: ../tgp-request.c:108
msgid ""
"Phone number is not registered. Please register your phone on a different "
"client."
msgstr ""
#: ../tgp-request.c:122
#: ../tgp-request.c:110
msgid "Not registered"
msgstr ""
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Password needed"
msgstr ""
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Enter password for two factor authentication"
msgstr ""
#: ../tgp-request.c:135
#: ../tgp-request.c:123
msgid "Ok"
msgstr ""
#: ../tgp-request.c:137
#: ../tgp-request.c:125
msgid ""
"No password set for two factor authentication. Please enter it in the "
"extended settings."
msgstr ""
#: ../tgp-request.c:139
#: ../tgp-request.c:127
msgid "Password invalid"
msgstr ""
#: ../tgp-request.c:162
#: ../tgp-request.c:150
#, c-format
msgid "Accept secret chat '%s' on this device?"
msgstr ""
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid "Secret chat"
msgstr ""
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid ""
"Secret chats can only have one end point. If you accept a secret chat on "
"this device, its messages will not be available anywhere else. If you "
"decline, you can still accept the chat on other devices."
msgstr ""
#: ../tgp-request.c:194
#: ../tgp-request.c:182
msgid ""
"Invite at least one additional user by specifying\n"
" their full name (autocompletion available).\n"
"You can add more users once the chat was created."
msgstr ""
#: ../tgp-request.c:210
#: ../tgp-request.c:185 ../tgp-request.c:189 ../tgp-request.c:193
msgid "Username"
msgstr ""
#: ../tgp-request.c:198
msgid "Create group chat"
msgstr ""
#: ../tgp-request.c:210
#: ../tgp-request.c:198
msgid "Invite users"
msgstr ""
#: ../tgp-request.c:229 ../tgp-request.c:244
#: ../tgp-request.c:217 ../tgp-request.c:232
msgid "Change password"
msgstr ""
#: ../tgp-request.c:231
#: ../tgp-request.c:219
msgid "Current"
msgstr ""
#: ../tgp-request.c:235 ../tgp-request.c:265
#: ../tgp-request.c:223 ../tgp-request.c:253
msgid "Password"
msgstr ""
#: ../tgp-request.c:239 ../tgp-request.c:269
#: ../tgp-request.c:227 ../tgp-request.c:257
msgid "Confirm"
msgstr ""
#: ../tgp-request.c:263 ../tgp-request.c:274
#: ../tgp-request.c:251 ../tgp-request.c:262
msgid "New password"
msgstr ""
#. if we arrive here for the second time the specified phone number is not valid. We do not
#. ask for the phone number directly, cause in that case the account would still be created
#. named with the invalid phone number, even though the login will work
#: ../tgp-request.c:312
#: ../tgp-request.c:300
msgid "Invalid phone number"
msgstr ""
#: ../tgp-request.c:313
#: ../tgp-request.c:301
msgid ""
"Please enter only numbers in the international phone number format, a "
"leading + following by the country prefix and the phone number.\n"
"Do not use any other special chars."
msgstr ""
#: ../tgp-request.c:370
msgid "Leave Chat"
msgstr ""
#: ../tgp-request.c:372
msgid "Do you want to leave this chat permantently?"
msgstr ""
#: ../tgp-request.c:377
msgid "Abort Secret Chat"
msgstr ""
#: ../tgp-request.c:379
msgid "Do you want to terminate this secret chat permantently?"
msgstr ""
#: ../tgp-request.c:384
msgid "Delete Contact"
msgstr ""
#: ../tgp-request.c:386
msgid "Do you want to remove this user from your global contact list?"
msgstr ""
#: ../tgp-request.c:401
msgid "Leave Channel"
msgstr ""
#: ../tgp-request.c:403
msgid "Do you want to leave this channel?"
msgstr ""
#. This should be the language's timestamp format. This is preceded by a colon.
#: ../tgp-utils.c:32
#: ../tgp-utils.c:27
msgid "%d.%m.%Y %H:%M"
msgstr ""
#. This is preceded by a colon.
#: ../tgp-utils.c:53
#: ../tgp-utils.c:48
msgid "recently"
msgstr ""
#. This is preceded by a colon.
#: ../tgp-utils.c:57
#: ../tgp-utils.c:52
msgid "last week"
msgstr ""
#. This is preceded by a colon.
#: ../tgp-utils.c:61
#: ../tgp-utils.c:56
msgid "last month"
msgstr ""
#. This is preceded by a colon. It refers to a point on time.
#: ../tgp-utils.c:65
#: ../tgp-utils.c:60
msgid "unknown"
msgstr ""
#: ../tgp-chat.c:79
#: ../tgp-chat.c:108 ../tgp-chat.c:582
msgid "Telegram Chats"
msgstr ""
#: ../tgp-chat.c:113
msgid "You have already left this chat."
msgstr ""
#: ../tgp-chat.c:127
#: ../tgp-chat.c:224
msgid "Subject:"
msgstr ""
#: ../tgp-chat.c:133
#: ../tgp-chat.c:230
msgid "Invite link:"
msgstr ""
#: ../tgp-chat.c:139
#: ../tgp-chat.c:236
msgid "Chat ID:"
msgstr ""
#: ../tgp-chat.c:238
#: ../tgp-chat.c:342
msgid "Supergroup"
msgstr ""
#: ../tgp-chat.c:342
msgid "Channel"
msgstr ""
#: ../tgp-chat.c:345
msgid "Group"
msgstr ""
#: ../tgp-chat.c:367
msgid "Users in chat"
msgstr ""
#: ../tgp-chat.c:370
msgid "Type"
msgstr ""

473
po/uk.po
View file

@ -1,88 +1,93 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Самохвалов Антон <samant.ua@mail.ru>, 2015
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: telegram-purple\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-11-21 14:37+0100\n"
"PO-Revision-Date: 2015-12-21 14:18+0000\n"
"Last-Translator: Самохвалов Антон <samant.ua@mail.ru>\n"
"Language-Team: Ukrainian (http://www.transifex.com/telegram-purple-developers/telegram-purple/language/uk/)\n"
"POT-Creation-Date: 2016-08-31 22:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Самохвалов Антон <samant.ua@mail.ru>, 2017\n"
"Language-Team: Ukrainian (https://www.transifex.com/telegram-purple-developers/teams/53149/uk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: uk\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: ../telegram-base.c:515
#: ../telegram-base.c:500
msgid "Couldn't create group"
msgstr "Не вдається створити групу"
#: ../telegram-base.c:515
#: ../telegram-base.c:501
msgid "Please select at least one other user."
msgstr "Будь ласка, виберіть ще хоча б одного іншого користувача"
#: ../telegram-base.c:570
#: ../telegram-base.c:555
msgid "Query Failed"
msgstr "Запит не вдався"
#: ../telegram-purple.c:193
#: ../telegram-purple.c:162
msgid "Secret chat ready."
msgstr "Таємний чат готовий."
#: ../telegram-purple.c:200
#: ../telegram-purple.c:170
msgid "Secret chat terminated."
msgstr "Таємний чат перерваний."
#: ../telegram-purple.c:268
#: ../telegram-purple.c:182
msgid "Telegram"
msgstr "Telegram"
#: ../telegram-purple.c:229
msgid "Message marked as read."
msgstr "Повідомлення помічено як прочитане."
#: ../telegram-purple.c:486
#: ../telegram-purple.c:339
#, c-format
msgid "Invite link: %s"
msgstr "Адреса для запрошення: %s"
#: ../telegram-purple.c:506 ../telegram-purple.c:507
#. FIXME: Can TGLCHF_MODERATOR export links?
#: ../telegram-purple.c:350
msgid "Creating chat link failed"
msgstr "Створення посилання на чат не вдалося"
#: ../telegram-purple.c:508
#: ../telegram-purple.c:351
msgid "You need to be admin of the group to do that."
msgstr "Для цього ви маєте бути адміном групи."
#: ../telegram-purple.c:531
#: ../telegram-purple.c:416
msgid "Chat joined"
msgstr "Чат підключений"
#: ../telegram-purple.c:532
#: ../telegram-purple.c:417
msgid "Chat added to list of chat rooms."
msgstr "Чат доданий до списку чат-кімнат"
#: ../telegram-purple.c:552
#: ../telegram-purple.c:443
msgid "Start secret chat..."
msgstr "Запустити таємний чат..."
#. Generate Public Link
#: ../telegram-purple.c:558
#: ../telegram-purple.c:450
msgid "Invite users by link..."
msgstr "Запросити користувачів посиланням..."
#. Delete self from chat
#: ../telegram-purple.c:564
#: ../telegram-purple.c:458
msgid "Delete and exit..."
msgstr "Видалити та вийти..."
#: ../telegram-purple.c:632
#: ../telegram-purple.c:546
#, c-format
msgid "Unable to sign on as %s: pubkey not found."
msgstr "Не вдалося увійти як %s: не знайдений публічний ключ."
msgid "Unable to sign on as %s: file (public key) not found."
msgstr "Не вдалося увійти як %s: не знайдений файл (публічний ключ)."
#: ../telegram-purple.c:636
#: ../telegram-purple.c:550
#, c-format
msgid ""
"Make sure telegram-purple is installed properly,\n"
@ -90,340 +95,407 @@ msgid ""
"If you're running SELinux (e.g. when using Tails),\n"
"try 'make local_install', or simply copy\n"
"%1$s to %2$s."
msgstr "Переконайтесь, що telegram-purple встановлено вірно,\nв тому числі файл .tglpub.\nЯкщо ви запускаєте SELinux (напр., використовуючи Tails),\nспробуйте 'make local_install', чи просто скопіюйте\n%1$s до %2$s."
msgstr ""
"Переконайтесь, що telegram-purple встановлено вірно,\n"
"в тому числі файл .tglpub.\n"
"Якщо ви запускаєте SELinux (напр., використовуючи Tails),\n"
"спробуйте 'make local_install', чи просто скопіюйте\n"
"%1$s до %2$s."
#: ../telegram-purple.c:657
#: ../telegram-purple.c:572
#, c-format
msgid ""
"Unable to sign on as %s: problem in the underlying library 'tgl'. Please "
"submit a bug report with the debug log."
msgstr ""
"Не вдається увійти як %s: проблема в існуючій бібліотеці 'tgl'. Будь ласка, "
"відправте звіт про помилку в журнал помилок."
#: ../telegram-purple.c:576
msgid "Problem in tgl"
msgstr "Проблема в tgl"
#. TRANSLATORS: Please fill in your own prefix!
#: ../telegram-purple.c:584
#, c-format
msgid ""
"Unable to sign on as %s: phone number lacks country prefix. Numbers must "
"start with the full international prefix code, e.g. +49 for Germany."
msgstr "Не вдалось зайти як %s: в номері телефону не вистачає префікса країни. Номери повинні починатись з повного міжнародного префіксу-коду, напр., +49 для Німеччини."
"start with the full international prefix code, e.g. +1 for USA."
msgstr ""
"Не вдалось зайти як %s: в номері телефону не вистачає префікса країни. "
"Номери повинні починатись з повного міжнародного префіксу-коду, напр., +38 "
"для України."
#: ../telegram-purple.c:662
#: ../telegram-purple.c:589
msgid "Incomplete phone number"
msgstr "Неповноцінний номер телефону"
#: ../telegram-purple.c:788 ../telegram-purple.c:789
#: ../telegram-purple.c:642
msgid "Secret chat was already deleted"
msgstr "Таємний чат вже видалений."
#: ../telegram-purple.c:644
msgid "Secret chat is not ready"
msgstr "Таємний чат не готовий."
#: ../telegram-purple.c:652
msgid "Only the creator of a channel can post messages."
msgstr "Писати повідомлення може тільки автор каналу."
#: ../telegram-purple.c:695
msgid "Cannot invite buddy to chat"
msgstr "Не вдається запросити друга в чат"
#: ../telegram-purple.c:790
#: ../telegram-purple.c:696
msgid "Specified user does not exist."
msgstr "Такого користувача немає."
#: ../telegram-purple.c:709
msgid "phone no. (+ country prefix)"
msgstr "№ телефону (+ код країни)"
#. Login
#: ../telegram-purple.c:932
#: ../telegram-purple.c:817
msgid "Password (two factor authentication)"
msgstr "Пароль (двух-факторна аутентифікація)"
#: ../telegram-purple.c:938
#: ../telegram-purple.c:822
msgid ""
"Fallback SMS verification\n"
"(Helps when not using Pidgin and you aren't being prompted for the code)"
msgstr "Резервна SMS-перевірка\n(Допомагає, коли ви не використовуєте Піджин, і вас не запрошено до кодування)"
msgstr ""
"Резервна SMS-перевірка\n"
"(Допомагає, коли ви не використовуєте Піджин, і вас не запрошено до кодування)"
#: ../telegram-purple.c:946
msgid "ask"
msgstr "запитати"
#: ../telegram-purple.c:947
#: ../telegram-purple.c:828
msgid "always"
msgstr "завжди"
#: ../telegram-purple.c:948
#: ../telegram-purple.c:829
msgid "never"
msgstr "ніколи"
#: ../telegram-purple.c:950
#: ../telegram-purple.c:830
msgid "ask"
msgstr "запитати"
#: ../telegram-purple.c:832
msgid "Accept secret chats"
msgstr "Приймати таємні чати"
#: ../telegram-purple.c:955
#: ../telegram-purple.c:836
msgid "Display buddies offline after (days)"
msgstr "Відображати друзів, що оффлайн (днів)"
#: ../telegram-purple.c:960
msgid "Fetch past history on first login"
msgstr "Підняти минулу переписку при першому вході"
#: ../telegram-purple.c:965
#: ../telegram-purple.c:840
msgid ""
"Don't fetch history older than (days)\n"
"(0 for unlimited)"
msgstr "Не піднімати історію, старшу за (днів)\n(піднімати усю - 0)"
msgstr ""
"Не піднімати історію, старшу за (днів)\n"
"(піднімати усю - 0)"
#. Media
#: ../telegram-purple.c:845
msgid "Autoload media size (kb)"
msgstr "Автозавантаження розміру медіа (кб)"
#. Chats
#: ../telegram-purple.c:973
#: ../telegram-purple.c:850
msgid "Add all group chats to buddy list"
msgstr "Додати усі групові чати в список контактів"
#. Read notifications
#: ../telegram-purple.c:981
#: ../telegram-purple.c:855
msgid "Display notices of receipt"
msgstr "Показувати повідомлення про отримання"
#: ../telegram-purple.c:986
#: ../telegram-purple.c:859
msgid "Send notices of receipt when present"
msgstr "Відправляти повідомлення про отримання, якщо воно є"
#: ../tgp-2prpl.c:178 ../tgp-request.c:108
msgid "First name"
msgstr "Ім'я"
#: ../telegram-purple.c:884
msgid "Telegram Protocol Plugin."
msgstr "Плагін Протоколу Telegram"
#: ../tgp-2prpl.c:179 ../tgp-request.c:111
msgid "Last name"
msgstr "Прізвище"
#: ../tgp-2prpl.c:181
msgid "Name"
msgstr "Ім'я"
#: ../tgp-2prpl.c:186 ../tgp-request.c:197 ../tgp-request.c:201
#: ../tgp-request.c:205
msgid "Username"
msgstr "Ім'я користувача"
#: ../tgp-2prpl.c:191
msgid "Last seen"
msgstr "Востаннє був"
#: ../tgp-2prpl.c:196
msgid "Phone"
msgstr "Телефон"
#: ../tgp-2prpl.c:208
msgid "Waiting for the user to get online..."
msgstr "Очікування на появу користувача в мережі..."
#: ../tgp-2prpl.c:212
msgid "Self destruction timer"
msgstr "Час до самоліквідації"
#: ../tgp-2prpl.c:218
msgid "Timer is not enabled."
msgstr "Таймер не включений."
#: ../tgp-2prpl.c:225
msgid "Secret key"
msgstr "Таємний ключ"
#: ../tgp-msg.c:72
#: ../tgp-msg.c:58
#, c-format
msgid "%2$s created chat %1$s."
msgstr "%2$s створив чат %1$s."
#: ../tgp-msg.c:75
#: ../tgp-msg.c:61
#, c-format
msgid "%2$s changed title to %1$s."
msgstr "%2$s змінив назву на %1$s."
#: ../tgp-msg.c:78
#: ../tgp-msg.c:64
#, c-format
msgid "%s changed photo."
msgstr "%s змінив фото."
#: ../tgp-msg.c:81
#: ../tgp-msg.c:67
#, c-format
msgid "%s deleted photo."
msgstr "%s видалив фото."
#: ../tgp-msg.c:89
#: ../tgp-msg.c:75
#, c-format
msgid "%1$s added user %2$s by link."
msgstr "%1$s додав %2$s за посиланням."
#: ../tgp-msg.c:102
#: ../tgp-msg.c:90
#, c-format
msgid "%2$s added user %1$s."
msgstr "%2$s додав користувача %1$s."
#: ../tgp-msg.c:125 ../tgp-msg.c:140
#: ../tgp-msg.c:114 ../tgp-msg.c:131
#, c-format
msgid "%2$s deleted user %1$s."
msgstr "%2$s видалив користувача %1$s."
#: ../tgp-msg.c:146
#: ../tgp-msg.c:138
#, c-format
msgid "%2$s set self destruction timer to %1$d second."
msgid_plural "%2$s set self destruction timer to %1$d seconds."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[0] "%2$s встановив таймер самознищення на %1$d секунду."
msgstr[1] "%2$s встановив таймер самознищення на %1$d секунди."
msgstr[2] "%2$s встановив таймер самознищення на %1$d секунд."
#: ../tgp-msg.c:152
#: ../tgp-msg.c:144
#, c-format
msgid "%2$s marked %1$d message read."
msgid_plural "%2$s marked %1$d messages read."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[0] "%2$s помітив %1$d повідомлення як прочитане."
msgstr[1] "%2$s помітив %1$d повідомлення як прочитані."
msgstr[2] "%2$s помітив %1$d повідомленнь як прочитані."
#: ../tgp-msg.c:158
#: ../tgp-msg.c:150
#, c-format
msgid "%2$s deleted %1$d message."
msgid_plural "%2$s deleted %1$d messages."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[0] "%2$s видалив %1$d повідомлення."
msgstr[1] "%2$s видалив %1$d повідомлення."
msgstr[2] "%2$s видалив %1$d повідомленнь."
#: ../tgp-msg.c:164
#: ../tgp-msg.c:156
#, c-format
msgid "%2$s made a screenshot of %1$d message."
msgid_plural "%2$s made a screenshot of %1$d messages."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[0] "%2$s зробив скріншот %1$d повідомлення."
msgstr[1] "%2$s зробив скріншот %1$d повідомлень."
msgstr[2] "%2$s зробив скріншот %1$d повідомленнь."
#: ../tgp-msg.c:162
#, c-format
msgid "Channel %1$s created"
msgstr "Канал %1$s створений"
#. FIXME: check if this makes sense
#: ../tgp-msg.c:165 ../tgp-chat.c:124 ../tgp-chat.c:576
msgid "Telegram Channels"
msgstr "Канали Telegram"
#: ../tgp-msg.c:191
msgid "Sending message failed."
msgstr "Відправка повідомлення не вдалась."
#: ../tgp-msg.c:296
#: ../tgp-msg.c:253
msgid "Sending image failed."
msgstr "Відправка зображення не вдалася"
#: ../tgp-msg.c:310
msgid "Sorry, sending documents to encrypted chats not yet supported."
msgstr "Вибачте, відправка документів в зашифровані чати ще не реалізована."
#: ../tgp-msg.c:400
#: ../tgp-msg.c:417
#, c-format
msgid "%s sent a sticker."
msgstr "%s відправив липучку."
#: ../tgp-net.c:286
#: ../tgp-msg.c:463
msgid "failed loading message"
msgstr "не вдалось завантажити повідомлення"
#: ../tgp-msg.c:498
msgid "[animation]"
msgstr "[анімація]"
#: ../tgp-msg.c:515
msgid "[audio]"
msgstr "[аудіо]"
#: ../tgp-msg.c:515
msgid "[video]"
msgstr "[відео]"
#: ../tgp-msg.c:604
#, c-format
msgid "<b>Forwarded message from: %s</b><br>%s"
msgstr "<b>Перенаправлене повідомлення від %s</b><br>%s"
#. FIXME: sometimes users aren't part of the response when receiving a
#. forwarded message
#: ../tgp-msg.c:607
#, c-format
msgid "<b>Forwarded message:</b><br>%s"
msgstr "<b>Перенаправлене повідомлення:</b><br>%s"
#: ../tgp-msg.c:720
msgid "loading document or picture failed"
msgstr "завантаження документу чи картинки не вдалось"
#: ../tgp-net.c:281
msgid "Cannot connect to main server"
msgstr "Не вдається підключитись до головного сервера"
#: ../tgp-net.c:342
#: ../tgp-net.c:322
msgid "Cannot connect to server: Ping timeout."
msgstr "Не вдається підключитись до сервера: ping-таймаут."
msgstr "Не вдається підключитись до сервера: сервер не відповідає."
#: ../tgp-net.c:387
#: ../tgp-net.c:365
msgid "Lost connection to the server..."
msgstr "Зв'язок із сервером втрачений..."
#: ../tgp-request.c:64
#: ../tgp-request.c:51
msgid ""
"Telegram wants to verify your identity. Please enter the login code that you"
" have received via SMS."
msgstr "Telegram хоче перевірити вашу особистість. Будь ласка, введіть логін, що отримали по SMS."
msgstr ""
"Telegram хоче перевірити вашу особистість. Будь ласка, введіть логін, що "
"отримали по SMS."
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Login code"
msgstr "Код входу"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "Enter login code"
msgstr "Введіть код входу"
#: ../tgp-request.c:67
#: ../tgp-request.c:54
msgid "the code"
msgstr "код"
#: ../tgp-request.c:67 ../tgp-request.c:116 ../tgp-request.c:210
#: ../tgp-request.c:245 ../tgp-request.c:275
#: ../tgp-request.c:54 ../tgp-request.c:104 ../tgp-request.c:198
#: ../tgp-request.c:233 ../tgp-request.c:263
msgid "OK"
msgstr "ОК"
#: ../tgp-request.c:68 ../tgp-request.c:116 ../tgp-request.c:135
#: ../tgp-request.c:211 ../tgp-request.c:246 ../tgp-request.c:276
#: ../tgp-request.c:55 ../tgp-request.c:104 ../tgp-request.c:123
#: ../tgp-request.c:199 ../tgp-request.c:234 ../tgp-request.c:264
msgid "Cancel"
msgstr "Відміна"
#: ../tgp-request.c:107
#: ../tgp-request.c:95
msgid "Registration"
msgstr "Регістрація"
#: ../tgp-request.c:115
#: ../tgp-request.c:96
msgid "First name"
msgstr "Ім'я"
#: ../tgp-request.c:99
msgid "Last name"
msgstr "Прізвище"
#: ../tgp-request.c:103
msgid "Register"
msgstr "Зарегіструватись"
#: ../tgp-request.c:115
#: ../tgp-request.c:103
msgid "Please register your phone number."
msgstr "Будь ласка, зареєструйте ваш номер телефону."
#. purple_request API not available
#: ../tgp-request.c:120
#: ../tgp-request.c:108
msgid ""
"Phone number is not registered. Please register your phone on a different "
"client."
msgstr "Номер телефону не зареєстрований. Будь ласка, зареєструйте ваш телефон на іншого кліента."
msgstr ""
"Номер телефону не зареєстрований. Будь ласка, зареєструйте ваш телефон на "
"іншого кліента."
#: ../tgp-request.c:122
#: ../tgp-request.c:110
msgid "Not registered"
msgstr "Не зареєстрований"
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Password needed"
msgstr "Потрібен пароль"
#: ../tgp-request.c:134
#: ../tgp-request.c:122
msgid "Enter password for two factor authentication"
msgstr "Введіть пароль для двофакторної авторизації"
#: ../tgp-request.c:135
#: ../tgp-request.c:123
msgid "Ok"
msgstr "Гаразд"
#: ../tgp-request.c:137
#: ../tgp-request.c:125
msgid ""
"No password set for two factor authentication. Please enter it in the "
"extended settings."
msgstr "Для двофакторної авторизації не встановлений пароль. Будь ласка, введіть його в розширених настройках."
msgstr ""
"Для двофакторної авторизації не встановлений пароль. Будь ласка, введіть "
"його в розширених настройках."
#: ../tgp-request.c:139
#: ../tgp-request.c:127
msgid "Password invalid"
msgstr "Пароль невірний"
#: ../tgp-request.c:162
#: ../tgp-request.c:150
#, c-format
msgid "Accept secret chat '%s' on this device?"
msgstr "Прийняти таємний чат '%s' на цьому пристрої?"
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid "Secret chat"
msgstr "Таємний чат"
#: ../tgp-request.c:163
#: ../tgp-request.c:151
msgid ""
"Secret chats can only have one end point. If you accept a secret chat on "
"this device, its messages will not be available anywhere else. If you "
"decline, you can still accept the chat on other devices."
msgstr "У таємного чата може бути тільки одна кінцева точка. Якщо ви приймаєте на цьому пристрої таємний чат, його повідомлення будуть не будуть доступні з інших місць. Якщо відмовитесь, то можете прийняти чат з інших пристроїв."
msgstr ""
"У таємного чата може бути тільки одна кінцева точка. Якщо ви приймаєте на "
"цьому пристрої таємний чат, його повідомлення будуть не будуть доступні з "
"інших місць. Якщо відмовитесь, то можете прийняти чат з інших пристроїв."
#: ../tgp-request.c:194
#: ../tgp-request.c:182
msgid ""
"Invite at least one additional user by specifying\n"
" their full name (autocompletion available).\n"
"You can add more users once the chat was created."
msgstr "Запросіть щонайменше одного додаткового користувача вказанням його повного імені (автозавершення доступне).\nВи можете додати більше користувачів одразу після створення чата."
msgstr ""
"Запросіть щонайменше одного додаткового користувача вказанням його повного імені (автозавершення доступне).\n"
"Ви можете додати більше користувачів одразу після створення чата."
#: ../tgp-request.c:210
#: ../tgp-request.c:185 ../tgp-request.c:189 ../tgp-request.c:193
msgid "Username"
msgstr "Ім'я користувача"
#: ../tgp-request.c:198
msgid "Create group chat"
msgstr "Створити груповий чат"
#: ../tgp-request.c:210
#: ../tgp-request.c:198
msgid "Invite users"
msgstr "Запросити користувачів"
#: ../tgp-request.c:229 ../tgp-request.c:244
#: ../tgp-request.c:217 ../tgp-request.c:232
msgid "Change password"
msgstr "Змінити пароль"
#: ../tgp-request.c:231
#: ../tgp-request.c:219
msgid "Current"
msgstr "Поточний"
#: ../tgp-request.c:235 ../tgp-request.c:265
#: ../tgp-request.c:223 ../tgp-request.c:253
msgid "Password"
msgstr "Пароль"
#: ../tgp-request.c:239 ../tgp-request.c:269
#: ../tgp-request.c:227 ../tgp-request.c:257
msgid "Confirm"
msgstr "Підтвердити"
#: ../tgp-request.c:263 ../tgp-request.c:274
#: ../tgp-request.c:251 ../tgp-request.c:262
msgid "New password"
msgstr "Новий пароль"
@ -432,58 +504,113 @@ msgstr "Новий пароль"
#. ask for the phone number directly, cause in that case the account would
#. still be created
#. named with the invalid phone number, even though the login will work
#: ../tgp-request.c:312
#: ../tgp-request.c:300
msgid "Invalid phone number"
msgstr "Невірний номер телефону"
#: ../tgp-request.c:313
#: ../tgp-request.c:301
msgid ""
"Please enter only numbers in the international phone number format, a leading + following by the country prefix and the phone number.\n"
"Do not use any other special chars."
msgstr "Будь ласка, введіть номер тільки цифри в міжнародному телефонному форматі. Значок +, потім код країни і номер абонента.\nНе використовуйте інших символів."
msgstr ""
"Будь ласка, введіть номер тільки цифри в міжнародному телефонному форматі. Значок +, потім код країни і номер абонента.\n"
"Не використовуйте інших символів."
#: ../tgp-request.c:370
msgid "Leave Chat"
msgstr "Покинути чат"
#: ../tgp-request.c:372
msgid "Do you want to leave this chat permantently?"
msgstr "Бажаєте надовго покинути цей таємний чат?"
#: ../tgp-request.c:377
msgid "Abort Secret Chat"
msgstr "Про таємний чат"
#: ../tgp-request.c:379
msgid "Do you want to terminate this secret chat permantently?"
msgstr "Бажаєте надовго перервати цей таємний чат?"
#: ../tgp-request.c:384
msgid "Delete Contact"
msgstr "Видалити контакт"
#: ../tgp-request.c:386
msgid "Do you want to remove this user from your global contact list?"
msgstr ""
"Бажаєте видалити цього користувача з вашого глобального списку контактів?"
#: ../tgp-request.c:401
msgid "Leave Channel"
msgstr "Покинути канал"
#: ../tgp-request.c:403
msgid "Do you want to leave this channel?"
msgstr "Бажаєте покинути цей канал?"
#. This should be the language's timestamp format. This is preceded by a
#. colon.
#: ../tgp-utils.c:32
#: ../tgp-utils.c:27
msgid "%d.%m.%Y %H:%M"
msgstr "%d.%m.%Y %H:%M"
#. This is preceded by a colon.
#: ../tgp-utils.c:53
#: ../tgp-utils.c:48
msgid "recently"
msgstr "нещодавно"
#. This is preceded by a colon.
#: ../tgp-utils.c:57
#: ../tgp-utils.c:52
msgid "last week"
msgstr "на тому тижні"
#. This is preceded by a colon.
#: ../tgp-utils.c:61
#: ../tgp-utils.c:56
msgid "last month"
msgstr "минулого місяця"
#. This is preceded by a colon. It refers to a point on time.
#: ../tgp-utils.c:65
#: ../tgp-utils.c:60
msgid "unknown"
msgstr "невідомо"
#: ../tgp-chat.c:79
#: ../tgp-chat.c:108 ../tgp-chat.c:582
msgid "Telegram Chats"
msgstr "Чати Telegram"
#: ../tgp-chat.c:113
msgid "You have already left this chat."
msgstr "Ви вже покинули цей чат."
#: ../tgp-chat.c:127
#: ../tgp-chat.c:224
msgid "Subject:"
msgstr "Тема:"
#: ../tgp-chat.c:133
#: ../tgp-chat.c:230
msgid "Invite link:"
msgstr "Посилання для запрошення:"
#: ../tgp-chat.c:139
#: ../tgp-chat.c:236
msgid "Chat ID:"
msgstr "ID чата:"
#: ../tgp-chat.c:238
#: ../tgp-chat.c:342
msgid "Supergroup"
msgstr "Супергрупа"
#: ../tgp-chat.c:342
msgid "Channel"
msgstr "Канал"
#: ../tgp-chat.c:345
msgid "Group"
msgstr "Група"
#: ../tgp-chat.c:367
msgid "Users in chat"
msgstr "Користувачі у чаті"
#: ../tgp-chat.c:370
msgid "Type"
msgstr "Тип"

View file

@ -1,16 +1,17 @@
Name: purple-telegram
Version: 1.2.4
Release: 1%{?dist}
Summary: Adds support for Libpurple based messengers
Group: Applications/Internet
License: GPLv2+
URL: https://github.com/majn/telegram-purple
Source0: https://codeload.github.com/majn/telegram-purple/tar.gz/v%{version}.tar.gz
Name: purple-telegram
Version: 1.3.1
Release: 1%{?dist}
Summary: Adds support for Libpurple based messengers
Group: Applications/Internet
License: GPLv2+
URL: https://github.com/majn/telegram-purple
Source0: https://codeload.github.com/majn/telegram-purple/tar.gz/v%{version}.tar.gz
BuildRequires: gettext, libgcrypt-devel >= 1.6, pkgconfig(zlib), pkgconfig(purple), pkgconfig(libwebp)
BuildRequires: gettext, libgcrypt-devel >= 1.6, pkgconfig(zlib), pkgconfig(purple), pkgconfig(libwebp)
BuildRequires: pkgconfig(appstream-glib)
%description
Adds support for Telegram to Pidgin, Adium, Finch
Adds support for Telegram to Pidgin, Adium, Finch
and other Libpurple based messengers.
%prep
@ -25,23 +26,39 @@ make %{?_smp_mflags}
chmod 755 %{buildroot}/%{_libdir}/purple-2/telegram-purple.so
%find_lang telegram-purple
%check
appstream-util validate-relax --nonet %{buildroot}/%{_datadir}/appdata/telegram-purple.metainfo.xml
%files -f telegram-purple.lang
%doc README* CHANGELOG*
%doc README* CHANGELOG*
%{_libdir}/purple-2/telegram-purple.so
%config %{_sysconfdir}/telegram-purple/*
%{_datadir}/appdata/telegram-purple.metainfo.xml
%{_datadir}/pixmaps/pidgin/protocols/16/telegram.png
%{_datadir}/pixmaps/pidgin/protocols/22/telegram.png
%{_datadir}/pixmaps/pidgin/protocols/48/telegram.png
%changelog
* Sun Apr 9 2017 mjentsch 1.3.1-1
- Build for 1.3.1
* Thu Dec 10 2015 tuxmaster 1.3.0-1
- Build for 1.3.0
* Sat Jan 23 mjentsch 1.2.5-1
- build for 1.2.5
* Thu Dec 10 2015 tuxmaster 1.2.4-2
- Fix build for appdata.
* Thu Dec 10 2015 mjentsch 1.2.4-1
- build for 1.2.4
* Thu Dec 10 2015 tuxmaster 1.2.3-1
- build for 1.2.3
* Thu Dec 10 2015 tuxmaster 1.2.4-2
- Fix build for appdata.
* Wed Nov 18 2015 tuxmaster 1.2.2-3
- Add required version for libgcrypt.
- Add required version for libgcrypt.
* Wed Oct 14 2015 tuxmaster 1.2.2-2
- Use the better pkconfig for build requires.
@ -50,4 +67,3 @@ chmod 755 %{buildroot}/%{_libdir}/purple-2/telegram-purple.so
* Wed Oct 07 2015 mjentsch 1.2.2-1
- update version to 1.2.2

View file

@ -1,2 +1,2 @@
telegram-adium.xcodeproj/project.xcworkspace/xcuserdata/
telegram-adium.xcodeproj/xcuserdata/matj.xcuserdatad/xcdebugger/
/telegram-adium.xcodeproj/project.xcworkspace/xcuserdata/
/telegram-adium.xcodeproj/xcuserdata/

View file

@ -22,6 +22,7 @@
#import <Adium/ESFileTransfer.h>
#import <Adium/AIListContact.h>
#import <Adium/AIMenuControllerProtocol.h>
#import <Adium/AIHTMLDecoder.h>
#import <AIUtilities/AIMenuAdditions.h>
#include "telegram-purple.h"
@ -53,6 +54,8 @@
[super didConnect];
[self purpleAccount];
// FIXME: Crashed after going online
// Storing chats in the blist breaks Adium bookmarks. Adium doesn't
// show those chats anyway, so we can just safely delete those.
PurpleBlistNode *node = purple_blist_get_root();
@ -129,7 +132,7 @@
[menu addItemWithTitle:@"Delete and exit..."
target:self
action:@selector(deleteAndExitChat)
action:@selector(deleteAndExit)
keyEquivalent:@""
tag:0];
@ -141,20 +144,16 @@
connection_data *conn = purple_connection_get_protocol_data (purple_account_get_connection(account));
AIChat *chat = adium.interfaceController.activeChat;
if (chat) {
export_chat_link_checked (conn->TLS, [chat.name UTF8String]);
export_chat_link_by_name (conn->TLS, [chat.name UTF8String]);
}
}
- (void)deleteAndExitChat
- (void)deleteAndExit
{
connection_data *conn = purple_connection_get_protocol_data (purple_account_get_connection(account));
AIChat *chat = adium.interfaceController.activeChat;
if (chat) {
const char *name = [chat.name UTF8String];
tgl_peer_t *P = tgp_blist_lookup_peer_get (conn->TLS, name);
if (P) {
leave_and_delete_chat (conn->TLS, P);
}
leave_and_delete_chat_by_name (conn->TLS, [chat.name UTF8String]);
}
}
@ -184,6 +183,24 @@
[super cancelFileTransfer:fileTransfer];
}
- (NSString *)encodedAttributedString:(NSAttributedString *)inAttributedString forListObject:(AIListObject *)inListObject
{
static AIHTMLDecoder *htmlEncoder = nil;
if (!htmlEncoder) {
htmlEncoder = [[AIHTMLDecoder alloc] init];
[htmlEncoder setIncludesHeaders:NO];
[htmlEncoder setIncludesFontTags:NO];
[htmlEncoder setClosesFontTags:YES];
[htmlEncoder setIncludesStyleTags:NO];
[htmlEncoder setIncludesColorTags:NO];
[htmlEncoder setEncodesNonASCII:NO];
[htmlEncoder setPreservesAllSpaces:NO];
[htmlEncoder setUsesAttachmentTextEquivalents:YES];
}
return [htmlEncoder encodeHTML:inAttributedString imagesPath:nil];
}
#pragma mark Group Chats
/*!

View file

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="8191" systemVersion="15B42" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="9531" systemVersion="15C50" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="8191"/>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="9531"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="TelegramAccountViewController">
@ -26,7 +27,6 @@
<subviews>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Mv3-b8-21b">
<rect key="frame" x="124" y="106" width="177" height="22"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="+491573123456" drawsBackground="YES" id="ddM-ki-WMe">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
@ -35,7 +35,6 @@
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="yae-v6-YMB">
<rect key="frame" x="-54" y="109" width="172" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Phone Number:" id="0UB-Dx-PpB">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -44,7 +43,6 @@
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="CGg-HM-Fxl">
<rect key="frame" x="-54" y="39" width="172" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Password:" id="8u1-y6-XZw">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -53,7 +51,6 @@
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="MCb-6Q-kUW">
<rect key="frame" x="22" y="70" width="274" height="28"/>
<animations/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Your phone number in the international format, a leading '+' and without any other special chars." id="2C9-SB-kKZ">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -62,7 +59,6 @@
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="PaN-W9-uI1">
<rect key="frame" x="22" y="0.0" width="285" height="28"/>
<animations/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Needed when using two factor authentication." id="cCC-Jv-B6B">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -71,7 +67,6 @@
</textField>
<secureTextField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Hkg-uU-btb">
<rect key="frame" x="124" y="36" width="177" height="22"/>
<animations/>
<secureTextFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" usesSingleLineMode="YES" id="xzm-aB-xvz">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
@ -82,7 +77,6 @@
</secureTextFieldCell>
</secureTextField>
</subviews>
<animations/>
<point key="canvasLocation" x="380.5" y="38"/>
</customView>
<customView id="DGa-mQ-g3C" userLabel="Options">
@ -91,7 +85,6 @@
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zRH-KJ-uvC" userLabel="Accept Secret Chats">
<rect key="frame" x="6" y="52" width="168" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Ignore history older than" id="MSN-Hj-aRS">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -100,7 +93,6 @@
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="C4T-Hq-g5C" userLabel="Accept Secret Chats">
<rect key="frame" x="6" y="0.0" width="138" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" id="ARj-qB-Q5Z">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -109,7 +101,6 @@
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="gKj-Oj-qll">
<rect key="frame" x="176" y="47" width="49" height="22"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="lVr-43-iAS">
<numberFormatter key="formatter" formatterBehavior="default10_4" numberStyle="decimal" minimumIntegerDigits="1" maximumIntegerDigits="2000000000" maximumFractionDigits="3" id="tH1-pY-m7Q"/>
<font key="font" metaFont="system"/>
@ -119,9 +110,8 @@
</textField>
<matrix verticalHuggingPriority="750" fixedFrame="YES" allowsEmptySelection="NO" autorecalculatesCellSize="YES" translatesAutoresizingMaskIntoConstraints="NO" id="RGC-Jo-M5e">
<rect key="frame" x="176" y="135" width="76" height="58"/>
<animations/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
<size key="cellSize" width="66" height="18"/>
<size key="cellSize" width="65" height="18"/>
<size key="intercellSpacing" width="4" height="2"/>
<buttonCell key="prototype" type="radio" title="Radio" imagePosition="left" alignment="left" inset="2" id="XXf-7E-yhf">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
@ -144,18 +134,16 @@
</column>
</cells>
</matrix>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="sb8-oa-s84">
<textField verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="122" translatesAutoresizingMaskIntoConstraints="NO" id="sb8-oa-s84">
<rect key="frame" x="231" y="52" width="126" height="14"/>
<animations/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Days" id="cOl-DG-CvA">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="EEO-n2-kS3">
<textField verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="122" translatesAutoresizingMaskIntoConstraints="NO" id="EEO-n2-kS3">
<rect key="frame" x="6" y="37" width="126" height="14"/>
<animations/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="(0 days for unlimited)" id="TQS-UR-EnH">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@ -164,7 +152,6 @@
</textField>
<button fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4Xx-hY-Mzh">
<rect key="frame" x="6" y="75" width="251" height="24"/>
<animations/>
<buttonCell key="cell" type="check" title="Send read notifications when present" bezelStyle="regularSquare" imagePosition="left" scrollable="YES" lineBreakMode="clipping" state="on" inset="2" id="vdV-Ig-yub">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
@ -172,7 +159,6 @@
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4Mf-Qx-mrn" userLabel="Accept Secret Chats">
<rect key="frame" x="6" y="176" width="135" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" userInterfaceLayoutDirection="rightToLeft" alignment="left" title="Accept secret chats?" id="t4Q-j1-35n">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -181,7 +167,6 @@
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Nvv-1I-L31">
<rect key="frame" x="176" y="12" width="49" height="22"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="Pm0-Jw-ayL">
<numberFormatter key="formatter" formatterBehavior="default10_4" numberStyle="decimal" minimumIntegerDigits="1" maximumIntegerDigits="2000000000" maximumFractionDigits="3" id="L9W-52-Xg9"/>
<font key="font" metaFont="system"/>
@ -191,16 +176,14 @@
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="m95-No-oJH" userLabel="Accept Secret Chats">
<rect key="frame" x="6" y="17" width="168" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" userInterfaceLayoutDirection="rightToLeft" alignment="left" title="Display users offline after" id="zJx-0I-fdw">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="TaV-3x-dxE">
<textField verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="122" translatesAutoresizingMaskIntoConstraints="NO" id="TaV-3x-dxE">
<rect key="frame" x="231" y="17" width="126" height="14"/>
<animations/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Days" id="Aav-dA-OrQ">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@ -209,14 +192,12 @@
</textField>
<button fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Tat-1e-jqI">
<rect key="frame" x="6" y="105" width="178" height="24"/>
<animations/>
<buttonCell key="cell" type="check" title="Display read notifications" bezelStyle="regularSquare" imagePosition="left" scrollable="YES" lineBreakMode="clipping" state="on" inset="2" id="l1g-r5-pNb">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
</subviews>
<animations/>
<point key="canvasLocation" x="356" y="302"/>
</customView>
<userDefaultsController representsSharedInstance="YES" id="OjL-yD-9te"/>

View file

@ -34,8 +34,15 @@
static void tgl_chat_iterator_cb (tgl_peer_t *peer, void *extra) {
NSMutableArray *A = (__bridge NSMutableArray *)(extra);
// chats with 0 participants were deleted or left by the user
if (tgl_get_peer_type (peer->id) == TGL_PEER_CHAT && peer->chat.users_num > 0) {
if (tgl_get_peer_type (peer->id) == TGL_PEER_CHAT && !(peer->chat.flags & TGLCF_LEFT)) {
[A addObject: [NSString stringWithUTF8String: peer->print_name]];
}
}
static void tgl_channel_iterator_cb (tgl_peer_t *peer, void *extra) {
NSMutableArray *A = (__bridge NSMutableArray *)(extra);
if (tgl_get_peer_type (peer->id) == TGL_PEER_CHANNEL && !(peer->channel.flags & TGLCHF_LEFT)) {
[A addObject: [NSString stringWithUTF8String: peer->print_name]];
}
}
@ -52,7 +59,10 @@ static void tgl_chat_iterator_cb (tgl_peer_t *peer, void *extra) {
// fetch all active chats and put them into the select box
[popupButton_existingChat removeAllItems];
NSMutableArray *chats = [NSMutableArray new];
tgl_peer_iterator_ex (conn->TLS, tgl_chat_iterator_cb, (__bridge void *)(chats));
tgl_peer_iterator_ex (conn->TLS, tgl_channel_iterator_cb, (__bridge void *)(chats));
[popupButton_existingChat
addItemsWithTitles: [chats sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]];
@ -74,7 +84,7 @@ static void tgl_chat_iterator_cb (tgl_peer_t *peer, void *extra) {
// Join by link
NSString *link = [textField_joinByLink stringValue];
if ([link length]) {
import_chat_link_checked (conn->TLS, [link UTF8String]);
import_chat_link (conn->TLS, [link UTF8String]);
return;
}

View file

@ -20,6 +20,8 @@
# include "config.h"
#endif
#include "../commit.h"
#import "TelegramPlugin.h"
#import "TelegramService.h"
#import "telegram-purple.h"
@ -49,17 +51,17 @@ extern void purple_init_telegram_plugin();
- (NSString *)pluginAuthor
{
return @TG_AUTHOR;
return @PLUGIN_AUTHOR;
}
-(NSString *)pluginVersion
{
return @PACKAGE_VERSION;
return @PACKAGE_VERSION "\n\t\t\tcommit: " GIT_COMMIT "\n\t\t\tlibtgl: " TGL_VERSION;
}
-(NSString *)pluginDescription
{
return @TG_DESCRIPTION;
return @"Telegram Protocol Plugin";
}
-(char*)getPkName

View file

@ -42,6 +42,7 @@
C4B4BE391AB613950064AC17 /* TelegramJoinChatView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C4B4BE381AB613950064AC17 /* TelegramJoinChatView.xib */; };
C4B57BF01B1598D4006997F4 /* libtgl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C4B57BEF1B1598D4006997F4 /* libtgl.a */; };
C4D12DF01BC534CF00C0F6E1 /* tgp-blist.c in Sources */ = {isa = PBXBuildFile; fileRef = C4D12DEF1BC534CF00C0F6E1 /* tgp-blist.c */; };
C4D3EB5A1C3824C5003C895B /* tgp-info.c in Sources */ = {isa = PBXBuildFile; fileRef = C4D3EB581C3824C5003C895B /* tgp-info.c */; };
C4D432D81BC2783C00561667 /* tg-server.tglpub in Resources */ = {isa = PBXBuildFile; fileRef = C4D432D71BC2783C00561667 /* tg-server.tglpub */; };
C4D819061A5C862E0044CBA9 /* tgp-structs.c in Sources */ = {isa = PBXBuildFile; fileRef = C4D819041A5C862E0044CBA9 /* tgp-structs.c */; };
C4D9185B1C1C6B3900AECCA2 /* libgpg-error.0.dylib in Resources */ = {isa = PBXBuildFile; fileRef = C4D9185A1C1C6B3900AECCA2 /* libgpg-error.0.dylib */; };
@ -111,11 +112,12 @@
C4B57BE51B109E6D006997F4 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = "<group>"; };
C4B57BE81B10D814006997F4 /* configure.ac */ = {isa = PBXFileReference; lastKnownFileType = text; name = configure.ac; path = ../configure.ac; sourceTree = "<group>"; };
C4B57BE91B10D822006997F4 /* Makefile.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = Makefile.in; path = ../Makefile.in; sourceTree = "<group>"; };
C4B57BEC1B13B2C4006997F4 /* auto-types.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "auto-types.h"; path = "../auto/auto-types.h"; sourceTree = "<group>"; };
C4B57BED1B1598BE006997F4 /* telegram-purple */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "telegram-purple"; path = ..; sourceTree = "<group>"; };
C4B57BEF1B1598D4006997F4 /* libtgl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtgl.a; path = ../libs/libtgl.a; sourceTree = "<group>"; };
C4D12DEE1BC534CF00C0F6E1 /* tgp-blist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "tgp-blist.h"; path = "../tgp-blist.h"; sourceTree = "<group>"; };
C4D12DEF1BC534CF00C0F6E1 /* tgp-blist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "tgp-blist.c"; path = "../tgp-blist.c"; sourceTree = "<group>"; };
C4D3EB581C3824C5003C895B /* tgp-info.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "tgp-info.c"; path = "../tgp-info.c"; sourceTree = "<group>"; };
C4D3EB591C3824C5003C895B /* tgp-info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "tgp-info.h"; path = "../tgp-info.h"; sourceTree = "<group>"; };
C4D432D71BC2783C00561667 /* tg-server.tglpub */ = {isa = PBXFileReference; lastKnownFileType = file; name = "tg-server.tglpub"; path = "../tg-server.tglpub"; sourceTree = "<group>"; };
C4D819041A5C862E0044CBA9 /* tgp-structs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "tgp-structs.c"; path = "../tgp-structs.c"; sourceTree = "<group>"; };
C4D819051A5C862E0044CBA9 /* tgp-structs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "tgp-structs.h"; path = "../tgp-structs.h"; sourceTree = "<group>"; };
@ -265,12 +267,13 @@
C431EB7B1A76C737006521CB /* tgp-chat.c */,
C431EB7C1A76C737006521CB /* tgp-chat.h */,
C4E5280F1A8A907200C4B915 /* tgp-ft.c */,
C4B57BEC1B13B2C4006997F4 /* auto-types.h */,
C4E528101A8A907200C4B915 /* tgp-ft.h */,
C479A8001BB69C2100C153DF /* tgp-request.c */,
C479A8011BB69C2100C153DF /* tgp-request.h */,
C4D12DEE1BC534CF00C0F6E1 /* tgp-blist.h */,
C4D12DEF1BC534CF00C0F6E1 /* tgp-blist.c */,
C4D3EB591C3824C5003C895B /* tgp-info.h */,
C4D3EB581C3824C5003C895B /* tgp-info.c */,
330704C72BA03B848124B6F7 /* telegram-adium */,
);
name = "telegram-purple";
@ -286,6 +289,7 @@
C410948219BB2D7D0083BF3F /* Sources */,
C410948319BB2D7D0083BF3F /* Frameworks */,
C410948419BB2D7D0083BF3F /* Resources */,
C4C325A11C91BD230020D32E /* ShellScript */,
);
buildRules = (
);
@ -343,6 +347,22 @@
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
C4C325A11C91BD230020D32E /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "install_name_tool -change \"@executable_path/../Frameworks/libglib.framework/Versions/2.38.1/libglib\" \"@executable_path/../Frameworks/libglib.framework/libglib\" \"$TARGET_BUILD_DIR/$PRODUCT_NAME.$WRAPPER_EXTENSION/Contents/MacOS/$PRODUCT_NAME\"\ninstall_name_tool -change \"@executable_path/../Frameworks/libpurple.framework/Versions/2.10.7rd8d96a636413/libpurple\" \"@executable_path/../Frameworks/libpurple.framework/libpurple\" \"$TARGET_BUILD_DIR/$PRODUCT_NAME.$WRAPPER_EXTENSION/Contents/MacOS/$PRODUCT_NAME\"\n";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
C410948219BB2D7D0083BF3F /* Sources */ = {
isa = PBXSourcesBuildPhase;
@ -368,6 +388,7 @@
C425F9181A7069C300361AFC /* tgp-utils.c in Sources */,
C4D819061A5C862E0044CBA9 /* tgp-structs.c in Sources */,
C431EB7D1A76C737006521CB /* tgp-chat.c in Sources */,
C4D3EB5A1C3824C5003C895B /* tgp-info.c in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -422,7 +443,7 @@
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.11;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx10.11;
SDKROOT = macosx10.12;
};
name = Debug;
};
@ -460,7 +481,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.11;
SDKROOT = macosx10.11;
SDKROOT = macosx10.12;
};
name = Release;
};
@ -492,14 +513,14 @@
INSTALL_PATH = "$(HOME)/Library/Application Support/Adium 2.0/PlugIns/";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/../libs",
"$(PROJECT_DIR)/../tgl/libs",
"$(PROJECT_DIR)",
"$(PROJECT_DIR)/Frameworks",
"$(PROJECT_DIR)/Frameworks/Adium",
);
OTHER_CFLAGS = "-DPURPLE_STATIC_PRPL";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx10.11;
SDKROOT = macosx10.12;
WRAPPER_EXTENSION = AdiumLibpurplePlugin;
};
name = Debug;
@ -532,13 +553,13 @@
INSTALL_PATH = "$(HOME)/Library/Application Support/Adium 2.0/PlugIns/";
LIBRARY_SEARCH_PATHS = (
"$(PROJECT_DIR)",
"$(PROJECT_DIR)/../libs",
"$(PROJECT_DIR)/../tgl/libs",
"$(PROJECT_DIR)/Frameworks",
"$(PROJECT_DIR)/Frameworks/Adium",
);
OTHER_CFLAGS = "-DPURPLE_STATIC_PRPL";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx10.11;
SDKROOT = macosx10.12;
WRAPPER_EXTENSION = AdiumLibpurplePlugin;
};
name = Release;

View file

@ -11,10 +11,10 @@
},
"DVTSourceControlWorkspaceBlueprintIdentifierKey" : "1C5A3335-4726-410A-8E70-801C8879E269",
"DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : {
"32693D74F7AAA18802B0105461C73E1FD01CF3A3" : "telegram-purple\/tgl",
"2BAF9F6AF710B4D765F611851696219A50533669" : "tg",
"41D8FEA2FB3AAB94D0D4027A64957635038B427E" : "telegram-purple",
"78234520DB6A5DE1B463A6198C9122A9D1A44221" : "telegram-purple\/tgl\/tl-parser"
"32693D74F7AAA18802B0105461C73E1FD01CF3A3" : "telegram-purple\/tgl\/",
"2BAF9F6AF710B4D765F611851696219A50533669" : "tg\/",
"41D8FEA2FB3AAB94D0D4027A64957635038B427E" : "telegram-purple\/",
"78234520DB6A5DE1B463A6198C9122A9D1A44221" : "telegram-purple\/tgl\/tl-parser\/"
},
"DVTSourceControlWorkspaceBlueprintNameKey" : "telegram-adium",
"DVTSourceControlWorkspaceBlueprintVersion" : 204,

View file

@ -23,21 +23,24 @@
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
@ -52,10 +55,10 @@
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference

View file

@ -23,23 +23,27 @@
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Release">
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<PathRunnable
runnableDebuggingMode = "0"
FilePath = "/Applications/Adium.app">
</PathRunnable>
<MacroExpansion>
@ -55,10 +59,10 @@
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
</ProfileAction>
<AnalyzeAction

View file

@ -1,39 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>telegram-adium.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
<key>telegram-purple.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>2</integer>
</dict>
<key>telegrma-adium Release.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>1</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
<key>C410948519BB2D7D0083BF3F</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>C4B57BF11B160950006997F4</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>

View file

@ -19,11 +19,11 @@
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.2.4</string>
<string>1.3.1</string>
<key>CFBundleSignature</key>
<string>AdIM</string>
<key>CFBundleVersion</key>
<string>1</string>
<string>1.3.1</string>
<key>CFPlugInDynamicRegisterFunction</key>
<string></string>
<key>CFPlugInDynamicRegistration</key>
@ -43,7 +43,7 @@
<key>CFPlugInUnloadFunction</key>
<string></string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2014 Matthias Jentsch.</string>
<string>Copyright © 2014-2017 Matthias Jentsch.</string>
<key>NSPrincipalClass</key>
<string>TelegramPlugin</string>
</dict>

View file

@ -15,7 +15,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
Copyright Matthias Jentsch, Vitaly Valtman, Christopher Althaus, Markus Endres 2014-2015
Copyright Matthias Jentsch, Vitaly Valtman, Ben Wiederhake, Christopher Althaus 2014-2015
*/
#define _GNU_SOURCE
@ -473,8 +473,8 @@ void write_secret_chat_gw (struct tgl_state *TLS, void *extra, int success, stru
write_secret_chat_file (TLS);
}
void tgp_create_group_chat_by_usernames (struct tgl_state *TLS, const char *title, const char **users, int num_users,
int use_print_names) {
void tgp_create_group_chat_by_usernames (struct tgl_state *TLS, const char *title, const char **users,
int num_users, int use_print_names) {
tgl_peer_id_t ids[num_users + 1];
int i, j = 0;
ids[j++] = TLS->our_id;
@ -493,12 +493,12 @@ void tgp_create_group_chat_by_usernames (struct tgl_state *TLS, const char *titl
debug ("User %s not found in peer list", users[j]);
}
}
if (i > 0) {
if (j > 1) {
tgl_do_create_group_chat (TLS, j, ids, title, (int) strlen(title),
tgp_notify_on_error_gw, g_strdup (title));
tgp_notify_on_error_gw, g_strdup (title));
} else {
purple_notify_message (_telegram_protocol, PURPLE_NOTIFY_MSG_INFO, _("Couldn't create group"), _("Please select at least one other user."), NULL,
NULL, NULL);
purple_notify_message (_telegram_protocol, PURPLE_NOTIFY_MSG_INFO, _("Couldn't create group"),
_("Please select at least one other user."), NULL, NULL, NULL);
}
}

View file

@ -15,7 +15,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
Copyright Matthias Jentsch, Vitaly Valtman, Christopher Althaus, Markus Endres 2014-2015
Copyright Matthias Jentsch, Vitaly Valtman, Christopher Althaus, Ben Wiederhake 2014-2015
*/
#ifndef __TELEGRAM_BASE_H__
#define __TELEGRAM_BASE_H__

View file

@ -15,25 +15,26 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
Copyright Matthias Jentsch, Vitaly Valtman, Christopher Althaus, Markus Endres 2014-2015
Copyright Matthias Jentsch, Vitaly Valtman, Ben Wiederhake, Christopher Althaus 2014-2015
*/
#include "telegram-purple.h"
#include "commit.h"
#ifdef WIN32
#include "win32/win32dep.h"
#endif
static void update_message_handler (struct tgl_state *TLS, struct tgl_message *M);
static void update_user_handler (struct tgl_state *TLS, struct tgl_user *U, unsigned flags);
static void update_user_status_handler (struct tgl_state *TLS, struct tgl_user *U);
static void update_chat_handler (struct tgl_state *TLS, struct tgl_chat *C, unsigned flags);
static void update_secret_chat_handler (struct tgl_state *TLS, struct tgl_secret_chat *C, unsigned flags);
static void update_user_typing (struct tgl_state *TLS, struct tgl_user *U, enum tgl_typing_status status);
static void update_marked_read (struct tgl_state *TLS, int num, struct tgl_message *list[]);
static void update_on_logged_in (struct tgl_state *TLS);
static void update_on_ready (struct tgl_state *TLS);
static void on_user_get_info (struct tgl_state *TLS, void *info_data, int success, struct tgl_user *U);
static void update_user_typing (struct tgl_state *TLS, struct tgl_user *U, enum tgl_typing_status status);
static void update_secret_chat_typing (struct tgl_state *TLS, struct tgl_secret_chat *E);
static void update_user_status_handler (struct tgl_state *TLS, struct tgl_user *U);
static void update_user_handler (struct tgl_state *TLS, struct tgl_user *U, unsigned flags);
static void update_secret_chat_handler (struct tgl_state *TLS, struct tgl_secret_chat *C, unsigned flags);
static void update_on_failed_login (struct tgl_state *TLS);
const char *config_dir = "telegram-purple";
const char *user_pk_filename = "server.tglpub";
@ -44,39 +45,48 @@ const char *pk_path = "/etc/telegram-purple/server.tglpub";
#endif
struct tgl_update_callback tgp_callback = {
.new_msg = update_message_handler,
.marked_read = update_marked_read,
.logprintf = debug,
.get_values = request_value,
.logged_in = update_on_logged_in,
.started = update_on_ready,
.new_msg = update_message_handler,
.msg_receive = update_message_handler,
.user_update = update_user_handler,
.user_status_update = update_user_status_handler,
.chat_update = update_chat_handler,
.secret_chat_update = update_secret_chat_handler,
.type_notification = update_user_typing,
.marked_read = update_marked_read,
.create_print_name = tgp_blist_create_print_name
// FIXME: what about user_registred, user_activated, new_authorization, our_id ?
.type_in_secret_chat_notification = update_secret_chat_typing,
.type_in_chat_notification = update_chat_typing,
.chat_update = update_chat_handler,
.channel_update = update_channel_handler,
.user_update = update_user_handler,
.secret_chat_update = update_secret_chat_handler,
.msg_receive = update_message_handler,
.user_status_update = update_user_status_handler,
.create_print_name = tgp_blist_create_print_name,
.on_failed_login = update_on_failed_login
};
static void _update_buddy (struct tgl_state *TLS, tgl_peer_t *user, unsigned flags) {
PurpleBuddy *buddy = tgp_blist_buddy_find (TLS, user->id);
if (buddy) {
if (flags & TGL_UPDATE_DELETED) {
debug ("update deleted");
purple_blist_remove_buddy (buddy);
} else {
if (flags & TGL_UPDATE_CONTACT) {
debug ("update contact");
purple_blist_alias_buddy (buddy, user->print_name);
}
if (flags & TGL_UPDATE_PHOTO) {
tgl_do_get_user_info (TLS, user->id, 0, on_user_get_info, get_user_info_data_new (0, user->id));
debug ("update photo");
tgp_info_update_photo (&buddy->node, user);
}
}
}
}
static void update_user_handler (struct tgl_state *TLS, struct tgl_user *user, unsigned flags) {
debug ("update_user_handler() flags: %s", print_flags_update (flags));
debug ("update_user_handler() (%s)", print_flags_update (flags));
if (tgl_get_peer_id (TLS->our_id) == tgl_get_peer_id (user->id) && (flags & (TGL_UPDATE_NAME | TGL_UPDATE_CONTACT))) {
// own user object, do not add that user to the buddy list but make the ID known to the name lookup and
@ -89,6 +99,7 @@ static void update_user_handler (struct tgl_state *TLS, struct tgl_user *user, u
if (flags & TGL_UPDATE_CREATED) {
// user was allocated, fetch the corresponding buddy from the buddy list
PurpleBuddy *buddy = tgp_blist_buddy_find (TLS, user->id);
debug ("new user %s allocated (%s)", user->print_name, print_flags_user (user->flags));
if (user->flags & TGLUF_DELETED) {
if (buddy) {
@ -108,9 +119,6 @@ static void update_user_handler (struct tgl_state *TLS, struct tgl_user *user, u
if (buddy) {
info ("migrating buddy from old name %s to %s", purple_buddy_get_name (buddy), user->print_name);
buddy = tgp_blist_buddy_migrate (TLS, buddy, user);
if (user->photo_id) {
tgl_do_get_user_info (TLS, user->id, 0, on_user_get_info, get_user_info_data_new (0, user->id));
}
}
// the id isn't known to the lookup yet since the user is not in the buddy list. Add the id to the
@ -123,7 +131,17 @@ static void update_user_handler (struct tgl_state *TLS, struct tgl_user *user, u
if (strcmp (purple_buddy_get_alias (buddy), user->print_name)) {
serv_got_alias (tls_get_conn (TLS), purple_buddy_get_name (buddy), user->print_name);
}
}
if (user->flags & TGLUF_CONTACT) {
if (! buddy) {
tgp_blist_contact_add (TLS, user);
}
}
if (buddy) {
p2tgl_prpl_got_user_status (TLS, user->id, &user->status);
tgp_info_update_photo (&buddy->node, tgl_peer_get (TLS, user->id));
}
}
} else {
@ -132,17 +150,8 @@ static void update_user_handler (struct tgl_state *TLS, struct tgl_user *user, u
}
}
static void update_message_handler (struct tgl_state *TLS, struct tgl_message *M) {
write_files_schedule (TLS);
tgp_msg_recv (TLS, M);
}
static void update_user_status_handler (struct tgl_state *TLS, struct tgl_user *U) {
p2tgl_prpl_got_user_status (TLS, U->id, &U->status);
}
static void update_secret_chat_handler (struct tgl_state *TLS, struct tgl_secret_chat *U, unsigned flags) {
debug ("update_secret_chat_handler() flags: %s", print_flags_update (flags));
debug ("update_secret_chat_handler() (%s)", print_flags_update (flags));
PurpleBuddy *buddy = tgp_blist_buddy_find (TLS, U->id);
if (flags & TGL_UPDATE_CREATED) {
@ -151,15 +160,17 @@ static void update_secret_chat_handler (struct tgl_state *TLS, struct tgl_secret
if (flags & TGL_UPDATE_WORKING) {
write_secret_chat_file (TLS);
if (U->state == sc_ok) {
tgp_msg_sys_out (TLS, _("Secret chat ready."), U->id, TRUE);
tgp_msg_special_out (TLS , _("Secret chat ready.") , U->id, PURPLE_MESSAGE_NO_LOG | PURPLE_MESSAGE_SYSTEM);
}
}
if (buddy) {
if (flags & TGL_UPDATE_DELETED) {
U->state = sc_deleted;
write_secret_chat_file (TLS);
tgp_msg_sys_out (TLS, _("Secret chat terminated."), U->id, FALSE);
tgp_msg_special_out (TLS , _("Secret chat terminated.") , U->id, PURPLE_MESSAGE_SYSTEM);
purple_prpl_got_user_status (tls_get_pa (TLS), tgp_blist_lookup_purple_name (TLS, U->id), "offline", NULL);
purple_blist_remove_buddy (buddy);
} else {
_update_buddy (TLS, (tgl_peer_t *)U, flags);
}
@ -169,7 +180,7 @@ static void update_secret_chat_handler (struct tgl_state *TLS, struct tgl_secret
if (!(flags & TGL_UPDATE_DELETED)) {
if (! buddy) {
buddy = tgp_blist_buddy_new (TLS, (tgl_peer_t *)U);
purple_blist_add_buddy (buddy, NULL, tgp_blist_group_init ("Telegram"), NULL);
purple_blist_add_buddy (buddy, NULL, tgp_blist_group_init (_("Telegram")), NULL);
purple_blist_alias_buddy (buddy, U->print_name);
}
purple_prpl_got_user_status (tls_get_pa (TLS), tgp_blist_lookup_purple_name (TLS, U->id), "mobile", NULL);
@ -185,20 +196,18 @@ static void update_secret_chat_handler (struct tgl_state *TLS, struct tgl_secret
}
}
static void update_chat_handler (struct tgl_state *TLS, struct tgl_chat *chat, unsigned flags) {
debug ("update_chat_handler() flags: %s", print_flags_update(flags));
if (flags & TGL_UPDATE_CREATED) {
tgp_blist_lookup_add (TLS, chat->id, chat->print_title);
} else {
PurpleChat *ch = tgp_blist_chat_find (TLS, chat->id);
if (flags & TGL_UPDATE_TITLE && ch) {
purple_blist_alias_chat (ch, chat->print_title);
}
if (flags & TGL_UPDATE_DELETED && ch) {
purple_blist_remove_chat (ch);
}
}
static void update_user_status_handler (struct tgl_state *TLS, struct tgl_user *U) {
p2tgl_prpl_got_user_status (TLS, U->id, &U->status);
}
static void update_message_handler (struct tgl_state *TLS, struct tgl_message *M) {
write_files_schedule (TLS);
tgp_msg_recv (TLS, M, NULL);
}
static void update_secret_chat_typing (struct tgl_state *TLS, struct tgl_secret_chat *E) {
g_return_if_fail (tgp_blist_lookup_purple_name (TLS, E->id));
serv_got_typing (tls_get_conn (TLS), tgp_blist_lookup_purple_name (TLS, E->id), 2, PURPLE_TYPING);
}
static void update_user_typing (struct tgl_state *TLS, struct tgl_user *U, enum tgl_typing_status status) {
@ -218,40 +227,13 @@ static void update_marked_read (struct tgl_state *TLS, int num, struct tgl_messa
// only display the read recipes for messages that we sent ourselves
if (tgl_get_peer_id (list[i]->from_id) == tgl_get_peer_id (TLS->our_id)) {
debug ("update_mark_read to=%d", tgl_get_peer_id (list[i]->to_id));
tgp_msg_sys_out (TLS, _("Message marked as read."), list[i]->to_id, TRUE);
tgp_msg_special_out (TLS , _("Message marked as read."), list[i]->to_id, PURPLE_MESSAGE_SYSTEM);
}
}
}
}
static void on_userpic_loaded (struct tgl_state *TLS, void *extra, int success, const char *filename) {
struct download_desc *dld = extra;
struct tgl_user *U = dld->data;
tgl_peer_t *P = tgl_peer_get (TLS, dld->get_user_info_data->peer);
if (!success || !P) {
warning ("Can not load userpic for user %s %s", U->first_name, U->last_name);
tgp_notify_on_error_gw (TLS, NULL, success);
free (dld->get_user_info_data);
free (dld);
return;
}
int imgStoreId = p2tgl_imgstore_add_with_id (filename);
if (imgStoreId > 0) {
used_images_add (tls_get_data (TLS), imgStoreId);
p2tgl_buddy_icons_set_for_user (tls_get_pa (TLS), P->id, filename);
if (dld->get_user_info_data->show_info == 1) {
purple_notify_userinfo (tls_get_conn (TLS), tgp_blist_lookup_purple_name (TLS, P->id),
p2tgl_notify_peer_info_new (TLS, P), NULL, NULL);
}
}
free (dld->get_user_info_data);
free (dld);
}
static void on_get_dialog_list_done (struct tgl_state *TLS, void *callback_extra, int success, int size,
static void on_get_dialog_list_done (struct tgl_state *TLS, void *extra, int success, int size,
tgl_peer_id_t peers[], tgl_message_id_t *last_msg_id[], int unread_count[]) {
info ("Fetched dialogue list of size: %d", size);
if (tgp_error_if_false (TLS, success, "Fetching dialogue list failed", TLS->error)) {
@ -272,27 +254,7 @@ static void on_get_dialog_list_done (struct tgl_state *TLS, void *callback_extra
}
if (tgl_get_peer_type (UC->id) == TGL_PEER_USER) {
if (! (UC->user.flags & TGLUF_DELETED)) {
PurpleBuddy *buddy = tgp_blist_buddy_find (TLS, UC->id);
if (! buddy) {
info ("%s is in the dialogue list but not in the buddy list, add the user",
tgp_blist_lookup_purple_name (TLS, UC->id));
buddy = tgp_blist_buddy_new (TLS, UC);
purple_blist_add_buddy (buddy, NULL, tgp_blist_group_init ("Telegram"), NULL);
if (UC->user.photo_id) {
info ("%s has the photo %lld, fetch it.", buddy->name, UC->user.photo_id);
tgl_do_get_user_info (TLS, UC->id, 0, on_user_get_info, get_user_info_data_new (0, UC->id));
}
}
p2tgl_prpl_got_user_status (TLS, UC->id, &UC->user.status);
}
} else if (tgl_get_peer_type (UC->id) == TGL_PEER_CHAT) {
if (UC->chat.users_num > 0 &&
purple_account_get_bool (tls_get_data (TLS)->pa, TGP_KEY_JOIN_GROUP_CHATS, TGP_DEFAULT_JOIN_GROUP_CHATS)) {
PurpleChat *PC = tgp_blist_chat_find (TLS, UC->id);
if (!PC) {
PC = p2tgl_chat_new (TLS, &UC->chat);
purple_blist_add_chat (PC, tgp_blist_group_init ("Telegram Chats"), NULL);
}
tgp_blist_contact_add (TLS, &UC->user);
}
}
}
@ -302,26 +264,13 @@ static void on_get_dialog_list_done (struct tgl_state *TLS, void *callback_extra
tgp_chat_join_all_pending (TLS);
}
void on_user_get_info (struct tgl_state *TLS, void *info_data, int success, struct tgl_user *U) {
get_user_info_data *user_info_data = (get_user_info_data *)info_data;
tgl_peer_t *P = tgl_peer_get (TLS, user_info_data->peer);
g_return_if_fail (P);
if (! success) {
tgp_notify_on_error_gw (TLS, NULL, success);
return;
}
if (!U->photo || U->photo->sizes_num == 0) {
// No profile pic to load, display it right away
if (user_info_data->show_info) {
purple_notify_userinfo (tls_get_conn (TLS), tgp_blist_lookup_purple_name (TLS, P->id),
p2tgl_notify_peer_info_new (TLS, P), NULL, NULL);
static void on_get_channel_list_done (struct tgl_state *TLS, void *callback_extra, int success, int size,
tgl_peer_id_t peers[], tgl_message_id_t *last_msg_id[], int unread_count[]) {
int i;
for (i = 0; i < size; i ++) {
if (! tgp_channel_loaded (TLS, peers[i])) {
tgp_channel_load (TLS, tgl_peer_get (TLS, peers[i]), NULL, NULL);
}
g_free (user_info_data);
} else {
struct download_desc *dld = malloc (sizeof (struct download_desc));
dld->data = U;
dld->get_user_info_data = info_data;
tgl_do_load_photo (TLS, U->photo, on_userpic_loaded, dld);
}
}
@ -386,37 +335,43 @@ static void start_secret_chat (PurpleBlistNode *node, gpointer data) {
}
static void create_chat_link_done (struct tgl_state *TLS, void *extra, int success, const char *url) {
tgl_peer_t *C = extra;
tgl_peer_t *P = extra;
if (success) {
assert (tgl_get_peer_type (C->id) == TGL_PEER_CHAT);
tgp_chat_show (TLS, &C->chat);
char *msg = g_strdup_printf (_("Invite link: %s"), url);
serv_got_chat_in (tls_get_conn (TLS), tgl_get_peer_id (C->id), "WebPage", PURPLE_MESSAGE_SYSTEM, msg, time(NULL));
tgp_chat_got_in (TLS, P, P->id, msg, PURPLE_MESSAGE_SYSTEM, time(NULL));
g_free (msg);
} else {
tgp_notify_on_error_gw (TLS, NULL, success);
}
}
static void export_chat_link_checked_gw (PurpleBlistNode *node, gpointer data) {
PurpleChat *chat = (PurpleChat*)node;
export_chat_link_checked (pbn_get_data (node)->TLS, purple_chat_get_name (chat));
}
void export_chat_link_checked (struct tgl_state *TLS, const char *name) {
tgl_peer_t *C = tgp_blist_lookup_peer_get (TLS, name);
if (! C) {
failure ("Chat \"%s\" not found, not exporting link.", name);
return;
}
if (C->chat.admin_id != tgl_get_peer_id (TLS->our_id)) {
void export_chat_link (struct tgl_state *TLS, tgl_peer_t *P) {
if (! (P->flags & (TGLPF_ADMIN | TGLPF_CREATOR))) {
// FIXME: Can TGLCHF_MODERATOR export links?
purple_notify_error (_telegram_protocol, _("Creating chat link failed"), _("Creating chat link failed"),
_("You need to be admin of the group to do that."));
return;
}
tgl_do_export_chat_link (TLS, C->id, create_chat_link_done, C);
if (tgl_get_peer_type (P->id) == TGL_PEER_CHAT) {
tgl_do_export_chat_link (TLS, P->id, create_chat_link_done, P);
} else if (tgl_get_peer_type(P->id) == TGL_PEER_CHANNEL) {
tgl_do_export_channel_link (TLS, P->id, create_chat_link_done, P);
} else {
g_warn_if_reached();
}
}
static void export_chat_link_checked_gw (PurpleBlistNode *node, gpointer data) {
PurpleChat *chat = (PurpleChat*)node;
export_chat_link_by_name (pbn_get_data (node)->TLS, purple_chat_get_name (chat));
}
void export_chat_link_by_name (struct tgl_state *TLS, const char *name) {
g_return_if_fail(name);
tgl_peer_t *C = tgp_blist_lookup_peer_get (TLS, name);
g_warn_if_fail(C != NULL);
export_chat_link (TLS, C);
}
static void leave_and_delete_chat_gw (PurpleBlistNode *node, gpointer data) {
@ -428,16 +383,51 @@ static void leave_and_delete_chat_gw (PurpleBlistNode *node, gpointer data) {
void leave_and_delete_chat (struct tgl_state *TLS, tgl_peer_t *P) {
g_return_if_fail (P);
if (P && P->chat.users_num) {
tgl_do_del_user_from_chat (TLS, P->id, TLS->our_id, tgp_notify_on_error_gw, NULL);
if (tgl_get_peer_type(P->id) == TGL_PEER_CHAT) {
if (!(P->chat.flags & TGLCHF_LEFT)) {
tgl_do_del_user_from_chat (TLS, P->id, TLS->our_id, tgp_notify_on_error_gw, NULL);
}
} else if (tgl_get_peer_type(P->id) == TGL_PEER_CHANNEL) {
tgl_do_leave_channel (TLS, P->id, tgp_notify_on_error_gw, NULL);
} else {
g_return_if_reached();
}
serv_got_chat_left (tls_get_conn (TLS), tgl_get_peer_id (P->id));
PurpleChat *PC = tgp_blist_chat_find (TLS, P->id);
if (PC) {
purple_blist_remove_chat (PC);
}
}
void leave_and_delete_chat_by_name (struct tgl_state *TLS, const char *name) {
g_return_if_fail(name);
tgl_peer_t *P = tgp_blist_lookup_peer_get (TLS, name);
g_return_if_fail(P);
leave_and_delete_chat (TLS, P);
}
static PurpleCmdRet tgprpl_cmd_kick(PurpleConversation *conv, const gchar *cmd, gchar **args, gchar **error, void *data)
{
PurpleConnection *pc = NULL;
int id = -1;
gchar *who;
pc = conv->account->gc;
id = purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv));
if (pc == NULL || id == -1)
return PURPLE_CMD_RET_FAILED;
who = g_strjoinv(" ", args);
tgprpl_kick_from_chat(pc, id, who);
g_free(who);
return PURPLE_CMD_RET_OK;
}
static void import_chat_link_done (struct tgl_state *TLS, void *extra, int success) {
if (! success) {
tgp_notify_on_error_gw (TLS, NULL, success);
@ -447,7 +437,7 @@ static void import_chat_link_done (struct tgl_state *TLS, void *extra, int succe
_("Chat added to list of chat rooms."));
}
void import_chat_link_checked (struct tgl_state *TLS, const char *link) {
void import_chat_link (struct tgl_state *TLS, const char *link) {
tgl_do_import_chat_link (TLS, link, (int) strlen(link), import_chat_link_done, NULL);
}
@ -459,7 +449,7 @@ static GList* tgprpl_blist_node_menu (PurpleBlistNode *node) {
return NULL;
}
// chats that dont have a proper ID arent usable
// chats that don't have a proper ID aren't usable
if (PURPLE_BLIST_NODE_IS_CHAT(node) && ! tgp_chat_has_id ((PurpleChat *)node)) {
return NULL;
}
@ -518,14 +508,31 @@ static void update_on_ready (struct tgl_state *TLS) {
}
tgl_do_get_dialog_list (TLS, 200, 0, on_get_dialog_list_done, NULL);
tgl_do_get_channels_dialog_list (TLS, 50, 0, on_get_channel_list_done, NULL);
tgl_do_update_contact_list (TLS, 0, 0);
}
static void update_on_failed_login (struct tgl_state *TLS) {
info ("update_on_failed_login(): Login to telegram failed.");
// 401: SESSION_REVOKED is called when the session is cancelled during runtime
// 401: AUTH_KEY_UNREGISTERED is called when logging into a revoked session
if (strstr (TLS->error, "SESSION_REVOKED") ||
strstr (TLS->error, "AUTH_KEY_UNREGISTERED")) {
purple_account_set_bool (tls_get_pa (TLS), TGP_KEY_RESET_AUTH, TRUE);
}
purple_connection_error (tls_get_conn (TLS), TLS->error);
}
static gulong chat_conversation_typing_signal = 0;
static void tgprpl_login (PurpleAccount * acct) {
info ("tgprpl_login(): Purple is telling the prpl to connect the account");
PurpleConnection *gc = purple_account_get_connection (acct);
gc->flags |= PURPLE_CONNECTION_NO_BGCOLOR;
struct tgl_state *TLS = tgl_state_alloc ();
connection_data *conn = connection_data_init (TLS, gc, acct);
purple_connection_set_protocol_data (gc, conn);
@ -558,7 +565,7 @@ static void tgprpl_login (PurpleAccount * acct) {
tgl_set_rsa_key_direct (TLS, pubkey.e, pubkey.n_len, pubkey.n_raw);
} else {
failure ("both didn't work. abort.");
char *cause = g_strdup_printf (_("Unable to sign on as %s: pubkey not found."),
char *cause = g_strdup_printf (_("Unable to sign on as %s: file (public key) not found."),
purple_account_get_username (acct));
purple_connection_error_reason (gc, PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, cause);
char *long_hint = g_strdup_printf (
@ -580,13 +587,26 @@ static void tgprpl_login (PurpleAccount * acct) {
tgl_set_timer_methods (TLS, &tgp_timers);
tgl_set_callback (TLS, &tgp_callback);
tgl_register_app_id (TLS, TGP_APP_ID, TGP_APP_HASH);
tgl_init (TLS);
tgl_set_app_version (TLS, PACKAGE_VERSION);
if (tgl_init (TLS) != 0) {
debug ("Call to tgl_init failed.\n");
char *cause = g_strdup_printf (_("Unable to sign on as %s: problem in the underlying library"
" 'tgl'. Please submit a bug report with the debug log."),
purple_account_get_username (acct));
purple_connection_error_reason (gc, PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, cause);
purple_notify_message (_telegram_protocol, PURPLE_NOTIFY_MSG_ERROR, _("Problem in tgl"),
cause, NULL, NULL, NULL);
g_free (cause);
return;
}
if (! tgp_startswith (purple_account_get_username (acct), "+")) {
char *cause = g_strdup_printf (_("Unable to sign on as %s: phone number lacks country prefix."
" Numbers must start with the full international"
" prefix code, e.g. +49 for Germany."),
purple_account_get_username (acct));
// TRANSLATORS: Please fill in your own prefix!
char *cause = g_strdup_printf (_("Unable to sign on as %s: phone number lacks country prefix."
" Numbers must start with the full international"
" prefix code, e.g. +1 for USA."),
purple_account_get_username (acct));
purple_connection_error_reason (gc, PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, cause);
purple_notify_message (_telegram_protocol, PURPLE_NOTIFY_MSG_ERROR, _("Incomplete phone number"),
cause, NULL, NULL, NULL);
@ -597,8 +617,19 @@ static void tgprpl_login (PurpleAccount * acct) {
read_auth_file (TLS);
read_state_file (TLS);
if (purple_account_get_bool (acct, TGP_KEY_RESET_AUTH, FALSE)) {
info ("last login attempt failed, resetting authorization ...");
purple_account_set_bool (tls_get_pa (TLS), TGP_KEY_RESET_AUTH, FALSE);
bl_do_reset_authorization (TLS);
}
purple_connection_set_state (conn->gc, PURPLE_CONNECTING);
tgl_login (TLS);
if (!chat_conversation_typing_signal) {
chat_conversation_typing_signal = purple_signal_connect(purple_conversations_get_handle(), "chat-conversation-typing",
purple_connection_get_prpl (gc), PURPLE_CALLBACK(tgprpl_send_chat_typing), NULL);
}
}
static void tgprpl_close (PurpleConnection *gc) {
@ -611,7 +642,6 @@ static int tgprpl_send_im (PurpleConnection *gc, const char *who, const char *me
// workaround to support clients without the request API (request.h), see tgp-request.c:request_code()
if (gc_get_data (gc)->request_code_data) {
// OTR plugins may try to insert messages that don't contain the code
if (tgp_startswith (message, "?OTR")) {
info ("Fallback SMS auth, skipping OTR message: '%s'", message);
@ -625,19 +655,36 @@ static int tgprpl_send_im (PurpleConnection *gc, const char *who, const char *me
return 1;
}
// Make sure that to only send messages to an existing peer by searching it in the peer tree, to give immediate
// feedback by returning an error-code in case the peer doesn't exist.
// check receiver to give immediate feedback in case sending a message is not possible
tgl_peer_t *peer = tgp_blist_lookup_peer_get (gc_get_tls (gc), who);
if (peer) {
if (tgl_get_peer_type (peer->id) == TGL_PEER_ENCR_CHAT && peer->encr_chat.state != sc_ok) {
warning ("secret chat not ready for sending messages or deleted");
return -1;
if (! peer) {
warning ("peer not found");
return -1;
}
// secret chat not yet usable
if (tgl_get_peer_type (peer->id) == TGL_PEER_ENCR_CHAT && peer->encr_chat.state != sc_ok) {
const char *msg;
if (peer->encr_chat.state == sc_deleted) {
msg = _("Secret chat was already deleted");
} else {
msg = _("Secret chat is not ready");
}
return tgp_msg_send (gc_get_tls (gc), message, peer->id);
tgp_msg_special_out (gc_get_tls (gc), msg, peer->id, PURPLE_MESSAGE_NO_LOG | PURPLE_MESSAGE_ERROR);
return -1;
}
// channel owned by someone else (TEST: why does it work with supergroups?)
if (tgl_get_peer_type (peer->id) == TGL_PEER_CHANNEL && ! (peer->flags & TGLCHF_CREATOR)) {
tgp_msg_special_out (gc_get_tls (gc), _("Only the creator of a channel can post messages."), peer->id,
PURPLE_MESSAGE_NO_LOG | PURPLE_MESSAGE_ERROR);
return -1;
}
warning ("peer not found");
return -1;
// when the other peer receives a message it is obvious that the previous messages were read
pending_reads_send_user (gc_get_tls (gc), peer->id);
return tgp_msg_send (gc_get_tls (gc), message, peer->id);
}
static unsigned int tgprpl_send_typing (PurpleConnection *gc, const char *who, PurpleTypingState typing) {
@ -653,23 +700,6 @@ static unsigned int tgprpl_send_typing (PurpleConnection *gc, const char *who, P
return 0;
}
static void tgprpl_get_info (PurpleConnection *gc, const char *who) {
debug ("tgprpl_get_info()");
tgl_peer_t *peer = tgp_blist_lookup_peer_get (gc_get_data (gc)->TLS, who);
if (peer) {
get_user_info_data* info_data = get_user_info_data_new (1, peer->id);
if (tgl_get_peer_type (peer->id) == TGL_PEER_ENCR_CHAT) {
tgl_peer_t *parent_peer = tgp_encr_chat_get_partner (gc_get_tls (gc), &peer->encr_chat);
if (parent_peer) {
tgl_do_get_user_info (gc_get_tls (gc), parent_peer->id, 0, on_user_get_info, info_data);
}
} else {
tgl_do_get_user_info (gc_get_tls (gc), peer->id, 0, on_user_get_info, info_data);
}
}
}
static void tgprpl_set_status (PurpleAccount *acct, PurpleStatus *status) {
debug ("tgprpl_set_status(%s)", purple_status_get_name (status));
@ -677,28 +707,9 @@ static void tgprpl_set_status (PurpleAccount *acct, PurpleStatus *status) {
}
static void tgprpl_add_buddy (PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) {
tgl_peer_t *peer = tgl_peer_get_by_name (gc_get_tls (gc), buddy->name);
if (peer) {
_update_buddy (gc_get_tls (gc), peer, TGL_UPDATE_PHOTO);
tgp_blist_buddy_set_id (buddy, peer->id);
p2tgl_prpl_got_user_status (gc_get_tls (gc), peer->id, &peer->user.status);
}
}
static void tgprpl_remove_buddy (PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) {
debug ("tgprpl_remove_buddy()");
if (! buddy) {
return;
}
tgl_peer_t *peer = tgp_blist_buddy_get_peer (buddy);
if (peer) {
if (tgl_get_peer_type (peer->id) == TGL_PEER_ENCR_CHAT) {
/* TODO: implement the api call cancel secret chats. Currently the chat will only be marked as
deleted on our side so that it won't be added on startup
(when the secret chat file is loaded) */
bl_do_peer_delete (gc_get_tls (gc), peer->encr_chat.id);
}
tgl_peer_t *P = tgl_peer_get_by_name (gc_get_tls (gc), buddy->name);
if (P) {
tgp_blist_contact_add (gc_get_tls (gc), &P->user);
}
}
@ -715,20 +726,17 @@ static void tgprpl_chat_invite (PurpleConnection *gc, int id, const char *messag
tgl_do_add_user_to_chat (gc_get_tls (gc), chat->id, user->id, 0, tgp_notify_on_error_gw, chat);
}
static int tgprpl_send_chat (PurpleConnection *gc, int id, const char *message, PurpleMessageFlags flags) {
debug ("tgprpl_send_chat()");
int ret = tgp_msg_send (gc_get_tls (gc), message, TGL_MK_CHAT(id));
if (ret != 0) {
p2tgl_got_chat_in (gc_get_tls (gc), TGL_MK_CHAT(id), gc_get_tls (gc)->our_id, message, PURPLE_MESSAGE_RECV,
time (NULL));
}
return ret;
}
static gboolean tgprpl_can_receive_file (PurpleConnection *gc, const char *who) {
return TRUE;
}
static GHashTable *tgprpl_get_account_text_table (PurpleAccount *pa) {
GHashTable *HT;
HT = g_hash_table_new (g_str_hash, g_str_equal);
g_hash_table_insert(HT, "login_label", (gpointer) _("phone no. (+ country prefix)"));
return HT;
}
PurplePlugin *_telegram_protocol = NULL;
static PurplePluginProtocolInfo prpl_info = {
@ -757,13 +765,13 @@ static PurplePluginProtocolInfo prpl_info = {
tgprpl_send_im,
NULL, // set_info
tgprpl_send_typing,
tgprpl_get_info,
tgprpl_info_show,
tgprpl_set_status,
NULL, // set_idle
NULL, // change_passwd
tgprpl_add_buddy,
NULL, // add_buddies
tgprpl_remove_buddy,
tgprpl_request_delete_contact,
NULL, // remove_buddies
NULL, // add_permit
NULL, // add_deny
@ -806,7 +814,7 @@ static PurplePluginProtocolInfo prpl_info = {
NULL, // send_attention
NULL, // get_attention_types
sizeof(PurplePluginProtocolInfo),
NULL, // get_account_text_table
tgprpl_get_account_text_table, // get_account_text_table
NULL, // initiate_media
NULL, // get_media_caps
NULL, // get_moods
@ -816,6 +824,15 @@ static PurplePluginProtocolInfo prpl_info = {
NULL // add_buddies_with_invite
};
static gboolean tgprpl_load (PurplePlugin *plugin) {
purple_cmd_register("kick", "s", PURPLE_CMD_P_PLUGIN, PURPLE_CMD_FLAG_CHAT |
PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS,
PLUGIN_ID, tgprpl_cmd_kick,
_("kick <user>: Kick a user from the room."), NULL);
return TRUE;
}
static void tgprpl_init (PurplePlugin *plugin) {
PurpleAccountOption *opt;
@ -860,6 +877,11 @@ static void tgprpl_init (PurplePlugin *plugin) {
TGP_KEY_HISTORY_RETRIEVAL_THRESHOLD, TGP_DEFAULT_HISTORY_RETRIEVAL_THRESHOLD);
prpl_info.protocol_options = g_list_append (prpl_info.protocol_options, opt);
// Media
opt = purple_account_option_int_new (_("Autoload media size (kb)"), TGP_KEY_MEDIA_SIZE,
TGP_DEFAULT_MEDIA_SIZE);
prpl_info.protocol_options = g_list_append (prpl_info.protocol_options, opt);
// Chats
opt = purple_account_option_bool_new (_("Add all group chats to buddy list"),
TGP_KEY_JOIN_GROUP_CHATS, TGP_DEFAULT_JOIN_GROUP_CHATS);
@ -875,6 +897,7 @@ static void tgprpl_init (PurplePlugin *plugin) {
prpl_info.protocol_options = g_list_append (prpl_info.protocol_options, opt);
_telegram_protocol = plugin;
debug ("tgprpl_init finished: This is " PACKAGE_VERSION "+g" GIT_COMMIT " on libtgl " TGL_VERSION);
}
static GList *tgprpl_actions (PurplePlugin *plugin, gpointer context) {
@ -892,12 +915,12 @@ static PurplePluginInfo plugin_info = {
PURPLE_PRIORITY_DEFAULT,
PLUGIN_ID,
"Telegram",
PACKAGE_VERSION " libtgl: " TGL_VERSION,
PACKAGE_VERSION "\n\t\t\tcommit: " GIT_COMMIT "\n\t\t\tlibtgl: " TGL_VERSION,
"Telegram",
TG_DESCRIPTION,
TG_AUTHOR,
N_("Telegram Protocol Plugin."),
PLUGIN_AUTHOR,
"https://github.com/majn/telegram-purple",
NULL, // on load
tgprpl_load, // on load
NULL, // on unload
NULL, // on destroy
NULL, // ui specific struct

View file

@ -15,7 +15,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
Copyright Matthias Jentsch, Vitaly Valtman, Christopher Althaus, Markus Endres 2014-2015
Copyright Matthias Jentsch, Vitaly Valtman, Christopher Althaus, Ben Wiederhake 2014-2015
*/
#ifndef __TG_PURPLE_H__
#define __TG_PURPLE_H__
@ -32,6 +32,8 @@
#else
# define _(String) String
# define P_(Singular,Plural,N) Plural
# define N_(String) String
# define gettext(String) String
#endif
#include <tgl.h>
@ -53,20 +55,21 @@
#include "tgp-ft.h"
#include "tgp-msg.h"
#include "tgp-request.h"
#include "tgp-info.h"
#include "msglog.h"
#define PLUGIN_ID "prpl-telegram"
// FIXME: Name must be translated (for languages without latin script, it would look like gibberish. Just like Japanese script looks to me.)
#define TG_AUTHOR "Matthias Jentsch <mtthsjntsch@gmail.com>, Vitaly Valtman, Ben Wiederhake <BenWiederhake.GitHub@gmx.de>, Christopher Althaus <althaus.christopher@gmail.com>, based on libtgl by Vitaly Valtman."
#define TG_DESCRIPTION "Telegram protocol."
#define TG_BUILD "13"
#define PLUGIN_AUTHOR "Matthias Jentsch <mtthsjntsch@gmail.com>\n\t\t\tVitaly Valtman\n\t\t\tBen Wiederhake\n\t\t\tChristopher Althaus <althaus.christopher@gmail.com>"
#define TGP_APP_HASH "99428c722d0ed59b9cd844e4577cb4bb"
#define TGP_APP_ID 16154
#define TGP_MAX_MSG_SIZE 4096
#define TGP_DEFAULT_MAX_MSG_SPLIT_COUNT 4
#define TGP_DEFAULT_MEDIA_SIZE 32768
#define TGP_KEY_MEDIA_SIZE "media-size-threshold"
#define TGP_KEY_PASSWORD_TWO_FACTOR "password-two-factor"
#define TGP_DEFAULT_ACCEPT_SECRET_CHATS "ask"
@ -78,7 +81,7 @@
#define TGP_DEFAULT_HISTORY_RETRIEVAL_THRESHOLD 14
#define TGP_KEY_HISTORY_RETRIEVAL_THRESHOLD "history-retrieve-days"
#define TGP_DEFAULT_JOIN_GROUP_CHATS FALSE
#define TGP_DEFAULT_JOIN_GROUP_CHATS TRUE
#define TGP_KEY_JOIN_GROUP_CHATS "auto-join-group-chats"
#define TGP_DEFAULT_DISPLAY_READ_NOTIFICATIONS FALSE
@ -87,12 +90,21 @@
#define TGP_DEFAULT_SEND_READ_NOTIFICATIONS TRUE
#define TGP_KEY_SEND_READ_NOTIFICATIONS "send-read-notifications"
#define TGP_DEFAULT_CHANNEL_MEMBERS 500
#define TGP_KEY_CHANNEL_MEMBERS "channel-member-count"
#define TGP_KEY_RESET_AUTH "reset-authorization"
#define TGP_CHANNEL_HISTORY_LIMIT 500
extern const char *pk_path;
extern const char *user_pk_filename;
extern const char *config_dir;
extern PurplePlugin *_telegram_protocol;
void export_chat_link_checked (struct tgl_state *TLS, const char *name);
void import_chat_link_checked (struct tgl_state *TLS, const char *link);
void import_chat_link (struct tgl_state *TLS, const char *link);
void export_chat_link_by_name (struct tgl_state *TLS, const char *name);
void leave_and_delete_chat (struct tgl_state *TLS, tgl_peer_t *P);
void leave_and_delete_chat_by_name (struct tgl_state *TLS, const char *name);
void channel_load_photo (struct tgl_state *TLS, void *extra, int success, struct tgl_channel *C);
#endif

View file

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2015 Jiri Eischmann <eischmann@redhat.com>
-->
<component type="addon"><id>telegram-purple</id><extends>pidgin.desktop</extends><name>Telegram</name><summary>A plugin that adds support for Telegram</summary><url type="homepage">https://github.com/majn/telegram-purple</url><metadata_license>GFDL-1.3</metadata_license><project_license>GPL-2.0+</project_license><updatecontact>eischmann_at_redhat.com</updatecontact></component>

View file

@ -91,10 +91,14 @@ Section "MainSection" SEC01
after_copy:
SetOutPath "$PidginDir\locale"
File /nonfatal "/oname=bg\LC_MESSAGES\telegram-purple.mo" "po\bg.mo"
File /nonfatal "/oname=cs_CZ\LC_MESSAGES\telegram-purple.mo" "po\cs_CZ.mo"
File /nonfatal "/oname=de_DE\LC_MESSAGES\telegram-purple.mo" "po\de_DE.mo"
File /nonfatal "/oname=es_AR\LC_MESSAGES\telegram-purple.mo" "po\es_AR.mo"
File /nonfatal "/oname=fr\LC_MESSAGES\telegram-purple.mo" "po\fr.mo"
File /nonfatal "/oname=it_IT\LC_MESSAGES\telegram-purple.mo" "po\it_IT.mo"
File /nonfatal "/oname=nl\LC_MESSAGES\telegram-purple.mo" "po\nl.mo"
File /nonfatal "/oname=pl_PL\LC_MESSAGES\telegram-purple.mo" "po\pl_PL.mo"
File /nonfatal "/oname=pt_BR\LC_MESSAGES\telegram-purple.mo" "po\pt_BR.mo"
File /nonfatal "/oname=ru_RU\LC_MESSAGES\telegram-purple.mo" "po\ru_RU.mo"
File /nonfatal "/oname=sq\LC_MESSAGES\telegram-purple.mo" "po\sq.mo"
File /nonfatal "/oname=uk\LC_MESSAGES\telegram-purple.mo" "po\uk.mo"

14
telegram-purple.nsi.awk Normal file
View file

@ -0,0 +1,14 @@
{
if (match($0,"%")) {
do {
prev=lang;
getline lang<"po/LINGUAS";
l=$0;
gsub("%",lang,l);
if (prev!=lang) {print l}
} while (prev!=lang);
close("po/LINGUAS")
} else {
print $0
}
}

120
telegram-purple.nsi.awk-in Normal file
View file

@ -0,0 +1,120 @@
; This file is part of telegram-purple
;
; 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
;
; Copyright Matthias Jentsch, Eion Robb 2014-2015
; Script based on the Skype4Pidgin and Off-the-Record Messaging NSI files
SetCompress off
; todo: SetBrandingImage
; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "telegram-purple"
!define PRODUCT_VERSION "${PLUGIN_VERSION}"
!define PRODUCT_PUBLISHER "The telegram-purple team"
!define PRODUCT_WEB_SITE "https://github.com/majn/telegram-purple"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
; MUI 1.67 compatible ------
!include "MUI.nsh"
; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "COPYING"
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_TEXT "Run Pidgin"
!define MUI_FINISHPAGE_RUN_FUNCTION "RunPidgin"
!insertmacro MUI_PAGE_FINISH
; Uninstaller pages
;!insertmacro MUI_UNPAGE_INSTFILES
; Language files
!insertmacro MUI_LANGUAGE "English"
; MUI end ------
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME}-${PRODUCT_VERSION}.exe"
Var "PidginDir"
ShowInstDetails show
ShowUnInstDetails show
Section "MainSection" SEC01
;Check for pidgin installation
Call GetPidginInstPath
SetOverwrite try
SetOutPath "$PidginDir\pixmaps\pidgin"
File "/oname=protocols\16\telegram.png" "imgs\telegram16.png"
File "/oname=protocols\22\telegram.png" "imgs\telegram22.png"
File "/oname=protocols\48\telegram.png" "imgs\telegram48.png"
SetOverwrite try
copy:
ClearErrors
Delete "$PidginDir\plugins\${PRPL_NAME}"
IfErrors dllbusy
SetOutPath "$PidginDir\plugins"
File "bin\${PRPL_NAME}"
Goto after_copy
dllbusy:
MessageBox MB_RETRYCANCEL "${PRPL_NAME} is busy. Please close Pidgin (including tray icon) and try again" IDCANCEL cancel
Goto copy
cancel:
Abort "Installation of telegram-purple aborted"
after_copy:
SetOutPath "$PidginDir\locale"
File /nonfatal "/oname=%\LC_MESSAGES\telegram-purple.mo" "po\%.mo"
SetOutPath "$PidginDir"
File "/oname=server.tglpub" "tg-server.tglpub"
File "${WIN32_DEV_TOP}\libgpg-error-1.12-2\bin\libgpg-error-0.dll"
File "${WIN32_DEV_TOP}\libgcrypt-1.6.3\bin\libgcrypt-20.dll"
File "${WIN32_DEV_TOP}\libwebp-0.4.3-1\bin\libwebp-5.dll"
File "${WIN32_DEV_TOP}\mingw\bin\libgcc_s_sjlj-1.dll"
SectionEnd
Function GetPidginInstPath
Push $0
ReadRegStr $0 HKLM "Software\pidgin" ""
IfFileExists "$0\pidgin.exe" cont
ReadRegStr $0 HKCU "Software\pidgin" ""
IfFileExists "$0\pidgin.exe" cont
MessageBox MB_OK|MB_ICONINFORMATION "Failed to find Pidgin installation."
Abort "Failed to find Pidgin installation. Please install Pidgin first."
cont:
StrCpy $PidginDir $0
FunctionEnd
Function RunPidgin
ExecShell "" "$PidginDir\pidgin.exe"
FunctionEnd

2
test/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
/bin
/tmp

25
test/Makefile Normal file
View file

@ -0,0 +1,25 @@
PLUGIN_TESTS:=probetest loadtest
PLUGIN_TEST_BINS:=$(addprefix test/bin/,${PLUGIN_TESTS})
test/bin:
mkdir -p $@
test/tmp/%:
mkdir -p $@
test/bin/%: test/%.c test/bin bin/telegram-purple.so
${CC} ${CFLAGS} ${CPPFLAGS} -I ${srcdir}/tgl -o $@ $< ${LDFLAGS}
.PHONY: ${PLUGIN_TESTS}
${PLUGIN_TESTS}: %: test/bin/% test/tmp/user
$< bin/telegram-purple.so
.PHONY: check
check: ${PLUGIN_TESTS} test/tmp/user
.PHONY: recheck
recheck: clean-test check
.PHONY: clean-test
clean-test:
rm -rf test/bin test/tmp

286
test/loadtest.c Normal file
View file

@ -0,0 +1,286 @@
/*
This file is part of telegram-purple
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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
Copyright Ben Wiederhake 2016, Purple developers 2007-2015
Derived from the nullclient.c example at
https://github.com/Tasssadar/libpurple/blob/master/example/nullclient.c
*/
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <glib.h>
#include <purple.h>
#include <signal.h>
#include <string.h>
#include "../commit.h"
#include "../telegram-purple.h"
// The following eventloop functions are used in both pidgin and purple-text. If your application uses glib mainloop, you can safely use this verbatim.
#define PURPLE_GLIB_READ_COND (G_IO_IN | G_IO_HUP | G_IO_ERR)
#define PURPLE_GLIB_WRITE_COND (G_IO_OUT | G_IO_HUP | G_IO_ERR | G_IO_NVAL)
typedef struct TdfGLibIOClosure {
PurpleInputFunction function;
guint result;
gpointer data;
} TdfGLibIOClosure;
typedef struct TdfAccountRequestInfo {
PurpleAccountRequestType type;
PurpleAccount *account;
void *ui_handle;
char *user;
gpointer userdata;
PurpleAccountRequestAuthorizationCb auth_cb;
PurpleAccountRequestAuthorizationCb deny_cb;
guint ref;
} TdfAccountRequestInfo;
static void tdf_glib_io_destroy (gpointer data) {
g_free (data);
}
static gboolean tdf_glib_io_invoke (GIOChannel *source, GIOCondition condition, gpointer data) {
TdfGLibIOClosure *closure = data;
PurpleInputCondition purple_cond = 0;
if (condition & PURPLE_GLIB_READ_COND)
purple_cond |= PURPLE_INPUT_READ;
if (condition & PURPLE_GLIB_WRITE_COND)
purple_cond |= PURPLE_INPUT_WRITE;
closure->function (closure->data, g_io_channel_unix_get_fd (source), purple_cond);
return TRUE;
}
static guint tdf_glib_input_add (gint fd, PurpleInputCondition condition, PurpleInputFunction function, gpointer data) {
TdfGLibIOClosure *closure = g_new0(TdfGLibIOClosure, 1);
GIOChannel *channel;
GIOCondition cond = 0;
closure->function = function;
closure->data = data;
if (condition & PURPLE_INPUT_READ)
cond |= PURPLE_GLIB_READ_COND;
if (condition & PURPLE_INPUT_WRITE)
cond |= PURPLE_GLIB_WRITE_COND;
channel = g_io_channel_unix_new (fd);
closure->result = g_io_add_watch_full (channel, G_PRIORITY_DEFAULT, cond, tdf_glib_io_invoke, closure, tdf_glib_io_destroy);
g_io_channel_unref (channel);
return closure->result;
}
static PurpleEventLoopUiOps tdf_glib_eventloop_ops = {
g_timeout_add,
g_source_remove,
tdf_glib_input_add,
g_source_remove,
NULL,
#if GLIB_CHECK_VERSION(2,14,0)
g_timeout_add_seconds,
#else
NULL,
#endif
// padding
NULL,
NULL,
NULL
};
// End of the eventloop functions.
static PurpleConnectionUiOps connection_uiops = {
NULL, // connect_progress
NULL, // connected
NULL, // disconnected
NULL, // notice
NULL, // report_disconnect
NULL, // network_connected
NULL, // network_disconnected
NULL, // report_disconnect_reason
// padding
NULL,
NULL,
NULL
};
static void tdf_init (void) {
// This should initialize the UI components for all the modules.
purple_connections_set_ui_ops (&connection_uiops);
}
static PurpleCoreUiOps tdf_core_uiops = {
NULL,
NULL,
tdf_init,
NULL,
// padding
NULL,
NULL,
NULL,
NULL
};
PurplePlugin *tgp = NULL;
static void display_search_paths (GList *elem) {
printf ("Search paths:");
for (; elem; elem = elem->next) {
printf (" %s", (char *)elem->data);
}
printf ("\n");
}
static void tdf_inject_plugin (void) {
printf ("Injecting our module into purple_plugins_* ...\n");
purple_plugins_init ();
GList *search_paths = purple_plugins_get_search_paths ();
assert (!search_paths->prev && !search_paths->next && search_paths->data);
GList *new_paths = g_list_append (search_paths, g_strdup ("bin/"));
assert (new_paths == search_paths);
// Load "my" path before the default.
assert (search_paths->next && search_paths->next->data);
{
// swap(search_paths->data, search_paths->next->data);
gchar* tmp = search_paths->data;
search_paths->data = search_paths->next->data;
search_paths->next->data = tmp;
}
}
gboolean tdf_is_in_ci (void) {
gchar* envvar = getenv ("CONTINUOUS_INTEGRATION");
return envvar && g_str_equal ("true", envvar);
}
static void init_libpurple (void) {
// Set a custom user directory (optional)
purple_util_set_user_dir ("test/tmp/user");
// We *do* want debugging. However, this is just too much noise.
// Then again, this doesn't hurt if Travis does it. Query the environment to check whether we're in CI or not.
purple_debug_set_enabled (tdf_is_in_ci ());
/* Set the core-uiops, which is used to
* - initialize the ui specific preferences.
* - initialize the debug ui.
* - initialize the ui components for all the modules.
* - uninitialize the ui components for all the modules when the core terminates.
*/
purple_core_set_ui_ops (&tdf_core_uiops);
// Set the uiops for the eventloop. Since our client is glib-based, you can safely copy this verbatim. */
purple_eventloop_set_ui_ops (&tdf_glib_eventloop_ops);
tdf_inject_plugin ();
display_search_paths (purple_plugins_get_search_paths ());
// Now that all the essential stuff has been set, let's try to init the core.
printf ("Enter purple_core_init ...\n");
if (!purple_core_init ("tgp-dummy")) {
// Initializing the core failed. Terminate.
fprintf (stderr, "libpurple initialization failed. Abort.\n");
abort ();
}
printf ("Core initialized.\n");
// Create and load the buddylist.
purple_set_blist (purple_blist_new ());
// Find our plugin
printf ("Checking version:\n");
tgp = purple_plugins_find_with_id (PLUGIN_ID);
if (!tgp) {
printf ("Huh! Can't find plugin! Expected ID \"" PLUGIN_ID "\"");
abort ();
}
// Make sure we loaded the correct plugin
printf ("This is what we loaded:\n\t\t\tversion: %s\n", tgp->info->version);
gchar *pos = g_strrstr (tgp->info->version, "commit: " GIT_COMMIT);
if (pos == NULL) {
printf ("This is the wrong version, we built for commit %s. Abort!\n", GIT_COMMIT);
abort ();
} else {
printf ("Looks like the right version, because we also expected commit %s.\n", GIT_COMMIT);
}
}
//static void signed_on (PurpleConnection *gc) {
// PurpleAccount *account = purple_connection_get_account (gc);
// printf("Account connected: \"%s\" (%s)\n", purple_account_get_username(account), purple_account_get_protocol_id(account));
//}
//
//static void received_im_msg (PurpleAccount *account, char *sender, char *message, PurpleConversation *conv, PurpleMessageFlags flags) {
// if (conv==NULL) {
// conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, sender);
// }
//
// printf("(%s) %s (%s): %s\n", purple_utf8_strftime("%H:%M:%S", NULL), sender, purple_conversation_get_name(conv), message);
//}
//
//static void connect_to_signals(void)
//{
//
// static int handle;
//
// purple_signal_connect(purple_connections_get_handle(), "signed-on", &handle,
// PURPLE_CALLBACK(signed_on), NULL);
//
// purple_signal_connect(purple_conversations_get_handle(), "received-im-msg", &handle,
// PURPLE_CALLBACK(received_im_msg), NULL);
//
//}
int main(int argc, char *argv[])
{
printf ("Running loadtest on %s.\n", argv[1]);
GMainLoop *loop = g_main_loop_new(NULL, FALSE);
/* libpurple's built-in DNS resolution forks processes to perform
* blocking lookups without blocking the main process. It does not
* handle SIGCHLD itself, so if the UI does not you quickly get an army
* of zombie subprocesses marching around.
*/
signal(SIGCHLD, SIG_IGN);
printf ("Enter init_libpurple\n");
init_libpurple ();
printf ("libpurple %s initialized.\n", purple_core_get_version());
// Since we do not yet do anything useful, simply terminate after a few seconds.
purple_timeout_add (2000, purple_core_quit_cb, NULL);
g_timeout_add (4000, (GSourceFunc)g_main_loop_quit, loop);
// connect_to_signals();
// PurpleAccount *account = purple_account_new("YOUR_IM_ACCOUNTS_USERNAME_HERE", "prpl-IM_NETWORK_HERE"); //this could be prpl-aim, prpl-yahoo, prpl-msn, prpl-icq, etc.
// purple_account_set_password(account, "YOUR_IM_ACCOUNTS_PASSWORD_HERE");
// purple_accounts_add(account);
// purple_account_set_enabled(account, UI_ID, TRUE);
g_main_loop_run (loop);
return 0;
}

46
test/probetest.c Normal file
View file

@ -0,0 +1,46 @@
/*
This file is part of telegram-purple
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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
Copyright Ben Wiederhake 2016
*/
#include <assert.h>
#include <stdio.h>
#include <purple.h>
// Just try to probe (pre-load) the plugin. If that's successful, then probably a lot of stuff works.
int main (int argc, char **argv) {
assert(argc == 2);
printf ("Running probetest on %s.\n", argv[1]);
PurplePlugin *tgp = purple_plugin_probe (argv[1]);
if (!tgp) {
printf ("Looks like there was a problem! Aborting.\n");
return 1;
}
printf ("Looks good. Here's what I can read:\n");
PurplePluginInfo *info = tgp->info;
#define BLURB(x) printf (#x " = %s\n", info->x);
BLURB(id)
BLURB(name)
BLURB(version)
BLURB(summary)
BLURB(description)
BLURB(author)
BLURB(homepage)
return 0;
}

2
tgl

@ -1 +1 @@
Subproject commit ec0b19630f88ebe3b68e855f49ef134f0e98e943
Subproject commit 3ce5b5d856e537fe4693a99c26b5d17f7200f674

View file

@ -15,7 +15,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
Copyright Matthias Jentsch 2014
Copyright Matthias Jentsch, Ben Wiederhake 2014-2015
*/
#include "telegram-purple.h"
@ -36,6 +36,11 @@ connection_data *tls_get_data (struct tgl_state *TLS) {
return TLS->ev_base;
}
int tls_get_media_threshold (struct tgl_state *TLS) {
return purple_account_get_int (tls_get_pa (TLS),
TGP_KEY_MEDIA_SIZE, TGP_DEFAULT_MEDIA_SIZE) << 10;
}
connection_data *gc_get_data (PurpleConnection *gc) {
return purple_connection_get_protocol_data (gc);
}
@ -50,10 +55,10 @@ connection_data *pa_get_data (PurpleAccount *pa) {
connection_data *pbn_get_data (PurpleBlistNode *node) {
if (PURPLE_BLIST_NODE_IS_CHAT (node)) {
return pa_get_data (purple_chat_get_account((PurpleChat *) node));
return pa_get_data (purple_chat_get_account ((PurpleChat *) node));
}
if (PURPLE_BLIST_NODE_IS_BUDDY (node)) {
return pa_get_data (purple_buddy_get_account((PurpleBuddy *) node));
return pa_get_data (purple_buddy_get_account ((PurpleBuddy *) node));
}
return NULL;
}
@ -63,28 +68,39 @@ int p2tgl_status_is_present (PurpleStatus *status) {
return !(strcmp (name, "unavailable") == 0 || strcmp (name, "away") == 0);
}
void p2tgl_got_chat_in (struct tgl_state *TLS, tgl_peer_id_t chat, tgl_peer_id_t who, const char *message, int flags,
time_t when) {
serv_got_chat_in (tls_get_conn (TLS), tgl_get_peer_id (chat), tgp_blist_lookup_purple_name (TLS, who), flags,
message, when);
void tgp_chat_got_in (struct tgl_state *TLS, tgl_peer_t *chat, tgl_peer_id_t from, const char *message,
int flags, time_t when) {
g_return_if_fail(chat);
if (tgp_chat_show (TLS, chat)) {
// channel messages in non-megagroups are always sent by the channel itself
if (tgl_get_peer_type (chat->id) == TGL_PEER_CHANNEL && !(chat->channel.flags & TGLCHF_MEGAGROUP)) {
from = chat->id;
}
serv_got_chat_in (tls_get_conn (TLS), tgl_get_peer_id (chat->id), tgp_blist_lookup_purple_name (TLS, from),
flags, message, when);
} else {
g_warn_if_reached();
}
}
void p2tgl_got_im_combo (struct tgl_state *TLS, tgl_peer_id_t who, const char *msg, int flags, time_t when) {
connection_data *conn = TLS->ev_base;
if (flags & PURPLE_MESSAGE_SYSTEM) {
tgp_msg_sys_out (TLS, msg, who, flags & PURPLE_MESSAGE_NO_LOG);
tgp_msg_special_out (TLS, msg, who, flags & PURPLE_MESSAGE_NO_LOG);
return;
}
/*
Outgoing messages are not well supported in different libpurple clients,
purple_conv_im_write should have the best among different versions. Unfortunately
this causes buggy formatting in Adium, so we don't use this workaround in that case.
Outgoing messages are not well supported in different libpurple clients,
purple_conv_im_write should have the best among different versions. Unfortunately
this causes buggy formatting in Adium, so we don't use this workaround in that case.
NOTE: Outgoing messages will not work in Adium <= 1.6.0, there is no way to print outgoing
messages in those versions at all.
*/
NOTE: Outgoing messages will not work in Adium <= 1.6.0, there is no way to print outgoing
messages in those versions at all.
*/
#ifndef __ADIUM_
if (flags & PURPLE_MESSAGE_SEND) {
PurpleConversation *conv = p2tgl_find_conversation_with_account (TLS, who);
@ -102,11 +118,11 @@ void p2tgl_got_im_combo (struct tgl_state *TLS, tgl_peer_id_t who, const char *m
PurpleConversation *p2tgl_find_conversation_with_account (struct tgl_state *TLS, tgl_peer_id_t peer) {
int type = PURPLE_CONV_TYPE_IM;
if (tgl_get_peer_type (peer) == TGL_PEER_CHAT) {
if (tgl_get_peer_type (peer) == TGL_PEER_CHAT || tgl_get_peer_type (peer) == TGL_PEER_CHANNEL) {
type = PURPLE_CONV_TYPE_CHAT;
}
PurpleConversation *conv = purple_find_conversation_with_account (type, tgp_blist_lookup_purple_name (TLS, peer),
tls_get_pa (TLS));
PurpleConversation *conv = purple_find_conversation_with_account (type,
tgp_blist_lookup_purple_name (TLS, peer), tls_get_pa (TLS));
return conv;
}
@ -118,7 +134,7 @@ void p2tgl_prpl_got_user_status (struct tgl_state *TLS, tgl_peer_id_t user, stru
} else {
debug ("%d: when=%d", tgl_get_peer_id (user), status->when);
if (tgp_time_n_days_ago (
purple_account_get_int (data->pa, "inactive-days-offline", TGP_DEFAULT_INACTIVE_DAYS_OFFLINE)) > status->when && status->when) {
purple_account_get_int (data->pa, TGP_KEY_INACTIVE_DAYS_OFFLINE, TGP_DEFAULT_INACTIVE_DAYS_OFFLINE)) > status->when && status->when) {
debug ("offline");
purple_prpl_got_user_status (tls_get_pa (TLS), tgp_blist_lookup_purple_name (TLS, user), "offline", NULL);
} else {
@ -135,81 +151,6 @@ void p2tgl_conv_add_user (struct tgl_state *TLS, PurpleConversation *conv, int u
purple_conv_chat_add_user (purple_conversation_get_chat_data (conv), name, message, flags, new_arrival);
}
PurpleNotifyUserInfo *p2tgl_notify_user_info_new (struct tgl_user *U) {
PurpleNotifyUserInfo *info = purple_notify_user_info_new();
if (str_not_empty (U->first_name) && str_not_empty (U->last_name)) {
purple_notify_user_info_add_pair (info, _("First name"), U->first_name);
purple_notify_user_info_add_pair (info, _("Last name"), U->last_name);
} else {
purple_notify_user_info_add_pair (info, _("Name"), U->print_name);
}
if (str_not_empty (U->username)) {
char *username = g_strdup_printf ("@%s", U->username);
purple_notify_user_info_add_pair (info, _("Username"), username);
g_free (username);
}
char *status = tgp_format_user_status (&U->status);
purple_notify_user_info_add_pair (info, _("Last seen"), status);
g_free (status);
if (str_not_empty (U->phone)) {
char *phone = g_strdup_printf ("+%s", U->phone);
purple_notify_user_info_add_pair (info, _("Phone"), phone);
g_free (phone);
}
return info;
}
PurpleNotifyUserInfo *p2tgl_notify_encrypted_chat_info_new (struct tgl_state *TLS, struct tgl_secret_chat *secret,
struct tgl_user *U) {
PurpleNotifyUserInfo *info = p2tgl_notify_user_info_new (U);
if (secret->state == sc_waiting) {
purple_notify_user_info_add_pair (info, "", _("Waiting for the user to get online..."));
return info;
}
const char *ttl_key = _("Self destruction timer");
if (secret->ttl) {
char *ttl = g_strdup_printf ("%d", secret->ttl);
purple_notify_user_info_add_pair (info, ttl_key, ttl);
g_free (ttl);
} else {
purple_notify_user_info_add_pair (info, ttl_key, _("Timer is not enabled."));
}
if (secret->first_key_sha[0]) {
int sha1key_store_id = tgp_visualize_key (TLS, secret->first_key_sha);
if (sha1key_store_id != -1) {
char *ident_icon = tgp_format_img (sha1key_store_id);
purple_notify_user_info_add_pair (info, _("Secret key"), ident_icon);
g_free(ident_icon);
}
}
return info;
}
PurpleNotifyUserInfo *p2tgl_notify_peer_info_new (struct tgl_state *TLS, tgl_peer_t *P) {
switch (tgl_get_peer_type (P->id)) {
case TGL_PEER_ENCR_CHAT: {
struct tgl_secret_chat *chat = &P->encr_chat;
tgl_peer_t *partner = tgp_encr_chat_get_partner (TLS, chat);
return p2tgl_notify_encrypted_chat_info_new (TLS, chat, &partner->user);
}
case TGL_PEER_USER:
return p2tgl_notify_user_info_new (&P->user);
default:
return purple_notify_user_info_new ();
}
}
int p2tgl_imgstore_add_with_id (const char* filename) {
gchar *data = NULL;
size_t len;
@ -259,7 +200,7 @@ int p2tgl_imgstore_add_with_id_webp (const char *filename) {
// downscale oversized sticker images displayed in chat, otherwise it would harm readabillity
WebPDecoderConfig config;
WebPInitDecoderConfig (&config);
if (! WebPGetFeatures(data, len, &config.input) == VP8_STATUS_OK) {
if (WebPGetFeatures(data, len, &config.input) != VP8_STATUS_OK) {
warning ("error reading webp bitstream: %s", filename);
g_free ((gchar *)data);
return 0;
@ -287,7 +228,7 @@ int p2tgl_imgstore_add_with_id_webp (const char *filename) {
config.options.use_scaling = 1;
}
config.output.colorspace = MODE_BGRA;
if (! WebPDecode(data, len, &config) == VP8_STATUS_OK) {
if (WebPDecode(data, len, &config) != VP8_STATUS_OK) {
warning ("error decoding webp: %s", filename);
g_free ((gchar *)data);
return 0;
@ -301,12 +242,3 @@ int p2tgl_imgstore_add_with_id_webp (const char *filename) {
return imgStoreId;
}
#endif
void p2tgl_buddy_icons_set_for_user (PurpleAccount *pa, tgl_peer_id_t id, const char* filename) {
gchar *data = NULL;
size_t len;
GError *err = NULL;
g_file_get_contents (filename, &data, &len, &err);
purple_buddy_icons_set_for_user (pa, tgp_blist_lookup_purple_name (pa_get_data (pa)->TLS, id), data, len, NULL);
}

View file

@ -27,6 +27,7 @@
PurpleAccount *tls_get_pa (struct tgl_state *TLS);
PurpleConnection *tls_get_conn (struct tgl_state *TLS);
connection_data *tls_get_data (struct tgl_state *TLS);
int tls_get_media_threshold (struct tgl_state *TLS);
connection_data *gc_get_data (PurpleConnection *gc);
connection_data *pa_get_data (PurpleAccount *pa);
connection_data *pbn_get_data (PurpleBlistNode *node);
@ -34,17 +35,13 @@ struct tgl_state *gc_get_tls (PurpleConnection *gc);
int p2tgl_status_is_present (PurpleStatus *status);
void p2tgl_got_chat_in (struct tgl_state *TLS, tgl_peer_id_t chat, tgl_peer_id_t who, const char *message, int flags, time_t when);
void tgp_chat_got_in (struct tgl_state *TLS, tgl_peer_t *chat, tgl_peer_id_t who, const char *message, int flags, time_t when);
void p2tgl_got_im_combo (struct tgl_state *TLS, tgl_peer_id_t who, const char *msg, int flags, time_t when);
void p2tgl_prpl_got_user_status (struct tgl_state *TLS, tgl_peer_id_t user, struct tgl_user_status *status);
void p2tgl_conv_add_user (struct tgl_state *TLS, PurpleConversation *conv, int user, char *message, int flags, int new_arrival);
PurpleConversation *p2tgl_find_conversation_with_account (struct tgl_state *TLS, tgl_peer_id_t peer);
PurpleNotifyUserInfo *p2tgl_notify_peer_info_new (struct tgl_state *TLS, tgl_peer_t *P);
PurpleNotifyUserInfo *p2tgl_notify_user_info_new (struct tgl_user *U);
PurpleNotifyUserInfo *p2tgl_notify_encrypted_chat_info_new (struct tgl_state *TLS, struct tgl_secret_chat *secret, struct tgl_user *U);
int p2tgl_imgstore_add_with_id (const char* filename);
void p2tgl_buddy_icons_set_for_user (PurpleAccount *pa, tgl_peer_id_t id, const char* filename);
int p2tgl_imgstore_add_with_id (const char* filename);
int p2tgl_imgstore_add_with_id_raw (const unsigned char *raw_rgba, unsigned width, unsigned height);
#ifdef HAVE_LIBWEBP
int p2tgl_imgstore_add_with_id_webp (const char *filename);

View file

@ -1,4 +1,5 @@
/* This file is part of telegram-purple
/*
This file is part of telegram-purple
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
@ -102,15 +103,14 @@ PurpleBuddy *tgp_blist_buddy_migrate (struct tgl_state *TLS, PurpleBuddy *buddy,
purple_blist_remove_buddy (buddy);
buddy = purple_buddy_new (tls_get_pa (TLS), user->print_name, NULL);
tgp_blist_buddy_set_id (buddy, user->id);
purple_blist_add_buddy (buddy, NULL, tgp_blist_group_init ("Telegram"), NULL);
purple_blist_add_buddy (buddy, NULL, tgp_blist_group_init (_("Telegram")), NULL);
return buddy;
}
void tgp_blist_buddy_set_id (PurpleBuddy *buddy, tgl_peer_id_t id) {
int uid = tgl_get_peer_id (id),
type = tgl_get_peer_type (id);
assert (type == TGL_PEER_ENCR_CHAT || type == TGL_PEER_USER);
assert (type == TGL_PEER_ENCR_CHAT || type == TGL_PEER_USER || type == TGL_PEER_CHANNEL);
purple_blist_node_set_int (&buddy->node, TGP_BUDDY_KEY_PEER_ID, uid);
purple_blist_node_set_int (&buddy->node, TGP_BUDDY_KEY_PEER_TYPE, type);
}
@ -122,11 +122,12 @@ int tgp_blist_buddy_has_id (PurpleBuddy *buddy) {
tgl_peer_id_t tgp_blist_buddy_get_id (PurpleBuddy *buddy) {
int id = purple_blist_node_get_int (&buddy->node, TGP_BUDDY_KEY_PEER_ID),
type = purple_blist_node_get_int (&buddy->node, TGP_BUDDY_KEY_PEER_TYPE);
if (type == TGL_PEER_USER) {
return TGL_MK_USER (id);
} else if (type == TGL_PEER_ENCR_CHAT) {
return TGL_MK_ENCR_CHAT (id);
} else if (type == TGL_PEER_CHANNEL) {
return TGL_MK_CHANNEL (id);
} else {
return tgl_set_peer_id (TGL_PEER_UNKNOWN, 0);
}
@ -149,6 +150,23 @@ PurpleBuddy *tgp_blist_buddy_find (struct tgl_state *TLS, tgl_peer_id_t user) {
return (PurpleBuddy *) tgp_blist_iterate (TLS, tgp_blist_buddy_find_cb, GINT_TO_POINTER(tgl_get_peer_id (user)));
}
// contacts
void tgp_blist_contact_add (struct tgl_state *TLS, struct tgl_user *U) {
PurpleBuddy *buddy = tgp_blist_buddy_find (TLS, U->id);
if (! buddy) {
tgl_peer_t *P = tgl_peer_get (TLS, U->id);
info ("Adding contact '%s' to buddy list", tgp_blist_lookup_purple_name (TLS, U->id));
buddy = tgp_blist_buddy_new (TLS, P);
purple_blist_add_buddy (buddy, NULL, tgp_blist_group_init (_("Telegram")), NULL);
tgp_info_update_photo (&buddy->node, P);
}
p2tgl_prpl_got_user_status (TLS, U->id, &U->status);
}
// chats
static int tgp_blist_chat_find_cb (PurpleBlistNode *node, void *extra) {
@ -170,24 +188,25 @@ PurpleChat *tgp_blist_chat_find (struct tgl_state *TLS, tgl_peer_id_t user) {
PurpleGroup *tgp_blist_group_init (const char *name) {
PurpleGroup *grp = purple_find_group (name);
if (grp == NULL) {
if (! grp) {
grp = purple_group_new (name);
purple_blist_add_group (grp, NULL);
}
return grp;
}
// names
char *tgp_blist_create_print_name (struct tgl_state *TLS, tgl_peer_id_t id, const char *a1, const char *a2,
const char *a3, const char *a4) {
// libtgl passes 0 for all unused strings, therefore the last passed string will always be followed
// by a NULL-termination as expected
gchar *name = g_strjoin (" ", a1, a2, a3, a4, NULL);
// When the user doesn't provide some input (like last name) ugly trailing or leading
// whitespaces may occur due to empty strings in the join operator
// whitespaces may occur due to empty strings in the g_strjoin arguments
name = g_strstrip(name);
/* Assure that all print_names are unique by checking the following conditions:
@ -196,17 +215,34 @@ char *tgp_blist_create_print_name (struct tgl_state *TLS, tgl_peer_id_t id, cons
2. No BlistNode with that name should exists unless it is already corresponding to this peer ID. The rationale is
that this prpl uses the first print_name as permanent name for each user. Therefore it must be assured that no
foreign user will ever take this exact name again, otherwise the current users actions might be associated
with the old BlistNode. */
with the old BlistNode.
3. Assure that the print name isn't already stored in the peer_by_name_tree.
*/
int i = 0;
gchar *n = NULL;
tgl_peer_id_t *id2 = tgp_blist_lookup_get_id (TLS, name);
if ( !id2) {
tgl_peer_t *tmpP = tgl_peer_get_by_name (TLS, name);
if (tmpP) {
id2 = &tmpP->id;
}
}
while (id2 && tgl_get_peer_id (*id2) != tgl_get_peer_id (id)) {
if (n) {
g_free (n);
}
n = g_strdup_printf ("%s #%d", name, ++ i);
debug ("resolving duplicate for %s, assigning: %s", name, n);
id2 = tgp_blist_lookup_get_id (TLS, n);
if ( !id2) {
tgl_peer_t *tmpP = tgl_peer_get_by_name(TLS, n);
if (tmpP) {
id2 = &tmpP->id;
}
}
}
if (n) {
g_free (name);
@ -218,4 +254,3 @@ char *tgp_blist_create_print_name (struct tgl_state *TLS, tgl_peer_id_t id, cons
g_free (name);
return S;
}

View file

@ -51,6 +51,9 @@ tgl_peer_t *tgp_blist_buddy_get_peer (PurpleBuddy *peer);
PurpleBuddy *tgp_blist_buddy_new (struct tgl_state *TLS, tgl_peer_t *user);
PurpleBuddy *tgp_blist_buddy_migrate (struct tgl_state *TLS, PurpleBuddy *buddy, struct tgl_user *user);
PurpleBuddy *tgp_blist_buddy_find (struct tgl_state *TLS, tgl_peer_id_t user);
void tgp_blist_contact_add (struct tgl_state *TLS, struct tgl_user *U);
PurpleChat *tgp_blist_chat_find (struct tgl_state *TLS, tgl_peer_id_t user);
PurpleGroup *tgp_blist_group_init (const char *name);

View file

@ -15,52 +15,87 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
Copyright Matthias Jentsch 2014-2015
Copyright Matthias Jentsch, Ben Wiederhake 2014-2016
*/
#include "tgp-chat.h"
GHashTable *tgp_chat_info_new (struct tgl_state *TLS, struct tgl_chat *chat) {
gchar *title = g_strdup (chat->print_title);
GHashTable *ht = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);
g_hash_table_insert (ht, "subject", title);
g_hash_table_insert (ht, "id", g_strdup_printf ("%d", tgl_get_peer_id (chat->id)));
GHashTable *tgp_chat_info_new (struct tgl_state *TLS, tgl_peer_t *P) {
// libpurple chat components own the keys and the values when created from blist be consistent
GHashTable *ht = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
g_hash_table_insert (ht, g_strdup ("subject"), g_strdup (P->print_name));
g_hash_table_insert (ht, g_strdup ("id"), g_strdup_printf ("%d", tgl_get_peer_id (P->id)));
g_hash_table_insert (ht, g_strdup ("type"), g_strdup_printf ("%d", tgl_get_peer_type (P->id)));
if (tgl_get_peer_type (P->id) == TGL_PEER_CHANNEL) {
g_hash_table_insert (ht, g_strdup ("last_server_id"), g_strdup_printf ("%d", 0));
}
return ht;
}
PurpleChat *p2tgl_chat_new (struct tgl_state *TLS, struct tgl_chat *chat) {
return purple_chat_new (tls_get_pa (TLS), chat->title, tgp_chat_info_new (TLS, chat));
}
void p2tgl_chat_update (struct tgl_state *TLS, PurpleChat *chat, tgl_peer_id_t id, int admin_id, const char *subject) {
GHashTable *ht = purple_chat_get_components (chat);
g_hash_table_replace (ht, g_strdup ("id"), g_strdup_printf ("%d", tgl_get_peer_id (id)));
g_hash_table_replace (ht, g_strdup ("subject"), g_strdup (subject));
}
int tgp_chat_has_id (PurpleChat *C) {
const char *id = g_hash_table_lookup (purple_chat_get_components (C), "id");
return id && *id;
}
tgl_peer_id_t tgp_chat_get_id (PurpleChat *C) {
const char *id = g_hash_table_lookup (purple_chat_get_components (C), "id");
assert (id && *id);
return TGL_MK_CHAT(atoi (id));
const char *I = g_hash_table_lookup (purple_chat_get_components (C), "id");
const char *T = g_hash_table_lookup (purple_chat_get_components (C), "type");
int type = TGL_PEER_CHAT;
if (T && *T) {
type = atoi (T);
}
return tgl_set_peer_id (type, (I && *I) ? atoi (I) : 0);
}
void tgp_chat_on_loaded_chat_full (struct tgl_state *TLS, struct tgl_chat *C) {
PurpleChat *PC = tgp_blist_chat_find (TLS, C->id);
if (!PC) {
PC = p2tgl_chat_new (TLS, C);
if (purple_account_get_bool (tls_get_pa (TLS), TGP_KEY_JOIN_GROUP_CHATS, TGP_DEFAULT_JOIN_GROUP_CHATS)) {
purple_blist_add_chat (PC, tgp_blist_group_init ("Telegram Chats"), NULL);
void tgp_chat_set_last_server_id (struct tgl_state *TLS, tgl_peer_id_t chat, int id) {
info ("setting channel message server_id=d%", id);
char *key = g_strdup_printf ("last-server-id/%d", tgl_get_peer_id (chat));
purple_account_set_int (tls_get_pa (TLS), key, id);
g_free (key);
}
int tgp_chat_get_last_server_id (struct tgl_state *TLS, tgl_peer_id_t chat) {
char *key = g_strdup_printf ("last-server-id/%d", tgl_get_peer_id (chat));
int last = purple_account_get_int (tls_get_pa (TLS), key, 0);
g_free (key);
return (unsigned int) last;
}
PurpleChat *tgp_chat_blist_store (struct tgl_state *TLS, tgl_peer_t *P, const char *group) {
g_return_val_if_fail(tgl_get_peer_type (P->id) == TGL_PEER_CHAT || tgl_get_peer_type (P->id) == TGL_PEER_CHANNEL, NULL);
PurpleChat *PC = tgp_blist_chat_find (TLS, P->id);
if (! (P->flags & TGLCF_LEFT)) {
if (! PC) {
PC = purple_chat_new (tls_get_pa (TLS), P->chat.print_title, tgp_chat_info_new (TLS, P));
// adding chats to the blist in Adium would cause the bookmarks and auto-joins to fail,
// as Adium assumes that a chat existing in blist means the user already joined
#ifndef __ADIUM_
if (purple_account_get_bool (tls_get_pa (TLS), TGP_KEY_JOIN_GROUP_CHATS, TGP_DEFAULT_JOIN_GROUP_CHATS)) {
purple_blist_add_chat (PC, tgp_blist_group_init (group), NULL);
}
#endif
}
tgp_info_update_photo (&PC->node, tgl_peer_get (TLS, P->id));
} else {
if (PC) {
purple_blist_remove_chat (PC);
PC = NULL;
}
}
p2tgl_chat_update (TLS, PC, C->id, C->admin_id, C->print_title);
if (PC) {
g_hash_table_replace (purple_chat_get_components (PC), g_strdup ("id"),
g_strdup_printf ("%d", tgl_get_peer_id (P->id)));
g_hash_table_replace (purple_chat_get_components (PC), g_strdup ("type"),
g_strdup_printf ("%d", tgl_get_peer_type (P->id)));
g_hash_table_replace (purple_chat_get_components (PC), g_strdup ("subject"),
g_strdup (tgl_get_peer_type (P->id) == TGL_PEER_CHANNEL ? P->channel.title : P->chat.title));
}
return PC;
}
static void tgp_chat_on_loaded_chat_full_joining (struct tgl_state *TLS, void *_, int success, struct tgl_chat *C) {
@ -70,58 +105,191 @@ static void tgp_chat_on_loaded_chat_full_joining (struct tgl_state *TLS, void *_
return;
}
tgp_chat_on_loaded_chat_full (TLS, C);
tgp_chat_show (TLS, C);
tgp_chat_blist_store (TLS, tgl_peer_get (TLS, C->id), _("Telegram Chats"));
tgp_chat_show (TLS, tgl_peer_get (TLS, C->id));
// Check if the users attempts to join an empty chat
if (! C->user_list_size) {
p2tgl_got_chat_in (TLS, C->id, C->id, _("You have already left this chat."), PURPLE_MESSAGE_SYSTEM, time (NULL));
if (C->flags & TGLCF_LEFT) {
tgp_chat_got_in (TLS, tgl_peer_get (TLS, C->id), C->id, _("You have already left this chat."), PURPLE_MESSAGE_SYSTEM,
time (NULL));
}
}
static void tgp_chat_add_all_users (struct tgl_state *TLS, PurpleConversation *conv, struct tgl_chat *C) {
static void tgp_chat_on_loaded_channel_full_joining (struct tgl_state *TLS, void *extra, int success, tgl_peer_t *P) {
debug ("tgp_chat_on_loaded_channel_full_joining()");
if (! success) {
tgp_notify_on_error_gw (TLS, NULL, success);
return;
}
tgp_chat_blist_store (TLS, P, _("Telegram Channels"));
tgp_chat_show (TLS, P);
}
static void tgp_chat_add_all_users (struct tgl_state *TLS, PurpleConversation *conv, tgl_peer_t *P) {
debug ("tgp_chat_add_all_users()");
GList *users = NULL,
*flags = NULL;
debug ("tgp_chat_add_all_users()");
int i = 0;
for (; i < C->user_list_size; i++) {
struct tgl_chat_user *uid = (C->user_list + i);
const char *name = tgp_blist_lookup_purple_name (TLS, TGL_MK_USER(uid->user_id));
if (! name) {
g_warn_if_reached();
continue;
switch (tgl_get_peer_type (P->id)) {
case TGL_PEER_CHAT: {
struct tgl_chat *C = &P->chat;
int i;
for (i = 0; i < C->user_list_size; i ++) {
struct tgl_chat_user *uid = (C->user_list + i);
const char *name = tgp_blist_lookup_purple_name (TLS, TGL_MK_USER(uid->user_id));
if (name) {
users = g_list_append (users, g_strdup (name));
flags = g_list_append (flags, GINT_TO_POINTER(C->admin_id == uid->user_id ? PURPLE_CBFLAGS_FOUNDER : PURPLE_CBFLAGS_NONE));
}
}
break;
}
users = g_list_append (users, g_strdup (name));
flags = g_list_append (flags, GINT_TO_POINTER(C->admin_id == uid->user_id ? PURPLE_CBFLAGS_FOUNDER : PURPLE_CBFLAGS_NONE));
case TGL_PEER_CHANNEL: {
// fetch users
GList *MS = g_hash_table_lookup (tls_get_data (TLS)->channel_members, GINT_TO_POINTER(tgl_get_peer_id (P->id)));
while (MS) {
struct tgp_channel_member *M = MS->data;
const char *name = tgp_blist_lookup_purple_name (TLS, M->id);
if (name) {
users = g_list_append (users, g_strdup (name));
flags = g_list_append (flags, GINT_TO_POINTER(M->flags));
}
MS = g_list_next (MS);
};
break;
}
default:
g_return_if_reached();
break;
}
purple_conv_chat_add_users (PURPLE_CONV_CHAT(conv), users, NULL, flags, FALSE);
g_list_free_full (users, g_free);
tgp_g_list_free_full (users, g_free);
g_list_free (flags);
}
PurpleConversation *tgp_chat_show (struct tgl_state *TLS, struct tgl_chat *C) {
PurpleConversation *tgp_chat_show (struct tgl_state *TLS, tgl_peer_t *P) {
PurpleConvChat *chat = NULL;
// check if chat is already shown
PurpleConversation *conv = purple_find_chat (tls_get_conn (TLS), tgl_get_peer_id (C->id));
PurpleConversation *conv = purple_find_chat (tls_get_conn (TLS), tgl_get_peer_id (P->id));
if (conv) {
chat = purple_conversation_get_chat_data (conv);
if (chat && ! purple_conv_chat_has_left (chat)) {
return conv;
}
}
// join the chat now
conv = serv_got_joined_chat (tls_get_conn (TLS), tgl_get_peer_id (C->id), C->print_title);
const char *name = NULL;
if (tgl_get_peer_type (P->id) == TGL_PEER_CHAT) {
name = P->chat.print_title;
} else if (tgl_get_peer_type (P->id) == TGL_PEER_CHANNEL) {
name = P->channel.print_title;
}
g_return_val_if_fail(name, NULL);
conv = serv_got_joined_chat (tls_get_conn (TLS), tgl_get_peer_id (P->id), name);
g_return_val_if_fail(conv, NULL);
purple_conv_chat_clear_users (purple_conversation_get_chat_data (conv));
tgp_chat_add_all_users (TLS, conv, C);
tgp_chat_add_all_users (TLS, conv, P);
return conv;
}
int tgprpl_send_chat (PurpleConnection *gc, int id, const char *message, PurpleMessageFlags flags) {
debug ("tgprpl_send_chat()");
tgl_peer_t *P = tgl_peer_get (gc_get_tls (gc), TGL_MK_CHAT(id));
if (! P) {
P = tgl_peer_get (gc_get_tls (gc), TGL_MK_CHANNEL(id));
}
g_return_val_if_fail(P != NULL, -1);
// when the group receives a message it is obvious that the previous messages were read
pending_reads_send_user (gc_get_tls (gc), P->id);
return tgp_msg_send (gc_get_tls (gc), message, P->id);
}
unsigned int tgprpl_send_chat_typing (PurpleConversation *conv, PurpleTypingState typing, gpointer ignored)
{
PurpleConnection *gc = purple_conversation_get_gc (conv);
tgl_peer_t *P;
PurpleConvChat *chat;
int id;
if (!PURPLE_CONNECTION_IS_CONNECTED (gc))
return 0;
if (g_strcmp0(purple_plugin_get_id (purple_connection_get_prpl (gc)), PLUGIN_ID))
return 0;
debug ("tgprpl_send_chat_typing()");
chat = purple_conversation_get_chat_data (conv);
id = purple_conv_chat_get_id (chat);
P = tgl_peer_get (gc_get_tls (gc), TGL_MK_CHAT(id));
if (! P) {
P = tgl_peer_get (gc_get_tls (gc), TGL_MK_CHANNEL(id));
}
g_return_val_if_fail(P != NULL, -1);
tgl_do_send_typing (gc_get_tls (gc), P->id, typing == PURPLE_TYPING ? tgl_typing_typing : tgl_typing_cancel,
0, 0);
// when the group receives a typing notification it is obvious that the previous messages were read
pending_reads_send_user (gc_get_tls (gc), P->id);
return 2;
}
void update_chat_typing (struct tgl_state *TLS, struct tgl_user *U, struct tgl_chat *C, enum tgl_typing_status status) {
debug ("update_chat_typing()");
PurpleConvChat *chat = NULL;
PurpleConversation *conv = purple_find_chat (tls_get_conn (TLS), tgl_get_peer_id (C->id));
if (conv) {
chat = purple_conversation_get_chat_data (conv);
}
g_return_if_fail(chat != NULL);
const char *name = tgp_blist_lookup_purple_name (TLS, U->id);
g_return_if_fail(name != NULL);
PurpleConvChatBuddyFlags flags = purple_conv_chat_user_get_flags (chat, name);
if (status == tgl_typing_typing) {
flags |= PURPLE_CBFLAGS_TYPING;
} else {
flags &= ~PURPLE_CBFLAGS_TYPING;
}
purple_conv_chat_user_set_flags(chat, name, flags);
}
void tgprpl_kick_from_chat (PurpleConnection *gc, int id, const char *who) {
debug ("tgprpl_kick_from_chat()");
tgl_peer_t *P = tgl_peer_get (gc_get_tls (gc), TGL_MK_CHAT(id));
if (! P) {
P = tgl_peer_get (gc_get_tls (gc), TGL_MK_CHANNEL(id));
}
g_return_if_fail(P != NULL);
tgl_peer_t *other_id = tgp_blist_lookup_peer_get (gc_get_tls (gc), who);
g_return_if_fail(P != NULL);
tgl_do_del_user_from_chat (gc_get_tls (gc), P->id, other_id->id, tgp_notify_on_error_gw, NULL);
}
GList *tgprpl_chat_join_info (PurpleConnection *gc) {
struct proto_chat_entry *pce;
pce = g_new0 (struct proto_chat_entry, 1);
@ -149,8 +317,7 @@ GHashTable *tgprpl_chat_info_defaults (PurpleConnection *gc, const char *chat_na
if (chat_name) {
tgl_peer_t *P = tgl_peer_get_by_name (gc_get_tls (gc), chat_name);
if (P) {
debug ("found chat...");
return tgp_chat_info_new (gc_get_tls (gc), &P->chat);
return tgp_chat_info_new (gc_get_tls (gc), P);
}
warning ("Chat not found, returning empty defaults...");
}
@ -160,11 +327,10 @@ GHashTable *tgprpl_chat_info_defaults (PurpleConnection *gc, const char *chat_na
void tgprpl_chat_join (PurpleConnection *gc, GHashTable *data) {
debug ("tgprpl_chat_join()");
g_return_if_fail(data);
// auto joins will cause chat joins at a time when the dialogue list is not ready, remember
// those chats and join them once the dialogue list is fetched
if (! gc_get_data (gc)->dialogues_ready) {
g_return_if_fail (data);
const char *id = g_hash_table_lookup (data, "id");
if (id) {
debug ("attempting to join chat %s while not ready, queue up for later", id);
@ -176,13 +342,22 @@ void tgprpl_chat_join (PurpleConnection *gc, GHashTable *data) {
// join existing chat by id when the user clicks on a chat in the buddy list
void *value = g_hash_table_lookup (data, "id");
if (value && atoi (value)) {
tgl_peer_id_t cid = TGL_MK_CHAT(atoi (value));
tgl_peer_t *P = tgl_peer_get (gc_get_tls (gc), cid);
tgl_peer_t *P = tgl_peer_get (gc_get_tls (gc), TGL_MK_CHAT(atoi (value)));
if (! P) {
P = tgl_peer_get (gc_get_tls (gc), TGL_MK_CHANNEL(atoi (value)));
}
if (P) {
debug ("joining chat by id %d ...", tgl_get_peer_id (cid));
tgl_do_get_chat_info (gc_get_tls (gc), cid, FALSE, tgp_chat_on_loaded_chat_full_joining, NULL);
debug ("type=%d", tgl_get_peer_type (P->id));
if (tgl_get_peer_type (P->id) == TGL_PEER_CHAT) {
debug ("joining chat by id %d ...", tgl_get_peer_id (P->id));
tgl_do_get_chat_info (gc_get_tls (gc), P->id, FALSE, tgp_chat_on_loaded_chat_full_joining, NULL);
} else {
g_return_if_fail(tgl_get_peer_type (P->id) == TGL_PEER_CHANNEL);
debug ("joining channel by id %d ...", tgl_get_peer_id (P->id));
tgp_channel_load (gc_get_tls (gc), P, tgp_chat_on_loaded_channel_full_joining, NULL);
}
} else {
warning ("Cannot join chat %d, peer not found...", tgl_get_peer_id (cid));
warning ("Cannot join chat %d, peer not found...", atoi (value));
purple_serv_got_join_chat_failed (gc, data);
}
return;
@ -199,17 +374,25 @@ void tgprpl_chat_join (PurpleConnection *gc, GHashTable *data) {
const char *subject = g_hash_table_lookup (data, "subject");
if (str_not_empty (subject)) {
tgl_peer_t *P = tgl_peer_get_by_name (gc_get_tls (gc), subject);
// handle joining chats by print_names as used by the Adium plugin
if (P && tgl_get_peer_type (P->id) == TGL_PEER_CHAT) {
debug ("joining chat by subject %s ...", subject);
tgl_do_get_chat_info (gc_get_tls (gc), P->id, FALSE, tgp_chat_on_loaded_chat_full_joining, NULL);
if (! P) {
// user creates a new chat by providing its subject the chat join window
request_create_chat (gc_get_tls (gc), subject);
return;
}
// user creates a new chat by providing its subject the chat join window
request_create_chat (gc_get_tls (gc), subject);
// handle joining chats by print_names as used by the Adium plugin
if (tgl_get_peer_type (P->id) == TGL_PEER_CHAT) {
debug ("joining chat by subject %s ...", subject);
tgl_do_get_chat_info (gc_get_tls (gc), P->id, FALSE, tgp_chat_on_loaded_chat_full_joining, NULL);
return;
} else if (tgl_get_peer_type (P->id) == TGL_PEER_CHANNEL) {
debug ("joining channel by subject %s ...", subject);
tgp_channel_load (gc_get_tls (gc), P, tgp_chat_on_loaded_channel_full_joining, NULL);
return;
} else {
warning ("Cannot join chat %s, wrong peer type", subject);
purple_serv_got_join_chat_failed (gc, data);
}
}
}
@ -220,12 +403,19 @@ char *tgprpl_get_chat_name (GHashTable * data) {
static void tgp_chat_roomlist_it (tgl_peer_t *P, void *extra) {
connection_data *conn = extra;
if (tgl_get_peer_type (P->id) == TGL_PEER_CHAT && P->chat.users_num) {
if ((tgl_get_peer_type (P->id) == TGL_PEER_CHAT || tgl_get_peer_type (P->id) == TGL_PEER_CHANNEL)
&& !(P->flags & TGLPF_LEFT)) {
char *id = g_strdup_printf ("%d", tgl_get_peer_id (P->id));
PurpleRoomlistRoom *room = purple_roomlist_room_new (PURPLE_ROOMLIST_ROOMTYPE_ROOM, P->chat.print_title, NULL);
purple_roomlist_room_add_field (conn->roomlist, room, id);
purple_roomlist_room_add_field (conn->roomlist, room, GINT_TO_POINTER(P->chat.users_num));
if (tgl_get_peer_type (P->id) == TGL_PEER_CHANNEL) {
purple_roomlist_room_add_field (conn->roomlist, room, GINT_TO_POINTER(0));
purple_roomlist_room_add_field (conn->roomlist, room, (P->channel.flags & TGLCHF_MEGAGROUP) ? _("Supergroup") : _("Channel"));
} else {
purple_roomlist_room_add_field (conn->roomlist, room, GINT_TO_POINTER(P->chat.users_num));
purple_roomlist_room_add_field (conn->roomlist, room, _("Group"));
}
purple_roomlist_room_add (conn->roomlist, room);
g_free (id);
@ -234,38 +424,36 @@ static void tgp_chat_roomlist_it (tgl_peer_t *P, void *extra) {
PurpleRoomlist *tgprpl_roomlist_get_list (PurpleConnection *gc) {
debug ("tgprpl_roomlist_get_list()");
connection_data *conn = purple_connection_get_protocol_data (gc);
GList *fields = NULL;
connection_data *conn = gc_get_data (gc);
if (conn->roomlist) {
purple_roomlist_unref (conn->roomlist);
}
conn->roomlist = purple_roomlist_new (purple_connection_get_account (gc));
GList *fields = NULL;
PurpleRoomlistField *f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_STRING, "", "id", TRUE);
fields = g_list_append (fields, f);
f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_INT, _("Users in chat"), "users", FALSE);
fields = g_list_append (fields, f);
f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_STRING, _("Type"), "type", FALSE);
fields = g_list_append (fields, f);
purple_roomlist_set_fields (conn->roomlist, fields);
tgl_peer_iterator_ex (conn->TLS, tgp_chat_roomlist_it, conn);
return conn->roomlist;
}
void tgprpl_roomlist_cancel (PurpleRoomlist *list) {
PurpleConnection *gc = purple_account_get_connection (list->account);
if (! gc) {
return;
}
connection_data *conn = purple_connection_get_protocol_data (gc);
g_return_if_fail(list->account);
purple_roomlist_set_in_progress (list, FALSE);
if (conn->roomlist == list) {
conn->roomlist = NULL;
if (pa_get_data (list->account)->roomlist == list) {
pa_get_data (list->account)->roomlist = NULL;
purple_roomlist_unref (list);
}
}
@ -283,3 +471,186 @@ void tgp_chat_join_all_pending (struct tgl_state *TLS) {
tls_get_data (TLS)->pending_joins = NULL;
}
}
static void tgp_channel_loading_free (struct tgp_channel_loading *D) {
if (D->callbacks) {
g_list_free (D->callbacks);
}
if (D->extras) {
g_list_free (D->extras);
}
free (D);
}
static void tgp_channel_load_finish (struct tgl_state *TLS, struct tgp_channel_loading *D, int success) {
GList *cb = D->callbacks;
GList *extra = D->extras;
if (! g_list_length (D->members)) {
struct tgp_channel_member *M = talloc0 (sizeof(struct tgp_channel_member));
M->id = TLS->our_id;
D->members = g_list_append (D->members, M);
}
g_hash_table_replace (tls_get_data (TLS)->channel_members,
GINT_TO_POINTER(tgl_get_peer_id (D->P->id)), D->members);
while (cb) {
if (cb->data) {
((void (*) (struct tgl_state *, void *, int, tgl_peer_t *)) cb->data) (TLS, extra->data, success, D->P);
}
cb = g_list_next(cb);
extra = g_list_next(extra);
}
tgp_channel_loading_free (D);
}
static void tgp_channel_load_admins_done (struct tgl_state *TLS, void *extra, int success, int users_num,
struct tgl_user **users) {
debug ("tgp_channel_load_admins_done()");
struct tgp_channel_loading *D = extra;
if (success) {
GHashTable *HT = g_hash_table_new (g_direct_hash, g_direct_equal);
int i;
for (i = 0; i < users_num; i ++) {
g_hash_table_insert (HT, GINT_TO_POINTER(tgl_get_peer_id (users[i]->id)), GINT_TO_POINTER(1));
}
GList *MS = D->members;
do {
struct tgp_channel_member *M = MS->data;
if (g_hash_table_lookup (HT, GINT_TO_POINTER(tgl_get_peer_id (M->id)))) {
M->flags |= PURPLE_CBFLAGS_OP;
}
} while ((MS = g_list_next (MS)));
g_hash_table_destroy (HT);
}
tgp_channel_load_finish (TLS, D, success);
}
static void tgp_channel_get_members_done (struct tgl_state *TLS, void *extra, int success, int users_num,
struct tgl_user **users) {
debug ("tgp_channel_load_members_done()");
struct tgp_channel_loading *D = extra;
if (! success) {
tgp_channel_load_finish (TLS, D, FALSE);
return;
}
int i;
for (i = 0; i < users_num; i ++) {
struct tgp_channel_member *M = talloc0 (sizeof(struct tgp_channel_member));
M->id = users[i]->id;
D->members = g_list_append (D->members, M);
}
tgl_do_channel_get_members (TLS, D->P->id,
purple_account_get_int (tls_get_pa (TLS), TGP_KEY_CHANNEL_MEMBERS, TGP_DEFAULT_CHANNEL_MEMBERS),
0, 1, tgp_channel_load_admins_done, D);
}
static gint tgp_channel_find_higher_id (gconstpointer a, gconstpointer b) {
return ((struct tgp_msg_loading *)a)->msg->server_id < GPOINTER_TO_INT(b);
}
static void tgp_channel_get_history_done (struct tgl_state *TLS, void *extra, int success, int size,
struct tgl_message **list) {
struct tgp_channel_loading *D = extra;
if (success) {
if (size > 0 && tgp_chat_get_last_server_id (TLS, D->P->id) < list[size - 1]->server_id) {
tgp_chat_set_last_server_id (TLS, D->P->id, (int) list[size - 1]->server_id);
}
GList *where = g_queue_find_custom (tls_get_data (TLS)->new_messages,
GINT_TO_POINTER(tgp_chat_get_last_server_id (TLS, D->P->id)), tgp_channel_find_higher_id);
int i;
for (i = size - 1; i >= 0; -- i) {
if (list[i]->server_id > tgp_chat_get_last_server_id (TLS, D->P->id)) {
tgp_msg_recv (TLS, list[i], where);
}
}
} else {
g_warn_if_reached(); // gap in history
}
if (D->P->flags & (TGLCHF_ADMIN | TGLCHF_MEGAGROUP)) {
tgl_do_channel_get_members (TLS, D->P->id,
purple_account_get_int (tls_get_pa (TLS), TGP_KEY_CHANNEL_MEMBERS, TGP_DEFAULT_CHANNEL_MEMBERS),
0, 0, tgp_channel_get_members_done, extra);
} else {
tgp_channel_load_finish (TLS, D, success);
}
}
void tgp_channel_load (struct tgl_state *TLS, tgl_peer_t *P,
void (*callback) (struct tgl_state *, void *, int, tgl_peer_t *),
void *extra) {
g_return_if_fail(tgl_get_peer_type (P->id) == TGL_PEER_CHANNEL);
gpointer ID = GINT_TO_POINTER(tgl_get_peer_id (P->id));
if (! g_hash_table_lookup (tls_get_data (TLS)->pending_channels, ID)) {
struct tgp_channel_loading *D = talloc0 (sizeof(struct tgp_channel_loading));
D->P = P;
D->callbacks = g_list_append (NULL, callback);
D->extras = g_list_append (NULL, extra);
D->remaining = 2;
tgl_do_get_history_range (TLS, P->id, (int) tgp_chat_get_last_server_id (TLS, P->id), 0,
TGP_CHANNEL_HISTORY_LIMIT, tgp_channel_get_history_done, D);
g_hash_table_replace (tls_get_data (TLS)->pending_channels, ID, D);
} else {
if (! tgp_channel_loaded (TLS, P->id)) {
struct tgp_channel_loading *D = g_hash_table_lookup (tls_get_data (TLS)->pending_channels, ID);
D->callbacks = g_list_append (D->callbacks, callback);
D->extras = g_list_append (D->extras, extra);
} else {
callback (TLS, extra, TRUE, P);
}
}
}
int tgp_channel_loaded (struct tgl_state *TLS, tgl_peer_id_t id) {
return NULL != g_hash_table_lookup (tls_get_data (TLS)->channel_members,
GINT_TO_POINTER(tgl_get_peer_id (id)));
}
static void update_chat (struct tgl_state *TLS, tgl_peer_t *C, unsigned flags, const char *group) {
if (flags & TGL_UPDATE_CREATED) {
tgp_blist_lookup_add (TLS, C->id, C->print_name);
tgp_chat_blist_store (TLS, tgl_peer_get (TLS, C->id), group);
} else {
PurpleChat *PC = tgp_blist_chat_find (TLS, C->id);
if (PC) {
if (flags & TGL_UPDATE_TITLE) {
purple_blist_alias_chat (PC, C->print_name);
}
if (flags & TGL_UPDATE_DELETED) { // TODO: test if this is actually executed on deletion
purple_blist_remove_chat (PC);
}
if (flags & TGL_UPDATE_PHOTO) {
tgp_info_update_photo (&PC->node, tgl_peer_get (TLS, C->id));
}
}
}
}
void update_channel_handler (struct tgl_state *TLS, struct tgl_channel *C, unsigned flags) {
debug ("update_channel_handler() (%s)", print_flags_update (flags));
update_chat (TLS, tgl_peer_get (TLS, C->id), flags, _("Telegram Channels"));
}
void update_chat_handler (struct tgl_state *TLS, struct tgl_chat *C, unsigned flags) {
debug ("update_chat_handler() (%s)", print_flags_update (flags));
update_chat (TLS, tgl_peer_get (TLS, C->id), flags, _("Telegram Chats"));
}

View file

@ -23,14 +23,30 @@
#include "telegram-purple.h"
PurpleChat *p2tgl_chat_new (struct tgl_state *TLS, struct tgl_chat *chat);
struct tgp_channel_member {
tgl_peer_id_t id;
int flags;
};
struct tgp_channel_loading {
tgl_peer_t *P;
GList *members;
GList *callbacks;
GList *extras;
int remaining;
};
tgl_peer_id_t tgp_chat_get_id (PurpleChat *C);
int tgp_chat_has_id (PurpleChat *C);
void tgp_chat_on_loaded_chat_full (struct tgl_state *TLS, struct tgl_chat *C);
PurpleConversation *tgp_chat_show (struct tgl_state *TLS, struct tgl_chat *C);
void tgp_chat_set_last_server_id (struct tgl_state *TLS, tgl_peer_id_t chat, int id);
int tgp_chat_get_last_server_id (struct tgl_state *TLS, tgl_peer_id_t chat);
PurpleChat *tgp_chat_blist_store (struct tgl_state *TLS, tgl_peer_t *P, const char *group);
PurpleConversation *tgp_chat_show (struct tgl_state *TLS, tgl_peer_t *P);
int tgprpl_send_chat (PurpleConnection *gc, int id, const char *message, PurpleMessageFlags flags);
unsigned int tgprpl_send_chat_typing (PurpleConversation *conv, PurpleTypingState typing, gpointer ignored);
char *tgprpl_get_chat_name (GHashTable *data);
void tgprpl_chat_join (PurpleConnection *gc, GHashTable *data);
GList *tgprpl_chat_join_info (PurpleConnection *gc);
@ -38,4 +54,15 @@ PurpleRoomlist *tgprpl_roomlist_get_list (PurpleConnection *gc);
void tgprpl_roomlist_cancel (PurpleRoomlist *list);
GHashTable *tgprpl_chat_info_defaults (PurpleConnection *gc, const char *chat_name);
void tgp_chat_join_all_pending (struct tgl_state *TLS);
void tgprpl_kick_from_chat (PurpleConnection *gc, int id, const char *who);
void tgp_channel_load (struct tgl_state *TLS, tgl_peer_t *P,
void (*callback) (struct tgl_state *, void *, int, tgl_peer_t *),
void *extra);
int tgp_channel_loaded (struct tgl_state *TLS, tgl_peer_id_t id);
void update_channel_handler (struct tgl_state *TLS, struct tgl_channel *C, unsigned flags);
void update_chat_handler (struct tgl_state *TLS, struct tgl_chat *C, unsigned flags);
void update_chat_typing (struct tgl_state *TLS, struct tgl_user *U, struct tgl_chat *C, enum tgl_typing_status status);
#endif

View file

@ -1,20 +1,20 @@
/*
This file is part of telegram-purple
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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
Copyright Matthias Jentsch 2014-2015
*/
@ -90,6 +90,8 @@ static void tgprpl_xfer_recv_on_finished (struct tgl_state *TLS, void *_data, in
debug ("moving transferred file from tgl directory %s to selected target %s", selected, filename);
g_unlink (selected);
//FIXME: try to copy when this fails
g_rename (filename, selected);
g_free (selected);
}
@ -138,33 +140,33 @@ static gboolean tgprpl_xfer_upload_progress (gpointer _data) {
PurpleXfer *X = _data;
struct tgp_xfer_send_data *data = X->data;
connection_data *conn = data->conn;
PurpleXferType type = purple_xfer_get_type (X);
switch (type) {
case PURPLE_XFER_SEND:
purple_xfer_set_size (X, conn->TLS->cur_uploading_bytes);
purple_xfer_set_bytes_sent (X, conn->TLS->cur_uploaded_bytes);
purple_xfer_update_progress (X);
debug ("PURPLE_XFER_SEND progress %d / %d", conn->TLS->cur_uploaded_bytes, conn->TLS->cur_uploading_bytes);
if (conn->TLS->cur_uploaded_bytes == conn->TLS->cur_uploading_bytes) {
data->timer = 0;
return FALSE;
}
break;
case PURPLE_XFER_RECEIVE:
purple_xfer_set_size (X, conn->TLS->cur_downloading_bytes);
purple_xfer_set_bytes_sent (X, conn->TLS->cur_downloaded_bytes);
purple_xfer_update_progress (X);
debug ("PURPLE_XFER_RECEIVE progress %d / %d", conn->TLS->cur_downloaded_bytes, conn->TLS->cur_downloading_bytes);
if (conn->TLS->cur_downloading_bytes == conn->TLS->cur_downloaded_bytes) {
data->timer = 0;
return FALSE;
}
break;
default:
case PURPLE_XFER_UNKNOWN:
failure ("ERROR: tgprpl_xfer_upload_progress xfer type PURPLE_XFER_UNKNOWN.");
@ -243,8 +245,13 @@ static void tgprpl_xfer_send_init (PurpleXfer *X) {
return;
}
unsigned long long int flags = TGL_SEND_MSG_FLAG_DOCUMENT_AUTO;
if (tgl_get_peer_type (P->id) == TGL_PEER_CHANNEL) {
flags |= TGLMF_POST_AS_CHANNEL;
}
tgl_do_send_document (data->conn->TLS, P->id, (char*) localfile, NULL, 0,
TGL_SEND_MSG_FLAG_DOCUMENT_AUTO, tgprpl_xfer_send_on_finished, data);
flags, tgprpl_xfer_send_on_finished, data);
// see comment in tgprpl_xfer_recv_init()
purple_xfer_ref (X);
@ -328,12 +335,12 @@ static PurpleXfer *tgprpl_new_xfer_recv (PurpleConnection *gc, const char *who)
void tgprpl_recv_file (PurpleConnection *gc, const char *who, struct tgl_message *M) {
debug ("tgprpl_recv_file()");
g_return_if_fail (who);
PurpleXfer *X = tgprpl_new_xfer_recv (gc, who);
const char *mime_type, *caption;
long long access_hash;
int flags, size;
if (M->media.type == tgl_message_media_document_encr) {
mime_type = M->media.encr_document->mime_type;
caption = M->media.encr_document->caption;
@ -351,7 +358,7 @@ void tgprpl_recv_file (PurpleConnection *gc, const char *who, struct tgl_message
char *filename = tgp_strdup_determine_filename (mime_type, caption, flags, access_hash);
purple_xfer_set_filename (X, filename);
g_free (filename);
purple_xfer_set_size (X, size);
tgprpl_xfer_init_data (X, purple_connection_get_protocol_data (gc), M);
purple_xfer_request (X);

216
tgp-info.c Normal file
View file

@ -0,0 +1,216 @@
/*
This file is part of telegram-purple
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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
Copyright Matthias Jentsch 2016
*/
#include "tgp-info.h"
// load photo
static void tgp_info_update_photo_id (PurpleBlistNode *node, long long photo) {
char *llid = g_strdup_printf ("%" G_GINT64_FORMAT, photo);
debug ("tgp_info_update_photo_id %s", llid);
purple_blist_node_set_string (node, TGP_INFO_PHOTO_ID, llid);
g_free (llid);
}
static void tgp_info_load_photo_done (struct tgl_state *TLS, void *extra, int success, const char *filename) {
tgl_peer_t *P = extra;
g_return_if_fail(success);
gchar *img = NULL;
size_t len;
GError *err = NULL;
g_file_get_contents (filename, &img, &len, &err);
if (err) {
failure ("getting file contents for %s failed: %s", filename, err->message);
return;
}
if (tgl_get_peer_type (P->id) == TGL_PEER_USER || tgl_get_peer_type (P->id) == TGL_PEER_ENCR_CHAT) {
PurpleBuddy *B = tgp_blist_buddy_find (TLS, P->id);
g_return_if_fail(B);
purple_buddy_icons_set_for_user (tls_get_pa (TLS), purple_buddy_get_name (B),
(guchar*) img, len, NULL);
tgp_info_update_photo_id (&B->node, P->user.photo_big.local_id);
} else {
PurpleChat *C = tgp_blist_chat_find (TLS, P->id);
g_return_if_fail(C);
purple_buddy_icons_node_set_custom_icon (&C->node, (guchar*) img, len);
tgp_info_update_photo_id (&C->node, P->user.photo_big.local_id);
}
}
// update photo
void tgp_info_update_photo (PurpleBlistNode *node, tgl_peer_t *P) {
tgl_peer_t *parent = NULL;
// FIXME: test if this works for encrypted chats
long long photo = P->user.photo_big.local_id;
const char *old = purple_blist_node_get_string (node, TGP_INFO_PHOTO_ID);
if (old) {
long long id = 0;
id = atoll (old);
if (id == photo) {
debug ("photo id for %s hasn't changed %lld", parent ? parent->print_name : P->print_name, id);
return;
}
}
if (photo != 0 && pbn_get_data (node) != NULL) { // FIXME: Monkey-patched condition, I have no idea why this is NULL sometimes.
tgl_do_load_file_location (pbn_get_data (node)->TLS, &P->user.photo_big, tgp_info_load_photo_done, P);
} else {
// set empty photo
purple_buddy_icons_node_set_custom_icon_from_file (node, NULL);
tgp_info_update_photo_id (node, photo);
}
}
// show user info
static void tgp_info_load_channel_done (struct tgl_state *TLS, void *extra, int success, struct tgl_channel *C) {
g_return_if_fail(success);
PurpleNotifyUserInfo *info = purple_notify_user_info_new ();
if (str_not_empty (C->about)) {
purple_notify_user_info_add_pair (info, _("Description"), C->about);
}
if (str_not_empty (C->username)) {
char *link = g_strdup_printf ("https://telegram.me/%s", C->username);
purple_notify_user_info_add_pair (info, _("Link"), link);
g_free (link);
}
if (str_not_empty (C->print_title)) {
purple_notify_user_info_add_pair (info, _("Print Title"), C->print_title);
}
char *admins = g_strdup_printf ("%d", C->admins_count);
purple_notify_user_info_add_pair (info, _("Administrators"), admins);
g_free (admins);
char *participants = g_strdup_printf ("%d", C->participants_count);
purple_notify_user_info_add_pair (info, _("Participants"), participants);
g_free (participants);
char *kicked = g_strdup_printf ("%d", C->kicked_count);
purple_notify_user_info_add_pair (info, _("Kicked"), kicked);
g_free (kicked);
purple_notify_userinfo (tls_get_conn (TLS), tgp_blist_lookup_purple_name (TLS, C->id), info, NULL, NULL);
}
static void tgp_info_load_user_done (struct tgl_state *TLS, void *extra, int success, struct tgl_user *U) {
g_return_if_fail(success);
// user info
PurpleNotifyUserInfo *info = purple_notify_user_info_new ();
if (str_not_empty (U->first_name) && str_not_empty (U->last_name)) {
purple_notify_user_info_add_pair (info, _("First name"), U->first_name);
purple_notify_user_info_add_pair (info, _("Last name"), U->last_name);
} else {
purple_notify_user_info_add_pair (info, _("Name"), U->print_name);
}
if (str_not_empty (U->username)) {
char *username = g_strdup_printf ("@%s", U->username);
purple_notify_user_info_add_pair (info, _("Username"), username);
g_free (username);
}
char *status = tgp_format_user_status (&U->status);
purple_notify_user_info_add_pair (info, _("Last seen"), status);
g_free (status);
if (str_not_empty (U->phone)) {
char *phone = g_strdup_printf ("+%s", U->phone);
purple_notify_user_info_add_pair (info, _("Phone"), phone);
g_free (phone);
}
// secret chat info
tgl_peer_t *O = extra;
if (O && tgl_get_peer_type (O->id) == TGL_PEER_ENCR_CHAT) {
struct tgl_secret_chat *secret = &O->encr_chat;
if (secret->state == sc_waiting) {
purple_notify_user_info_add_pair (info, "", _("Waiting for the user to get online..."));
} else {
const char *ttl_key = _("Self destruction timer");
if (secret->ttl) {
char *ttl = g_strdup_printf ("%d", secret->ttl);
purple_notify_user_info_add_pair (info, ttl_key, ttl);
g_free (ttl);
} else {
purple_notify_user_info_add_pair (info, ttl_key, _("Timer is not enabled."));
}
if (secret->first_key_sha[0]) {
int sha1key = tgp_visualize_key (TLS, secret->first_key_sha);
if (sha1key != -1) {
char *ident_icon = tgp_format_img (sha1key);
purple_notify_user_info_add_pair (info, _("Secret key"), ident_icon);
g_free(ident_icon);
}
}
}
}
const char *who = NULL;
if (tgl_get_peer_type (O->id) == TGL_PEER_ENCR_CHAT) {
who = tgp_blist_lookup_purple_name (TLS, O->id);
} else {
who = tgp_blist_lookup_purple_name (TLS, U->id);
}
purple_notify_userinfo (tls_get_conn (TLS), who, info, NULL, NULL);
}
void tgprpl_info_show (PurpleConnection *gc, const char *who) {
tgl_peer_t *P = tgp_blist_lookup_peer_get (gc_get_data (gc)->TLS, who);
if (P) {
switch (tgl_get_peer_type (P->id)) {
case TGL_PEER_ENCR_CHAT: {
tgl_peer_t *parent = tgp_encr_chat_get_partner (gc_get_tls (gc), &P->encr_chat);
if (parent) {
tgl_do_get_user_info (gc_get_tls (gc), parent->id, 0, tgp_info_load_user_done, P);
}
break;
}
case TGL_PEER_CHANNEL:
tgl_do_get_channel_info (gc_get_tls (gc), P->id, FALSE, tgp_info_load_channel_done, P);
break;
case TGL_PEER_USER:
tgl_do_get_user_info (gc_get_tls (gc), P->id, 0, tgp_info_load_user_done, P);
break;
}
}
}

28
tgp-info.h Normal file
View file

@ -0,0 +1,28 @@
/*
This file is part of telegram-purple
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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
Copyright Matthias Jentsch 2016
*/
#ifndef tgp_info_h
#define tgp_info_h
#include "telegram-purple.h"
#define TGP_INFO_PHOTO_ID "tgp_photo_id"
void tgp_info_update_photo (PurpleBlistNode *node, tgl_peer_t *P);
void tgprpl_info_show (PurpleConnection *gc, const char *who);
#endif

659
tgp-msg.c
View file

@ -15,7 +15,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
Copyright Matthias Jentsch 2014-2015
Copyright Matthias Jentsch 2014-2016
*/
#include "telegram-purple.h"
@ -43,15 +43,15 @@ g_utf8_substring (const gchar *str,
#endif
static char *format_service_msg (struct tgl_state *TLS, struct tgl_message *M) {
assert (M && M->flags & TGLMF_SERVICE);
g_return_val_if_fail(M && M->flags & TGLMF_SERVICE, NULL);
connection_data *conn = TLS->ev_base;
char *txt = NULL;
tgl_peer_t *fromPeer = tgl_peer_get (TLS, M->from_id);
if (! fromPeer) {
return NULL;
}
char *txt_user = fromPeer->print_name;
g_return_val_if_fail(fromPeer != NULL, NULL);
const char *txt_user = fromPeer->print_name;
switch (M->action.type) {
case tgl_message_action_chat_create:
@ -81,14 +81,17 @@ static char *format_service_msg (struct tgl_state *TLS, struct tgl_message *M) {
}
break;
}
case tgl_message_action_chat_add_user: {
tgl_peer_t *peer = tgl_peer_get (TLS, TGL_MK_USER (M->action.user));
if (peer) {
char *alias = peer->print_name;
txt = g_strdup_printf (_("%2$s added user %1$s."), alias, txt_user);
PurpleConversation *conv = purple_find_chat (conn->gc, tgl_get_peer_id (M->to_id));
if (conv) {
p2tgl_conv_add_user (TLS, conv, M->action.user, NULL, 0, FALSE);
case tgl_message_action_chat_add_users: {
int i;
for (i = 0; i < M->action.user_num; ++i) {
tgl_peer_t *peer = tgl_peer_get (TLS, TGL_MK_USER (M->action.users[i]));
if (peer) {
char *alias = peer->print_name;
txt = g_strdup_printf (_("%2$s added user %1$s."), alias, txt_user);
PurpleConversation *conv = purple_find_chat (conn->gc, tgl_get_peer_id (M->to_id));
if (conv) {
p2tgl_conv_add_user (TLS, conv, M->action.users[i], NULL, 0, FALSE);
}
}
}
break;
@ -98,11 +101,11 @@ static char *format_service_msg (struct tgl_state *TLS, struct tgl_message *M) {
if (peer) {
tgl_peer_t *chatPeer = tgl_peer_get (TLS, M->to_id);
assert (tgl_get_peer_type(chatPeer->id) == TGL_PEER_CHAT);
g_return_val_if_fail(tgl_get_peer_type (chatPeer->id) == TGL_PEER_CHAT, NULL);
// make sure that the chat is showing before deleting the user, otherwise the chat will be
// initialised after removing the chat and the chat will still contain the deleted user
PurpleConversation *conv = tgp_chat_show (TLS, &chatPeer->chat);
PurpleConversation *conv = tgp_chat_show (TLS, chatPeer);
if (conv) {
char *alias = peer->print_name;
const char *aliasLeft = tgp_blist_lookup_purple_name (TLS, TGL_MK_USER (M->action.user));
@ -155,7 +158,15 @@ static char *format_service_msg (struct tgl_state *TLS, struct tgl_message *M) {
M->action.screenshot_cnt),
M->action.screenshot_cnt, txt_user);
break;
case tgl_message_action_channel_create: {
txt = g_strdup_printf (_("Channel %1$s created"), M->action.title);
// FIXME: check if this makes sense
tgp_chat_blist_store (TLS, fromPeer, _("Telegram Channels"));
break;
}
default:
g_warn_if_reached();
break;
}
return txt;
@ -180,10 +191,11 @@ static void tgp_msg_send_done (struct tgl_state *TLS, void *callback_extra, int
char *err = _("Sending message failed.");
warning (err);
if (M) {
tgp_msg_err_out (TLS, err, M->to_id);
} else {
fatal (err);
tgp_msg_special_out (TLS, err, M->to_id, PURPLE_MESSAGE_ERROR | PURPLE_MESSAGE_NO_LOG);
}
assert (callback_extra != NULL);
warning ("Code %d: %s\n", TLS->error_code, TLS->error);
warning ("Message was: %s\n", (char *) callback_extra);
return;
}
@ -197,79 +209,41 @@ static gboolean tgp_msg_send_schedule_cb (gpointer data) {
while ((D = g_queue_peek_head (conn->out_messages))) {
g_queue_pop_head (conn->out_messages);
// TODO: option for disable_msg_preview
tgl_do_send_message (D->TLS, D->to, D->msg, (int)strlen (D->msg), 0, NULL, tgp_msg_send_done, NULL);
unsigned long long flags = TGLMF_HTML;
if (tgl_get_peer_type (D->to) == TGL_PEER_CHANNEL
&& !(tgl_peer_get (conn->TLS, D->to)->channel.flags & TGLCHF_MEGAGROUP)) {
flags |= TGLMF_POST_AS_CHANNEL;
}
tgl_do_send_message (D->TLS, D->to, D->msg, (int)strlen (D->msg), flags, NULL, tgp_msg_send_done, D->msg);
tgp_msg_sending_free (D);
}
return FALSE;
}
static void tgp_msg_send_schedule (struct tgl_state *TLS, gchar *chunk, tgl_peer_id_t to) {
g_queue_push_tail (tls_get_data (TLS)->out_messages, tgp_msg_sending_init (TLS, chunk, to));
static void tgp_msg_send_schedule (struct tgl_state *TLS, const char *chunk, tgl_peer_id_t to) {
g_queue_push_tail (tls_get_data (TLS)->out_messages, tgp_msg_sending_init (TLS, g_strdup (chunk), to));
if (tls_get_data (TLS)->out_timer) {
purple_timeout_remove (tls_get_data (TLS)->out_timer);
}
tls_get_data (TLS)->out_timer = purple_timeout_add (0, tgp_msg_send_schedule_cb, tls_get_data (TLS));
}
static int tgp_msg_send_split (struct tgl_state *TLS, const char *message, tgl_peer_id_t to) {
int size = (int)g_utf8_strlen (message, -1), start = 0;
if (size > TGP_MAX_MSG_SIZE * TGP_DEFAULT_MAX_MSG_SPLIT_COUNT) {
return -E2BIG;
}
while (size > start) {
int end = start + (int)TGP_MAX_MSG_SIZE;
if (end > size) {
end = size;
}
gchar *chunk = g_utf8_substring (message, start, end);
tgp_msg_send_schedule (TLS, chunk, to);
start = end;
}
return 1;
}
void tgp_msg_err_out (struct tgl_state *TLS, const char *error, tgl_peer_id_t to) {
int flags = PURPLE_MESSAGE_ERROR | PURPLE_MESSAGE_SYSTEM;
time_t now;
time (&now);
switch (tgl_get_peer_type (to)) {
case TGL_PEER_CHAT:
p2tgl_got_chat_in (TLS, to, to, error, flags, now);
break;
case TGL_PEER_USER:
case TGL_PEER_ENCR_CHAT:
serv_got_im (tls_get_conn (TLS), tgp_blist_lookup_purple_name (TLS, to), error, flags, now);
break;
}
}
void tgp_msg_sys_out (struct tgl_state *TLS, const char *msg, tgl_peer_id_t to_id, int no_log) {
int flags = PURPLE_MESSAGE_SYSTEM;
if (no_log) {
flags |= PURPLE_MESSAGE_NO_LOG;
}
time_t now;
time (&now);
switch (tgl_get_peer_type (to_id)) {
case TGL_PEER_CHAT:
p2tgl_got_chat_in (TLS, to_id, to_id, msg, flags, now);
break;
case TGL_PEER_USER:
case TGL_PEER_ENCR_CHAT: {
const char *name = tgp_blist_lookup_purple_name (TLS, to_id);
PurpleConversation *conv = p2tgl_find_conversation_with_account (TLS, to_id);
g_return_if_fail (name);
if (! conv) {
conv = purple_conversation_new (PURPLE_CONV_TYPE_IM, tls_get_pa (TLS), name);
}
purple_conversation_write (conv, name, msg, flags, now);
break;
void tgp_msg_special_out (struct tgl_state *TLS, const char *msg, tgl_peer_id_t to_id, int flags) {
if (tgl_get_peer_type (to_id) == TGL_PEER_CHAT) {
tgp_chat_got_in (TLS, tgl_peer_get (TLS, to_id), to_id, msg, flags, time(0));
} else {
// Regular IM conversations will not display specialized message flags like PURPLE_MESSAGE_ERROR or
// PURPLE_MESSAGE_SYSTEM correctly when using serv_got_in, therefore it is necessary to use the underlying
// conversation directly.
const char *name = tgp_blist_lookup_purple_name (TLS, to_id);
PurpleConversation *conv = p2tgl_find_conversation_with_account (TLS, to_id);
g_return_if_fail (name);
if (! conv) {
// if the conversation isn't open yet, create one with that name
conv = purple_conversation_new (PURPLE_CONV_TYPE_IM, tls_get_pa (TLS), name);
}
purple_conversation_write (conv, name, msg, flags, time(0));
}
}
@ -278,83 +252,137 @@ void send_inline_picture_done (struct tgl_state *TLS, void *extra, int success,
char *errormsg = g_strdup_printf ("%d: %s", TLS->error_code, TLS->error);
failure (errormsg);
purple_notify_message (_telegram_protocol, PURPLE_NOTIFY_MSG_ERROR, _("Sending image failed."),
errormsg, NULL, NULL, NULL);
errormsg, NULL, NULL, NULL);
g_free (errormsg);
return;
}
}
static GList *tgp_msg_imgs_parse (const char *msg) {
GList *imgs = NULL;
int i;
int len = (int) strlen (msg);
for (i = 0; i < len; i ++) {
if (len - i >= 4 && (! memcmp (msg + i, "<IMG", 4) || ! memcmp (msg + i, "<img", 4))) {
i += 4;
int e = i;
while (msg[++ e] != '>' && e < len) {}
gchar *id = NULL;
if ((id = g_strstr_len (msg + i, e - i, "ID=\"")) || (id = g_strstr_len (msg + i, e - i, "id=\""))) {
int img = atoi (id + 4);
debug ("parsed img id %d", img);
if (img > 0) {
PurpleStoredImage *psi = purple_imgstore_find_by_id (img);
if (psi) {
imgs = g_list_append (imgs, psi);
} else {
g_warn_if_reached();
}
}
} else {
g_warn_if_reached();
}
i = e;
}
}
return imgs;
}
static char *tgp_msg_markdown_convert (const char *msg) {
int len = (int) strlen (msg);
char *html = g_new0(gchar, 3 * len);
int open = FALSE;
int i, j;
for (i = 0, j = 0; i < len; i ++) {
// markdown for bold and italic doesn't seem to work with non-bots, therefore only parse code-tags
if (len - i < 3 || (memcmp (msg + i, "```", 3))) {
html[j ++] = msg[i];
} else {
i += 2;
if (! open) {
assert(j + 6 < 3 * len);
memcpy(html + j, "<code>", 6);
j += 6;
} else {
assert(j + 7 < 3 * len);
memcpy(html + j, "</code>", 7);
j += 7;
}
open = ! open;
}
}
html[j] = 0;
return html;
}
int tgp_msg_send (struct tgl_state *TLS, const char *message, tgl_peer_id_t to) {
#ifndef __ADIUM_
// search for outgoing embedded image tags and send them
gchar *img = NULL;
gchar *stripped = NULL;
if ((img = g_strrstr (message, "<IMG")) || (img = g_strrstr (message, "<img"))) {
if (tgl_get_peer_type(to) == TGL_PEER_ENCR_CHAT) {
tgp_msg_err_out (TLS, _("Sorry, sending documents to encrypted chats not yet supported."), to);
return 0;
// send all inline images
GList *imgs = tgp_msg_imgs_parse (message);
debug ("parsed %d images in messages", g_list_length (imgs));
while (imgs) {
PurpleStoredImage *psi = imgs->data;
gchar *tmp = g_build_filename (g_get_tmp_dir(), purple_imgstore_get_filename (psi), NULL) ;
GError *err = NULL;
gconstpointer data = purple_imgstore_get_data (psi);
g_file_set_contents (tmp, data, purple_imgstore_get_size (psi), &err);
if (! err) {
debug ("sending img='%s'", tmp);
tgl_do_send_document (TLS, to, tmp, NULL, 0,
TGL_SEND_MSG_FLAG_DOCUMENT_AUTO | (tgl_get_peer_type (to) == TGL_PEER_CHANNEL) ? TGLMF_POST_AS_CHANNEL : 0,
send_inline_picture_done, NULL);
} else {
failure ("error=%s", err->message);
g_warn_if_reached();
}
debug ("img found: %s", img);
gchar *id;
if ((id = g_strrstr (img, "ID=\"")) || (id = g_strrstr (img, "id=\""))) {
id += 4;
int imgid = atoi (id);
if (imgid > 0) {
PurpleStoredImage *psi = purple_imgstore_find_by_id (imgid);
if (! psi) {
failure ("Img %d not found in imgstore", imgid);
return -1;
}
gchar *tmp = g_build_filename (g_get_tmp_dir(), purple_imgstore_get_filename (psi), NULL) ;
GError *err = NULL;
gconstpointer data = purple_imgstore_get_data (psi);
g_file_set_contents (tmp, data, purple_imgstore_get_size (psi), &err);
if (! err) {
stripped = g_strstrip(purple_markup_strip_html (message));
tgl_do_send_document (TLS, to, tmp, stripped, (int)strlen (stripped),
TGL_SEND_MSG_FLAG_DOCUMENT_AUTO, send_inline_picture_done, NULL);
g_free (stripped);
// return 0 to assure that the picture is not echoed, since
// it will already be echoed with the outgoing message
return 0;
} else {
failure ("Storing %s in imagestore failed: %s\n", tmp, err->message);
g_error_free (err);
return -1;
}
}
}
// no image id found in image
return -1;
imgs = g_list_next(imgs);
}
/*
Adium won't escape any HTML markup and just pass any user-input through,
while Pidgin will replace special chars with the escape chars and also add
additional markup for RTL languages and such.
// replace markdown with html
char *html = g_strstrip(tgp_msg_markdown_convert (message));
// check message length
int size = (int) g_utf8_strlen (html, -1);
if (size == 0) {
g_free (html);
return 0; // fail quietly on empty messages
}
if (size > TGP_MAX_MSG_SIZE * TGP_DEFAULT_MAX_MSG_SPLIT_COUNT) {
g_free (html);
return -E2BIG;
}
First, we remove any HTML markup added by Pidgin, since Telegram won't handle it properly.
User-entered HTML is still escaped and therefore won't be harmed.
*/
stripped = purple_markup_strip_html (message);
// send big message as multiple chunks
int start = 0;
while (size > start) {
int end = start + (int)TGP_MAX_MSG_SIZE;
if (end > size) {
end = size;
}
char *chunk = g_utf8_substring (html, start, end);
tgp_msg_send_schedule (TLS, chunk, to);
start = end;
}
// now unescape the markup, so that html special chars will still show
// up properly in Telegram
gchar *unescaped = purple_unescape_text (stripped);
int ret = tgp_msg_send_split (TLS, stripped, to);
g_free (html);
g_free (unescaped);
g_free (stripped);
return ret;
#endif
// when the other peer receives a message it is obvious that the previous messages were read
pending_reads_send_user (TLS, to);
return tgp_msg_send_split (TLS, message, to);
// return 0 to assure that the picture is not echoed, since
// it will already be echoed with the outgoing message
return 0;
}
static char *tgp_msg_file_display (const char *path, const char *filename, const char* caption, const char *mime, long long size) {
gchar *fsize = g_format_size(size);
gchar *format;
format = g_strdup_printf ("[%s <a href=\"file:///%s\">%s</a> %s %s]", g_markup_escape_text (caption, -1), g_markup_escape_text (path, -1),
g_markup_escape_text (filename, -1), g_markup_escape_text (mime, -1), fsize);
g_free (fsize);
return format;
}
static char *tgp_msg_photo_display (struct tgl_state *TLS, const char *filename, int *flags) {
@ -394,7 +422,6 @@ static char *tgp_msg_sticker_display (struct tgl_state *TLS, tgl_peer_id_t from,
}
static void tgp_msg_display (struct tgl_state *TLS, struct tgp_msg_loading *C) {
connection_data *conn = TLS->ev_base;
struct tgl_message *M = C->msg;
char *text = NULL;
int flags = 0;
@ -410,15 +437,35 @@ static void tgp_msg_display (struct tgl_state *TLS, struct tgp_msg_loading *C) {
return;
}
// only display new messages, ignore updates or deletions
if (!M->message || tgp_outgoing_msg (TLS, M) || !tgl_get_peer_type (M->to_id)) {
#ifdef __ADIUM_
// prevent double messages in Adium >= v1.6
if (tgp_outgoing_msg (TLS, M)
&& tgl_get_peer_type (M->to_id) != TGL_PEER_CHANNEL
&& tgl_get_peer_type (M->to_id) != TGL_PEER_CHAT) {
return;
}
#endif
// filter empty messages or messages with invalid recipients
if (! M->message || !tgl_get_peer_type (M->to_id)) {
return;
}
// Mark messages that contain a mention like if they contained our current nick name
// Mark messages that contain a mention as if they contained our current nick name
// FIXME: doesn't work in Adium
if (M->flags & TGLMF_MENTION) {
flags |= PURPLE_MESSAGE_NICK;
}
// handle messages that failed to load
if (C->error) {
const char *err = C->error_msg;
if (! err) {
err = _("failed loading message");
}
tgp_msg_special_out (TLS, err, tgp_our_msg (TLS, M) ? M->from_id : M->to_id, PURPLE_MESSAGE_ERROR);
return;
}
// format the message text
if (M->flags & TGLMF_SERVICE) {
@ -430,7 +477,8 @@ static void tgp_msg_display (struct tgl_state *TLS, struct tgp_msg_loading *C) {
case tgl_message_media_photo: {
if (M->media.photo) {
assert (C->data);
g_return_if_fail(C->data != NULL);
text = tgp_msg_photo_display (TLS, C->data, &flags);
if (str_not_empty (text)) {
if (str_not_empty (M->media.caption)) {
@ -444,40 +492,73 @@ static void tgp_msg_display (struct tgl_state *TLS, struct tgp_msg_loading *C) {
}
case tgl_message_media_document:
if (M->media.document->flags & TGLDF_STICKER) {
assert (C->data);
g_return_if_fail(C->data != NULL);
text = tgp_msg_sticker_display (TLS, M->from_id, C->data, &flags);
} else if (M->media.document->flags & TGLDF_ANIMATED) {
g_return_if_fail(C->data != NULL);
text = tgp_msg_file_display (C->data, M->media.document->caption, _("animation"),
M->media.document->mime_type, M->media.document->size);
} else if (M->media.document->flags & TGLDF_IMAGE) {
assert (C->data);
g_return_if_fail(C->data != NULL);
text = tgp_msg_photo_display (TLS, C->data, &flags);
} else {
if (! tgp_our_msg(TLS, M)) {
tgprpl_recv_file (conn->gc, tgp_blist_lookup_purple_name (TLS, M->from_id), M);
if (! tgp_our_msg (TLS, M)) {
if (C->data) {
text = tgp_msg_file_display (C->data, M->media.document->caption, _("document"),
M->media.document->mime_type, M->media.document->size);
} else {
tgprpl_recv_file (tls_get_conn (TLS), tgp_blist_lookup_purple_name (TLS, M->from_id), M);
return;
}
}
return;
}
break;
case tgl_message_media_video:
case tgl_message_media_audio: {
if (! tgp_our_msg(TLS, M)) {
tgprpl_recv_file (conn->gc, tgp_blist_lookup_purple_name (TLS, M->from_id), M);
if (! tgp_our_msg (TLS, M)) {
if (C->data) {
const char *filename = C->data + strlen(C->data) - 1;
while (filename > (char *)C->data && *filename != G_DIR_SEPARATOR) {
filename --;
}
filename ++;
text = tgp_msg_file_display (C->data, filename,
M->media.type == tgl_message_media_audio ? _("audio") : _("video"),
M->media.document->mime_type, M->media.document->size);
} else {
tgprpl_recv_file (tls_get_conn (TLS), tgp_blist_lookup_purple_name (TLS, M->from_id), M);
return;
}
}
}
break;
case tgl_message_media_document_encr:
if (M->media.encr_document->flags & TGLDF_STICKER) {
assert (C->data);
g_return_if_fail(C->data != NULL);
text = tgp_msg_sticker_display (TLS, M->from_id, C->data, &flags);
} if (M->media.encr_document->flags & TGLDF_IMAGE) {
assert (C->data);
g_return_if_fail(C->data != NULL);
text = tgp_msg_photo_display (TLS, C->data, &flags);
} else {
if (! tgp_our_msg(TLS, M)) {
tgprpl_recv_file (conn->gc, tgp_blist_lookup_purple_name (TLS, M->to_id), M);
if (! tgp_our_msg (TLS, M)) {
if (C->data) {
text = tgp_msg_file_display (C->data, M->media.encr_document->caption, _("document"),
M->media.encr_document->mime_type, M->media.encr_document->size);
} else {
tgprpl_recv_file (tls_get_conn (TLS), tgp_blist_lookup_purple_name (TLS, M->to_id), M);
return;
}
}
return;
}
break;
@ -527,7 +608,9 @@ static void tgp_msg_display (struct tgl_state *TLS, struct tgp_msg_loading *C) {
flags |= PURPLE_MESSAGE_RECV;
}
if (tgl_get_peer_type (M->to_id) != TGL_PEER_ENCR_CHAT && ! (M->flags & TGLMF_UNREAD)) {
if (tgl_get_peer_type (M->to_id) != TGL_PEER_ENCR_CHAT
&& tgl_get_peer_type (M->to_id) != TGL_PEER_CHANNEL
&& ! (M->flags & TGLMF_UNREAD)) {
flags |= PURPLE_MESSAGE_DELAYED;
}
@ -536,14 +619,66 @@ static void tgp_msg_display (struct tgl_state *TLS, struct tgp_msg_loading *C) {
if (! str_not_empty (text)) {
return;
}
// Handle forwarded messages
if (tgl_get_peer_id (M->fwd_from_id) != TGL_PEER_UNKNOWN) {
const char *name;
tgl_peer_t *FP = tgl_peer_get (TLS, M->fwd_from_id);
char *tmp = text;
if (FP) {
name = FP->print_name;
text = g_strdup_printf (_("<b>Forwarded message from: %s</b><br>%s"), name, text);
} else {
// FIXME: sometimes users aren't part of the response when receiving a forwarded message
text = g_strdup_printf (_("<b>Forwarded message:</b><br>%s"), text);
}
g_free (tmp);
}
/*
FIXME: message lookup doesn't work
// Handle replies
if (M->reply_id > 0) {
tgl_message_id_t id;
id.peer_type = TGL_PEER_USER;
id.id = M->reply_id;
const char *msg = "Unkown Message";
struct tgl_message *MM = tgl_message_get (TLS, &id);
if (MM) {
msg = MM->message;
}
const char *usr = "Unknown User";
if (MM) {
tgl_peer_t *P = tgl_peer_get (TLS, MM->from_id);
usr = P->print_name;
}
g_free (text);
text = g_strdup_printf (_("<b>%s: %s</b><br>%s"), msg, usr, M->message);
}
*/
// display the message to the user
switch (tgl_get_peer_type (M->to_id)) {
case TGL_PEER_CHANNEL: {
tgl_peer_t *P = tgl_peer_get (TLS, M->to_id);
g_return_if_fail(P != NULL);
if (P->channel.flags & TGLCHF_MEGAGROUP) {
// sender is the group
tgp_chat_got_in (TLS, P, M->from_id, text, flags, M->date);
} else {
// sender is the channel itself
tgp_chat_got_in (TLS, P, P->id, text, flags, M->date);
}
break;
}
case TGL_PEER_CHAT: {
tgl_peer_t *P = tgl_peer_get (TLS, M->to_id);
if (tgp_chat_show (TLS, &P->chat)) {
p2tgl_got_chat_in (TLS, M->to_id, M->from_id, text, flags, M->date);
}
g_return_if_fail(P != NULL);
tgp_chat_got_in (TLS, P, M->from_id, text, flags, M->date);
break;
}
case TGL_PEER_ENCR_CHAT: {
@ -561,7 +696,6 @@ static void tgp_msg_display (struct tgl_state *TLS, struct tgp_msg_loading *C) {
break;
}
}
g_free (text);
}
@ -584,44 +718,89 @@ static void tgp_msg_process_in_ready (struct tgl_state *TLS) {
tgp_msg_display (TLS, C);
pending_reads_add (TLS, C->msg);
pending_reads_send_all (TLS);
if (C->data) {
g_free (C->data);
}
if (C->error_msg) {
g_free (C->error_msg);
}
tgp_msg_loading_free (C);
}
pending_reads_send_all (TLS);
debug ("tgp_msg_process_in_ready, queue size=%d", g_queue_get_length (conn->new_messages));
}
static void tgp_msg_on_loaded_document (struct tgl_state *TLS, void *extra, int success, const char *filename) {
debug ("tgp_msg_on_loaded_document()");
assert (success);
struct tgp_msg_loading *C = extra;
C->data = (void *) g_strdup (filename);
if (success) {
C->data = (void *) g_strdup (filename);
} else {
g_warn_if_reached();
C->error = TRUE;
C->error_msg = g_strdup (_("loading document or picture failed"));
}
-- C->pending;
tgp_msg_process_in_ready (TLS);
}
static void tgp_msg_on_loaded_chat_full (struct tgl_state *TLS, void *extra, int success, struct tgl_chat *chat) {
debug ("tgp_msg_on_loaded_chat_full()");
assert (success);
tgp_chat_on_loaded_chat_full (TLS, chat);
if (! success) {
// foreign user's names won't be displayed in the user list
g_warn_if_reached();
}
struct tgp_msg_loading *C = extra;
-- C->pending;
tgp_msg_process_in_ready (TLS);
}
static void tgp_msg_on_loaded_channel_history (struct tgl_state *TLS, void *extra, int success, tgl_peer_t *P) {
struct tgp_msg_loading *C = extra;
-- C->pending;
tgp_msg_process_in_ready (TLS);
}
/*
static void tgp_msg_on_loaded_user_full (struct tgl_state *TLS, void *extra, int success, struct tgl_user *U) {
debug ("tgp_msg_on_loaded_user_full()");
struct tgp_msg_loading *C = extra;
-- C->pending;
tgp_msg_process_in_ready (TLS);
}
*/
void tgp_msg_recv (struct tgl_state *TLS, struct tgl_message *M) {
connection_data *conn = TLS->ev_base;
/*
Libpurple message history is immutable and cannot be changed after printing a message.
TGP currently keeps the first-in first-out queue *new_messages* to ensure that
the messages are being printed in the correct order. When its necessary to fetch
additional info (like attached pictures) before this can be done, the queue will hold
all newer messages until the old message was completely loaded.
*/
void tgp_msg_recv (struct tgl_state *TLS, struct tgl_message *M, GList *before) {
debug ("tgp_msg_recv before=%p server_id=%lld", before, M->server_id);
if (M->flags & (TGLMF_EMPTY | TGLMF_DELETED)) {
return;
}
if (!(M->flags & TGLMF_CREATED)) {
return;
}
if (!(M->flags | TGLMF_UNREAD) && M->date != 0 && M->date < tgp_msg_oldest_relevant_ts (TLS)) {
debug ("Message from %d on %d too old, ignored.", tgl_get_peer_id (M->from_id), M->date);
return;
@ -629,6 +808,33 @@ void tgp_msg_recv (struct tgl_state *TLS, struct tgl_message *M) {
struct tgp_msg_loading *C = tgp_msg_loading_init (M);
/*
For non-channels telegram ensures that tgp receives the messages in the correct order, but in channels
there may be holes that need to be filled before the message log can be printed. This means that the
queue may not be processed until all historic messages have been fetched and the messages have been
inserted into the correct position of the queue
*/
if (tgl_get_peer_type (C->msg->from_id) == TGL_PEER_CHANNEL
|| tgl_get_peer_type (C->msg->to_id) == TGL_PEER_CHANNEL) {
tgl_peer_id_t id = tgl_get_peer_type (C->msg->from_id) == TGL_PEER_CHANNEL ?
C->msg->from_id : C->msg->to_id;
if (! tgp_channel_loaded (TLS, id)) {
++ C->pending;
tgp_channel_load (TLS, tgl_peer_get (TLS, id), tgp_msg_on_loaded_channel_history, C);
}
if (tgp_chat_get_last_server_id (TLS, id) >= C->msg->server_id) {
info ("dropping duplicate channel messages server_id=%lld", C->msg->server_id);
return;
}
if (tgp_chat_get_last_server_id (TLS, id) == (int) C->msg->server_id - 1) {
tgp_chat_set_last_server_id (TLS, id, (int) C->msg->server_id);
}
}
if (! (M->flags & TGLMF_SERVICE)) {
// handle all messages that need to load content before they can be displayed
@ -636,8 +842,8 @@ void tgp_msg_recv (struct tgl_state *TLS, struct tgl_message *M) {
switch (M->media.type) {
case tgl_message_media_photo: {
// include the "bad photo" check from telegram-cli interface.c:3287 to avoid crashes when fetching history
// TODO: find out the reason for this behavior
// include the "bad photo" check from telegram-cli interface.c:3287 to avoid crashes
// when fetching history. TODO: find out the reason for this behavior
if (M->media.photo) {
++ C->pending;
tgl_do_load_photo (TLS, M->media.photo, tgp_msg_on_loaded_document, C);
@ -646,56 +852,95 @@ void tgp_msg_recv (struct tgl_state *TLS, struct tgl_message *M) {
}
// documents that are stickers or images will be displayed just like regular photo messages
// and need to be lodaed beforehand
// and need to be loaded beforehand
case tgl_message_media_document:
case tgl_message_media_video:
case tgl_message_media_audio:
if (M->media.document->flags & TGLDF_STICKER || M->media.document->flags & TGLDF_IMAGE) {
if (M->media.document->flags & (TGLDF_STICKER | TGLDF_IMAGE)) {
++ C->pending;
tgl_do_load_document (TLS, M->media.document, tgp_msg_on_loaded_document, C);
} else {
// adium doesn't support file links, autoloading media would mean that it
// wouldn't be possible to show a usable link to the user
#ifndef __ADIUM_
if (M->media.document->size <= tls_get_media_threshold (TLS)) {
++ C->pending;
if (M->media.document->flags & TGLDF_AUDIO) {
tgl_do_load_audio (TLS, M->media.document, tgp_msg_on_loaded_document, C);
} else if (M->media.document->flags & TGLDF_VIDEO) {
tgl_do_load_video (TLS, M->media.document, tgp_msg_on_loaded_document, C);
} else {
tgl_do_load_document (TLS, M->media.document, tgp_msg_on_loaded_document, C);
}
}
#endif
}
break;
#ifndef __ADIUM_
case tgl_message_media_video:
if (M->media.document->size <= tls_get_media_threshold (TLS)) {
++ C->pending;
tgl_do_load_video (TLS, M->media.document, tgp_msg_on_loaded_document, C);
}
break;
case tgl_message_media_audio:
if (M->media.document->size <= tls_get_media_threshold (TLS)) {
++ C->pending;
tgl_do_load_audio (TLS, M->media.document, tgp_msg_on_loaded_document, C);
}
break;
#endif
case tgl_message_media_document_encr:
if (M->media.encr_document->flags & TGLDF_STICKER || M->media.encr_document->flags & TGLDF_IMAGE) {
++ C->pending;
tgl_do_load_encr_document (TLS, M->media.encr_document, tgp_msg_on_loaded_document, C);
}
break;
case tgl_message_media_geo:
// TODO: load geo thumbnail
break;
default: // prevent Clang warnings ...
default:
// prevent Clang warnings ...
break;
}
}
}
if (tgl_get_peer_type (M->to_id) == TGL_PEER_CHAT) {
tgl_peer_t *peer = tgl_peer_get (TLS, M->to_id);
assert (peer);
if (! peer->chat.user_list_size) {
// To display a chat the full name of every single user is needed, but the updates received from the server only
// contain the names of users mentioned in the events. In order to display a messages we always need to fetch the
// full chat info first. If the user list is empty, this means that we still haven't fetched the full chat information.
// assure that there is only one chat info request for every
// chat to avoid causing FLOOD_WAIT_X errors that will lead to delays or dropped messages
gpointer to_ptr = GINT_TO_POINTER(tgl_get_peer_id (M->to_id));
if (! g_hash_table_lookup (conn->pending_chat_info, to_ptr)) {
/*
To display a chat, the full name of every single user is needed, but the updates received from the server only
contain the names of users mentioned in the events. In order to display a messages we always need to fetch the
full chat info first. If the user list is empty, this means that we still haven't fetched the full chat
information. Assure that there is only one chat info request for every chat to avoid causing FLOOD_WAIT_X
errors that will lead to delays or dropped messages
*/
gpointer to_ptr = GINT_TO_POINTER(tgl_get_peer_id (M->to_id));
if (! g_hash_table_lookup (tls_get_data (TLS)->pending_chat_info, to_ptr)) {
if (tgl_get_peer_type (M->to_id) == TGL_PEER_CHAT) {
tgl_peer_t *P = tgl_peer_get (TLS, M->to_id);
g_warn_if_fail(P);
if (P && ! P->chat.user_list_size) {
++ C->pending;
tgl_do_get_chat_info (TLS, M->to_id, FALSE, tgp_msg_on_loaded_chat_full, C);
g_hash_table_replace (conn->pending_chat_info, to_ptr, to_ptr);
g_hash_table_replace (tls_get_data (TLS)->pending_chat_info, to_ptr, to_ptr);
}
}
}
g_queue_push_tail (conn->new_messages, C);
GList *b = g_queue_find (tls_get_data (TLS)->new_messages, before);
if (b) {
struct tgp_msg_loading *M = before->data;
debug ("inserting before server_id=%lld", M->msg->server_id);
g_queue_insert_before (tls_get_data (TLS)->new_messages, b, C);
} else {
g_queue_push_tail (tls_get_data (TLS)->new_messages, C);
}
tgp_msg_process_in_ready (TLS);
}

View file

@ -27,10 +27,10 @@
* Loads embedded ressources like pictures or document thumbnails and ensures that
* that all messages are still displayed in the original incoming order.
*/
void tgp_msg_recv (struct tgl_state *TLS, struct tgl_message *M);
void tgp_msg_recv (struct tgl_state *TLS, struct tgl_message *M, GList *before);
/**
* Process a message and send it the peer
* Process a message and send it to the peer
*
* Removes all HTML escape chars and HTML markup, finds embedded images and sends
* them as pictures and splits up messages that are too big for single Telegram
@ -38,7 +38,9 @@ void tgp_msg_recv (struct tgl_state *TLS, struct tgl_message *M);
*/
int tgp_msg_send (struct tgl_state *TLS, const char *msg, tgl_peer_id_t to);
void tgp_msg_err_out (struct tgl_state *TLS, const char *error, tgl_peer_id_t to);
void tgp_msg_sys_out (struct tgl_state *TLS, const char *msg, tgl_peer_id_t to_id, int no_log);
/**
* Print a special message in the conversation with a peer assuring that special flags are displayed
*/
void tgp_msg_special_out (struct tgl_state *TLS, const char *msg, tgl_peer_id_t to_id, int flags);
#endif

View file

@ -15,7 +15,7 @@
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Copyright Vitaly Valtman 2013-2015
Copyright Vitaly Valtman, Matthias Jentsch 2013-2015
*/
#define _GNU_SOURCE

View file

@ -310,3 +310,116 @@ void request_value (struct tgl_state *TLS, enum tgl_value_type type, const char
break;
}
}
// delete contact
static void request_delete_contact_ok (struct request_values_data *data, PurpleRequestFields* fields) {
tgl_peer_t *P = data->arg;
g_return_if_fail(P);
switch (tgl_get_peer_type (P->id)) {
case TGL_PEER_CHAT:
g_warn_if_fail (P->chat.flags & TGLCF_LEFT);
leave_and_delete_chat (data->TLS, P);
break;
case TGL_PEER_ENCR_CHAT:
tgl_do_discard_secret_chat (data->TLS, &P->encr_chat, NULL, NULL);
break;
case TGL_PEER_USER:
g_warn_if_fail(P->user.flags & TGLUF_CONTACT);
tgl_do_del_contact (data->TLS, P->id, tgp_notify_on_error_gw, NULL);
break;
case TGL_PEER_CHANNEL:
g_warn_if_fail(P->channel.flags & TGLCHF_CREATOR);
if (! (P->channel.flags & TGLCHF_LEFT)) {
tgl_do_leave_channel (data->TLS, P->id, tgp_notify_on_error_gw, NULL);
}
break;
default:
g_warn_if_reached();
break;
}
free (data);
}
static void request_delete_contact_cancel (struct request_values_data *data, PurpleRequestFields* fields) {
free (data);
}
void tgprpl_request_delete_contact (PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) {
const char *title1 = NULL,
*title2 = NULL,
*msg = NULL;
g_return_if_fail(buddy);
struct tgl_state *TLS = gc_get_tls (gc);
tgl_peer_t *P = tgp_blist_buddy_get_peer (buddy);
g_return_if_fail(P);
switch (tgl_get_peer_type (P->id)) {
case TGL_PEER_CHAT:
if (! (P->chat.flags & TGLCF_LEFT)) {
title1 = _("Leave Chat");
title2 = title1;
msg = _("Do you want to leave this chat permantently?");
}
break;
case TGL_PEER_ENCR_CHAT:
title1 = _("Abort Secret Chat");
title2 = title1;
msg = _("Do you want to terminate this secret chat permantently?");
break;
case TGL_PEER_USER:
if (P->user.flags & TGLUF_CONTACT) {
title1 = _("Delete Contact");
title2 = title1;
msg = _("Do you want to remove this user from your global contact list?");
}
break;
case TGL_PEER_CHANNEL:
if (P->channel.flags & TGLCHF_CREATOR) {
/*
FIXME: Support destorying channels
title1 = _("Destroy Channel");
title2 = title1;
msg = _("You are admin of this channel, do you want to delete it permanently?");
*/
} else {
if (! (P->channel.flags & TGLCHF_LEFT)) {
title1 = _("Leave Channel");
title2 = title1;
msg = _("Do you want to leave this channel?");
}
}
break;
default:
g_warn_if_reached();
break;
}
if (msg) {
purple_request_ok_cancel(tls_get_conn (TLS), title1, title2, msg, 0, tls_get_pa (TLS),
tgp_blist_lookup_purple_name (TLS, P->id), NULL, (void *) request_values_data_init (TLS, 0, P, 0),
request_delete_contact_ok, request_delete_contact_cancel);
}
}
// add new contact
void request_add_contact (struct tgl_state *TLS) {
}

View file

@ -43,4 +43,6 @@ void request_value (struct tgl_state *TLS, enum tgl_value_type type, const char
void request_accept_secret_chat (struct tgl_state *TLS, struct tgl_secret_chat *U);
void request_create_chat (struct tgl_state *TLS, const char *subject);
void tgprpl_request_delete_contact (PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group);
#endif

View file

@ -72,14 +72,14 @@ void tgp_msg_loading_free (gpointer data) {
}
struct tgp_msg_loading *tgp_msg_loading_init (struct tgl_message *M) {
struct tgp_msg_loading *C = malloc (sizeof (struct tgp_msg_loading));
struct tgp_msg_loading *C = talloc0 (sizeof (struct tgp_msg_loading));
C->pending = 0;
C->msg = M;
C->data = NULL;
return C;
}
struct tgp_msg_sending *tgp_msg_sending_init (struct tgl_state *TLS, gchar *M, tgl_peer_id_t to) {
struct tgp_msg_sending *tgp_msg_sending_init (struct tgl_state *TLS, char *M, tgl_peer_id_t to) {
struct tgp_msg_sending *C = malloc (sizeof (struct tgp_msg_sending));
C->TLS = TLS;
C->msg = M;
@ -89,7 +89,9 @@ struct tgp_msg_sending *tgp_msg_sending_init (struct tgl_state *TLS, gchar *M, t
void tgp_msg_sending_free (gpointer data) {
struct tgp_msg_sending *C = data;
g_free (C->msg);
if (C->msg) {
g_free (C->msg);
}
free (C);
}
@ -102,8 +104,11 @@ connection_data *connection_data_init (struct tgl_state *TLS, PurpleConnection *
conn->out_messages = g_queue_new ();
conn->pending_reads = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free);
conn->pending_chat_info = g_hash_table_new (g_direct_hash, g_direct_equal);
conn->pending_channels = g_hash_table_new (g_direct_hash, g_direct_equal);
conn->id_to_purple_name = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free);
conn->purple_name_to_id = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
conn->channel_members = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (void (*) (gpointer)) g_list_free);
return conn;
}
@ -118,8 +123,11 @@ void *connection_data_free (connection_data *conn) {
tgp_g_list_free_full (conn->pending_joins, g_free);
g_hash_table_destroy (conn->pending_reads);
g_hash_table_destroy (conn->pending_chat_info);
g_hash_table_destroy (conn->pending_channels);
g_hash_table_destroy (conn->id_to_purple_name);
g_hash_table_destroy (conn->purple_name_to_id);
g_hash_table_destroy (conn->channel_members);
tgprpl_xfer_free_all (conn);
g_free (conn->TLS->base_path);
tgl_free_all (conn->TLS);
@ -127,11 +135,3 @@ void *connection_data_free (connection_data *conn) {
free (conn);
return NULL;
}
get_user_info_data* get_user_info_data_new (int show_info, tgl_peer_id_t peer) {
get_user_info_data *info_data = malloc (sizeof(get_user_info_data));
info_data->show_info = show_info;
info_data->peer = peer;
return info_data;
}

View file

@ -44,17 +44,14 @@ typedef struct {
int login_retries;
PurpleRoomlist *roomlist;
GHashTable *pending_chat_info;
GHashTable *pending_channels;
GHashTable *id_to_purple_name;
GHashTable *purple_name_to_id;
GHashTable *channel_members;
GList *pending_joins;
int dialogues_ready;
} connection_data;
typedef struct {
int show_info;
tgl_peer_id_t peer;
} get_user_info_data;
struct tgp_xfer_send_data {
int timer;
int loading;
@ -63,15 +60,12 @@ struct tgp_xfer_send_data {
struct tgl_message *msg;
};
struct download_desc {
get_user_info_data *get_user_info_data;
void *data;
};
struct tgp_msg_loading {
int pending;
struct tgl_message *msg;
void *data;
int error;
char *error_msg;
};
struct tgp_msg_sending {
@ -87,7 +81,6 @@ void pending_reads_send_user (struct tgl_state *TLS, tgl_peer_id_t id);
void used_images_add (connection_data *data, gint imgid);
void *connection_data_free (connection_data *conn);
connection_data *connection_data_init (struct tgl_state *TLS, PurpleConnection *gc, PurpleAccount *pa);
get_user_info_data* get_user_info_data_new (int show_info, tgl_peer_id_t peer);
struct tgp_msg_loading *tgp_msg_loading_init (struct tgl_message *M);
struct tgp_msg_sending *tgp_msg_sending_init (struct tgl_state *TLS, char *M, tgl_peer_id_t to);
void tgp_msg_loading_free (gpointer data);