Back to top

Autore Topic: rendere un plugin multilingua?  (Letto 1609 volte)

Offline thewebsurfer

  • Abituale
  • ****
  • Post: 904
    • Mostra profilo
rendere un plugin multilingua?
« il: 31 Lug 2014, 21:08:08 »
salve, ho un certo plugin che fa una certa cosa al primo login dell'utente
http://www.readybytes.net/labs/welcome-message.html
(il componente a cui si applica è a pagamento, il plugin in oggetto no)
secondo voi c'è modo di 'duplicarlo' ed applicare un'azione diversa per ogni lingua del sito?
in pratica il plugin manda un messaggio di benvenuto all'utente, ma essendo il sito multilingua è un problema mandare un messaggio monolingua
« Ultima modifica: 31 Lug 2014, 21:10:35 da thewebsurfer »

Offline giusebos

  • Fuori controllo
  • *
  • Post: 21748
  • Sesso: Maschio
  • Giuseppe Serbelloni Mazzanti Viendalmare
    • Mostra profilo
Re:rendere un plugin multilingua?
« Risposta #1 il: 01 Ago 2014, 12:12:31 »
Se il plug in è stato progettato per joomla, ovvero avendo rispettato il paradigma MVC, dovresti inserire al posto della tua frase la stringa con la costante che ne richiama la variabile nella lingua in cui uno legge la pagina, nel file di lingua.

questa ad esempio:



Codice: [Seleziona]
JText::_('NOME_PLUG_IN_TUA_COSTANTE')
su www.icagenda.it guide e tutorial con esempi di chronoforms e chronoconnectivity

Offline thewebsurfer

  • Abituale
  • ****
  • Post: 904
    • Mostra profilo
Re:rendere un plugin multilingua?
« Risposta #2 il: 01 Ago 2014, 17:27:36 »
questo è tutto il codice, come vedi all'ultima riga ho già provato ad usare JText lì, ma non funge

Codice: [Seleziona]
<?php
defined
('_JEXEC') or die( 'Restricted access' );

jimport'joomla.plugin.plugin' );
jimport'joomla.filesystem.folder' );

if(!
defined('DS')){
    
define('DS',DIRECTORY_SEPARATOR);
}

class 
plgUserWelcomeMessage extends JPlugin
{

function _construct(& $subject$config
{
parent::__construct($subject$config);
}

function onLoginUser($user,$option)
{
$this->afterLogin($user$option);
}

//in J1.7 this event is called
function onUserLogin($user,$option)
{
$this->afterLogin($user$option);
}

function editMessage($userid,$message,$customurl)
{
$mainframe JFactory::getApplication();
$name     = $lastvisitdate JFactory::getUser($userid)->name;
$username  $lastvisitdate JFactory::getUser($userid)->username;
$siteurl   JURI::base();
$sitename  $mainframe->getCfg'sitename' );

$pattern = array("/\[\[NAME\]\]/","/\[\[USERNAME\]\]/","/\[\[SITEURL\]\]/","/\[\[SITENAME\]\]/","/\[\[CUSTOMURL\]\]/");
$replace = array($name,$username,$siteurl,$sitename,$customurl);
$message preg_replace($pattern,$replace,$message);
return $message;
}

function sendMessage($userid,$subject,$message,$emessage,$permessage,$email)
{
$mainframe JFactory::getApplication();
if($emessage){
$mainframe->enqueueMessage($message);
}
if($permessage){

$jspath JPATH_ROOT.DS.'components'.DS.'com_community';
include_once($jspath.DS.'libraries'.DS.'core.php');

$inboxModel CFactory::getModel'inbox' );

$postvars = array();
$postvars['to'  = $userid;
$postvars['subject'] = $subject;
$postvars['body']  = $message;

$msgid $this->sendJomSocialMessage ($postvars);

CFactory::load'libraries' 'userpoints' );
            
//reload user to clean cache
            
CFactory::loadUsers(array("$userid"));
CUserPoints::assignPoint('inbox.message.send');
}
if($email){
$mailer JFactory::getMailer();
$email  JFactory::getUser($userid)->email;
$mailer->addRecipient($email);
$mailer->setSubject($subject);
$mailer->setBody($message);
$mailer->send();
}

}

function sendJomsocialMessage($vars)
{     
$db    JFactory::getDBO();
$my    = JFactory::getUser();
$admin $this->getAdmin();
$date  JFactory::getDate(); //get the time without any offset!
$cDate $date->toSQL(); 

$obj   = new stdClass();
$obj->id        null;
$obj->from  $admin;
$obj->posted_on $date->toSQL();
$obj->from_name JFactory::getUser($admin)->name;
$obj->subject $vars['subject'];
$obj->body $vars['body'];

$db->insertObject('#__community_msg'$obj'id');

// Update the parent
$obj->parent $obj->id;
$db->updateObject('#__community_msg'$obj'id');

$this->addReceipient($obj$vars['to']);    

return $obj->id;
}

function addReceipient($msgObj$recepientId)
{
$db JFactory::getDBO();
        
$recepient = new stdClass();
$recepient->msg_id     $msgObj->id;
$recepient->msg_parent $msgObj->parent;
$recepient->msg_from   $msgObj->from;
$recepient->to    = $recepientId;
$db->insertObject('#__community_msg_recepient'$recepient);

if($db->getErrorNum()) {
     JError::raiseError500$db->stderr());
    }
}

function getAdmin()
{
$mainframe JFactory::getApplication();
$db JFactory::getDBO();
$query 'SELECT id FROM #__users' ' '
'WHERE `email`="' .$mainframe->getCfg'mailfrom' ).'"';

$db->setQuery$query );
if($db->getErrorNum()) {
JError::raiseError500$db->stderr());
}
$result $db->loadResult();
return $result;
}

function _isPluginInstalledAndEnabled()
{
$db JFactory::getDBO();
$query "SELECT * FROM `#__extensions` WHERE `element` = 'xipt_community' ";
$db->setQuery($query);
    
$communityPlugin $db->loadObject();
if(!$communityPlugin || $communityPlugin->enabled == 0)
{
return false;
}


$query "SELECT * FROM `#__extensions` WHERE `element` = 'xipt_system' ";
$db->setQuery($query);
    $systemPlugin $db->loadObject();
if(!$systemPlugin || $systemPlugin->enabled == 0)
{
return false;
}
return true;
}

function afterLogin($user$option)
{
$username  JRequest::getVar('username');

$mainframe JFactory::getApplication();
$userid    JUserHelper::getUserId($username);

// For Guest, do nothing and just return, let the joomla handle it
if(!$userid
return;

$plugin     = JPluginHelper::getPlugin('user''welcomemessage');

 
$params     = new JRegistry($plugin->params); 
 

 
$lastvisitdate JFactory::getUser($userid)->lastvisitDate;
$block    = JFactory::getUser($userid)->block;

 
//Check for first login
if($lastvisitdate == "0000-00-00 00:00:00" && $block==0){
$path JPATH_ROOTDS.'components'.DS.'com_xipt';
if(JFolder::exists($path)){
//Check is XiPT unhook or not
$result $this->_isPluginInstalledAndEnabled();
   if($result){
require_once (JPATH_ROOTDS.'components'.DS.'com_xipt'.DS.'api.xipt.php');
$pID XiptAPI::getUserInfo($userid,'PROFILETYPE');

$ptsubject $params->get('ptypesubject''');
$subject $ptsubject->$pID;
$ptmessage  $params->get('ptypemessage''');
$message $ptmessage->$pID;

           }
           else{
           $subject  $params->get('subject',' ');
           $message  $params->get('message',' ');
           }
}
else{
$subject  $params->get('subject''');
$message  $params->get('message''');
}

//$message.= $this->getMessage($userid);
$emessage   $params->get('EnqueueMessage'false);
$permessage $params->get('PersonalMessage',false);
$email      $params->get('Email'false);
$customurl  $params->get('customurl'false);
$subject    $this->editMessage($userid,$subject,$customurl);
$message    $this->editMessage($userid,$message,$customurl);
 
$this->sendMessage($userid,$subject,JText::_($message),JText::_($emessage),JText::_($permessage),$email);
}
}
}

Offline claudiocarrera

  • Appassionato
  • ***
  • Post: 612
  • Sesso: Maschio
  • Sviluppo siti web Brescia
    • Mostra profilo
Re:rendere un plugin multilingua?
« Risposta #3 il: 01 Ago 2014, 18:48:00 »

Vedo che $emessage prende un parametro get.


Per sicurezza: a cosa è uguale $emessage;?


Cmq funziona cosi:


Quando tu scrivi:


Jtext::(NOME_CAMPO);


Joomla cerca tra i file .ini che ha caricato nel core, cerca "NOME_CAMPO" e vede che nel file it.ini è uguale a cognome, nel file en.ini è uguale a surname.


A questo punto, se sei su una pagina in italiano ti scrive cognome, se sei su una pagina inglese scrive surname.


Se tu a $emessage applichi un nome diverso a "NOME_CAMPO" che non è presente tra i file .ini della cartella languages, non ti troverà nulla e ti scriverà il contenuto di $emessage (se non esistesse NOME_CAMPO ti scriverebbe: NOME_CAMPO).
« Ultima modifica: 01 Ago 2014, 18:51:42 da claudiocarrera »
Claudio Carrera - claudio@3rd-graphic.it
partita iva: 03597950983
tel: 338 9433727

Offline thewebsurfer

  • Abituale
  • ****
  • Post: 904
    • Mostra profilo
Re:rendere un plugin multilingua?
« Risposta #4 il: 01 Ago 2014, 19:00:20 »
Vedo che $emessage prende un parametro get.


Per sicurezza: a cosa è uguale $emessage;?


Cmq funziona cosi:


Quando tu scrivi:


Jtext::(NOME_CAMPO);


Joomla cerca tra i file .ini che ha caricato nel core, cerca "NOME_CAMPO" e vede che nel file it.ini è uguale a cognome, nel file en.ini è uguale a surname.


A questo punto, se sei su una pagina in italiano ti scrive cognome, se sei su una pagina inglese scrive surname.


Se tu a $emessage applichi un nome diverso a "NOME_CAMPO" che non è presente tra i file .ini della cartella languages, non ti troverà nulla e ti scriverà il contenuto di $emessage (se non esistesse NOME_CAMPO ti scriverebbe: NOME_CAMPO).


so come funzionano le variabili di lingua :)
è che non sono sicuro sia possibile utilizzarle in quel codice, per questo chiedo aiuto  :)
ovviamente ho inserito una variabile NOME_CAMPO nel file .ini, ed ho inserito lo stesso nel form per la definizione del messaggio da mandare all'utente, ma non funziona (il messaggio mandato all'utente è NOME_CAMPO, cioè la variabile non viene risolta)
« Ultima modifica: 01 Ago 2014, 19:03:10 da thewebsurfer »

Offline claudiocarrera

  • Appassionato
  • ***
  • Post: 612
  • Sesso: Maschio
  • Sviluppo siti web Brescia
    • Mostra profilo
Re:rendere un plugin multilingua?
« Risposta #5 il: 01 Ago 2014, 19:41:07 »
Ok capito  :)


Mai capitato problema di questo tipo mi spiace, mi segno questo topic che interessa anche a me  :) [size=78%].[/size]
Claudio Carrera - claudio@3rd-graphic.it
partita iva: 03597950983
tel: 338 9433727

Offline thewebsurfer

  • Abituale
  • ****
  • Post: 904
    • Mostra profilo
Re:rendere un plugin multilingua?
« Risposta #6 il: 01 Ago 2014, 20:13:24 »
Mai capitato problema di questo tipo mi spiace, mi segno questo topic che interessa anche a me  :) [size=78%].[/size]


io sono pieno di problemi del genere, i siti multilingua sono una rogna se sviluppi codice ad hoc.  :)


qualche esperto da un occhio al codice ho linkato tutto il pacchetto, magari riesce a dirmi almeno se effettivamente c'è modo di rendere il messaggio multilingua o no, io sono ancora dubbioso..

Offline claudiocarrera

  • Appassionato
  • ***
  • Post: 612
  • Sesso: Maschio
  • Sviluppo siti web Brescia
    • Mostra profilo
Re:rendere un plugin multilingua?
« Risposta #7 il: 01 Ago 2014, 22:26:54 »
Ma prima dell'invio del messaggio hai provato a fare un echo per vedere se sta richiamando la variabile?
Claudio Carrera - claudio@3rd-graphic.it
partita iva: 03597950983
tel: 338 9433727

Offline thewebsurfer

  • Abituale
  • ****
  • Post: 904
    • Mostra profilo
Re:rendere un plugin multilingua?
« Risposta #8 il: 01 Ago 2014, 22:37:07 »
Ma prima dell'invio del messaggio hai provato a fare un echo per vedere se sta richiamando la variabile?


non è così semplice :) il plugin viene eseguito "on the fly" alla registrazione, se metto una echo in qualche funzione o non vedo nulla o scateno un errore, in questo caso ho provato, è la seconda :) .

Offline thewebsurfer

  • Abituale
  • ****
  • Post: 904
    • Mostra profilo
Re:rendere un plugin multilingua?
« Risposta #9 il: 01 Ago 2014, 23:29:05 »
eureka! ci sono riuscito :D
e soprattutto grazie a te claudio.


anche se il plugin si applica ad un componente a pagamento magari interessa a qualcuno la soluzione:
effettivamente con il suggerimento valido sempre per tutti i programmatori/sviluppatori "quando non capisci dove sei e cosa fai, stampa roba a video" :D mi hai dato un suggerimento per partire
- mi sono reso conto che  usare una variabile di lingua nel form per la definizione del messaggio da backend era un po' troppo, così l'ho infilata nel codice
- per capire se funzionava, ho indagato e scoperto quale fosse la funzione effettivamente appesa all'evento after registration e lì ho stampato un po' di roba (che viene stampata in una pagina bianca durante il caricamento del primo login)
- quando ho visto che effettivamente è l'utente registrato che scatena l'evento, quindi il plugin può recuperare la sua lingua, ho risolto :)

Offline claudiocarrera

  • Appassionato
  • ***
  • Post: 612
  • Sesso: Maschio
  • Sviluppo siti web Brescia
    • Mostra profilo
Re:rendere un plugin multilingua?
« Risposta #10 il: 02 Ago 2014, 11:44:54 »
eureka! ci sono riuscito :D
e soprattutto grazie a te claudio.


anche se il plugin si applica ad un componente a pagamento magari interessa a qualcuno la soluzione:
effettivamente con il suggerimento valido sempre per tutti i programmatori/sviluppatori "quando non capisci dove sei e cosa fai, stampa roba a video" :D mi hai dato un suggerimento per partire
- mi sono reso conto che  usare una variabile di lingua nel form per la definizione del messaggio da backend era un po' troppo, così l'ho infilata nel codice
- per capire se funzionava, ho indagato e scoperto quale fosse la funzione effettivamente appesa all'evento after registration e lì ho stampato un po' di roba (che viene stampata in una pagina bianca durante il caricamento del primo login)
- quando ho visto che effettivamente è l'utente registrato che scatena l'evento, quindi il plugin può recuperare la sua lingua, ho risolto :)


Ottimo  ;D  mi fa piacere di essere stato utile.
Claudio Carrera - claudio@3rd-graphic.it
partita iva: 03597950983
tel: 338 9433727

 



Web Design Bolzano Kreatif