diff --git a/mod/follow.php b/mod/follow.php
index db7a52b2c..cd39d4dda 100644
--- a/mod/follow.php
+++ b/mod/follow.php
@@ -143,7 +143,7 @@ function follow_content(App $a)
'$submit' => $submit,
'$cancel' => DI::l10n()->t('Cancel'),
- '$request' => $request,
+ '$action' => $request,
'$name' => $contact['name'],
'$url' => $contact['url'],
'$zrl' => Profile::zrl($contact['url']),
diff --git a/mod/unfollow.php b/mod/unfollow.php
deleted file mode 100644
index 8431d04d0..000000000
--- a/mod/unfollow.php
+++ /dev/null
@@ -1,151 +0,0 @@
-.
- *
- */
-
-use Friendica\App;
-use Friendica\Content\Widget;
-use Friendica\Core\Protocol;
-use Friendica\Core\Renderer;
-use Friendica\Database\DBA;
-use Friendica\DI;
-use Friendica\Model\Contact;
-use Friendica\Model\User;
-use Friendica\Util\Strings;
-
-function unfollow_post(App $a)
-{
- if (!DI::userSession()->getLocalUserId()) {
- DI::sysmsg()->addNotice(DI::l10n()->t('Permission denied.'));
- DI::baseUrl()->redirect('login');
- // NOTREACHED
- }
-
- $url = trim($_REQUEST['url'] ?? '');
-
- unfollow_process($url);
-}
-
-function unfollow_content(App $a)
-{
- $base_return_path = 'contact';
-
- if (!DI::userSession()->getLocalUserId()) {
- DI::sysmsg()->addNotice(DI::l10n()->t('Permission denied.'));
- DI::baseUrl()->redirect('login');
- // NOTREACHED
- }
-
- $uid = DI::userSession()->getLocalUserId();
- $url = trim($_REQUEST['url']);
-
- $condition = ["`uid` = ? AND (`rel` = ? OR `rel` = ?) AND (`nurl` = ? OR `alias` = ? OR `alias` = ?)",
- DI::userSession()->getLocalUserId(), Contact::SHARING, Contact::FRIEND, Strings::normaliseLink($url),
- Strings::normaliseLink($url), $url];
-
- $contact = DBA::selectFirst('contact', ['url', 'id', 'uid', 'network', 'addr', 'name'], $condition);
-
- if (!DBA::isResult($contact)) {
- DI::sysmsg()->addNotice(DI::l10n()->t("You aren't following this contact."));
- DI::baseUrl()->redirect($base_return_path);
- // NOTREACHED
- }
-
- if (!Protocol::supportsFollow($contact['network'])) {
- DI::sysmsg()->addNotice(DI::l10n()->t('Unfollowing is currently not supported by your network.'));
- DI::baseUrl()->redirect($base_return_path . '/' . $contact['id']);
- // NOTREACHED
- }
-
- $request = DI::baseUrl() . '/unfollow';
- $tpl = Renderer::getMarkupTemplate('auto_request.tpl');
-
- $self = DBA::selectFirst('contact', ['url'], ['uid' => $uid, 'self' => true]);
-
- if (!DBA::isResult($self)) {
- DI::sysmsg()->addNotice(DI::l10n()->t('Permission denied.'));
- DI::baseUrl()->redirect($base_return_path);
- // NOTREACHED
- }
-
- if (!empty($_REQUEST['auto'])) {
- unfollow_process($contact['url']);
- }
-
- $o = Renderer::replaceMacros($tpl, [
- '$header' => DI::l10n()->t('Disconnect/Unfollow'),
- '$page_desc' => '',
- '$your_address' => DI::l10n()->t('Your Identity Address:'),
- '$invite_desc' => '',
- '$submit' => DI::l10n()->t('Submit Request'),
- '$cancel' => DI::l10n()->t('Cancel'),
- '$url' => $contact['url'],
- '$zrl' => Contact::magicLinkByContact($contact),
- '$url_label' => DI::l10n()->t('Profile URL'),
- '$myaddr' => $self['url'],
- '$request' => $request,
- '$keywords' => '',
- '$keywords_label'=> ''
- ]);
-
- DI::page()['aside'] = Widget\VCard::getHTML(Contact::getByURL($contact['url'], false));
-
- $o .= Renderer::replaceMacros(Renderer::getMarkupTemplate('section_title.tpl'), ['$title' => DI::l10n()->t('Status Messages and Posts')]);
-
- // Show last public posts
- $o .= Contact::getPostsFromUrl($contact['url']);
-
- return $o;
-}
-
-function unfollow_process(string $url)
-{
- $base_return_path = 'contact';
-
- $uid = DI::userSession()->getLocalUserId();
-
- $owner = User::getOwnerDataById($uid);
- if (!$owner) {
- throw new \Friendica\Network\HTTPException\NotFoundException();
- }
-
- $condition = ["`uid` = ? AND (`rel` = ? OR `rel` = ?) AND (`nurl` = ? OR `alias` = ? OR `alias` = ?)",
- $uid, Contact::SHARING, Contact::FRIEND, Strings::normaliseLink($url),
- Strings::normaliseLink($url), $url];
- $contact = DBA::selectFirst('contact', [], $condition);
-
- if (!DBA::isResult($contact)) {
- DI::sysmsg()->addNotice(DI::l10n()->t("You aren't following this contact."));
- DI::baseUrl()->redirect($base_return_path);
- // NOTREACHED
- }
-
- $return_path = $base_return_path . '/' . $contact['id'];
-
- try {
- Contact::unfollow($contact);
- $notice_message = DI::l10n()->t('Contact was successfully unfollowed');
- } catch (Exception $e) {
- DI::logger()->error($e->getMessage(), ['contact' => $contact]);
- $notice_message = DI::l10n()->t('Unable to unfollow this contact, please contact your administrator');
- }
-
- DI::sysmsg()->addNotice($notice_message);
- DI::baseUrl()->redirect($return_path);
-}
diff --git a/src/Content/Widget/VCard.php b/src/Content/Widget/VCard.php
index 13bd6f29a..1edbf63c8 100644
--- a/src/Content/Widget/VCard.php
+++ b/src/Content/Widget/VCard.php
@@ -70,7 +70,7 @@ class VCard
$rel = $contact['rel'];
$pending = $contact['pending'];
} else {
- $pcontact = Contact::selectFirst([], ['uid' => DI::userSession()->getLocalUserId(), 'uri-id' => $contact['uri-id']]);
+ $pcontact = Contact::selectFirst([], ['uid' => DI::userSession()->getLocalUserId(), 'uri-id' => $contact['uri-id'], 'deleted' => false]);
$id = $pcontact['id'] ?? 0;
$rel = $pcontact['rel'] ?? Contact::NOTHING;
@@ -83,7 +83,7 @@ class VCard
if (empty($contact['self']) && Protocol::supportsFollow($contact['network'])) {
if (in_array($rel, [Contact::SHARING, Contact::FRIEND])) {
- $unfollow_link = 'unfollow?url=' . urlencode($contact['url']) . '&auto=1';
+ $unfollow_link = 'contact/unfollow?url=' . urlencode($contact['url']) . '&auto=1';
} elseif (!$pending) {
$follow_link = 'follow?url=' . urlencode($contact['url']) . '&auto=1';
}
diff --git a/src/Model/Contact.php b/src/Model/Contact.php
index b26f98520..0ae7003f0 100644
--- a/src/Model/Contact.php
+++ b/src/Model/Contact.php
@@ -902,7 +902,7 @@ class Contact
self::clearFollowerFollowingEndpointCache($contact['uid']);
// Archive the contact
- self::update(['archive' => true, 'network' => Protocol::PHANTOM, 'deleted' => true], ['id' => $id]);
+ self::update(['archive' => true, 'network' => Protocol::PHANTOM, 'rel' => self::NOTHING, 'deleted' => true], ['id' => $id]);
if (!DBA::exists('contact', ['uri-id' => $contact['uri-id'], 'deleted' => false])) {
Avatar::deleteCache($contact);
@@ -1176,7 +1176,7 @@ class Contact
$unfollow_link = '';
if (!$contact['self'] && Protocol::supportsFollow($contact['network'])) {
if ($contact['uid'] && in_array($contact['rel'], [self::SHARING, self::FRIEND])) {
- $unfollow_link = 'unfollow?url=' . urlencode($contact['url']) . '&auto=1';
+ $unfollow_link = 'contact/unfollow?url=' . urlencode($contact['url']) . '&auto=1';
} elseif(!$contact['pending']) {
$follow_link = 'follow?url=' . urlencode($contact['url']) . '&auto=1';
}
diff --git a/src/Model/Profile.php b/src/Model/Profile.php
index 2496199bd..b73b23538 100644
--- a/src/Model/Profile.php
+++ b/src/Model/Profile.php
@@ -335,13 +335,13 @@ class Profile
if (!$visitor_is_authenticated) {
// Remote follow is only available for local profiles
if (!empty($profile['nickname']) && strpos($profile_url, DI::baseUrl()->get()) === 0) {
- $follow_link = 'remote_follow/' . $profile['nickname'];
+ $follow_link = 'profile/' . $profile['nickname'] . '/remote_follow';
}
} else {
if ($visitor_is_following) {
- $unfollow_link = $visitor_base_path . '/unfollow?url=' . urlencode($profile_url) . '&auto=1';
+ $unfollow_link = $visitor_base_path . '/contact/unfollow?url=' . urlencode($profile_url) . '&auto=1';
} else {
- $follow_link = $visitor_base_path .'/follow?url=' . urlencode($profile_url) . '&auto=1';
+ $follow_link = $visitor_base_path . '/follow?url=' . urlencode($profile_url) . '&auto=1';
}
}
diff --git a/src/Module/Contact/Unfollow.php b/src/Module/Contact/Unfollow.php
new file mode 100644
index 000000000..913638a9e
--- /dev/null
+++ b/src/Module/Contact/Unfollow.php
@@ -0,0 +1,184 @@
+.
+ *
+ */
+
+namespace Friendica\Module\Contact;
+
+use Friendica\App;
+use Friendica\Content\Widget;
+use Friendica\Core\L10n;
+use Friendica\Core\Protocol;
+use Friendica\Core\Renderer;
+use Friendica\Core\Session\Capability\IHandleUserSessions;
+use Friendica\Database\Database;
+use Friendica\Model\Contact;
+use Friendica\Model\User;
+use Friendica\Module\Response;
+use Friendica\Navigation\SystemMessages;
+use Friendica\Util\Profiler;
+use Friendica\Util\Strings;
+use Psr\Log\LoggerInterface;
+
+class Unfollow extends \Friendica\BaseModule
+{
+ /** @var IHandleUserSessions */
+ private $userSession;
+
+ /** @var SystemMessages */
+ private $systemMessages;
+
+ /** @var Database */
+ private $database;
+
+ /** @var App\Page */
+ private $page;
+
+ public function __construct(App\Page $page, Database $database, SystemMessages $systemMessages, IHandleUserSessions $userSession, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = [])
+ {
+ parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters);
+
+ $this->userSession = $userSession;
+ $this->systemMessages = $systemMessages;
+ $this->database = $database;
+ $this->page = $page;
+ }
+
+ protected function post(array $request = [])
+ {
+ if (!$this->userSession->getLocalUserId()) {
+ $this->systemMessages->addNotice($this->t('Permission denied.'));
+ $this->baseUrl->redirect('login');
+ }
+
+ $url = trim($request['url'] ?? '');
+
+ $this->process($url);
+ }
+
+ protected function content(array $request = []): string
+ {
+ $base_return_path = 'contact';
+
+ if (!$this->userSession->getLocalUserId()) {
+ $this->systemMessages->addNotice($this->t('Permission denied.'));
+ $this->baseUrl->redirect('login');
+ }
+
+ $uid = $this->userSession->getLocalUserId();
+ $url = trim($request['url']);
+
+ $condition = [
+ "`uid` = ?
+ AND (`rel` = ? OR `rel` = ?)
+ AND (`nurl` = ? OR `alias` = ? OR `alias` = ?)",
+ $this->userSession->getLocalUserId(),
+ Contact::SHARING, Contact::FRIEND,
+ Strings::normaliseLink($url), Strings::normaliseLink($url), $url,
+ ];
+
+ $contact = $this->database->selectFirst('contact', ['url', 'id', 'uid', 'network', 'addr', 'name'], $condition);
+ if (!$this->database->isResult($contact)) {
+ $this->systemMessages->addNotice($this->t("You aren't following this contact."));
+ $this->baseUrl->redirect($base_return_path);
+ }
+
+ if (!Protocol::supportsFollow($contact['network'])) {
+ $this->systemMessages->addNotice($this->t('Unfollowing is currently not supported by your network.'));
+ $this->baseUrl->redirect($base_return_path . '/' . $contact['id']);
+ }
+
+ $tpl = Renderer::getMarkupTemplate('auto_request.tpl');
+
+ $self = $this->database->selectFirst('contact', ['url'], ['uid' => $uid, 'self' => true]);
+
+ if (!$this->database->isResult($self)) {
+ $this->systemMessages->addNotice($this->t('Permission denied.'));
+ $this->baseUrl->redirect($base_return_path);
+ }
+
+ if (!empty($request['auto'])) {
+ $this->process($contact['url']);
+ }
+
+ $o = Renderer::replaceMacros($tpl, [
+ '$header' => $this->t('Disconnect/Unfollow'),
+ '$page_desc' => '',
+ '$your_address' => $this->t('Your Identity Address:'),
+ '$invite_desc' => '',
+ '$submit' => $this->t('Submit Request'),
+ '$cancel' => $this->t('Cancel'),
+ '$url' => $contact['url'],
+ '$zrl' => Contact::magicLinkByContact($contact),
+ '$url_label' => $this->t('Profile URL'),
+ '$myaddr' => $self['url'],
+ '$action' => $this->baseUrl . '/contact/unfollow',
+ '$keywords' => '',
+ '$keywords_label' => ''
+ ]);
+
+ $this->page['aside'] = Widget\VCard::getHTML(Contact::getByURL($contact['url'], false));
+
+ $o .= Renderer::replaceMacros(Renderer::getMarkupTemplate('section_title.tpl'), ['$title' => $this->t('Status Messages and Posts')]);
+
+ // Show last public posts
+ $o .= Contact::getPostsFromUrl($contact['url']);
+
+ return $o;
+ }
+
+ private function process(string $url): void
+ {
+ $base_return_path = 'contact';
+
+ $uid = $this->userSession->getLocalUserId();
+
+ $owner = User::getOwnerDataById($uid);
+ if (!$owner) {
+ throw new \Friendica\Network\HTTPException\NotFoundException();
+ }
+
+ $condition = [
+ "`uid` = ?
+ AND (`rel` = ? OR `rel` = ?)
+ AND (`nurl` = ? OR `alias` = ? OR `alias` = ?)",
+ $uid, Contact::SHARING, Contact::FRIEND,
+ Strings::normaliseLink($url), Strings::normaliseLink($url), $url,
+ ];
+ $contact = $this->database->selectFirst('contact', [], $condition);
+
+ if (!$this->database->isResult($contact)) {
+ $this->systemMessages->addNotice($this->t("You aren't following this contact."));
+ $this->baseUrl->redirect($base_return_path);
+ }
+
+ $return_path = $base_return_path . '/' . $contact['id'];
+
+ try {
+ Contact::unfollow($contact);
+ $notice_message = $this->t('Contact was successfully unfollowed');
+ } catch (\Exception $e) {
+ $this->logger->error($e->getMessage(), ['contact' => $contact]);
+ $notice_message = $this->t('Unable to unfollow this contact, please contact your administrator');
+ }
+
+ $this->systemMessages->addNotice($notice_message);
+ $this->baseUrl->redirect($return_path);
+ }
+}
diff --git a/src/Module/RemoteFollow.php b/src/Module/Profile/RemoteFollow.php
similarity index 67%
rename from src/Module/RemoteFollow.php
rename to src/Module/Profile/RemoteFollow.php
index 05239440d..7111146a2 100644
--- a/src/Module/RemoteFollow.php
+++ b/src/Module/Profile/RemoteFollow.php
@@ -19,7 +19,7 @@
*
*/
-namespace Friendica\Module;
+namespace Friendica\Module\Profile;
use Friendica\App;
use Friendica\App\Page;
@@ -30,11 +30,14 @@ use Friendica\Core\Logger;
use Friendica\Core\Protocol;
use Friendica\Core\Renderer;
use Friendica\Core\Search;
+use Friendica\Core\Session\Capability\IHandleUserSessions;
use Friendica\Core\System;
use Friendica\DI;
use Friendica\Model\Contact;
use Friendica\Model\Profile;
use Friendica\Model\User;
+use Friendica\Module\Response;
+use Friendica\Navigation\SystemMessages;
use Friendica\Network\HTTPException;
use Friendica\Network\Probe;
use Friendica\Util\Profiler;
@@ -45,54 +48,61 @@ use Psr\Log\LoggerInterface;
*/
class RemoteFollow extends BaseModule
{
- /** @var array */
- protected $owner;
+ /** @var SystemMessages */
+ private $systemMessages;
/** @var Page */
protected $page;
+ /** @var IHandleUserSessions */
+ private $userSession;
- public function __construct(L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, App\Page $page, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = [])
+ /** @var array */
+ protected $owner;
+
+ public function __construct(IHandleUserSessions $userSession, SystemMessages $systemMessages, L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, App\Page $page, LoggerInterface $logger, Profiler $profiler, Response $response, array $server, array $parameters = [])
{
parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters);
- $this->owner = User::getOwnerDataByNick($this->parameters['profile']);
+ $this->systemMessages = $systemMessages;
+ $this->page = $page;
+ $this->userSession = $userSession;
+
+ $this->owner = User::getOwnerDataByNick($this->parameters['nickname']);
if (!$this->owner) {
throw new HTTPException\NotFoundException($this->t('User not found.'));
}
-
- $this->page = $page;
}
protected function post(array $request = [])
{
- if (!empty($_POST['cancel']) || empty($_POST['dfrn_url'])) {
- $this->baseUrl->redirect();
+ if (!empty($request['cancel']) || empty($request['dfrn_url'])) {
+ $this->baseUrl->redirect('profile/' . $this->parameters['nickname']);
}
if (empty($this->owner)) {
- DI::sysmsg()->addNotice($this->t('Profile unavailable.'));
+ $this->systemMessages->addNotice($this->t('Profile unavailable.'));
return;
}
-
- $url = Probe::cleanURI($_POST['dfrn_url']);
+
+ $url = Probe::cleanURI($request['dfrn_url']);
if (!strlen($url)) {
- DI::sysmsg()->addNotice($this->t("Invalid locator"));
+ $this->systemMessages->addNotice($this->t('Invalid locator'));
return;
}
// Detect the network, make sure the provided URL is valid
$data = Contact::getByURL($url);
if (!$data) {
- DI::sysmsg()->addNotice($this->t("The provided profile link doesn't seem to be valid"));
+ $this->systemMessages->addNotice($this->t("The provided profile link doesn't seem to be valid"));
return;
}
if (empty($data['subscribe'])) {
- DI::sysmsg()->addNotice($this->t("Remote subscription can't be done for your network. Please subscribe directly on your system."));
+ $this->systemMessages->addNotice($this->t("Remote subscription can't be done for your network. Please subscribe directly on your system."));
return;
}
- Logger::notice('Remote request', ['url' => $url, 'follow' => $this->owner['url'], 'remote' => $data['subscribe']]);
-
+ $this->logger->notice('Remote request', ['url' => $url, 'follow' => $this->owner['url'], 'remote' => $data['subscribe']]);
+
// Substitute our user's feed URL into $data['subscribe']
// Send the subscriber home to subscribe
// Diaspora needs the uri in the format user@domain.tld
@@ -101,24 +111,20 @@ class RemoteFollow extends BaseModule
} else {
$uri = urlencode($this->owner['url']);
}
-
+
$follow_link = str_replace('{uri}', $uri, $data['subscribe']);
System::externalRedirect($follow_link);
}
protected function content(array $request = []): string
{
- if (empty($this->owner)) {
- return '';
- }
-
$this->page['aside'] = Widget\VCard::getHTML($this->owner);
$target_addr = $this->owner['addr'];
- $target_url = $this->owner['url'];
+ $target_url = $this->owner['url'];
$tpl = Renderer::getMarkupTemplate('auto_request.tpl');
- $o = Renderer::replaceMacros($tpl, [
+ return Renderer::replaceMacros($tpl, [
'$header' => $this->t('Friend/Connection Request'),
'$page_desc' => $this->t('Enter your Webfinger address (user@domain.tld) or profile URL here. If this isn\'t supported by your system, you have to subscribe to %s or %s directly on your system.', $target_addr, $target_url),
'$invite_desc' => $this->t('If you are not yet a member of the free social web, follow this link to find a public Friendica node and join us today.', Search::getGlobalDirectory() . '/servers'),
@@ -127,10 +133,9 @@ class RemoteFollow extends BaseModule
'$submit' => $this->t('Submit Request'),
'$cancel' => $this->t('Cancel'),
- '$request' => 'remote_follow/' . $this->parameters['profile'],
+ '$action' => 'profile/' . $this->parameters['nickname'] . '/remote_follow',
'$name' => $this->owner['name'],
- '$myaddr' => Profile::getMyURL(),
+ '$myaddr' => $this->userSession->getMyUrl(),
]);
- return $o;
}
}
diff --git a/static/routes.config.php b/static/routes.config.php
index 1b0f68026..62742b659 100644
--- a/static/routes.config.php
+++ b/static/routes.config.php
@@ -33,14 +33,15 @@ use Friendica\Module;
$profileRoutes = [
'' => [Module\Profile\Index::class, [R::GET]],
'/attachment/upload' => [Module\Profile\Attachment\Upload::class, [ R::POST]],
- '/profile' => [Module\Profile\Profile::class, [R::GET]],
- '/schedule' => [Module\Profile\Schedule::class, [R::GET, R::POST]],
'/contacts/common' => [Module\Profile\Common::class, [R::GET]],
'/contacts[/{type}]' => [Module\Profile\Contacts::class, [R::GET]],
- '/status[/{category}[/{date1}[/{date2}]]]' => [Module\Profile\Status::class, [R::GET]],
'/media' => [Module\Profile\Media::class, [R::GET]],
- '/unkmail' => [Module\Profile\UnkMail::class, [R::GET, R::POST]],
'/photos/upload' => [Module\Profile\Photos\Upload::class, [ R::POST]],
+ '/profile' => [Module\Profile\Profile::class, [R::GET]],
+ '/remote_follow' => [Module\Profile\RemoteFollow::class, [R::GET, R::POST]],
+ '/schedule' => [Module\Profile\Schedule::class, [R::GET, R::POST]],
+ '/status[/{category}[/{date1}[/{date2}]]]' => [Module\Profile\Status::class, [R::GET]],
+ '/unkmail' => [Module\Profile\UnkMail::class, [R::GET, R::POST]],
];
$apiRoutes = [
@@ -386,6 +387,7 @@ return [
'/hidden' => [Module\Contact::class, [R::GET]],
'/ignored' => [Module\Contact::class, [R::GET]],
'/hovercard' => [Module\Contact\Hovercard::class, [R::GET]],
+ '/unfollow' => [Module\Contact\Unfollow::class, [R::GET, R::POST]],
],
'/credits' => [Module\Credits::class, [R::GET]],
@@ -589,7 +591,6 @@ return [
'/randprof' => [Module\RandomProfile::class, [R::GET]],
'/register' => [Module\Register::class, [R::GET, R::POST]],
- '/remote_follow/{profile}' => [Module\RemoteFollow::class, [R::GET, R::POST]],
'/robots.txt' => [Module\RobotsTxt::class, [R::GET]],
'/rsd.xml' => [Module\ReallySimpleDiscovery::class, [R::GET]],
'/smilies[/json]' => [Module\Smilies::class, [R::GET]],
diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po
index 9c561f161..3fabe28c6 100644
--- a/view/lang/C/messages.po
+++ b/view/lang/C/messages.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2022.12-dev\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-10-31 14:54-0400\n"
+"POT-Creation-Date: 2022-10-31 15:34-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME