This extension collects all untranslated messages in the page and then you can add a button to translate, translate automatically using google translate, check for missing translations, edit translations and more.
Basic usage:
echo Yii::t('app','Some text').' - '.Yii::t('app','some other text'); Yii::app()->translate->editLink('Translate');
In your config :
return array( 'preload'=>array('translate'),//either here or somewhere in the beginning //set up and import the module 'modules'=>array( 'translate' ), 'import'=>array( 'application.modules.translate.TranslateModule' ), 'components'=>array( //define the class and its missingTranslation event 'messages'=>array( 'class'=>'CDbMessageSource', 'onMissingTranslation' => array('TranslateModule', 'missingTranslation'), ), 'translate'=>array(//if you name your component something else change TranslateModule 'class'=>'translate.components.MPTranslate', //any avaliable options here 'acceptedLanguages'=>array( 'en'=>'English', 'pt'=>'Portugues', 'es'=>'Español' ), ), ) );
Do not forget to create the tables like described here
the name of the tables can be modified
CREATE TABLE SourceMessage ( id INTEGER PRIMARY KEY AUTO_INCREMENT, category VARCHAR(32), message TEXT ); CREATE TABLE Message ( id INTEGER, language VARCHAR(16), translation TEXT, PRIMARY KEY (id, language), CONSTRAINT FK_Message_SourceMessage FOREIGN KEY (id) REFERENCES SourceMessage (id) ON DELETE CASCADE ON UPDATE RESTRICT );
Extract the file to protected/modules
somewhere in your application define the language like the following:
//shortcut $translate=Yii::app()->translate; //in your layout add echo $translate->dropdown(); //adn this if($translate->hasMessages()){ //generates a to the page where you translate the missing translations found in this page echo $translate->translateLink('Translate'); //or a dialog echo $translate->translateDialogLink('Translate','Translate page title'); } //link to the page where you edit the translations echo $translate->editLink('Edit translations page'); //link to the page where you check for all unstranslated messages of the system echo $translate->missingLink('Missing translations page');
defaults language to use if none is set.
if null, it will receive Yii target language
options of the dialog
your google translate api key.
set this if you wish to use googles translate service to translate the messages
an array containing the languages accepted by your application.
if not set, it will receive an array containing the target language and the source language
wheter to auto translate the missing messages found on the page. Needs google api key to set
wheter to automatically set the language on the initialization of the component.
for the translate components use it like this:
Yii::app()->translate->someMethod($someArg);
Returns the language in use. The language is determined by many variables: session, post, get, header in this order. It will filter the language by using accepted languages. If is set "en_US" and it is not avaliable, then it will check if "en" is avaliable.
If $language is null then it will use getLanguage to determine it. It doesn't check if the language is in the accepted languages. Returns the language setted.
Return wheter there are messages to be translated in this page
Returns a dropdown containing all accepted languages with an onchange event that will change the application's language.
Translate some message from $sourceLanguage to $targetLanguage using google translate api. Option GoogleApiKey must be defined to use this service.
returns an array containing all languages accepted by google translate. Option googleApiKey must be defined to use this service.
Generates a link or button to the page where you translate the missing translations found in this page
Generates a link or button that generates a dialog to the page where you translate the missing translations found in this page.
Creates a link to the page where you edit the translations.
Creates a link to the page where you check all missing translations
type for any link can be 'button' or 'link'
if you are running php 5.3 you can use any method like this MPTranslate::someMethod($someArg);
For the TranslateModule
returns the translate component
used internally for the module to translate its content
the id of the translate component.
0.2.4: 29/08/2011
0.2.3: 18/08/2011
0.2.2: 23/05/2011
0.2.1: 20/05/2011
0.2: 18/05/2011
0.1: 10/05/2011
-first release
Total 20 comments
array $acceptedLanguages
Hi, I found an issue in your extension when i try to run W3C validator which doesn't include preferedlanguage in his http header request. In your components/MPTranslate, line 205, il your $language was retrieve using getPreferedLanguage (and if it returned false), you will throw a 500 error.
I fixed it adding a simple check.
I hope it can help...
Thanks ! I'm happy that it was useful to you
I believe that the functionality you are looking for is in the "editLink" method that method will create a link to the page where you edit the translations
Cheers, Gustavo
Hi gusnips great thanks for your extension it's really usefull I'm using translate as my main translation tool in my site
The list of missing translations is really usefull when I'm on a page. but now that I have done all the missing translations, it would be great to have all keys for editing at any time. it would work similarly as missing index but would list all the keys with the translations of the active language for the page we are on. is something like this maybe allready available ? hard to set up ? Thanks again
with google 'en_us' is not working you have to change it to 'en'
in the config file:
Hi Thanks for your feedback ! Glad to hear was useful for you
The best way would be to use CHtml::listData method passing the languages model as parameter
hi great plugin! really love it!
my languages are stored in database (nl, fr, ...). Because the user must be able to add languages by itself.
What is the best way to pass all the currently installed languages in the db to the 'acceptedLanguages' property?
many thanks
If you were planing to use google translate feature of this module, beware! Google Translate API it is no longer free, if you want to use this feature you should have the paid version.
@gusnips:
Hello. I think it would wonderful that missing translations could be created/edited through CJuiDialogBox. From this manner, all translations were managed in one screen:
http://www.yiiframework.com/wiki/263/cgridview-update-create-records-in-a-cjuidialog/
If you are using MySQL in MacOsX or Linux env (case sensitive) you won't be able to use "SourceMessage" neither "Message" database tables name. Your MySQL instance will create "sourcemessage" and "message" tables. Even if you are using Windows environment in localhost, you probably have an unix production environment...
To avoid a Yii exception, don't forget to add this piece of code in your config/main.php
Thanks. Im glad you liked and was useful to you.
As for the google api key, I just added a link right above the comments where you can set up and turn on the translate api.
I just uploaded a new version that will log the error instead of throw an exception.
If this is not the problem, let me know in the forum with more details and I'll look for the problem. I just re-tested here at localhost and worked just fine.
Although I have some difficult to set it up, and Google API doesn't work on testdrive on my localhost, but your work is great. For now, I can use CPhpMessageSource for static translation, and CDbMessageSource for dynamic (menu labels, category name..) one. Also, I separate the code in layout in a block, so I could render it partial on some page of my choice. Thanks for a great module.
Hi you dont need any model sample data, the data is auto-generated when you use Yii::t method
as for the table's structure, I can't think of a better one, also I don't see the need to change it
BTW, it uses the same structure as CDbMessageSource
Gustavo
it would be better if any one figure out how to create a mysql schema with at least 3 column value for both "SourceMessage" and "Message" table in easy way.
Hey schmunk. Im glad you are interested in the extension
for now, there is just this page and the forum topic to provide support
If you find it usefull, I may create a google project page for it
If you have any doubt on how to use it or find any bugs, PM me or leave a post in the forum topic
Gustavo
Do you have the code in subversion or git?
The case is wrong it should be acceptedLanguages with capital "L"
Thanks for pointing that out, I'll fix the examples here in the extension page
Gustavo
I got error:
Field "MPTranslate.acceptedlanguages" undefined. /home/luky/public_html/fb_shop/framework/YiiBase.php(217)
205 { 206 unset($args[0]); 207 $class=new ReflectionClass($type); 208 // Note: ReflectionClass::newInstanceArgs() is available for PHP 5.1.3+ 209 // $object=$class->newInstanceArgs($args); 210 $object=call_user_func_array(array($class,'newInstance'),$args); 211 } 212 } 213 else 214 $object=new $type; 215 216 foreach($config as $key=>$value) 217 $object->$key=$value; 218 219 return $object;
I have config: 'components'=>array( 'messages'=>array( 'class'=>'CDbMessageSource', 'onMissingTranslation' => array('TranslateModule', 'missingTranslation'), ), 'translate'=>array(//if you name your component something else change TranslateModule 'class'=>'translate.components.MPTranslate', //any avaliable options here 'acceptedlanguages'=>array( 'en'=>'English', 'pl'=>'Polski', ), ), )
if I remove key: 'acceptedlanguages' from config. - Working, but I haven't langugaes in menu :(
Hey, you did it. Thanks it's really usefully and handy to use.
Looks really interesting definitively gonna give it a try.
Leave a comment
Please login to leave your comment.