pmochine / laravel-tongue Goto Github PK
View Code? Open in Web Editor NEW🎉 Finally a subdomain localization that works how you want it to work. 🌐
License: MIT License
🎉 Finally a subdomain localization that works how you want it to work. 🌐
License: MIT License
Hi,
I'm trying to use Laravel-Tongue with Laravel Octane.
All works as expected, except for the automatic language detection by client settings.
So, if I access the application with a language (IT in my case) that is different from the default (EN), the tongue()->detect();
do not detect the correct language.
I run the tongue()->detect()
fun from a custom middleware, because the boot()
function in Octane run only at server startup.
Laravel version: 10.15.0
Tongue version: 5.0.0
This is the middleware:
class Localize
{
public function handle(Request $request, Closure $next): Response
{
tongue()->detect();
Carbon::setLocale(tongue()->current());
Log::debug("Localize: ".tongue()->current());
return $next($request);
}
}
And my localization.php
<?php
return [
/*
|--------------------------------------------------------------------------
| Domain name
|--------------------------------------------------------------------------
|
| Here you may change the name of the domain used in your application.
| By default, the domain is read from the .env file.
| Example: APP_DOMAIN=185ad73e.eu.ngrok.io (only because of this we know what your real domain is)
|
*/
'domain' => env('APP_DOMAIN'),
/*
|--------------------------------------------------------------------------
| Beautify url
|--------------------------------------------------------------------------
|
| Use to set fallback language to mydomain.com and not to en.mydomain.com
| Other languages are getting e.g. fr.mydomain.com
|
*/
'beautify_url' => false,
/*
|--------------------------------------------------------------------------
| subdomains that are whitelisted
|--------------------------------------------------------------------------
|
| If you don't want to be redirected, when you have special subdomains
| for example 'admin', 'archontas', 'nova' etc.
|
*/
'subdomains' => [
'api'
],
/*
|--------------------------------------------------------------------------
| custom locale subdomains via aliases
|--------------------------------------------------------------------------
|
| Let's say you don't want to use locale as a subdomain.
| You can add your custom subdomains here. Example:
| gewinnen.domain.com --> "de"
| gagner.domain.com --> "fr",
|
*/
'aliases' => [
'zhs' => 'zh', //important: it has to match with an active locale from the supportedLocales list
'zht' => 'zh-Hant',
'ph' => 'fil',
'grc' => 'el'
],
/*
|--------------------------------------------------------------------------
| https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language
|--------------------------------------------------------------------------
|
| Negotiate for the user locale using the Accept-Language header if it's not defined in the URL
| If false, system will take app.php fallback locale attribute
|
*/
'acceptLanguage' => true,
/*
|--------------------------------------------------------------------------
| Cookie localization
|--------------------------------------------------------------------------
|
| Use this option to enable or disable the use of cookies
| in locale detection.
|
*/
'cookie_localization' => true,
/*
|--------------------------------------------------------------------------
| Cookie Serialization
|--------------------------------------------------------------------------
|
| If you have not changed anything in your middleware "EncryptCookies", you
| don't need to change anything here as well.
| For information visit:
| https://laravel.com/docs/5.6/upgrade#upgrade-5.6.30
*/
'cookie_serialize' => false,
/*
|--------------------------------------------------------------------------
| Prevent redirect
|--------------------------------------------------------------------------
|
| Sometimes in testing you don't want to use redirection.
| If you set the value to true, the middleware TongueSpeaksLocale
| will not redirect anymore.
|
*/
'prevent_redirect' => env('PREVENT_REDIRECT', false),
// Uncomment the languages that your site supports - or add new ones.
// These are sorted by the native name, which is the order you might show them in a language selector.
// Regional languages are sorted by their base language, so "British English" sorts as "English, British"
'supportedLocales' => [
'de' => ['name' => 'German', 'script' => 'Latn', 'native' => 'Deutsch', 'regional' => 'de_DE'],
'en' => ['name' => 'English', 'script' => 'Latn', 'native' => 'English', 'regional' => 'en_GB'],
'es' => ['name' => 'Spanish', 'script' => 'Latn', 'native' => 'español', 'regional' => 'es_ES'],
'fil' => ['name' => 'Filipino', 'script' => 'Latn', 'native' => 'Filipino', 'regional' => 'fil_PH'],
'fr' => ['name' => 'French', 'script' => 'Latn', 'native' => 'français', 'regional' => 'fr_FR'],
'it' => ['name' => 'Italian', 'script' => 'Latn', 'native' => 'italiano', 'regional' => 'it_IT'],
'hu' => ['name' => 'Hungarian', 'script' => 'Latn', 'native' => 'magyar', 'regional' => 'hu_HU'],
'pt' => ['name' => 'Portuguese', 'script' => 'Latn', 'native' => 'português', 'regional' => 'pt_PT'],
'el' => ['name' => 'Greek', 'script' => 'Grek', 'native' => 'Ελληνικά', 'regional' => 'el_GR'],
'ru' => ['name' => 'Russian', 'script' => 'Cyrl', 'native' => 'русский', 'regional' => 'ru_RU'],
'he' => ['name' => 'Hebrew', 'script' => 'Hebr', 'native' => 'עברית', 'regional' => 'he_IL'],
'ar' => ['name' => 'Arabic', 'script' => 'Arab', 'native' => 'العربية', 'regional' => 'ar_AE'],
'sa' => ['name' => 'Sanskrit', 'script' => 'Deva', 'native' => 'संस्कृतम्', 'regional' => 'sa_IN'],
'ja' => ['name' => 'Japanese', 'script' => 'Jpan', 'native' => '日本語', 'regional' => 'ja_JP'],
'zh' => ['name' => 'Chinese (Simplified)', 'script' => 'Hans', 'native' => '简体中文', 'regional' => 'zh_CN'],
'zh-Hant' => ['name' => 'Chinese (Traditional)', 'script' => 'Hant', 'native' => '繁體中文', 'regional' => 'zh_CN'],
'ko' => ['name' => 'Korean', 'script' => 'Hang', 'native' => '한국어', 'regional' => 'ko_KR'],
],
];
If I change manually the language with https://it.foo.bar
, all works.
Any idea?
Thanks!
First : thanks a lot for this package, good job !
I would like to set default language as fr
(without subdomain) and a subdomain for en
.
In /app/config.php :
'locale' => 'fr',
'fallback_locale' => 'en'
When I visit the domains :
tongue()->current()
returns en
instead of fr
tongue()->current()
returns en
(correct)However, when I use dialect()->current('fr')
it returns fr.my_domain.dv
and dialect()->current('en')
returns my_domain.dv
How can I fix it ?
Thanks a lot !
Hi, thanks for this package.
If I do this:
app.php > 'fallback_locale' => 'en'
$lang = 'en'
<a href="{{ dialect()->translate('routes.contact', null, $lang) }}">{{ __('contact.contact_us', [], $lang) }}</a>
the subdomain is included in the URL e.g.
https://en.example.test
I changed Dialect::translate to:
// Add locale to the host
//$parsed_url['host'] = $locale.'.'.Localization::domain();
// Add locale to the host if locale != fallbackLocale
if (Config::beautify() && $locale === Config::fallbackLocale()) {
$parsed_url['host'] = Localization::domain();
} else {
$parsed_url['host'] = $locale.'.'.Localization::domain();
}
Is there are better to do what I want without changing the Dialect class?
Hey if someone knows why it fails you could do me a big favor. I've no clue...
Failing: https://travis-ci.org/pmochine/Laravel-Tongue
Worked perfectly: https://travis-ci.org/pmochine/Laravel-Tongue/builds/404832988
Getting erorr when using
// routes/web.php
Route::view('/privacy', 'privacy')->name('privacy');
// some blade
@if(tongue()->current() == 'en')
<a href="{{ dialect()->current('www') }}">
@lang('text.lang_switch')
</a>
@endif
the error is TypeError
vendor\pmochine\laravel-tongue\src\Accent\Accent.php : 81
TypeError
str_replace(): Argument #2 ($replace) must be of type string when argument #1 ($search) is a string
public static function substituteAttributesInRoute($attributes, $route)
{
foreach ($attributes as $key => $value) {
$route = str_replace('{'.$key.'}', $value, $route); // error happens here
$route = str_replace('{'.$key.'?}', $value, $route);
}
Thanks
This package looks very promising! I have one question though, is it possible to use custom subdomains? I would like to use
gewinnen.domain.com --> "de"
gagner.domain.com --> "fr",
so not actually having the locale string in the domain, but I would need to map this to the specific locale somehow?
Thanks,
Robert
In my project I find bug and created pull request to fix this bug
I'm sorry, we need to wait for fix this bug
Hi man, excelent package you provide to us!
I have a config scenario...
'aliases' => [
'das' => 'pt-BR',
],
'acceptLanguage' => true,
'prevent_redirect' => env('PREVENT_REDIRECT', false),
When I try to get the app index page using a browser with pt-BR default language I got a redirection error.
Instead redirect to das.domain.test, the result is pt_br.domain.test.
Of course when I try to get directly das.domain.test I got te correct pt-BR locale.
Is it right?
Tks.
Jefferson
The issue is when you have other subdomains such as nova.domain.test, the root path will still show the original website and not changing to the Nova Admin panel. The second case is when the subdomain, in my case luxury.domain.test, it loads the other layout but the routes won't map correctly. Let me be more clear.
I have the following subdomains:
The .env values are the following:
APP_DOMAIN=domain.test
SESSION_DOMAIN=.domain.test
// config/localization.php
[
'subdomains' => [
'nova',
'luxury',
],
]
The routes within the luxury package are wrapped in this way:
Route::middleware('web')->domain('luxury.' . env('APP_DOMAIN') )->group(function(){
// routes...
});
and for nova, I have set the following values in the config:
// config/nova.php
[
'path' => '/',
]
and .env file
NOVA_DOMAIN_NAME=nova.domain.test
Now, I have two scenarios.
If I wrap my default routes within the web.php like this
Route::domain(env('APP_DOMAIN'))->group(function(){
// routes...
});
everything works fine but not the translated routes. When trying to access a translated subdomain it gives a 'route is null' or not defined.
However, in the second scenario if I remove the above code, the translated subdomains are working as intended, but the other two subdomains are behaving differently.
Route::get('contact', [ContactController::class, 'index'])->name('contact.index');
When used under the subdomain luxury.domain.test
as
{{ route('contact.index') }}
It will map to luxury.domain.test/contact
instead of domain.test/contact
.
However, every route for nova still works fine once you reach the dashboard by manually typing nova.domain.test/dashboard
or any other route.
I'm switching the languages on my site via controllers (a select
element on a form
that calls a POST route/controller when language is selected), but when I use dialect()->translate()
in my controller, to translate the current route and redirect the user to the translated route, it always returns my current POST route that is reading my request to switch the language, not the translated route that it should return.
And if I use dialect()->redirectUrl()
it returns the URL not parsed and doens't translate de route to the selected language, as its described on your documentation.
What should I do? The only solution would be switching languagues without using controllers? The dialect()->translate()
function works perfectly outside controllers.
Thank you.
Describe the bug
I'm trying to use the configuration aliases
config/localization
'aliases' => [
'www' => 'ar',
],
I've also enabled ar
in the supportedLocales
list
the issue here is dialect()->current('ar')
always return ar.domain.local
I expected to return www.domain.local
@if(tongue()->current() == 'en')
<li>
<a href="{{ dialect()->current('ar') }}">
<i class="icon fas fa-globe text-primary"></i> en
</a>
</li>
@endif
aslo
@foreach (dialect()->translateAll(true) as $locale => $url)
<a href="{{ $url }}">{{ $locale }}</a>
@endforeach
returns
<a href="http://fr.infoeg.local:8000/cairo/categories">fr</a>
<a href="http://ar.infoeg.local:8000/cairo/categories">ar</a>
while expected
<a href="http://fr.infoeg.local:8000/cairo/categories">fr</a>
<a href="http://www.infoeg.local:8000/cairo/categories">ar</a>
I'm not sure if that is a bug or I misused it
Great job 💯 Thanks a lot 👍
always getting en
as a default locale, even config/app is ar
config/app.php
'locale' => 'ar',
dd(app()->currentLocale(), tongue()->current());
output
en
en
if I commented out RouteServiceProvier.php
public function boot()
{
// tongue()->detect();
}
dd(app()->currentLocale());
output
ar
It would be nice if the routes could be cached like in mcamara/laravel-localization
php artisan route:trans:cache
Otherwise great job
I've been using this library in development, and everything was working OK, but when I upload on my production server and run composer install
, this error is thrown and all the pages stoped working:
Pmochine\LaravelTongue\Exceptions\SupportedLocalesNotDefined
Supported locales must be properly defined.
at vendor/pmochine/laravel-tongue/src/Misc/ConfigList.php:15
11| {
12| $locales = Config::supportedLocales();
13|
14| if (empty($locales) || ! is_array($locales)) {
> 15| throw new SupportedLocalesNotDefined();
16| }
17|
18| if (! $key) {
19| return collect($locales);
+5 vendor frames
6 app/Providers/RouteServiceProvider.php:33
Pmochine\LaravelTongue\Tongue::detect()
I've already tried to copy vendor file again, clear Laravel cache and nothing worked.
Could you help me?
Describe the bug
This is not actually a bug but a question because based on the readme there is no instruction on how to run or at least test this on the local environment. I already follow the step-by-step process as indicated on the readme and when I re-run the app and add a subdomain in which is my selected localization(which is FR, for example, fr.localhost:8000) but the results are error 500.
Is there any way to test it via the local environment?
Thank you.
Desktop (please complete the following information):
Additional context
Local Environment Setup:
@foreach(LaravelLocalization::getSupportedLocales() as $localeCode => $properties)
@if($url = LaravelLocalization::getLocalizedURL($localeCode) and $localeCode != LaravelLocalization::getCurrentLocale())
<a rel="alternate" hreflang="{{ $localeCode }}" href="{{$url}}" class="dropdown-item notify-item language" data-lang="{{ LaravelLocalization::getCurrentLocale() }}">
<div class="card-body p-0 d-flex">
<div class="pt-1 bd-highlight">
<img width="16" height="16" src="{{ asset('next/s3/flags/'. $localeCode .'.png') }}" alt="user-image" class="me-2 mb-2">
</div>
<h5 class="fw-semibold text-grey-900 fs-sm mt-0 me-4">
{{{ !empty($abbr) ? $localeCode : $properties['native'] }}}
</h5>
</div>
</a>
@endif
@endforeach
Describe the bug
translate function doesn't translate the given route
{{ dialect()->translate('home', [ ], 'en') }}
it just returns whatever the current url translated
Thanks 👍
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.