code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2015 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:25+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Bokmål (http://www.transifex.com/gnu-social/gnu-social/language/nb/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nb\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr ""

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr ""

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr ""

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr ""

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] ""
msgstr[1] ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr ""

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr ""

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr ""


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2015 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:25+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Nepali (http://www.transifex.com/gnu-social/gnu-social/language/ne/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ne\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr ""

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr ""

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr ""

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr ""

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] ""
msgstr[1] ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr ""

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr ""

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr ""

repo_name: andremichelle/gnu

license: mit


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2010 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:32+0000\n"
"Last-Translator: digitaldreamer <digitaldreamer@email.cz>\n"
"Language-Team: Dutch (http://www.transifex.com/gnu-social/gnu-social/language/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr "Hallo"

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr "Hallo, %s!"

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr "Hallo vreemdeling!"

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr "Hallo, %s"

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] "Ik heb u voor de eerste keer gegroet."
msgstr[1] "Ik heb u %d keer gegroet."

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr "Het was niet mogelijk het aantal begroetingen op te slaan voor %d."

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr "Het was niet mogelijk het aantal begroetingen op te hogen voor %d."

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr "Een warme begroeting"

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr "Een voorbeeldplug-in om de basisprogrammeertechnieken te demonstreren aan nieuwe ontwikkelaars."


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2015 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:25+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Nynorsk (http://www.transifex.com/gnu-social/gnu-social/language/nn/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nn\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr ""

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr ""

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr ""

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr ""

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] ""
msgstr[1] ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr ""

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr ""

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr ""


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2011 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Exported from translatewiki.net
# Author: Xqt
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Sample\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:55+0000\n"
"Language-Team: Deitsch <https://translatewiki.net/wiki/Portal:pdc>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-12-03 13:49:08+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: pdc\n"
"X-Message-Group: #out-statusnet-plugin-sample\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
msgid "Hello"
msgstr "Heiya"

#. TRANS: Page title for sample plugin. %s is a user nickname.
#, php-format
msgid "Hello, %s!"
msgstr "Heiya %s!"

#. TRANS: Message in sample plugin.
msgid "Hello, stranger!"
msgstr "Heiya Fremmer!"

#. TRANS: Message in sample plugin. %s is a user nickname.
#, php-format
msgid "Hello, %s"
msgstr "Heiya %s"

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] ""
msgstr[1] ""

#. TRANS: Menu item title in sample plugin.
msgid "A warm greeting"
msgstr ""

#. TRANS: Plugin description.
msgid "A sample plugin to show basics of development for new hackers."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in the database.
#. TRANS: %d is a user ID (number).
#, php-format
msgid "Could not save new greeting count for %d."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in the database.
#. TRANS: %d is a user ID (number).
#, php-format
msgid "Could not increment greeting count for %d."
msgstr ""


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2015 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:25+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Polish (http://www.transifex.com/gnu-social/gnu-social/language/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pl\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr ""

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr ""

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr ""

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr ""

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr ""

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr ""

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr ""


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2015 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:25+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Portuguese (http://www.transifex.com/gnu-social/gnu-social/language/pt/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr ""

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr ""

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr ""

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr ""

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] ""
msgstr[1] ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr ""

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr ""

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr ""


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2015 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:25+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/gnu-social/gnu-social/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr ""

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr ""

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr ""

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr ""

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] ""
msgstr[1] ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr ""

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr ""

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr ""


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2015 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:25+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Romanian (Romania) (http://www.transifex.com/gnu-social/gnu-social/language/ro_RO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ro_RO\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr ""

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr ""

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr ""

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr ""

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr ""

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr ""

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr ""


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2010 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
# Boris Konstantinovich Lissov <lissovbk@yandex.ru>, 2015
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-07-12 20:00+0000\n"
"Last-Translator: Boris Konstantinovich Lissov <lissovbk@yandex.ru>\n"
"Language-Team: Russian (http://www.transifex.com/gnu-social/gnu-social/language/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr "Привет"

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr "Здравствуйте, %s!"

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr "Привет, незнакомец!"

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr "Здравствуйте,%s"

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] "Я вас попривестствовал %d раз."
msgstr[1] "Я вас поприветствовал %d раза."
msgstr[2] "Я вас попривестствовал %d раз."
msgstr[3] "Я вас попривестствовал %d раз."

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr "Не удалось сохранить новое приветствие для %d."

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr "Не удалось увеличть счетчик приветствий для %d."

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr "Теплое приветствие"

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr "Плагин для примера, призванный показать основы разработки для новоприбывших хакеров."


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2015 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:25+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Slovenian (http://www.transifex.com/gnu-social/gnu-social/language/sl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sl\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr ""

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr ""

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr ""

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr ""

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr ""

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr ""

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr ""


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2015 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:25+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Serbian (http://www.transifex.com/gnu-social/gnu-social/language/sr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sr\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: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr ""

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr ""

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr ""

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr ""

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr ""

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr ""

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr ""


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2015 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
# Kristoffer Grundström <kristoffer.grundstrom1983@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-09-16 01:31+0000\n"
"Last-Translator: Kristoffer Grundström <kristoffer.grundstrom1983@gmail.com>\n"
"Language-Team: Swedish (http://www.transifex.com/gnu-social/gnu-social/language/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sv\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr "Hallå"

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr "Hallå, %s!"

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr "Hallå där, främling!"

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr "Hallå, %s"

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] "Jag har hälsat på dig %d gång."
msgstr[1] "Jag har hälsat på dig %d gånger."

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr ""

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr ""

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr ""


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2015 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:25+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Tamil (http://www.transifex.com/gnu-social/gnu-social/language/ta/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ta\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr ""

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr ""

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr ""

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr ""

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] ""
msgstr[1] ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr ""

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr ""

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr ""


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2015 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:25+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Telugu (http://www.transifex.com/gnu-social/gnu-social/language/te/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: te\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr ""

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr ""

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr ""

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr ""

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] ""
msgstr[1] ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr ""

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr ""

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr ""


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2010 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:32+0000\n"
"Last-Translator: digitaldreamer <digitaldreamer@email.cz>\n"
"Language-Team: Tagalog (http://www.transifex.com/gnu-social/gnu-social/language/tl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: tl\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr "Kumusta"

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr "Kumusta, %s!"

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr "Kumusta, dayuhan!"

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr "Kumusta, %s"

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] "Binati kita ng %d ulit."
msgstr[1] "Binati kita ng %d mga ulit."

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr "Hindi masagip ang bagong bilang ng pagbati para sa %d."

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr "Hindi masudlungan ang bilang ng pagbati para sa %d."

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr "Isang mainit-init na pagbati"

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr "Isang halimbawang pampasak upang ipakita ang mga saligan ng kaunlaran para sa bagong mga mangunguha."


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2015 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:25+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Turkish (http://www.transifex.com/gnu-social/gnu-social/language/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: tr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr ""

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr ""

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr ""

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr ""

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] ""
msgstr[1] ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr ""

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr ""

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr ""


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2010 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:32+0000\n"
"Last-Translator: digitaldreamer <digitaldreamer@email.cz>\n"
"Language-Team: Ukrainian (http://www.transifex.com/gnu-social/gnu-social/language/uk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: uk\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr "Привіт"

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr "Привіт, %s!"

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr "Привіт, чужинцю!"

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr "Привіт, %s"

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] "Я привітав вас %d раз."
msgstr[1] "Я привітав вас %d разів."
msgstr[2] "Я привітав вас %d разів."

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr "Не вдалося зберегти новий лічильник привітань для %d."

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr "Не вдалося перерахувати лічильник привітань для %d."

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr "Щирі вітання"

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr "Приклад додатку для демонстрації основ розробки новим гакерам."


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2015 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:25+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Urdu (Pakistan) (http://www.transifex.com/gnu-social/gnu-social/language/ur_PK/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ur_PK\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr ""

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr ""

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr ""

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr ""

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] ""
msgstr[1] ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr ""

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr ""

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr ""


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2015 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:25+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Vietnamese (http://www.transifex.com/gnu-social/gnu-social/language/vi/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: vi\n"
"Plural-Forms: nplurals=1; plural=0;\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr ""

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr ""

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr ""

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr ""

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr ""

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr ""

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr ""


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2015 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:25+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Chinese (http://www.transifex.com/gnu-social/gnu-social/language/zh/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh\n"
"Plural-Forms: nplurals=1; plural=0;\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr ""

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr ""

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr ""

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr ""

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr ""

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr ""

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr ""


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2010 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:32+0000\n"
"Last-Translator: digitaldreamer <digitaldreamer@email.cz>\n"
"Language-Team: Chinese (China) (http://www.transifex.com/gnu-social/gnu-social/language/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr "你好"

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr "你好，%s！"

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr "你好，陌生人！"

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr "你好，%s"

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr "无法保存%d新的问候计数。"

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr "无法增加%d的问候计数。"

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr "一个热情的问候"

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr "一个为新的 hackers 显示基础开发的示例插件。"


code:
# Translation file for GNU social - the free software social networking platform
# Copyright (C) 2015 - 2019 Free Software Foundation, Inc http://www.fsf.org
# This file is under https://www.gnu.org/licenses/agpl v3 or later
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: GNU social\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-02-02 17:47+0100\n"
"PO-Revision-Date: 2015-02-07 10:25+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Chinese (Taiwan) (http://www.transifex.com/gnu-social/gnu-social/language/zh_TW/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_TW\n"
"Plural-Forms: nplurals=1; plural=0;\n"

#. TRANS: Page title for sample plugin.
#. TRANS: Menu item in sample plugin.
#: actions/hello.php:112 SamplePlugin.php:219
msgid "Hello"
msgstr ""

#. TRANS: Page title for sample plugin. %s is a user nickname.
#: actions/hello.php:115
#, php-format
msgid "Hello, %s!"
msgstr ""

#. TRANS: Message in sample plugin.
#: actions/hello.php:136
msgid "Hello, stranger!"
msgstr ""

#. TRANS: Message in sample plugin. %s is a user nickname.
#: actions/hello.php:140
#, php-format
msgid "Hello, %s"
msgstr ""

#. TRANS: Message in sample plugin.
#. TRANS: %d is the number of times a user is greeted.
#: actions/hello.php:144
#, php-format
msgid "I have greeted you %d time."
msgid_plural "I have greeted you %d times."
msgstr[0] ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:104
#, php-format
msgid "Could not save new greeting count for %d."
msgstr ""

#. TRANS: Exception thrown when the user greeting count could not be saved in
#. the database.
#. TRANS: %d is a user ID (number).
#: classes/User_greeting_count.php:117
#, php-format
msgid "Could not increment greeting count for %d."
msgstr ""

#. TRANS: Menu item title in sample plugin.
#: SamplePlugin.php:221
msgid "A warm greeting"
msgstr ""

#. TRANS: Plugin description.
#: SamplePlugin.php:233
msgid "A sample plugin to show basics of development for new hackers."
msgstr ""


code:
The SearchSub plugin allows following all messages with a given search.

Installation
============
This plugin is enabled by default

Settings
========
none

path: plugins/SearchSub/README


code:
<?php
/**
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2011, StatusNet, Inc.
 *
 * A plugin to enable local tab subscription
 *
 * PHP version 5
 *
 * 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  SearchSubPlugin
 * @package   StatusNet
 * @author    Brion Vibber <brion@status.net>
 * @copyright 2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */

if (!defined('STATUSNET')) {
    exit(1);
}

/**
 * SearchSub plugin main class
 *
 * @category  SearchSubPlugin
 * @package   StatusNet
 * @author    Brion Vibber <brionv@status.net>
 * @copyright 2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */
class SearchSubPlugin extends Plugin
{
    const PLUGIN_VERSION = '0.1.0';

    /**
     * Database schema setup
     *
     * @see Schema
     *
     * @return boolean hook value; true means continue processing, false means stop.
     */
    function onCheckSchema()
    {
        $schema = Schema::get();
        $schema->ensureTable('searchsub', SearchSub::schemaDef());
        return true;
    }

    /**
     * Map URLs to actions
     *
     * @param URLMapper $m path-to-action mapper
     *
     * @return boolean hook value; true means continue processing, false means stop.
     */
    public function onRouterInitialized(URLMapper $m)
    {
        $m->connect('search/:search/subscribe',
                    array('action' => 'searchsub'),
                    array('search' => Router::REGEX_TAG));
        $m->connect('search/:search/unsubscribe',
                    array('action' => 'searchunsub'),
                    array('search' => Router::REGEX_TAG));
        $m->connect(':nickname/search-subscriptions',
                    array('action' => 'searchsubs'),
                    array('nickname' => Nickname::DISPLAY_FMT));
        return true;
    }

    /**
     * Plugin version data
     *
     * @param array &$versions array of version data
     *
     * @return value
     */
    function onPluginVersion(array &$versions)
    {
        $versions[] = array('name' => 'SearchSub',
                            'version' => self::PLUGIN_VERSION,
                            'author' => 'Brion Vibber',
                            'homepage' => 'https://git.gnu.io/gnu/gnu-social/tree/master/plugins/SearchSub',
                            'rawdescription' =>
                            // TRANS: Plugin description.
                            _m('Plugin to allow following all messages with a given search.'));
        return true;
    }

    /**
     * Hook inbox delivery setup so search subscribers receive all
     * notices with that search in their inbox.
     *
     * Currently makes no distinction between local messages and
     * remote ones which happen to come in to the system. Remote
     * notices that don't come in at all won't ever reach this.
     *
     * @param Notice $notice
     * @param array $ni in/out map of profile IDs to inbox constants
     * @return boolean hook result
     */
    function onStartNoticeWhoGets(Notice $notice, array &$ni)
    {
        // Warning: this is potentially very slow
        // with a lot of searches!
        $sub = new SearchSub();
        $sub->groupBy('search');
        $sub->find();
        while ($sub->fetch()) {
            $search = $sub->search;

            if ($this->matchSearch($notice, $search)) {
                // Match? Find all those who subscribed to this
                // search term and get our delivery on...
                $searchsub = new SearchSub();
                $searchsub->search = $search;
                $searchsub->find();

                while ($searchsub->fetch()) {
                    // These constants are currently not actually used, iirc
                    $ni[$searchsub->profile_id] = NOTICE_INBOX_SOURCE_SUB;
                }
            }
        }
        return true;
    }

    /**
     * Does the given notice match the given fulltext search query?
     *
     * Warning: not guaranteed to match other search engine behavior, etc.
     * Currently using a basic case-insensitive substring match, which
     * probably fits with the 'LIKE' search but not the default MySQL
     * or Sphinx search backends.
     *
     * @param Notice $notice
     * @param string $search
     * @return boolean
     */
    function matchSearch(Notice $notice, $search)
    {
        return (mb_stripos($notice->content, $search) !== false);
    }

    /**
     *
     * @param NoticeSearchAction $action
     * @param string $q
     * @param Notice $notice
     * @return boolean hook result
     */
    function onStartNoticeSearchShowResults($action, $q, $notice)
    {
        $user = common_current_user();
        if ($user) {
            $search = $q;
            $searchsub = SearchSub::pkeyGet(array('search' => $search,
                                                  'profile_id' => $user->id));
            if ($searchsub) {
                $form = new SearchUnsubForm($action, $search);
            } else {
                $form = new SearchSubForm($action, $search);
            }
            $action->elementStart('div', 'entity_actions');
            $action->elementStart('ul');
            $action->elementStart('li', 'entity_subscribe');
            $form->show();
            $action->elementEnd('li');
            $action->elementEnd('ul');
            $action->elementEnd('div');
        }
        return true;
    }

    /**
     * Menu item for personal subscriptions/groups area
     *
     * @param Widget $widget Widget being executed
     *
     * @return boolean hook return
     */
    function onEndSubGroupNav($widget)
    {
        $action = $widget->out;
        $action_name = $action->trimmed('action');

        $action->menuItem(common_local_url('searchsubs', array('nickname' => $action->user->nickname)),
                          // TRANS: SearchSub plugin menu item on user settings page.
                          _m('MENU', 'Searches'),
                          // TRANS: SearchSub plugin tooltip for user settings menu item.
                          _m('Configure search subscriptions'),
                          $action_name == 'searchsubs' && $action->arg('nickname') == $action->user->nickname);

        return true;
    }

    /**
     * Replace the built-in stub track commands with ones that control
     * search subscriptions.
     *
     * @param CommandInterpreter $cmd
     * @param string $arg
     * @param User $user
     * @param Command $result
     * @return boolean hook result
     */
    function onEndInterpretCommand($cmd, $arg, $user, &$result)
    {
        if ($result instanceof TrackCommand) {
            $result = new SearchSubTrackCommand($user, $arg);
            return false;
        } else if ($result instanceof TrackOffCommand) {
            $result = new SearchSubTrackOffCommand($user);
            return false;
        } else if ($result instanceof TrackingCommand) {
            $result = new SearchSubTrackingCommand($user);
            return false;
        } else if ($result instanceof UntrackCommand) {
            $result = new SearchSubUntrackCommand($user, $arg);
            return false;
        } else {
            return true;
        }
    }

    function onHelpCommandMessages($cmd, &$commands)
    {
        // TRANS: Help message for IM/SMS command "track <word>"
        $commands["track <word>"] = _m('COMMANDHELP', "Start following notices matching the given search query.");
        // TRANS: Help message for IM/SMS command "untrack <word>"
        $commands["untrack <word>"] = _m('COMMANDHELP', "Stop following notices matching the given search query.");
        // TRANS: Help message for IM/SMS command "track off"
        $commands["track off"] = _m('COMMANDHELP', "Disable all tracked search subscriptions.");
        // TRANS: Help message for IM/SMS command "untrack all"
        $commands["untrack all"] = _m('COMMANDHELP', "Disable all tracked search subscriptions.");
        // TRANS: Help message for IM/SMS command "tracks"
        $commands["tracks"] = _m('COMMANDHELP', "List all your search subscriptions.");
        // TRANS: Help message for IM/SMS command "tracking"
        $commands["tracking"] = _m('COMMANDHELP', "List all your search subscriptions.");
    }

    function onEndDefaultLocalNav($menu, $user)
    {
        $user = common_current_user();

        if (!empty($user)) {
            $searches = SearchSub::forProfile($user->getProfile());

            if (!empty($searches) && count($searches) > 0) {
                $searchSubMenu = new SearchSubMenu($menu->out, $user, $searches);
                // TRANS: Sub menu for searches.
                $menu->submenu(_m('MENU','Searches'), $searchSubMenu);
            }
        }

        return true;
    }
}


code:
<?php
/**
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2008-2011, StatusNet, Inc.
 *
 * Search subscription action.
 *
 * 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/>.
 *
 * PHP version 5
 *
 * @category  Action
 * @package   StatusNet
 * @author    Brion Vibber <brion@status.net>
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2008-2010 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
 * @link      http://status.net/
 */

if (!defined('STATUSNET')) {
    exit(1);
}

/**
 * Search subscription action
 *
 * Takes parameters:
 *
 *    - token: session token to prevent CSRF attacks
 *    - ajax: boolean; whether to return Ajax or full-browser results
 *
 * Only works if the current user is logged in.
 *
 * @category  Action
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @author    Brion Vibber <brion@status.net>
 * @copyright 2008-2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
 * @link      http://status.net/
 */
class SearchsubAction extends Action
{
    var $user;
    var $search;

    /**
     * Check pre-requisites and instantiate attributes
     *
     * @param Array $args array of arguments (URL, GET, POST)
     *
     * @return boolean success flag
     */
    function prepare(array $args = array())
    {
        parent::prepare($args);
        if ($this->boolean('ajax')) {
            GNUsocial::setApi(true);
        }

        // Only allow POST requests

        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
            // TRANS: Client error displayed trying to perform any request method other than POST.
            // TRANS: Do not translate POST.
            $this->clientError(_m('This action only accepts POST requests.'));
        }

        // CSRF protection

        $token = $this->trimmed('token');

        if (!$token || $token != common_session_token()) {
            // TRANS: Client error displayed when the session token is not okay.
            $this->clientError(_m('There was a problem with your session token.'.
                                 ' Try again, please.'));
        }

        // Only for logged-in users

        $this->user = common_current_user();

        if (empty($this->user)) {
            // TRANS: Error message displayed when trying to perform an action that requires a logged in user.
            $this->clientError(_m('Not logged in.'));
        }

        // Profile to subscribe to

        $this->search = $this->arg('search');

        if (empty($this->search)) {
            // TRANS: Client error displayed trying to subscribe to a non-existing profile.
            $this->clientError(_m('No such profile.'));
        }

        return true;
    }

    /**
     * Handle request
     *
     * Does the subscription and returns results.
     *
     * @param Array $args unused.
     *
     * @return void
     */
    function handle()
    {
        // Throws exception on error

        SearchSub::start($this->user->getProfile(),
                      $this->search);

        if ($this->boolean('ajax')) {
            $this->startHTML('text/xml;charset=utf-8');
            $this->elementStart('head');
            // TRANS: Page title when search subscription succeeded.
            $this->element('title', null, _m('Subscribed'));
            $this->elementEnd('head');
            $this->elementStart('body');
            $unsubscribe = new SearchUnsubForm($this, $this->search);
            $unsubscribe->show();
            $this->elementEnd('body');
            $this->endHTML();
        } else {
            $url = common_local_url('search',
                                    array('search' => $this->search));
            common_redirect($url, 303);
        }
    }
}


code:
<?php
/**
 * StatusNet, the distributed open-source microblogging tool
 *
 * List of a user's subscriptions
 *
 * 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  Social
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @author    Sarven Capadisli <csarven@status.net>
 * @copyright 2008-2009 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('GNUSOCIAL')) { exit(1); }

/**
 * A list of the user's subscriptions
 *
 * @category Social
 * @package  StatusNet
 * @author   Evan Prodromou <evan@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/
 */
class SearchSubsAction extends GalleryAction
{
    function title()
    {
        if ($this->page == 1) {
            // TRANS: Header for subscriptions overview for a user (first page).
            // TRANS: %s is a user nickname.
            return sprintf(_m('%s\'s search subscriptions'), $this->getTarget()->getNickname());
        } else {
            // TRANS: Header for subscriptions overview for a user (not first page).
            // TRANS: %1$s is a user nickname, %2$d is the page number.
            return sprintf(_m('%1$s\'s search subscriptions, page %2$d'),
                           $this->getTarget()->getNickname(),
                           $this->page);
        }
    }

    function showPageNotice()
    {
        if ($this->scoped instanceof Profile && $this->scoped->sameAs($this->getTarget())) {
            $this->element('p', null,
                           // TRANS: Page notice for page with an overview of all search subscriptions
                           // TRANS: of the logged in user's own profile.
                           _m('You have subscribed to receive all notices on this site matching the following searches:'));
        } else {
            $this->element('p', null,
                           // TRANS: Page notice for page with an overview of all subscriptions of a user other
                           // TRANS: than the logged in user. %s is the user nickname.
                           sprintf(_m('%s has subscribed to receive all notices on this site matching the following searches:'),
                                   $this->getTarget()->getNickname()));
        }
    }

    function showContent()
    {
        if (Event::handle('StartShowTagSubscriptionsContent', array($this))) {
            parent::showContent();

            $offset = ($this->page-1) * PROFILES_PER_PAGE;
            $limit =  PROFILES_PER_PAGE + 1;

            $cnt = 0;

            $searchsub = new SearchSub();
            $searchsub->profile_id = $this->getTarget()->getID();
            $searchsub->limit($limit, $offset);
            $searchsub->find();

            if ($searchsub->N) {
                $list = new SearchSubscriptionsList($searchsub, $this->getTarget(), $this);
                $cnt = $list->show();
                if (0 == $cnt) {
                    $this->showEmptyListMessage();
                }
            } else {
                $this->showEmptyListMessage();
            }

            $this->pagination($this->page > 1, $cnt > PROFILES_PER_PAGE,
                              $this->page, 'searchsubs',
                              array('nickname' => $this->getTarget()->getNickname()));

            Event::handle('EndShowTagSubscriptionsContent', array($this));
        }
    }

    function showEmptyListMessage()
    {
        if (common_logged_in()) {
            if ($this->scoped->sameAs($this->getTarget())) {
                // TRANS: Search subscription list text when the logged in user has no search subscriptions.
                $message = _m('You are not subscribed to any text searches right now. You can push the "Subscribe" button ' .
                             'on any notice text search to automatically receive any public messages on this site that match that ' .
                             'search, even if you are not subscribed to the poster.');
            } else {
                // TRANS: Search subscription list text when looking at the subscriptions for a of a user other
                // TRANS: than the logged in user that has no search subscriptions. %s is the user nickname.
                $message = sprintf(_m('%s is not subscribed to any searches.'), $this->getTarget()->getNickname());
            }
        }
        else {
            // TRANS: Subscription list text when looking at the subscriptions for a of a user that has none
            // TRANS: as an anonymous user. %s is the user nickname.
            $message = sprintf(_m('%s is not subscribed to any searches.'), $this->getTarget()->getNickname());
        }

        $this->elementStart('div', 'guide');
        $this->raw(common_markup_to_html($message));
        $this->elementEnd('div');
    }
}

// XXX SubscriptionsList and SubscriptionList are dangerously close

class SearchSubscriptionsList extends SubscriptionList
{
    function newListItem(Profile $searchsub)
    {
        return new SearchSubscriptionsListItem($searchsub, $this->owner, $this->action);
    }
}

class SearchSubscriptionsListItem extends SubscriptionListItem
{
    function startItem()
    {
        $this->out->elementStart('li', array('class' => 'searchsub'));
    }

    function showProfile()
    {
        $searchsub = $this->profile;
        $search = $searchsub->search;

        // Relevant portion!
        $cur = common_current_user();
        if (!empty($cur) && $cur->id == $this->owner->id) {
            $this->showOwnerControls();
        }

        $url = common_local_url('noticesearch', array('q' => $search));
        // TRANS: Search subscription list item. %1$s is a URL to a notice search,
        // TRANS: %2$s are the search criteria, %3$s is a datestring.
        $linkline = sprintf(_m('"%2$s" since %3$s'),
                            htmlspecialchars($url),
                            htmlspecialchars($search),
                            common_date_string($searchsub->created));

        $this->out->elementStart('div', 'searchsub-item');
        $this->out->raw($linkline);
        $this->out->element('div', array('style' => 'clear: both'));
        $this->out->elementEnd('div');
    }

    function showActions()
    {
    }

    function showOwnerControls()
    {
        $this->out->elementStart('div', 'entity_actions');

        $searchsub = $this->profile; // ?
        $form = new SearchUnsubForm($this->out, $searchsub->search);
        $form->show();

        $this->out->elementEnd('div');
        return;
    }
}


code:
<?php
/**
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2008-2011, StatusNet, Inc.
 *
 * Search subscription action.
 *
 * 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/>.
 *
 * PHP version 5
 *
 * @category  Action
 * @package   StatusNet
 * @author    Brion Vibber <brion@status.net>
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2008-2010 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
 * @link      http://status.net/
 */

if (!defined('STATUSNET')) {
    exit(1);
}

/**
 * Search unsubscription action
 *
 * Takes parameters:
 *
 *    - token: session token to prevent CSRF attacks
 *    - ajax: boolean; whether to return Ajax or full-browser results
 *
 * Only works if the current user is logged in.
 *
 * @category  Action
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @author    Brion Vibber <brion@status.net>
 * @copyright 2008-2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
 * @link      http://status.net/
 */
class SearchunsubAction extends SearchsubAction
{
    /**
     * Handle request
     *
     * Does the subscription and returns results.
     *
     * @param Array $args unused.
     *
     * @return void
     */
    function handle()
    {
        // Throws exception on error

        SearchSub::cancel($this->user->getProfile(),
                       $this->search);

        if ($this->boolean('ajax')) {
            $this->startHTML('text/xml;charset=utf-8');
            $this->elementStart('head');
            // TRANS: Page title when search unsubscription succeeded.
            $this->element('title', null, _m('Unsubscribed'));
            $this->elementEnd('head');
            $this->elementStart('body');
            $subscribe = new SearchSubForm($this, $this->search);
            $subscribe->show();
            $this->elementEnd('body');
            $this->endHTML();
        } else {
            $url = common_local_url('search',
                                    array('search' => $this->search));
            common_redirect($url, 303);
        }
    }
}


code:
<?php
/**
 * Data class to store local search subscriptions
 *
 * PHP version 5
 *
 * @category SearchSubPlugin
 * @package  StatusNet
 * @author   Brion Vibber <brion@status.net>
 * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
 * @link     http://status.net/
 *
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2011, 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')) {
    exit(1);
}

/**
 * For storing the search subscriptions
 *
 * @category PollPlugin
 * @package  StatusNet
 * @author   Brion Vibber <brion@status.net>
 * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
 * @link     http://status.net/
 *
 * @see      DB_DataObject
 */

class SearchSub extends Managed_DataObject
{
    public $__table = 'searchsub'; // table name
    public $search;         // text
    public $profile_id;  // int -> profile.id
    public $created;     // datetime

    /**
     * The One True Thingy that must be defined and declared.
     */
    public static function schemaDef()
    {
        return array(
            'description' => 'SearchSubPlugin search subscription records',
            'fields' => array(
                'search' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'hash search associated with this subscription'),
                'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'profile ID of subscribing user'),
                'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
            ),
            'primary key' => array('search', 'profile_id'),
            'foreign keys' => array(
                'searchsub_profile_id_fkey' => array('profile', array('profile_id' => 'id')),
            ),
            'indexes' => array(
                'searchsub_created_idx' => array('created'),
                'searchsub_profile_id_tag_idx' => array('profile_id', 'search'),
            ),
        );
    }

    /**
     * Start a search subscription!
     *
     * @param profile $profile subscriber
     * @param string $search subscribee
     * @return SearchSub
     */
    static function start(Profile $profile, $search)
    {
        $ts = new SearchSub();
        $ts->search = $search;
        $ts->profile_id = $profile->id;
        $ts->created = common_sql_now();
        $ts->insert();
        self::blow('searchsub:by_profile:%d', $profile->id);
        return $ts;
    }

    /**
     * End a search subscription!
     *
     * @param profile $profile subscriber
     * @param string $search subscribee
     */
    static function cancel(Profile $profile, $search)
    {
        $ts = SearchSub::pkeyGet(array('search' => $search,
                                    'profile_id' => $profile->id));
        if ($ts) {
            $ts->delete();
            self::blow('searchsub:by_profile:%d', $profile->id);
        }
    }

    static function forProfile(Profile $profile)
    {
        $searches = array();

        $keypart = sprintf('searchsub:by_profile:%d', $profile->id);
        $searchstring = self::cacheGet($keypart);

        if ($searchstring !== false) {
        	if (!empty($searchstring)) {
            	$searches = explode(',', $searchstring);
        	}
        } else {
            $searchsub = new SearchSub();
            $searchsub->profile_id = $profile->id;
            $searchsub->selectAdd();
            $searchsub->selectAdd('search');

            if ($searchsub->find()) {
                $searches = $searchsub->fetchAll('search');
            }

            self::cacheSet($keypart, implode(',', $searches));
        }

        return $searches;
    }
}


code:
<?php
/**
 * StatusNet, the distributed open-source microblogging tool
 *
 * Form for subscribing to a search
 *
 * 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  SearchSubPlugin
 * @package   StatusNet
 * @author    Brion Vibber <brion@status.net>
 * @author    Evan Prodromou <evan@status.net>
 * @author    Sarven Capadisli <csarven@status.net>
 * @copyright 2009-2011 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') && !defined('LACONICA')) {
    exit(1);
}

/**
 * Form for subscribing to a user
 *
 * @category SearchSubPlugin
 * @package  StatusNet
 * @author   Brion Vibber <brion@status.net>
 * @author   Evan Prodromou <evan@status.net>
 * @author   Sarven Capadisli <csarven@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/
 *
 * @see      UnsubscribeForm
 */
class SearchSubForm extends Form
{
    /**
     * Name of search to subscribe to
     */
    var $search = '';

    /**
     * Constructor
     *
     * @param HTMLOutputter $out     output channel
     * @param string        $search     name of search to subscribe to
     */
    function __construct($out=null, $search=null)
    {
        parent::__construct($out);

        $this->search = $search;
    }

    /**
     * ID of the form
     *
     * @return int ID of the form
     */
    function id()
    {
        return 'search-subscribe-' . $this->search;
    }

    /**
     * class of the form
     *
     * @return string of the form class
     */
    function formClass()
    {
        // class to match existing styles...
        return 'form_user_subscribe ajax';
    }

    /**
     * Action of the form
     *
     * @return string URL of the action
     */
    function action()
    {
        return common_local_url('searchsub', array('search' => $this->search));
    }

    /**
     * Legend of the Form
     *
     * @return void
     */
    function formLegend()
    {
        // TRANS: Form legend.
        $this->out->element('legend', null, _m('Subscribe to this search'));
    }

    /**
     * Data elements of the form
     *
     * @return void
     */
    function formData()
    {
        $this->out->hidden('subscribeto-' . $this->search,
                           $this->search,
                           'subscribeto');
    }

    /**
     * Action elements
     *
     * @return void
     */
    function formActions()
    {
        $this->out->submit('submit',
                           // TRANS: Button text for subscribing to a search.
                           _m('BUTTON','Subscribe'),
                           'submit',
                           null,
                           // TRANS: Button title for subscribing to a search.
                           _m('Subscribe to this search.'));
    }
}


code:
<?php
/**
 * StatusNet, the distributed open-source microblogging tool
 *
 * Form for subscribing to a search
 *
 * 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  SearchSubPlugin
 * @package   StatusNet
 * @author    Brion Vibber <brion@status.net>
 * @author    Evan Prodromou <evan@status.net>
 * @author    Sarven Capadisli <csarven@status.net>
 * @copyright 2009-2011 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') && !defined('LACONICA')) {
    exit(1);
}

/**
 * Form for subscribing to a user
 *
 * @category SearchSubPlugin
 * @package  StatusNet
 * @author   Brion Vibber <brion@status.net>
 * @author   Evan Prodromou <evan@status.net>
 * @author   Sarven Capadisli <csarven@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/
 *
 * @see      UnsubscribeForm
 */
class SearchUnsubForm extends SearchSubForm
{
    /**
     * ID of the form
     *
     * @return int ID of the form
     */
    function id()
    {
        return 'search-unsubscribe-' . $this->search;
    }

    /**
     * class of the form
     *
     * @return string of the form class
     */
    function formClass()
    {
        // class to match existing styles...
        return 'form_user_unsubscribe ajax';
    }

    /**
     * Action of the form
     *
     * @return string URL of the action
     */
    function action()
    {
        return common_local_url('searchunsub', array('search' => $this->search));
    }

    /**
     * Legend of the Form
     *
     * @return void
     */
    function formLegend()
    {
        // TRANS: Form legend.
        $this->out->element('legend', null, _m('Unsubscribe from this search'));
    }

    /**
     * Action elements
     *
     * @return void
     */
    function formActions()
    {
        $this->out->submit('submit',
                           // TRANS: Button text for unsubscribing from a text search.
                           _m('BUTTON','Unsubscribe'),
                           'submit',
                           null,
                           // TRANS: Button title for unsubscribing from a text search.
                           _m('Unsubscribe from this search.'));
    }
}


code:
<?php
/**
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2011, StatusNet, Inc.
 *
 * Menu to show searches you're subscribed to
 *
 * PHP version 5
 *
 * 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  Menu
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */

if (!defined('STATUSNET')) {
    // This check helps protect against security problems;
    // your code file can't be executed directly from the web.
    exit(1);
}

/**
 * Class comment
 *
 * @category  General
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 * @link      http://status.net/
 */

class SearchSubMenu extends MoreMenu
{
    protected $user;
    protected $searches;

    function __construct($out, $user, $searches)
    {
        parent::__construct($out);
        $this->user = $user;
        $this->searches = $searches;
    }

    function tag()
    {
        return 'searchsubs';
    }

    function seeAllItem()
    {
        return array('searchsubs',
                     array('nickname' => $this->user->nickname),
                     _('See all'),
                     _('See all searches you are following'));
    }

    function getItems()
    {
        $items = array();

        foreach ($this->searches as $search) {
            if (!empty($search)) {
                $items[] = array('noticesearch',
                                 array('q' => $search),
                                 sprintf('"%s"', $search),
                                 sprintf(_('Notices including %s'), $search));;
            }
        }

        return $items;
    }

    function item($actionName, array $args, $label, $description, $id=null, $cls=null)
    {
        if (empty($id)) {
            $id = $this->menuItemID($actionName, $args);
        }

        if ($actionName == 'noticesearch') {
            // Add 'q' as a search param, not part of the url path
            $url = common_local_url($actionName, array(), $args);
        } else {
            $url = common_local_url($actionName, $args);
        }

        $this->out->menuItem($url,
                             $label,
                             $description,
                             $this->isCurrent($actionName, $args),
                             $id,
                             $cls);
    }
}


code:
<?php

class SearchSubTrackCommand extends Command
{
    var $keyword = null;

    function __construct($user, $keyword)
    {
        parent::__construct($user);
        $this->keyword = $keyword;
    }

    function handle($channel)
    {
        $cur = $this->user;
        $searchsub = SearchSub::pkeyGet(array('search' => $this->keyword,
                                              'profile_id' => $cur->id));

        if ($searchsub) {
            // TRANS: Error text shown a user tries to track a search query they're already subscribed to.
            $channel->error($cur, sprintf(_m('You are already tracking the search "%s".'), $this->keyword));
            return;
        }

        try {
            SearchSub::start($cur->getProfile(), $this->keyword);
        } catch (Exception $e) {
            // TRANS: Message given having failed to set up a search subscription by track command.
            $channel->error($cur, sprintf(_m('Could not start a search subscription for query "%s".'),
                                          $this->keyword));
            return;
        }

        // TRANS: Message given having added a search subscription by track command.
        $channel->output($cur, sprintf(_m('You are subscribed to the search "%s".'),
                                              $this->keyword));
    }
}


code:
<?php

class SearchSubTrackingCommand extends Command
{
    function handle($channel)
    {
        $cur = $this->user;
        $all = new SearchSub();
        $all->profile_id = $cur->id;
        $all->find();

        if ($all->N == 0) {
            // TRANS: Error text shown a user tries to disable all a search subscriptions with track off command, but has none.
            $channel->error($cur, _m('You are not tracking any searches.'));
            return;
        }

        $list = array();
        while ($all->fetch()) {
            $list[] = $all->search;
        }

        // TRANS: Separator for list of tracked searches.
        $separator = _m('SEPARATOR','", "');

        // TRANS: Message given having disabled all search subscriptions with 'track off'.
        // TRANS: %s is a list of searches. Separator default is '", "'.
        $channel->output($cur, sprintf(_m('You are tracking searches for: "%s".'),
                                       implode($separator, $list)));
    }
}


code:
<?php

class SearchSubTrackoffCommand extends Command
{
    function handle($channel)
    {
        $cur = $this->user;
        $all = new SearchSub();
        $all->profile_id = $cur->id;
        $all->find();

        if ($all->N == 0) {
            // TRANS: Error text shown a user tries to disable all a search subscriptions with track off command, but has none.
            $channel->error($cur, _m('You are not tracking any searches.'));
            return;
        }

        $profile = $cur->getProfile();
        while ($all->fetch()) {
            try {
                SearchSub::cancel($profile, $all->search);
            } catch (Exception $e) {
                // TRANS: Message given having failed to cancel one of the search subs with 'track off' command.
                // TRANS: %s is the search for which the subscription removal failed.
                $channel->error($cur, sprintf(_m('Error disabling search subscription for query "%s".'),
                                              $all->search));
                return;
            }
        }

        // TRANS: Message given having disabled all search subscriptions with 'track off'.
        $channel->output($cur, _m('Disabled all your search subscriptions.'));
    }
}


code:
<?php

class SearchSubUntrackCommand extends Command
{
    var $keyword = null;

    function __construct($user, $keyword)
    {
        parent::__construct($user);
        $this->keyword = $keyword;
    }

    function handle($channel)
    {
        $cur = $this->user;
        $searchsub = SearchSub::pkeyGet(array('search' => $this->keyword,
                                              'profile_id' => $cur->id));

        if (!$searchsub) {
            // TRANS: Error text shown a user tries to untrack a search query they're not subscribed to.
            // TRANS: %s is the keyword for the search.
            $channel->error($cur, sprintf(_m('You are not tracking the search "%s".'), $this->keyword));
            return;
        }

        try {
            SearchSub::cancel($cur->getProfile(), $this->keyword);
        } catch (Exception $e) {
            // TRANS: Message given having failed to cancel a search subscription by untrack command.
            // TRANS: %s is the keyword for the query.
            $channel->error($cur, sprintf(_m('Could not end a search subscription for query "%s".'),
                                          $this->keyword));
            return;
        }

        // TRANS: Message given having removed a search subscription by untrack command.
        // TRANS: %s is the keyword for the search.
        $channel->output($cur, sprintf(_m('You are no longer subscribed to the search "%s".'),
                                              $this->keyword));
    }
}