code:
# Translation of StatusNet - Spotify to Macedonian (македонски)
# Exported from translatewiki.net
#
# Author: Bjankuloski06
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Spotify\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:06+0000\n"
"Language-Team: Macedonian <https://translatewiki.net/wiki/Portal:mk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-19 11:23:27+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: mk\n"
"X-Message-Group: #out-statusnet-plugin-spotify\n"
"Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n"

#. TRANS: Plugin description.
msgid "Create pretty Spotify URLs."
msgstr ""
"Правете интересни и убави URL-адреси со Spotify."


code:
# Translation of StatusNet - Spotify to Dutch (Nederlands)
# Exported from translatewiki.net
#
# Author: Siebrand
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Spotify\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:07+0000\n"
"Language-Team: Dutch <https://translatewiki.net/wiki/Portal:nl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-19 11:23:27+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: nl\n"
"X-Message-Group: #out-statusnet-plugin-spotify\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid "Create pretty Spotify URLs."
msgstr "Maak mooie Spotify-URL's."

license: mit


code:
# Translation of StatusNet - Spotify to Swedish (svenska)
# Exported from translatewiki.net
#
# Author: WikiPhoenix
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Spotify\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:07+0000\n"
"Language-Team: Swedish <https://translatewiki.net/wiki/Portal:sv>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-19 11:23:27+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: sv\n"
"X-Message-Group: #out-statusnet-plugin-spotify\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid "Create pretty Spotify URLs."
msgstr ""
"Skapa vackra Spotify-webbadresser."


code:
# Translation of StatusNet - Spotify to Tagalog (Tagalog)
# Exported from translatewiki.net
#
# Author: AnakngAraw
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Spotify\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:07+0000\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-19 11:23:27+0000\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid "Create pretty Spotify URLs."
msgstr ""
"Lumikha ng marilag na mga URL ng Spotify</"
"a>."


code:
The Strict Transport Security plugin implements the Strict Transport Security header, improving the security of HTTPS only sites.
See http://lists.w3.org/Archives/Public/www-archive/2009Sep/att-0051/draft-hodges-strict-transport-sec-05.plain.html for the specification.

Installation
============
add "addPlugin('strictTransportSecurity');"
to the bottom of your config.php

The plugin will not do anything unless:
$config['site']['ssl'] is set to 'always'
$config['site']['path'] is either not set, empty, or '/'

Settings
========
max_age (15552000): sets how long to remember the forced HTTPS (seconds) (15552000 seconds is 180 days)
includeSubDomains (false): if set, then STS will apply to all the sub-domains too.

Example
=======
addPlugin('strictTransportSecurity');

path: plugins/StrictTransportSecurity/README


code:
<?php
/**
 * StatusNet, the distributed open-source microblogging tool
 *
 * Plugin to enable Strict Transport Security headers
 *
 * PHP version 5
 *
 * LICENCE: This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @category  Plugin
 * @package   StatusNet
 * @author    Craig Andrews <candrews@integralblue.com>
 * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org
 * @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);
}

class StrictTransportSecurityPlugin extends Plugin
{
    public $max_age = 15552000;
    public $includeSubDomains = false;

    function __construct()
    {
        parent::__construct();
    }

    function onArgsInitialize($args)
    {
        $path = common_config('site', 'path');
        if(common_config('site', 'ssl') == 'always' && ($path == '/' || ! $path )) {
            header('Strict-Transport-Security: max-age=' . $this->max_age . + ($this->includeSubDomains?'; includeSubDomains':''));
        }
    }

    function onPluginVersion(&$versions)
    {
        $versions[] = array('name' => 'StrictTransportSecurity',
                            'version' => GNUSOCIAL_VERSION,
                            'author' => 'Craig Andrews',
                            'homepage' => 'http://status.net/wiki/Plugin:StrictTransportSecurity',
                            'rawdescription' =>
                            // TRANS: Plugin description.
                            _m('The Strict Transport Security plugin implements the Strict Transport Security header, improving the security of HTTPS only sites.'));
        return true;
    }
}


code:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#. TRANS: Plugin description.
#: StrictTransportSecurityPlugin.php:60
msgid ""
"The Strict Transport Security plugin implements the Strict Transport "
"Security header, improving the security of HTTPS only sites."
msgstr ""


code:
# Translation of StatusNet - StrictTransportSecurity to German (Deutsch)
# Exported from translatewiki.net
#
# Author: Giftpflanze
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - StrictTransportSecurity\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:10+0000\n"
"Language-Team: German <https://translatewiki.net/wiki/Portal:de>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:51:41+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: de\n"
"X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid ""
"The Strict Transport Security plugin implements the Strict Transport "
"Security header, improving the security of HTTPS only sites."
msgstr ""
"Das „Strict Transport Security“-Plugin implementiert den „Strict Transport "
"Security“-Header, dies verbessert die Sicherheit von reinen HTTPS-Sites."


code:
# Translation of StatusNet - StrictTransportSecurity to Spanish (español)
# Exported from translatewiki.net
#
# Author: Armando-Martin
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - StrictTransportSecurity\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:10+0000\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:51:41+0000\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid ""
"The Strict Transport Security plugin implements the Strict Transport "
"Security header, improving the security of HTTPS only sites."
msgstr ""
"El complemento (plugin) Strict Transport Security implementa la cabecera "
"Strict Transport Security, que mejora la seguridad de los sitios disponibles "
"unicamente en HTTPS."


code:
# Translation of StatusNet - StrictTransportSecurity to French (français)
# Exported from translatewiki.net
#
# Author: Brunoperel
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - StrictTransportSecurity\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:10+0000\n"
"Language-Team: French <https://translatewiki.net/wiki/Portal:fr>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:51:41+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: fr\n"
"X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"

#. TRANS: Plugin description.
msgid ""
"The Strict Transport Security plugin implements the Strict Transport "
"Security header, improving the security of HTTPS only sites."
msgstr ""
"Le plugin Strict Transport Security implémente l'en-tête Strict Transport "
"Security qui permet d'améliorer la sécurité des sites disponibles uniquement "
"en HTTPS."


code:
# Translation of StatusNet - StrictTransportSecurity to Galician (galego)
# Exported from translatewiki.net
#
# Author: Toliño
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - StrictTransportSecurity\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:10+0000\n"
"Language-Team: Galician <https://translatewiki.net/wiki/Portal:gl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:51:41+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: gl\n"
"X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid ""
"The Strict Transport Security plugin implements the Strict Transport "
"Security header, improving the security of HTTPS only sites."
msgstr ""
"O complemento Strict Transport Security inclúe a cabeceira Strict Transport "
"Security, mellorando a seguridade dos sitios dispoñibles unicamente en HTTPS."


code:
# Translation of StatusNet - StrictTransportSecurity to Hebrew (עברית)
# Exported from translatewiki.net
#
# Author: Amire80
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - StrictTransportSecurity\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:10+0000\n"
"Language-Team: Hebrew <https://translatewiki.net/wiki/Portal:he>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:51:41+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: he\n"
"X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid ""
"The Strict Transport Security plugin implements the Strict Transport "
"Security header, improving the security of HTTPS only sites."
msgstr ""
"תוסף אבטחת תעבורה הדוקה מיישם את הכותרת אבטחת תעבורה הדוקה (Strict Transport "
"Security), שמשפת את האבטחה באתרים שפועלים רק ב־HTTPS."


code:
# Translation of StatusNet - StrictTransportSecurity to Interlingua (interlingua)
# Exported from translatewiki.net
#
# Author: McDutchie
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - StrictTransportSecurity\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:10+0000\n"
"Language-Team: Interlingua <https://translatewiki.net/wiki/Portal:ia>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:51:41+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: ia\n"
"X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid ""
"The Strict Transport Security plugin implements the Strict Transport "
"Security header, improving the security of HTTPS only sites."
msgstr ""
"Le plug-in \"Strict Transport Security\" (securitate rigorose de "
"transmission) implementa le capite (header) \"Strict Transport Security\", "
"meliorante le securitate de sitos attingibile per HTTPS sol."


code:
# Translation of StatusNet - StrictTransportSecurity to Macedonian (македонски)
# Exported from translatewiki.net
#
# Author: Bjankuloski06
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - StrictTransportSecurity\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:10+0000\n"
"Language-Team: Macedonian <https://translatewiki.net/wiki/Portal:mk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:51:41+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: mk\n"
"X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\n"
"Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n"

#. TRANS: Plugin description.
msgid ""
"The Strict Transport Security plugin implements the Strict Transport "
"Security header, improving the security of HTTPS only sites."
msgstr ""
"Приклучокот Strict Transport Security става заглавие за строга безбедност "
"при пренос, подобрувајќи ја безбедноста на мреж. места со само HTTPS."


code:
# Translation of StatusNet - StrictTransportSecurity to Dutch (Nederlands)
# Exported from translatewiki.net
#
# Author: Siebrand
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - StrictTransportSecurity\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:10+0000\n"
"Language-Team: Dutch <https://translatewiki.net/wiki/Portal:nl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:51:41+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: nl\n"
"X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid ""
"The Strict Transport Security plugin implements the Strict Transport "
"Security header, improving the security of HTTPS only sites."
msgstr ""
"Implementeert de Strict Transport Security-header, waardoor de beveiliging "
"van sites die alleen HTTPS gebruiken wordt verbeterd."


code:
# Translation of StatusNet - StrictTransportSecurity to Russian (русский)
# Exported from translatewiki.net
#
# Author: Александр Сигачёв
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - StrictTransportSecurity\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:11+0000\n"
"Language-Team: Russian <https://translatewiki.net/wiki/Portal:ru>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:51:41+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: ru\n"
"X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\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: Plugin description.
msgid ""
"The Strict Transport Security plugin implements the Strict Transport "
"Security header, improving the security of HTTPS only sites."
msgstr ""
"Модуль строгой транспортной безопасности реализует заголовок строгой "
"транспортной безопасности, повышающий безопасность HTTPS сайтов."


code:
# Translation of StatusNet - StrictTransportSecurity to Tagalog (Tagalog)
# Exported from translatewiki.net
#
# Author: AnakngAraw
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - StrictTransportSecurity\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:11+0000\n"
"Language-Team: Tagalog <https://translatewiki.net/wiki/Portal:tl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:51:41+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: tl\n"
"X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid ""
"The Strict Transport Security plugin implements the Strict Transport "
"Security header, improving the security of HTTPS only sites."
msgstr ""
"Ipinatutupad ng pampasak na Strict Transport Security ang paulo ng Strict "
"Transport Security, na nagpapainam sa kaligtasan ng mga sityong may HTTPS "
"lamang."


code:
# Translation of StatusNet - StrictTransportSecurity to Ukrainian (українська)
# Exported from translatewiki.net
#
# Author: Boogie
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - StrictTransportSecurity\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:11+0000\n"
"Language-Team: Ukrainian <https://translatewiki.net/wiki/Portal:uk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:51:41+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: uk\n"
"X-Message-Group: #out-statusnet-plugin-stricttransportsecurity\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: Plugin description.
msgid ""
"The Strict Transport Security plugin implements the Strict Transport "
"Security header, improving the security of HTTPS only sites."
msgstr ""
"Додаток Strict Transport Security реалізує режим суворої безпеки, "
"забезпечуючи безпеку лише для https-сайтів."


code:
<?php
/*
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2009-2010, StatusNet, Inc.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

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

/**
 * @package SubMirrorPlugin
 * @maintainer Brion Vibber <brion@status.net>
 */
class SubMirrorPlugin extends Plugin
{
    /**
     * Hook for RouterInitialized event.
     *
     * @param URLMapper $m path-to-action mapper
     * @return boolean hook return
     */
    public function onRouterInitialized(URLMapper $m)
    {
        $m->connect('settings/mirror',
                    array('action' => 'mirrorsettings'));
        $m->connect('settings/mirror/add/:provider',
                    array('action' => 'mirrorsettings'),
                    array('provider' => '[A-Za-z0-9_-]+'));
        $m->connect('settings/mirror/add',
                    array('action' => 'addmirror'));
        $m->connect('settings/mirror/edit',
                    array('action' => 'editmirror'));
        return true;
    }

    function handle($notice)
    {
        // Is anybody mirroring?
        $mirror = new SubMirror();
        $mirror->subscribed = $notice->profile_id;
        if ($mirror->find()) {
            while ($mirror->fetch()) {
                $mirror->repeat($notice);
            }
        }
    }

    function onPluginVersion(&$versions)
    {
        $versions[] = array('name' => 'SubMirror',
                            'version' => GNUSOCIAL_VERSION,
                            'author' => 'Brion Vibber',
                            'homepage' => 'http://status.net/wiki/Plugin:SubMirror',
                            'rawdescription' =>
                            // TRANS: Plugin description.
                            _m('Pull feeds into your timeline!'));

        return true;
    }

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

        common_debug("ACTION NAME = " . $action_name);

        $action->menuItem(common_local_url('mirrorsettings'),
                          // TRANS: SubMirror plugin menu item on user settings page.
                          _m('MENU', 'Mirroring'),
                          // TRANS: SubMirror plugin tooltip for user settings menu item.
                          _m('Configure mirroring of posts from other feeds'),
                          $action_name === 'mirrorsettings');

        return true;
    }

    function onCheckSchema()
    {
        $schema = Schema::get();
        $schema->ensureTable('submirror', SubMirror::schemaDef());

        // @hack until key definition support is merged
        SubMirror::fixIndexes($schema);
        return true;
    }

    /**
     * Set up queue handlers for outgoing hub pushes
     * @param QueueManager $qm
     * @return boolean hook return
     */
    function onEndInitializeQueueManager(QueueManager $qm)
    {
        // After each notice save, check if there's any repeat mirrors.
        $qm->connect('mirror', 'MirrorQueueHandler');
        return true;
    }

    function onStartEnqueueNotice($notice, &$transports)
    {
        $transports[] = 'mirror';
    }

    /**
     * Let the OStatus subscription garbage collection know if we're
     * making use of a remote feed, so it doesn't get dropped out
     * from under us.
     *
     * @param Ostatus_profile $oprofile
     * @param int $count in/out
     * @return mixed hook return value
     */
    function onOstatus_profileSubscriberCount(Ostatus_profile $oprofile, &$count)
    {
        try {
            $profile = $oprofile->localProfile();
            $mirror = new SubMirror();
            $mirror->subscribed = $profile->id;
            if ($mirror->find()) {
                while ($mirror->fetch()) {
                    $count++;
                }
            }
        } catch (NoProfileException $e) {
            // We can't handle this kind of Ostatus_profile since it has no
            // local profile
        }

        return true;
    }

    /**
     * Add a count of mirrored feeds into a user's profile sidebar stats.
     *
     * @param Profile $profile
     * @param array $stats
     * @return boolean hook return value
     */
    function onProfileStats($profile, &$stats)
    {
        $cur = common_current_user();
        if (!empty($cur) && $cur->id == $profile->id) {
            $mirror = new SubMirror();
            $mirror->subscriber = $profile->id;
            $entry = array(
                'id' => 'mirrors',
                // TRANS: Label in profile statistics section, followed by a count.
                'label' => _m('Mirrored feeds'),
                'link' => common_local_url('mirrorsettings'),
                'value' => $mirror->count(),
            );

            $insertAt = count($stats);
            foreach ($stats as $i => $row) {
                if ($row['id'] == 'groups') {
                    // Slip us in after them.
                    $insertAt = $i + 1;
                    break;
                }
            }
            array_splice($stats, $insertAt, 0, array($entry));
        }
        return true;
    }
}


code:
<?php
/**
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2010, StatusNet, Inc.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * PHP version 5
 *
 * @category  Action
 * @package   StatusNet
 * @author    Brion Vibber <brion@status.net>
 * @copyright 2010 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
 * @link      http://status.net/
 */

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

/**
 * Takes parameters:
 *
 *    - feed: a profile ID
 *    - 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
 * @copyright 2010 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
 * @link      http://status.net/
 */
class AddMirrorAction extends BaseMirrorAction
{
    var $feedurl;

    /**
     * Check pre-requisites and instantiate attributes
     *
     * @param Array $args array of arguments (URL, GET, POST)
     *
     * @return boolean success flag
     */
    protected function prepare(array $args=array())
    {
        parent::prepare($args);
        $feedurl = $this->getFeedUrl();
        $this->feedurl = $this->validateFeedUrl($feedurl);
        $this->profile = $this->profileForFeed($this->feedurl);
        return true;
    }

    function getFeedUrl()
    {
        $provider = $this->trimmed('provider');
        switch ($provider) {
        case 'feed':
            return $this->trimmed('feedurl');
        default:
            // TRANS: Exception thrown when a feed provider could not be recognised.
            throw new Exception(_m('Internal form error: Unrecognized feed provider.'));
        }
    }

    protected function saveMirror()
    {
        $this->oprofile->subscribe();
        SubMirror::saveMirror($this->user, $this->profile);
    }
}


code:
<?php
/**
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2010, StatusNet, Inc.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * PHP version 5
 *
 * @category  Action
 * @package   StatusNet
 * @author    Brion Vibber <brion@status.net>
 * @copyright 2010 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
 * @link      http://status.net/
 */

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

/**
 * Takes parameters:
 *
 *    - feed: a profile ID
 *    - 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
 * @copyright 2010 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
 * @link      http://status.net/
 */
abstract class BaseMirrorAction extends Action
{
    var $user;
    var $profile;

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

    protected function validateFeedUrl($url)
    {
        if (common_valid_http_url($url)) {
            return $url;
        } else {
            // TRANS: Client error displayed when entering an invalid URL for a feed.
            // TRANS: %s is the invalid feed URL.
            $this->clientError(sprintf(_m("Invalid feed URL: %s."), $url));
        }
    }

    protected function validateProfile($id)
    {
        $id = intval($id);
        $profile = Profile::getKV('id', $id);
        if ($profile && $profile->id != $this->user->id) {
            return $profile;
        }
        // TRANS: Error message returned to user when setting up feed mirroring,
        // TRANS: but we were unable to resolve the given URL to a working feed.
        $this->clientError(_m('Invalid profile for mirroring.'));
    }

    /**
     *
     * @param string $url
     * @return Profile
     */
    protected function profileForFeed($url)
    {
        try {
            // Maybe we got a web page?
            $oprofile = Ostatus_profile::ensureProfileURL($url);
        } catch (Exception $e) {
            // Direct feed URL?
            $oprofile = Ostatus_profile::ensureFeedURL($url);
        }
        if ($oprofile->isGroup()) {
            // TRANS: Client error displayed when trying to mirror a GNU social group feed.
            $this->clientError(_m('Cannot mirror a GNU social group at this time.'));
        }
        $this->oprofile = $oprofile; // @todo FIXME: ugly side effect :D
        return $oprofile->localProfile();
    }

    /**
     * @todo FIXME: none of this belongs in end classes
     * this stuff belongs in shared code!
     */
    function sharedBoilerplate()
    {
        // Only allow POST requests
        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
            // TRANS: Client error displayed when trying to use another method than 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 does not match or is not given.
            $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.'));
        }
        return true;
    }

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

        if ($this->boolean('ajax')) {
            $this->startHTML('text/xml;charset=utf-8');
            $this->elementStart('head');
            // TRANS: Page title for subscribed feed mirror.
            $this->element('title', null, _m('Subscribed'));
            $this->elementEnd('head');
            $this->elementStart('body');
            $unsubscribe = new EditMirrorForm($this, $this->profile);
            $unsubscribe->show();
            $this->elementEnd('body');
            $this->endHTML();
        } else {
            $url = common_local_url('mirrorsettings');
            common_redirect($url, 303);
        }
    }

    abstract protected function saveMirror();
}


code:
<?php
/**
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2010, StatusNet, Inc.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * PHP version 5
 *
 * @category  Action
 * @package   StatusNet
 * @author    Brion Vibber <brion@status.net>
 * @copyright 2010 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
 * @link      http://status.net/
 */

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

/**
 * Takes parameters:
 *
 *    - feed: a profile ID
 *    - 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
 * @copyright 2010 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
 * @link      http://status.net/
 */
class EditMirrorAction extends BaseMirrorAction
{
    /**
     * Check pre-requisites and instantiate attributes
     *
     * @param Array $args array of arguments (URL, GET, POST)
     *
     * @return boolean success flag
     */
    protected function prepare(array $args=array())
    {
        parent::prepare($args);

        $this->profile = $this->validateProfile($this->trimmed('profile'));

        $this->mirror = SubMirror::pkeyGet(array('subscriber' => $this->user->id,
                                                 'subscribed' => $this->profile->id));

        if (!$this->mirror instanceof SubMirror) {
            // TRANS: Client error displayed when trying to edit an object that is not a feed mirror.
            $this->clientError(_m('Requested invalid profile to edit.'));
        }

        $this->style = $this->validateStyle($this->trimmed('style'));

        // DO NOT change to $this->boolean(), it will be wrong.
        // We're checking for the presence of the setting, not its value.
        $this->delete = (bool)$this->arg('delete');

        return true;
    }

    protected function validateStyle($style)
    {
        $allowed = array('repeat', 'copy');
        if (in_array($style, $allowed)) {
            return $style;
        } else {
            // TRANS: Client error displayed when providing invalid input when editing a mirror.
            $this->clientError(_m('Bad form data.'));
        }
    }

    protected function saveMirror()
    {
        $mirror = SubMirror::getMirror($this->user, $this->profile);
        if (!$mirror) {
            // TRANS: Client error thrown when a mirror request is made and no result is retrieved.
            $this->clientError(_m('The mirror request failed, because no result was retrieved.'));
        }

        if ($this->delete) {
            $mirror->delete();
            $oprofile = Ostatus_profile::getKV('profile_id', $this->profile->id);
            if ($oprofile) {
                $oprofile->garbageCollect();
            }
        } else if ($this->style != $mirror->style) {
            $orig = clone($mirror);
            $mirror->style = $this->style;
            $mirror->modified = common_sql_now();
            $mirror->update($orig);
        }
    }
}


code:
<?php
/**
 * StatusNet, the distributed open-source microblogging tool
 *
 * PHP version 5
 *
 * LICENCE: This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @category  Plugins
 * @package   StatusNet
 * @author    Brion Vibber <brion@status.net>
 * @copyright 2010 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link      http://status.net/
 */

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

class MirrorSettingsAction extends SettingsAction
{
    /**
     * Title of the page
     *
     * @return string Page title
     */
    function title()
    {
        // TRANS: Page title.
        return _m('Feed mirror settings');
    }

    /**
     * Instructions for use
     *
     * @return string Instructions for use
     */

    function getInstructions()
    {
        // TRANS: Page instructions.
        return _m('You can mirror updates from many RSS and Atom feeds ' .
                  'into your GNU social timeline!');
    }

    /**
     * Show the form for OpenID management
     *
     * We have one form with a few different submit buttons to do different things.
     *
     * @return void
     */
    function showContent()
    {
        $user = common_current_user();
        $provider = $this->trimmed('provider');
        if ($provider) {
            $this->showAddFeedForm($provider);
        } else {
            $this->elementStart('div', array('id' => 'add-mirror'));
            $this->showAddWizard();
            $this->elementEnd('div');

            $mirror = new SubMirror();
            $mirror->subscriber = $user->id;
            if ($mirror->find()) {
                while ($mirror->fetch()) {
                    $this->showFeedForm($mirror);
                }
            }
        }
    }

    function showAddWizard()
    {
        $form = new AddMirrorWizard($this);
        $form->show();
    }

    function showFeedForm($mirror)
    {
        $profile = Profile::getKV('id', $mirror->subscribed);
        if ($profile) {
            $form = new EditMirrorForm($this, $profile);
            $form->show();
        }
    }

    function showAddFeedForm()
    {
        switch ($this->arg('provider')) {
        case 'statusnet':
            break;
        case 'wordpress':
            break;
        case 'linkedin':
            break;
        case 'feed':
        default:
            $form = new AddMirrorForm($this);
        }
        $form->show();
    }

    /**
     *
     * @param array $args
     *
     * @todo move the ajax display handling to common code
     */
    function handle($args)
    {
        if ($this->boolean('ajax')) {
            $this->startHTML('text/xml;charset=utf-8');
            $this->elementStart('head');
            // TRANS: Title for page with form to add a mirror feed provider on.
            $this->element('title', null, _m('Provider add'));
            $this->elementEnd('head');
            $this->elementStart('body');

            $this->showAddFeedForm();

            $this->elementEnd('body');
            $this->endHTML();
        } else {
            return parent::handle($args);
        }
    }
    /**
     * Handle a POST request
     *
     * Muxes to different sub-functions based on which button was pushed
     *
     * @return void
     */
    function handlePost()
    {
    }

    /**
     * Show the local navigation menu
     *
     * This is the same for all settings, so we show it here.
     *
     * @return void
     */
    function showLocalNav()
    {
        $menu = new SettingsNav($this);
        $menu->show();
    }

    function showScripts()
    {
        parent::showScripts();
        $this->script('plugins/SubMirror/js/mirrorsettings.js');
    }

    function showStylesheets()
    {
        parent::showStylesheets();
        $this->cssLink('plugins/SubMirror/css/mirrorsettings.css');
    }
}


code:
<?php
/*
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2010, StatusNet, Inc.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * @package SubMirrorPlugin
 * @maintainer Brion Vibber <brion@status.net>
 */

class SubMirror extends Managed_DataObject
{
    public $__table = 'submirror';

    public $subscriber;
    public $subscribed;

    public $style;

    public $created;
    public $modified;

    /**
     * return table definition for DB_DataObject
     *
     * DB_DataObject needs to know something about the table to manipulate
     * instances. This method provides all the DB_DataObject needs to know.
     *
     * @return array array of column definitions
     */

    function table()
    {
        return array('subscriber' =>  DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL,
                     'subscribed' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL,

                     'style' => DB_DATAOBJECT_STR,

                     'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL,
                     'modified' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL);
    }

    static function schemaDef()
    {
        // @fixme need a reverse key on (subscribed, subscriber) as well
        return array(new ColumnDef('subscriber', 'integer',
                                   null, false, 'PRI'),
                     new ColumnDef('subscribed', 'integer',
                                   null, false, 'PRI'),

                     new ColumnDef('style', 'varchar',
                                   16, true),

                     new ColumnDef('created', 'datetime',
                                   null, false),
                     new ColumnDef('modified', 'datetime',
                                   null, false));
    }

    /**
     * Temporary hack to set up the compound index, since we can't do
     * it yet through regular Schema interface. (Coming for 1.0...)
     *
     * @param Schema $schema
     * @return void
     */
    static function fixIndexes($schema)
    {
        try {
            $schema->createIndex('submirror', array('subscribed', 'subscriber'));
        } catch (Exception $e) {
            common_log(LOG_ERR, __METHOD__ . ': ' . $e->getMessage());
        }
    }

    /**
     * return key definitions for DB_DataObject
     *
     * DB_DataObject needs to know about keys that the table has; this function
     * defines them.
     *
     * @return array key definitions
     */

    function keys()
    {
        return array_keys($this->keyTypes());
    }

    /**
     * return key definitions for Memcached_DataObject
     *
     * Our caching system uses the same key definitions, but uses a different
     * method to get them.
     *
     * @return array key definitions
     */

    function keyTypes()
    {
        // @todo FIXME keys
        // need a sane key for reverse lookup too
        return array('subscriber' => 'K', 'subscribed' => 'K');
    }

    function sequenceKey()
    {
        return array(false, false, false);
    }

    /**
     * @param Profile $subscribed
     * @param Profile $subscribed
     * @return SubMirror
     * @throws ServerException
     */
    public static function saveMirror($subscriber, $subscribed, $style='repeat')
    {
        // @fixme make sure they're subscribed!
        $mirror = new SubMirror();

        $mirror->subscriber = $subscriber->id;
        $mirror->subscribed = $subscribed->id;
        $mirror->style = $style;

        $mirror->created = common_sql_now();
        $mirror->modified = common_sql_now();
        $mirror->insert();

        return $mirror;
    }

    /**
     * @param Notice $notice
     * @return mixed Notice on successful mirroring, boolean if not
     */
    public function mirrorNotice(Notice $notice)
    {
        $profile = Profile::getKV('id', $this->subscriber);
        if (!($profile instanceof Profile)) {
            common_log(LOG_ERR, "SubMirror plugin skipping auto-repeat of notice $notice->id for missing user $profile->id");
            return false;
        }

        if ($this->style == 'copy') {
            return $this->copyNotice($profile, $notice);
        } else { // default to repeat mode
            return $this->repeatNotice($profile, $notice);
        }
    }

    /**
     * Mirror a notice using StatusNet's repeat functionality.
     * This retains attribution within the site, and other nice things,
     * but currently ends up looking like 'RT @foobar bla bla' when
     * bridged out over OStatus or TwitterBridge.
     *
     * @param Notice $notice
     * @return mixed Notice on successful repeat, true if already repeated, false on failure
     */
    protected function repeatNotice(Profile $profile, Notice $notice)
    {
        if($profile->hasRepeated($notice)) {
            common_log(LOG_INFO, "SubMirror plugin skipping auto-repeat of notice $notice->id for user $profile->id; already repeated.");
            return true;
        } else {
            common_log(LOG_INFO, "SubMirror plugin auto-repeating notice $notice->id for $profile->id");
            return $notice->repeat($profile, 'mirror');
        }
    }

    /**
     * Mirror a notice by emitting a new notice with the same contents.
     * Kind of dirty, but if pulling an external data feed into an account
     * that may be what you want.
     *
     * @param Notice $notice
     * @return mixed Notice on successful repeat, true if already repeated, false on failure
     */
    protected function copyNotice($profile, $notice)
    {
        $options = array('is_local' => Notice::LOCAL_PUBLIC,
                         'url' => $notice->getUrl(), // pass through the foreign link...
                         'rendered' => $notice->rendered);

        $saved = Notice::saveNew($profile->id,
                                 $notice->content,
                                 'feed',
                                 $options);
        return $saved;
    }

    /**
     * Get the mirroring setting for a pair of profiles, if existing.
     *
     * @param Profile $subscriber
     * @param Profile $subscribed
     * @return mixed Profile or empty
     */
    public static function getMirror($subscriber, $subscribed)
    {
        return self::pkeyGet(array('subscriber' => $subscriber->id,
                                   'subscribed' => $subscribed->id));
    }
}


code:
/* undo insane stuff from core styles */
#add-mirror-wizard img {
    display: inline;
}

/* we need #something to override most of the #content crap */

#add-mirror-wizard {
    margin-left: 20px;
    margin-right: 20px;
}

#add-mirror-wizard .provider-list table {
    width: 100%;
}

#add-mirror-wizard .provider-heading img {
    vertical-align: middle;
}
#add-mirror-wizard .provider-heading {
    cursor: pointer;
}
#add-mirror-wizard .provider-detail fieldset {
    margin-top: 8px; /* hack */
    margin-bottom: 8px; /* hack */
}


code:
<?php
/**
 * StatusNet, the distributed open-source microblogging tool
 * PHP version 5
 *
 * LICENCE: This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @package   StatusNet
 * @copyright 2010 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link      http://status.net/
 */

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

class AddMirrorForm extends Form
{
    /**
     * Name of the form
     *
     * Sub-classes should overload this with the name of their form.
     *
     * @return void
     */
    function formLegend()
    {
    }

    /**
     * Visible or invisible data elements
     *
     * Display the form fields that make up the data of the form.
     * Sub-classes should overload this to show their data.
     *
     * @return void
     */
    function formData()
    {
        $this->out->hidden('provider', 'feed');
        $this->out->elementStart('fieldset');

        $this->out->elementStart('ul');

        $this->li();
        $this->doInput('addmirror-feedurl',
                       'feedurl',
                       // TRANS: Field label.
                       _m('Web page or feed URL:'),
                       $this->out->trimmed('feedurl'));
        $this->unli();

        $this->li();
        // TRANS: Button text for adding a feed.
        $this->out->submit('addmirror-save', _m('BUTTON','Add feed'));
        $this->unli();
        $this->out->elementEnd('ul');
        $this->out->elementEnd('fieldset');
    }

    protected function doInput($id, $name, $label, $value=null, $instructions=null)
    {
        $this->out->element('label', array('for' => $id), $label);
        $attrs = array('name' => $name,
                       'type' => 'text',
                       'id' => $id,
                       'style' => 'width: 80%');
        if ($value) {
            $attrs['value'] = $value;
        }
        $this->out->element('input', $attrs);
        if ($instructions) {
            $this->out->element('p', 'form_guide', $instructions);
        }
    }

    /**
     * Buttons for form actions
     *
     * Submit and cancel buttons (or whatever)
     * Sub-classes should overload this to show their own buttons.
     *
     * @return void
     */
    function formActions()
    {
    }

    /**
     * ID of the form
     *
     * Should be unique on the page. Sub-classes should overload this
     * to show their own IDs.
     *
     * @return string ID of the form
     */
    function id()
    {
        return 'add-mirror-form';
    }

    /**
     * Action of the form.
     *
     * URL to post to. Should be overloaded by subclasses to give
     * somewhere to post to.
     *
     * @return string URL to post to
     */
    function action()
    {
        return common_local_url('addmirror');
    }

    /**
     * Class of the form.
     *
     * @return string the form's class
     */
    function formClass()
    {
        return 'form_settings';
    }
}


code:
<?php
/**
 * StatusNet, the distributed open-source microblogging tool
 * PHP version 5
 *
 * LICENCE: This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @package   StatusNet
 * @copyright 2010 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link      http://status.net/
 */

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

class EditMirrorForm extends Form
{
    function __construct($action, $profile)
    {
        parent::__construct($action);

        $this->profile = clone($profile);
        $this->user = common_current_user();
        $this->mirror = SubMirror::pkeyGet(array('subscriber' => $this->user->id,
                                                 'subscribed' => $this->profile->id));
    }

    /**
     * Name of the form
     *
     * Sub-classes should overload this with the name of their form.
     *
     * @return void
     */
    function formLegend()
    {
    }

    /**
     * Visible or invisible data elements
     *
     * Display the form fields that make up the data of the form.
     * Sub-classes should overload this to show their data.
     *
     * @return void
     */
    function formData()
    {
        $this->out->elementStart('fieldset');

        $this->out->hidden('profile', $this->profile->id);

        $this->out->elementStart('div', array('style' => 'float: left; width: 80px;'));
        $img = $this->profile->avatarUrl(AVATAR_STREAM_SIZE);
        $feed = $this->getFeed($this->profile);
        $this->out->elementStart('a', array('href' => $this->profile->profileurl));
        $this->out->element('img', array('src' => $img, 'style' => 'float: left'));
        $this->out->elementEnd('a');
        $this->out->elementEnd('div');

        $this->out->elementStart('div', array('style' => 'margin-left: 80px; margin-right: 20px'));
        $this->out->elementStart('p');
        $this->out->elementStart('div');
        $this->out->element('a', array('href' => $this->profile->profileurl), $this->profile->getBestName());
        $this->out->elementEnd('div');
        $this->out->elementStart('div');
        if ($feed) {
            // XXX: Why the hard coded space?
            // TRANS: Field label (URL expectected).
            $this->out->text(_m('LABEL', 'Remote feed:') . ' ');
            //$this->out->element('a', array('href' => $feed), $feed);
            $this->out->element('input', array('value' => $feed, 'readonly' => 'readonly', 'style' => 'width: 100%'));
        } else {
            // TRANS: Field label.
            $this->out->text(_m('LABEL', 'Local user'));
        }
        $this->out->elementEnd('div');
        $this->out->elementEnd('p');

        $this->out->elementStart('fieldset', array('style' => 'margin-top: 20px'));
        // TRANS: Fieldset legend for feed mirror setting.
        $this->out->element('legend', false, _m('Mirroring style'));

        // TRANS: Feed mirror style (radio button option).
        $styles = array('repeat' => _m('Repeat: reference the original user\'s post (sometimes shows as "RT @blah")'),
                        // TRANS: Feed mirror style (radio button option).
                        'copy' => _m('Repost the content under my account'));
        foreach ($styles as $key => $label) {
            $this->out->elementStart('div');
            $attribs = array('type' => 'radio',
                             'value' => $key,
                             'name' => 'style',
                             'id' => $this->id() . '-style');
            if ($key == $this->mirror->style || ($key == 'repeat' && empty($this->mirror->style))) {
                $attribs['checked'] = 'checked';
            }
            $this->out->element('input', $attribs);
            $this->out->element('span', false, $label); // @todo FIXME: should be label, but the styles muck it up for now
            $this->out->elementEnd('div');

        }
        $this->out->elementEnd('fieldset');

        $this->out->elementStart('div');
        // TRANS: Button text to save feed mirror settings.
        $this->out->submit($this->id() . '-save', _m('BUTTON','Save'));
        $this->out->element('input', array('type' => 'submit',
                                           // TRANS: Button text to stop mirroring a feed.
                                           'value' => _m('BUTTON','Stop mirroring'),
                                           'name' => 'delete',
                                           'class' => 'submit'));
        $this->out->elementEnd('div');

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

    private function getFeed($profile)
    {
        // Ok this is a bit of a hack. ;)
        if (class_exists('Ostatus_profile')) {
            $oprofile = Ostatus_profile::getKV('profile_id', $profile->id);
            if ($oprofile) {
                return $oprofile->feeduri;
            }
        }
        var_dump('wtf');
        return false;
    }

    /**
     * ID of the form
     *
     * Should be unique on the page. Sub-classes should overload this
     * to show their own IDs.
     *
     * @return string ID of the form
     */
    function id()
    {
        return 'edit-mirror-form-' . $this->profile->id;
    }

    /**
     * Action of the form.
     *
     * URL to post to. Should be overloaded by subclasses to give
     * somewhere to post to.
     *
     * @return string URL to post to
     */
    function action()
    {
        return common_local_url('editmirror');
    }

    /**
     * Class of the form.
     *
     * @return string the form's class
     */
    function formClass()
    {
        return 'form_settings';
    }
}


code:
$(function() {
    /**
     * Append 'ajax=1' parameter onto URL.
     */
    function ajaxize(url) {
        if (url.indexOf('?') == '-1') {
            return url + '?ajax=1';
        } else {
            return url + '&ajax=1';
        }
    }

    var addMirror = $('#add-mirror');
    var wizard = $('#add-mirror-wizard');
    if (wizard.length > 0) {
        var list = wizard.find('.provider-list');
        var providers = list.find('.provider-heading');
        providers.click(function(event) {
            console.log(this);
            var targetUrl = $(this).find('a').attr('href');
            if (targetUrl) {
                // Make sure we don't accidentally follow the direct link
                event.preventDefault();

                var node = this;
                function showNew() {
                    var detail = $('

').insertAfter(node);
                    detail.load(ajaxize(targetUrl), function(responseText, testStatus, xhr) {
                        detail.slideDown('fast', function() {
                            detail.find('input[type="text"]').focus();
                        });
                    });
                }

                var old = addMirror.find('.provider-detail');
                if (old.length) {
                    old.slideUp('fast', function() {
                        old.remove();
                        showNew();
                    });
                } else {
                    showNew();
                }
            }
        });
    }
});


code:
<?php
/**
 * StatusNet, the distributed open-source microblogging tool
 * PHP version 5
 *
 * LICENCE: This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @package   StatusNet
 * @copyright 2010-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);
}

class AddMirrorWizard extends Widget
{
    /**
     * Name of the form
     *
     * Sub-classes should overload this with the name of their form.
     *
     * @return void
     */
    function formLegend()
    {
    }

    /**
     * Visible or invisible data elements
     *
     * Display the form fields that make up the data of the form.
     * Sub-classes should overload this to show their data.
     *
     * @return void
     */
    function show()
    {
        $this->out->elementStart('div', array('id' => 'add-mirror-wizard'));

        $providers = $this->providers();
        $this->showProviders($providers);

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

    function providers()
    {
        return array(
            /*
            // We could accept hostname & username combos here, or
            // webfingery combinations as for remote users.
            array(
                'id' => 'gnusocial',
                'name' => _m('GNU social'),
            ),
             */
            /*
            // WordPress was on our list some whiles ago, but not sure
            // what we can actually do here. Search on Wordpress.com hosted
            // sites, or ?
            array(
                'id' => 'wordpress',
                'name' => _m('WordPress'),
            ),
             */
            array(
                'id' => 'feed',
                // TRANS: Name for possible feed provider.
                'name' => _m('RSS or Atom feed'),
            ),
        );
    }

    function showProviders(array $providers)
    {
        $out = $this->out;

        $out->elementStart('div', 'provider-list');
        // TRANS: Heading for feed mirroring selection form.
        $out->element('h2', null, _m('Select a feed provider'));
        $out->elementStart('table');
        foreach ($providers as $provider) {
            $icon = common_path('plugins/SubMirror/images/providers/' . $provider['id'] . '.png');
            $targetUrl = common_local_url('mirrorsettings', array('provider' => $provider['id']));

            $out->elementStart('tr', array('class' => 'provider'));
            $out->elementStart('td');

            $out->elementStart('div', 'provider-heading');
            $out->element('img', array('src' => $icon));
            $out->element('a', array('href' => $targetUrl), $provider['name']);
            $out->elementEnd('div');

            $out->elementEnd('td');
            $out->elementEnd('tr');
        }
        $out->elementEnd('table');
        $out->elementEnd('div');
    }

    /**
     * Buttons for form actions
     *
     * Submit and cancel buttons (or whatever)
     * Sub-classes should overload this to show their own buttons.
     *
     * @return void
     */
    function formActions()
    {
    }

    /**
     * ID of the form
     *
     * Should be unique on the page. Sub-classes should overload this
     * to show their own IDs.
     *
     * @return string ID of the form
     */
    function id()
    {
        return 'add-mirror-wizard';
    }

    /**
     * Action of the form.
     *
     * URL to post to. Should be overloaded by subclasses to give
     * somewhere to post to.
     *
     * @return string URL to post to
     */
    function action()
    {
        return common_local_url('addmirror');
    }

    /**
     * Class of the form.
     *
     * @return string the form's class
     */
    function formClass()
    {
        return 'form_settings';
    }
}


code:
<?php
/*
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2010, StatusNet, Inc.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * Check for subscription mirroring options on each newly seen post!
 *
 * @package SubMirror
 * @author Brion Vibber <brion@status.net>
 */
class MirrorQueueHandler extends QueueHandler
{
    function transport()
    {
        return 'mirror';
    }

    function handle($notice)
    {
        $mirror = new SubMirror();
        $mirror->subscribed = $notice->profile_id;
        if ($mirror->find()) {
            while ($mirror->fetch()) {
                try {
                    $mirror->mirrorNotice($notice);
                } catch (Exception $e) {
                    common_log(LOG_ERR, "Exception trying to mirror notice $notice->id " .
                                        "for subscriber $mirror->subscriber ($mirror->style): " .
                                        $e->getMessage());
                }
            }
        }
        return true;
    }
}


code:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#. TRANS: Client error displayed when entering an invalid URL for a feed.
#. TRANS: %s is the invalid feed URL.
#: actions/basemirror.php:73
#, php-format
msgid "Invalid feed URL: %s."
msgstr ""

#. TRANS: Error message returned to user when setting up feed mirroring,
#. TRANS: but we were unable to resolve the given URL to a working feed.
#: actions/basemirror.php:86
msgid "Invalid profile for mirroring."
msgstr ""

#. TRANS: Client error displayed when trying to mirror a StatusNet group feed.
#: actions/basemirror.php:105
msgid "Cannot mirror a StatusNet group at this time."
msgstr ""

#. TRANS: Client error displayed when trying to use another method than POST.
#: actions/basemirror.php:120
msgid "This action only accepts POST requests."
msgstr ""

#. TRANS: Client error displayed when the session token does not match or is not given.
#: actions/basemirror.php:129
msgid "There was a problem with your session token. Try again, please."
msgstr ""

#. TRANS: Error message displayed when trying to perform an action that requires a logged in user.
#: actions/basemirror.php:140
msgid "Not logged in."
msgstr ""

#. TRANS: Page title for subscribed feed mirror.
#: actions/basemirror.php:164
msgid "Subscribed"
msgstr ""

#. TRANS: Client error displayed when trying to edit an object that is not a feed mirror.
#: actions/editmirror.php:68
msgid "Requested invalid profile to edit."
msgstr ""

#. TRANS: Client error displayed when providing invalid input when editing a mirror.
#: actions/editmirror.php:87
msgid "Bad form data."
msgstr ""

#. TRANS: Client error thrown when a mirror request is made and no result is retrieved.
#: actions/editmirror.php:96
msgid "The mirror request failed, because no result was retrieved."
msgstr ""

#. TRANS: Exception thrown when a feed provider could not be recognised.
#: actions/addmirror.php:80
msgid "Internal form error: Unrecognized feed provider."
msgstr ""

#. TRANS: Exception thrown when a subscribing to a feed fails.
#: actions/addmirror.php:90
msgid "Could not subscribe to feed."
msgstr ""

#. TRANS: Page title.
#: actions/mirrorsettings.php:42
msgid "Feed mirror settings"
msgstr ""

#. TRANS: Page instructions.
#: actions/mirrorsettings.php:54
msgid ""
"You can mirror updates from many RSS and Atom feeds into your StatusNet "
"timeline!"
msgstr ""

#. TRANS: Title for page with form to add a mirror feed provider on.
#: actions/mirrorsettings.php:133
msgid "Provider add"
msgstr ""

#. TRANS: Plugin description.
#: SubMirrorPlugin.php:94
msgid "Pull feeds into your timeline!"
msgstr ""

#. TRANS: SubMirror plugin menu item on user settings page.
#: SubMirrorPlugin.php:114
msgctxt "MENU"
msgid "Mirroring"
msgstr ""

#. TRANS: SubMirror plugin tooltip for user settings menu item.
#: SubMirrorPlugin.php:116
msgid "Configure mirroring of posts from other feeds"
msgstr ""

#. TRANS: Label in profile statistics section, followed by a count.
#: SubMirrorPlugin.php:193
msgid "Mirrored feeds"
msgstr ""

#. TRANS: Field label.
#: lib/addmirrorform.php:61
msgid "Web page or feed URL:"
msgstr ""

#. TRANS: Button text for adding a feed.
#. TRANS: Button text for adding a Twitter feed mirror.
#: lib/addmirrorform.php:67 lib/addtwittermirrorform.php:57
msgctxt "BUTTON"
msgid "Add feed"
msgstr ""

#. TRANS: Field label.
#: lib/addtwittermirrorform.php:51
msgid "Twitter username:"
msgstr ""

#. TRANS: Field label (URL expectected).
#: lib/editmirrorform.php:84
msgctxt "LABEL"
msgid "Remote feed:"
msgstr ""

#. TRANS: Field label.
#: lib/editmirrorform.php:89
msgctxt "LABEL"
msgid "Local user"
msgstr ""

#. TRANS: Fieldset legend for feed mirror setting.
#: lib/editmirrorform.php:96
msgid "Mirroring style"
msgstr ""

#. TRANS: Feed mirror style (radio button option).
#: lib/editmirrorform.php:99
msgid ""
"Repeat: reference the original user's post (sometimes shows as \"RT @blah\")"
msgstr ""

#. TRANS: Feed mirror style (radio button option).
#: lib/editmirrorform.php:101
msgid "Repost the content under my account"
msgstr ""

#. TRANS: Button text to save feed mirror settings.
#: lib/editmirrorform.php:121
msgctxt "BUTTON"
msgid "Save"
msgstr ""

#. TRANS: Button text to stop mirroring a feed.
#: lib/editmirrorform.php:124
msgctxt "BUTTON"
msgid "Stop mirroring"
msgstr ""

#. TRANS: Name for possible feed provider.
#: lib/addmirrorwizard.php:77
msgid "Twitter"
msgstr ""

#. TRANS: Name for possible feed provider.
#: lib/addmirrorwizard.php:111
msgid "RSS or Atom feed"
msgstr ""

#. TRANS: Heading for feed mirroring selection form.
#: lib/addmirrorwizard.php:122
msgid "Select a feed provider"
msgstr ""


code:
# Translation of StatusNet - SubMirror to Breton (Brezhoneg)
# Expored from translatewiki.net
#
# Author: Y-M D
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - SubMirror\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-15 00:20+0000\n"
"PO-Revision-Date: 2011-01-15 00:24:49+0000\n"
"Language-Team: Breton <http://translatewiki.net/wiki/Portal:br>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-01-14 13:22:17+0000\n"
"X-Generator: MediaWiki 1.18alpha (r80364); Translate extension (2010-09-17)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: br\n"
"X-Message-Group: #out-statusnet-plugin-submirror\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"

#: SubMirrorPlugin.php:90
msgid "Pull feeds into your timeline!"
msgstr ""

#. TRANS: SubMirror plugin menu item on user settings page.
#: SubMirrorPlugin.php:109
msgctxt "MENU"
msgid "Mirroring"
msgstr ""

#. TRANS: SubMirror plugin tooltip for user settings menu item.
#: SubMirrorPlugin.php:111
msgid "Configure mirroring of posts from other feeds"
msgstr ""

#: lib/editmirrorform.php:83
msgctxt "LABEL"
msgid "Remote feed:"
msgstr ""

#: lib/editmirrorform.php:87
msgctxt "LABEL"
msgid "Local user"
msgstr "Implijer lec'hel"

#: lib/editmirrorform.php:93
msgid "Mirroring style"
msgstr ""

#: lib/editmirrorform.php:95
msgid ""
"Repeat: reference the original user's post (sometimes shows as 'RT @blah')"
msgstr ""

#: lib/editmirrorform.php:96
msgid "Repost the content under my account"
msgstr ""

#: lib/editmirrorform.php:115
msgid "Save"
msgstr "Enrollañ"

#: lib/editmirrorform.php:117
msgid "Stop mirroring"
msgstr ""

#: lib/addmirrorform.php:59
msgid "Web page or feed URL:"
msgstr ""

#: lib/addmirrorform.php:64
msgctxt "BUTTON"
msgid "Add feed"
msgstr ""

#: actions/basemirror.php:71
msgid "Invalid feed URL."
msgstr ""

#. TRANS: Error message returned to user when setting up feed mirroring, but we were unable to resolve the given URL to a working feed.
#: actions/basemirror.php:83
msgid "Invalid profile for mirroring."
msgstr ""

#: actions/basemirror.php:101
msgid "Can't mirror a StatusNet group at this time."
msgstr ""

#: actions/basemirror.php:115
msgid "This action only accepts POST requests."
msgstr ""

#: actions/basemirror.php:123
msgid "There was a problem with your session token. Try again, please."
msgstr ""

#: actions/basemirror.php:133
msgid "Not logged in."
msgstr "Nann-kevreet."

#: actions/basemirror.php:156
msgid "Subscribed"
msgstr "Koumanantet"

#: actions/editmirror.php:68
msgid "Requested invalid profile to edit."
msgstr ""

#: actions/editmirror.php:86
msgid "Bad form data."
msgstr ""

#. TRANS: Client error thrown when a mirror request is made and no result is retrieved.
#: actions/editmirror.php:95
msgid "Requested edit of missing mirror."
msgstr ""

#: actions/addmirror.php:72
msgid "Could not subscribe to feed."
msgstr ""

#. TRANS: Title.
#: actions/mirrorsettings.php:42
msgid "Feed mirror settings"
msgstr ""

#. TRANS: Instructions.
#: actions/mirrorsettings.php:54
msgid ""
"You can mirror updates from many RSS and Atom feeds into your StatusNet "
"timeline!"
msgstr ""


code:
# Translation of StatusNet - SubMirror to Catalan (català)
# Exported from translatewiki.net
#
# Author: Toniher
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - SubMirror\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:11+0000\n"
"Language-Team: Catalan <https://translatewiki.net/wiki/Portal:ca>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-19 11:23:33+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: ca\n"
"X-Message-Group: #out-statusnet-plugin-submirror\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Client error displayed when entering an invalid URL for a feed.
#. TRANS: %s is the invalid feed URL.
#, php-format
msgid "Invalid feed URL: %s."
msgstr "L'URL del canal no és vàlid: %s."

#. TRANS: Error message returned to user when setting up feed mirroring,
#. TRANS: but we were unable to resolve the given URL to a working feed.
msgid "Invalid profile for mirroring."
msgstr ""

#. TRANS: Client error displayed when trying to mirror a StatusNet group feed.
msgid "Cannot mirror a StatusNet group at this time."
msgstr ""

#. TRANS: Client error displayed when trying to use another method than POST.
msgid "This action only accepts POST requests."
msgstr ""

#. TRANS: Client error displayed when the session token does not match or is not given.
msgid "There was a problem with your session token. Try again, please."
msgstr ""

#. TRANS: Error message displayed when trying to perform an action that requires a logged in user.
msgid "Not logged in."
msgstr "No s'ha iniciat una sessió."

#. TRANS: Page title for subscribed feed mirror.
msgid "Subscribed"
msgstr "Subscrit"

#. TRANS: Client error displayed when trying to edit an object that is not a feed mirror.
msgid "Requested invalid profile to edit."
msgstr ""

#. TRANS: Client error displayed when providing invalid input when editing a mirror.
msgid "Bad form data."
msgstr ""

#. TRANS: Client error thrown when a mirror request is made and no result is retrieved.
msgid "The mirror request failed, because no result was retrieved."
msgstr ""

#. TRANS: Exception thrown when a feed provider could not be recognised.
msgid "Internal form error: Unrecognized feed provider."
msgstr ""

#. TRANS: Exception thrown when a subscribing to a feed fails.
msgid "Could not subscribe to feed."
msgstr "No s'ha pogut subscriure al canal."

#. TRANS: Page title.
msgid "Feed mirror settings"
msgstr ""

#. TRANS: Page instructions.
msgid ""
"You can mirror updates from many RSS and Atom feeds into your StatusNet "
"timeline!"
msgstr ""

#. TRANS: Title for page with form to add a mirror feed provider on.
msgid "Provider add"
msgstr ""

#. TRANS: Plugin description.
msgid "Pull feeds into your timeline!"
msgstr "Publica canals en la vostra línia temporal!"

#. TRANS: SubMirror plugin menu item on user settings page.
msgctxt "MENU"
msgid "Mirroring"
msgstr ""

#. TRANS: SubMirror plugin tooltip for user settings menu item.
msgid "Configure mirroring of posts from other feeds"
msgstr ""

#. TRANS: Label in profile statistics section, followed by a count.
msgid "Mirrored feeds"
msgstr ""

#. TRANS: Field label.
msgid "Web page or feed URL:"
msgstr "Pàgina web o canal URL:"

#. TRANS: Button text for adding a feed.
#. TRANS: Button text for adding a Twitter feed mirror.
msgctxt "BUTTON"
msgid "Add feed"
msgstr "Afegeix un canal"

#. TRANS: Field label.
msgid "Twitter username:"
msgstr "Nom d'usuari al Twitter:"

#. TRANS: Field label (URL expectected).
msgctxt "LABEL"
msgid "Remote feed:"
msgstr "Canal remot:"

#. TRANS: Field label.
msgctxt "LABEL"
msgid "Local user"
msgstr "Usuari local"

#. TRANS: Fieldset legend for feed mirror setting.
msgid "Mirroring style"
msgstr ""

#. TRANS: Feed mirror style (radio button option).
msgid ""
"Repeat: reference the original user's post (sometimes shows as \"RT @blah\")"
msgstr ""

#. TRANS: Feed mirror style (radio button option).
msgid "Repost the content under my account"
msgstr ""

#. TRANS: Button text to save feed mirror settings.
msgctxt "BUTTON"
msgid "Save"
msgstr "Desa"

#. TRANS: Button text to stop mirroring a feed.
msgctxt "BUTTON"
msgid "Stop mirroring"
msgstr ""

#. TRANS: Name for possible feed provider.
msgid "Twitter"
msgstr "Twitter"

#. TRANS: Name for possible feed provider.
msgid "RSS or Atom feed"
msgstr "Canal RSS o Atom"

#. TRANS: Heading for feed mirroring selection form.
msgid "Select a feed provider"
msgstr "Seleccioneu un proveïdor de canals"


code:
# Translation of StatusNet - SubMirror to German (Deutsch)
# Exported from translatewiki.net
#
# Author: Fujnky
# Author: Giftpflanze
# Author: MF-Warburg
# Author: Tiin
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - SubMirror\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:11+0000\n"
"Language-Team: German <https://translatewiki.net/wiki/Portal:de>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-19 11:23:33+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: de\n"
"X-Message-Group: #out-statusnet-plugin-submirror\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Client error displayed when entering an invalid URL for a feed.
#. TRANS: %s is the invalid feed URL.
#, php-format
msgid "Invalid feed URL: %s."
msgstr "Ungültige Feed-URL: %s."

#. TRANS: Error message returned to user when setting up feed mirroring,
#. TRANS: but we were unable to resolve the given URL to a working feed.
msgid "Invalid profile for mirroring."
msgstr "Ungültiges Profil für das Spiegeln."

#. TRANS: Client error displayed when trying to mirror a StatusNet group feed.
msgid "Cannot mirror a StatusNet group at this time."
msgstr "Kann im Moment keine StatusNet-Gruppe spiegeln."

#. TRANS: Client error displayed when trying to use another method than POST.
msgid "This action only accepts POST requests."
msgstr "Diese Aktion nimmt nur POST-Requests."

#. TRANS: Client error displayed when the session token does not match or is not given.
msgid "There was a problem with your session token. Try again, please."
msgstr "Es gab ein Problem mit deinem Sitzungstoken. Bitte versuche es erneut."

#. TRANS: Error message displayed when trying to perform an action that requires a logged in user.
msgid "Not logged in."
msgstr "Nicht angemeldet."

#. TRANS: Page title for subscribed feed mirror.
msgid "Subscribed"
msgstr "Abonniert"

#. TRANS: Client error displayed when trying to edit an object that is not a feed mirror.
msgid "Requested invalid profile to edit."
msgstr "Ungültiges Profil zum Bearbeiten angefordert."

#. TRANS: Client error displayed when providing invalid input when editing a mirror.
msgid "Bad form data."
msgstr "Ungültige Formulardaten."

#. TRANS: Client error thrown when a mirror request is made and no result is retrieved.
msgid "The mirror request failed, because no result was retrieved."
msgstr ""
"Die Spiegel-Anforderung ist fehlgeschlagen, weil kein Ergebnis abgerufen "
"wurde."

#. TRANS: Exception thrown when a feed provider could not be recognised.
msgid "Internal form error: Unrecognized feed provider."
msgstr "Interner Formfehler: Unerkannter Feed-Provider."

#. TRANS: Exception thrown when a subscribing to a feed fails.
msgid "Could not subscribe to feed."
msgstr "Konnte den Feed nicht abonnieren."

#. TRANS: Page title.
msgid "Feed mirror settings"
msgstr "Feed-Spiegel-Einstellungen"

#. TRANS: Page instructions.
msgid ""
"You can mirror updates from many RSS and Atom feeds into your StatusNet "
"timeline!"
msgstr ""
"Du kanst die Aktualisierungen von vielen RSS- und Atomfeeds in deine "
"StatusNet-Zeitleiste integrieren!"

#. TRANS: Title for page with form to add a mirror feed provider on.
msgid "Provider add"
msgstr "Provider hinzufügen"

#. TRANS: Plugin description.
msgid "Pull feeds into your timeline!"
msgstr "Ziehe Feeds in deine Zeitleiste!"

#. TRANS: SubMirror plugin menu item on user settings page.
msgctxt "MENU"
msgid "Mirroring"
msgstr "Spiegeln"

#. TRANS: SubMirror plugin tooltip for user settings menu item.
msgid "Configure mirroring of posts from other feeds"
msgstr "Konfiguration des Spiegelns von Posts von anderen Feeds"

#. TRANS: Label in profile statistics section, followed by a count.
msgid "Mirrored feeds"
msgstr "Gespiegelte Feeds"

#. TRANS: Field label.
msgid "Web page or feed URL:"
msgstr "Webseiten- oder Feed-URL:"

#. TRANS: Button text for adding a feed.
#. TRANS: Button text for adding a Twitter feed mirror.
msgctxt "BUTTON"
msgid "Add feed"
msgstr "Feed hinzufügen"

#. TRANS: Field label.
msgid "Twitter username:"
msgstr "Twitter-Benutzername:"

#. TRANS: Field label (URL expectected).
msgctxt "LABEL"
msgid "Remote feed:"
msgstr "Remote-Feed:"

#. TRANS: Field label.
msgctxt "LABEL"
msgid "Local user"
msgstr "Lokaler Benutzer"

#. TRANS: Fieldset legend for feed mirror setting.
msgid "Mirroring style"
msgstr "Spiegelungs-Stil"

#. TRANS: Feed mirror style (radio button option).
msgid ""
"Repeat: reference the original user's post (sometimes shows as \"RT @blah\")"
msgstr ""
"Wiederholen: Auf den Post des ursprünglichen Benutzers beziehen (manchmal "
"als „RT @blah“ dargestellt)"

#. TRANS: Feed mirror style (radio button option).
msgid "Repost the content under my account"
msgstr "Den Inhalt mit meinem Konto erneut posten"

#. TRANS: Button text to save feed mirror settings.
msgctxt "BUTTON"
msgid "Save"
msgstr "Speichern"

#. TRANS: Button text to stop mirroring a feed.
msgctxt "BUTTON"
msgid "Stop mirroring"
msgstr "Mit dem Spiegeln aufhören"

#. TRANS: Name for possible feed provider.
msgid "Twitter"
msgstr "Twitter"

#. TRANS: Name for possible feed provider.
msgid "RSS or Atom feed"
msgstr "RSS- oder Atomfeed"

#. TRANS: Heading for feed mirroring selection form.
msgid "Select a feed provider"
msgstr "Wähle einen Feedprovider aus"


code:
# Translation of StatusNet - SubMirror to Spanish (español)
# Exported from translatewiki.net
#
# Author: Armando-Martin
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - SubMirror\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:11+0000\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-19 11:23:33+0000\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Client error displayed when entering an invalid URL for a feed.
#. TRANS: %s is the invalid feed URL.
#, php-format
msgid "Invalid feed URL: %s."
msgstr "Dirección URL de fuente web (feed) no válida: %s."

#. TRANS: Error message returned to user when setting up feed mirroring,
#. TRANS: but we were unable to resolve the given URL to a working feed.
msgid "Invalid profile for mirroring."
msgstr "Perfil inválido para hacer copia especular (mirroring)."

#. TRANS: Client error displayed when trying to mirror a StatusNet group feed.
msgid "Cannot mirror a StatusNet group at this time."
msgstr ""
"No se puede hacer copia especular (mirror) de un grupo de StatusNet en este "
"momento."

#. TRANS: Client error displayed when trying to use another method than POST.
msgid "This action only accepts POST requests."
msgstr "Esta acción sólo acepta solicitudes POST."

#. TRANS: Client error displayed when the session token does not match or is not given.
msgid "There was a problem with your session token. Try again, please."
msgstr "Hubo un problema con su contraseña de sesión. Inténtelo de nuevo."

#. TRANS: Error message displayed when trying to perform an action that requires a logged in user.
msgid "Not logged in."
msgstr "No ha iniciado sesión."

#. TRANS: Page title for subscribed feed mirror.
msgid "Subscribed"
msgstr "Suscrito"

#. TRANS: Client error displayed when trying to edit an object that is not a feed mirror.
msgid "Requested invalid profile to edit."
msgstr "El perfil que ha solicitado editar no es válido."

#. TRANS: Client error displayed when providing invalid input when editing a mirror.
msgid "Bad form data."
msgstr "Datos de formulario incorrectos."

#. TRANS: Client error thrown when a mirror request is made and no result is retrieved.
msgid "The mirror request failed, because no result was retrieved."
msgstr ""
"Error en la solicitud de copia especular (mirror), porque no se obtuvo "
"ningún resultado."

#. TRANS: Exception thrown when a feed provider could not be recognised.
msgid "Internal form error: Unrecognized feed provider."
msgstr ""
"Error interno en el formulario: Proveedor de fuente web (feed) no reconocido."

#. TRANS: Exception thrown when a subscribing to a feed fails.
msgid "Could not subscribe to feed."
msgstr "No se pudo suscribir a la fuente web (feed)"

#. TRANS: Page title.
msgid "Feed mirror settings"
msgstr "Configuración de copia especular (mirror) de fuente web (feed)"

#. TRANS: Page instructions.
msgid ""
"You can mirror updates from many RSS and Atom feeds into your StatusNet "
"timeline!"
msgstr ""
"¡Puede hacer copia especular (mirror) de las actualizaciones de muchas "
"fuentes web RSS y Atom en su agenda de StatusNet!"

#. TRANS: Title for page with form to add a mirror feed provider on.
msgid "Provider add"
msgstr "Agregar proveedor"

#. TRANS: Plugin description.
msgid "Pull feeds into your timeline!"
msgstr "¡Importar fuentes web (feed) en su agenda!"

#. TRANS: SubMirror plugin menu item on user settings page.
msgctxt "MENU"
msgid "Mirroring"
msgstr "Copia especular (mirroring)"

#. TRANS: SubMirror plugin tooltip for user settings menu item.
msgid "Configure mirroring of posts from other feeds"
msgstr ""
"Configurar la copia especular (mirror) de entradas de otras fuentes web "
"(feed)"

#. TRANS: Label in profile statistics section, followed by a count.
msgid "Mirrored feeds"
msgstr "Se ha hecho copia especular de las fuentes web"

#. TRANS: Field label.
msgid "Web page or feed URL:"
msgstr "Página web o dirección URL de la fuente web (feed):"

#. TRANS: Button text for adding a feed.
#. TRANS: Button text for adding a Twitter feed mirror.
msgctxt "BUTTON"
msgid "Add feed"
msgstr "Añadir fuente web (feed)"

#. TRANS: Field label.
msgid "Twitter username:"
msgstr "Nombre de usuario de Twitter:"

#. TRANS: Field label (URL expectected).
msgctxt "LABEL"
msgid "Remote feed:"
msgstr "Fuente web (feed) remota:"

#. TRANS: Field label.
msgctxt "LABEL"
msgid "Local user"
msgstr "Usuario local"

#. TRANS: Fieldset legend for feed mirror setting.
msgid "Mirroring style"
msgstr "Estilo de copia especular (mirror)"

#. TRANS: Feed mirror style (radio button option).
msgid ""
"Repeat: reference the original user's post (sometimes shows as \"RT @blah\")"
msgstr ""
"Repetir: Referenciar la entrada del usuario original (a veces se muestra "
"como \"RT @blah\")"

#. TRANS: Feed mirror style (radio button option).
msgid "Repost the content under my account"
msgstr "Volver a publicar el contenido bajo mi cuenta"

#. TRANS: Button text to save feed mirror settings.
msgctxt "BUTTON"
msgid "Save"
msgstr "Guardar"

#. TRANS: Button text to stop mirroring a feed.
msgctxt "BUTTON"
msgid "Stop mirroring"
msgstr "Detener copia especular (mirror)"

#. TRANS: Name for possible feed provider.
msgid "Twitter"
msgstr "Twitter"

#. TRANS: Name for possible feed provider.
msgid "RSS or Atom feed"
msgstr "Fuente web (feed) RSS o Atom"

#. TRANS: Heading for feed mirroring selection form.
msgid "Select a feed provider"
msgstr "Seleccione un proveedor de fuente web (feed)"


code:
# Translation of StatusNet - SubMirror to Basque (euskara)
# Exported from translatewiki.net
#
# Author: Artsuaga
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - SubMirror\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:10:11+0000\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-19 11:23:33+0000\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Client error displayed when entering an invalid URL for a feed.
#. TRANS: %s is the invalid feed URL.
#, php-format
msgid "Invalid feed URL: %s."
msgstr "Jario URL baliogabea: %s."

#. TRANS: Error message returned to user when setting up feed mirroring,
#. TRANS: but we were unable to resolve the given URL to a working feed.
msgid "Invalid profile for mirroring."
msgstr "Ispilu gisa erabiltzeko profil baliogabea."

#. TRANS: Client error displayed when trying to mirror a StatusNet group feed.
msgid "Cannot mirror a StatusNet group at this time."
msgstr ""

#. TRANS: Client error displayed when trying to use another method than POST.
msgid "This action only accepts POST requests."
msgstr "Ekintza honek POST eskariak soilik onartzen ditu."

#. TRANS: Client error displayed when the session token does not match or is not given.
msgid "There was a problem with your session token. Try again, please."
msgstr "Arazoa egon da zure saio-tokenarekin. Saiatu berriro, mesedez."

#. TRANS: Error message displayed when trying to perform an action that requires a logged in user.
msgid "Not logged in."
msgstr "Saioa hasi gabe."

#. TRANS: Page title for subscribed feed mirror.
msgid "Subscribed"
msgstr "Harpidetua"

#. TRANS: Client error displayed when trying to edit an object that is not a feed mirror.
msgid "Requested invalid profile to edit."
msgstr ""

#. TRANS: Client error displayed when providing invalid input when editing a mirror.
msgid "Bad form data."
msgstr "Inprimaki data okerrak."

#. TRANS: Client error thrown when a mirror request is made and no result is retrieved.
msgid "The mirror request failed, because no result was retrieved."
msgstr ""

#. TRANS: Exception thrown when a feed provider could not be recognised.
msgid "Internal form error: Unrecognized feed provider."
msgstr ""

#. TRANS: Exception thrown when a subscribing to a feed fails.
msgid "Could not subscribe to feed."
msgstr "Ezin izan da jariora harpidetu."

#. TRANS: Page title.
msgid "Feed mirror settings"
msgstr "Jario ispilu aukerak"

#. TRANS: Page instructions.
msgid ""
"You can mirror updates from many RSS and Atom feeds into your StatusNet "
"timeline!"
msgstr ""

#. TRANS: Title for page with form to add a mirror feed provider on.
msgid "Provider add"
msgstr "Hornitzailea gehitu"

#. TRANS: Plugin description.
msgid "Pull feeds into your timeline!"
msgstr ""

#. TRANS: SubMirror plugin menu item on user settings page.
msgctxt "MENU"
msgid "Mirroring"
msgstr ""

#. TRANS: SubMirror plugin tooltip for user settings menu item.
msgid "Configure mirroring of posts from other feeds"
msgstr ""

#. TRANS: Label in profile statistics section, followed by a count.
msgid "Mirrored feeds"
msgstr ""

#. TRANS: Field label.
msgid "Web page or feed URL:"
msgstr ""

#. TRANS: Button text for adding a feed.
#. TRANS: Button text for adding a Twitter feed mirror.
msgctxt "BUTTON"
msgid "Add feed"
msgstr "Gehitu jarioa"

#. TRANS: Field label.
msgid "Twitter username:"
msgstr "Twitter erabiltzailea:"

#. TRANS: Field label (URL expectected).
msgctxt "LABEL"
msgid "Remote feed:"
msgstr "Urruneko jarioa:"

#. TRANS: Field label.
msgctxt "LABEL"
msgid "Local user"
msgstr "Erabiltzaile lokala"

#. TRANS: Fieldset legend for feed mirror setting.
msgid "Mirroring style"
msgstr "Ispilu estiloa"

#. TRANS: Feed mirror style (radio button option).
msgid ""
"Repeat: reference the original user's post (sometimes shows as \"RT @blah\")"
msgstr ""

#. TRANS: Feed mirror style (radio button option).
msgid "Repost the content under my account"
msgstr ""

#. TRANS: Button text to save feed mirror settings.
msgctxt "BUTTON"
msgid "Save"
msgstr "Gorde"

#. TRANS: Button text to stop mirroring a feed.
msgctxt "BUTTON"
msgid "Stop mirroring"
msgstr "Gelditu ispilua"

#. TRANS: Name for possible feed provider.
msgid "Twitter"
msgstr "Twitter"

#. TRANS: Name for possible feed provider.
msgid "RSS or Atom feed"
msgstr "RSS edo Atom jarioa"

#. TRANS: Heading for feed mirroring selection form.
msgid "Select a feed provider"
msgstr "Aukeratu jario hornitzailea"