Skip to content

Commit

Permalink
Merge pull request #4 from q--/auto-translate
Browse files Browse the repository at this point in the history
Add automatic translation using Google Translate
  • Loading branch information
q-- authored Feb 27, 2024
2 parents f680759 + 3f00a8f commit 455056e
Show file tree
Hide file tree
Showing 6 changed files with 121 additions and 1 deletion.
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
"require": {
"php": "^8.0",
"illuminate/support": "^8.0||^9.0||^10.0",
"laravel/legacy-factories": "^1.3"
"laravel/legacy-factories": "^1.3",
"stichoza/google-translate-php": "^4.1"
},
"require-dev": {
"orchestra/testbench": "^6.0|^8.0",
Expand Down
13 changes: 13 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -199,3 +199,16 @@ This command will scan your project (using the paths supplied in the
configuration file) and create all of the missing translation keys. This can be
run for all languages or a single language.


### Automated Translation Using [Stichoza Google Translate Package](https://github.com/Stichoza/google-translate-php)

```
translation:auto-translate
```
This command will scan your project (using the paths supplied in the
configuration file) and create all of the missing translation keys. This can be
run for all languages or a single language.

It will then translate all the tokens using Google Translate for FREE!

You can edit these the auto translated texts using the [User interface](#user-interface)
1 change: 1 addition & 0 deletions resources/lang/en/translation.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
'language_key_added' => 'New language key added successfully 👏',
'no_missing_keys' => 'There are no missing translation keys in the app 🎉',
'keys_synced' => 'Missing keys synchronised successfully 🎊',
'auto_translated' => 'Automated Translation completed successfully 🎊',
'search' => 'Search all translations',
'translations' => 'Translation',
'language_name' => 'Name',
Expand Down
43 changes: 43 additions & 0 deletions src/Console/Commands/AutoTranslateKeysCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

namespace JoeDixon\Translation\Console\Commands;

use Illuminate\Console\Command;

class AutoTranslateKeysCommand extends BaseCommand
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'translation:auto-translate {language?}';

/**
* The console command description.
*
* @var string
*/
protected $description = 'Auto translate keys using google translate';

/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$language = $this->argument('language') ?: false;
try {
// if we have a language, pass it in, if not the method will
// automagically translate all languages
$this->translation->autoTranslate($language);

return $this->info(__('translation::translation.auto_translated'));
} catch (\Exception $e) {
return $this->error($e->getMessage());
}


}
}
60 changes: 60 additions & 0 deletions src/Drivers/Translation.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Str;
use JoeDixon\Translation\Events\TranslationAdded;
use Stichoza\GoogleTranslate\GoogleTranslate;

abstract class Translation
{
Expand Down Expand Up @@ -51,6 +52,65 @@ public function saveMissingTranslations($language = false)
}
}

/**
* Save all of the translations in the app without translation for a given language then
* Translate all the tokens into it's respective language using google translate
*
* @param string $language
* @return void
*/
public function autoTranslate($language = false)
{
$languages = $language ? [$language => $language] : $this->allLanguages();

foreach ($languages as $language => $name) {
$this->saveMissingTranslations($language);
$this->translateLanguage($language);
}
}

/**
*
* Translate text using Google Translate
*
* @param $language
* @param $token
* @return string|null
* @throws \ErrorException
*/
public function getGoogleTranslate($language,$token){
$tr = new GoogleTranslate($language);
return $tr->translate($token);
}

/**
* Loop through all the keys and get translated text from Google Translate
*
* @param $language
*/
public function translateLanguage($language){
$translations = $this->getSourceLanguageTranslationsWith($language);

foreach ($translations as $type => $groups) {
foreach ($groups as $group => $translations) {
foreach ($translations as $key => $value) {
$sourceLanguageValue = $value[$this->sourceLanguage];
$targetLanguageValue = $value[$language];

if (in_array($targetLanguageValue, ["", null])) {
$new_value = $this->getGoogleTranslate($language, $sourceLanguageValue);
if (Str::contains($group, 'single')) {
$this->addSingleTranslation($language, $group, $key, $new_value);
} else {
$this->addGroupTranslation($language, $group, $key, $new_value);
}
}

}
}
}
}

/**
* Get all translations for a given language merged with the source language.
*
Expand Down
2 changes: 2 additions & 0 deletions src/TranslationServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use Illuminate\Support\ServiceProvider;
use JoeDixon\Translation\Console\Commands\AddLanguageCommand;
use JoeDixon\Translation\Console\Commands\AddTranslationKeyCommand;
use JoeDixon\Translation\Console\Commands\AutoTranslateKeysCommand;
use JoeDixon\Translation\Console\Commands\ListLanguagesCommand;
use JoeDixon\Translation\Console\Commands\ListMissingTranslationKeys;
use JoeDixon\Translation\Console\Commands\SynchroniseMissingTranslationKeys;
Expand Down Expand Up @@ -151,6 +152,7 @@ private function registerCommands()
ListMissingTranslationKeys::class,
SynchroniseMissingTranslationKeys::class,
SynchroniseTranslationsCommand::class,
AutoTranslateKeysCommand::class,
]);
}
}
Expand Down

0 comments on commit 455056e

Please sign in to comment.