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 🌍
👆 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.
- ✅ 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í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 |
- PHP 8.1 ou superior
- Laravel 10.x, 11.x ou 12.x
composer require arnaldotomo/laravel-lusophone
# 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
# 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.
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"
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)
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"
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();
// 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 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)
// 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
}
// 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"
}
// 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),
]);
}
}
// 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(),
]);
}
}
// 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>
# 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 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
# 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
# .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
// 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
],
];
// 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' => '[email protected]',
'nuit' => '123456789',
'phone' => '821234567',
]);
$response->assertStatus(201);
$this->assertDatabaseHas('users', [
'email' => '[email protected]',
]);
}
/** @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 todos os testes
composer test
# Executar com cobertura
composer test-coverage
# Formatar código
composer format
# Análise estática
composer analyse
// 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',
],
];
// 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')
};
});
}
// 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.');
}
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
// 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
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
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
// 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)
Bem-vindas contribuições de toda a comunidade lusófona!
- 🍴 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
- 🐛 Relatórios de bugs
- ✨ Pedidos de funcionalidades
- 🌍 Melhorias de tradução
- 📖 Documentação
- 🧪 Testes
- 💡 Código
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)
- 🤖 Traduções alimentadas por IA
- 📊 Dashboard de analytics avançado
- 🎨 Integração com Laravel Breeze
- 🌐 Suporte multi-framework (Vue.js, React Native)
- 🔗 APIs governamentais directas
- 📱 SDK mobile
- 🧠 Assistente cultural com IA
- 🎤 Pronto para assistentes de voz
- 🏢 Funcionalidades enterprise avançadas
Laravel Lusophone é software open source licenciado sob a licença MIT.
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.
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."
"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
- 🌍 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
- 📚 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
Para implementações enterprise, integrações personalizadas ou consultoria:
📧 Email: [email protected]
💼 LinkedIn: Arnaldo Tomo
🌐 Website: arnaldotomo.dev
- 🎓 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
- 📺 GDD MAPUTO: Entrevista sobre inovação tecnológica
- 🌐 Laravel News: Feature completa do package
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.
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
.
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.
composer require arnaldotomo/laravel-lusophone
// 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}";
});
// 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',
];
}
php artisan lusophone:detect --test-validation --test-currency
🎉 Pronto! A sua aplicação Laravel agora funciona perfeitamente em qualquer país lusófono!
O Laravel Lusophone é mais que um package—é um movimento para conectar a comunidade lusófona através da tecnologia.
- ⭐ 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
Procuramos embaixadores em cada país para:
- 🎓 Organizar workshops locais
- 📝 Criar conteúdo regional
- 🤝 Conectar developers locais
- 📊 Partilhar feedback da comunidade
Interessado? Contacte-nos!
# 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! 🚀
- ⭐ 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
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