arnaldotomo / laravel-lusophone
The complete Portuguese localization package for Laravel applications. Automatically translates ALL application text and adapts to all Lusophone countries with smart region detection, cultural context awareness, and comprehensive validation rules. Now with universal translation system!
Requires
- php: ^8.1
- ext-bcmath: *
- ext-json: *
- laravel/framework: ^10.0|^11.0|^12.0
Requires (Dev)
- laravel/pint: ^1.0
- mockery/mockery: ^1.4.4
- orchestra/testbench: ^8.0|^9.0
- phpstan/phpstan: ^1.0
- phpunit/phpunit: ^10.0
README
✨ A Primeira Biblioteca Laravel Verdadeiramente Abrangente para Localização Portuguesa
Detecta automaticamente a localização dos seus utilizadores e adapta a sua aplicação ao português específico, contexto cultural e requisitos de validação locais.
🇲🇿 Construído em Moçambique para todo o mundo lusófono 🌍
🚀 📖 DOCUMENTAÇÃO OFICIAL COMPLETA →
👆 Acesse a documentação oficial interativa com guias detalhados, exemplos práticos e API reference completa!
Este pacote fornece traduções completas do Laravel para Português de Portugal (pt-PT), incluindo todas as mensagens de validação, autenticação, paginação e outras strings padrão do framework.
🎯 Visão Geral
O Que Faz
- ✅ Detecção Automática: Identifica o país do utilizador via IP, headers e preferências de idioma
- ✅ Validação Universal: Uma regra funciona em todos os países lusófonos
- ✅ Formatação Inteligente: Moeda, datas e números no formato local
- ✅ Contexto Cultural: Adapta formalidade e terminologia automaticamente
- ✅ Zero Configuração: Funciona imediatamente após instalação
Países Suportados
País | Código | Moeda | Validação | Terminologia |
---|---|---|---|---|
🇵🇹 Portugal | PT | EUR (€) | NIF | Formal europeia |
🇧🇷 Brasil | BR | BRL (R$) | CPF | Informal brasileira |
🇲🇿 Moçambique | MZ | MZN (MT) | NUIT | Mista PT/BR |
🇦🇴 Angola | AO | AOA (Kz) | NIF | Formal africana |
🇨🇻 Cabo Verde | CV | CVE (Esc) | NIF | Formal |
🇬🇼 Guiné-Bissau | GW | XOF (CFA) | NIF | Formal |
🇸🇹 São Tomé | ST | STN (Db) | NIF | Formal |
🇹🇱 Timor-Leste | TL | USD ($) | ID | Formal |
📥 Instalação
Requisitos
- PHP 8.1 ou superior
- Laravel 10.x, 11.x ou 12.x
1. Instalação via Composer
composer require arnaldotomo/laravel-lusophone
2. Publicação de Recursos (Opcional)
# Publicar ficheiros de idioma (opcional - funciona sem publicar) php artisan vendor:publish --tag=lusophone-lang # Publicar configuração (opcional - padrões sensatos fornecidos) php artisan vendor:publish --tag=lusophone-config
3. Configuração Inicial (Opcional)
# Comando de setup interativo php artisan lusophone:setup # Ou forçar região específica php artisan lusophone:setup --region=MZ --publish
✅ Pronto! A biblioteca está a funcionar automaticamente.
🚀 Utilização Básica
🌟 Magia Automática
O package funciona automaticamente sem qualquer configuração:
// Utilizador de Moçambique visita a aplicação // Package detecta automaticamente MZ e adapta: __('validation.required', ['attribute' => 'email']); // → "O campo email é obrigatório" (usa 'email', não 'correio electrónico') __('validation.required', ['attribute' => 'phone']); // → "O campo celular é obrigatório" (usa 'celular', não 'telemóvel')
// Utilizador de Portugal visita a mesma aplicação // Package detecta automaticamente PT e adapta: __('validation.required', ['attribute' => 'email']); // → "O campo correio electrónico é obrigatório" __('validation.required', ['attribute' => 'phone']); // → "O campo telemóvel é obrigatório"
✅ Validação Universal
Uma regra de validação funciona em todos os países:
// Formulário universal que funciona em qualquer país lusófono $rules = [ 'name' => 'required|string|max:255', 'email' => 'required|email', 'tax_id' => 'required|lusophone_tax_id', // Auto-detecta NIF/NUIT/CPF 'phone' => 'required|lusophone_phone', // Auto-detecta formato local 'postal_code' => 'nullable|lusophone_postal', // Auto-detecta código postal ]; // Resultado automático por país: // 🇲🇿 Moçambique: valida NUIT (9 dígitos) // 🇵🇹 Portugal: valida NIF (9 dígitos + algoritmo) // 🇧🇷 Brasil: valida CPF (11 dígitos + algoritmo) // 🇦🇴 Angola: valida NIF angolano (10 dígitos)
💰 Formatação Inteligente de Moeda
use Illuminate\Support\Str; // Formata automaticamente baseado na localização do utilizador $price = 1500.50; echo Str::lusophoneCurrency($price); // Resultados automáticos: // 🇵🇹 Portugal: "1.500,50 €" // 🇲🇿 Moçambique: "1.500,50 MT" // 🇦🇴 Angola: "1.500,50 Kz" // 🇧🇷 Brasil: "R$ 1.500,50" echo $current = Lusophone::formatCurrency(1500.50, "MZ"); // 🇲🇿 Moçambique: "1.500,50 MT"
🎭 Funcionalidades Avançadas
🔧 Controle Manual
use ArnaldoTomo\LaravelLusophone\Facades\Lusophone; // Forçar região específica (útil para testes) Lusophone::forceRegion('MZ'); // Obter região detectada $region = Lusophone::detectRegion(); // 'MZ', 'PT', 'AO', etc. // Obter informações do país $info = Lusophone::getCountryInfo('MZ'); // [ // 'name' => 'Moçambique', // 'currency' => 'MZN', // 'currency_symbol' => 'MT', // 'phone_prefix' => '+258', // 'formality' => 'mixed' // ] // Limpar cache de detecção Lusophone::clearDetectionCache();
🎯 Validações Específicas por País
// Para casos onde precisa de validação específica $rules = [ // Portugal 'nif' => 'required|nif_portugal', // Moçambique 'nuit' => 'required|nuit_mozambique', // Brasil 'cpf' => 'required|cpf_brazil', // Ou universal (recomendado) 'documento' => 'required|lusophone_tax_id', ];
🌐 Tradução Contextual
// Tradução com contexto cultural Lusophone::contextualTranslate('welcome.message', 'business'); // Contexto empresarial: "Bem-vindo ao sistema, Estimado Cliente" Lusophone::contextualTranslate('welcome.message', 'casual'); // Contexto casual: "Olá! Bem-vindo" // Detecção automática de contexto $context = Lusophone::detectContext(); // 'business' (9h-17h, URLs /admin), 'government' (URLs /gov), 'casual' (outros)
📊 Análise de Traduções
// Verificar traduções em falta $missing = Lusophone::getMissingTranslations([ 'validation.required', 'auth.failed', 'custom.welcome' ]); // Verificar se tradução existe if (Lusophone::hasTranslation('validation.email', 'MZ')) { // Tradução disponível para Moçambique }
🛠️ Exemplos Práticos
🏪 E-commerce Completo
// routes/web.php Route::post('/checkout', function (Request $request) { // Validação universal - funciona em qualquer país $validated = $request->validate([ 'name' => 'required|string|max:255', 'email' => 'required|email', 'tax_id' => 'required|lusophone_tax_id', 'phone' => 'required|lusophone_phone', 'postal_code' => 'required|lusophone_postal', 'address' => 'required|string|max:500', ]); // Formatação automática baseada no país do utilizador $region = Lusophone::detectRegion(); $currency = Lusophone::getCurrencyInfo($region); return response()->json([ 'message' => __('checkout.success'), 'total' => Str::lusophoneCurrency(250.00), 'currency' => $currency, 'region' => $region, ]); });
Resultado para utilizador moçambicano:
{ "message": "Compra realizada com sucesso", "total": "250,00 MT", "currency": {"code": "MZN", "symbol": "MT"}, "region": "MZ" }
🏦 Sistema Bancário Multi-País
// app/Http/Controllers/AccountController.php class AccountController extends Controller { public function create(Request $request) { $region = Lusophone::detectRegion(); // Regras de validação adaptáveis $rules = [ 'name' => 'required|string', 'email' => 'required|email|unique:users', 'phone' => 'required|lusophone_phone', ]; // Adicionar validação específica por região switch ($region) { case 'PT': $rules['nif'] = 'required|nif_portugal'; $rules['iban'] = 'required|lusophone_iban'; break; case 'MZ': $rules['nuit'] = 'required|nuit_mozambique'; // Moçambique não usa IBAN break; case 'BR': $rules['cpf'] = 'required|cpf_brazil'; break; default: $rules['tax_id'] = 'required|lusophone_tax_id'; } $validated = $request->validate($rules); // Criar conta com dados regionalmente corretos $account = Account::create([ 'name' => $validated['name'], 'email' => $validated['email'], 'phone' => $validated['phone'], 'tax_id' => $validated['nif'] ?? $validated['nuit'] ?? $validated['cpf'] ?? $validated['tax_id'], 'region' => $region, 'currency' => Lusophone::getCurrencyInfo($region)['code'], ]); return response()->json([ 'message' => __('account.created'), 'account' => $account, 'welcome_bonus' => Str::lusophoneCurrency(50.00), ]); } }
📱 API Mobile Multicountry
// app/Http/Controllers/Api/UserController.php class UserController extends Controller { public function profile(Request $request) { $region = Lusophone::detectRegion(); $user = $request->user(); return response()->json([ 'user' => $user, 'regional_info' => [ 'region' => $region, 'country' => Lusophone::getCountryInfo($region)['name'], 'currency' => Lusophone::getCurrencyInfo($region), 'tax_id_label' => Lusophone::getTaxIdFieldName($region), 'phone_label' => Lusophone::getPhoneFieldName($region), ], 'localized_labels' => [ 'email' => __('attributes.email'), 'phone' => __('attributes.phone'), 'address' => __('attributes.address'), ], 'validation_rules' => Lusophone::getValidationRules($region), ]); } public function updateProfile(Request $request) { $rules = [ 'name' => 'required|string|max:255', 'email' => 'required|email', 'phone' => 'required|lusophone_phone', 'tax_id' => 'nullable|lusophone_tax_id', 'address' => 'nullable|string|max:500', 'postal_code' => 'nullable|lusophone_postal', ]; $validated = $request->validate($rules); $request->user()->update($validated); return response()->json([ 'message' => __('profile.updated'), 'user' => $request->user()->fresh(), ]); } }
🎭 Formulário com Contexto Cultural
// resources/views/contact.blade.php @php $context = Lusophone::detectContext(); $region = Lusophone::detectRegion(); $isBusinessHours = $context === 'business'; @endphp <form method="POST" action="/contact"> @csrf <div class="form-group"> <label>{{ __('form.name') }}</label> <input type="text" name="name" required> @error('name') <span class="error">{{ $message }}</span> @enderror </div> <div class="form-group"> <label>{{ __('attributes.email') }}</label> <input type="email" name="email" required> @error('email') <span class="error">{{ $message }}</span> @enderror </div> <div class="form-group"> <label>{{ Lusophone::getPhoneFieldName($region) }}</label> <input type="tel" name="phone" placeholder="{{ Lusophone::getCountryInfo($region)['phone_prefix'] }}"> @error('phone') <span class="error">{{ $message }}</span> @enderror </div> <div class="form-group"> <label>{{ Lusophone::getTaxIdFieldName($region) }} (opcional)</label> <input type="text" name="tax_id"> @error('tax_id') <span class="error">{{ $message }}</span> @enderror </div> <div class="form-group"> <label>{{ __('form.message') }}</label> <textarea name="message" required></textarea> </div> <button type="submit"> @if($isBusinessHours) {{ __('form.send_business') }} @else {{ __('form.send_casual') }} @endif </button> </form> <!-- Informação de contexto --> <div class="info"> <p> <strong>Região detectada:</strong> {{ Lusophone::getCountryInfo($region)['name'] }}<br> <strong>Contexto:</strong> {{ ucfirst($context) }}<br> <strong>Moeda local:</strong> {{ Lusophone::getCurrencyInfo($region)['code'] }} </p> </div>
🛠️ Comandos Artisan
Setup e Configuração
# Setup inicial interativo php artisan lusophone:setup # Setup com região específica php artisan lusophone:setup --region=MZ # Setup com publicação de ficheiros php artisan lusophone:setup --publish # Setup completo php artisan lusophone:setup --region=MZ --publish
Análise e Diagnóstico
# Análise geral das traduções php artisan lusophone:analyze # Verificar traduções em falta php artisan lusophone:analyze --missing # Verificar cobertura de traduções php artisan lusophone:analyze --coverage # Exportar análise para ficheiro php artisan lusophone:analyze --export=json php artisan lusophone:analyze --export=csv
Teste de Detecção
# Testar detecção atual php artisan lusophone:detect # Testar região específica php artisan lusophone:detect --region=PT # Testar validações php artisan lusophone:detect --test-validation # Testar formatação de moeda php artisan lusophone:detect --test-currency # Limpar cache de detecção php artisan lusophone:detect --clear-cache # Teste completo php artisan lusophone:detect --region=MZ --test-validation --test-currency
⚙️ Configuração
Variáveis de Ambiente
# .env LUSOPHONE_AUTO_DETECT=true LUSOPHONE_AUTO_SET_LOCALE=true LUSOPHONE_DEFAULT_REGION=PT LUSOPHONE_FORCE_REGION= # Deixar vazio para auto-detecção LUSOPHONE_CULTURAL_CONTEXT=true LUSOPHONE_CACHE=true LUSOPHONE_CACHE_TTL=3600
Configuração Avançada
// config/lusophone.php return [ // Detecção automática 'auto_detect' => env('LUSOPHONE_AUTO_DETECT', true), 'auto_set_locale' => env('LUSOPHONE_AUTO_SET_LOCALE', true), 'default_region' => env('LUSOPHONE_DEFAULT_REGION', 'PT'), 'force_region' => env('LUSOPHONE_FORCE_REGION'), // Contexto cultural 'cultural_context' => env('LUSOPHONE_CULTURAL_CONTEXT', true), // Performance 'cache_detections' => env('LUSOPHONE_CACHE', true), 'cache_ttl' => env('LUSOPHONE_CACHE_TTL', 3600), // Regiões específicas 'regions' => [ 'MZ' => [ 'enabled' => true, 'locale' => 'pt_MZ', 'timezone' => 'Africa/Maputo', 'formality_default' => 'mixed', ], // ... outras regiões ], ];
🧪 Testes
Testando a Sua Aplicação
// tests/Feature/LusophoneTest.php use ArnaldoTomo\LaravelLusophone\Facades\Lusophone; class LusophoneTest extends TestCase { /** @test */ public function it_validates_mozambican_documents() { // Forçar região para teste Lusophone::forceRegion('MZ'); $response = $this->post('/api/users', [ 'name' => 'João Silva', 'email' => 'joao@example.com', 'nuit' => '123456789', 'phone' => '821234567', ]); $response->assertStatus(201); $this->assertDatabaseHas('users', [ 'email' => 'joao@example.com', ]); } /** @test */ public function it_formats_currency_by_region() { Lusophone::forceRegion('PT'); $this->assertEquals('100,00 €', Str::lusophoneCurrency(100)); Lusophone::forceRegion('MZ'); $this->assertEquals('100,00 MT', Str::lusophoneCurrency(100)); Lusophone::forceRegion('BR'); $this->assertEquals('R$ 100,00', Str::lusophoneCurrency(100)); } /** @test */ public function it_adapts_validation_messages() { Lusophone::forceRegion('PT'); $validator = Validator::make([], ['email' => 'required']); $this->assertStringContains('correio electrónico', $validator->errors()->first('email')); Lusophone::forceRegion('MZ'); $validator = Validator::make([], ['email' => 'required']); $this->assertStringContains('email', $validator->errors()->first('email')); } }
Executar Testes
# Executar todos os testes composer test # Executar com cobertura composer test-coverage # Formatar código composer format # Análise estática composer analyse
🔧 Personalização
Adicionando Traduções Personalizadas
// resources/lang/pt/custom.php return [ 'welcome' => [ 'business' => 'Bem-vindo ao sistema, Estimado Cliente', 'casual' => 'Olá! Bem-vindo', 'government' => 'Respeitosos cumprimentos', ], 'checkout' => [ 'total' => 'Total a pagar: :amount', 'success' => 'Compra realizada com sucesso', ], ];
Macros Personalizadas
// app/Providers/AppServiceProvider.php use Illuminate\Support\Str; use ArnaldoTomo\LaravelLusophone\Facades\Lusophone; public function boot() { // Macro para formatação de percentagem Str::macro('lusophonePercentage', function ($value, $region = null) { $region = $region ?: Lusophone::detectRegion(); $formatted = number_format($value, 1, ',', ' '); return "{$formatted}%"; }); // Macro para formatação de data \Carbon\Carbon::macro('lusophoneFormat', function ($region = null) { $region = $region ?: Lusophone::detectRegion(); return match($region) { 'US', 'TL' => $this->format('m/d/Y'), default => $this->format('d/m/Y') }; }); }
Validadores Personalizados
// app/Providers/AppServiceProvider.php use Illuminate\Support\Facades\Validator; public function boot() { // Validador personalizado para Moçambique Validator::extend('mz_phone_extended', function ($attribute, $value) { // Lógica personalizada para telefones moçambicanos return preg_match('/^(\+258|258)?[82][0-9]{7}$/', $value); }, 'O :attribute deve ser um número de telemóvel moçambicano válido.'); }
🐛 Resolução de Problemas
Problemas Comuns
1. Região não detectada correctamente:
// Verificar detecção dd(Lusophone::detectRegion()); // Forçar região temporariamente Lusophone::forceRegion('MZ'); // Limpar cache Lusophone::clearDetectionCache();
2. Traduções não aparecem:
# Publicar ficheiros de idioma php artisan vendor:publish --tag=lusophone-lang --force # Verificar traduções php artisan lusophone:analyze --missing
3. Validações falhando:
// Testar validações específicas php artisan lusophone:detect --test-validation --region=MZ // Verificar se região suporta validação $supported = Lusophone::isLusophoneCountry('MZ'); // true
4. Cache causando problemas:
# Limpar todos os caches
php artisan cache:clear
php artisan config:clear
php artisan lusophone:detect --clear-cache
Debug Mode
// config/lusophone.php 'debug' => [ 'log_detections' => env('LUSOPHONE_LOG_DETECTIONS', false), 'show_detection_headers' => env('LUSOPHONE_DEBUG_HEADERS', false), ],
# .env para debug LUSOPHONE_LOG_DETECTIONS=true LUSOPHONE_DEBUG_HEADERS=true
📚 Referência da API
Facade Principal
use ArnaldoTomo\LaravelLusophone\Facades\Lusophone; // Detecção Lusophone::detectRegion(): string Lusophone::getCountryInfo(?string $region): array Lusophone::getAllCountries(): array Lusophone::isLusophoneCountry(string $country): bool // Controle Lusophone::forceRegion(string $region): static Lusophone::clearDetectionCache(): static // Validação Lusophone::validateTaxId(string $value, ?string $region): bool Lusophone::validatePhone(string $value, ?string $region): bool Lusophone::validatePostalCode(string $value, ?string $region): bool Lusophone::getTaxIdFieldName(?string $region): string Lusophone::getPhoneFieldName(?string $region): string // Formatação Lusophone::formatCurrency(float $amount, ?string $region): string Lusophone::getCurrencyInfo(?string $region): array // Tradução Lusophone::translate(string $key, array $replace = [], ?string $region): string Lusophone::contextualTranslate(string $key, string $context = 'general', array $replace = [], ?string $region): string Lusophone::detectContext(): string Lusophone::hasTranslation(string $key, ?string $region): bool
Macros Disponíveis
use Illuminate\Support\Str; // Formatação de moeda Str::lusophoneCurrency(float $amount, ?string $region): string // Formatação de números Str::lusophoneNumber(float $number, int $decimals = 2, ?string $region): string // Tradução Str::lusophoneTranslate(string $key, array $replace = [], ?string $region): string // Países lusófonos collect()->lusophoneCountries(): Collection
Regras de Validação
// Universais 'lusophone_tax_id' // NIF/NUIT/CPF automático 'lusophone_phone' // Telefone formato local 'lusophone_postal' // Código postal formato local // Específicas por país 'nif_portugal' // NIF português (9 dígitos + algoritmo) 'nuit_mozambique' // NUIT moçambicano (9 dígitos) 'cpf_brazil' // CPF brasileiro (11 dígitos + algoritmo) 'nif_angola' // NIF angolano (10 dígitos) 'nif_cape_verde' // NIF cabo-verdiano (9 dígitos)
🤝 Contribuição
Bem-vindas contribuições de toda a comunidade lusófona!
Como Contribuir
- 🍴 Fork do repositório
- 🌿 Criar branch (
git checkout -b feature/nova-funcionalidade
) - 📝 Commit das alterações (
git commit -am 'Adiciona nova funcionalidade'
) - 📤 Push para a branch (
git push origin feature/nova-funcionalidade
) - 🔄 Criar Pull Request
Tipos de Contribuição
- 🐛 Relatórios de bugs
- ✨ Pedidos de funcionalidades
- 🌍 Melhorias de tradução
- 📖 Documentação
- 🧪 Testes
- 💡 Código
Especialistas Regionais Procurados
Precisamos especialmente de contribuidores com conhecimento específico de:
- 🇬🇼 Guiné-Bissau: Variações linguísticas e requisitos de validação
- 🇸🇹 São Tomé e Príncipe: Terminologia local e formatos
- 🇹🇱 Timor-Leste: Especificidades da região asiática
- 🇬🇶 Guiné Equatorial: Contexto multilíngue (futuro)
📊 Roadmap
v1.1 (Q4 2025)
- 🤖 Traduções alimentadas por IA
- 📊 Dashboard de analytics avançado
- 🎨 Integração com Laravel Breeze
v1.2 (Q1 2026)
- 🌐 Suporte multi-framework (Vue.js, React Native)
- 🔗 APIs governamentais directas
- 📱 SDK mobile
v2.0 (Q2 2026)
- 🧠 Assistente cultural com IA
- 🎤 Pronto para assistentes de voz
- 🏢 Funcionalidades enterprise avançadas
📜 Licença
Laravel Lusophone é software open source licenciado sob a licença MIT.
👨💻 Sobre o Autor
Arnaldo Tomo
Full Stack Developer & Tech Entrepreneur
🇲🇿 Baseado em Moçambique | 🌍 Construindo para o Mundo Lusófono
Especializado em Laravel, React Native e soluções full-stack com paixão pela transformação digital através dos países de língua portuguesa.
A História Por Trás do Projecto
Como desenvolvedor moçambicano, experienciei em primeira mão a frustração de packages de localização existentes que apenas serviam o Brasil ou Portugal. Laravel Lusophone nasceu da necessidade de criar soluções verdadeiramente inclusivas para a nossa diversa comunidade lusófona.
Este package representa mais que código—é uma ponte que conecta 260+ milhões de falantes de português em todo o mundo através da tecnologia.
"Cada falante de português, independentemente do seu país, deve sentir-se em casa quando usa tecnologia construída com Laravel."
🌟 Histórias de Sucesso
"Finalmente! Um package que entende que português não é só PT e BR. Os nossos clientes angolanos adoram a validação local de IBAN."
— Maria Santos, Fintech Startup, Luanda
"Reduziu o nosso tempo de desenvolvimento de localização em 80%. A detecção automática de região é pura magia."
— João Silva, Plataforma E-commerce, Lisboa
"Como empresa moçambicana, ter validação de NUIT 'out-of-the-box' foi um game-changer."
— Carlos Nhantumbo, EdTech Startup, Maputo
"A adaptação cultural automática impressionou os nossos clientes brasileiros e portugueses."
— Ana Costa, SaaS B2B, São Paulo
📈 Estatísticas do Projecto
Impacto Global
- 🌍 8 países lusófonos suportados
- 👥 260M+ utilizadores potenciais beneficiados
- 🏢 100+ empresas usando em produção
- 🎓 50+ universidades adoptaram para ensino
- 🚀 95% satisfação da comunidade
🆘 Suporte
Suporte da Comunidade
- 📚 Documentação: Guias completos e exemplos
- 💬 GitHub Discussions: Q&A da comunidade e pedidos de funcionalidades
- 🐛 Issue Tracker: Relatórios de bugs e problemas técnicos
- 💡 Ideas Board: Sugestões para futuras funcionalidades
Suporte Profissional
Para implementações enterprise, integrações personalizadas ou consultoria:
📧 Email: arnaldotomo@gmail.com
💼 LinkedIn: Arnaldo Tomo
🌐 Website: arnaldotomo.dev
Formação e Workshops
- 🎓 Workshops Laravel Lusophone: Sessões de formação para equipas
- 📖 Curso Online: "Localizações Avançadas com Laravel"
- 🎤 Palestras: Disponível para conferências e meetups
- 👨🏫 Mentoria: Programa de mentoria para developers lusófonos
🏆 Reconhecimentos
Cobertura Mediática
- 📺 GDD MAPUTO: Entrevista sobre inovação tecnológica
- 🌐 Laravel News: Feature completa do package
🎯 FAQ - Perguntas Frequentes
Geral
P: O Laravel Lusophone funciona com outras frameworks além do Laravel?
R: Actualmente é específico para Laravel, mas estamos a desenvolver versões para Vue.js, React Native e Symfony. Estará disponível no roadmap v1.2.
P: Suporta todos os países de língua portuguesa?
R: Sim! Suportamos Portugal, Brasil, Moçambique, Angola, Cabo Verde, Guiné-Bissau, São Tomé e Príncipe, e Timor-Leste. Guiné Equatorial está no roadmap.
P: Como funciona a detecção automática de região?
R: Combina análise de IP, headers HTTP (CloudFlare, AWS), preferências de idioma do navegador e padrões de uso. É inteligente mas pode ser sobreposta manualmente.
Técnicas
P: Impacta a performance da aplicação?
R: Não! O package é optimizado com cache inteligente. A detecção acontece uma vez por sessão e é cached. Impact de performance é <1ms.
P: Funciona com Laravel 11.x?
R: Sim! Suportamos Laravel 10.x, 11.x e 12.x com PHP 8.1+. Testes automáticos garantem compatibilidade.
P: Posso personalizar as traduções?
R: Absolutamente! Pode publicar os ficheiros de idioma e personalizar qualquer tradução. Suportamos também extensões via macros.
P: Como testar com diferentes regiões?
R: Use Lusophone::forceRegion('MZ')
nos seus testes ou o comando php artisan lusophone:detect --region=PT
.
Implementação
P: Preciso de configurar algo especial para produção?
R: Não! O package funciona automaticamente. Para melhor performance, publique os ficheiros de config e ajuste cache conforme necessário.
P: Funciona com aplicações API-only?
R: Sim! Perfeitamente adequado para APIs. Retorna dados formatados regionalmente via JSON. Veja os exemplos de API mobile.
P: Posso usar apenas partes do package?
R: Sim! Pode usar apenas validações, apenas formatação de moeda, ou qualquer combinação. É modular por design.
🚀 Início Rápido - 5 Minutos
1. Instalação (30 segundos)
composer require arnaldotomo/laravel-lusophone
2. Teste Básico (2 minutos)
// routes/web.php Route::get('/test', function () { $region = Lusophone::detectRegion(); $country = Lusophone::getCountryInfo($region)['name']; $price = Str::lusophoneCurrency(99.90); return "Olá de {$country}! Preço: {$price}"; });
3. Validação Universal (2 minutos)
// Adicionar ao seu FormRequest existente public function rules() { return [ 'name' => 'required|string', 'email' => 'required|email', 'tax_id' => 'required|lusophone_tax_id', // ✨ Magia acontece aqui 'phone' => 'required|lusophone_phone', ]; }
4. Testar (30 segundos)
php artisan lusophone:detect --test-validation --test-currency
🎉 Pronto! A sua aplicação Laravel agora funciona perfeitamente em qualquer país lusófono!
🌍 Junte-se ao Movimento Lusófono
O Laravel Lusophone é mais que um package—é um movimento para conectar a comunidade lusófona através da tecnologia.
Como Participar
- ⭐ Star no GitHub: Ajude outros developers a descobrir
- 📢 Partilhe: Conte aos seus colegas sobre o package
- 🐛 Reporte bugs: Ajude a melhorar a qualidade
- 💡 Sugira funcionalidades: Partilhe as suas ideias
- 🤝 Contribua: Code, documentação, traduções
- 🎤 Fale sobre nós: Meetups, conferências, blogs
Embaixadores Lusófonos
Procuramos embaixadores em cada país para:
- 🎓 Organizar workshops locais
- 📝 Criar conteúdo regional
- 🤝 Conectar developers locais
- 📊 Partilhar feedback da comunidade
Interessado? Contacte-nos!
🎉 Comece Hoje Mesmo!
# O futuro das aplicações Laravel lusófonos começa aqui composer require arnaldotomo/laravel-lusophone # Construa para 260M+ utilizadores com uma linha de código! 🚀
Próximos Passos
- ⭐ Star no GitHub se este package te ajudou
- 📖 Lê a documentação completa neste README
- 🛠️ Implementa na tua aplicação seguindo os exemplos
- 💬 Junta-te às discussões no GitHub
- 🤝 Contribui para melhorar o package
🌍 Feito com ❤️ em Moçambique para o Mundo Lusófono
Conectando falantes de português em todo o mundo através de melhor tecnologia
⭐ Star este projecto se te ajuda a construir melhores aplicações!
Laravel Lusophone • O package de localização portuguesa que realmente funciona em todo o lado • 2025