devrabiul/laravel-geo-genius
Laravel GeoGenius adds IP-based geolocation, automatic timezone detection/conversion, locale detection with translation and number conversion, plus a country picker and phone formatting/validation. Works with Livewire and supports cookies or headers.
Laravel GeoGenius is a lightweight, flexible package for Laravel applications that handles:
It automatically retrieves detailed IP-based location data, detects the userβs timezone, sets the correct locale, and even initialises a fully-functional phone input field with country picker and validation β all seamlessly integrated into your app.
β Fully compatible with Livewire, works via cookies or headers, and enables a truly global-ready Laravel application.
Iβm proud to share that GeoGenius was featured on Laravel News in their article: βGeoGenius Package for Laravelβ.
Read it here: GeoGenius Package for Laravel β Laravel News
π Try the Live Demo

timezone column effortlesslyUnder the hood, it leverages reliable IP geolocation APIs like ipwho.is and ip-api.com with caching for optimal performance.
composer require devrabiul/laravel-geo-genius
Publish the configuration and migration stub:
php artisan vendor:publish --provider="Devrabiul\\LaravelGeoGenius\\LaravelGeoGeniusServiceProvider"
Use Laravel GeoGenius in two ways:
laravelGeoGenius() (recommended)GeoLocationServicelaravelGeoGenius()->geo()->locateVisitor();
laravelGeoGenius()->geo()->getCountry();
laravelGeoGenius()->geo()->getTimezone();
laravelGeoGenius()->geo()->getLatitude();
use Devrabiul\LaravelGeoGenius\Services\GeoLocationService;
$geo = new GeoLocationService();
$ip = $geo->getClientIp();
$locationData = $geo->locateVisitor();
Built-in auto translation and number conversion:
use function Devrabiul\LaravelGeoGenius\geniusTrans;
use function Devrabiul\LaravelGeoGenius\geniusTranslateNumber;
echo geniusTrans('welcome_message');
echo geniusTranslateNumber(12345); // Bengali digits if locale is 'bn'
Configure in config/laravel-geo-genius.php:
'translate' => [
'auto_translate' => true,
],
Laravel GeoGenius provides a set of helpful artisan commands to manage languages and translations easily:
| Command | Description |
|---|---|
php artisan geo:add-language {locale} |
Create a new language directory with starter files (e.g. en, bn). |
php artisan geo:translations-generate --locale={locale} |
Scan your app for translate('...') calls and auto-generate messages.php. |
php artisan geo:translate-language {locale} --count={n} |
Translate up to n messages from new-messages.php into messages.php. |
php artisan geo:translate-language-all {locale} --count={n} |
Keep running batch translations until all strings are translated. |
php artisan geo:translate-language-batch {locale} --count={n} |
Translate a fixed batch of n messages at a time. |
# 1. Add English language support
php artisan geo:add-language en
# 2. Generate messages.php file from all translate() calls
php artisan geo:translations-generate --locale=en
# 3. Translate up to 100 strings for English
php artisan geo:translate-language en --count=100
# 4. Keep translating until all English strings are done (300 at a time)
php artisan geo:translate-language-all en --count=300
# 5. Translate 50 strings in a batch (useful for automation)
php artisan geo:translate-language-batch en --count=50
You can programmatically change the current user's language using the changeUserLanguage method:
use Illuminate\Support\Facades\Route;
Route::get('/change-lang', function () {
// Change current user language to Bengali
laravelGeoGenius()->language()->changeUserLanguage('bn');
// Continue your logic
return redirect()->back();
});
Supported locale codes depend on your configuration (
config/laravel-geo-genius.php) and the languages you have added viageo:add-language.
genius_local_LanguageGeoGenius stores the active locale in session using:
genius_local_Language
You can read it anywhere in your app:
$currentLocale = session('genius_local_Language', app()->getLocale());
You can also apply it manually if needed:
app()->setLocale(session('genius_local_Language', config('app.locale')));
Laravel GeoGenius ships with helpful artisan commands:
| Command | Description |
|---|---|
php artisan geo:add-language {locale} |
Add a new language (e.g. en, bn) to your app. |
# Add Bengali language
php artisan geo:add-language bn
use Devrabiul\LaravelGeoGenius\Services\TimezoneService;
$tz = new TimezoneService();
// Detect user's timezone
$timezone = $tz->getUserTimezone();
// Convert UTC datetime to user timezone
echo $tz->convertToUserTimezone('2025-09-13 15:00:00');
Laravel GeoGenius ships with helpful artisan commands:
| Command | Description |
|---|---|
php artisan geo:add-timezone-column {table} |
Add a nullable timezone column to the specified table if it does not exist. |
# Add a timezone column to the 'users' table
php artisan geo:add-timezone-column users
Laravel GeoGenius makes it trivial to initialise a country-aware phone input field:
<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
{!! laravelGeoGenius()->initIntlPhoneInput() !!}
<input id="phone" type="tel" name="phone">
</body>
</html>
GeoGenius injects the detected country code into a hidden span:
<span class="system-default-country-code" data-value="us"></span>
Then you can use intl-tel-inputβs API to validate on submit:
const input = document.querySelector("#phone");
const iti = window.intlTelInput(input, {
initialCountry: document.querySelector('.system-default-country-code').dataset.value,
utilsScript: "https://cdn.jsdelivr.net/npm/intl-tel-input@19.2.15/build/js/utils.js",
});
form.addEventListener('submit', e => {
if (!iti.isValidNumber()) {
e.preventDefault();
alert('Please enter a valid phone number');
}
});
All scripts/styles are included automatically by
initIntlPhoneInput()β you only need to add the<input>and optionally the validation snippet.
Laravel GeoGenius gives you full control over which countries appear in the phone input dropdown. You can either show all countries (default) or restrict it to a specific set such as only the U.S. and Canada.
This behavior is configured in your config/laravel-geo-genius.php file under the phone_input section.
'phone_input' => [
'initial_country' => env('GEO_PHONE_DEFAULT_COUNTRY', 'us'),
'only_countries_mode' => true, // enable restriction mode
'only_countries_array' => ['us', 'ca'], // allowed countries only
'auto_insert_dial_code' => false,
'national_mode' => false,
'separate_dial_code' => false,
'show_selected_dial_code' => true,
'auto_placeholder' => 'off',
],
When only_countries_mode is true, GeoGenius will:
β
Restrict the dropdown list to countries in only_countries_array
β
Set the initial_country to the visitorβs detected country (if allowed)
β
Fallback to the default country if the detected one isnβt in the list
If the mode is disabled (false), all countries are shown automatically.
ttl_minutes = cache lifetime in minutes)127.0.0.1 or ::1We welcome contributions! Please:
Report bugs through GitHub Issues.
This package is Treeware. If you use it in production, please buy the world a tree to thank us for our work. Your support helps create employment for local families and restores wildlife habitats.
MIT License. See LICENSE for details.
See CHANGELOG.md for recent changes and updates.
How can I help you explore Laravel packages today?