diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/pt-BR.json b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/pt-BR.json
new file mode 100644
index 0000000000..3c1cb1f82d
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/pt-BR.json
@@ -0,0 +1,9 @@
+{
+ "culture": "pt-BR",
+ "texts": {
+ "GivenTenantIsNotAvailable": "Tenant não está disponível: {0}",
+ "SwitchTenant": "Trocar tenant",
+ "Name": "Nome",
+ "SwitchTenantHint": "Deixe o campo de nome em branco para alternar para o lado do host."
+ }
+}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.Localization/Volo.Abp.Localization.csproj b/framework/src/Volo.Abp.Localization/Volo.Abp.Localization.csproj
index 81042b0ce8..239e6df688 100644
--- a/framework/src/Volo.Abp.Localization/Volo.Abp.Localization.csproj
+++ b/framework/src/Volo.Abp.Localization/Volo.Abp.Localization.csproj
@@ -16,6 +16,10 @@
+
+
+
+
diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpValidation/pt-BR.json b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpValidation/pt-BR.json
new file mode 100644
index 0000000000..0cf611f1ea
--- /dev/null
+++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpValidation/pt-BR.json
@@ -0,0 +1,20 @@
+{
+ "culture": "pt-BR",
+ "texts": {
+ "'{0}' and '{1}' do not match.": "'{0}' e '{1}' não encontrado.",
+ "The {0} field is not a valid credit card number.": "O campo {0} não é um número de cartão de crédito válido.",
+ "{0} is not valid.": "{0} é inválido.",
+ "The {0} field is not a valid e-mail address.": "O campo {0} não é um e-mail válido.",
+ "The {0} field only accepts files with the following extensions: {1}": "O campo {0} aceita somente arquivos com estensões: {1}",
+ "The field {0} must be a string or array type with a maximum length of '{1}'.": "O campo {0} deve ser uma palavra ou matriz com o tamanho máximo de '{1}'.",
+ "The field {0} must be a string or array type with a minimum length of '{1}'.": "O campo {0} deve ser uma palavra ou matriz com o tamanho mínimo de '{1}'.",
+ "The {0} field is not a valid phone number.": "O campo {0} não é um telefone válido.",
+ "The field {0} must be between {1} and {2}.": "O campo {0} deve estar entre {1} e {2}.",
+ "The field {0} must match the regular expression '{1}'.": "O campo {0} deve ser compatível com a expressão regular '{1}'.",
+ "The {0} field is required.": "O Campo {0} é obrigatório.",
+ "The field {0} must be a string with a maximum length of {1}.": "O campo {0} deve ser uma palavra com o tamanho máximo de {1}.",
+ "The field {0} must be a string with a minimum length of {2} and a maximum length of {1}.": "O campo {0} deve ser uma palavra com o tamanho mínimo de {2} e tamanho máximo de {1}.",
+ "The {0} field is not a valid fully-qualified http, https, or ftp URL.": "O campo {0} não é um http, https, ou FTP válido.",
+ "The field {0} is invalid.": "O campo {0} é inválido."
+ }
+}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json
new file mode 100644
index 0000000000..0ce2e189e7
--- /dev/null
+++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json
@@ -0,0 +1,40 @@
+{
+ "culture": "pt-BR",
+ "texts": {
+ "InternalServerErrorMessage": "Um erro interno ocorreu durante a requisição!",
+ "ValidationErrorMessage": "Sua requisição não é válida!",
+ "ValidationNarrativeErrorMessageTitle": "Os seguintes erros foram detectados durante a validação:",
+ "DefaultErrorMessage": "Ocorreu um erro!",
+ "DefaultErrorMessageDetail": "Os detalhes do erro não foram enviados pelo servidor.",
+ "DefaultErrorMessage401": "Você não etá autenticado!",
+ "DefaultErrorMessage401Detail": "Você deve autenticar-se para proceder com esta operação.",
+ "DefaultErrorMessage403": "Você não possui autorização!",
+ "DefaultErrorMessage403Detail": "Você não tem permissão para executar esta operação!",
+ "DefaultErrorMessage404": "Recurso não encontrado!",
+ "DefaultErrorMessage404Detail": "O recurso requisitado não pode ser encontrado pelo servidor!",
+ "EntityNotFoundErrorMessage": "Não existe uma entidade {0} com código = {1}!",
+ "Error": "Erro",
+ "AreYouSure": "Você tem certeza?",
+ "Cancel": "Cancelar",
+ "Yes": "Sim",
+ "No": "Não",
+ "Close": "Fechar",
+ "Save": "Salvar",
+ "SavingWithThreeDot": "Salvando...",
+ "Actions": "Ações",
+ "Delete": "Excluir",
+ "Edit": "Editar",
+ "ProcessingWithThreeDot": "Processando...",
+ "Login": "Entrar",
+ "Register": "cadastrar",
+ "Logout": "Sair",
+ "Submit": "Enviar",
+ "Back": "Voltar",
+ "PagerNext": "Próximo",
+ "PagerPrevious": "Anterior",
+ "PagerInfo": "Mostrando {0} até {1} de {2} registros.",
+ "DatatableActionDropdownDefaultText": "Ações",
+ "ChangePassword": "Alterar senha",
+ "PersonalInfo": "Perfil"
+ }
+}
\ No newline at end of file
diff --git a/framework/src/Volo.Abp.UI/Volo.Abp.UI.csproj b/framework/src/Volo.Abp.UI/Volo.Abp.UI.csproj
index 1a7ab915c9..a13fca4acd 100644
--- a/framework/src/Volo.Abp.UI/Volo.Abp.UI.csproj
+++ b/framework/src/Volo.Abp.UI/Volo.Abp.UI.csproj
@@ -16,6 +16,10 @@
+
+
+
+
diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj
index 07509841f1..66b23b058a 100644
--- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj
+++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj
@@ -19,6 +19,10 @@
+
+
+
+
diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/pt-BR.json b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/pt-BR.json
new file mode 100644
index 0000000000..c7b60f9ca1
--- /dev/null
+++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/pt-BR.json
@@ -0,0 +1,6 @@
+{
+ "culture": "pt-BR",
+ "texts": {
+ "BirthDate": "Aniversário"
+ }
+}
\ No newline at end of file
diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo.Abp.Localization.Tests.csproj b/framework/test/Volo.Abp.Localization.Tests/Volo.Abp.Localization.Tests.csproj
index b28d93e5db..b36cfc9b02 100644
--- a/framework/test/Volo.Abp.Localization.Tests/Volo.Abp.Localization.Tests.csproj
+++ b/framework/test/Volo.Abp.Localization.Tests/Volo.Abp.Localization.Tests.csproj
@@ -15,6 +15,13 @@
+
+
+
+
+
+
+
diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/pt-BR.json b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/pt-BR.json
new file mode 100644
index 0000000000..a55b5f0237
--- /dev/null
+++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/CountryNames/pt-BR.json
@@ -0,0 +1,7 @@
+{
+ "culture": "pt",
+ "texts": {
+ "USA": "Estados Unidos da América",
+ "Brazil": "Brasil"
+ }
+}
\ No newline at end of file
diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/Validation/pt-BR.json b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/Validation/pt-BR.json
new file mode 100644
index 0000000000..16a0cdbc2d
--- /dev/null
+++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Base/Validation/pt-BR.json
@@ -0,0 +1,7 @@
+{
+ "culture": "pt",
+ "texts": {
+ "ThisFieldIsRequired": "Este campo é obrigatório",
+ "MaxLenghtErrorMessage": "Este campo pode ser no máximo de '{0}' caracteres"
+ }
+}
\ No newline at end of file
diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/pt-BR.json b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/pt-BR.json
new file mode 100644
index 0000000000..ff89fdb9ea
--- /dev/null
+++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/Source/pt-BR.json
@@ -0,0 +1,10 @@
+{
+ "culture": "pt",
+ "texts": {
+ "Hello {0}.": "Olá {0}.",
+ "Car": "Carro",
+ "CarPlural": "Carros",
+ "MaxLenghtErrorMessage": "O comprimento deste campo pode ser no máximo de '{0}' caracteres",
+ "Universe": "Universo"
+ }
+}
\ No newline at end of file
diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/SourceExt/pt-BR.json b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/SourceExt/pt-BR.json
new file mode 100644
index 0000000000..ca17b637f0
--- /dev/null
+++ b/framework/test/Volo.Abp.Localization.Tests/Volo/Abp/Localization/TestResources/SourceExt/pt-BR.json
@@ -0,0 +1,6 @@
+{
+ "culture": "pt",
+ "texts": {
+ "SeeYou": "Até logo"
+ }
+}
\ No newline at end of file
diff --git a/templates/mvc/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs b/templates/mvc/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs
index 0fc6dcb311..7cb18ab3df 100644
--- a/templates/mvc/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs
+++ b/templates/mvc/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs
@@ -128,6 +128,7 @@ namespace MyCompanyName.MyProjectName
);
options.Languages.Add(new LanguageInfo("en", "en", "English"));
+ options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
});
}