From 20a23e9957be65f081cdddd0f6560d0ae8919fc1 Mon Sep 17 00:00:00 2001 From: Franzz Date: Sat, 19 Oct 2019 18:27:26 +0200 Subject: [PATCH] i18n --- inc/media.php | 24 +++++++++++-------- inc/project.php | 1 - inc/spot.php | 27 +++++++++------------- inc/uploader.php | 25 ++++++++++++++------ languages/en.lang | 47 +++++++++++++++++++++++++++++++++++++- languages/fr.lang | 47 +++++++++++++++++++++++++++++++++++++- masks/admin.html | 16 ++++++------- masks/index.html | 1 + masks/project.html | 57 +++++++++++++++++++--------------------------- masks/upload.html | 9 +++++--- readme.md | 3 +-- script/spot.js | 22 ++++++++++++++++++ 12 files changed, 198 insertions(+), 81 deletions(-) diff --git a/inc/media.php b/inc/media.php index c796743..69d633f 100644 --- a/inc/media.php +++ b/inc/media.php @@ -32,6 +32,10 @@ class Media extends PhpObject { $this->sSystemType = (substr(php_uname(), 0, 7) == "Windows")?'win':'unix'; } + public function getProjectCodeName() { + return $this->oProject->getProjectCodeName(); + } + public function getMediasInfo() { if(empty($this->asMedias)) { if($this->oProject->getProjectId()) { @@ -57,8 +61,15 @@ class Media extends PhpObject { public function addMedia($sMediaName, $sMethod='upload') { $sError = ''; - if(!$this->isProjectModeValid() && $sMethod!='sync') $sError = 'Le projet (id='.$this->oProject->getProjectId().') n\'est pas en mode "blog"'; - elseif($this->oDb->pingValue(self::MEDIA_TABLE, array('filename'=>$sMediaName)) && $sMethod!='sync') $sError = 'l\'image existe déjà'; + $asErrorParams = array(); + if(!$this->isProjectModeValid() && $sMethod!='sync') { + $sError = 'upload_wrong_mode'; + $asErrorParams[] = $this->oProject->getProjectCodeName(); + } + elseif($this->oDb->pingValue(self::MEDIA_TABLE, array('filename'=>$sMediaName)) && $sMethod!='sync') { + $sError = 'upload_media_exist'; + $asErrorParams[] = $sMediaName; + } else { //Add media to DB $asMediaInfo = $this->getMediaInfoFromFile($sMediaName); @@ -74,19 +85,14 @@ class Media extends PhpObject { if($sMethod=='sync') $iMediaId = $this->oDb->insertUpdateRow(self::MEDIA_TABLE, $asDbInfo, array(Db::getId(Project::PROJ_TABLE), 'filename')); else $iMediaId = $this->oDb->insertRow(self::MEDIA_TABLE, $asDbInfo); - if(!$iMediaId) $sError = 'l\'image n\'a pas pu être entrée en base'; + if(!$iMediaId) $sError = 'error_commit_db'; else { //Create thumbnail $this->getMediaThumbnail($sMediaName); } } - if($sError!='') { - $sError = 'Erreur lors de l\'ajout de "'.$sMediaName.'" : '.$sError; - $this->addError($sError); - } - - return $sError; + return Spot::getResult(($sError==''), $sError, $asErrorParams); } /** diff --git a/inc/project.php b/inc/project.php index 84f524f..3bfb712 100644 --- a/inc/project.php +++ b/inc/project.php @@ -130,7 +130,6 @@ class Project extends PhpObject { $asProject['geofile'] = Spot::addTimestampToFilePath(Geo::getFilePath($asProject['geofile'], GeoJson::EXT)); $asProject['codename'] = $sCodeName; - $asProject['timezone_desc'] = Spot::getTimeZoneDesc($asProject['timezone']); } return $bSpecificProj?$asProject:$asProjects; } diff --git a/inc/spot.php b/inc/spot.php index 26e4df0..862e045 100755 --- a/inc/spot.php +++ b/inc/spot.php @@ -19,8 +19,6 @@ class Spot extends Main //Database const POST_TABLE = 'posts'; - const FORMAT_TIME = 'd/m/Y à H:i'; - const FEED_CHUNK_SIZE = 15; /** @@ -126,9 +124,7 @@ class Spot extends Main 'consts' => array( 'geo_server' => Settings::GEO_SERVER, 'modes' => Project::MODES, - 'site_timezone' => Settings::TIMEZONE, - 'site_timezone_desc' => self::getTimeZoneDesc(Settings::TIMEZONE), - 'trans' => $this->oLang->getTranslations() + 'site_timezone' => Settings::TIMEZONE ) ), 'index', @@ -225,7 +221,7 @@ class Spot extends Main foreach($asMedias as $iIndex=>$asMedia) { $sTimeRef = $asMedia[$sTimeRefField]; if($sTimeRef >= $this->oProject->getActivePeriod('from') && $sTimeRef <= $this->oProject->getActivePeriod('to')) { - $asMedia['taken_on_formatted'] = date(self::FORMAT_TIME, strtotime($asMedia['taken_on'])); + $asMedia['taken_on_formatted'] = $this->getTimeFormat(strtotime($asMedia['taken_on'])); $asMedia['displayed_id'] = 'N°'.($iIndex + 1); $this->addTimeStamp($asMedia, strtotime($sTimeRef)); @@ -263,8 +259,8 @@ class Spot extends Main private function addTimeStamp(&$asData, $iTime) { $asData['unix_time'] = (int) $iTime; - $asData['relative_time'] = Toolbox::getDateTimeDesc($iTime, 'fr'); - $asData['formatted_time'] = date(self::FORMAT_TIME, $iTime); + $asData['relative_time'] = Toolbox::getDateTimeDesc($iTime, $this->oLang->getLanguage()); + $asData['formatted_time'] = $this->getTimeFormat($iTime); } public function getNewsFeed($iChunk=0) @@ -328,7 +324,7 @@ class Spot extends Main public function upload() { $this->oClassManagement->incClass('uploader', true); - $oUploader = new Uploader($this->oMedia); + $oUploader = new Uploader($this->oMedia, $this->oLang); return $oUploader->sBody; } @@ -355,7 +351,7 @@ class Spot extends Main $bSuccess = $this->oProject->setTimeZone($sValue); break; } - if(!$bSuccess) $sDesc = 'Issue committing to DB'; + if(!$bSuccess) $sDesc = Mask::LANG_PREFIX.'error_commit_db'; return self::getJsonResult($bSuccess, $sDesc, array('values'=>$this->oProject->getProject())); } @@ -380,10 +376,9 @@ class Spot extends Main return $iDegree.'°'.$iMinute.'\''.$fSecond.'"'.$sDirection; } - public static function getTimeZoneDesc($sTimeZone) { - $sCity = substr(strrchr($sTimeZone, '/'), 1); - return 'heure d'.(in_array(strtolower(substr($sCity, 0, 1)), array('a', 'e', 'i', 'o', 'u', 'h'))?'\'':'e ').$sCity; + public function getTimeFormat($iTime) { + $sDate = date('d/m/Y', $iTime); + $sTime = date('H:i', $iTime); + return $this->oLang->getTranslation('date_time', array($sDate, $sTime)); } -} - -?> \ No newline at end of file +} \ No newline at end of file diff --git a/inc/uploader.php b/inc/uploader.php index 1603090..9defd1a 100644 --- a/inc/uploader.php +++ b/inc/uploader.php @@ -8,12 +8,18 @@ class Uploader extends UploadHandler */ private $oMedia; + /** + * Languages + * @var Translator + */ + private $oLang; + public $sBody; - function __construct(&$oMedia) + function __construct(&$oMedia, &$oLang) { - $this->error_messages['wrong_project_mode'] = 'Le projet n\'est pas en mode "blog".'; $this->oMedia = &$oMedia; + $this->oLang = &$oLang; $this->sBody = ''; parent::__construct(array('image_versions'=>array(), 'accept_file_types'=>'/\.(gif|jpe?g|png|mov)$/i')); } @@ -23,7 +29,7 @@ class Uploader extends UploadHandler //Check project mode if(!$this->oMedia->isProjectModeValid()) { - $file->error = $this->get_error_message('wrong_project_mode'); + $file->error = $this->get_error_message('upload_wrong_mode', array($this->oMedia->getProjectCodeName())); $bResult = false; } @@ -34,10 +40,8 @@ class Uploader extends UploadHandler $file = parent::handle_file_upload($uploaded_file, $name, $size, $type, $error, $index, $content_range); if(empty($file->error)) { - $sError = $this->oMedia->addMedia($file->name); - if($sError!='') { - $file->error = $this->get_error_message($sError); - } + $asResult = $this->oMedia->addMedia($file->name); + if(!$asResult['result']) $file->error = $this->get_error_message($asResult['desc'], $asResult['data']); } return $file; @@ -46,6 +50,13 @@ class Uploader extends UploadHandler protected function body($sBodyPart) { $this->sBody .= $sBodyPart; } + + protected function get_error_message($sError, $asParams=array()) { + $sTranslatedError = $this->oLang->getTranslation($sError, $asParams); + if($sTranslatedError) return $sTranslatedError; + elseif(array_key_exists($sError, $this->error_messages)) return $this->error_messages[$sError]; + else return $sError; + } } /* diff --git a/languages/en.lang b/languages/en.lang index 2e3dfcb..388ccd4 100644 --- a/languages/en.lang +++ b/languages/en.lang @@ -1 +1,46 @@ -page_og_desc=Keep contact with François when he is off hiking \ No newline at end of file +locale = en_NZ +page_og_desc = Keep contact with François when he is off hiking +error_commit_db = Issue committing to DB + +admin_save_success = Saved + +track_main = Main track +track_offtrack = Off-track +track_hitchhiking = Hitchhiking + +upload_title = Picture & Video Uploads +upload_wrong_mode = Project "$0" is not in blog mode. No upload allowed +upload_success = $0 uploaded successfully +upload_media_exist = Picture $0 already exists + +post_message = Message +post_name = Name +post_new_message = New message +and = and + +map_satellite = Satellite +map_otm = Open Topo Map +map_ign_france = IGN (France) +map_ign_spain = IGN (Spain) +map_linz = LINZ (New Zealand) + +pic = Picture +pics = Pictures +pic_taken = taken on $0 +video = Video +video_taken = shot on $0 +add_on = added on $0 +click_watch = Click to watch video +click_zoom = Click to zoom +media_count = Media $0 / $1 + +city_time = $0 time + +project = Project +mode = Mode +code_name = Code name +start = Start +end = End + +date_time = $0 at $1 +time_zone = Time zone \ No newline at end of file diff --git a/languages/fr.lang b/languages/fr.lang index cc8b31f..a6b1600 100644 --- a/languages/fr.lang +++ b/languages/fr.lang @@ -1 +1,46 @@ -page_og_desc=Gardez le contact avec François lorsqu'il part sur les chemins \ No newline at end of file +locale = fr_FR +page_og_desc = Gardez le contact avec François lorsqu'il part sur les chemins +error_commit_db = Error lors de la requête SQL + +admin_save_success = Sauvegardé + +track_main = Trajet principal +track_offtrack = Variante +track_hitchhiking = Hors rando + +upload_title = Uploader photos & vidéos +upload_wrong_mode = Le projet "$0" n'est pas en mode blog. Aucun upload possible +upload_success = $0 a été uploadé +upload_media_exist = l'image $0 existe déjà + +post_message = Message +post_name = Nom +post_new_message = Nouveau message +and = et + +map_satellite = Satellite +map_otm = Open Topo Map +map_ign_france = IGN (France) +map_ign_spain = IGN (Espagne) +map_linz = LINZ (Nouvelle-Zélande) + +pic = Photo +pics = Photos +pic_taken = prise le $0 +video = Vidéo +video_taken = filmée le $0 +add_on = ajoutée le $0 +click_watch = Click pour voir la vidéo +click_zoom = Click pour zoomer +media_count = Média $0 sur $1 + +city_time = heure de $0 + +project = Projet +mode = Mode +code_name = Nom de code +start = Départ +end = Arrivée + +date_time = $0 à $1 +time_zone = Fuseau horaire \ No newline at end of file diff --git a/masks/admin.html b/masks/admin.html index 1f2d59c..040c0d4 100644 --- a/masks/admin.html +++ b/masks/admin.html @@ -2,12 +2,12 @@
- - - - - - + + + + + +
ProjectModeCode NameStartEndTime Zone[#]lang:project[#][#]lang:mode[#][#]lang:code_name[#][#]lang:start[#][#]lang:end[#][#]lang:time_zone[#]
@@ -25,7 +25,7 @@ oSpot.pageInit = function(asHash) { oSpot.onFeedback = function(sType, sMsg, asContext) { delete asContext.a; - sMsg += ' (context: '; + sMsg += ' ('; $.each(asContext, function(sKey, sElem) { sMsg += sKey+'='+sElem+' / ' ; }); @@ -65,7 +65,7 @@ function commit(event, $This) { self.get( 'set_admin', function(asData){ - oSpot.onFeedback('success', 'Sauvegarde OK', asInputs); + oSpot.onFeedback('success', self.lang('admin_save_success'), asInputs); setProjects([asData.values]); }, asInputs, diff --git a/masks/index.html b/masks/index.html index b561137..ff538a7 100755 --- a/masks/index.html +++ b/masks/index.html @@ -9,6 +9,7 @@ + diff --git a/masks/project.html b/masks/project.html index a248290..8cc1e58 100755 --- a/masks/project.html +++ b/masks/project.html @@ -13,9 +13,9 @@
-
Trajet principal
-
Variante
-
Hors rando
+
[#]lang:track_main[#]
+
[#]lang:track_offtrack[#]
+
[#]lang:track_hitchhiking[#]
@@ -87,7 +87,7 @@ function initPage(asHash) { //Lightbox options lightbox.option({ alwaysShowNavOnTouchDevices: true, - albumLabel: "Média %1 sur %2", + albumLabel: oSpot.lang('media_count', ['%1', '%2']), fadeDuration: 300, imageFadeDuration: 400, resizeDuration: 600, @@ -128,8 +128,8 @@ function initProject(sProjectCodeName){ //Timezone difference notice var bSameTZ = (oSpot.consts.site_timezone == oSpot.vars(['project', 'timezone'])); - self.tmp('site_tz_notice', bSameTZ?'':' ('+oSpot.consts.site_timezone_desc+')'); - self.tmp('proj_tz_notice', bSameTZ?'':' ('+self.vars(['project', 'timezone_desc'])+')'); + self.tmp('site_tz_notice', bSameTZ?'':' ('+getTimeZoneDesc(oSpot.consts.site_timezone)+')'); + self.tmp('proj_tz_notice', bSameTZ?'':' ('+getTimeZoneDesc(self.vars(['project', 'timezone']))+')'); $.when( //Markers: Spot Messages & Medias @@ -160,7 +160,7 @@ function initPosts() { var asPoster = { type: 'poster', formatted_time: '', - relative_time: 'Nouveau message' + relative_time: oSpot.lang('post_new_message') }; getPost(asPoster).appendTo($Poster.show()); @@ -207,15 +207,16 @@ function getElevWidth() { function initSpotMessages(aoMessages, aoTracks) { //Tile layers - var oMapBoxSat = L.tileLayer(self.tmp('tile_api'), {id: 'mapbox.satellite-streets', minZoom: 0, maxZoom: 19}), - oOpenTopoMap = L.tileLayer(self.tmp('tile_api'), {id: 'opentopomap', minZoom: 2, maxZoom: 19}), - oIgnSpain = L.tileLayer(self.tmp('tile_api'), {id: 'ign.es', minZoom: 1, maxZoom: 20}), - oIgnFrance = L.tileLayer(self.tmp('tile_api'), {id: 'ign.fr', minZoom: 0, maxZoom: 18, tileSize: 256}), - oLinz = L.tileLayer(self.tmp('tile_api'), {id: 'linz', maxZoom: 17, continuousWorld: true, attribution: 'Sourced from LINZ. CC BY 4.0'}); + aoLayers = {}; + aoLayers[oSpot.lang('map_satellite')] = L.tileLayer(self.tmp('tile_api'), {id: 'mapbox.satellite-streets', minZoom: 0, maxZoom: 19}); + aoLayers[oSpot.lang('map_otm')] = L.tileLayer(self.tmp('tile_api'), {id: 'opentopomap', minZoom: 2, maxZoom: 19}); + aoLayers[oSpot.lang('map_ign_france')] = L.tileLayer(self.tmp('tile_api'), {id: 'ign.fr', minZoom: 0, maxZoom: 18, tileSize: 256}); + aoLayers[oSpot.lang('map_ign_spain')] = L.tileLayer(self.tmp('tile_api'), {id: 'ign.es', minZoom: 1, maxZoom: 20}); + aoLayers[oSpot.lang('map_linz')] = L.tileLayer(self.tmp('tile_api'), {id: 'linz', maxZoom: 17, continuousWorld: true, attribution: 'Sourced from LINZ. CC BY 4.0'}); //Map var oMap = L.map(self.tmp('$Map')[0], { - layers: [oMapBoxSat], + layers: [aoLayers[oSpot.lang('map_satellite')]], attributionControl: false, zoomControl: false }); @@ -274,18 +275,8 @@ function initSpotMessages(aoMessages, aoTracks) { }).addTo(oMap); self.tmp('elev', oElev); - //Controls: Tiles - L.control.layers( - { - 'Satellite': oMapBoxSat, - 'Open Topo Map': oOpenTopoMap, - 'IGN (France)': oIgnFrance, - 'IGN (Espagne)': oIgnSpain, - 'LINZ (Nouvelle-Zélande)': oLinz - }, - null, - {position: 'topleft'} - ).addTo(oMap); + //Controls: Tiles (layers) + L.control.layers(aoLayers, null, {position: 'topleft'}).addTo(oMap); //Tracks, colors & popup var oTracks = L.geoJson(aoTracks, { @@ -404,14 +395,14 @@ function initSpotMessages(aoMessages, aoTracks) { href: asMedia.media_path, 'data-lightbox': 'marker-medias', 'data-video': (bVideo?'true':'false'), - 'data-title': (bVideo?'Vidéo':'Photo')+' prise le '+asMedia.formatted_time+self.tmp('site_tz_notice'), + 'data-title': oSpot.lang(bVideo?'video':'pic')+' '+oSpot.lang(bVideo?'video_taken':'pic_taken', [asMedia.formatted_time+self.tmp('site_tz_notice')]), 'data-orientation': asMedia.rotate}) .append($('', {'src': asMedia.thumb_path})) .append($('', {'class': 'drill-icon'}).addIcon('fa-drill-'+(bVideo?'video':'picture'))) ); }); $Tooltip - .append($('

').addIcon('fa-media fa-fw fa-lg').append('Photos')) + .append($('

').addIcon('fa-media fa-fw fa-lg').append(oSpot.lang('pics'))) .append($Medias); } @@ -493,7 +484,7 @@ function getPost(asPost) { .append($('

').addIcon('fa-coords', true).append(asPost.lat_dms+' '+asPost.lon_dms)) .append($('

').addIcon('fa-time', true).append(sAbsTime+self.tmp('site_tz_notice'))) .append($('', {'class':'drill'}) - .append($('', {'class':'staticmap', title: 'Click pour zoomer', src: getWmtsApiUrl('static', asPost.latitude, asPost.longitude, 13)})) + .append($('', {'class':'staticmap', title: oSpot.lang('click_zoom'), src: getWmtsApiUrl('static', asPost.latitude, asPost.longitude, 13)})) .append($('', {'class': 'drill-icon fa-stack'}) .addIcon('fa-message-in fa-stack-1x fa-rotate-270') .addIcon('fa-message fa-stack-2x') @@ -518,14 +509,14 @@ function getPost(asPost) { break; case 'media': var bVideo = (asPost.subtype == 'video'); - var sTakenOn = (asPost.taken_on == '0000-00-00 00:00:00')?'':' et prise le '+asPost.taken_on_formatted+self.tmp('site_tz_notice'); - var $Image = $('', {'src': asPost.thumb_path, title: bVideo?'Click pour voir la vidéo':'Click pour zoomer'}); + var sTakenOn = (asPost.taken_on == '0000-00-00 00:00:00')?'':(' '+oSpot.lang('and')+' '+oSpot.lang(bVideo?'video_taken':'pic_taken', [asPost.taken_on_formatted+self.tmp('site_tz_notice')])); + var $Image = $('', {'src': asPost.thumb_path, title: oSpot.lang(bVideo?'click_watch':'click_zoom')}); $Body = $('', { 'class': 'drill', href: asPost.media_path, 'data-video': (bVideo?'true':'false'), 'data-lightbox': 'post-medias', - 'data-title': (bVideo?'Vidéo':'Photo')+' ajoutée le '+sAbsTime+sTakenOn, 'data-orientation': asPost.rotate + 'data-title': oSpot.lang(bVideo?'video':'pic')+' '+oSpot.lang('add_on', [sAbsTime+sTakenOn]), 'data-orientation': asPost.rotate }).append($Image).append($('', {'class': 'drill-icon'}).addIcon('fa-drill-'+(bVideo?'video':'picture'))); break; case 'post': @@ -535,8 +526,8 @@ function getPost(asPost) { break; case 'poster': $Body = $('

', {'class':'message'}) - .append($('