diff options
author | Zach Copley <zach@status.net> | 2010-11-09 23:16:17 +0000 |
---|---|---|
committer | Zach Copley <zach@status.net> | 2010-11-09 23:16:17 +0000 |
commit | 5b94d9e86b91707a47b143482775acad8fcf9e78 (patch) | |
tree | 99401bab6fc3295d8578a47b8d2b6d542ca70f90 /plugins | |
parent | 17ae690d5937b9a9ac3c7cd8a37d461960ce4964 (diff) | |
parent | a988e2e97b4b790f3cbd9f755ebf61bf321e16f9 (diff) |
Merge branch '0.9.x' into facebook-upgrade
Diffstat (limited to 'plugins')
88 files changed, 3051 insertions, 1128 deletions
diff --git a/plugins/Adsense/AdsensePlugin.php b/plugins/Adsense/AdsensePlugin.php index 3d733e150..1965f95ea 100644 --- a/plugins/Adsense/AdsensePlugin.php +++ b/plugins/Adsense/AdsensePlugin.php @@ -206,7 +206,7 @@ class AdsensePlugin extends UAPPlugin 'author' => 'Evan Prodromou', 'homepage' => 'http://status.net/wiki/Plugin:Adsense', 'rawdescription' => - _m('Plugin to add Google Adsense to StatusNet sites.')); + _m('Plugin to add Google AdSense to StatusNet sites.')); return true; } } diff --git a/plugins/Adsense/locale/Adsense.pot b/plugins/Adsense/locale/Adsense.pot index 2f5e4af2f..77db7e7d8 100644 --- a/plugins/Adsense/locale/Adsense.pot +++ b/plugins/Adsense/locale/Adsense.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\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" @@ -27,7 +27,7 @@ msgid "AdSense" msgstr "" #: AdsensePlugin.php:209 -msgid "Plugin to add Google Adsense to StatusNet sites." +msgid "Plugin to add Google AdSense to StatusNet sites." msgstr "" #: adsenseadminpanel.php:52 diff --git a/plugins/Adsense/locale/br/LC_MESSAGES/Adsense.po b/plugins/Adsense/locale/br/LC_MESSAGES/Adsense.po index c572f9b27..87c864a69 100644 --- a/plugins/Adsense/locale/br/LC_MESSAGES/Adsense.po +++ b/plugins/Adsense/locale/br/LC_MESSAGES/Adsense.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Adsense\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:09+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:27:50+0000\n" "Language-Team: Breton <http://translatewiki.net/wiki/Portal:br>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-20 17:58:21+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-30 23:43:40+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: br\n" "X-Message-Group: #out-statusnet-plugin-adsense\n" @@ -32,7 +32,8 @@ msgid "AdSense" msgstr "AdSense" #: AdsensePlugin.php:209 -msgid "Plugin to add Google Adsense to StatusNet sites." +#, fuzzy +msgid "Plugin to add Google AdSense to StatusNet sites." msgstr "Plugin evit ouzhpennañ Google Adsense da lec'hiennoù StatusNet." #: adsenseadminpanel.php:52 diff --git a/plugins/Adsense/locale/de/LC_MESSAGES/Adsense.po b/plugins/Adsense/locale/de/LC_MESSAGES/Adsense.po index e7ddaa32e..e6c880a6e 100644 --- a/plugins/Adsense/locale/de/LC_MESSAGES/Adsense.po +++ b/plugins/Adsense/locale/de/LC_MESSAGES/Adsense.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Adsense\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:09+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:27:50+0000\n" "Language-Team: German <http://translatewiki.net/wiki/Portal:de>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-20 17:58:21+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-30 23:43:40+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-adsense\n" @@ -32,7 +32,8 @@ msgid "AdSense" msgstr "AdSense" #: AdsensePlugin.php:209 -msgid "Plugin to add Google Adsense to StatusNet sites." +#, fuzzy +msgid "Plugin to add Google AdSense to StatusNet sites." msgstr "Plugin, das Google Adsense auf StatusNet-Websites hinzufügt." #: adsenseadminpanel.php:52 diff --git a/plugins/Adsense/locale/es/LC_MESSAGES/Adsense.po b/plugins/Adsense/locale/es/LC_MESSAGES/Adsense.po index 5a2fcfb25..1232b8293 100644 --- a/plugins/Adsense/locale/es/LC_MESSAGES/Adsense.po +++ b/plugins/Adsense/locale/es/LC_MESSAGES/Adsense.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Adsense\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:09+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:27:50+0000\n" "Language-Team: Spanish <http://translatewiki.net/wiki/Portal:es>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-20 17:58:21+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-30 23:43:40+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: es\n" "X-Message-Group: #out-statusnet-plugin-adsense\n" @@ -32,7 +32,8 @@ msgid "AdSense" msgstr "AdSense" #: AdsensePlugin.php:209 -msgid "Plugin to add Google Adsense to StatusNet sites." +#, fuzzy +msgid "Plugin to add Google AdSense to StatusNet sites." msgstr "Extensión para añadir Google Adsense a sitios StatusNet." #: adsenseadminpanel.php:52 diff --git a/plugins/Adsense/locale/fr/LC_MESSAGES/Adsense.po b/plugins/Adsense/locale/fr/LC_MESSAGES/Adsense.po index 17b56a00a..e73c99a46 100644 --- a/plugins/Adsense/locale/fr/LC_MESSAGES/Adsense.po +++ b/plugins/Adsense/locale/fr/LC_MESSAGES/Adsense.po @@ -10,13 +10,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Adsense\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:09+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:27:50+0000\n" "Language-Team: French <http://translatewiki.net/wiki/Portal:fr>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-20 17:58:21+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-30 23:43:40+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-adsense\n" @@ -33,7 +33,8 @@ msgid "AdSense" msgstr "AdSense" #: AdsensePlugin.php:209 -msgid "Plugin to add Google Adsense to StatusNet sites." +#, fuzzy +msgid "Plugin to add Google AdSense to StatusNet sites." msgstr "Greffon pour ajouter Google Adsense aux sites StatusNet." #: adsenseadminpanel.php:52 diff --git a/plugins/Adsense/locale/gl/LC_MESSAGES/Adsense.po b/plugins/Adsense/locale/gl/LC_MESSAGES/Adsense.po index e906670ea..2efd29f96 100644 --- a/plugins/Adsense/locale/gl/LC_MESSAGES/Adsense.po +++ b/plugins/Adsense/locale/gl/LC_MESSAGES/Adsense.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Adsense\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:09+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:27:50+0000\n" "Language-Team: Galician <http://translatewiki.net/wiki/Portal:gl>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-20 17:58:21+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-30 23:43:40+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: gl\n" "X-Message-Group: #out-statusnet-plugin-adsense\n" @@ -32,7 +32,7 @@ msgid "AdSense" msgstr "AdSense" #: AdsensePlugin.php:209 -msgid "Plugin to add Google Adsense to StatusNet sites." +msgid "Plugin to add Google AdSense to StatusNet sites." msgstr "" #: adsenseadminpanel.php:52 diff --git a/plugins/Adsense/locale/ia/LC_MESSAGES/Adsense.po b/plugins/Adsense/locale/ia/LC_MESSAGES/Adsense.po index 1f8a73ea2..ef9250d00 100644 --- a/plugins/Adsense/locale/ia/LC_MESSAGES/Adsense.po +++ b/plugins/Adsense/locale/ia/LC_MESSAGES/Adsense.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Adsense\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:09+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:27:50+0000\n" "Language-Team: Interlingua <http://translatewiki.net/wiki/Portal:ia>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-20 17:58:21+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-30 23:43:40+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-adsense\n" @@ -32,7 +32,8 @@ msgid "AdSense" msgstr "AdSense" #: AdsensePlugin.php:209 -msgid "Plugin to add Google Adsense to StatusNet sites." +#, fuzzy +msgid "Plugin to add Google AdSense to StatusNet sites." msgstr "Plug-in pro adder Google Adsense a sitos StatusNet." #: adsenseadminpanel.php:52 diff --git a/plugins/Adsense/locale/it/LC_MESSAGES/Adsense.po b/plugins/Adsense/locale/it/LC_MESSAGES/Adsense.po index e8addce83..004fe0559 100644 --- a/plugins/Adsense/locale/it/LC_MESSAGES/Adsense.po +++ b/plugins/Adsense/locale/it/LC_MESSAGES/Adsense.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Adsense\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:09+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:27:50+0000\n" "Language-Team: Italian <http://translatewiki.net/wiki/Portal:it>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-20 17:58:21+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-30 23:43:40+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: it\n" "X-Message-Group: #out-statusnet-plugin-adsense\n" @@ -32,7 +32,8 @@ msgid "AdSense" msgstr "AdSense" #: AdsensePlugin.php:209 -msgid "Plugin to add Google Adsense to StatusNet sites." +#, fuzzy +msgid "Plugin to add Google AdSense to StatusNet sites." msgstr "Plugin per aggiungere Google Adsense ai siti StatusNet" #: adsenseadminpanel.php:52 diff --git a/plugins/Adsense/locale/ka/LC_MESSAGES/Adsense.po b/plugins/Adsense/locale/ka/LC_MESSAGES/Adsense.po index d3ccee66e..ee971e6d1 100644 --- a/plugins/Adsense/locale/ka/LC_MESSAGES/Adsense.po +++ b/plugins/Adsense/locale/ka/LC_MESSAGES/Adsense.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Adsense\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:09+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:27:50+0000\n" "Language-Team: Georgian <http://translatewiki.net/wiki/Portal:ka>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-20 17:58:21+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-30 23:43:40+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ka\n" "X-Message-Group: #out-statusnet-plugin-adsense\n" @@ -32,7 +32,7 @@ msgid "AdSense" msgstr "AdSense" #: AdsensePlugin.php:209 -msgid "Plugin to add Google Adsense to StatusNet sites." +msgid "Plugin to add Google AdSense to StatusNet sites." msgstr "" #: adsenseadminpanel.php:52 diff --git a/plugins/Adsense/locale/mk/LC_MESSAGES/Adsense.po b/plugins/Adsense/locale/mk/LC_MESSAGES/Adsense.po index 44fe432aa..ef9b949e4 100644 --- a/plugins/Adsense/locale/mk/LC_MESSAGES/Adsense.po +++ b/plugins/Adsense/locale/mk/LC_MESSAGES/Adsense.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Adsense\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:09+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:27:50+0000\n" "Language-Team: Macedonian <http://translatewiki.net/wiki/Portal:mk>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-20 17:58:21+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-30 23:43:40+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-adsense\n" @@ -32,7 +32,8 @@ msgid "AdSense" msgstr "AdSense" #: AdsensePlugin.php:209 -msgid "Plugin to add Google Adsense to StatusNet sites." +#, fuzzy +msgid "Plugin to add Google AdSense to StatusNet sites." msgstr "Приклучок за додавање на Google AdSense во мреж. места со StatusNet." #: adsenseadminpanel.php:52 diff --git a/plugins/Adsense/locale/nl/LC_MESSAGES/Adsense.po b/plugins/Adsense/locale/nl/LC_MESSAGES/Adsense.po index c4854ad3f..9c722cc95 100644 --- a/plugins/Adsense/locale/nl/LC_MESSAGES/Adsense.po +++ b/plugins/Adsense/locale/nl/LC_MESSAGES/Adsense.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Adsense\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:09+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:27:50+0000\n" "Language-Team: Dutch <http://translatewiki.net/wiki/Portal:nl>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-20 17:58:21+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-30 23:43:40+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-adsense\n" @@ -32,7 +32,8 @@ msgid "AdSense" msgstr "AdSense" #: AdsensePlugin.php:209 -msgid "Plugin to add Google Adsense to StatusNet sites." +#, fuzzy +msgid "Plugin to add Google AdSense to StatusNet sites." msgstr "Plug-in om Google AdSense toe te voegen aan Statusnetsites." #: adsenseadminpanel.php:52 diff --git a/plugins/Adsense/locale/pt_BR/LC_MESSAGES/Adsense.po b/plugins/Adsense/locale/pt_BR/LC_MESSAGES/Adsense.po index 66ffa6b7a..649287ceb 100644 --- a/plugins/Adsense/locale/pt_BR/LC_MESSAGES/Adsense.po +++ b/plugins/Adsense/locale/pt_BR/LC_MESSAGES/Adsense.po @@ -10,14 +10,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Adsense\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-30 23:18+0000\n" -"PO-Revision-Date: 2010-10-30 23:20:58+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:27:50+0000\n" "Language-Team: Brazilian Portuguese <http://translatewiki.net/wiki/Portal:pt-" "br>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-29 16:11:50+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75708); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-30 23:43:40+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pt-br\n" "X-Message-Group: #out-statusnet-plugin-adsense\n" @@ -34,7 +34,8 @@ msgid "AdSense" msgstr "AdSense" #: AdsensePlugin.php:209 -msgid "Plugin to add Google Adsense to StatusNet sites." +#, fuzzy +msgid "Plugin to add Google AdSense to StatusNet sites." msgstr "Plugin para adicionar Google Adsense aos sites StatusNet." #: adsenseadminpanel.php:52 diff --git a/plugins/Adsense/locale/ru/LC_MESSAGES/Adsense.po b/plugins/Adsense/locale/ru/LC_MESSAGES/Adsense.po index 85bb316a6..3a359a3a9 100644 --- a/plugins/Adsense/locale/ru/LC_MESSAGES/Adsense.po +++ b/plugins/Adsense/locale/ru/LC_MESSAGES/Adsense.po @@ -10,13 +10,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Adsense\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:09+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:27:50+0000\n" "Language-Team: Russian <http://translatewiki.net/wiki/Portal:ru>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-20 17:58:21+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-30 23:43:40+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-adsense\n" @@ -34,7 +34,8 @@ msgid "AdSense" msgstr "AdSense" #: AdsensePlugin.php:209 -msgid "Plugin to add Google Adsense to StatusNet sites." +#, fuzzy +msgid "Plugin to add Google AdSense to StatusNet sites." msgstr "Плагин для добавления Google Adsense на сайты StatusNet." #: adsenseadminpanel.php:52 diff --git a/plugins/Adsense/locale/sv/LC_MESSAGES/Adsense.po b/plugins/Adsense/locale/sv/LC_MESSAGES/Adsense.po index 031b79503..f8e3d83bc 100644 --- a/plugins/Adsense/locale/sv/LC_MESSAGES/Adsense.po +++ b/plugins/Adsense/locale/sv/LC_MESSAGES/Adsense.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Adsense\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:09+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:27:50+0000\n" "Language-Team: Swedish <http://translatewiki.net/wiki/Portal:sv>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-20 17:58:21+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-30 23:43:40+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: sv\n" "X-Message-Group: #out-statusnet-plugin-adsense\n" @@ -32,7 +32,7 @@ msgid "AdSense" msgstr "AdSense" #: AdsensePlugin.php:209 -msgid "Plugin to add Google Adsense to StatusNet sites." +msgid "Plugin to add Google AdSense to StatusNet sites." msgstr "" #: adsenseadminpanel.php:52 diff --git a/plugins/Adsense/locale/tl/LC_MESSAGES/Adsense.po b/plugins/Adsense/locale/tl/LC_MESSAGES/Adsense.po index ad5ed1ad2..db5d3445b 100644 --- a/plugins/Adsense/locale/tl/LC_MESSAGES/Adsense.po +++ b/plugins/Adsense/locale/tl/LC_MESSAGES/Adsense.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Adsense\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:09+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:27:50+0000\n" "Language-Team: Tagalog <http://translatewiki.net/wiki/Portal:tl>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-20 17:58:21+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-30 23:43:40+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-adsense\n" @@ -32,7 +32,8 @@ msgid "AdSense" msgstr "AdSense" #: AdsensePlugin.php:209 -msgid "Plugin to add Google Adsense to StatusNet sites." +#, fuzzy +msgid "Plugin to add Google AdSense to StatusNet sites." msgstr "" "Pampasak upang maidagdag ang Adsense ng Google sa mga sityo ng StatusNet." diff --git a/plugins/Adsense/locale/uk/LC_MESSAGES/Adsense.po b/plugins/Adsense/locale/uk/LC_MESSAGES/Adsense.po index f15de57c9..fe9ee4984 100644 --- a/plugins/Adsense/locale/uk/LC_MESSAGES/Adsense.po +++ b/plugins/Adsense/locale/uk/LC_MESSAGES/Adsense.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Adsense\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:09+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:27:51+0000\n" "Language-Team: Ukrainian <http://translatewiki.net/wiki/Portal:uk>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-20 17:58:21+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-30 23:43:40+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-adsense\n" @@ -33,7 +33,8 @@ msgid "AdSense" msgstr "AdSense" #: AdsensePlugin.php:209 -msgid "Plugin to add Google Adsense to StatusNet sites." +#, fuzzy +msgid "Plugin to add Google AdSense to StatusNet sites." msgstr "Додаток для відображення Google Adsense на сторінці сайту StatusNet." #: adsenseadminpanel.php:52 diff --git a/plugins/Adsense/locale/zh_CN/LC_MESSAGES/Adsense.po b/plugins/Adsense/locale/zh_CN/LC_MESSAGES/Adsense.po index 9bc76e416..0bdb9880d 100644 --- a/plugins/Adsense/locale/zh_CN/LC_MESSAGES/Adsense.po +++ b/plugins/Adsense/locale/zh_CN/LC_MESSAGES/Adsense.po @@ -10,14 +10,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Adsense\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:09+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:27:51+0000\n" "Language-Team: Simplified Chinese <http://translatewiki.net/wiki/Portal:zh-" "hans>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-20 17:58:21+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-30 23:43:40+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: zh-hans\n" "X-Message-Group: #out-statusnet-plugin-adsense\n" @@ -34,7 +34,8 @@ msgid "AdSense" msgstr "AdSense" #: AdsensePlugin.php:209 -msgid "Plugin to add Google Adsense to StatusNet sites." +#, fuzzy +msgid "Plugin to add Google AdSense to StatusNet sites." msgstr "添加 Google Adsense 到 StatusNet 网站的插件。" #: adsenseadminpanel.php:52 diff --git a/plugins/BitlyUrl/locale/nb/LC_MESSAGES/BitlyUrl.po b/plugins/BitlyUrl/locale/nb/LC_MESSAGES/BitlyUrl.po index de00fc1ca..4298ae85e 100644 --- a/plugins/BitlyUrl/locale/nb/LC_MESSAGES/BitlyUrl.po +++ b/plugins/BitlyUrl/locale/nb/LC_MESSAGES/BitlyUrl.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - BitlyUrl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:16+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:27:56+0000\n" "Language-Team: Norwegian (bokmål) <http://translatewiki.net/wiki/Portal:no>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-20 17:58:21+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:11:53+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: no\n" "X-Message-Group: #out-statusnet-plugin-bitlyurl\n" @@ -23,7 +23,7 @@ msgstr "" #: BitlyUrlPlugin.php:48 msgid "You must specify a serviceUrl for bit.ly shortening." -msgstr "" +msgstr "Du må angi en serviceUrl for bit.ly-forkortelse." #: BitlyUrlPlugin.php:171 #, php-format diff --git a/plugins/Comet/locale/br/LC_MESSAGES/Comet.po b/plugins/Comet/locale/br/LC_MESSAGES/Comet.po new file mode 100644 index 000000000..70093d613 --- /dev/null +++ b/plugins/Comet/locale/br/LC_MESSAGES/Comet.po @@ -0,0 +1,28 @@ +# Translation of StatusNet - Comet to Breton (Brezhoneg) +# Expored from translatewiki.net +# +# Author: Y-M D +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Comet\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:28:04+0000\n" +"Language-Team: Breton <http://translatewiki.net/wiki/Portal:br>\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2010-10-29 16:12:39+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" +"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-Language-Code: br\n" +"X-Message-Group: #out-statusnet-plugin-comet\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: CometPlugin.php:114 +msgid "Plugin to do \"real time\" updates using Comet/Bayeux." +msgstr "" +"Un astenn evit ober hizivadennoù \"war ar prim\" en ur implijout Comet/" +"Bayeux." diff --git a/plugins/Disqus/locale/br/LC_MESSAGES/Disqus.po b/plugins/Disqus/locale/br/LC_MESSAGES/Disqus.po index caafa7ba8..d647fe3f6 100644 --- a/plugins/Disqus/locale/br/LC_MESSAGES/Disqus.po +++ b/plugins/Disqus/locale/br/LC_MESSAGES/Disqus.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Disqus\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:26+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:28:06+0000\n" "Language-Team: Breton <http://translatewiki.net/wiki/Portal:br>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:07+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:43+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: br\n" "X-Message-Group: #out-statusnet-plugin-disqus\n" @@ -27,10 +27,12 @@ msgid "" "Please enable JavaScript to view the [comments powered by Disqus](http://" "disqus.com/?ref_noscript=%s)." msgstr "" +"Mar plij gweredekait JavaScript evit gwelet an [evezhiadennoù enlusket gant " +"Disqus] (http://disqus.com/?ref_noscript=%s)." #: DisqusPlugin.php:149 msgid "Comments powered by " -msgstr "" +msgstr "Evezhiadennoù enlusket gant " #: DisqusPlugin.php:201 msgid "Comments" diff --git a/plugins/GroupFavorited/groupfavoritedaction.php b/plugins/GroupFavorited/groupfavoritedaction.php index dbd37abbc..dcbf7d0bc 100644 --- a/plugins/GroupFavorited/groupfavoritedaction.php +++ b/plugins/GroupFavorited/groupfavoritedaction.php @@ -41,12 +41,7 @@ class GroupFavoritedAction extends ShowgroupAction */ function title() { - if (!empty($this->group->fullname)) { - // @todo Create a core method to create this properly. i18n issue. - $base = $this->group->fullname . ' (' . $this->group->nickname . ')'; - } else { - $base = $this->group->nickname; - } + $base = $this->group->getFancyName(); if ($this->page == 1) { // TRANS: %s is a group name. diff --git a/plugins/GroupFavorited/locale/GroupFavorited.pot b/plugins/GroupFavorited/locale/GroupFavorited.pot index c6c2f1114..041126fad 100644 --- a/plugins/GroupFavorited/locale/GroupFavorited.pot +++ b/plugins/GroupFavorited/locale/GroupFavorited.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\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" @@ -17,13 +17,13 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #. TRANS: %s is a group name. -#: groupfavoritedaction.php:53 +#: groupfavoritedaction.php:48 #, php-format msgid "Popular posts in %s group" msgstr "" #. TRANS: %1$s is a group name, %2$s is a group number. -#: groupfavoritedaction.php:56 +#: groupfavoritedaction.php:51 #, php-format msgid "Popular posts in %1$s group, page %2$d" msgstr "" diff --git a/plugins/GroupFavorited/locale/br/LC_MESSAGES/GroupFavorited.po b/plugins/GroupFavorited/locale/br/LC_MESSAGES/GroupFavorited.po index 7362f0505..6ca70c83f 100644 --- a/plugins/GroupFavorited/locale/br/LC_MESSAGES/GroupFavorited.po +++ b/plugins/GroupFavorited/locale/br/LC_MESSAGES/GroupFavorited.po @@ -9,26 +9,26 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - GroupFavorited\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:41+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:28+0000\n" "Language-Team: Breton <http://translatewiki.net/wiki/Portal:br>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:53+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:48+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: br\n" "X-Message-Group: #out-statusnet-plugin-groupfavorited\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #. TRANS: %s is a group name. -#: groupfavoritedaction.php:53 +#: groupfavoritedaction.php:48 #, php-format msgid "Popular posts in %s group" msgstr "" #. TRANS: %1$s is a group name, %2$s is a group number. -#: groupfavoritedaction.php:56 +#: groupfavoritedaction.php:51 #, php-format msgid "Popular posts in %1$s group, page %2$d" msgstr "" diff --git a/plugins/GroupFavorited/locale/de/LC_MESSAGES/GroupFavorited.po b/plugins/GroupFavorited/locale/de/LC_MESSAGES/GroupFavorited.po index c820c89e1..cc8988658 100644 --- a/plugins/GroupFavorited/locale/de/LC_MESSAGES/GroupFavorited.po +++ b/plugins/GroupFavorited/locale/de/LC_MESSAGES/GroupFavorited.po @@ -10,26 +10,26 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - GroupFavorited\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:41+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:28+0000\n" "Language-Team: German <http://translatewiki.net/wiki/Portal:de>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:53+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:48+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-groupfavorited\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. TRANS: %s is a group name. -#: groupfavoritedaction.php:53 +#: groupfavoritedaction.php:48 #, php-format msgid "Popular posts in %s group" msgstr "Beliebte Beiträge in der %s-Gruppe" #. TRANS: %1$s is a group name, %2$s is a group number. -#: groupfavoritedaction.php:56 +#: groupfavoritedaction.php:51 #, php-format msgid "Popular posts in %1$s group, page %2$d" msgstr "Beliebte Beiträge in der %1$s-Gruppe, Seite %2$d" diff --git a/plugins/GroupFavorited/locale/es/LC_MESSAGES/GroupFavorited.po b/plugins/GroupFavorited/locale/es/LC_MESSAGES/GroupFavorited.po index 6af511ae6..3b3419d5a 100644 --- a/plugins/GroupFavorited/locale/es/LC_MESSAGES/GroupFavorited.po +++ b/plugins/GroupFavorited/locale/es/LC_MESSAGES/GroupFavorited.po @@ -9,26 +9,26 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - GroupFavorited\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:41+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:28+0000\n" "Language-Team: Spanish <http://translatewiki.net/wiki/Portal:es>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:53+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:48+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: es\n" "X-Message-Group: #out-statusnet-plugin-groupfavorited\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. TRANS: %s is a group name. -#: groupfavoritedaction.php:53 +#: groupfavoritedaction.php:48 #, php-format msgid "Popular posts in %s group" msgstr "Mensajes populares en el grupo %s" #. TRANS: %1$s is a group name, %2$s is a group number. -#: groupfavoritedaction.php:56 +#: groupfavoritedaction.php:51 #, php-format msgid "Popular posts in %1$s group, page %2$d" msgstr "Mensajes populares en el grupo %1$s, página %2$d" diff --git a/plugins/GroupFavorited/locale/fr/LC_MESSAGES/GroupFavorited.po b/plugins/GroupFavorited/locale/fr/LC_MESSAGES/GroupFavorited.po index 9cfb10efc..3facce573 100644 --- a/plugins/GroupFavorited/locale/fr/LC_MESSAGES/GroupFavorited.po +++ b/plugins/GroupFavorited/locale/fr/LC_MESSAGES/GroupFavorited.po @@ -9,26 +9,26 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - GroupFavorited\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:41+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:28+0000\n" "Language-Team: French <http://translatewiki.net/wiki/Portal:fr>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:53+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:48+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-groupfavorited\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #. TRANS: %s is a group name. -#: groupfavoritedaction.php:53 +#: groupfavoritedaction.php:48 #, php-format msgid "Popular posts in %s group" msgstr "Messages populaires dans le groupe %s" #. TRANS: %1$s is a group name, %2$s is a group number. -#: groupfavoritedaction.php:56 +#: groupfavoritedaction.php:51 #, php-format msgid "Popular posts in %1$s group, page %2$d" msgstr "Messages populaires dans le groupe %1$s, page %2$d" diff --git a/plugins/GroupFavorited/locale/ia/LC_MESSAGES/GroupFavorited.po b/plugins/GroupFavorited/locale/ia/LC_MESSAGES/GroupFavorited.po index 03eb3e3da..f1e424cd1 100644 --- a/plugins/GroupFavorited/locale/ia/LC_MESSAGES/GroupFavorited.po +++ b/plugins/GroupFavorited/locale/ia/LC_MESSAGES/GroupFavorited.po @@ -9,26 +9,26 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - GroupFavorited\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:41+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:28+0000\n" "Language-Team: Interlingua <http://translatewiki.net/wiki/Portal:ia>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:53+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:48+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-groupfavorited\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. TRANS: %s is a group name. -#: groupfavoritedaction.php:53 +#: groupfavoritedaction.php:48 #, php-format msgid "Popular posts in %s group" msgstr "Messages popular in gruppo %s" #. TRANS: %1$s is a group name, %2$s is a group number. -#: groupfavoritedaction.php:56 +#: groupfavoritedaction.php:51 #, php-format msgid "Popular posts in %1$s group, page %2$d" msgstr "Messages popular in gruppo %1$s, pagina %2$d" diff --git a/plugins/GroupFavorited/locale/mk/LC_MESSAGES/GroupFavorited.po b/plugins/GroupFavorited/locale/mk/LC_MESSAGES/GroupFavorited.po index 1d1a43a0d..5aada9eca 100644 --- a/plugins/GroupFavorited/locale/mk/LC_MESSAGES/GroupFavorited.po +++ b/plugins/GroupFavorited/locale/mk/LC_MESSAGES/GroupFavorited.po @@ -9,26 +9,26 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - GroupFavorited\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:41+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:28+0000\n" "Language-Team: Macedonian <http://translatewiki.net/wiki/Portal:mk>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:53+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:48+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-groupfavorited\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" #. TRANS: %s is a group name. -#: groupfavoritedaction.php:53 +#: groupfavoritedaction.php:48 #, php-format msgid "Popular posts in %s group" msgstr "Популарни објави во групата %s" #. TRANS: %1$s is a group name, %2$s is a group number. -#: groupfavoritedaction.php:56 +#: groupfavoritedaction.php:51 #, php-format msgid "Popular posts in %1$s group, page %2$d" msgstr "Популарни објави во групата %1$s, страница %2$d" diff --git a/plugins/GroupFavorited/locale/nl/LC_MESSAGES/GroupFavorited.po b/plugins/GroupFavorited/locale/nl/LC_MESSAGES/GroupFavorited.po index 1d8a2b57e..bf5669877 100644 --- a/plugins/GroupFavorited/locale/nl/LC_MESSAGES/GroupFavorited.po +++ b/plugins/GroupFavorited/locale/nl/LC_MESSAGES/GroupFavorited.po @@ -10,26 +10,26 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - GroupFavorited\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:41+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:28+0000\n" "Language-Team: Dutch <http://translatewiki.net/wiki/Portal:nl>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:53+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:48+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-groupfavorited\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. TRANS: %s is a group name. -#: groupfavoritedaction.php:53 +#: groupfavoritedaction.php:48 #, php-format msgid "Popular posts in %s group" msgstr "Populaire berichten in de groep %s" #. TRANS: %1$s is a group name, %2$s is a group number. -#: groupfavoritedaction.php:56 +#: groupfavoritedaction.php:51 #, php-format msgid "Popular posts in %1$s group, page %2$d" msgstr "Populaire berichten in de groep %1$s, pagina %2$d" diff --git a/plugins/GroupFavorited/locale/ru/LC_MESSAGES/GroupFavorited.po b/plugins/GroupFavorited/locale/ru/LC_MESSAGES/GroupFavorited.po index 63e84c453..1cb4433d8 100644 --- a/plugins/GroupFavorited/locale/ru/LC_MESSAGES/GroupFavorited.po +++ b/plugins/GroupFavorited/locale/ru/LC_MESSAGES/GroupFavorited.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - GroupFavorited\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:41+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:28+0000\n" "Language-Team: Russian <http://translatewiki.net/wiki/Portal:ru>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:53+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:48+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-groupfavorited\n" @@ -23,13 +23,13 @@ msgstr "" "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" #. TRANS: %s is a group name. -#: groupfavoritedaction.php:53 +#: groupfavoritedaction.php:48 #, php-format msgid "Popular posts in %s group" msgstr "Популярные сообщения в группе %s" #. TRANS: %1$s is a group name, %2$s is a group number. -#: groupfavoritedaction.php:56 +#: groupfavoritedaction.php:51 #, php-format msgid "Popular posts in %1$s group, page %2$d" msgstr "" diff --git a/plugins/GroupFavorited/locale/tl/LC_MESSAGES/GroupFavorited.po b/plugins/GroupFavorited/locale/tl/LC_MESSAGES/GroupFavorited.po index 31a1077bd..4091155de 100644 --- a/plugins/GroupFavorited/locale/tl/LC_MESSAGES/GroupFavorited.po +++ b/plugins/GroupFavorited/locale/tl/LC_MESSAGES/GroupFavorited.po @@ -9,26 +9,26 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - GroupFavorited\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:41+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:28+0000\n" "Language-Team: Tagalog <http://translatewiki.net/wiki/Portal:tl>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:53+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:48+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-groupfavorited\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. TRANS: %s is a group name. -#: groupfavoritedaction.php:53 +#: groupfavoritedaction.php:48 #, php-format msgid "Popular posts in %s group" msgstr "Tanyag na mga pagpapaskila sa loob ng pangkat na %s" #. TRANS: %1$s is a group name, %2$s is a group number. -#: groupfavoritedaction.php:56 +#: groupfavoritedaction.php:51 #, php-format msgid "Popular posts in %1$s group, page %2$d" msgstr "Tanyag na mga pagpapaskila sa loob ng pangkat na %1$s, pahina %2$d" diff --git a/plugins/GroupFavorited/locale/uk/LC_MESSAGES/GroupFavorited.po b/plugins/GroupFavorited/locale/uk/LC_MESSAGES/GroupFavorited.po index d0a44340a..143c0cae8 100644 --- a/plugins/GroupFavorited/locale/uk/LC_MESSAGES/GroupFavorited.po +++ b/plugins/GroupFavorited/locale/uk/LC_MESSAGES/GroupFavorited.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - GroupFavorited\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:41+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:28+0000\n" "Language-Team: Ukrainian <http://translatewiki.net/wiki/Portal:uk>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:53+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:48+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-groupfavorited\n" @@ -23,13 +23,13 @@ msgstr "" "2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" #. TRANS: %s is a group name. -#: groupfavoritedaction.php:53 +#: groupfavoritedaction.php:48 #, php-format msgid "Popular posts in %s group" msgstr "Популярні повідомлення спільноти %s" #. TRANS: %1$s is a group name, %2$s is a group number. -#: groupfavoritedaction.php:56 +#: groupfavoritedaction.php:51 #, php-format msgid "Popular posts in %1$s group, page %2$d" msgstr "Популярні повідомлення спільноти %1$s, сторінка %2$d" diff --git a/plugins/Mapstraction/allmap.php b/plugins/Mapstraction/allmap.php index 6e2e1d122..62d8d0445 100644 --- a/plugins/Mapstraction/allmap.php +++ b/plugins/Mapstraction/allmap.php @@ -61,12 +61,7 @@ class AllmapAction extends MapAction function title() { - if (!empty($this->profile->fullname)) { - // @todo FIXME: Bad i18n. Should be "%1$s (%2$s)". - $base = $this->profile->fullname . ' (' . $this->user->nickname . ') '; - } else { - $base = $this->user->nickname; - } + $base = $this->profile->getFancyName(); if ($this->page == 1) { // TRANS: Page title. diff --git a/plugins/Mapstraction/locale/br/LC_MESSAGES/Mapstraction.po b/plugins/Mapstraction/locale/br/LC_MESSAGES/Mapstraction.po index 6552915b9..6dd726870 100644 --- a/plugins/Mapstraction/locale/br/LC_MESSAGES/Mapstraction.po +++ b/plugins/Mapstraction/locale/br/LC_MESSAGES/Mapstraction.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Mapstraction\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:46+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:33+0000\n" "Language-Team: Breton <http://translatewiki.net/wiki/Portal:br>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:55+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:52+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: br\n" "X-Message-Group: #out-statusnet-plugin-mapstraction\n" @@ -46,19 +46,19 @@ msgstr "An implijer-mañ n'eus profil ebet dezhañ." #. TRANS: Page title. #. TRANS: %s is a user nickname. -#: allmap.php:74 +#: allmap.php:69 #, php-format msgid "%s friends map" msgstr "Kartenn mignoned %s" #. TRANS: Page title. #. TRANS: %1$s is a user nickname, %2$d is a page number. -#: allmap.php:80 +#: allmap.php:75 #, fuzzy, php-format msgid "%1$s friends map, page %2$d" msgstr "%s gartenn, pajenn %d" -#: usermap.php:73 +#: usermap.php:68 #, php-format msgid "%s map, page %d" msgstr "%s gartenn, pajenn %d" diff --git a/plugins/Mapstraction/locale/de/LC_MESSAGES/Mapstraction.po b/plugins/Mapstraction/locale/de/LC_MESSAGES/Mapstraction.po index 0299a5d15..22c3e84ee 100644 --- a/plugins/Mapstraction/locale/de/LC_MESSAGES/Mapstraction.po +++ b/plugins/Mapstraction/locale/de/LC_MESSAGES/Mapstraction.po @@ -10,13 +10,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Mapstraction\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:46+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:33+0000\n" "Language-Team: German <http://translatewiki.net/wiki/Portal:de>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:55+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:52+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: de\n" "X-Message-Group: #out-statusnet-plugin-mapstraction\n" @@ -49,19 +49,19 @@ msgstr "Benutzer hat kein Profil." #. TRANS: Page title. #. TRANS: %s is a user nickname. -#: allmap.php:74 +#: allmap.php:69 #, php-format msgid "%s friends map" msgstr "Karte der Freunde von %s" #. TRANS: Page title. #. TRANS: %1$s is a user nickname, %2$d is a page number. -#: allmap.php:80 +#: allmap.php:75 #, php-format msgid "%1$s friends map, page %2$d" msgstr "Karte der Freunde von %1$s, Seite %2$d" -#: usermap.php:73 +#: usermap.php:68 #, php-format msgid "%s map, page %d" msgstr "%s-Karte, Seite %d" diff --git a/plugins/Mapstraction/locale/fi/LC_MESSAGES/Mapstraction.po b/plugins/Mapstraction/locale/fi/LC_MESSAGES/Mapstraction.po index 8e6007152..9d84ece5a 100644 --- a/plugins/Mapstraction/locale/fi/LC_MESSAGES/Mapstraction.po +++ b/plugins/Mapstraction/locale/fi/LC_MESSAGES/Mapstraction.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Mapstraction\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:47+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:33+0000\n" "Language-Team: Finnish <http://translatewiki.net/wiki/Portal:fi>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:55+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:52+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fi\n" "X-Message-Group: #out-statusnet-plugin-mapstraction\n" @@ -46,19 +46,19 @@ msgstr "Käyttäjällä ei ole profiilia." #. TRANS: Page title. #. TRANS: %s is a user nickname. -#: allmap.php:74 +#: allmap.php:69 #, php-format msgid "%s friends map" msgstr "Kartta käyttäjän %s ystävistä" #. TRANS: Page title. #. TRANS: %1$s is a user nickname, %2$d is a page number. -#: allmap.php:80 +#: allmap.php:75 #, fuzzy, php-format msgid "%1$s friends map, page %2$d" msgstr "Kartta käyttäjän %s ystävistä" -#: usermap.php:73 +#: usermap.php:68 #, php-format msgid "%s map, page %d" msgstr "" diff --git a/plugins/Mapstraction/locale/fr/LC_MESSAGES/Mapstraction.po b/plugins/Mapstraction/locale/fr/LC_MESSAGES/Mapstraction.po index a75da34ec..399917055 100644 --- a/plugins/Mapstraction/locale/fr/LC_MESSAGES/Mapstraction.po +++ b/plugins/Mapstraction/locale/fr/LC_MESSAGES/Mapstraction.po @@ -10,13 +10,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Mapstraction\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:47+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:33+0000\n" "Language-Team: French <http://translatewiki.net/wiki/Portal:fr>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:55+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:52+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-mapstraction\n" @@ -49,19 +49,19 @@ msgstr "Aucun profil ne correspond à cet utilisateur." #. TRANS: Page title. #. TRANS: %s is a user nickname. -#: allmap.php:74 +#: allmap.php:69 #, php-format msgid "%s friends map" msgstr "Carte des amis de %s" #. TRANS: Page title. #. TRANS: %1$s is a user nickname, %2$d is a page number. -#: allmap.php:80 +#: allmap.php:75 #, php-format msgid "%1$s friends map, page %2$d" msgstr "Carte des amis de %1$s, page %2$d" -#: usermap.php:73 +#: usermap.php:68 #, php-format msgid "%s map, page %d" msgstr "Carte %s, page %d" diff --git a/plugins/Mapstraction/locale/gl/LC_MESSAGES/Mapstraction.po b/plugins/Mapstraction/locale/gl/LC_MESSAGES/Mapstraction.po index 5df0d1404..ec66764bc 100644 --- a/plugins/Mapstraction/locale/gl/LC_MESSAGES/Mapstraction.po +++ b/plugins/Mapstraction/locale/gl/LC_MESSAGES/Mapstraction.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Mapstraction\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:47+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:33+0000\n" "Language-Team: Galician <http://translatewiki.net/wiki/Portal:gl>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:55+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:52+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: gl\n" "X-Message-Group: #out-statusnet-plugin-mapstraction\n" @@ -46,19 +46,19 @@ msgstr "O usuario non ten perfil." #. TRANS: Page title. #. TRANS: %s is a user nickname. -#: allmap.php:74 +#: allmap.php:69 #, php-format msgid "%s friends map" msgstr "" #. TRANS: Page title. #. TRANS: %1$s is a user nickname, %2$d is a page number. -#: allmap.php:80 +#: allmap.php:75 #, php-format msgid "%1$s friends map, page %2$d" msgstr "" -#: usermap.php:73 +#: usermap.php:68 #, php-format msgid "%s map, page %d" msgstr "" diff --git a/plugins/Mapstraction/locale/ia/LC_MESSAGES/Mapstraction.po b/plugins/Mapstraction/locale/ia/LC_MESSAGES/Mapstraction.po index 72249a654..7deba8963 100644 --- a/plugins/Mapstraction/locale/ia/LC_MESSAGES/Mapstraction.po +++ b/plugins/Mapstraction/locale/ia/LC_MESSAGES/Mapstraction.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Mapstraction\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:47+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:33+0000\n" "Language-Team: Interlingua <http://translatewiki.net/wiki/Portal:ia>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:55+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:52+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-mapstraction\n" @@ -48,19 +48,19 @@ msgstr "Le usator non ha un profilo." #. TRANS: Page title. #. TRANS: %s is a user nickname. -#: allmap.php:74 +#: allmap.php:69 #, php-format msgid "%s friends map" msgstr "Mappa del amicos de %s" #. TRANS: Page title. #. TRANS: %1$s is a user nickname, %2$d is a page number. -#: allmap.php:80 +#: allmap.php:75 #, php-format msgid "%1$s friends map, page %2$d" msgstr "Mappa de amicos de %1$s, pagina %2$d" -#: usermap.php:73 +#: usermap.php:68 #, php-format msgid "%s map, page %d" msgstr "Mappa de %s, pagina %d" diff --git a/plugins/Mapstraction/locale/mk/LC_MESSAGES/Mapstraction.po b/plugins/Mapstraction/locale/mk/LC_MESSAGES/Mapstraction.po index cf7be70ab..33562d597 100644 --- a/plugins/Mapstraction/locale/mk/LC_MESSAGES/Mapstraction.po +++ b/plugins/Mapstraction/locale/mk/LC_MESSAGES/Mapstraction.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Mapstraction\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:47+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:33+0000\n" "Language-Team: Macedonian <http://translatewiki.net/wiki/Portal:mk>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:55+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:52+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-mapstraction\n" @@ -48,19 +48,19 @@ msgstr "Корисникот нема профил." #. TRANS: Page title. #. TRANS: %s is a user nickname. -#: allmap.php:74 +#: allmap.php:69 #, php-format msgid "%s friends map" msgstr "Карта на пријатели на %s" #. TRANS: Page title. #. TRANS: %1$s is a user nickname, %2$d is a page number. -#: allmap.php:80 +#: allmap.php:75 #, php-format msgid "%1$s friends map, page %2$d" msgstr "Карта на пријатели на %1$s, страница %2$d" -#: usermap.php:73 +#: usermap.php:68 #, php-format msgid "%s map, page %d" msgstr "Карта на %s, стр. %d" diff --git a/plugins/Mapstraction/locale/nb/LC_MESSAGES/Mapstraction.po b/plugins/Mapstraction/locale/nb/LC_MESSAGES/Mapstraction.po index b478de888..68b2d02ec 100644 --- a/plugins/Mapstraction/locale/nb/LC_MESSAGES/Mapstraction.po +++ b/plugins/Mapstraction/locale/nb/LC_MESSAGES/Mapstraction.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Mapstraction\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:47+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:33+0000\n" "Language-Team: Norwegian (bokmål) <http://translatewiki.net/wiki/Portal:no>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:55+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:52+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: no\n" "X-Message-Group: #out-statusnet-plugin-mapstraction\n" @@ -48,19 +48,19 @@ msgstr "Bruker har ingen profil." #. TRANS: Page title. #. TRANS: %s is a user nickname. -#: allmap.php:74 +#: allmap.php:69 #, php-format msgid "%s friends map" msgstr "%s vennekart" #. TRANS: Page title. #. TRANS: %1$s is a user nickname, %2$d is a page number. -#: allmap.php:80 +#: allmap.php:75 #, php-format msgid "%1$s friends map, page %2$d" msgstr "%1$s vennekart, side %2$d" -#: usermap.php:73 +#: usermap.php:68 #, php-format msgid "%s map, page %d" msgstr "%s kart, side %d" diff --git a/plugins/Mapstraction/locale/nl/LC_MESSAGES/Mapstraction.po b/plugins/Mapstraction/locale/nl/LC_MESSAGES/Mapstraction.po index fdc68490e..f68e24ea9 100644 --- a/plugins/Mapstraction/locale/nl/LC_MESSAGES/Mapstraction.po +++ b/plugins/Mapstraction/locale/nl/LC_MESSAGES/Mapstraction.po @@ -10,13 +10,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Mapstraction\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:47+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:33+0000\n" "Language-Team: Dutch <http://translatewiki.net/wiki/Portal:nl>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:55+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:52+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-mapstraction\n" @@ -49,19 +49,19 @@ msgstr "Deze gebruiker heeft geen profiel." #. TRANS: Page title. #. TRANS: %s is a user nickname. -#: allmap.php:74 +#: allmap.php:69 #, php-format msgid "%s friends map" msgstr "Kaart van %s en vrienden" #. TRANS: Page title. #. TRANS: %1$s is a user nickname, %2$d is a page number. -#: allmap.php:80 +#: allmap.php:75 #, php-format msgid "%1$s friends map, page %2$d" msgstr "Kaart van vrienden van %1$s, pagina %2$d" -#: usermap.php:73 +#: usermap.php:68 #, php-format msgid "%s map, page %d" msgstr "Kaart van %s, pagina %d" diff --git a/plugins/Mapstraction/locale/ru/LC_MESSAGES/Mapstraction.po b/plugins/Mapstraction/locale/ru/LC_MESSAGES/Mapstraction.po index 93ad72cc3..97dbedf6e 100644 --- a/plugins/Mapstraction/locale/ru/LC_MESSAGES/Mapstraction.po +++ b/plugins/Mapstraction/locale/ru/LC_MESSAGES/Mapstraction.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Mapstraction\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:47+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:33+0000\n" "Language-Team: Russian <http://translatewiki.net/wiki/Portal:ru>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:55+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:52+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ru\n" "X-Message-Group: #out-statusnet-plugin-mapstraction\n" @@ -47,19 +47,19 @@ msgstr "У пользователя нет профиля." #. TRANS: Page title. #. TRANS: %s is a user nickname. -#: allmap.php:74 +#: allmap.php:69 #, php-format msgid "%s friends map" msgstr "Карта друзей: %s" #. TRANS: Page title. #. TRANS: %1$s is a user nickname, %2$d is a page number. -#: allmap.php:80 +#: allmap.php:75 #, fuzzy, php-format msgid "%1$s friends map, page %2$d" msgstr "Карта друзей: %s" -#: usermap.php:73 +#: usermap.php:68 #, php-format msgid "%s map, page %d" msgstr "" diff --git a/plugins/Mapstraction/locale/ta/LC_MESSAGES/Mapstraction.po b/plugins/Mapstraction/locale/ta/LC_MESSAGES/Mapstraction.po index 301117348..fbeb8efac 100644 --- a/plugins/Mapstraction/locale/ta/LC_MESSAGES/Mapstraction.po +++ b/plugins/Mapstraction/locale/ta/LC_MESSAGES/Mapstraction.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Mapstraction\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:47+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:33+0000\n" "Language-Team: Tamil <http://translatewiki.net/wiki/Portal:ta>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:55+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:52+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ta\n" "X-Message-Group: #out-statusnet-plugin-mapstraction\n" @@ -46,19 +46,19 @@ msgstr "" #. TRANS: Page title. #. TRANS: %s is a user nickname. -#: allmap.php:74 +#: allmap.php:69 #, php-format msgid "%s friends map" msgstr "" #. TRANS: Page title. #. TRANS: %1$s is a user nickname, %2$d is a page number. -#: allmap.php:80 +#: allmap.php:75 #, php-format msgid "%1$s friends map, page %2$d" msgstr "" -#: usermap.php:73 +#: usermap.php:68 #, php-format msgid "%s map, page %d" msgstr "" diff --git a/plugins/Mapstraction/locale/tl/LC_MESSAGES/Mapstraction.po b/plugins/Mapstraction/locale/tl/LC_MESSAGES/Mapstraction.po index 49d27836b..bec287a2a 100644 --- a/plugins/Mapstraction/locale/tl/LC_MESSAGES/Mapstraction.po +++ b/plugins/Mapstraction/locale/tl/LC_MESSAGES/Mapstraction.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Mapstraction\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:47+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:33+0000\n" "Language-Team: Tagalog <http://translatewiki.net/wiki/Portal:tl>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:55+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:52+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: tl\n" "X-Message-Group: #out-statusnet-plugin-mapstraction\n" @@ -48,19 +48,19 @@ msgstr "Walang balangkas ang tagagamit." #. TRANS: Page title. #. TRANS: %s is a user nickname. -#: allmap.php:74 +#: allmap.php:69 #, php-format msgid "%s friends map" msgstr "%s na mapa ng mga kaibigan" #. TRANS: Page title. #. TRANS: %1$s is a user nickname, %2$d is a page number. -#: allmap.php:80 +#: allmap.php:75 #, php-format msgid "%1$s friends map, page %2$d" msgstr " %1$s mapa ng mga kaibigan, pahina %2$d" -#: usermap.php:73 +#: usermap.php:68 #, php-format msgid "%s map, page %d" msgstr "%s na mapa, pahina %d" diff --git a/plugins/Mapstraction/locale/uk/LC_MESSAGES/Mapstraction.po b/plugins/Mapstraction/locale/uk/LC_MESSAGES/Mapstraction.po index 9a43d791e..9a928759a 100644 --- a/plugins/Mapstraction/locale/uk/LC_MESSAGES/Mapstraction.po +++ b/plugins/Mapstraction/locale/uk/LC_MESSAGES/Mapstraction.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Mapstraction\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:47+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:33+0000\n" "Language-Team: Ukrainian <http://translatewiki.net/wiki/Portal:uk>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:55+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:52+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-mapstraction\n" @@ -49,19 +49,19 @@ msgstr "Користувач не має профілю." #. TRANS: Page title. #. TRANS: %s is a user nickname. -#: allmap.php:74 +#: allmap.php:69 #, php-format msgid "%s friends map" msgstr "Мапа друзів %s." #. TRANS: Page title. #. TRANS: %1$s is a user nickname, %2$d is a page number. -#: allmap.php:80 +#: allmap.php:75 #, php-format msgid "%1$s friends map, page %2$d" msgstr "Мапа друзів %1$s, сторінка %2$d" -#: usermap.php:73 +#: usermap.php:68 #, php-format msgid "%s map, page %d" msgstr "Мапа друзів %s, сторінка %d" diff --git a/plugins/Mapstraction/locale/zh_CN/LC_MESSAGES/Mapstraction.po b/plugins/Mapstraction/locale/zh_CN/LC_MESSAGES/Mapstraction.po index 47f07d159..15358a1aa 100644 --- a/plugins/Mapstraction/locale/zh_CN/LC_MESSAGES/Mapstraction.po +++ b/plugins/Mapstraction/locale/zh_CN/LC_MESSAGES/Mapstraction.po @@ -9,14 +9,14 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Mapstraction\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:46:47+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:33+0000\n" "Language-Team: Simplified Chinese <http://translatewiki.net/wiki/Portal:zh-" "hans>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:29:55+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:12:52+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: zh-hans\n" "X-Message-Group: #out-statusnet-plugin-mapstraction\n" @@ -49,19 +49,19 @@ msgstr "用户没有个人信息。" #. TRANS: Page title. #. TRANS: %s is a user nickname. -#: allmap.php:74 +#: allmap.php:69 #, php-format msgid "%s friends map" msgstr "%s 好友地图" #. TRANS: Page title. #. TRANS: %1$s is a user nickname, %2$d is a page number. -#: allmap.php:80 +#: allmap.php:75 #, php-format msgid "%1$s friends map, page %2$d" msgstr "%1$s 好友地图,第 %2$d 页。" -#: usermap.php:73 +#: usermap.php:68 #, php-format msgid "%s map, page %d" msgstr "%s 地图,第 %d 页" diff --git a/plugins/Mapstraction/usermap.php b/plugins/Mapstraction/usermap.php index 0ee956159..54412146e 100644 --- a/plugins/Mapstraction/usermap.php +++ b/plugins/Mapstraction/usermap.php @@ -58,12 +58,7 @@ class UsermapAction extends MapAction function title() { - if (!empty($this->profile->fullname)) { - // @todo FIXME: Bad i18n. Should be '%1$s (%2$s)' - $base = $this->profile->fullname . ' (' . $this->user->nickname . ')'; - } else { - $base = $this->user->nickname; - } + $base = $this->profile->getFancyName(); if ($this->page == 1) { // @todo CHECKME: inconsisten with paged variant below. " map" missing. diff --git a/plugins/Memcached/locale/ja/LC_MESSAGES/Memcached.po b/plugins/Memcached/locale/ja/LC_MESSAGES/Memcached.po new file mode 100644 index 000000000..fea6080bc --- /dev/null +++ b/plugins/Memcached/locale/ja/LC_MESSAGES/Memcached.po @@ -0,0 +1,29 @@ +# Translation of StatusNet - Memcached to Japanese (日本語) +# Expored from translatewiki.net +# +# Author: Iwai.masaharu +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Memcached\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:28:31+0000\n" +"Language-Team: Japanese <http://translatewiki.net/wiki/Portal:ja>\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2010-10-29 16:12:53+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" +"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-Language-Code: ja\n" +"X-Message-Group: #out-statusnet-plugin-memcached\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: MemcachedPlugin.php:218 +msgid "" +"Use <a href=\"http://memcached.org/\">Memcached</a> to cache query results." +msgstr "" +"クエリー結果のキャッシュに <a href=\"http://memcached.org/\">Memcached</a> を" +"使う" diff --git a/plugins/NoticeTitle/locale/pl/LC_MESSAGES/NoticeTitle.po b/plugins/NoticeTitle/locale/pl/LC_MESSAGES/NoticeTitle.po new file mode 100644 index 000000000..64b208fa5 --- /dev/null +++ b/plugins/NoticeTitle/locale/pl/LC_MESSAGES/NoticeTitle.po @@ -0,0 +1,33 @@ +# Translation of StatusNet - NoticeTitle to Polish (Polski) +# Expored from translatewiki.net +# +# Author: Raven +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - NoticeTitle\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:28:38+0000\n" +"Language-Team: Polish <http://translatewiki.net/wiki/Portal:pl>\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2010-10-29 16:13:51+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" +"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-Language-Code: pl\n" +"X-Message-Group: #out-statusnet-plugin-noticetitle\n" +"Plural-Forms: nplurals=3; plural=(n == 1) ? 0 : ( (n%10 >= 2 && n%10 <= 4 && " +"(n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n" + +#: NoticeTitlePlugin.php:132 +msgid "Adds optional titles to notices." +msgstr "" + +#. TRANS: Page title. %1$s is the title, %2$s is the site name. +#: NoticeTitlePlugin.php:309 +#, php-format +msgid "%1$s - %2$s" +msgstr "%1$s - %2$s" diff --git a/plugins/OpenX/locale/br/LC_MESSAGES/OpenX.po b/plugins/OpenX/locale/br/LC_MESSAGES/OpenX.po new file mode 100644 index 000000000..c0f138fa0 --- /dev/null +++ b/plugins/OpenX/locale/br/LC_MESSAGES/OpenX.po @@ -0,0 +1,109 @@ +# Translation of StatusNet - OpenX to Breton (Brezhoneg) +# Expored from translatewiki.net +# +# Author: Y-M D +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - OpenX\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:28:45+0000\n" +"Language-Team: Breton <http://translatewiki.net/wiki/Portal:br>\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2010-10-29 16:13:54+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" +"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-Language-Code: br\n" +"X-Message-Group: #out-statusnet-plugin-openx\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. TRANS: Menu item title/tooltip +#: OpenXPlugin.php:201 +msgid "OpenX configuration" +msgstr "Kefluniadur OpenX" + +#. TRANS: Menu item for site administration +#: OpenXPlugin.php:203 +msgid "OpenX" +msgstr "OpenX" + +#. TRANS: Plugin description. +#: OpenXPlugin.php:224 +msgid "Plugin for <a href=\"http://www.openx.org/\">OpenX Ad Server</a>." +msgstr "" + +#. TRANS: Page title for OpenX admin panel. +#: openxadminpanel.php:53 +msgctxt "TITLE" +msgid "OpenX" +msgstr "OpenX" + +#. TRANS: Instructions for OpenX admin panel. +#: openxadminpanel.php:64 +msgid "OpenX settings for this StatusNet site" +msgstr "Arventennoù OpenX evit al lec'hienn StatusNet-mañ." + +#. TRANS: Form label in OpenX admin panel. +#: openxadminpanel.php:167 +msgid "Ad script URL" +msgstr "" + +#. TRANS: Tooltip for form label in OpenX admin panel. +#: openxadminpanel.php:169 +msgid "Script URL" +msgstr "" + +#. TRANS: Form label in OpenX admin panel. Refers to advertisement format. +#: openxadminpanel.php:175 +msgid "Medium rectangle" +msgstr "" + +#. TRANS: Tooltip for form label in OpenX admin panel. Refers to advertisement format. +#: openxadminpanel.php:177 +msgid "Medium rectangle zone" +msgstr "" + +#. TRANS: Form label in OpenX admin panel. Refers to advertisement format. +#: openxadminpanel.php:183 +msgid "Rectangle" +msgstr "Skouergornek" + +#. TRANS: Tooltip for form label in OpenX admin panel. Refers to advertisement format. +#: openxadminpanel.php:185 +msgid "Rectangle zone" +msgstr "" + +#. TRANS: Form label in OpenX admin panel. Refers to advertisement format. +#: openxadminpanel.php:191 +msgid "Leaderboard" +msgstr "" + +#. TRANS: Tooltip for form label in OpenX admin panel. Refers to advertisement format. +#: openxadminpanel.php:193 +msgid "Leaderboard zone" +msgstr "" + +#. TRANS: Form label in OpenX admin panel. Refers to advertisement format. +#: openxadminpanel.php:199 +msgid "Skyscraper" +msgstr "Giton a-serzh" + +#. TRANS: Tooltip for form label in OpenX admin panel. Refers to advertisement format. +#: openxadminpanel.php:201 +msgid "Wide skyscraper zone" +msgstr "" + +#. TRANS: Submit button text in OpenX admin panel. +#: openxadminpanel.php:216 +msgctxt "BUTTON" +msgid "Save" +msgstr "Enrollañ" + +#. TRANS: Submit button title in OpenX admin panel. +#: openxadminpanel.php:220 +msgid "Save OpenX settings" +msgstr "" diff --git a/plugins/Realtime/locale/af/LC_MESSAGES/Realtime.po b/plugins/Realtime/locale/af/LC_MESSAGES/Realtime.po new file mode 100644 index 000000000..81614a28e --- /dev/null +++ b/plugins/Realtime/locale/af/LC_MESSAGES/Realtime.po @@ -0,0 +1,58 @@ +# Translation of StatusNet - Realtime to Afrikaans (Afrikaans) +# Expored from translatewiki.net +# +# Author: Naudefj +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Realtime\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:28:59+0000\n" +"Language-Team: Afrikaans <http://translatewiki.net/wiki/Portal:af>\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2010-11-05 00:29:27+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" +"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-Language-Code: af\n" +"X-Message-Group: #out-statusnet-plugin-realtime\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Text label for realtime view "play" button, usually replaced by an icon. +#: RealtimePlugin.php:339 +msgctxt "BUTTON" +msgid "Play" +msgstr "Speel" + +#. TRANS: Tooltip for realtime view "play" button. +#: RealtimePlugin.php:341 +msgctxt "TOOLTIP" +msgid "Play" +msgstr "Speel" + +#. TRANS: Text label for realtime view "pause" button +#: RealtimePlugin.php:343 +msgctxt "BUTTON" +msgid "Pause" +msgstr "Wag" + +#. TRANS: Tooltip for realtime view "pause" button +#: RealtimePlugin.php:345 +msgctxt "TOOLTIP" +msgid "Pause" +msgstr "Wag" + +#. TRANS: Text label for realtime view "popup" button, usually replaced by an icon. +#: RealtimePlugin.php:347 +msgctxt "BUTTON" +msgid "Pop up" +msgstr "Pop-up" + +#. TRANS: Tooltip for realtime view "popup" button. +#: RealtimePlugin.php:349 +msgctxt "TOOLTIP" +msgid "Pop up in a window" +msgstr "Wys in 'n venstertjie" diff --git a/plugins/Realtime/locale/br/LC_MESSAGES/Realtime.po b/plugins/Realtime/locale/br/LC_MESSAGES/Realtime.po new file mode 100644 index 000000000..d30b98ec5 --- /dev/null +++ b/plugins/Realtime/locale/br/LC_MESSAGES/Realtime.po @@ -0,0 +1,58 @@ +# Translation of StatusNet - Realtime to Breton (Brezhoneg) +# Expored from translatewiki.net +# +# Author: Y-M D +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Realtime\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:28:59+0000\n" +"Language-Team: Breton <http://translatewiki.net/wiki/Portal:br>\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2010-11-05 00:29:27+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" +"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-Language-Code: br\n" +"X-Message-Group: #out-statusnet-plugin-realtime\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. TRANS: Text label for realtime view "play" button, usually replaced by an icon. +#: RealtimePlugin.php:339 +msgctxt "BUTTON" +msgid "Play" +msgstr "Lenn" + +#. TRANS: Tooltip for realtime view "play" button. +#: RealtimePlugin.php:341 +msgctxt "TOOLTIP" +msgid "Play" +msgstr "Lenn" + +#. TRANS: Text label for realtime view "pause" button +#: RealtimePlugin.php:343 +msgctxt "BUTTON" +msgid "Pause" +msgstr "Ehan" + +#. TRANS: Tooltip for realtime view "pause" button +#: RealtimePlugin.php:345 +msgctxt "TOOLTIP" +msgid "Pause" +msgstr "Ehan" + +#. TRANS: Text label for realtime view "popup" button, usually replaced by an icon. +#: RealtimePlugin.php:347 +msgctxt "BUTTON" +msgid "Pop up" +msgstr "" + +#. TRANS: Tooltip for realtime view "popup" button. +#: RealtimePlugin.php:349 +msgctxt "TOOLTIP" +msgid "Pop up in a window" +msgstr "" diff --git a/plugins/Realtime/locale/tr/LC_MESSAGES/Realtime.po b/plugins/Realtime/locale/tr/LC_MESSAGES/Realtime.po new file mode 100644 index 000000000..fb235468a --- /dev/null +++ b/plugins/Realtime/locale/tr/LC_MESSAGES/Realtime.po @@ -0,0 +1,58 @@ +# Translation of StatusNet - Realtime to Turkish (Türkçe) +# Expored from translatewiki.net +# +# Author: Maidis +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Realtime\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:28:59+0000\n" +"Language-Team: Turkish <http://translatewiki.net/wiki/Portal:tr>\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2010-11-05 00:29:27+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" +"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-Language-Code: tr\n" +"X-Message-Group: #out-statusnet-plugin-realtime\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. TRANS: Text label for realtime view "play" button, usually replaced by an icon. +#: RealtimePlugin.php:339 +msgctxt "BUTTON" +msgid "Play" +msgstr "Oynat" + +#. TRANS: Tooltip for realtime view "play" button. +#: RealtimePlugin.php:341 +msgctxt "TOOLTIP" +msgid "Play" +msgstr "Oynat" + +#. TRANS: Text label for realtime view "pause" button +#: RealtimePlugin.php:343 +msgctxt "BUTTON" +msgid "Pause" +msgstr "Duraklat" + +#. TRANS: Tooltip for realtime view "pause" button +#: RealtimePlugin.php:345 +msgctxt "TOOLTIP" +msgid "Pause" +msgstr "Duraklat" + +#. TRANS: Text label for realtime view "popup" button, usually replaced by an icon. +#: RealtimePlugin.php:347 +msgctxt "BUTTON" +msgid "Pop up" +msgstr "" + +#. TRANS: Tooltip for realtime view "popup" button. +#: RealtimePlugin.php:349 +msgctxt "TOOLTIP" +msgid "Pop up in a window" +msgstr "" diff --git a/plugins/Realtime/locale/uk/LC_MESSAGES/Realtime.po b/plugins/Realtime/locale/uk/LC_MESSAGES/Realtime.po new file mode 100644 index 000000000..f15b29127 --- /dev/null +++ b/plugins/Realtime/locale/uk/LC_MESSAGES/Realtime.po @@ -0,0 +1,59 @@ +# Translation of StatusNet - Realtime to Ukrainian (Українська) +# Expored from translatewiki.net +# +# Author: Boogie +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - Realtime\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:29:00+0000\n" +"Language-Team: Ukrainian <http://translatewiki.net/wiki/Portal:uk>\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2010-11-02 23:07:29+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" +"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-Language-Code: uk\n" +"X-Message-Group: #out-statusnet-plugin-realtime\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" + +#. TRANS: Text label for realtime view "play" button, usually replaced by an icon. +#: RealtimePlugin.php:339 +msgctxt "BUTTON" +msgid "Play" +msgstr "Оновлювати" + +#. TRANS: Tooltip for realtime view "play" button. +#: RealtimePlugin.php:341 +msgctxt "TOOLTIP" +msgid "Play" +msgstr "Оновлювати" + +#. TRANS: Text label for realtime view "pause" button +#: RealtimePlugin.php:343 +msgctxt "BUTTON" +msgid "Pause" +msgstr "Пауза" + +#. TRANS: Tooltip for realtime view "pause" button +#: RealtimePlugin.php:345 +msgctxt "TOOLTIP" +msgid "Pause" +msgstr "Пауза" + +#. TRANS: Text label for realtime view "popup" button, usually replaced by an icon. +#: RealtimePlugin.php:347 +msgctxt "BUTTON" +msgid "Pop up" +msgstr "Окреме вікно" + +#. TRANS: Tooltip for realtime view "popup" button. +#: RealtimePlugin.php:349 +msgctxt "TOOLTIP" +msgid "Pop up in a window" +msgstr "Стрічка окремим вікном" diff --git a/plugins/Sample/locale/br/LC_MESSAGES/Sample.po b/plugins/Sample/locale/br/LC_MESSAGES/Sample.po index 2ac1405de..0702b07c3 100644 --- a/plugins/Sample/locale/br/LC_MESSAGES/Sample.po +++ b/plugins/Sample/locale/br/LC_MESSAGES/Sample.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sample\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:47:31+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:29:05+0000\n" "Language-Team: Breton <http://translatewiki.net/wiki/Portal:br>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-20 17:58:22+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75596); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:14:01+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: br\n" "X-Message-Group: #out-statusnet-plugin-sample\n" @@ -26,14 +26,14 @@ msgstr "" #: User_greeting_count.php:164 #, php-format msgid "Could not save new greeting count for %d." -msgstr "" +msgstr "Dibosupl eo enrollañ ar gont degemer nevez evit an implijer %d." #. TRANS: Exception thrown when the user greeting count could not be saved in the database. #. TRANS: %d is a user ID (number). #: User_greeting_count.php:177 #, php-format msgid "Could not increment greeting count for %d." -msgstr "" +msgstr "Dibosupl eo inkremantañ ar gont degemer nevez evit an implijer %d." #: SamplePlugin.php:259 hello.php:111 msgid "Hello" @@ -41,11 +41,13 @@ msgstr "Demat" #: SamplePlugin.php:259 msgid "A warm greeting" -msgstr "" +msgstr "Un degemer tomm" #: SamplePlugin.php:270 msgid "A sample plugin to show basics of development for new hackers." msgstr "" +"Ur skouer a lugant evit diskouez an diazezoù diorren evit ar c'hoderien " +"nevez." #: hello.php:113 #, php-format @@ -65,5 +67,5 @@ msgstr "Demat, %s" #, php-format msgid "I have greeted you %d time." msgid_plural "I have greeted you %d times." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "ur" +msgstr[1] "%d" diff --git a/plugins/Sitemap/locale/br/LC_MESSAGES/Sitemap.po b/plugins/Sitemap/locale/br/LC_MESSAGES/Sitemap.po index 02dea72ee..73ebd322f 100644 --- a/plugins/Sitemap/locale/br/LC_MESSAGES/Sitemap.po +++ b/plugins/Sitemap/locale/br/LC_MESSAGES/Sitemap.po @@ -2,6 +2,7 @@ # Expored from translatewiki.net # # Author: Fulup +# Author: Y-M D # -- # This file is distributed under the same license as the StatusNet package. # @@ -9,13 +10,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - Sitemap\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:47:40+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:29:07+0000\n" "Language-Team: Breton <http://translatewiki.net/wiki/Portal:br>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-18 20:34:11+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75596); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:14:04+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: br\n" "X-Message-Group: #out-statusnet-plugin-sitemap\n" @@ -54,7 +55,7 @@ msgstr "" #. TRANS: Field label. #: sitemapadminpanel.php:183 msgid "Bing key" -msgstr "" +msgstr "Alc'hwez Bing" #. TRANS: Title for field label. #: sitemapadminpanel.php:185 diff --git a/plugins/TabFocus/locale/br/LC_MESSAGES/TabFocus.po b/plugins/TabFocus/locale/br/LC_MESSAGES/TabFocus.po new file mode 100644 index 000000000..b9b454898 --- /dev/null +++ b/plugins/TabFocus/locale/br/LC_MESSAGES/TabFocus.po @@ -0,0 +1,32 @@ +# Translation of StatusNet - TabFocus to Breton (Brezhoneg) +# Expored from translatewiki.net +# +# Author: Y-M D +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet - TabFocus\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:29:11+0000\n" +"Language-Team: Breton <http://translatewiki.net/wiki/Portal:br>\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-POT-Import-Date: 2010-10-29 16:14:08+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" +"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-Language-Code: br\n" +"X-Message-Group: #out-statusnet-plugin-tabfocus\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: TabFocusPlugin.php:54 +msgid "" +"TabFocus changes the notice form behavior so that, while in the text area, " +"pressing the tab key focuses the \"Send\" button, matching the behavior of " +"Twitter." +msgstr "" +"TabFocus a gemm emzalc'h ar furmskrid kemennoù evit ma vefe kaset ar fokus " +"war ar bouton \"Kas\" pa bouezer war a stokell taolennata adalek ar zonenn " +"testenn, ar pezh a glot gant emzalc'h Twitter." diff --git a/plugins/TwitterBridge/TwitterBridgePlugin.php b/plugins/TwitterBridge/TwitterBridgePlugin.php index 097d4486f..f5c361250 100644 --- a/plugins/TwitterBridge/TwitterBridgePlugin.php +++ b/plugins/TwitterBridge/TwitterBridgePlugin.php @@ -200,8 +200,15 @@ class TwitterBridgePlugin extends Plugin return false; case 'TwitterOAuthClient': case 'TwitterQueueHandler': + case 'TwitterImport': + case 'JsonStreamReader': + case 'TwitterStreamReader': include_once $dir . '/' . strtolower($cls) . '.php'; return false; + case 'TwitterSiteStream': + case 'TwitterUserStream': + include_once $dir . '/twitterstreamreader.php'; + return false; case 'Notice_to_status': case 'Twitter_synch_status': include_once $dir . '/' . $cls . '.php'; @@ -267,7 +274,11 @@ class TwitterBridgePlugin extends Plugin function onEndInitializeQueueManager($manager) { if (self::hasKeys()) { + // Outgoing notices -> twitter $manager->connect('twitter', 'TwitterQueueHandler'); + + // Incoming statuses <- twitter + $manager->connect('tweetin', 'TweetInQueueHandler'); } return true; } diff --git a/plugins/TwitterBridge/daemons/twitterdaemon.php b/plugins/TwitterBridge/daemons/twitterdaemon.php new file mode 100644 index 000000000..d313d2de9 --- /dev/null +++ b/plugins/TwitterBridge/daemons/twitterdaemon.php @@ -0,0 +1,314 @@ +#!/usr/bin/env php +<?php +/* + * StatusNet - the distributed open-source microblogging tool + * Copyright (C) 2008-2010, StatusNet, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..')); + +$shortoptions = 'fi::a'; +$longoptions = array('id::', 'foreground', 'all'); + +$helptext = <<<END_OF_XMPP_HELP +Daemon script for receiving new notices from Twitter users. + + -i --id Identity (default none) + -a --all Handle Twitter for all local sites + (requires Stomp queue handler, status_network setup) + -f --foreground Stay in the foreground (default background) + +END_OF_XMPP_HELP; + +require_once INSTALLDIR.'/scripts/commandline.inc'; + +require_once INSTALLDIR . '/lib/jabber.php'; + +class TwitterDaemon extends SpawningDaemon +{ + protected $allsites = false; + + function __construct($id=null, $daemonize=true, $threads=1, $allsites=false) + { + if ($threads != 1) { + // This should never happen. :) + throw new Exception("TwitterDaemon must run single-threaded"); + } + parent::__construct($id, $daemonize, $threads); + $this->allsites = $allsites; + } + + function runThread() + { + common_log(LOG_INFO, 'Waiting to listen to Twitter and queues'); + + $master = new TwitterMaster($this->get_id(), $this->processManager()); + $master->init($this->allsites); + $master->service(); + + common_log(LOG_INFO, 'terminating normally'); + + return $master->respawn ? self::EXIT_RESTART : self::EXIT_SHUTDOWN; + } + +} + +class TwitterMaster extends IoMaster +{ + protected $processManager; + + function __construct($id, $processManager) + { + parent::__construct($id); + $this->processManager = $processManager; + } + + /** + * Initialize IoManagers for the currently configured site + * which are appropriate to this instance. + */ + function initManagers() + { + $qm = QueueManager::get(); + $qm->setActiveGroup('twitter'); + $this->instantiate($qm); + $this->instantiate(new TwitterManager()); + $this->instantiate($this->processManager); + } +} + + +class TwitterManager extends IoManager +{ + // Recommended resource limits from http://dev.twitter.com/pages/site_streams + const MAX_STREAMS = 1000; + const USERS_PER_STREAM = 100; + const STREAMS_PER_SECOND = 20; + + protected $streams; + protected $users; + + /** + * Pull the site's active Twitter-importing users and start spawning + * some data streams for them! + * + * @fixme check their last-id and check whether we'll need to do a manual pull. + * @fixme abstract out the fetching so we can work over multiple sites. + */ + protected function initStreams() + { + common_log(LOG_INFO, 'init...'); + // Pull Twitter user IDs for all users we want to pull data for + $flink = new Foreign_link(); + $flink->service = TWITTER_SERVICE; + // @fixme probably should do the bitfield check in a whereAdd but it's ugly :D + $flink->find(); + + $userIds = array(); + while ($flink->fetch()) { + if (($flink->noticesync & FOREIGN_NOTICE_RECV) == + FOREIGN_NOTICE_RECV) { + $userIds[] = $flink->foreign_id; + + if (count($userIds) >= self::USERS_PER_STREAM) { + $this->spawnStream($userIds); + $userIds = array(); + } + } + } + + if (count($userIds)) { + $this->spawnStream($userIds); + } + } + + /** + * Prepare a Site Stream connection for the given chunk of users. + * The actual connection will be opened later. + * + * @param $userIds array of Twitter-side user IDs + */ + protected function spawnStream($userIds) + { + $stream = $this->initSiteStream(); + $stream->followUsers($userIds); + + // Slip the stream reader into our list of active streams. + // We'll manage its actual connection on the next go-around. + $this->streams[] = $stream; + + // Record the user->stream mappings; this makes it easier for us to know + // later if we need to kill something. + foreach ($userIds as $id) { + $this->users[$id] = $stream; + } + } + + /** + * Initialize a generic site streams connection object. + * All our connections will look like this, then we'll add users to them. + * + * @return TwitterStreamReader + */ + protected function initSiteStream() + { + $auth = $this->siteStreamAuth(); + $stream = new TwitterSiteStream($auth); + + // Add our event handler callbacks. Whee! + $this->setupEvents($stream); + return $stream; + } + + /** + * Fetch the Twitter OAuth credentials to use to connect to the Site Streams API. + * + * This will use the locally-stored credentials for the applictation's owner account + * from the site configuration. These should be configured through the administration + * panels or manually in the config file. + * + * Will throw an exception if no credentials can be found -- but beware that invalid + * credentials won't cause breakage until later. + * + * @return TwitterOAuthClient + */ + protected function siteStreamAuth() + { + $token = common_config('twitter', 'stream_token'); + $secret = common_config('twitter', 'stream_secret'); + if (empty($token) || empty($secret)) { + throw new ServerException('Twitter site streams have not been correctly configured. Configure the app owner account via the admin panel.'); + } + return new TwitterOAuthClient($token, $secret); + } + + /** + * Collect the sockets for all active connections for i/o monitoring. + * + * @return array of resources + */ + public function getSockets() + { + $sockets = array(); + foreach ($this->streams as $stream) { + foreach ($stream->getSockets() as $socket) { + $sockets[] = $socket; + } + } + return $sockets; + } + + /** + * We're ready to process input from one of our data sources! Woooooo! + * @fixme is there an easier way to map from socket back to owning module? :( + * + * @param resource $socket + * @return boolean success + */ + public function handleInput($socket) + { + foreach ($this->streams as $stream) { + foreach ($stream->getSockets() as $aSocket) { + if ($socket === $aSocket) { + $stream->handleInput($socket); + } + } + } + return true; + } + + /** + * Start the i/o system up! Prepare our connections and start opening them. + * + * @fixme do some rate-limiting on the stream setup + * @fixme do some sensible backoff on failure etc + */ + public function start() + { + $this->initStreams(); + foreach ($this->streams as $stream) { + $stream->connect(); + } + return true; + } + + /** + * Close down our connections when the daemon wraps up for business. + */ + public function finish() + { + foreach ($this->streams as $index => $stream) { + $stream->close(); + unset($this->streams[$index]); + } + return true; + } + + public static function get() + { + throw new Exception('not a singleton'); + } + + /** + * Set up event handlers on the streaming interface. + * + * @fixme add more event types as we add handling for them + */ + protected function setupEvents(TwitterStreamReader $stream) + { + $handlers = array( + 'status', + ); + foreach ($handlers as $event) { + $stream->hookEvent($event, array($this, 'onTwitter' . ucfirst($event))); + } + } + + /** + * Event callback notifying that a user has a new message in their home timeline. + * We store the incoming message into the queues for processing, keeping our own + * daemon running as shiny-fast as possible. + * + * @param object $status JSON data: Twitter status update + * @fixme in all-sites mode we may need to route queue items into another site's + * destination queues, or multiple sites. + */ + protected function onTwitterStatus($status, $context) + { + $data = array( + 'status' => $status, + 'for_user' => $context->for_user, + ); + $qm = QueueManager::get(); + $qm->enqueue($data, 'tweetin'); + } +} + + +if (have_option('i', 'id')) { + $id = get_option_value('i', 'id'); +} else if (count($args) > 0) { + $id = $args[0]; +} else { + $id = null; +} + +$foreground = have_option('f', 'foreground'); +$all = have_option('a') || have_option('--all'); + +$daemon = new TwitterDaemon($id, !$foreground, 1, $all); + +$daemon->runOnce(); diff --git a/plugins/TwitterBridge/daemons/twitterstatusfetcher.php b/plugins/TwitterBridge/daemons/twitterstatusfetcher.php index cef67b180..9298d9e3a 100755 --- a/plugins/TwitterBridge/daemons/twitterstatusfetcher.php +++ b/plugins/TwitterBridge/daemons/twitterstatusfetcher.php @@ -192,25 +192,12 @@ class TwitterStatusFetcher extends ParallelizingDaemon common_debug(LOG_INFO, $this->name() . ' - Retrieved ' . sizeof($timeline) . ' statuses from Twitter.'); + $importer = new TwitterImport(); + // Reverse to preserve order foreach (array_reverse($timeline) as $status) { - // Hacktastic: filter out stuff coming from this StatusNet - $source = mb_strtolower(common_config('integration', 'source')); - - if (preg_match("/$source/", mb_strtolower($status->source))) { - common_debug($this->name() . ' - Skipping import of status ' . - $status->id . ' with source ' . $source); - continue; - } - - // Don't save it if the user is protected - // FIXME: save it but treat it as private - if ($status->user->protected) { - continue; - } - - $notice = $this->saveStatus($status); + $notice = $importer->importStatus($status); if (!empty($notice)) { Inbox::insertNotice($flink->user_id, $notice->id); @@ -226,578 +213,6 @@ class TwitterStatusFetcher extends ParallelizingDaemon $flink->last_noticesync = common_sql_now(); $flink->update(); } - - function saveStatus($status) - { - $profile = $this->ensureProfile($status->user); - - if (empty($profile)) { - common_log(LOG_ERR, $this->name() . - ' - Problem saving notice. No associated Profile.'); - return null; - } - - $statusUri = $this->makeStatusURI($status->user->screen_name, $status->id); - - // check to see if we've already imported the status - $n2s = Notice_to_status::staticGet('status_id', $status->id); - - if (!empty($n2s)) { - common_log( - LOG_INFO, - $this->name() . - " - Ignoring duplicate import: {$status->id}" - ); - return Notice::staticGet('id', $n2s->notice_id); - } - - // If it's a retweet, save it as a repeat! - if (!empty($status->retweeted_status)) { - common_log(LOG_INFO, "Status {$status->id} is a retweet of {$status->retweeted_status->id}."); - $original = $this->saveStatus($status->retweeted_status); - if (empty($original)) { - return null; - } else { - $author = $original->getProfile(); - // TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. - // TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. - $content = sprintf(_m('RT @%1$s %2$s'), - $author->nickname, - $original->content); - - if (Notice::contentTooLong($content)) { - $contentlimit = Notice::maxContent(); - $content = mb_substr($content, 0, $contentlimit - 4) . ' ...'; - } - - $repeat = Notice::saveNew($profile->id, - $content, - 'twitter', - array('repeat_of' => $original->id, - 'uri' => $statusUri, - 'is_local' => Notice::GATEWAY)); - common_log(LOG_INFO, "Saved {$repeat->id} as a repeat of {$original->id}"); - Notice_to_status::saveNew($repeat->id, $status->id); - return $repeat; - } - } - - $notice = new Notice(); - - $notice->profile_id = $profile->id; - $notice->uri = $statusUri; - $notice->url = $statusUri; - $notice->created = strftime( - '%Y-%m-%d %H:%M:%S', - strtotime($status->created_at) - ); - - $notice->source = 'twitter'; - - $notice->reply_to = null; - - if (!empty($status->in_reply_to_status_id)) { - common_log(LOG_INFO, "Status {$status->id} is a reply to status {$status->in_reply_to_status_id}"); - $n2s = Notice_to_status::staticGet('status_id', $status->in_reply_to_status_id); - if (empty($n2s)) { - common_log(LOG_INFO, "Couldn't find local notice for status {$status->in_reply_to_status_id}"); - } else { - $reply = Notice::staticGet('id', $n2s->notice_id); - if (empty($reply)) { - common_log(LOG_INFO, "Couldn't find local notice for status {$status->in_reply_to_status_id}"); - } else { - common_log(LOG_INFO, "Found local notice {$reply->id} for status {$status->in_reply_to_status_id}"); - $notice->reply_to = $reply->id; - $notice->conversation = $reply->conversation; - } - } - } - - if (empty($notice->conversation)) { - $conv = Conversation::create(); - $notice->conversation = $conv->id; - common_log(LOG_INFO, "No known conversation for status {$status->id} so making a new one {$conv->id}."); - } - - $notice->is_local = Notice::GATEWAY; - - $notice->content = html_entity_decode($status->text, ENT_QUOTES, 'UTF-8'); - $notice->rendered = $this->linkify($status); - - if (Event::handle('StartNoticeSave', array(&$notice))) { - - $id = $notice->insert(); - - if (!$id) { - common_log_db_error($notice, 'INSERT', __FILE__); - common_log(LOG_ERR, $this->name() . - ' - Problem saving notice.'); - } - - Event::handle('EndNoticeSave', array($notice)); - } - - Notice_to_status::saveNew($notice->id, $status->id); - - $this->saveStatusMentions($notice, $status); - - $notice->blowOnInsert(); - - return $notice; - } - - /** - * Make an URI for a status. - * - * @param object $status status object - * - * @return string URI - */ - function makeStatusURI($username, $id) - { - return 'http://twitter.com/' - . $username - . '/status/' - . $id; - } - - /** - * Look up a Profile by profileurl field. Profile::staticGet() was - * not working consistently. - * - * @param string $nickname local nickname of the Twitter user - * @param string $profileurl the profile url - * - * @return mixed value the first Profile with that url, or null - */ - function getProfileByUrl($nickname, $profileurl) - { - $profile = new Profile(); - $profile->nickname = $nickname; - $profile->profileurl = $profileurl; - $profile->limit(1); - - if ($profile->find()) { - $profile->fetch(); - return $profile; - } - - return null; - } - - /** - * Check to see if this Twitter status has already been imported - * - * @param Profile $profile Twitter user's local profile - * @param string $statusUri URI of the status on Twitter - * - * @return mixed value a matching Notice or null - */ - function checkDupe($profile, $statusUri) - { - $notice = new Notice(); - $notice->uri = $statusUri; - $notice->profile_id = $profile->id; - $notice->limit(1); - - if ($notice->find()) { - $notice->fetch(); - return $notice; - } - - return null; - } - - function ensureProfile($user) - { - // check to see if there's already a profile for this user - $profileurl = 'http://twitter.com/' . $user->screen_name; - $profile = $this->getProfileByUrl($user->screen_name, $profileurl); - - if (!empty($profile)) { - common_debug($this->name() . - " - Profile for $profile->nickname found."); - - // Check to see if the user's Avatar has changed - - $this->checkAvatar($user, $profile); - return $profile; - - } else { - common_debug($this->name() . ' - Adding profile and remote profile ' . - "for Twitter user: $profileurl."); - - $profile = new Profile(); - $profile->query("BEGIN"); - - $profile->nickname = $user->screen_name; - $profile->fullname = $user->name; - $profile->homepage = $user->url; - $profile->bio = $user->description; - $profile->location = $user->location; - $profile->profileurl = $profileurl; - $profile->created = common_sql_now(); - - try { - $id = $profile->insert(); - } catch(Exception $e) { - common_log(LOG_WARNING, $this->name . ' Couldn\'t insert profile - ' . $e->getMessage()); - } - - if (empty($id)) { - common_log_db_error($profile, 'INSERT', __FILE__); - $profile->query("ROLLBACK"); - return false; - } - - // check for remote profile - - $remote_pro = Remote_profile::staticGet('uri', $profileurl); - - if (empty($remote_pro)) { - $remote_pro = new Remote_profile(); - - $remote_pro->id = $id; - $remote_pro->uri = $profileurl; - $remote_pro->created = common_sql_now(); - - try { - $rid = $remote_pro->insert(); - } catch (Exception $e) { - common_log(LOG_WARNING, $this->name() . ' Couldn\'t save remote profile - ' . $e->getMessage()); - } - - if (empty($rid)) { - common_log_db_error($profile, 'INSERT', __FILE__); - $profile->query("ROLLBACK"); - return false; - } - } - - $profile->query("COMMIT"); - - $this->saveAvatars($user, $id); - - return $profile; - } - } - - function checkAvatar($twitter_user, $profile) - { - global $config; - - $path_parts = pathinfo($twitter_user->profile_image_url); - - $newname = 'Twitter_' . $twitter_user->id . '_' . - $path_parts['basename']; - - $oldname = $profile->getAvatar(48)->filename; - - if ($newname != $oldname) { - common_debug($this->name() . ' - Avatar for Twitter user ' . - "$profile->nickname has changed."); - common_debug($this->name() . " - old: $oldname new: $newname"); - - $this->updateAvatars($twitter_user, $profile); - } - - if ($this->missingAvatarFile($profile)) { - common_debug($this->name() . ' - Twitter user ' . - $profile->nickname . - ' is missing one or more local avatars.'); - common_debug($this->name() ." - old: $oldname new: $newname"); - - $this->updateAvatars($twitter_user, $profile); - } - } - - function updateAvatars($twitter_user, $profile) { - - global $config; - - $path_parts = pathinfo($twitter_user->profile_image_url); - - $img_root = substr($path_parts['basename'], 0, -11); - $ext = $path_parts['extension']; - $mediatype = $this->getMediatype($ext); - - foreach (array('mini', 'normal', 'bigger') as $size) { - $url = $path_parts['dirname'] . '/' . - $img_root . '_' . $size . ".$ext"; - $filename = 'Twitter_' . $twitter_user->id . '_' . - $img_root . "_$size.$ext"; - - $this->updateAvatar($profile->id, $size, $mediatype, $filename); - $this->fetchAvatar($url, $filename); - } - } - - function missingAvatarFile($profile) { - foreach (array(24, 48, 73) as $size) { - $filename = $profile->getAvatar($size)->filename; - $avatarpath = Avatar::path($filename); - if (file_exists($avatarpath) == FALSE) { - return true; - } - } - return false; - } - - function getMediatype($ext) - { - $mediatype = null; - - switch (strtolower($ext)) { - case 'jpg': - $mediatype = 'image/jpg'; - break; - case 'gif': - $mediatype = 'image/gif'; - break; - default: - $mediatype = 'image/png'; - } - - return $mediatype; - } - - function saveAvatars($user, $id) - { - global $config; - - $path_parts = pathinfo($user->profile_image_url); - $ext = $path_parts['extension']; - $end = strlen('_normal' . $ext); - $img_root = substr($path_parts['basename'], 0, -($end+1)); - $mediatype = $this->getMediatype($ext); - - foreach (array('mini', 'normal', 'bigger') as $size) { - $url = $path_parts['dirname'] . '/' . - $img_root . '_' . $size . ".$ext"; - $filename = 'Twitter_' . $user->id . '_' . - $img_root . "_$size.$ext"; - - if ($this->fetchAvatar($url, $filename)) { - $this->newAvatar($id, $size, $mediatype, $filename); - } else { - common_log(LOG_WARNING, $id() . - " - Problem fetching Avatar: $url"); - } - } - } - - function updateAvatar($profile_id, $size, $mediatype, $filename) { - - common_debug($this->name() . " - Updating avatar: $size"); - - $profile = Profile::staticGet($profile_id); - - if (empty($profile)) { - common_debug($this->name() . " - Couldn't get profile: $profile_id!"); - return; - } - - $sizes = array('mini' => 24, 'normal' => 48, 'bigger' => 73); - $avatar = $profile->getAvatar($sizes[$size]); - - // Delete the avatar, if present - if ($avatar) { - $avatar->delete(); - } - - $this->newAvatar($profile->id, $size, $mediatype, $filename); - } - - function newAvatar($profile_id, $size, $mediatype, $filename) - { - global $config; - - $avatar = new Avatar(); - $avatar->profile_id = $profile_id; - - switch($size) { - case 'mini': - $avatar->width = 24; - $avatar->height = 24; - break; - case 'normal': - $avatar->width = 48; - $avatar->height = 48; - break; - default: - // Note: Twitter's big avatars are a different size than - // StatusNet's (StatusNet's = 96) - $avatar->width = 73; - $avatar->height = 73; - } - - $avatar->original = 0; // we don't have the original - $avatar->mediatype = $mediatype; - $avatar->filename = $filename; - $avatar->url = Avatar::url($filename); - - $avatar->created = common_sql_now(); - - try { - $id = $avatar->insert(); - } catch (Exception $e) { - common_log(LOG_WARNING, $this->name() . ' Couldn\'t insert avatar - ' . $e->getMessage()); - } - - if (empty($id)) { - common_log_db_error($avatar, 'INSERT', __FILE__); - return null; - } - - common_debug($this->name() . - " - Saved new $size avatar for $profile_id."); - - return $id; - } - - /** - * Fetch a remote avatar image and save to local storage. - * - * @param string $url avatar source URL - * @param string $filename bare local filename for download - * @return bool true on success, false on failure - */ - function fetchAvatar($url, $filename) - { - common_debug($this->name() . " - Fetching Twitter avatar: $url"); - - $request = HTTPClient::start(); - $response = $request->get($url); - if ($response->isOk()) { - $avatarfile = Avatar::path($filename); - $ok = file_put_contents($avatarfile, $response->getBody()); - if (!$ok) { - common_log(LOG_WARNING, $this->name() . - " - Couldn't open file $filename"); - return false; - } - } else { - return false; - } - - return true; - } - - const URL = 1; - const HASHTAG = 2; - const MENTION = 3; - - function linkify($status) - { - $text = $status->text; - - if (empty($status->entities)) { - common_log(LOG_WARNING, "No entities data for {$status->id}; trying to fake up links ourselves."); - $text = common_replace_urls_callback($text, 'common_linkify'); - $text = preg_replace('/(^|\"\;|\'|\(|\[|\{|\s+)#([\pL\pN_\-\.]{1,64})/e', "'\\1#'.TwitterStatusFetcher::tagLink('\\2')", $text); - $text = preg_replace('/(^|\s+)@([a-z0-9A-Z_]{1,64})/e', "'\\1@'.TwitterStatusFetcher::atLink('\\2')", $text); - return $text; - } - - // Move all the entities into order so we can - // replace them in reverse order and thus - // not mess up their indices - - $toReplace = array(); - - if (!empty($status->entities->urls)) { - foreach ($status->entities->urls as $url) { - $toReplace[$url->indices[0]] = array(self::URL, $url); - } - } - - if (!empty($status->entities->hashtags)) { - foreach ($status->entities->hashtags as $hashtag) { - $toReplace[$hashtag->indices[0]] = array(self::HASHTAG, $hashtag); - } - } - - if (!empty($status->entities->user_mentions)) { - foreach ($status->entities->user_mentions as $mention) { - $toReplace[$mention->indices[0]] = array(self::MENTION, $mention); - } - } - - // sort in reverse order by key - - krsort($toReplace); - - foreach ($toReplace as $part) { - list($type, $object) = $part; - switch($type) { - case self::URL: - $linkText = $this->makeUrlLink($object); - break; - case self::HASHTAG: - $linkText = $this->makeHashtagLink($object); - break; - case self::MENTION: - $linkText = $this->makeMentionLink($object); - break; - default: - continue; - } - $text = mb_substr($text, 0, $object->indices[0]) . $linkText . mb_substr($text, $object->indices[1]); - } - return $text; - } - - function makeUrlLink($object) - { - return "<a href='{$object->url}' class='extlink'>{$object->url}</a>"; - } - - function makeHashtagLink($object) - { - return "#" . self::tagLink($object->text); - } - - function makeMentionLink($object) - { - return "@".self::atLink($object->screen_name, $object->name); - } - - static function tagLink($tag) - { - return "<a href='https://twitter.com/search?q=%23{$tag}' class='hashtag'>{$tag}</a>"; - } - - static function atLink($screenName, $fullName=null) - { - if (!empty($fullName)) { - return "<a href='http://twitter.com/{$screenName}' title='{$fullName}'>{$screenName}</a>"; - } else { - return "<a href='http://twitter.com/{$screenName}'>{$screenName}</a>"; - } - } - - function saveStatusMentions($notice, $status) - { - $mentions = array(); - - if (empty($status->entities) || empty($status->entities->user_mentions)) { - return; - } - - foreach ($status->entities->user_mentions as $mention) { - $flink = Foreign_link::getByForeignID($mention->id, TWITTER_SERVICE); - if (!empty($flink)) { - $user = User::staticGet('id', $flink->user_id); - if (!empty($user)) { - $reply = new Reply(); - $reply->notice_id = $notice->id; - $reply->profile_id = $user->id; - common_log(LOG_INFO, __METHOD__ . ": saving reply: notice {$notice->id} to profile {$user->id}"); - $id = $reply->insert(); - } - } - } - } } $id = null; diff --git a/plugins/TwitterBridge/jsonstreamreader.php b/plugins/TwitterBridge/jsonstreamreader.php new file mode 100644 index 000000000..f6572c9ee --- /dev/null +++ b/plugins/TwitterBridge/jsonstreamreader.php @@ -0,0 +1,265 @@ +<?php +/** + * StatusNet, the distributed open-source microblogging tool + * + * PHP version 5 + * + * LICENCE: This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @category Plugin + * @package StatusNet + * @author Brion Vibber <brion@status.net> + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +class OAuthData +{ + public $consumer_key, $consumer_secret, $token, $token_secret; +} + +/** + * + */ +abstract class JsonStreamReader +{ + const CRLF = "\r\n"; + + public $id; + protected $socket = null; + protected $state = 'init'; // 'init', 'connecting', 'waiting', 'headers', 'active' + + public function __construct() + { + $this->id = get_class($this) . '.' . substr(md5(mt_rand()), 0, 8); + } + + /** + * Starts asynchronous connect operation... + * + * @fixme Can we do the open-socket fully async to? (need write select infrastructure) + * + * @param string $url + */ + public function connect($url) + { + common_log(LOG_DEBUG, "$this->id opening connection to $url"); + + $scheme = parse_url($url, PHP_URL_SCHEME); + if ($scheme == 'http') { + $rawScheme = 'tcp'; + } else if ($scheme == 'https') { + $rawScheme = 'ssl'; + } else { + throw new ServerException('Invalid URL scheme for HTTP stream reader'); + } + + $host = parse_url($url, PHP_URL_HOST); + $port = parse_url($url, PHP_URL_PORT); + if (!$port) { + if ($scheme == 'https') { + $port = 443; + } else { + $port = 80; + } + } + + $path = parse_url($url, PHP_URL_PATH); + $query = parse_url($url, PHP_URL_QUERY); + if ($query) { + $path .= '?' . $query; + } + + $errno = $errstr = null; + $timeout = 5; + //$flags = STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT; + $flags = STREAM_CLIENT_CONNECT; + // @fixme add SSL params + $this->socket = stream_socket_client("$rawScheme://$host:$port", $errno, $errstr, $timeout, $flags); + + $this->send($this->httpOpen($host, $path)); + + stream_set_blocking($this->socket, false); + $this->state = 'waiting'; + } + + /** + * Send some fun data off to the server. + * + * @param string $buffer + */ + function send($buffer) + { + fwrite($this->socket, $buffer); + } + + /** + * Read next packet of data from the socket. + * + * @return string + */ + function read() + { + $buffer = fread($this->socket, 65536); + return $buffer; + } + + /** + * Build HTTP request headers. + * + * @param string $host + * @param string $path + * @return string + */ + protected function httpOpen($host, $path) + { + $lines = array( + "GET $path HTTP/1.1", + "Host: $host", + "User-Agent: StatusNet/" . STATUSNET_VERSION . " (TwitterBridgePlugin)", + "Connection: close", + "", + "" + ); + return implode(self::CRLF, $lines); + } + + /** + * Close the current connection, if open. + */ + public function close() + { + if ($this->isConnected()) { + common_log(LOG_DEBUG, "$this->id closing connection."); + fclose($this->socket); + $this->socket = null; + } + } + + /** + * Are we currently connected? + * + * @return boolean + */ + public function isConnected() + { + return $this->socket !== null; + } + + /** + * Send any sockets we're listening on to the IO manager + * to wait for input. + * + * @return array of resources + */ + public function getSockets() + { + if ($this->isConnected()) { + return array($this->socket); + } + return array(); + } + + /** + * Take a chunk of input over the horn and go go go! :D + * + * @param string $buffer + */ + public function handleInput($socket) + { + if ($this->socket !== $socket) { + throw new Exception('Got input from unexpected socket!'); + } + + try { + $buffer = $this->read(); + $lines = explode(self::CRLF, $buffer); + foreach ($lines as $line) { + $this->handleLine($line); + } + } catch (Exception $e) { + common_log(LOG_ERR, "$this->id aborting connection due to error: " . $e->getMessage()); + fclose($this->socket); + throw $e; + } + } + + protected function handleLine($line) + { + switch ($this->state) + { + case 'waiting': + $this->handleLineWaiting($line); + break; + case 'headers': + $this->handleLineHeaders($line); + break; + case 'active': + $this->handleLineActive($line); + break; + default: + throw new Exception('Invalid state in handleLine: ' . $this->state); + } + } + + /** + * + * @param <type> $line + */ + protected function handleLineWaiting($line) + { + $bits = explode(' ', $line, 3); + if (count($bits) != 3) { + throw new Exception("Invalid HTTP response line: $line"); + } + + list($http, $status, $text) = $bits; + if (substr($http, 0, 5) != 'HTTP/') { + throw new Exception("Invalid HTTP response line chunk '$http': $line"); + } + if ($status != '200') { + throw new Exception("Bad HTTP response code $status: $line"); + } + common_log(LOG_DEBUG, "$this->id $line"); + $this->state = 'headers'; + } + + protected function handleLineHeaders($line) + { + if ($line == '') { + $this->state = 'active'; + common_log(LOG_DEBUG, "$this->id connection is active!"); + } else { + common_log(LOG_DEBUG, "$this->id read HTTP header: $line"); + $this->responseHeaders[] = $line; + } + } + + protected function handleLineActive($line) + { + if ($line == "") { + // Server sends empty lines as keepalive. + return; + } + $data = json_decode($line); + if ($data) { + $this->handleJson($data); + } else { + common_log(LOG_ERR, "$this->id received bogus JSON data: " . var_export($line, true)); + } + } + + abstract protected function handleJson(stdClass $data); +} diff --git a/plugins/TwitterBridge/locale/TwitterBridge.pot b/plugins/TwitterBridge/locale/TwitterBridge.pot index 2fc96dfe2..61a1b6fb1 100644 --- a/plugins/TwitterBridge/locale/TwitterBridge.pot +++ b/plugins/TwitterBridge/locale/TwitterBridge.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\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" @@ -16,6 +16,13 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" +#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. +#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. +#: twitterimport.php:113 +#, php-format +msgid "RT @%1$s %2$s" +msgstr "" + #: twitter.php:349 msgid "Your Twitter bridge has been disabled." msgstr "" @@ -37,7 +44,7 @@ msgid "" msgstr "" #: TwitterBridgePlugin.php:151 TwitterBridgePlugin.php:174 -#: TwitterBridgePlugin.php:291 twitteradminpanel.php:52 +#: TwitterBridgePlugin.php:302 twitteradminpanel.php:52 msgid "Twitter" msgstr "" @@ -49,11 +56,11 @@ msgstr "" msgid "Twitter integration options" msgstr "" -#: TwitterBridgePlugin.php:292 +#: TwitterBridgePlugin.php:303 msgid "Twitter bridge configuration" msgstr "" -#: TwitterBridgePlugin.php:316 +#: TwitterBridgePlugin.php:327 msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with <a href=\"http://twitter.com/\">Twitter</a>." @@ -354,17 +361,10 @@ msgstr "" msgid "Twitter account disconnected." msgstr "" -#: twittersettings.php:283 twittersettings.php:293 +#: twittersettings.php:283 twittersettings.php:294 msgid "Couldn't save Twitter preferences." msgstr "" -#: twittersettings.php:297 +#: twittersettings.php:302 msgid "Twitter preferences saved." msgstr "" - -#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. -#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: daemons/twitterstatusfetcher.php:264 -#, php-format -msgid "RT @%1$s %2$s" -msgstr "" diff --git a/plugins/TwitterBridge/locale/fr/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/fr/LC_MESSAGES/TwitterBridge.po index 988b2577d..0192705db 100644 --- a/plugins/TwitterBridge/locale/fr/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/fr/LC_MESSAGES/TwitterBridge.po @@ -10,18 +10,25 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:47:52+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:29:18+0000\n" "Language-Team: French <http://translatewiki.net/wiki/Portal:fr>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-23 19:01:06+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75596); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:14:11+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. +#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. +#: twitterimport.php:113 +#, php-format +msgid "RT @%1$s %2$s" +msgstr "RT @%1$s %2$s" + #: twitter.php:349 msgid "Your Twitter bridge has been disabled." msgstr "Votre passerelle Twitter a été désactivée." @@ -55,7 +62,7 @@ msgstr "" "%3$s" #: TwitterBridgePlugin.php:151 TwitterBridgePlugin.php:174 -#: TwitterBridgePlugin.php:291 twitteradminpanel.php:52 +#: TwitterBridgePlugin.php:302 twitteradminpanel.php:52 msgid "Twitter" msgstr "Twitter" @@ -67,11 +74,11 @@ msgstr "Se connecter ou s’inscrire via Twitter" msgid "Twitter integration options" msgstr "Options d’intégration de Twitter" -#: TwitterBridgePlugin.php:292 +#: TwitterBridgePlugin.php:303 msgid "Twitter bridge configuration" msgstr "Configuration de la passerelle Twitter" -#: TwitterBridgePlugin.php:316 +#: TwitterBridgePlugin.php:327 msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with <a href=\"http://twitter.com/\">Twitter</a>." @@ -399,17 +406,10 @@ msgstr "Impossible de supprimer l’utilisateur Twitter." msgid "Twitter account disconnected." msgstr "Compte Twitter déconnecté." -#: twittersettings.php:283 twittersettings.php:293 +#: twittersettings.php:283 twittersettings.php:294 msgid "Couldn't save Twitter preferences." msgstr "Impossible de sauvegarder les préférences Twitter." -#: twittersettings.php:297 +#: twittersettings.php:302 msgid "Twitter preferences saved." msgstr "Préférences Twitter enregistrées." - -#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. -#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: daemons/twitterstatusfetcher.php:264 -#, php-format -msgid "RT @%1$s %2$s" -msgstr "RT @%1$s %2$s" diff --git a/plugins/TwitterBridge/locale/ia/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/ia/LC_MESSAGES/TwitterBridge.po index c655e8e9c..de5b00c85 100644 --- a/plugins/TwitterBridge/locale/ia/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/ia/LC_MESSAGES/TwitterBridge.po @@ -9,18 +9,25 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:47:52+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:29:18+0000\n" "Language-Team: Interlingua <http://translatewiki.net/wiki/Portal:ia>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-23 19:01:06+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75596); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:14:11+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. +#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. +#: twitterimport.php:113 +#, php-format +msgid "RT @%1$s %2$s" +msgstr "RT @%1$s %2$s" + #: twitter.php:349 msgid "Your Twitter bridge has been disabled." msgstr "Tu ponte a Twitter ha essite disactivate." @@ -53,7 +60,7 @@ msgstr "" "%3$s" #: TwitterBridgePlugin.php:151 TwitterBridgePlugin.php:174 -#: TwitterBridgePlugin.php:291 twitteradminpanel.php:52 +#: TwitterBridgePlugin.php:302 twitteradminpanel.php:52 msgid "Twitter" msgstr "Twitter" @@ -65,11 +72,11 @@ msgstr "Aperir session o crear conto usante Twitter" msgid "Twitter integration options" msgstr "Optiones de integration de Twitter" -#: TwitterBridgePlugin.php:292 +#: TwitterBridgePlugin.php:303 msgid "Twitter bridge configuration" msgstr "Configuration del ponte a Twitter" -#: TwitterBridgePlugin.php:316 +#: TwitterBridgePlugin.php:327 msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with <a href=\"http://twitter.com/\">Twitter</a>." @@ -388,17 +395,10 @@ msgstr "Non poteva remover le usator de Twitter." msgid "Twitter account disconnected." msgstr "Conto de Twitter disconnectite." -#: twittersettings.php:283 twittersettings.php:293 +#: twittersettings.php:283 twittersettings.php:294 msgid "Couldn't save Twitter preferences." msgstr "Non poteva salveguardar le preferentias de Twitter." -#: twittersettings.php:297 +#: twittersettings.php:302 msgid "Twitter preferences saved." msgstr "Preferentias de Twitter salveguardate." - -#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. -#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: daemons/twitterstatusfetcher.php:264 -#, php-format -msgid "RT @%1$s %2$s" -msgstr "RT @%1$s %2$s" diff --git a/plugins/TwitterBridge/locale/mk/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/mk/LC_MESSAGES/TwitterBridge.po index 88f3a2eb2..31f166286 100644 --- a/plugins/TwitterBridge/locale/mk/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/mk/LC_MESSAGES/TwitterBridge.po @@ -9,18 +9,25 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:47:52+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:29:21+0000\n" "Language-Team: Macedonian <http://translatewiki.net/wiki/Portal:mk>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-23 19:01:06+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75596); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:14:11+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n" +#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. +#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. +#: twitterimport.php:113 +#, php-format +msgid "RT @%1$s %2$s" +msgstr "RT @%1$s %2$s" + #: twitter.php:349 msgid "Your Twitter bridge has been disabled." msgstr "Вашиот мост до Twitter е оневозможен." @@ -53,7 +60,7 @@ msgstr "" "%3$s" #: TwitterBridgePlugin.php:151 TwitterBridgePlugin.php:174 -#: TwitterBridgePlugin.php:291 twitteradminpanel.php:52 +#: TwitterBridgePlugin.php:302 twitteradminpanel.php:52 msgid "Twitter" msgstr "Twitter" @@ -65,11 +72,11 @@ msgstr "Најава или регистрација со Twitter" msgid "Twitter integration options" msgstr "Нагодувања за обединување со Twitter" -#: TwitterBridgePlugin.php:292 +#: TwitterBridgePlugin.php:303 msgid "Twitter bridge configuration" msgstr "Нагодувања за мостот до Twitter" -#: TwitterBridgePlugin.php:316 +#: TwitterBridgePlugin.php:327 msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with <a href=\"http://twitter.com/\">Twitter</a>." @@ -391,17 +398,10 @@ msgstr "Не можев да го отстранам корисникот на T msgid "Twitter account disconnected." msgstr "Врската со сметката на Twitter е прекината." -#: twittersettings.php:283 twittersettings.php:293 +#: twittersettings.php:283 twittersettings.php:294 msgid "Couldn't save Twitter preferences." msgstr "Не можев да ги зачувам нагодувањата за Twitter." -#: twittersettings.php:297 +#: twittersettings.php:302 msgid "Twitter preferences saved." msgstr "Нагодувањата за Twitter се зачувани." - -#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. -#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: daemons/twitterstatusfetcher.php:264 -#, php-format -msgid "RT @%1$s %2$s" -msgstr "RT @%1$s %2$s" diff --git a/plugins/TwitterBridge/locale/nl/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/nl/LC_MESSAGES/TwitterBridge.po index 8e152f405..38d1e5472 100644 --- a/plugins/TwitterBridge/locale/nl/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/nl/LC_MESSAGES/TwitterBridge.po @@ -9,18 +9,25 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:47:52+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:29:21+0000\n" "Language-Team: Dutch <http://translatewiki.net/wiki/Portal:nl>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-23 19:01:06+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75596); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:14:11+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. +#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. +#: twitterimport.php:113 +#, php-format +msgid "RT @%1$s %2$s" +msgstr "RT @%1$s %2$s" + #: twitter.php:349 msgid "Your Twitter bridge has been disabled." msgstr "Uw koppeling naar Twitter is uitgeschakeld." @@ -55,7 +62,7 @@ msgstr "" "%3$s" #: TwitterBridgePlugin.php:151 TwitterBridgePlugin.php:174 -#: TwitterBridgePlugin.php:291 twitteradminpanel.php:52 +#: TwitterBridgePlugin.php:302 twitteradminpanel.php:52 msgid "Twitter" msgstr "Twitter" @@ -67,11 +74,11 @@ msgstr "Aanmelden of registreren via Twitter" msgid "Twitter integration options" msgstr "Opties voor Twitterintegratie" -#: TwitterBridgePlugin.php:292 +#: TwitterBridgePlugin.php:303 msgid "Twitter bridge configuration" msgstr "Instellingen voor Twitterkoppeling" -#: TwitterBridgePlugin.php:316 +#: TwitterBridgePlugin.php:327 msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with <a href=\"http://twitter.com/\">Twitter</a>." @@ -398,17 +405,10 @@ msgstr "Het was niet mogelijk de Twittergebruiker te verwijderen." msgid "Twitter account disconnected." msgstr "De Twittergebruiker is ontkoppeld." -#: twittersettings.php:283 twittersettings.php:293 +#: twittersettings.php:283 twittersettings.php:294 msgid "Couldn't save Twitter preferences." msgstr "Het was niet mogelijk de Twittervoorkeuren op te slaan." -#: twittersettings.php:297 +#: twittersettings.php:302 msgid "Twitter preferences saved." msgstr "De Twitterinstellingen zijn opgeslagen." - -#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. -#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: daemons/twitterstatusfetcher.php:264 -#, php-format -msgid "RT @%1$s %2$s" -msgstr "RT @%1$s %2$s" diff --git a/plugins/TwitterBridge/locale/tr/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/tr/LC_MESSAGES/TwitterBridge.po index 76e7e8ecb..3d25b3715 100644 --- a/plugins/TwitterBridge/locale/tr/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/tr/LC_MESSAGES/TwitterBridge.po @@ -9,18 +9,25 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:47:52+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:29:21+0000\n" "Language-Team: Turkish <http://translatewiki.net/wiki/Portal:tr>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-23 19:01:06+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75596); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:14:11+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: tr\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. +#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. +#: twitterimport.php:113 +#, php-format +msgid "RT @%1$s %2$s" +msgstr "" + #: twitter.php:349 msgid "Your Twitter bridge has been disabled." msgstr "" @@ -42,7 +49,7 @@ msgid "" msgstr "" #: TwitterBridgePlugin.php:151 TwitterBridgePlugin.php:174 -#: TwitterBridgePlugin.php:291 twitteradminpanel.php:52 +#: TwitterBridgePlugin.php:302 twitteradminpanel.php:52 msgid "Twitter" msgstr "Twitter" @@ -54,11 +61,11 @@ msgstr "" msgid "Twitter integration options" msgstr "Twitter entegrasyon seçenekleri" -#: TwitterBridgePlugin.php:292 +#: TwitterBridgePlugin.php:303 msgid "Twitter bridge configuration" msgstr "Twitter köprü yapılandırması" -#: TwitterBridgePlugin.php:316 +#: TwitterBridgePlugin.php:327 msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with <a href=\"http://twitter.com/\">Twitter</a>." @@ -372,17 +379,10 @@ msgstr "Twitter kullanıcısı silinemedi." msgid "Twitter account disconnected." msgstr "Twitter hesabı bağlantısı kesildi." -#: twittersettings.php:283 twittersettings.php:293 +#: twittersettings.php:283 twittersettings.php:294 msgid "Couldn't save Twitter preferences." msgstr "Twitter tercihleri kaydedilemedi." -#: twittersettings.php:297 +#: twittersettings.php:302 msgid "Twitter preferences saved." msgstr "Twitter tercihleriniz kaydedildi." - -#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. -#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: daemons/twitterstatusfetcher.php:264 -#, php-format -msgid "RT @%1$s %2$s" -msgstr "" diff --git a/plugins/TwitterBridge/locale/uk/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/uk/LC_MESSAGES/TwitterBridge.po index 2ee15e69b..2eb66a514 100644 --- a/plugins/TwitterBridge/locale/uk/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/uk/LC_MESSAGES/TwitterBridge.po @@ -9,19 +9,26 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:47:52+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:29:21+0000\n" "Language-Team: Ukrainian <http://translatewiki.net/wiki/Portal:uk>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-23 19:01:06+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75596); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:14:11+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\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" +#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. +#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. +#: twitterimport.php:113 +#, php-format +msgid "RT @%1$s %2$s" +msgstr "RT @%1$s %2$s" + #: twitter.php:349 msgid "Your Twitter bridge has been disabled." msgstr "Ваш місток до Twitter було відключено." @@ -55,7 +62,7 @@ msgstr "" "%3$s" #: TwitterBridgePlugin.php:151 TwitterBridgePlugin.php:174 -#: TwitterBridgePlugin.php:291 twitteradminpanel.php:52 +#: TwitterBridgePlugin.php:302 twitteradminpanel.php:52 msgid "Twitter" msgstr "Twitter" @@ -67,11 +74,11 @@ msgstr "Увійти або зареєструватись з Twitter" msgid "Twitter integration options" msgstr "Параметри інтеграції з Twitter" -#: TwitterBridgePlugin.php:292 +#: TwitterBridgePlugin.php:303 msgid "Twitter bridge configuration" msgstr "Налаштування містка з Twitter" -#: TwitterBridgePlugin.php:316 +#: TwitterBridgePlugin.php:327 msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with <a href=\"http://twitter.com/\">Twitter</a>." @@ -394,17 +401,10 @@ msgstr "Не вдається видалити користувача Twitter." msgid "Twitter account disconnected." msgstr "Акаунт Twitter від’єднано." -#: twittersettings.php:283 twittersettings.php:293 +#: twittersettings.php:283 twittersettings.php:294 msgid "Couldn't save Twitter preferences." msgstr "Не можу зберегти налаштування Twitter." -#: twittersettings.php:297 +#: twittersettings.php:302 msgid "Twitter preferences saved." msgstr "Налаштування Twitter збережено." - -#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. -#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: daemons/twitterstatusfetcher.php:264 -#, php-format -msgid "RT @%1$s %2$s" -msgstr "RT @%1$s %2$s" diff --git a/plugins/TwitterBridge/locale/zh_CN/LC_MESSAGES/TwitterBridge.po b/plugins/TwitterBridge/locale/zh_CN/LC_MESSAGES/TwitterBridge.po index 54804a728..9208a4954 100644 --- a/plugins/TwitterBridge/locale/zh_CN/LC_MESSAGES/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/zh_CN/LC_MESSAGES/TwitterBridge.po @@ -9,19 +9,26 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - TwitterBridge\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:47:53+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\n" +"PO-Revision-Date: 2010-11-04 18:29:22+0000\n" "Language-Team: Simplified Chinese <http://translatewiki.net/wiki/Portal:zh-" "hans>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-23 19:01:06+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75596); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-10-29 16:14:11+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76004); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: zh-hans\n" "X-Message-Group: #out-statusnet-plugin-twitterbridge\n" "Plural-Forms: nplurals=1; plural=0;\n" +#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. +#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. +#: twitterimport.php:113 +#, php-format +msgid "RT @%1$s %2$s" +msgstr "RT @%1$s %2$s" + #: twitter.php:349 msgid "Your Twitter bridge has been disabled." msgstr "你的 Twitter bridge 已被禁用。" @@ -52,7 +59,7 @@ msgstr "" "%3$s" #: TwitterBridgePlugin.php:151 TwitterBridgePlugin.php:174 -#: TwitterBridgePlugin.php:291 twitteradminpanel.php:52 +#: TwitterBridgePlugin.php:302 twitteradminpanel.php:52 msgid "Twitter" msgstr "Twitter" @@ -64,11 +71,11 @@ msgstr "使用 Twitter 登录或注册" msgid "Twitter integration options" msgstr "Twitter 整合选项" -#: TwitterBridgePlugin.php:292 +#: TwitterBridgePlugin.php:303 msgid "Twitter bridge configuration" msgstr "Twitter bridge 设置" -#: TwitterBridgePlugin.php:316 +#: TwitterBridgePlugin.php:327 msgid "" "The Twitter \"bridge\" plugin allows integration of a StatusNet instance " "with <a href=\"http://twitter.com/\">Twitter</a>." @@ -376,17 +383,10 @@ msgstr "无法删除 Twitter 用户。" msgid "Twitter account disconnected." msgstr "已取消 Twitter 帐号关联。" -#: twittersettings.php:283 twittersettings.php:293 +#: twittersettings.php:283 twittersettings.php:294 msgid "Couldn't save Twitter preferences." msgstr "无法保存 Twitter 参数设置。" -#: twittersettings.php:297 +#: twittersettings.php:302 msgid "Twitter preferences saved." msgstr "已保存 Twitter 参数设置。" - -#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. -#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: daemons/twitterstatusfetcher.php:264 -#, php-format -msgid "RT @%1$s %2$s" -msgstr "RT @%1$s %2$s" diff --git a/plugins/TwitterBridge/scripts/fakestream.php b/plugins/TwitterBridge/scripts/fakestream.php new file mode 100644 index 000000000..369688816 --- /dev/null +++ b/plugins/TwitterBridge/scripts/fakestream.php @@ -0,0 +1,147 @@ +<?php +/** + * StatusNet, the distributed open-source microblogging tool + * + * PHP version 5 + * + * LICENCE: This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @category Plugin + * @package StatusNet + * @author Brion Vibber <brion@status.net> + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..')); + +$shortoptions = 'n:'; +$longoptions = array('nick=','import','all'); + +$helptext = <<<ENDOFHELP +USAGE: fakestream.php -n <username> + + -n --nick=<username> Local user whose Twitter timeline to watch + --import Experimental: run incoming messages through import + --all Experimental: run multiuser; requires nick be the app owner + +Attempts a User Stream connection to Twitter as the given user, dumping +data as it comes. + +ENDOFHELP; + +require_once INSTALLDIR.'/scripts/commandline.inc'; + +if (have_option('n')) { + $nickname = get_option_value('n'); +} else if (have_option('nick')) { + $nickname = get_option_value('nickname'); +} else if (have_option('all')) { + $nickname = null; +} else { + show_help($helptext); + exit(0); +} + +/** + * + * @param User $user + * @return TwitterOAuthClient + */ +function twitterAuthForUser(User $user) +{ + $flink = Foreign_link::getByUserID($user->id, + TWITTER_SERVICE); + if (!$flink) { + throw new ServerException("No Twitter config for this user."); + } + + $token = TwitterOAuthClient::unpackToken($flink->credentials); + if (!$token) { + throw new ServerException("No Twitter OAuth credentials for this user."); + } + + return new TwitterOAuthClient($token->key, $token->secret); +} + +/** + * Emulate the line-by-line output... + * + * @param Foreign_link $flink + * @param mixed $data + */ +function dumpMessage($flink, $data) +{ + $msg = prepMessage($flink, $data); + print json_encode($msg) . "\r\n"; +} + +function prepMessage($flink, $data) +{ + $msg->for_user = $flink->foreign_id; + $msg->message = $data; + return $msg; +} + +if (have_option('all')) { + $users = array(); + + $flink = new Foreign_link(); + $flink->service = TWITTER_SERVICE; + $flink->find(); + + while ($flink->fetch()) { + if (($flink->noticesync & FOREIGN_NOTICE_RECV) == + FOREIGN_NOTICE_RECV) { + $users[] = $flink->user_id; + } + } +} else { + $user = User::staticGet('nickname', $nickname); + $users = array($user->id); +} + +$output = array(); +foreach ($users as $id) { + $user = User::staticGet('id', $id); + if (!$user) { + throw new Exception("No user for id $id"); + } + $auth = twitterAuthForUser($user); + $flink = Foreign_link::getByUserID($user->id, + TWITTER_SERVICE); + + $friends->friends = $auth->friendsIds(); + dumpMessage($flink, $friends); + + $timeline = $auth->statusesHomeTimeline(); + foreach ($timeline as $status) { + $output[] = prepMessage($flink, $status); + } +} + +usort($output, function($a, $b) { + if ($a->message->id < $b->message->id) { + return -1; + } else if ($a->message->id == $b->message->id) { + return 0; + } else { + return 1; + } +}); + +foreach ($output as $msg) { + print json_encode($msg) . "\r\n"; +} diff --git a/plugins/TwitterBridge/scripts/streamtest.php b/plugins/TwitterBridge/scripts/streamtest.php new file mode 100644 index 000000000..aad15fdea --- /dev/null +++ b/plugins/TwitterBridge/scripts/streamtest.php @@ -0,0 +1,244 @@ +<?php +/** + * StatusNet, the distributed open-source microblogging tool + * + * PHP version 5 + * + * LICENCE: This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @category Plugin + * @package StatusNet + * @author Brion Vibber <brion@status.net> + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..')); + +$shortoptions = 'n:'; +$longoptions = array('nick=','import','all','apiroot='); + +$helptext = <<<ENDOFHELP +USAGE: streamtest.php -n <username> + + -n --nick=<username> Local user whose Twitter timeline to watch + --import Experimental: run incoming messages through import + --all Experimental: run multiuser; requires nick be the app owner + --apiroot=<url> Provide alternate streaming API root URL + +Attempts a User Stream connection to Twitter as the given user, dumping +data as it comes. + +ENDOFHELP; + +require_once INSTALLDIR.'/scripts/commandline.inc'; +require_once dirname(dirname(__FILE__)) . '/jsonstreamreader.php'; +require_once dirname(dirname(__FILE__)) . '/twitterstreamreader.php'; + +if (have_option('n')) { + $nickname = get_option_value('n'); +} else if (have_option('nick')) { + $nickname = get_option_value('nickname'); +} else { + show_help($helptext); + exit(0); +} + +/** + * + * @param User $user + * @return TwitterOAuthClient + */ +function twitterAuthForUser(User $user) +{ + $flink = Foreign_link::getByUserID($user->id, + TWITTER_SERVICE); + if (!$flink) { + throw new ServerException("No Twitter config for this user."); + } + + $token = TwitterOAuthClient::unpackToken($flink->credentials); + if (!$token) { + throw new ServerException("No Twitter OAuth credentials for this user."); + } + + return new TwitterOAuthClient($token->key, $token->secret); +} + +function homeStreamForUser(User $user) +{ + $auth = twitterAuthForUser($user); + return new TwitterUserStream($auth); +} + +function siteStreamForOwner(User $user) +{ + // The user we auth as must be the owner of the application. + $auth = twitterAuthForUser($user); + + if (have_option('apiroot')) { + $stream = new TwitterSiteStream($auth, get_option_value('apiroot')); + } else { + $stream = new TwitterSiteStream($auth); + } + + // Pull Twitter user IDs for all users we want to pull data for + $userIds = array(); + + $flink = new Foreign_link(); + $flink->service = TWITTER_SERVICE; + $flink->find(); + + while ($flink->fetch()) { + if (($flink->noticesync & FOREIGN_NOTICE_RECV) == + FOREIGN_NOTICE_RECV) { + $userIds[] = $flink->foreign_id; + } + } + + $stream->followUsers($userIds); + return $stream; +} + + +$user = User::staticGet('nickname', $nickname); +global $myuser; +$myuser = $user; + +if (have_option('all')) { + $stream = siteStreamForOwner($user); +} else { + $stream = homeStreamForUser($user); +} + + +$stream->hookEvent('raw', function($data, $context) { + common_log(LOG_INFO, json_encode($data) . ' for ' . json_encode($context)); +}); +$stream->hookEvent('friends', function($data, $context) { + printf("Friend list: %s\n", implode(', ', $data->friends)); +}); +$stream->hookEvent('favorite', function($data, $context) { + printf("%s favorited %s's notice: %s\n", + $data->source->screen_name, + $data->target->screen_name, + $data->target_object->text); +}); +$stream->hookEvent('unfavorite', function($data, $context) { + printf("%s unfavorited %s's notice: %s\n", + $data->source->screen_name, + $data->target->screen_name, + $data->target_object->text); +}); +$stream->hookEvent('follow', function($data, $context) { + printf("%s friended %s\n", + $data->source->screen_name, + $data->target->screen_name); +}); +$stream->hookEvent('unfollow', function($data, $context) { + printf("%s unfriended %s\n", + $data->source->screen_name, + $data->target->screen_name); +}); +$stream->hookEvent('delete', function($data, $context) { + printf("Deleted status notification: %s\n", + $data->status->id); +}); +$stream->hookEvent('scrub_geo', function($data, $context) { + printf("Req to scrub geo data for user id %s up to status ID %s\n", + $data->user_id, + $data->up_to_status_id); +}); +$stream->hookEvent('status', function($data, $context) { + printf("Received status update from %s: %s\n", + $data->user->screen_name, + $data->text); + + if (have_option('import')) { + $importer = new TwitterImport(); + printf("\timporting..."); + $notice = $importer->importStatus($data); + if ($notice) { + global $myuser; + Inbox::insertNotice($myuser->id, $notice->id); + printf(" %s\n", $notice->id); + } else { + printf(" FAIL\n"); + } + } +}); +$stream->hookEvent('direct_message', function($data) { + printf("Direct message from %s to %s: %s\n", + $data->sender->screen_name, + $data->recipient->screen_name, + $data->text); +}); + +class TwitterManager extends IoManager +{ + function __construct(TwitterStreamReader $stream) + { + $this->stream = $stream; + } + + function getSockets() + { + return $this->stream->getSockets(); + } + + function handleInput($data) + { + $this->stream->handleInput($data); + return true; + } + + function start() + { + $this->stream->connect(); + return true; + } + + function finish() + { + $this->stream->close(); + return true; + } + + public static function get() + { + throw new Exception('not a singleton'); + } +} + +class TwitterStreamMaster extends IoMaster +{ + function __construct($id, $ioManager) + { + parent::__construct($id); + $this->ioManager = $ioManager; + } + + /** + * Initialize IoManagers which are appropriate to this instance. + */ + function initManagers() + { + $this->instantiate($this->ioManager); + } +} + +$master = new TwitterStreamMaster('TwitterStream', new TwitterManager($stream)); +$master->init(); +$master->service(); diff --git a/plugins/TwitterBridge/tweetctlqueuehandler.php b/plugins/TwitterBridge/tweetctlqueuehandler.php new file mode 100644 index 000000000..4c8bef463 --- /dev/null +++ b/plugins/TwitterBridge/tweetctlqueuehandler.php @@ -0,0 +1,59 @@ +<?php +/* + * StatusNet - the distributed open-source microblogging tool + * Copyright (C) 2010, StatusNet, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php'; + +/** + * Queue handler to deal with incoming Twitter status updates, as retrieved by + * TwitterDaemon (twitterdaemon.php). + * + * The queue handler passes the status through TwitterImporter for import into the + * local database (if necessary), then adds the imported notice to the local inbox + * of the attached Twitter user. + * + * Warning: the way we do inbox distribution manually means that realtime, XMPP, etc + * don't work on Twitter-borne messages. When TwitterImporter is changed to handle + * that correctly, we'll only need to do this once...? + */ +class TweetCtlQueueHandler extends QueueHandler +{ + function transport() + { + return 'tweetctl'; + } + + function handle($data) + { + // A user has activated or deactivated their Twitter bridge + // import status. + $action = $data['action']; + $userId = $data['for_user']; + + $tm = TwitterManager::get(); + if ($action == 'start') { + $tm->startTwitterUser($userId); + } else if ($action == 'stop') { + $tm->stopTwitterUser($userId); + } + + return true; + } +} diff --git a/plugins/TwitterBridge/tweetinqueuehandler.php b/plugins/TwitterBridge/tweetinqueuehandler.php new file mode 100644 index 000000000..ff6b2cc86 --- /dev/null +++ b/plugins/TwitterBridge/tweetinqueuehandler.php @@ -0,0 +1,63 @@ +<?php +/* + * StatusNet - the distributed open-source microblogging tool + * Copyright (C) 2010, StatusNet, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php'; + +/** + * Queue handler to deal with incoming Twitter status updates, as retrieved by + * TwitterDaemon (twitterdaemon.php). + * + * The queue handler passes the status through TwitterImporter for import into the + * local database (if necessary), then adds the imported notice to the local inbox + * of the attached Twitter user. + * + * Warning: the way we do inbox distribution manually means that realtime, XMPP, etc + * don't work on Twitter-borne messages. When TwitterImporter is changed to handle + * that correctly, we'll only need to do this once...? + */ +class TweetInQueueHandler extends QueueHandler +{ + function transport() + { + return 'tweetin'; + } + + function handle($data) + { + // JSON object with Twitter data + $status = $data['status']; + + // Twitter user ID this incoming data belongs to. + $receiver = $data['for_user']; + + $importer = new TwitterImport(); + $notice = $importer->importStatus($status); + if ($notice) { + $flink = Foreign_link::getByForeignID(TWITTER_SERVICE, $receiver); + if ($flink) { + // @fixme this should go through more regular channels? + Inbox::insertNotice($flink->user_id, $notice->id); + } + } + + return true; + } +} diff --git a/plugins/TwitterBridge/twitterimport.php b/plugins/TwitterBridge/twitterimport.php new file mode 100644 index 000000000..07a9cf95f --- /dev/null +++ b/plugins/TwitterBridge/twitterimport.php @@ -0,0 +1,651 @@ +<?php +/** + * StatusNet, the distributed open-source microblogging tool + * + * PHP version 5 + * + * LICENCE: This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @category Plugin + * @package StatusNet + * @author Zach Copley <zach@status.net> + * @author Julien C <chaumond@gmail.com> + * @author Brion Vibber <brion@status.net> + * @copyright 2009-2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php'; + +/** + * Encapsulation of the Twitter status -> notice incoming bridge import. + * Is used by both the polling twitterstatusfetcher.php daemon, and the + * in-progress streaming import. + * + * @category Plugin + * @package StatusNet + * @author Zach Copley <zach@status.net> + * @author Julien C <chaumond@gmail.com> + * @author Brion Vibber <brion@status.net> + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + * @link http://twitter.com/ + */ +class TwitterImport +{ + public function importStatus($status) + { + // Hacktastic: filter out stuff coming from this StatusNet + $source = mb_strtolower(common_config('integration', 'source')); + + if (preg_match("/$source/", mb_strtolower($status->source))) { + common_debug($this->name() . ' - Skipping import of status ' . + $status->id . ' with source ' . $source); + return null; + } + + // Don't save it if the user is protected + // FIXME: save it but treat it as private + if ($status->user->protected) { + return null; + } + + $notice = $this->saveStatus($status); + + return $notice; + } + + function name() + { + return get_class($this); + } + + function saveStatus($status) + { + $profile = $this->ensureProfile($status->user); + + if (empty($profile)) { + common_log(LOG_ERR, $this->name() . + ' - Problem saving notice. No associated Profile.'); + return null; + } + + $statusUri = $this->makeStatusURI($status->user->screen_name, $status->id); + + // check to see if we've already imported the status + $n2s = Notice_to_status::staticGet('status_id', $status->id); + + if (!empty($n2s)) { + common_log( + LOG_INFO, + $this->name() . + " - Ignoring duplicate import: {$status->id}" + ); + return Notice::staticGet('id', $n2s->notice_id); + } + + // If it's a retweet, save it as a repeat! + if (!empty($status->retweeted_status)) { + common_log(LOG_INFO, "Status {$status->id} is a retweet of {$status->retweeted_status->id}."); + $original = $this->saveStatus($status->retweeted_status); + if (empty($original)) { + return null; + } else { + $author = $original->getProfile(); + // TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. + // TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. + $content = sprintf(_m('RT @%1$s %2$s'), + $author->nickname, + $original->content); + + if (Notice::contentTooLong($content)) { + $contentlimit = Notice::maxContent(); + $content = mb_substr($content, 0, $contentlimit - 4) . ' ...'; + } + + $repeat = Notice::saveNew($profile->id, + $content, + 'twitter', + array('repeat_of' => $original->id, + 'uri' => $statusUri, + 'is_local' => Notice::GATEWAY)); + common_log(LOG_INFO, "Saved {$repeat->id} as a repeat of {$original->id}"); + Notice_to_status::saveNew($repeat->id, $status->id); + return $repeat; + } + } + + $notice = new Notice(); + + $notice->profile_id = $profile->id; + $notice->uri = $statusUri; + $notice->url = $statusUri; + $notice->created = strftime( + '%Y-%m-%d %H:%M:%S', + strtotime($status->created_at) + ); + + $notice->source = 'twitter'; + + $notice->reply_to = null; + + if (!empty($status->in_reply_to_status_id)) { + common_log(LOG_INFO, "Status {$status->id} is a reply to status {$status->in_reply_to_status_id}"); + $n2s = Notice_to_status::staticGet('status_id', $status->in_reply_to_status_id); + if (empty($n2s)) { + common_log(LOG_INFO, "Couldn't find local notice for status {$status->in_reply_to_status_id}"); + } else { + $reply = Notice::staticGet('id', $n2s->notice_id); + if (empty($reply)) { + common_log(LOG_INFO, "Couldn't find local notice for status {$status->in_reply_to_status_id}"); + } else { + common_log(LOG_INFO, "Found local notice {$reply->id} for status {$status->in_reply_to_status_id}"); + $notice->reply_to = $reply->id; + $notice->conversation = $reply->conversation; + } + } + } + + if (empty($notice->conversation)) { + $conv = Conversation::create(); + $notice->conversation = $conv->id; + common_log(LOG_INFO, "No known conversation for status {$status->id} so making a new one {$conv->id}."); + } + + $notice->is_local = Notice::GATEWAY; + + $notice->content = html_entity_decode($status->text, ENT_QUOTES, 'UTF-8'); + $notice->rendered = $this->linkify($status); + + if (Event::handle('StartNoticeSave', array(&$notice))) { + + $id = $notice->insert(); + + if (!$id) { + common_log_db_error($notice, 'INSERT', __FILE__); + common_log(LOG_ERR, $this->name() . + ' - Problem saving notice.'); + } + + Event::handle('EndNoticeSave', array($notice)); + } + + Notice_to_status::saveNew($notice->id, $status->id); + + $this->saveStatusMentions($notice, $status); + + $notice->blowOnInsert(); + + return $notice; + } + + /** + * Make an URI for a status. + * + * @param object $status status object + * + * @return string URI + */ + function makeStatusURI($username, $id) + { + return 'http://twitter.com/' + . $username + . '/status/' + . $id; + } + + + /** + * Look up a Profile by profileurl field. Profile::staticGet() was + * not working consistently. + * + * @param string $nickname local nickname of the Twitter user + * @param string $profileurl the profile url + * + * @return mixed value the first Profile with that url, or null + */ + function getProfileByUrl($nickname, $profileurl) + { + $profile = new Profile(); + $profile->nickname = $nickname; + $profile->profileurl = $profileurl; + $profile->limit(1); + + if ($profile->find()) { + $profile->fetch(); + return $profile; + } + + return null; + } + + /** + * Check to see if this Twitter status has already been imported + * + * @param Profile $profile Twitter user's local profile + * @param string $statusUri URI of the status on Twitter + * + * @return mixed value a matching Notice or null + */ + function checkDupe($profile, $statusUri) + { + $notice = new Notice(); + $notice->uri = $statusUri; + $notice->profile_id = $profile->id; + $notice->limit(1); + + if ($notice->find()) { + $notice->fetch(); + return $notice; + } + + return null; + } + + function ensureProfile($user) + { + // check to see if there's already a profile for this user + $profileurl = 'http://twitter.com/' . $user->screen_name; + $profile = $this->getProfileByUrl($user->screen_name, $profileurl); + + if (!empty($profile)) { + common_debug($this->name() . + " - Profile for $profile->nickname found."); + + // Check to see if the user's Avatar has changed + + $this->checkAvatar($user, $profile); + return $profile; + + } else { + common_debug($this->name() . ' - Adding profile and remote profile ' . + "for Twitter user: $profileurl."); + + $profile = new Profile(); + $profile->query("BEGIN"); + + $profile->nickname = $user->screen_name; + $profile->fullname = $user->name; + $profile->homepage = $user->url; + $profile->bio = $user->description; + $profile->location = $user->location; + $profile->profileurl = $profileurl; + $profile->created = common_sql_now(); + + try { + $id = $profile->insert(); + } catch(Exception $e) { + common_log(LOG_WARNING, $this->name() . ' Couldn\'t insert profile - ' . $e->getMessage()); + } + + if (empty($id)) { + common_log_db_error($profile, 'INSERT', __FILE__); + $profile->query("ROLLBACK"); + return false; + } + + // check for remote profile + + $remote_pro = Remote_profile::staticGet('uri', $profileurl); + + if (empty($remote_pro)) { + $remote_pro = new Remote_profile(); + + $remote_pro->id = $id; + $remote_pro->uri = $profileurl; + $remote_pro->created = common_sql_now(); + + try { + $rid = $remote_pro->insert(); + } catch (Exception $e) { + common_log(LOG_WARNING, $this->name() . ' Couldn\'t save remote profile - ' . $e->getMessage()); + } + + if (empty($rid)) { + common_log_db_error($profile, 'INSERT', __FILE__); + $profile->query("ROLLBACK"); + return false; + } + } + + $profile->query("COMMIT"); + + $this->saveAvatars($user, $id); + + return $profile; + } + } + + function checkAvatar($twitter_user, $profile) + { + global $config; + + $path_parts = pathinfo($twitter_user->profile_image_url); + + $newname = 'Twitter_' . $twitter_user->id . '_' . + $path_parts['basename']; + + $oldname = $profile->getAvatar(48)->filename; + + if ($newname != $oldname) { + common_debug($this->name() . ' - Avatar for Twitter user ' . + "$profile->nickname has changed."); + common_debug($this->name() . " - old: $oldname new: $newname"); + + $this->updateAvatars($twitter_user, $profile); + } + + if ($this->missingAvatarFile($profile)) { + common_debug($this->name() . ' - Twitter user ' . + $profile->nickname . + ' is missing one or more local avatars.'); + common_debug($this->name() ." - old: $oldname new: $newname"); + + $this->updateAvatars($twitter_user, $profile); + } + } + + function updateAvatars($twitter_user, $profile) { + + global $config; + + $path_parts = pathinfo($twitter_user->profile_image_url); + + $img_root = substr($path_parts['basename'], 0, -11); + $ext = $path_parts['extension']; + $mediatype = $this->getMediatype($ext); + + foreach (array('mini', 'normal', 'bigger') as $size) { + $url = $path_parts['dirname'] . '/' . + $img_root . '_' . $size . ".$ext"; + $filename = 'Twitter_' . $twitter_user->id . '_' . + $img_root . "_$size.$ext"; + + $this->updateAvatar($profile->id, $size, $mediatype, $filename); + $this->fetchAvatar($url, $filename); + } + } + + function missingAvatarFile($profile) { + foreach (array(24, 48, 73) as $size) { + $filename = $profile->getAvatar($size)->filename; + $avatarpath = Avatar::path($filename); + if (file_exists($avatarpath) == FALSE) { + return true; + } + } + return false; + } + + function getMediatype($ext) + { + $mediatype = null; + + switch (strtolower($ext)) { + case 'jpg': + $mediatype = 'image/jpg'; + break; + case 'gif': + $mediatype = 'image/gif'; + break; + default: + $mediatype = 'image/png'; + } + + return $mediatype; + } + + function saveAvatars($user, $id) + { + global $config; + + $path_parts = pathinfo($user->profile_image_url); + $ext = $path_parts['extension']; + $end = strlen('_normal' . $ext); + $img_root = substr($path_parts['basename'], 0, -($end+1)); + $mediatype = $this->getMediatype($ext); + + foreach (array('mini', 'normal', 'bigger') as $size) { + $url = $path_parts['dirname'] . '/' . + $img_root . '_' . $size . ".$ext"; + $filename = 'Twitter_' . $user->id . '_' . + $img_root . "_$size.$ext"; + + if ($this->fetchAvatar($url, $filename)) { + $this->newAvatar($id, $size, $mediatype, $filename); + } else { + common_log(LOG_WARNING, $id() . + " - Problem fetching Avatar: $url"); + } + } + } + + function updateAvatar($profile_id, $size, $mediatype, $filename) { + + common_debug($this->name() . " - Updating avatar: $size"); + + $profile = Profile::staticGet($profile_id); + + if (empty($profile)) { + common_debug($this->name() . " - Couldn't get profile: $profile_id!"); + return; + } + + $sizes = array('mini' => 24, 'normal' => 48, 'bigger' => 73); + $avatar = $profile->getAvatar($sizes[$size]); + + // Delete the avatar, if present + if ($avatar) { + $avatar->delete(); + } + + $this->newAvatar($profile->id, $size, $mediatype, $filename); + } + + function newAvatar($profile_id, $size, $mediatype, $filename) + { + global $config; + + $avatar = new Avatar(); + $avatar->profile_id = $profile_id; + + switch($size) { + case 'mini': + $avatar->width = 24; + $avatar->height = 24; + break; + case 'normal': + $avatar->width = 48; + $avatar->height = 48; + break; + default: + // Note: Twitter's big avatars are a different size than + // StatusNet's (StatusNet's = 96) + $avatar->width = 73; + $avatar->height = 73; + } + + $avatar->original = 0; // we don't have the original + $avatar->mediatype = $mediatype; + $avatar->filename = $filename; + $avatar->url = Avatar::url($filename); + + $avatar->created = common_sql_now(); + + try { + $id = $avatar->insert(); + } catch (Exception $e) { + common_log(LOG_WARNING, $this->name() . ' Couldn\'t insert avatar - ' . $e->getMessage()); + } + + if (empty($id)) { + common_log_db_error($avatar, 'INSERT', __FILE__); + return null; + } + + common_debug($this->name() . + " - Saved new $size avatar for $profile_id."); + + return $id; + } + + /** + * Fetch a remote avatar image and save to local storage. + * + * @param string $url avatar source URL + * @param string $filename bare local filename for download + * @return bool true on success, false on failure + */ + function fetchAvatar($url, $filename) + { + common_debug($this->name() . " - Fetching Twitter avatar: $url"); + + $request = HTTPClient::start(); + $response = $request->get($url); + if ($response->isOk()) { + $avatarfile = Avatar::path($filename); + $ok = file_put_contents($avatarfile, $response->getBody()); + if (!$ok) { + common_log(LOG_WARNING, $this->name() . + " - Couldn't open file $filename"); + return false; + } + } else { + return false; + } + + return true; + } + + const URL = 1; + const HASHTAG = 2; + const MENTION = 3; + + function linkify($status) + { + $text = $status->text; + + if (empty($status->entities)) { + common_log(LOG_WARNING, "No entities data for {$status->id}; trying to fake up links ourselves."); + $text = common_replace_urls_callback($text, 'common_linkify'); + $text = preg_replace('/(^|\"\;|\'|\(|\[|\{|\s+)#([\pL\pN_\-\.]{1,64})/e', "'\\1#'.TwitterStatusFetcher::tagLink('\\2')", $text); + $text = preg_replace('/(^|\s+)@([a-z0-9A-Z_]{1,64})/e', "'\\1@'.TwitterStatusFetcher::atLink('\\2')", $text); + return $text; + } + + // Move all the entities into order so we can + // replace them in reverse order and thus + // not mess up their indices + + $toReplace = array(); + + if (!empty($status->entities->urls)) { + foreach ($status->entities->urls as $url) { + $toReplace[$url->indices[0]] = array(self::URL, $url); + } + } + + if (!empty($status->entities->hashtags)) { + foreach ($status->entities->hashtags as $hashtag) { + $toReplace[$hashtag->indices[0]] = array(self::HASHTAG, $hashtag); + } + } + + if (!empty($status->entities->user_mentions)) { + foreach ($status->entities->user_mentions as $mention) { + $toReplace[$mention->indices[0]] = array(self::MENTION, $mention); + } + } + + // sort in reverse order by key + + krsort($toReplace); + + foreach ($toReplace as $part) { + list($type, $object) = $part; + switch($type) { + case self::URL: + $linkText = $this->makeUrlLink($object); + break; + case self::HASHTAG: + $linkText = $this->makeHashtagLink($object); + break; + case self::MENTION: + $linkText = $this->makeMentionLink($object); + break; + default: + continue; + } + $text = mb_substr($text, 0, $object->indices[0]) . $linkText . mb_substr($text, $object->indices[1]); + } + return $text; + } + + function makeUrlLink($object) + { + return "<a href='{$object->url}' class='extlink'>{$object->url}</a>"; + } + + function makeHashtagLink($object) + { + return "#" . self::tagLink($object->text); + } + + function makeMentionLink($object) + { + return "@".self::atLink($object->screen_name, $object->name); + } + + static function tagLink($tag) + { + return "<a href='https://twitter.com/search?q=%23{$tag}' class='hashtag'>{$tag}</a>"; + } + + static function atLink($screenName, $fullName=null) + { + if (!empty($fullName)) { + return "<a href='http://twitter.com/{$screenName}' title='{$fullName}'>{$screenName}</a>"; + } else { + return "<a href='http://twitter.com/{$screenName}'>{$screenName}</a>"; + } + } + + function saveStatusMentions($notice, $status) + { + $mentions = array(); + + if (empty($status->entities) || empty($status->entities->user_mentions)) { + return; + } + + foreach ($status->entities->user_mentions as $mention) { + $flink = Foreign_link::getByForeignID($mention->id, TWITTER_SERVICE); + if (!empty($flink)) { + $user = User::staticGet('id', $flink->user_id); + if (!empty($user)) { + $reply = new Reply(); + $reply->notice_id = $notice->id; + $reply->profile_id = $user->id; + common_log(LOG_INFO, __METHOD__ . ": saving reply: notice {$notice->id} to profile {$user->id}"); + $id = $reply->insert(); + } + } + } + } +}
\ No newline at end of file diff --git a/plugins/TwitterBridge/twittersettings.php b/plugins/TwitterBridge/twittersettings.php index 33c5eb65b..c169172b0 100644 --- a/plugins/TwitterBridge/twittersettings.php +++ b/plugins/TwitterBridge/twittersettings.php @@ -285,6 +285,7 @@ class TwittersettingsAction extends ConnectSettingsAction } $original = clone($flink); + $wasReceiving = (bool)($original->noticesync & FOREIGN_NOTICE_RECV); $flink->set_flags($noticesend, $noticerecv, $replysync, $friendsync); $result = $flink->update($original); @@ -294,6 +295,19 @@ class TwittersettingsAction extends ConnectSettingsAction return; } + if ($wasReceiving xor $noticerecv) { + $this->notifyDaemon($flink->foreign_id, $noticerecv); + } + $this->showForm(_m('Twitter preferences saved.'), true); } + + /** + * Tell the import daemon that we've updated a user's receive status. + */ + function notifyDaemon($twitterUserId, $receiving) + { + // todo... should use control signals rather than queues + } + } diff --git a/plugins/TwitterBridge/twitterstreamreader.php b/plugins/TwitterBridge/twitterstreamreader.php new file mode 100644 index 000000000..5b0613bc4 --- /dev/null +++ b/plugins/TwitterBridge/twitterstreamreader.php @@ -0,0 +1,285 @@ +<?php +/** + * StatusNet, the distributed open-source microblogging tool + * + * PHP version 5 + * + * LICENCE: This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @category Plugin + * @package StatusNet + * @author Brion Vibber <brion@status.net> + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +/** + * Base class for reading Twitter's User Streams and Site Streams + * real-time streaming APIs. + * + * Caller can hook event callbacks for various types of messages; + * the data from the stream and some context info will be passed + * on to the callbacks. + */ +abstract class TwitterStreamReader extends JsonStreamReader +{ + protected $callbacks = array(); + + function __construct(TwitterOAuthClient $auth, $baseUrl) + { + $this->baseUrl = $baseUrl; + $this->oauth = $auth; + } + + public function connect($method, $params=array()) + { + $url = $this->oAuthUrl($this->baseUrl . '/' . $method, $params); + return parent::connect($url); + } + + /** + * Sign our target URL with OAuth auth stuff. + * + * @param string $url + * @param array $params + * @return string + */ + protected function oAuthUrl($url, $params=array()) + { + // In an ideal world this would be better encapsulated. :) + $request = OAuthRequest::from_consumer_and_token($this->oauth->consumer, + $this->oauth->token, 'GET', $url, $params); + $request->sign_request($this->oauth->sha1_method, + $this->oauth->consumer, $this->oauth->token); + + return $request->to_url(); + } + + /** + * Add an event callback to receive notifications when things come in + * over the wire. + * + * Callbacks should be in the form: function(object $data, array $context) + * where $context may list additional data on some streams, such as the + * user to whom the message should be routed. + * + * Available events: + * + * Messaging: + * + * 'status': $data contains a status update in standard Twitter JSON format. + * $data->user: sending user in standard Twitter JSON format. + * $data->text... etc + * + * 'direct_message': $data contains a direct message in standard Twitter JSON format. + * $data->sender: sending user in standard Twitter JSON format. + * $data->recipient: receiving user in standard Twitter JSON format. + * $data->text... etc + * + * + * Out of band events: + * + * 'follow': User has either started following someone, or is being followed. + * $data->source: following user in standard Twitter JSON format. + * $data->target: followed user in standard Twitter JSON format. + * + * 'favorite': Someone has favorited a status update. + * $data->source: user doing the favoriting, in standard Twitter JSON format. + * $data->target: user whose status was favorited, in standard Twitter JSON format. + * $data->target_object: the favorited status update in standard Twitter JSON format. + * + * 'unfavorite': Someone has unfavorited a status update. + * $data->source: user doing the unfavoriting, in standard Twitter JSON format. + * $data->target: user whose status was unfavorited, in standard Twitter JSON format. + * $data->target_object: the unfavorited status update in standard Twitter JSON format. + * + * + * Meta information: + * + * 'friends': + * $data->friends: array of user IDs of the current user's friends. + * + * 'delete': Advisory that a Twitter status has been deleted; nice clients + * should follow suit. + * $data->id: ID of status being deleted + * $data->user_id: ID of its owning user + * + * 'scrub_geo': Advisory that a user is clearing geo data from their status + * stream; nice clients should follow suit. + * $data->user_id: ID of user + * $data->up_to_status_id: any notice older than this should be scrubbed. + * + * 'limit': Advisory that tracking has hit a resource limit. + * $data->track + * + * 'raw': receives the full JSON data for all message types. + * + * @param string $event + * @param callable $callback + */ + public function hookEvent($event, $callback) + { + $this->callbacks[$event][] = $callback; + } + + /** + * Call event handler callbacks for the given event. + * + * @param string $event + * @param mixed $arg1 ... one or more params to pass on + */ + protected function fireEvent($event, $arg1) + { + if (array_key_exists($event, $this->callbacks)) { + $args = array_slice(func_get_args(), 1); + foreach ($this->callbacks[$event] as $callback) { + call_user_func_array($callback, $args); + } + } + } + + protected function handleJson(stdClass $data) + { + $this->routeMessage($data); + } + + abstract protected function routeMessage(stdClass $data); + + /** + * Send the decoded JSON object out to any event listeners. + * + * @param array $data + * @param array $context optional additional context data to pass on + */ + protected function handleMessage(stdClass $data, array $context=array()) + { + $this->fireEvent('raw', $data, $context); + + if (isset($data->text)) { + $this->fireEvent('status', $data, $context); + return; + } + if (isset($data->event)) { + $this->fireEvent($data->event, $data, $context); + return; + } + if (isset($data->friends)) { + $this->fireEvent('friends', $data, $context); + } + + $knownMeta = array('delete', 'scrub_geo', 'limit', 'direct_message'); + foreach ($knownMeta as $key) { + if (isset($data->$key)) { + $this->fireEvent($key, $data->$key, $context); + return; + } + } + } +} + +/** + * Multiuser stream listener for Twitter Site Streams API + * http://dev.twitter.com/pages/site_streams + * + * The site streams API allows listening to updates for multiple users. + * Pass in the user IDs to listen to in via followUser() -- note they + * must each have a valid OAuth token for the application ID we're + * connecting as. + * + * You'll need to be connecting with the auth keys for the user who + * owns the application registration. + * + * The user each message is destined for will be passed to event handlers + * in $context['for_user_id']. + */ +class TwitterSiteStream extends TwitterStreamReader +{ + protected $userIds; + + public function __construct(TwitterOAuthClient $auth, $baseUrl='http://betastream.twitter.com') + { + parent::__construct($auth, $baseUrl); + } + + public function connect($method='2b/site.json') + { + $params = array(); + if ($this->userIds) { + $params['follow'] = implode(',', $this->userIds); + } + return parent::connect($method, $params); + } + + /** + * Set the users whose home streams should be pulled. + * They all must have valid oauth tokens for this application. + * + * Must be called before connect(). + * + * @param array $userIds + */ + function followUsers($userIds) + { + $this->userIds = $userIds; + } + + /** + * Each message in the site stream tells us which user ID it should be + * routed to; we'll need that to let the caller know what to do. + * + * @param array $data + */ + function routeMessage(stdClass $data) + { + $context = array( + 'source' => 'sitestream', + 'for_user' => $data->for_user + ); + parent::handleMessage($data->message, $context); + } +} + +/** + * Stream listener for Twitter User Streams API + * http://dev.twitter.com/pages/user_streams + * + * This will pull the home stream and additional events just for the user + * we've authenticated as. + */ +class TwitterUserStream extends TwitterStreamReader +{ + public function __construct(TwitterOAuthClient $auth, $baseUrl='https://userstream.twitter.com') + { + parent::__construct($auth, $baseUrl); + } + + public function connect($method='2/user.json') + { + return parent::connect($method); + } + + /** + * Each message in the user stream is just ready to go. + * + * @param array $data + */ + function routeMessage(stdClass $data) + { + $context = array( + 'source' => 'userstream' + ); + parent::handleMessage($data, $context); + } +} diff --git a/plugins/UserFlag/UserFlagPlugin.php b/plugins/UserFlag/UserFlagPlugin.php index e6ad3e37d..fc7698841 100644 --- a/plugins/UserFlag/UserFlagPlugin.php +++ b/plugins/UserFlag/UserFlagPlugin.php @@ -128,25 +128,9 @@ class UserFlagPlugin extends Plugin */ function onEndProfilePageActionsElements(&$action, $profile) { - $user = common_current_user(); - - if (!empty($user) && ($user->id != $profile->id)) { - - $action->elementStart('li', 'entity_flag'); - - if (User_flag_profile::exists($profile->id, $user->id)) { - // @todo FIXME: Add a title explaining what 'flagged' means? - // TRANS: Message added to a profile if it has been flagged for review. - $action->element('p', 'flagged', _('Flagged')); - } else { - $form = new FlagProfileForm($action, $profile, - array('action' => 'showstream', - 'nickname' => $profile->nickname)); - $form->show(); - } - - $action->elementEnd('li'); - } + $this->showFlagButton($action, $profile, + array('action' => 'showstream', + 'nickname' => $profile->nickname)); return true; } @@ -160,22 +144,40 @@ class UserFlagPlugin extends Plugin */ function onEndProfileListItemActionElements($item) { - $user = common_current_user(); + list($action, $args) = $item->action->returnToArgs(); + $args['action'] = $action; + $this->showFlagButton($item->action, $item->profile, $args); + + return true; + } - if (!empty($user)) { + /** + * Actually output a flag button. If the target profile has already been + * flagged by the current user, a null-action faux button is shown. + * + * @param Action $action + * @param Profile $profile + * @param array $returnToArgs + */ + protected function showFlagButton($action, $profile, $returnToArgs) + { + $user = common_current_user(); - list($action, $args) = $item->action->returnToArgs(); + if (!empty($user) && ($user->id != $profile->id)) { - $args['action'] = $action; + $action->elementStart('li', 'entity_flag'); - $form = new FlagProfileForm($item->action, $item->profile, $args); + if (User_flag_profile::exists($profile->id, $user->id)) { + // @todo FIXME: Add a title explaining what 'flagged' means? + // TRANS: Message added to a profile if it has been flagged for review. + $action->element('p', 'flagged', _m('Flagged')); + } else { + $form = new FlagProfileForm($action, $profile, $returnToArgs); + $form->show(); + } - $item->action->elementStart('li', 'entity_flag'); - $form->show(); - $item->action->elementEnd('li'); + $action->elementEnd('li'); } - - return true; } /** diff --git a/plugins/UserFlag/User_flag_profile.php b/plugins/UserFlag/User_flag_profile.php index 69fe0f356..f4e9844df 100644 --- a/plugins/UserFlag/User_flag_profile.php +++ b/plugins/UserFlag/User_flag_profile.php @@ -79,21 +79,36 @@ class User_flag_profile extends Memcached_DataObject /** * return key definitions for DB_DataObject * - * @return array key definitions + * @return array of key names */ function keys() { - return array('profile_id' => 'K', 'user_id' => 'K'); + return array_keys($this->keyTypes()); } /** * return key definitions for DB_DataObject * - * @return array key definitions + * @return array map of key definitions */ function keyTypes() { - return $this->keys(); + return array('profile_id' => 'K', 'user_id' => 'K'); + } + + /** + * Magic formula for non-autoincrementing integer primary keys + * + * If a table has a single integer column as its primary key, DB_DataObject + * assumes that the column is auto-incrementing and makes a sequence table + * to do this incrementation. Since we don't need this for our class, we + * overload this method and return the magic formula that DB_DataObject needs. + * + * @return array magic three-false array that stops auto-incrementing. + */ + function sequenceKey() + { + return array(false, false, false); } /** diff --git a/plugins/UserFlag/flagprofile.php b/plugins/UserFlag/flagprofile.php index 283eea40c..7096d3748 100644 --- a/plugins/UserFlag/flagprofile.php +++ b/plugins/UserFlag/flagprofile.php @@ -60,13 +60,6 @@ class FlagprofileAction extends ProfileFormAction assert(!empty($user)); // checked above assert(!empty($this->profile)); // checked above - if (User_flag_profile::exists($this->profile->id, - $user->id)) { - // TRANS: Client error when setting flag that has already been set for a profile. - $this->clientError(_m('Flag already exists.')); - return false; - } - return true; } @@ -104,7 +97,13 @@ class FlagprofileAction extends ProfileFormAction // throws an exception on error - User_flag_profile::create($user->id, $this->profile->id); + if (User_flag_profile::exists($this->profile->id, + $user->id)) { + // We'll return to the profile page (or return the updated AJAX form) + // showing the current state, so no harm done. + } else { + User_flag_profile::create($user->id, $this->profile->id); + } if ($this->boolean('ajax')) { $this->ajaxResults(); diff --git a/plugins/UserFlag/locale/UserFlag.pot b/plugins/UserFlag/locale/UserFlag.pot index decb06d04..c70c7988e 100644 --- a/plugins/UserFlag/locale/UserFlag.pot +++ b/plugins/UserFlag/locale/UserFlag.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" +"POT-Creation-Date: 2010-11-04 18:25+0000\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" @@ -44,23 +44,19 @@ msgstr[1] "" msgid "Flagged by %s" msgstr "" -#. TRANS: Client error when setting flag that has already been set for a profile. -#: flagprofile.php:66 -msgid "Flag already exists." -msgstr "" - #. TRANS: AJAX form title for a flagged profile. -#: flagprofile.php:126 +#: flagprofile.php:125 msgid "Flagged for review" msgstr "" #. TRANS: Body text for AJAX form when a profile has been flagged for review. -#: flagprofile.php:130 +#. TRANS: Message added to a profile if it has been flagged for review. +#: flagprofile.php:129 UserFlagPlugin.php:173 msgid "Flagged" msgstr "" #. TRANS: Plugin description. -#: UserFlagPlugin.php:292 +#: UserFlagPlugin.php:294 msgid "" "This plugin allows flagging of profiles for review and reviewing flagged " "profiles." @@ -93,7 +89,7 @@ msgid "Flag profile for review." msgstr "" #. TRANS: Server exception. -#: User_flag_profile.php:145 +#: User_flag_profile.php:160 #, php-format msgid "Couldn't flag profile \"%d\" for review." msgstr "" diff --git a/plugins/UserFlag/locale/fr/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/fr/LC_MESSAGES/UserFlag.po index 277ce5650..f2c84969a 100644 --- a/plugins/UserFlag/locale/fr/LC_MESSAGES/UserFlag.po +++ b/plugins/UserFlag/locale/fr/LC_MESSAGES/UserFlag.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserFlag\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:47:54+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:29:20+0000\n" "Language-Team: French <http://translatewiki.net/wiki/Portal:fr>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-23 19:01:50+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75596); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-11-05 00:29:34+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fr\n" "X-Message-Group: #out-statusnet-plugin-userflag\n" @@ -48,23 +48,19 @@ msgstr[1] "Marqué par %1$s et %2$d autres" msgid "Flagged by %s" msgstr "Marqué par %s" -#. TRANS: Client error when setting flag that has already been set for a profile. -#: flagprofile.php:66 -msgid "Flag already exists." -msgstr "Déjà marqué." - #. TRANS: AJAX form title for a flagged profile. -#: flagprofile.php:126 +#: flagprofile.php:125 msgid "Flagged for review" msgstr "Marqué pour vérification" #. TRANS: Body text for AJAX form when a profile has been flagged for review. -#: flagprofile.php:130 +#. TRANS: Message added to a profile if it has been flagged for review. +#: flagprofile.php:129 UserFlagPlugin.php:173 msgid "Flagged" msgstr "Marqué" #. TRANS: Plugin description. -#: UserFlagPlugin.php:292 +#: UserFlagPlugin.php:294 msgid "" "This plugin allows flagging of profiles for review and reviewing flagged " "profiles." @@ -99,7 +95,7 @@ msgid "Flag profile for review." msgstr "Marquer le profil pour vérification." #. TRANS: Server exception. -#: User_flag_profile.php:145 +#: User_flag_profile.php:160 #, php-format msgid "Couldn't flag profile \"%d\" for review." msgstr "Impossible de marquer le profil « %d » pour vérification." diff --git a/plugins/UserFlag/locale/ia/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/ia/LC_MESSAGES/UserFlag.po index d58458b05..2917da732 100644 --- a/plugins/UserFlag/locale/ia/LC_MESSAGES/UserFlag.po +++ b/plugins/UserFlag/locale/ia/LC_MESSAGES/UserFlag.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserFlag\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:47:54+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:29:20+0000\n" "Language-Team: Interlingua <http://translatewiki.net/wiki/Portal:ia>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-23 19:01:50+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75596); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-11-05 00:29:34+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ia\n" "X-Message-Group: #out-statusnet-plugin-userflag\n" @@ -48,23 +48,19 @@ msgstr[1] "Marcate per %1$s e %2$d alteres" msgid "Flagged by %s" msgstr "Marcate per %s" -#. TRANS: Client error when setting flag that has already been set for a profile. -#: flagprofile.php:66 -msgid "Flag already exists." -msgstr "Le marca ja existe." - #. TRANS: AJAX form title for a flagged profile. -#: flagprofile.php:126 +#: flagprofile.php:125 msgid "Flagged for review" msgstr "Marcate pro revision" #. TRANS: Body text for AJAX form when a profile has been flagged for review. -#: flagprofile.php:130 +#. TRANS: Message added to a profile if it has been flagged for review. +#: flagprofile.php:129 UserFlagPlugin.php:173 msgid "Flagged" msgstr "Marcate" #. TRANS: Plugin description. -#: UserFlagPlugin.php:292 +#: UserFlagPlugin.php:294 msgid "" "This plugin allows flagging of profiles for review and reviewing flagged " "profiles." @@ -98,7 +94,7 @@ msgid "Flag profile for review." msgstr "Marcar profilo pro revision." #. TRANS: Server exception. -#: User_flag_profile.php:145 +#: User_flag_profile.php:160 #, php-format msgid "Couldn't flag profile \"%d\" for review." msgstr "Non poteva marcar profilo \"%d\" pro revision." diff --git a/plugins/UserFlag/locale/mk/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/mk/LC_MESSAGES/UserFlag.po index ab9c1b2e4..8d934141e 100644 --- a/plugins/UserFlag/locale/mk/LC_MESSAGES/UserFlag.po +++ b/plugins/UserFlag/locale/mk/LC_MESSAGES/UserFlag.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserFlag\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:47:54+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:29:20+0000\n" "Language-Team: Macedonian <http://translatewiki.net/wiki/Portal:mk>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-23 19:01:50+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75596); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-11-05 00:29:34+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: mk\n" "X-Message-Group: #out-statusnet-plugin-userflag\n" @@ -48,23 +48,19 @@ msgstr[1] "Означено од %1$s и уште %2$d други" msgid "Flagged by %s" msgstr "Означено од %s" -#. TRANS: Client error when setting flag that has already been set for a profile. -#: flagprofile.php:66 -msgid "Flag already exists." -msgstr "Ознаката веќе постои." - #. TRANS: AJAX form title for a flagged profile. -#: flagprofile.php:126 +#: flagprofile.php:125 msgid "Flagged for review" msgstr "Означено за преглед" #. TRANS: Body text for AJAX form when a profile has been flagged for review. -#: flagprofile.php:130 +#. TRANS: Message added to a profile if it has been flagged for review. +#: flagprofile.php:129 UserFlagPlugin.php:173 msgid "Flagged" msgstr "Означено" #. TRANS: Plugin description. -#: UserFlagPlugin.php:292 +#: UserFlagPlugin.php:294 msgid "" "This plugin allows flagging of profiles for review and reviewing flagged " "profiles." @@ -99,7 +95,7 @@ msgid "Flag profile for review." msgstr "Означи профил за преглед." #. TRANS: Server exception. -#: User_flag_profile.php:145 +#: User_flag_profile.php:160 #, php-format msgid "Couldn't flag profile \"%d\" for review." msgstr "Не можев да го означам профилот „%d“ за преглед." diff --git a/plugins/UserFlag/locale/nl/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/nl/LC_MESSAGES/UserFlag.po index 115b63433..766776a9e 100644 --- a/plugins/UserFlag/locale/nl/LC_MESSAGES/UserFlag.po +++ b/plugins/UserFlag/locale/nl/LC_MESSAGES/UserFlag.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserFlag\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:47:54+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:29:20+0000\n" "Language-Team: Dutch <http://translatewiki.net/wiki/Portal:nl>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-23 19:01:50+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75596); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-11-05 00:29:34+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: nl\n" "X-Message-Group: #out-statusnet-plugin-userflag\n" @@ -48,23 +48,19 @@ msgstr[1] "Gemarkeerd door %1$s en %2$d anderen" msgid "Flagged by %s" msgstr "Gemarkeerd door %s" -#. TRANS: Client error when setting flag that has already been set for a profile. -#: flagprofile.php:66 -msgid "Flag already exists." -msgstr "De markering bestaat al." - #. TRANS: AJAX form title for a flagged profile. -#: flagprofile.php:126 +#: flagprofile.php:125 msgid "Flagged for review" msgstr "Gemarkeerd voor controle" #. TRANS: Body text for AJAX form when a profile has been flagged for review. -#: flagprofile.php:130 +#. TRANS: Message added to a profile if it has been flagged for review. +#: flagprofile.php:129 UserFlagPlugin.php:173 msgid "Flagged" msgstr "Gemarkeerd" #. TRANS: Plugin description. -#: UserFlagPlugin.php:292 +#: UserFlagPlugin.php:294 msgid "" "This plugin allows flagging of profiles for review and reviewing flagged " "profiles." @@ -100,7 +96,7 @@ msgid "Flag profile for review." msgstr "Profiel voor controle markeren" #. TRANS: Server exception. -#: User_flag_profile.php:145 +#: User_flag_profile.php:160 #, php-format msgid "Couldn't flag profile \"%d\" for review." msgstr "Het was niet mogelijk het profiel \"%d\" voor controle te markeren." diff --git a/plugins/UserFlag/locale/pt/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/pt/LC_MESSAGES/UserFlag.po index c476cf2f7..ea71be24e 100644 --- a/plugins/UserFlag/locale/pt/LC_MESSAGES/UserFlag.po +++ b/plugins/UserFlag/locale/pt/LC_MESSAGES/UserFlag.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserFlag\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:47:54+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:29:20+0000\n" "Language-Team: Portuguese <http://translatewiki.net/wiki/Portal:pt>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-23 19:01:50+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75596); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-11-05 00:29:34+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pt\n" "X-Message-Group: #out-statusnet-plugin-userflag\n" @@ -48,23 +48,19 @@ msgstr[1] "Sinalizado por %1$s e mais %2$d pessoas" msgid "Flagged by %s" msgstr "Sinalizado por %s" -#. TRANS: Client error when setting flag that has already been set for a profile. -#: flagprofile.php:66 -msgid "Flag already exists." -msgstr "Já existe uma sinalização." - #. TRANS: AJAX form title for a flagged profile. -#: flagprofile.php:126 +#: flagprofile.php:125 msgid "Flagged for review" msgstr "Sinalizado para análise" #. TRANS: Body text for AJAX form when a profile has been flagged for review. -#: flagprofile.php:130 +#. TRANS: Message added to a profile if it has been flagged for review. +#: flagprofile.php:129 UserFlagPlugin.php:173 msgid "Flagged" msgstr "Sinalizado" #. TRANS: Plugin description. -#: UserFlagPlugin.php:292 +#: UserFlagPlugin.php:294 msgid "" "This plugin allows flagging of profiles for review and reviewing flagged " "profiles." @@ -99,7 +95,7 @@ msgid "Flag profile for review." msgstr "Sinalizar perfil para análise." #. TRANS: Server exception. -#: User_flag_profile.php:145 +#: User_flag_profile.php:160 #, php-format msgid "Couldn't flag profile \"%d\" for review." msgstr "Não foi possível sinalizar o perfil \"%d\" para análise." diff --git a/plugins/UserFlag/locale/uk/LC_MESSAGES/UserFlag.po b/plugins/UserFlag/locale/uk/LC_MESSAGES/UserFlag.po index c6dd6e40d..ae0e9b03f 100644 --- a/plugins/UserFlag/locale/uk/LC_MESSAGES/UserFlag.po +++ b/plugins/UserFlag/locale/uk/LC_MESSAGES/UserFlag.po @@ -9,13 +9,13 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet - UserFlag\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-27 23:43+0000\n" -"PO-Revision-Date: 2010-10-27 23:47:54+0000\n" +"POT-Creation-Date: 2010-11-07 20:25+0000\n" +"PO-Revision-Date: 2010-11-07 20:29:20+0000\n" "Language-Team: Ukrainian <http://translatewiki.net/wiki/Portal:uk>\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-POT-Import-Date: 2010-10-23 19:01:50+0000\n" -"X-Generator: MediaWiki 1.17alpha (r75596); Translate extension (2010-09-17)\n" +"X-POT-Import-Date: 2010-11-05 00:29:34+0000\n" +"X-Generator: MediaWiki 1.17alpha (r76266); Translate extension (2010-09-17)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: uk\n" "X-Message-Group: #out-statusnet-plugin-userflag\n" @@ -50,23 +50,19 @@ msgstr[2] "Відмічено %1$s та ще %2$d користувачами" msgid "Flagged by %s" msgstr "Відмічено %s" -#. TRANS: Client error when setting flag that has already been set for a profile. -#: flagprofile.php:66 -msgid "Flag already exists." -msgstr "Відмітка вже стоїть." - #. TRANS: AJAX form title for a flagged profile. -#: flagprofile.php:126 +#: flagprofile.php:125 msgid "Flagged for review" msgstr "Відмічені для розгляду" #. TRANS: Body text for AJAX form when a profile has been flagged for review. -#: flagprofile.php:130 +#. TRANS: Message added to a profile if it has been flagged for review. +#: flagprofile.php:129 UserFlagPlugin.php:173 msgid "Flagged" msgstr "Відмічені" #. TRANS: Plugin description. -#: UserFlagPlugin.php:292 +#: UserFlagPlugin.php:294 msgid "" "This plugin allows flagging of profiles for review and reviewing flagged " "profiles." @@ -101,7 +97,7 @@ msgid "Flag profile for review." msgstr "Відмітити профіль для розгляду." #. TRANS: Server exception. -#: User_flag_profile.php:145 +#: User_flag_profile.php:160 #, php-format msgid "Couldn't flag profile \"%d\" for review." msgstr "Не вдалося відмітити профіль «%d» для розгляду." |