Smuggli has submitted this change and it was merged.

Change subject: Implemented changes for translatewiki
......................................................................


Implemented changes for translatewiki

Moved to Json i18n files
Improved messages
Seperated timestamp to date and time
Suggested message is better because the preference is for all users and
not only administrators

Change-Id: I40600068d2015dc8eef46d2aab8ece38bc862ec0
---
M SaferEdit/SaferEdit.class.php
A SaferEdit/i18n/de-formal.json
A SaferEdit/i18n/de.json
A SaferEdit/i18n/en.json
A SaferEdit/i18n/qqq.json
M SaferEdit/languages/SaferEdit.i18n.php
M SaferEdit/resources/bluespice.SaferEdit.editmode.js
7 files changed, 143 insertions(+), 98 deletions(-)

Approvals:
  Smuggli: Verified; Looks good to me, approved
  Siebrand: Looks good to me, but someone else must approve



diff --git a/SaferEdit/SaferEdit.class.php b/SaferEdit/SaferEdit.class.php
index 98f2a32..a92ce35 100644
--- a/SaferEdit/SaferEdit.class.php
+++ b/SaferEdit/SaferEdit.class.php
@@ -403,6 +403,7 @@
                                $sOrigText = $wgParser->getSection( $sOrigText, 
$iSection );
                        }
 
+                       $oLang = RequestContext::getMain()->getLanguage();
                        if ( $iSection != $row['se_edit_section'] ) {
                                if ( $row['se_edit_section'] == '-1' ) {
                                        $sEditUrl = $oTitle->getEditURL();
@@ -410,16 +411,18 @@
                                        $sEditUrl = 
$oTitle->getEditURL()."&section=".$row['se_edit_section'];
                                }
                                $aData = array(
-                                       "ts" => 
BsFormatConverter::mwTimestampToAgeString( $row['se_timestamp'] ),
+                                       "time" => $oLang->time( 
$row['se_timestamp'] ),
+                                       "date" => $oLang->date( 
$row['se_timestamp'] ),
                                        "savedOtherSection" => "1",
                                        "redirect" => $sEditUrl
                                );
                        } elseif ( strcmp( $sOrigText, 
urldecode($row['se_text'] ) ) == 0 ) {
                                $aData = array( "notexts" => "1" );
                        } else {
-                               $str = urldecode($row['se_text']);
+                               $str = urldecode( $row['se_text'] );
                                $aData = array(
-                                       "ts" => 
BsFormatConverter::mwTimestampToAgeString( $row['se_timestamp'] ),
+                                       "time" => $oLang->time( 
$row['se_timestamp'] ),
+                                       "date" => $oLang->date( 
$row['se_timestamp'] ),
                                        "html" => 
BsCore::getInstance()->parseWikiText( $str, 
RequestContext::getMain()->getTitle() ), //breaks on Mainpage
                                        "wiki" => $str,
                                        "section" => $row['se_edit_section'],
diff --git a/SaferEdit/i18n/de-formal.json b/SaferEdit/i18n/de-formal.json
new file mode 100644
index 0000000..d190b05
--- /dev/null
+++ b/SaferEdit/i18n/de-formal.json
@@ -0,0 +1,9 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Stephan Muggli <[email protected]>"
+               ]
+       },
+       "bs-saferedit-unsavedchanges": "Sie haben noch ungespeicherte 
Änderungen.",
+       "bs-saferedit-othersectiontext3": "Möchten Sie zum Seitenabschnitt 
wechseln?"
+}
diff --git a/SaferEdit/i18n/de.json b/SaferEdit/i18n/de.json
new file mode 100644
index 0000000..9bf61cc
--- /dev/null
+++ b/SaferEdit/i18n/de.json
@@ -0,0 +1,26 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Stephan Muggli <[email protected]>"
+               ]
+       },
+       "bs-saferedit-desc": "Bearbeitungen an Seiten werden automatisch 
zwischengespeichert",
+       "prefs-saferedit": "Sicheres Bearbeiten",
+       "bs-saferedit-restore": "Wiederherstellen",
+       "bs-saferedit-safer-edit-tooltip": "Es gibt eine 
Wiederherstellungsversion.",
+       "bs-saferedit-safer-edit-topbar": "Wiederherstellung",
+       "bs-saferedit-user-editing": "$1 bearbeitet die Seite gerade",
+       "bs-saferedit-someone-editing": "Die Seite wird gerade bearbeitet",
+       "bs-saferedit-pref-interval": "Intervall der Zwischenspeicherung:",
+       "bs-saferedit-pref-shownameofeditinguser": "Name des aktuellen 
Bearbeiters anzeigen",
+       "bs-saferedit-pref-warnonleave": "Warnung bei ungespeicherten Inhalten",
+       "bs-saferedit-pref-usese": "Sicheres Bearbeiten aktivieren",
+       "bs-saferedit-statebartopsaferedit": "Sicheres Bearbeiten",
+       "bs-saferedit-statebartopsafereditediting": "Sicheres Bearbeiten - In 
Bearbeitung",
+       "bs-saferedit-lastsavedversion": "Sicherungsversion vom $1 - $2",
+       "bs-saferedit-unsavedchanges": "Es gibt noch ungespeicherte 
Änderungen.",
+       "bs-saferedit-othersectiontitle": "Sicherung in einem anderen 
Seitenabschnitt.",
+       "bs-saferedit-othersectiontext1": "Es gibt eine Sicherung eines 
Seiten-Abschnitts.",
+       "bs-saferedit-othersectiontext2": "Sicherungsversion wurde erstellt am 
$1 - $2",
+       "bs-saferedit-othersectiontext3": "Möchtest Du zum Seitenabschnitt 
wechseln?"
+}
diff --git a/SaferEdit/i18n/en.json b/SaferEdit/i18n/en.json
new file mode 100644
index 0000000..ad796e9
--- /dev/null
+++ b/SaferEdit/i18n/en.json
@@ -0,0 +1,26 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Stephan Muggli <[email protected]>"
+               ]
+       },
+       "bs-saferedit-desc": "Intermediate saving of edits",
+       "prefs-saferedit": "Safer editing",
+       "bs-saferedit-restore": "Restore",
+       "bs-saferedit-safer-edit-tooltip": "A recovery version is available.",
+       "bs-saferedit-safer-edit-topbar": "Recovery",
+       "bs-saferedit-user-editing": "$1 is {{GENDER:$1|editing}} the page",
+       "bs-saferedit-someone-editing": "The page is being edited",
+       "bs-saferedit-pref-interval": "Recovery version interval:",
+       "bs-saferedit-pref-shownameofeditinguser": "Show name of current 
editor",
+       "bs-saferedit-pref-warnonleave": "Warn me when I leave an edit page 
with unsaved changes",
+       "bs-saferedit-pref-usese": "Activate safer editing",
+       "bs-saferedit-statebartopsaferedit": "Safer editing",
+       "bs-saferedit-statebartopsafereditediting": "Safer editing - someone is 
editing",
+       "bs-saferedit-lastsavedversion": "Last saved version from $1 - $2.",
+       "bs-saferedit-unsavedchanges": "There are unsaved changes.",
+       "bs-saferedit-othersectiontitle": "Section to restore",
+       "bs-saferedit-othersectiontext1": "There is a backup of another 
section.",
+       "bs-saferedit-othersectiontext2": "The backup was created on $1 - $2.",
+       "bs-saferedit-othersectiontext3": "Do you want to switch to that 
section?"
+}
diff --git a/SaferEdit/i18n/qqq.json b/SaferEdit/i18n/qqq.json
new file mode 100644
index 0000000..50a556b
--- /dev/null
+++ b/SaferEdit/i18n/qqq.json
@@ -0,0 +1,26 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Stephan Muggli <[email protected]>"
+               ]
+       },
+       "bs-saferedit-desc": "Used in 
[[Special:Wiki_Admin&mode=ExtensionInfo]], description of pages visited 
extension",
+       "prefs-saferedit": "Used in [[Special:Wiki_Admin&mode=Preferences]], 
headline for safer edit section in preferences.\n{{Identical|Safer editing}}",
+       "bs-saferedit-restore": "Button label for 
restore\n{{Identical|Restore}}",
+       "bs-saferedit-safer-edit-tooltip": "Text for a recovery version is 
available.",
+       "bs-saferedit-safer-edit-topbar": "Window title for 
recovery\n{{Identical|Recovery}}",
+       "bs-saferedit-user-editing": "Text in top bar for $1 is 
{{GENDER:$1|editing}} the page \n $1 is the user name of the user who is 
editing the page at the moment.\nNo punctuation needed.",
+       "bs-saferedit-someone-editing": "Text in top bar for the page is being 
edited\n No punctuation needed.",
+       "bs-saferedit-pref-interval": "Option in 
[[Special:Wiki_Admin&mode=Preferences]], label for recovery version interval:",
+       "bs-saferedit-pref-shownameofeditinguser": "Option in 
[[Special:Wiki_Admin&mode=Preferences]], checkbox label for show name of 
current editor",
+       "bs-saferedit-pref-warnonleave": "Option in 
[[Special:Wiki_Admin&mode=Preferences]], checkbox label for warn me when I 
leave an edit page with unsaved changes",
+       "bs-saferedit-pref-usese": "Option in 
[[Special:Wiki_Admin&mode=Preferences]], checkbox label for activate safer 
editing",
+       "bs-saferedit-statebartopsaferedit": "Option in 
[[Special:Wiki_Admin&mode=Preferences]], label for safer editing",
+       "bs-saferedit-statebartopsafereditediting": "Option in 
[[Special:Wiki_Admin&mode=Preferences]], label for safer editing - someone is 
editing",
+       "bs-saferedit-lastsavedversion": "Text for last saved version from $1 - 
$2.\n $1 is the date of the last saved version, $2 is the time of the the last 
saved version.",
+       "bs-saferedit-unsavedchanges": "Text for there are unsaved changes.",
+       "bs-saferedit-othersectiontitle": "Window title for section to restore",
+       "bs-saferedit-othersectiontext1": "Text for there is a backup of 
another section.",
+       "bs-saferedit-othersectiontext2": "Text for the backup was created on 
$1.\n $1 is the date when the backup was created, $2 is the time when the 
backup was created.",
+       "bs-saferedit-othersectiontext3": "Text for do you want to switch to 
that section?"
+}
diff --git a/SaferEdit/languages/SaferEdit.i18n.php 
b/SaferEdit/languages/SaferEdit.i18n.php
index b7fc604..c63516e 100644
--- a/SaferEdit/languages/SaferEdit.i18n.php
+++ b/SaferEdit/languages/SaferEdit.i18n.php
@@ -1,87 +1,35 @@
 <?php
 /**
- * Internationalisation file for SaferEdit
+ * This is a backwards-compatibility shim, generated by:
+ * 
https://git.wikimedia.org/blob/mediawiki%2Fcore.git/HEAD/maintenance%2FgenerateJsonI18n.php
  *
- * Part of BlueSpice for MediaWiki
+ * Beginning with MediaWiki 1.23, translation strings are stored in json files,
+ * and the EXTENSION.i18n.php file only exists to provide compatibility with
+ * older releases of MediaWiki. For more information about this migration, see:
+ * https://www.mediawiki.org/wiki/Requests_for_comment/Localisation_format
  *
- * @author     Stephan Muggli <[email protected]>
-
- * @package    BlueSpice_Extensions
- * @subpackage SaferEdit
- * @copyright  Copyright (C) 2012 Hallo Welt! - Medienwerkstatt GmbH, All 
rights reserved.
- * @license    http://www.gnu.org/copyleft/gpl.html GNU Public License v2 or 
later
- * @filesource
+ * This shim maintains compatibility back to MediaWiki 1.17.
  */
-
 $messages = array();
+if ( !function_exists( 'wfJsonI18nShim68062767c48a4042' ) ) {
+       function wfJsonI18nShim68062767c48a4042( $cache, $code, &$cachedData ) {
+               $codeSequence = array_merge( array( $code ), 
$cachedData['fallbackSequence'] );
+               foreach ( $codeSequence as $csCode ) {
+                       $fileName = dirname( __FILE__ ) . 
"/../i18n/$csCode.json";
+                       if ( is_readable( $fileName ) ) {
+                               $data = FormatJson::decode( file_get_contents( 
$fileName ), true );
+                               foreach ( array_keys( $data ) as $key ) {
+                                       if ( $key === '' || $key[0] === '@' ) {
+                                               unset( $data[$key] );
+                                       }
+                               }
+                               $cachedData['messages'] = array_merge( $data, 
$cachedData['messages'] );
+                       }
 
-$messages['de'] = array(
-       'bs-saferedit-desc'       => 'Bearbeitungen an Seiten werden 
automatisch zwischengespeichert',
-       'prefs-saferedit'                          => 'Sicheres Bearbeiten',
-       'bs-saferedit-restore'                     => 'Wiederherstellen',
-       'bs-saferedit-safer-edit-tooltip'          => 'Es gibt eine 
Wiederherstellungsversion.',
-       'bs-saferedit-safer-edit-topbar'           => 'Wiederherstellung',
-       'bs-saferedit-user-editing'         => '$1 bearbeitet die Seite gerade',
-       'bs-saferedit-someone-editing'     => 'Die Seite wird gerade 
bearbeitet',
-       'bs-saferedit-pref-interval'               => 'Intervall der 
Zwischenspeicherung:',
-       'bs-saferedit-pref-shownameofeditinguser'  => 'Name des aktuellen 
Bearbeiters anzeigen',
-       'bs-saferedit-pref-warnonleave'            => 'Warnung bei 
ungespeicherten Inhalten',
-       'bs-saferedit-pref-usese'                  => 'Sicheres Bearbeiten 
aktivieren',
-       'bs-saferedit-statebartopsaferedit'        => 'Sicheres Bearbeiten',
-       'bs-saferedit-statebartopsafereditediting' => 'Sicheres Bearbeiten - In 
Bearbeitung',
-       'bs-saferedit-lastsavedversion'  => 'Alter der Sicherungsversion: $1',
-       'bs-saferedit-unsavedchanges'    => 'Es gibt noch ungespeicherte 
Änderungen.',
-       'bs-saferedit-othersectiontitle' => 'Sicherung in einem anderen 
Seitenabschnitt.',
-       'bs-saferedit-othersectiontext1' => 'Es gibt eine Sicherung eines 
Seiten-Abschnitts.',
-       'bs-saferedit-othersectiontext2' => 'Sicherungsversion wurde erstellt 
am $1',
-       'bs-saferedit-othersectiontext3' => 'Möchtest Du zum Seitenabschnitt 
wechseln?'
-);
+                       $cachedData['deps'][] = new FileDependency( $fileName );
+               }
+               return true;
+       }
 
-$messages['de-formal'] = array(
-       'bs-saferedit-unsavedchanges'    => 'Sie haben noch ungespeicherte 
Änderungen.',
-       'bs-saferedit-othersectiontext3' => 'Möchten Sie zum Seitenabschnitt 
wechseln?'
-);
-
-$messages['en'] = array(
-       'bs-saferedit-desc'       => 'Intermediate saving of edits',
-       'prefs-saferedit'                          => 'Safer editing',
-       'bs-saferedit-restore'                     => 'Restore',
-       'bs-saferedit-safer-edit-tooltip'          => 'There is a recovery 
version.',
-       'bs-saferedit-safer-edit-topbar'           => 'Recovery',
-       'bs-saferedit-user-editing'         => '$1 is {{GENDER:$1|editing}} the 
page',
-       'bs-saferedit-someone-editing'      => 'The page is being edited',
-       'bs-saferedit-pref-interval'               => 'Interval of intermediate 
saving:',
-       'bs-saferedit-pref-shownameofeditinguser'  => 'Show name of current 
editor',
-       'bs-saferedit-pref-warnonleave'            => 'Warn user when unsaved 
changes',
-       'bs-saferedit-pref-usese'                  => 'Activate safer editing',
-       'bs-saferedit-statebartopsaferedit'        => 'Safer editing',
-       'bs-saferedit-statebartopsafereditediting' => 'Safer editing - someone 
is editing',
-       'bs-saferedit-lastsavedversion'  => 'Last saved version: $1',
-       'bs-saferedit-unsavedchanges'    => 'There are unsaved changes.',
-       'bs-saferedit-othersectiontitle' => 'Section to restore',
-       'bs-saferedit-othersectiontext1' => 'There is a backup of another 
section.',
-       'bs-saferedit-othersectiontext2' => 'The backup was created on $1.',
-       'bs-saferedit-othersectiontext3' => 'Do you want to switch to that 
section?'
-);
-
-$messages['qqq'] = array(
-       'bs-saferedit-desc'       => 'Used in 
[[Special:Wiki_Admin&mode=ExtensionInfo]], description of pages visited 
extension',
-       'prefs-saferedit'                          => 'Used in 
[[Special:Wiki_Admin&mode=Preferences]], headline for safer edit section in 
preferences.\n{{Identical|Safer editing}}',
-       'bs-saferedit-restore'                     => 'Button label for 
restore\n{{Identical|Restore}}',
-       'bs-saferedit-safer-edit-tooltip'          => 'Text for there is a 
recovery version.',
-       'bs-saferedit-safer-edit-topbar'           => 'Text for 
recovery\n{{Identical|Recovery}}',
-       'bs-saferedit-user-editing'         => 'Text for $1 is 
{{GENDER:$1|editing}} the page \n $1 is the user name of the user who is 
editing the page at the moment.\nNo punctuation needed.',
-       'bs-saferedit-someone-editing'      => 'Text for the page is being 
edited\n No punctuation needed.',
-       'bs-saferedit-pref-interval'               => 'Option in 
[[Special:Wiki_Admin&mode=Preferences]], label for interval of intermediate 
saving:',
-       'bs-saferedit-pref-shownameofeditinguser'  => 'Option in 
[[Special:Wiki_Admin&mode=Preferences]], checkbox label for show name of 
current editor',
-       'bs-saferedit-pref-warnonleave'            => 'Option in 
[[Special:Wiki_Admin&mode=Preferences]], checkbox label for warn user when 
unsaved changes',
-       'bs-saferedit-pref-usese'                  => 'Option in 
[[Special:Wiki_Admin&mode=Preferences]], checkbox label for activate safer 
editing',
-       'bs-saferedit-statebartopsaferedit'        => 'Option in 
[[Special:Wiki_Admin&mode=Preferences]], label for safer editing',
-       'bs-saferedit-statebartopsafereditediting' => 'Option in 
[[Special:Wiki_Admin&mode=Preferences]], label for safer editing - someone is 
editing',
-       'bs-saferedit-lastsavedversion'  => 'Text for last saved version: $1',
-       'bs-saferedit-unsavedchanges'    => 'Text for there are unsaved 
changes.',
-       'bs-saferedit-othersectiontitle' => 'Window title for section to 
restore',
-       'bs-saferedit-othersectiontext1' => 'Text for there is a backup of 
another section.',
-       'bs-saferedit-othersectiontext2' => 'Text for the backup was created on 
$1.',
-       'bs-saferedit-othersectiontext3' => 'Text for do you want to switch to 
that section?'
-);
\ No newline at end of file
+       $GLOBALS['wgHooks']['LocalisationCacheRecache'][] = 
'wfJsonI18nShim68062767c48a4042';
+}
diff --git a/SaferEdit/resources/bluespice.SaferEdit.editmode.js 
b/SaferEdit/resources/bluespice.SaferEdit.editmode.js
index ee2593e..cd8c7d0 100644
--- a/SaferEdit/resources/bluespice.SaferEdit.editmode.js
+++ b/SaferEdit/resources/bluespice.SaferEdit.editmode.js
@@ -62,10 +62,15 @@
         */
        win: false,
        /**
-        * Timestamp of saved version in restore dialogue
+        * Time of saved version in restore dialogue
         * @var string Rendered timestamp, currently age of stored release
         */
-       savedTS: '',
+       savedTime: '',
+       /**
+        * Date of saved version in restore dialogue
+        * @var string Rendered timestamp, currently age of stored release
+        */
+       savedDate: '',
        /**
         * Rendered HTML of saved version that is displayed in restore dialogue
         * @var string Rendered HTML
@@ -115,7 +120,7 @@
                                        items: [
                                                {
                                                        xtype: 'tbtext',
-                                                       text: 
mw.message('bs-saferedit-lastsavedversion', BsSaferEditEditMode.savedTS).plain()
+                                                       text: 
mw.message('bs-saferedit-lastsavedversion', BsSaferEditEditMode.savedDate, 
BsSaferEditEditMode.savedTime).plain()
                                                }
                                        ]
                                }, {
@@ -189,14 +194,14 @@
                                text = '';
                        }
                }
-               BSPing.registerListener( 
-                       'SaferEditSave', 
-                       BsSaferEditEditMode.interval, 
+               BSPing.registerListener(
+                       'SaferEditSave',
+                       BsSaferEditEditMode.interval,
                        [{
                                text: text,
                                section: bsSaferEditEditSection
-                       }], 
-                       BsSaferEditEditMode.saveTextListener 
+                       }],
+                       BsSaferEditEditMode.saveTextListener
                );
        },
 
@@ -210,7 +215,7 @@
                        {
                                titleMsg: 'bs-saferedit-othersectiontitle',
                                text: 
mw.message('bs-saferedit-othersectiontext1').plain() + '<br/>' +
-                                       
mw.message('bs-saferedit-othersectiontext2', BsSaferEditEditMode.savedTS 
).plain() + '<br />' +
+                                       
mw.message('bs-saferedit-othersectiontext2', BsSaferEditEditMode.savedDate, 
BsSaferEditEditMode.savedTime ).plain() + '<br />' +
                                        
mw.message('bs-saferedit-othersectiontext3').plain()
                        },
                        {
@@ -224,16 +229,16 @@
                        }
                );
        },
-       
+
        getText: function( mode ) {
                var text = '';
 
                switch (mode) {
                        case "VisualEditor":
-                               text = $('wpTextbox1').val(); 
+                               text = $('wpTextbox1').val();
                                break;
                        case "MW":
-                               text = 
tinyMCE.activeEditor.getContent({save:true}); 
+                               text = 
tinyMCE.activeEditor.getContent({save:true});
                                break;
                        default: //detect
                                if( typeof VisualEditorMode !== 'undefined' && 
VisualEditorMode ) {
@@ -264,12 +269,14 @@
 
                                                if ( oResponse.notexts == "1" ) 
return;
                                                if ( 
oResponse.savedOtherSection == "1" ) {
-                                                       
BsSaferEditEditMode.savedTS = oResponse.ts;
+                                                       
BsSaferEditEditMode.savedTime = oResponse.time;
+                                                       
BsSaferEditEditMode.savedDate = oResponse.date;
                                                        
BsSaferEditEditMode.redirect = oResponse.redirect;
                                                        
BsSaferEditEditMode.showRedirect();
                                                        return;
                                                }
-                                               BsSaferEditEditMode.savedTS = 
oResponse.ts;
+                                               BsSaferEditEditMode.savedTime = 
oResponse.time;
+                                               BsSaferEditEditMode.savedDate = 
oResponse.date;
                                                BsSaferEditEditMode.savedHTML = 
unescape(oResponse.html);
                                                
BsSaferEditEditMode.savedWikiCode = unescape(oResponse.wiki);
 
@@ -311,7 +318,7 @@
         */
        saveText: function() {
                var text = BsSaferEditEditMode.getText();
-               
+
                if( BsSaferEditEditMode.canceledByUser ) return;
 
                if( BsSaferEditEditMode.oldText != text ) {
@@ -405,7 +412,7 @@
 
        hasUnsavedChanges: function(mode) {
                var text = BsSaferEditEditMode.getText( mode );
-               
+
                if ( text.trim() != BsSaferEditEditMode.origText.trim() ) {
                        BsSaferEditEditMode.isUnsaved = true;
                        return true;

-- 
To view, visit https://gerrit.wikimedia.org/r/144943
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I40600068d2015dc8eef46d2aab8ece38bc862ec0
Gerrit-PatchSet: 3
Gerrit-Project: mediawiki/extensions/BlueSpiceExtensions
Gerrit-Branch: master
Gerrit-Owner: Smuggli <[email protected]>
Gerrit-Reviewer: Mglaser <[email protected]>
Gerrit-Reviewer: Pigpen <[email protected]>
Gerrit-Reviewer: Robert Vogel <[email protected]>
Gerrit-Reviewer: Siebrand <[email protected]>
Gerrit-Reviewer: Smuggli <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to