Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Browser Locale Laravel Package

codezero/browser-locale

Parse the browser’s Accept-Language header to get a visitor’s preferred locales in order. Returns primary locale or full locale list with language/region parts. Works in vanilla PHP and integrates with Laravel via the container.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture Fit

  • Modular & Lightweight: The package is a self-contained utility with no external dependencies, making it ideal for localization middleware or service layers in Laravel.
  • Laravel-Aligned: Leverages Laravel’s Service Provider and IoC container, reducing boilerplate for dependency injection.
  • Extensible Design: The filter system (e.g., LocaleFilter, LanguageFilter) allows for granular locale extraction, supporting use cases like:
    • Language-only fallbacks (e.g., en from en-US).
    • Country-specific routing (e.g., de-DE/de).
    • Weighted analytics (e.g., tracking q=0.8 preferences).
  • Stateless & Request-Scoped: Perfect for middleware or request-based services (e.g., LocaleMiddleware to set app()->setLocale()).

Integration Feasibility

  • Zero Configuration in Laravel: Auto-registers via ServiceProvider (Laravel 5.5+), requiring only:
    $browser = app(\CodeZero\BrowserLocale\BrowserLocale::class);
    
  • Vanilla PHP Compatibility: Works outside Laravel with one-line instantiation:
    $browser = new \CodeZero\BrowserLocale\BrowserLocale($_SERVER["HTTP_ACCEPT_LANGUAGE"]);
    
  • No Breaking Changes: Backward-compatible with PHP 7.0+ and Laravel 5.5+, with recent updates for PHP 8.2/Laravel 10.
  • Test Coverage: High (90%+ via Codacy), reducing risk of edge-case failures (e.g., malformed Accept-Language headers).

Technical Risk

  • Minimal Risk:
    • No Database/API Dependencies: Pure PHP logic; no external calls.
    • Graceful Degradation: Returns null or empty arrays for invalid input.
    • Performance: O(1) for primary locale, O(n) for full list (optimal for typical use cases).
  • Potential Pitfalls:
    • Locale Validation: The package parses but doesn’t validate locales against supported languages (e.g., zh-Hans vs. zh-Hant). May need pairing with a locale whitelist (e.g., config/app.php).
    • Middleware Overhead: If used in middleware, ensure caching (e.g., Cache::remember) to avoid reprocessing per request.
    • Laravel 9+ Alternatives: Laravel’s built-in Request::getPreferredLanguage() could replace this for basic use cases, but lacks granular filters.

Key Questions

  1. Use Case Clarity:
    • Will this replace manual locale selection (e.g., user dropdowns) or server-side defaults (e.g., config/app.php)?
    • Are you using it for UI localization, API responses, or analytics?
  2. Filter Customization:
    • Do you need custom filters (e.g., exclude en-GB for US-only apps)?
    • Will you extend the \CodeZero\BrowserLocale\Filters\Filter interface?
  3. Performance:
    • Should parsed locales be cached (e.g., in middleware or a service)?
    • Is the weight-based sorting critical for your use case (e.g., A/B testing)?
  4. Validation:
    • How will you validate parsed locales against supported languages (e.g., config/supported_locales.php)?
  5. Alternatives:
    • Could Laravel’s Request::getPreferredLanguage() (Laravel 9+) suffice, or does this package’s filter system justify the dependency?
    • Are there geolocation-based fallbacks needed (e.g., IP-based locale overrides)?

Integration Approach

Stack Fit

  • Laravel Ecosystem:
    • Middleware: Ideal for automatically setting app()->setLocale() based on browser preferences.
    • Service Layer: Use in controllers/services for dynamic content (e.g., localized APIs).
    • Request Handling: Parse Accept-Language headers in HTTP requests (e.g., for REST APIs).
  • Vanilla PHP:
    • Lightweight alternative to manual parsing of $_SERVER["HTTP_ACCEPT_LANGUAGE"].
  • Symfony/PHP Frameworks:
    • Compatible via manual instantiation (no framework-specific logic).

Migration Path

  1. Assessment:
    • Audit current locale detection (e.g., App::getLocale(), Request::header('Accept-Language')).
    • Identify gaps (e.g., lack of q value handling, no filters).
  2. Pilot Integration:
    • Replace a single locale-dependent component (e.g., a language selector dropdown).
    • Test with:
      $browser = app(\CodeZero\BrowserLocale\BrowserLocale::class);
      $locale = $browser->getLocale();
      
  3. Full Rollout:
    • Middleware Integration:
      // app/Http/Middleware/SetLocale.php
      public function handle(Request $request, Closure $next) {
          $browser = app(\CodeZero\BrowserLocale\BrowserLocale::class);
          $locale = $browser->getLocale()?->locale ?? config('app.fallback_locale');
          app()->setLocale($locale);
          return $next($request);
      }
      
    • Service Layer:
      // app/Services/LocaleService.php
      public function getPreferredLocales(): array {
          return app(\CodeZero\BrowserLocale\BrowserLocale::class)->getLocales();
      }
      
    • API Responses:
      return response()->json($data, 200, [
          'Accept-Language' => $browser->getLocale()?->locale ?? 'en-US',
      ]);
      
  4. Advanced Use Cases:
    • Custom Filters:
      $filter = new \CodeZero\BrowserLocale\Filters\LanguageFilter;
      $languages = $browser->filter($filter); // ['en', 'nl']
      
    • Fallback Logic:
      $supportedLocales = ['en-US', 'es-ES', 'fr-FR'];
      $locale = collect($browser->getLocales())
          ->first(fn ($l) => in_array($l->locale, $supportedLocales))
          ?->locale ?? 'en-US';
      

Compatibility

  • Laravel:
    • 5.5+: Auto-registers ServiceProvider.
    • 9.0+: Consider Request::getPreferredLanguage() for basic use cases (but lacks filters).
    • 10.0+: Officially supported (release 3.3.0).
  • PHP:
    • 7.0+: Core requirement.
    • 8.0+: Optimized (release 3.1.0+).
    • 8.2+: Supported (release 3.4.0).
  • Edge Cases:
    • Handles null/undefined HTTP_ACCEPT_LANGUAGE (returns null).
    • Parses malformed strings (e.g., en-US,en;q=0.8,['en-US', 'en']).

Sequencing

  1. Phase 1: Core Integration
    • Replace manual parsing with BrowserLocale in one critical path (e.g., homepage language detection).
    • Validate output against existing behavior.
  2. Phase 2: Middleware/Service Layer
    • Implement SetLocale middleware or a LocaleService.
    • Test with real user traffic (e.g., via browser dev tools).
  3. Phase 3: Advanced Features
    • Add custom filters for analytics or routing.
    • Implement caching (e.g., Cache::remember) if performance is critical.
  4. Phase 4: Deprecation
    • Phase out legacy locale logic (e.g., config/app.php overrides).

Operational Impact

Maintenance

  • Low Effort:
    • No External Dependencies: Updates via Composer (composer update codezero/browser-locale).
    • MIT License: No vendor lock-in; can fork if needed.
  • Monitoring:
    • Log edge cases (e.g., unsupported locales) for debugging:
      if ($locale === null) {
          Log::warning('No valid locale detected for request', ['headers' => $request->header()]);
      }
      
  • Deprecation:
    • Laravel’s Request::getPreferredLanguage() may reduce reliance in future, but this package’s filters justify continued use.

Support

  • Troubleshooting:
    • Common issues:
      • No locales returned: Check $_SERVER["HTTP_ACCEPT_LANGUAGE"] (e.g., browser settings or proxy stripping headers).
      • Invalid locales: Validate against a whitelist (e.g., config/supported_locales.php).
    • Debugging tools:
      $browser = new \Code
      
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
besmartand-pro/php-quality-config
sentix/ai-chatbot
terminal42/code-quality-tools
codifyo/ts-generator-bundle
testo/fiber
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity