Skip to content

Basic Usage

Rumen Damyanov edited this page Jul 31, 2025 · 1 revision

Basic Usage Examples

Comprehensive examples showing all the core functionality of the php-geolocation package.

Table of Contents

Simple Country Detection

Get Visitor's Country

<?php
require_once 'vendor/autoload.php';

use Rumenx\Geolocation\Geolocation;

$geo = new Geolocation();
$country = $geo->getCountryCode();

if ($country) {
    echo "Visitor is from: {$country}";
    // Output: "Visitor is from: US"
} else {
    echo "Country could not be determined";
}

Country-Based Logic

$geo = new Geolocation();
$country = $geo->getCountryCode();

switch ($country) {
    case 'US':
    case 'CA':
        $currency = 'USD';
        $timezone = 'America/New_York';
        break;
    case 'GB':
        $currency = 'GBP';
        $timezone = 'Europe/London';
        break;
    case 'DE':
    case 'FR':
        $currency = 'EUR';
        $timezone = 'Europe/Berlin';
        break;
    default:
        $currency = 'USD';
        $timezone = 'UTC';
}

echo "Currency: {$currency}, Timezone: {$timezone}";

Language Detection

Basic Language Mapping

$countryToLanguage = [
    'US' => ['en'],
    'CA' => ['en', 'fr'],     // Multiple languages
    'GB' => ['en'],
    'DE' => ['de'],
    'FR' => ['fr'],
    'ES' => ['es'],
    'JP' => ['ja'],
    'BR' => ['pt'],
];

$geo = new Geolocation($_SERVER, $countryToLanguage);
$country = $geo->getCountryCode();
$language = $geo->getLanguageForCountry($country);

echo "Country: {$country}, Language: {$language}";
// Output: "Country: DE, Language: de"

Advanced Language Negotiation

// Available languages on your website
$availableLanguages = ['en', 'fr', 'de', 'es'];

$geo = new Geolocation($_SERVER, $countryToLanguage);
$country = $geo->getCountryCode();

// Get language considering available site languages
$language = $geo->getLanguageForCountry($country, $availableLanguages);

if ($language) {
    echo "Suggested language: {$language}";
} else {
    echo "Using default language: en";
    $language = 'en';
}

Browser Language Preference

$geo = new Geolocation();

// Get preferred language from Accept-Language header
$preferredLang = $geo->getPreferredLanguage();
echo "Browser prefers: {$preferredLang}";
// Output: "Browser prefers: en-US"

// Get all accepted languages
$info = $geo->getGeoInfo(['all_languages']);
print_r($info['all_languages']);
// Output: ['en-US', 'en', 'fr']

Client Information

Browser Detection

$geo = new Geolocation();
$browser = $geo->getBrowser();

if ($browser) {
    echo "Browser: {$browser['browser']} v{$browser['version']}";
    // Output: "Browser: Chrome v91.0"
} else {
    echo "Browser could not be detected";
}

Operating System Detection

$geo = new Geolocation();
$os = $geo->getOs();

echo "Operating System: {$os}";
// Output: "Operating System: Windows 10"

// OS-specific logic
if (strpos($os, 'Windows') !== false) {
    $downloadLink = '/downloads/app-windows.exe';
} elseif (strpos($os, 'Mac') !== false) {
    $downloadLink = '/downloads/app-macos.dmg';
} else {
    $downloadLink = '/downloads/app-linux.tar.gz';
}

Device Type Detection

$geo = new Geolocation();
$device = $geo->getDeviceType();

switch ($device) {
    case 'mobile':
        $template = 'mobile.php';
        $features = ['touch', 'compact-ui'];
        break;
    case 'tablet':
        $template = 'tablet.php';
        $features = ['touch', 'medium-ui'];
        break;
    case 'desktop':
    default:
        $template = 'desktop.php';
        $features = ['mouse', 'full-ui'];
        break;
}

echo "Device: {$device}, Template: {$template}";

Screen Resolution

$geo = new Geolocation();
$resolution = $geo->getResolution();

if ($resolution['width'] && $resolution['height']) {
    $width = $resolution['width'];
    $height = $resolution['height'];

    echo "Screen: {$width}x{$height}";

    // Responsive logic
    if ($width >= 1920) {
        $layout = 'extra-large';
    } elseif ($width >= 1200) {
        $layout = 'large';
    } elseif ($width >= 768) {
        $layout = 'medium';
    } else {
        $layout = 'small';
    }

    echo "Layout: {$layout}";
}

Complete Visitor Data

Get All Information

$geo = new Geolocation();
$info = $geo->getGeoInfo();

// Display all available information
foreach ($info as $key => $value) {
    if (is_array($value)) {
        echo "{$key}: " . json_encode($value) . "\n";
    } else {
        echo "{$key}: {$value}\n";
    }
}

/* Output:
country_code: US
ip: 192.168.1.1
preferred_language: en-US
all_languages: ["en-US","en"]
browser: {"browser":"Chrome","version":"91.0"}
os: Windows 10
device: desktop
resolution: {"width":1920,"height":1080}
*/

Get Specific Fields Only

$geo = new Geolocation();

// Get only country and language information
$basicInfo = $geo->getGeoInfo(['country_code', 'preferred_language']);

// Get only technical information
$techInfo = $geo->getGeoInfo(['browser', 'os', 'device', 'resolution']);

// Get only network information
$networkInfo = $geo->getGeoInfo(['country_code', 'ip']);

print_r($basicInfo);
// Output: ['country_code' => 'US', 'preferred_language' => 'en-US']

Cookie Management

Language Cookie Detection

$geo = new Geolocation($_SERVER, $countryToLanguage, 'user_language');

// Check if language cookie should be set
if ($geo->shouldSetLanguage()) {
    $detectedLang = $geo->getLanguageForCountry($geo->getCountryCode());

    // Set language cookie
    setcookie('user_language', $detectedLang, time() + (86400 * 30), '/');

    echo "Language cookie set to: {$detectedLang}";
} else {
    echo "Language cookie already exists";
}

Custom Cookie Names

// Different cookie names for different purposes
$mainGeo = new Geolocation($_SERVER, $countryToLanguage, 'main_lang');
$adminGeo = new Geolocation($_SERVER, $countryToLanguage, 'admin_lang');

// Check main site language
if ($mainGeo->shouldSetLanguage()) {
    setcookie('main_lang', 'en', time() + (86400 * 30), '/');
}

// Check admin language separately
if ($adminGeo->shouldSetLanguage()) {
    setcookie('admin_lang', 'en', time() + (86400 * 30), '/admin');
}

Local Development Testing

Development Detection

$geo = new Geolocation();

if ($geo->isLocalDevelopment()) {
    echo "Running in development mode\n";
    echo "Simulation features available\n";

    // Show debugging information
    $ip = $geo->getIp();
    echo "Current IP: {$ip}\n";
} else {
    echo "Running in production mode\n";
    echo "Using real Cloudflare data\n";
}

Country Simulation

// Test different countries
$testCountries = ['US', 'CA', 'GB', 'DE', 'FR', 'JP'];

foreach ($testCountries as $country) {
    $geo = Geolocation::simulate($country);
    $info = $geo->getGeoInfo(['country_code', 'preferred_language']);

    echo "Simulating {$country}: ";
    echo "Language = {$info['preferred_language']}\n";
}

/* Output:
Simulating US: Language = en-US
Simulating CA: Language = en-CA
Simulating GB: Language = en-GB
Simulating DE: Language = de-DE
Simulating FR: Language = fr-FR
Simulating JP: Language = ja-JP
*/

Custom Simulation

// Simulate with custom options
$customGeo = Geolocation::simulate('DE', $countryToLanguage, 'lang', [
    'user_agent' => 'Custom Browser/1.0',
    'languages' => ['de-DE', 'en'],
    'ip_range' => '192.168.1.'
]);

$info = $customGeo->getGeoInfo();
echo "Custom simulation: {$info['country_code']} - {$info['browser']['browser']}";

Practical Examples

Multi-language Website

function detectUserLanguage($availableLanguages = ['en', 'fr', 'de', 'es']) {
    $countryToLanguage = [
        'US' => ['en'], 'CA' => ['en', 'fr'], 'GB' => ['en'],
        'DE' => ['de'], 'AT' => ['de'], 'CH' => ['de', 'fr'],
        'FR' => ['fr'], 'BE' => ['fr', 'de'],
        'ES' => ['es'], 'MX' => ['es'], 'AR' => ['es'],
    ];

    $geo = new Geolocation($_SERVER, $countryToLanguage, 'site_lang');

    if ($geo->shouldSetLanguage()) {
        $country = $geo->getCountryCode();
        $language = $geo->getLanguageForCountry($country, $availableLanguages);

        if ($language) {
            setcookie('site_lang', $language, time() + (86400 * 30), '/');
            return $language;
        }
    }

    // Return existing cookie value or default
    return $_COOKIE['site_lang'] ?? 'en';
}

$userLanguage = detectUserLanguage();
echo "User language: {$userLanguage}";

Content Localization

function getLocalizedContent($contentKey) {
    $geo = new Geolocation();
    $country = $geo->getCountryCode();

    $content = [
        'welcome' => [
            'US' => 'Welcome to our website!',
            'DE' => 'Willkommen auf unserer Website!',
            'FR' => 'Bienvenue sur notre site web!',
            'ES' => '¡Bienvenido a nuestro sitio web!',
            'default' => 'Welcome to our website!'
        ],
        'currency' => [
            'US' => 'USD', 'CA' => 'CAD',
            'GB' => 'GBP', 'DE' => 'EUR', 'FR' => 'EUR',
            'JP' => 'JPY', 'default' => 'USD'
        ]
    ];

    return $content[$contentKey][$country] ?? $content[$contentKey]['default'];
}

echo getLocalizedContent('welcome');
echo "\nCurrency: " . getLocalizedContent('currency');

Error Handling

Graceful Degradation

function safeGeolocation() {
    try {
        $geo = new Geolocation();
        $country = $geo->getCountryCode();

        return $country ?: 'US'; // Default to US if no country detected
    } catch (Exception $e) {
        // Log error and return default
        error_log("Geolocation error: " . $e->getMessage());
        return 'US';
    }
}

$country = safeGeolocation();
echo "Safe country detection: {$country}";

Validation

function validateGeolocationData($geo) {
    $country = $geo->getCountryCode();
    $ip = $geo->getIp();

    $errors = [];

    if (!$country || strlen($country) !== 2) {
        $errors[] = 'Invalid country code';
    }

    if (!$ip || !filter_var($ip, FILTER_VALIDATE_IP)) {
        $errors[] = 'Invalid IP address';
    }

    return $errors;
}

$geo = new Geolocation();
$errors = validateGeolocationData($geo);

if (empty($errors)) {
    echo "Geolocation data is valid";
} else {
    echo "Validation errors: " . implode(', ', $errors);
}

Next Steps


Previous: Quick Start Guide | Next: Laravel Integration

Clone this wiki locally