Module to handle translations ¶
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.
See github page
Basic usage:
echo Yii::t('app','Some text').' - '.Yii::t('app','some other text');
Yii::app()->translate->editLink('Translate');
Setup ¶
In your config :
<?php
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 id of message source must be auto-incremental ¶
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
);
How to use ¶
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');
Options avaliable ¶
string $defaultLanguage ¶
defaults language to use if none is set.
if null, it will receive Yii target language
array $dialogOptions ¶
options of the dialog
string $googleApiKey ¶
your google translate api key.
set this if you wish to use googles translate service to translate the messages
array $acceptedLanguages ¶
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
boolean $autoTranslate=false ¶
wheter to auto translate the missing messages found on the page. Needs google api key to set
boolean $autoSetLanguage=true ¶
wheter to automatically set the language on the initialization of the component.
Methods avaliable ¶
for the translate components use it like this:
Yii::app()->translate->someMethod($someArg);
string getLanguage() ¶
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.
string setLanguage($language=null) ¶
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.
boolean hasMessage() ¶
Return wheter there are messages to be translated in this page
string dropdown() ¶
Returns a dropdown containing all accepted languages with an onchange event that will change the application's language.
string googleTranslate($message,$targetLanguage=null,$sourceLanguage=null) ¶
Translate some message from $sourceLanguage to $targetLanguage using google translate api. Option GoogleApiKey must be defined to use this service.
array getGoogleAcceptedLanguages($targetLanguage=null) ¶
returns an array containing all languages accepted by google translate. Option googleApiKey must be defined to use this service.
string translateLink($label,$type='link') ¶
Generates a link or button to the page where you translate the missing translations found in this page
string translateDialogLink($label,$title=null,$type='link') ¶
Generates a link or button that generates a dialog to the page where you translate the missing translations found in this page.
string editLink($label,$type='link') ¶
Creates a link to the page where you edit the translations.
string missingLink($label,$type='link') ¶
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
MPTranslate translator() ¶
returns the translate component
string t($message,$params=array()) ¶
used internally for the module to translate its content
string $translateComponentId='translate' ¶
the id of the translate component.
Version ¶
0.2.5 24/07/2014
- message and categories are now case-insensitive
- fix page count in missing translate page
0.2.4: 29/08/2011
- Fixed bug when no translation found.
- Fixed typos in documentation.
- Changed file encoding of all files to utf-8
0.2.3: 18/08/2011
- options languageKey is now a constant named ID
- Google errors are now logged instead of beeing treated as an exception
0.2.2: 23/05/2011
- Fixed pagination in dialog and textarea size
0.2.1: 20/05/2011
- Fixed some minor bugs
0.2: 18/05/2011
- complete rewrite of the code to allow easier customization
- added google translate support (thanks to Toshi)
- added defaultLanguage (thanks to duna)
- fixed a couple of minor bugs
- added a lof of new funcionalities
0.1: 10/05/2011
-first release
Interesting
Looks really interesting definitively gonna give it a try.
Google Translate
Hey, you did it.
Thanks it's really usefully and handy to use.
big problem...
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 Luki
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
Project Page
Do you have the code in subversion or git?
Project Page
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
model with sample data
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.
@ismail
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
Greate module
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.
@dinhtrung
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.
Case sensitive Db environment issue
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
'messages'=>array( 'class'=>'CDbMessageSource', 'onMissingTranslation' => array('TranslateModule', 'missingTranslation'), 'sourceMessageTable'=>'sourcemessage', // will not use Yii Core framework/i18n/CdbMessageSource.php public case sensitive attributes values. 'translatedMessageTable'=>'message', // will not use Yii Core framework/i18n/CdbMessageSource.php public case sensitive attributes values. ),
Update records in missing.php view with CJuiDialog
@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/
Google Translate is no longer free
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.
Important: Google Translate API v2 is now available as a paid service only, and the number of requests your application can make per day is limited. As of December 1, 2011, Google Translate API v1 is no longer available; it was officially deprecated on May 26, 2011
db languages
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
@Reolbox
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
If using google change language code to work
with google 'en_us' is not working
you have to change it to 'en'
in the config file:
'sourceLanguage' =>'en',
get keys and translations of a page (allready translated ones)
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
@oceatoon
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
getPreferedLanguage false doesn't managed yet
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.
// l.205 where $language has to be a string if(!key_exists($language,$this->acceptedLanguages)){
I fixed it adding a simple check.
if(($language=@$this->_cache['language'])!==null) return $language; elseif(Yii::app()->getSession()->contains($key)) $language=Yii::app()->getSession()->get($key); elseif(isset($_POST[$key]) && !empty($_POST[$key])) $language=$_POST[$key]; elseif(isset($_GET[$key]) && !empty($_GET[$key])) $language=$_GET[$key]; //else // $language=Yii::app()->getRequest()->getPreferredLanguage(); else if (Yii::app()->getRequest()->getPreferredLanguage()!=false) $language=Yii::app()->getRequest()->getPreferredLanguage(); else $language=$this->defaultLanguage; if(!key_exists($language,$this->acceptedLanguages)){
I hope it can help...
where and how i use these options?
array $acceptedLanguages
Dynamically load this module
Hi,
First of all thank you for this awesome work, very useful :)
You say this module will slow down your application, use it for development only.
So, is it possible to load this module dynamically just for special users ?
It's not fully tested. I'm expecting your feedback to improve it
Did you write unit tests ? Is it possible to get them ?
@tenebriox
Hey tenebriox
I didn't write unit tests for it, but it has been stable for some time now.
about load for some users only, yes
I only load it on administrative application, but I guess you can check if user has access in onBeginRequest event (before the application dispatch the route) and add the module dinamically if he has
Yii::app()->setModules(array('translate'));
and define the component as usual
also check access before add links to translate pages
Cheers,
Gustavo
redirect after switching language
Hi,
First of all, thank you for this great extension :)
In TranslateBaseController.php there's a redirect() method.
From what I understood, this is called when the user selects a new language.
I've got an iFrame in the page I'm using, and you may know, in some browsers an iFrame needs to be "manually" refreshed in order to reload with the right content.
So I've put the following line of code, right after registerScript() call:
I know this code does the job to refresh the ifram, but it doesn't seem to be used at all in the page after the redirection.
Am I missing anything?
Thanks for your help.
theparisian
@theparisian
Not clear!! can you please explain
Examples?!
Hi there. Is there any more examples?....
@Shahcheraghean
Usage examples?
@Rajith R
Yes please, Usage and configurations?!
So Thanks.
@Shahcheraghean
to set language dynamically
$lan='en_us'; Yii::app()->translate->setLanguage($lan);
You set $lan according your wish at main layout or somewhere else!!
@Shahcheraghean
translate/edit
and
translate/edit/missing
are two important actions!
not able to translate all the components of the page
Is it possible to translate the whole page without using Yii::t on each content type ?
I was hoping for something that works on the lines of me selecting a language and the whole page showing translated to the selected language.
how store all messages in database
Thanks for great module.
1- In here when visit a page, store all words(in current page) of Yii::t in database, but how can store all words of all .php files in database just by one click, be like
yiic message messages/config.php
command.bug in show pagination
2- The pagination of translate/edit/missing page, didn't show! I thinks it's a bug.
about slow
3- Note about your last paragraph that you said this module is slow, I against with this subject! Note that when exist missing translated word, execute one query for each Yii:t, and this is correct and was slow, But If you do translate all words in all language, so don't execute addition query and was fast.
@Nabi
1-It doesn't have this ability yet. Could you open a ticket in github page? As soon as I have time I'll implement it.
2-For none of those pages? It should have. It showed to me last time I check. I'll take a look around and get back to you
3-You are probably right! I actually didn't check this scenario but the logic is right. I usually use only in development and enable it in admin application
bug in case insensitive words
4- I find a bug, the missingTranslation() function is not case insensitive, so if exist a record with name "By" and translated it, then if use Yii::t('main', 'by'); don't show translated "By" and also don't add record "by" for new translate!
@Gustavo
what are the changes/upgrades in the new version?
@Rajith R
I just added. Thanks for the reminder
Which are the files to replace?
Thanks Gustavo . Which are the files to replace? Please let us know.
@Rajith R
Only components/MPTranslate.php was changed
Cool
Thank you. So we just need to replace that file. right?
@Rajith R
yes, that's it
@Gustavo
I replaced the file , but Pagination is not showing.
@Rajith R
Please open a bug at github so I can take a look whenever I have some time
Link: https://github.com/gusnips/yii.translate/issues
Thanks for the feedback, though!
@Gustavo
Started .
https://github.com/gusnips/yii.translate/issues/6
Need some examples how to use it
Need some examples how to use it.
Please share some examples
how can we use it in model, view and controller?
@Yatin Mistry
You just need to add the 'translate' component to your application, which populate the missing messages, and then add links to be able to translate those missing messages.
@Yatin Mistry
Yii::t('app','Some text')
This is a critical error
This is a critical error: https://github.com/gusnips/yii.translate/issues/7
@rask
$lan='en_us'; Yii::app()->translate->setLanguage($lan);
Set like this in main layout and try
If you have any questions, please ask in the forum instead.
Signup or Login in order to comment.