dejurin/php-google-translate-for-free
PHP library providing a free, unofficial Google Translate client. Translate text between languages without API keys by scraping the web translate endpoint; simple usage for quick translations, though it may break if Google changes and isn’t suitable for heavy production use.
Installation
composer require dejurin/php-google-translate-for-free
Ensure your composer.json includes "minimum-stability": "dev" if using pre-release versions (though this package is outdated).
Basic Usage
use Dejurin\GoogleTranslate\GoogleTranslate;
$translator = new GoogleTranslate('en', 'es'); // Source and target languages
$translation = $translator->translate('Hello, world!');
echo $translation; // Outputs: "¡Hola, mundo!"
First Use Case
$userInput = request()->input('comment');
$translated = (new GoogleTranslate('en', 'fr'))->translate($userInput);
Batch Translations
$translator = new GoogleTranslate('en', 'de');
$texts = ['Hello', 'Goodbye', 'Thank you'];
$translations = $translator->translateArray($texts);
// Returns: ['Hallo', 'Auf Wiedersehen', 'Danke']
Language Detection
$detector = new GoogleTranslate();
$language = $detector->detect('Bonjour'); // Returns 'fr'
Laravel Service Provider Integration
// config/services.php
'google_translate' => [
'default' => 'en-es',
'connections' => [
'en-es' => ['source' => 'en', 'target' => 'es'],
],
];
// app/Providers/AppServiceProvider.php
public function register()
{
$this->app->singleton(GoogleTranslate::class, function ($app) {
$config = config('services.google_translate.default');
return new GoogleTranslate(
config("services.google_translate.connections.{$config}.source"),
config("services.google_translate.connections.{$config}.target")
);
});
}
Middleware for Auto-Translation
// app/Http/Middleware/TranslateContent.php
public function handle($request, Closure $next)
{
$translated = app(GoogleTranslate::class)->translate($request->input('content'));
$request->merge(['translated_content' => $translated]);
return $next($request);
}
Queueing Long Translations
// Dispatch a job for async translation
TranslateJob::dispatch($text, 'en', 'es');
Rate Limiting
$translator->setMaxRetries(3);
$translator->setRetryDelay(2); // seconds
Deprecated API
Language Codes
en, es). Unsupported codes (e.g., zh-cn) will fail silently.$supported = ['en', 'es', 'fr', 'de', 'it'];
if (!in_array($sourceLang, $supported)) {
throw new \InvalidArgumentException("Unsupported source language");
}
Character Limits
function chunkTranslate($text, $chunkSize = 4000) {
$chunks = array_chunk(str_split($text, $chunkSize), 1);
$results = [];
foreach ($chunks as $chunk) {
$results[] = $translator->translate(implode('', $chunk));
}
return implode('', $results);
}
Caching
$cacheKey = "translate_{$source}_{$target}_{$text}";
return cache()->remember($cacheKey, now()->addHours(1), function () use ($translator, $text, $source, $target) {
return $translator->translate($text);
});
Enable Logging Add a logger to track failures:
$translator->setLogger(app(\Psy\Logger::class));
Mock for Testing Use a mock for unit tests:
$mock = Mockery::mock(GoogleTranslate::class);
$mock->shouldReceive('translate')->andReturn('Mocked translation');
$this->app->instance(GoogleTranslate::class, $mock);
Fallback Mechanism
Combine with a fallback translator (e.g., Symfony’s TranslatorComponent) if Google fails:
try {
return $translator->translate($text);
} catch (\Exception $e) {
return app(\Symfony\Component\Translation\Translator::class)->trans($text);
}
Custom HTTP Client Override the default Guzzle client for proxies/headers:
$client = new \GuzzleHttp\Client([
'timeout' => 10,
'headers' => ['User-Agent' => 'MyApp/1.0'],
]);
$translator = new GoogleTranslate('en', 'es', $client);
Event Dispatching Trigger events on success/failure:
$translator->onSuccess(function ($translation) {
event(new TranslationSucceeded($translation));
});
$translator->onFailure(function ($exception) {
event(new TranslationFailed($exception));
});
Language Fallback Extend to auto-fallback to a default language on detection failure:
public function detect($text, $fallback = 'en') {
try {
return parent::detect($text);
} catch (\Exception $e) {
return $fallback;
}
}
How can I help you explore Laravel packages today?