Browse Source

Merge branch 'rel-3.2' into dev

pull/5599/head
Halil İbrahim Kalkan 6 years ago
parent
commit
9ff42c102e
  1. 12
      docs/en/UI/Angular/Quick-Start.md
  2. 2
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json
  3. 12
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/fr.json
  4. 15
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs
  5. 5
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs
  6. 38
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProxyCommandBase.cs
  7. 7
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/RemoveProxyCommand.cs
  8. 6
      framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Localization/Resources/AbpDdd/fr.json
  9. 25
      framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Localization/fr.json
  10. 15
      framework/src/Volo.Abp.Ldap/Volo/Abp/Ldap/Localization/fr.json
  11. 7
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpLocalization/fr.json
  12. 7
      framework/src/Volo.Abp.Timing/Volo/Abp/Timing/Localization/fr.json
  13. 6
      framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/Localization/Resource/fr.json
  14. 69
      framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json
  15. 34
      framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/fr.json
  16. 7
      framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/fr.json
  17. 6
      framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/fr.json
  18. 7
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/Localization/fr.json
  19. 60
      modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fr.json
  20. 6
      modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/Localization/fr.json
  21. 58
      modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/fr.json
  22. 22
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json
  23. 10
      modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/fr.json
  24. 120
      modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json
  25. 10
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fr.json
  26. 7
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json
  27. 23
      modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fr.json
  28. 14
      modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/fr.json
  29. 29
      npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.html
  30. 64
      npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts
  31. 38
      npm/ng-packs/packages/feature-management/src/lib/directives/free-text-input.directive.ts
  32. 1
      npm/ng-packs/packages/feature-management/src/lib/directives/index.ts
  33. 11
      npm/ng-packs/packages/feature-management/src/lib/feature-management.module.ts
  34. 8
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/fr.json
  35. 1
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
  36. 1
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs
  37. 1
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
  38. 1
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs
  39. 1
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
  40. 1
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
  41. 1
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs
  42. 7
      templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/fr.json

12
docs/en/UI/Angular/Quick-Start.md

@ -55,7 +55,7 @@ To avoid IDE warnings, run `yarn` or `npm install` in the Angular root folder be
After creating a solution, open its "angular" directory in your IDE. This is how the contents of the root folder looks like:
<img alt="Angular project root folder structure" src="./images/quick-start---root-folder-structure.png" width="300px" style="max-width:100%" />
<img alt="Angular project root folder structure" src="./images/quick-start---root-folder-structure.png" width="300px" style="max-width:100%">
Here is what these folders and files are for:
@ -76,7 +76,7 @@ Here is what these folders and files are for:
Now let us take a look at the contents of the source folder.
<img alt="Angular project source folder structure" src="./images/quick-start---source-folder-structure.png" width="300px" style="max-width:100%" />
<img alt="Angular project source folder structure" src="./images/quick-start---source-folder-structure.png" width="300px" style="max-width:100%">
- **app** is the main directory you put your application files in. Any module, component, directive, service, pipe, guard, interceptor, etc. should be placed here. You are free to choose any folder structure, but [organizing Angular applications based on modules](https://angular.io/guide/module-types) is generally a fine practice.
- **home** is a predefined module and acts as a welcome page. It also demonstrates how a feature-based folder structure may look like. More complex features will probably have sub-features, thus inner folders. You may change the home folder however you like.
@ -106,7 +106,7 @@ Now that you know about the files and folders, we can get the application up and
3. Run `yarn start` or `npm start`. The first compilation may take a while. This will start a [live development server](#angular-live-development-server) and launch your default browser in the end.
4. Visit the browser page that opens after the compilation <sup id="a-certificate-error">[1](#f-certificate-error)</sup>.
<img alt="New ABP Angular project home page" src="./images/quick-start---new-project-home-page.png" width="744px" style="max-width:100%" />
<img alt="New ABP Angular project home page" src="./images/quick-start---new-project-home-page.png" width="744px" style="max-width:100%">
You may modify the behavior of the **start script** (in the package.json file) by changing the parameters passed to the `ng serve` command. For instance, if you do not want a browser window to open next time you run the script, remove `--open` from the end of it. Please check [ng serve documentation](https://angular.io/cli/serve) for all available options.
@ -114,13 +114,13 @@ You may modify the behavior of the **start script** (in the package.json file) b
The development server of Angular is based on [Webpack DevServer](https://webpack.js.org/configuration/dev-server/). It tracks changes to source files and syncs the browser window after an incremental re-compilation every time <sup id="a-dev-server">[2](#f-dev-server)</sup> you make one. Your experience will be like this:
<img alt="Angular Live Development Server compiles again on template change and removes a button from the page displayed by the browser." src="./images/quick-start---angular-live-development-server.gif" width="818px" style="max-width:100%" />
<img alt="Angular Live Development Server compiles again on template change and removes a button from the page displayed by the browser." src="./images/quick-start---angular-live-development-server.gif" width="818px" style="max-width:100%">
Please keep in mind that you should not use this server in production. To provide the fastest experience, the compiler skips some heavy optimizations and the development server is simply not built for multiple clients. The next section will describe what to do.
---
<img alt="Error caused by browser blocking access to backend" src="./images/quick-start---self-signed-certificate-error.png" width="400px" style="max-width:100%" />
<img alt="Error caused by browser blocking access to backend" src="./images/quick-start---self-signed-certificate-error.png" width="400px" style="max-width:100%">
<sup id="f-certificate-error"><b>1</b></sup> _If you see the error above when you run the Angular app, your browser might be blocking access to the API because of the self-signed certificate. Visit that address and allow access to it (once). When you see the Swagger interface, you are good to go._ <sup>[↩](#a-certificate-error)</sup>
@ -169,7 +169,7 @@ When you run the development server, variables defined in _environment.ts_ take
2. Run `yarn` or `npm install` if you have not installed dependencies already.
3. Run `yarn build:prod` or `npm run build:prod`.
<img alt="Angular compiler optimizing the build using Terser" src="./images/quick-start---self-signed-certificate-error.png" width="400px" style="max-width:100%" />
<img alt="Angular compiler optimizing the build using Terser" src="./images/quick-start---self-signed-certificate-error.png" width="400px" style="max-width:100%">
Depending on project size, the compilation may take a few minutes. When it is finished, the compiled output will be placed inside the _/dist_ folder. Voila! You have deployment-ready build artifacts.

2
framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/en.json

@ -1,4 +1,4 @@
{
{
"culture": "en",
"texts": {
"GivenTenantIsNotAvailable": "Given tenant is not available: {0}",

12
framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Volo/Abp/AspNetCore/Mvc/UI/MultiTenancy/Localization/fr.json

@ -0,0 +1,12 @@
{
"culture": "fr",
"texts": {
"GivenTenantIsNotAvailable": "Le Tenant donné n'est pas disponible: {0}",
"Tenant": "Tenant",
"Switch": "Changer",
"Name": "Nom",
"SwitchTenantHint": "Laissez le champ de nom vide pour passer du côté hôte.",
"SwitchTenant": "Changer le Tenant",
"NotSelected": "Non séléctionné"
}
}

15
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs

@ -73,7 +73,7 @@ namespace Volo.Abp.Cli
{
var assembly = typeof(CliService).Assembly;
var toolPath = GetToolPath(assembly);
var currentCliVersion = await GetCurrentCliVersion(assembly);
var currentCliVersion = await GetCurrentCliVersionInternalAsync(assembly);
var updateChannel = GetUpdateChannel(currentCliVersion);
Logger.LogInformation($"Version {currentCliVersion} ({updateChannel})");
@ -94,7 +94,7 @@ namespace Volo.Abp.Cli
}
}
private static string GetToolPath(Assembly assembly)
private string GetToolPath(Assembly assembly)
{
if (!assembly.Location.Contains(".store"))
{
@ -104,7 +104,12 @@ namespace Volo.Abp.Cli
return assembly.Location.Substring(0, assembly.Location.IndexOf(".store", StringComparison.Ordinal));
}
private static async Task<SemanticVersion> GetCurrentCliVersion(Assembly assembly)
public async Task<SemanticVersion> GetCurrentCliVersionAsync(Assembly assembly)
{
return await GetCurrentCliVersionInternalAsync(assembly);
}
private async Task<SemanticVersion> GetCurrentCliVersionInternalAsync(Assembly assembly)
{
SemanticVersion currentCliVersion = default;
@ -134,7 +139,7 @@ namespace Volo.Abp.Cli
return currentCliVersion;
}
private static UpdateChannel GetUpdateChannel(SemanticVersion currentCliVersion)
private UpdateChannel GetUpdateChannel(SemanticVersion currentCliVersion)
{
if (!currentCliVersion.IsPrerelease)
{
@ -172,7 +177,7 @@ namespace Volo.Abp.Cli
}
}
private static bool IsGlobalTool(string toolPath)
private bool IsGlobalTool(string toolPath)
{
var globalPaths = new[] { @"%USERPROFILE%\.dotnet\tools\", "%HOME%/.dotnet/tools/", };
return globalPaths.Select(Environment.ExpandEnvironmentVariables).Contains(toolPath);

5
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/GenerateProxyCommand.cs

@ -7,5 +7,10 @@ namespace Volo.Abp.Cli.Commands
protected override string CommandName => Name;
protected override string SchematicsCommandName => "proxy-add";
public GenerateProxyCommand(CliService cliService)
: base(cliService)
{
}
}
}

38
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProxyCommandBase.cs

@ -2,7 +2,10 @@
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Newtonsoft.Json.Linq;
using NuGet.Versioning;
using Volo.Abp.Cli.Args;
using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection;
@ -11,14 +14,23 @@ namespace Volo.Abp.Cli.Commands
{
public abstract class ProxyCommandBase : IConsoleCommand, ITransientDependency
{
public CliService CliService { get; }
public ILogger<HelpCommand> Logger { get; set; }
protected abstract string CommandName { get; }
protected abstract string SchematicsCommandName { get; }
public Task ExecuteAsync(CommandLineArgs commandLineArgs)
public ProxyCommandBase(CliService cliService)
{
CliService = cliService;
Logger = NullLogger<HelpCommand>.Instance;
}
public async Task ExecuteAsync(CommandLineArgs commandLineArgs)
{
CheckAngularJsonFile();
CheckNgSchematics();
await CheckNgSchematicsAsync();
var prompt = commandLineArgs.Options.ContainsKey("p") || commandLineArgs.Options.ContainsKey("prompt");
var defaultValue = prompt ? null : "__default";
@ -51,11 +63,9 @@ namespace Volo.Abp.Cli.Commands
}
CmdHelper.RunCmd(commandBuilder.ToString());
return Task.CompletedTask;
}
private void CheckNgSchematics()
private async Task CheckNgSchematicsAsync()
{
var packageJsonPath = $"package.json";
@ -68,10 +78,10 @@ namespace Volo.Abp.Cli.Commands
);
}
var schematicsPackageNode =
var schematicsVersion =
(string) JObject.Parse(File.ReadAllText(packageJsonPath))["devDependencies"]?["@abp/ng.schematics"];
if (schematicsPackageNode == null)
if (schematicsVersion == null)
{
throw new CliUsageException(
"\"@abp/ng.schematics\" NPM package should be installed to the devDependencies before running this command!" +
@ -79,6 +89,20 @@ namespace Volo.Abp.Cli.Commands
GetUsageInfo()
);
}
var parseError = SemanticVersion.TryParse(schematicsVersion.TrimStart('~', '^', 'v'), out var semanticSchematicsVersion);
if (parseError)
{
Logger.LogWarning("Couldn't determinate version of \"@abp/ng.schematics\" package.");
return;
}
var cliVersion = await CliService.GetCurrentCliVersionAsync(typeof(CliService).Assembly);
if (semanticSchematicsVersion < cliVersion)
{
Logger.LogWarning("\"@abp/ng.schematics\" version is lower than ABP Cli version.");
return;
}
}
private void CheckAngularJsonFile()

7
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/RemoveProxyCommand.cs

@ -7,5 +7,10 @@
protected override string CommandName => Name;
protected override string SchematicsCommandName => "proxy-remove";
public RemoveProxyCommand(CliService cliService)
: base(cliService)
{
}
}
}
}

6
framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Localization/Resources/AbpDdd/fr.json

@ -0,0 +1,6 @@
{
"culture": "fr",
"texts": {
"MaxResultCountExceededExceptionMessage": "{0} ne peut pas être plus que {1}! Augmentez {2}. {3} du côté du serveur pour permettre plus de résultats."
}
}

25
framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/Localization/fr.json

@ -0,0 +1,25 @@
{
"culture": "fr",
"texts": {
"DisplayName:Abp.Mailing.DefaultFromAddress": "Adresse par défaut",
"DisplayName:Abp.Mailing.DefaultFromDisplayName": "Valeur par défaut du nom d'affichage",
"DisplayName:Abp.Mailing.Smtp.Host": "Hôte",
"DisplayName:Abp.Mailing.Smtp.Port": "Port",
"DisplayName:Abp.Mailing.Smtp.UserName": "Nom d'utilisateur",
"DisplayName:Abp.Mailing.Smtp.Password": "Mot de passe",
"DisplayName:Abp.Mailing.Smtp.Domain": "Domaine",
"DisplayName:Abp.Mailing.Smtp.EnableSsl": "Activer SSL",
"DisplayName:Abp.Mailing.Smtp.UseDefaultCredentials": "Utiliser les informations d'identification par défaut",
"Description:Abp.Mailing.DefaultFromAddress": "L'adresse d'expédition par défaut",
"Description:Abp.Mailing.DefaultFromDisplayName": "La valeur par défaut du nom d'affichage",
"Description:Abp.Mailing.Smtp.Host": "Le nom ou l'adresse IP de l'hôte utilisé pour les transactions SMTP.",
"Description:Abp.Mailing.Smtp.Port": "Le port utilisé pour les transactions SMTP.",
"Description:Abp.Mailing.Smtp.UserName": "Nom d'utilisateur associé aux informations d'identification.",
"Description:Abp.Mailing.Smtp.Password": "Le mot de passe du nom d'utilisateur associé aux informations d'identification.",
"Description:Abp.Mailing.Smtp.Domain": "Le nom de domaine ou d'ordinateur qui vérifie les informations d'identification.",
"Description:Abp.Mailing.Smtp.EnableSsl": "Si SmtpClient utilise SSL (Secure Sockets Layer) pour crypter la connexion.",
"Description:Abp.Mailing.Smtp.UseDefaultCredentials": "Si les DefaultCredentials sont envoyés avec les demandes.",
"TextTemplate:StandardEmailTemplates.Layout": "Modèle de mise en page d'e-mail par défaut",
"TextTemplate:StandardEmailTemplates.Message": "Modèle de message simple pour les e-mails"
}
}

15
framework/src/Volo.Abp.Ldap/Volo/Abp/Ldap/Localization/fr.json

@ -0,0 +1,15 @@
{
"culture": "fr",
"texts": {
"DisplayName:Abp.Ldap.ServerHost": "Hôte du serveur",
"Description:Abp.Ldap.ServerHost": "Hôte du serveur",
"DisplayName:Abp.Ldap.ServerPort": "Port de serveur",
"Description:Abp.Ldap.ServerPort": "Port de serveur",
"DisplayName:Abp.Ldap.BaseDc": "Composant de domaine de base",
"Description:Abp.Ldap.BaseDc": "Composant de domaine de base",
"DisplayName:Abp.Ldap.UserName": "Nom d'utilisateur",
"Description:Abp.Ldap.UserName": "Nom d'utilisateur",
"DisplayName:Abp.Ldap.Password": "Mot de passe",
"Description:Abp.Ldap.Password": "Mot de passe"
}
}

7
framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Resources/AbpLocalization/fr.json

@ -0,0 +1,7 @@
{
"culture": "fr",
"texts": {
"DisplayName:Abp.Localization.DefaultLanguage": "Langage par défaut",
"Description:Abp.Localization.DefaultLanguage": "La langue par défaut de l'application."
}
}

7
framework/src/Volo.Abp.Timing/Volo/Abp/Timing/Localization/fr.json

@ -0,0 +1,7 @@
{
"culture": "fr",
"texts": {
"DisplayName:Abp.Timing.Timezone": "Fuseau horaire",
"Description:Abp.Timing.Timezone": "Fuseau horaire de l'application"
}
}

6
framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/Localization/Resource/fr.json

@ -0,0 +1,6 @@
{
"culture": "fr",
"texts": {
"Menu:Administration": "Administration"
}
}

69
framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json

@ -0,0 +1,69 @@
{
"culture": "fr",
"texts": {
"InternalServerErrorMessage": "Une erreur interne s'est produite lors de votre demande!",
"ValidationErrorMessage": "Votre demande n'est pas valide!",
"ValidationNarrativeErrorMessageTitle": "Les erreurs suivantes ont été détectées lors de la validation.",
"DefaultErrorMessage": "Une erreur est survenue!",
"DefaultErrorMessageDetail": "Détails de l'erreur non envoyés par le serveur.",
"DefaultErrorMessage401": "Vous n'êtes pas authentifié!",
"DefaultErrorMessage401Detail": "Vous devez vous connecter pour effectuer cette opération.",
"DefaultErrorMessage403": "Vous n'êtes pas autorisé!",
"DefaultErrorMessage403Detail": "Vous n'êtes pas autorisé à effectuer cette opération!",
"DefaultErrorMessage404": "Ressource introuvable!",
"DefaultErrorMessage404Detail": "La ressource demandée est introuvable sur le serveur!",
"EntityNotFoundErrorMessage": "Il n'y a pas d'entité {0} avec id = {1}!",
"Languages": "Langues",
"Error": "Erreur",
"AreYouSure": "Êtes-vous sûr?",
"Cancel": "Annuler",
"Clear": "Clair",
"Yes": "Oui",
"No": "Non",
"Ok": "D'accord",
"Close": "Fermer",
"Save": "Enregistrer",
"SavingWithThreeDot": "Enregistrement...",
"Actions": "Actions",
"Delete": "Supprimer",
"Edit": "Modifier",
"Refresh": "Actualiser",
"Language": "Langue",
"LoadMore": "Charger plus",
"ProcessingWithThreeDot": "Traitement...",
"LoadingWithThreeDot": "Chargement...",
"Welcome": "Bienvenue",
"Login": "Se connecter",
"Register": "S'inscrire",
"Logout": "Se déconnecter",
"Submit": "Envoyer",
"Back": "Précédent",
"PagerSearch": "Recherche",
"PagerNext": "prochain",
"PagerPrevious": "Précédent",
"PagerFirst": "Première",
"PagerLast": "Dernier",
"PagerInfo": "Affichage de _START_ à _END_ entrées sur _TOTAL_",
"PagerInfo{0}{1}{2}": "Affichage de {0} à {1} sur {2} entrées",
"PagerInfoEmpty": "Affichage de 0 à 0 sur 0 entrées",
"PagerInfoFiltered": "(filtré à partir des entrées _MAX_ totale)",
"NoDataAvailableInDatatable": "Aucune donnée disponible",
"Total": "Total",
"Selected": "Sélectionné",
"PagerShowMenuEntries": "Afficher les entrées _MENU_",
"DatatableActionDropdownDefaultText": "Actions",
"ChangePassword": "Changer le mot de passe",
"PersonalInfo": "Mon profil",
"AreYouSureYouWantToCancelEditingWarningMessage": "Vous avez des changements non enregistrés.",
"UnhandledException": "Exception non-gérée!",
"401Message": "Non autorisé",
"403Message": "Interdit",
"404Message": "Page introuvable",
"500Message": "Erreur Interne du Serveur",
"GoHomePage": "Aller à la page d'accueil",
"GoBack": "Retour",
"Search": "Recherche",
"ItemWillBeDeletedMessageWithFormat": "{0} sera supprimé!",
"ItemWillBeDeletedMessage": "Cet objet va être supprimé!"
}
}

34
framework/src/Volo.Abp.Validation/Volo/Abp/Validation/Localization/fr.json

@ -0,0 +1,34 @@
{
"culture": "fr",
"texts": {
"'{0}' and '{1}' do not match.": "'{0}' et '{1}' ne correspondent pas.",
"The {0} field is not a valid credit card number.": "Le champ {0} n'est pas un numéro de carte de crédit valide.",
"{0} is not valid.": "{0} n'est pas valide.",
"The {0} field is not a valid e-mail address.": "Le champ {0} n'est pas une adresse e-mail valide.",
"The {0} field only accepts files with the following extensions: {1}": "Le champ {0} accepte uniquement les fichiers avec les extensions suivantes: {1}",
"The field {0} must be a string or array type with a maximum length of '{1}'.": "Le champ {0} doit être une chaîne ou un type de tableau d'une longueur maximale de '{1}'.",
"The field {0} must be a string or array type with a minimum length of '{1}'.": "Le champ {0} doit être une chaîne ou un type de tableau d'une longueur minimale de '{1}'.",
"The {0} field is not a valid phone number.": "Le champ {0} n'est pas un numéro de téléphone valide.",
"The field {0} must be between {1} and {2}.": "Le champ {0} doit être compris entre {1} et {2}.",
"The field {0} must match the regular expression '{1}'.": "Le champ {0} ne correspond pas au format demandé.",
"The {0} field is required.": "Le champ {0} est obligatoire.",
"The field {0} must be a string with a maximum length of {1}.": "Le champ {0} doit être une chaîne d'une longueur maximale de {1}.",
"The field {0} must be a string with a minimum length of {2} and a maximum length of {1}.": "Le champ {0} doit être une chaîne d'une longueur minimale de {2} et d'une longueur maximale de {1}.",
"The {0} field is not a valid fully-qualified http, https, or ftp URL.": "Le champ {0} n'est pas une URL http, https ou ftp complète valide.",
"The field {0} is invalid.": "Le champ {0} n'est pas valide.",
"ThisFieldIsNotAValidCreditCardNumber.": "Ce champ n'est pas un numéro de carte de crédit valide.",
"ThisFieldIsNotValid.": "Ce champ n'est pas valide.",
"ThisFieldIsNotAValidEmailAddress.": "Ce champ n'est pas une adresse e-mail valide.",
"ThisFieldOnlyAcceptsFilesWithTheFollowingExtensions:{0}": "Ce champ accepte uniquement les fichiers avec les extensions suivantes: {0}",
"ThisFieldMustBeAStringOrArrayTypeWithAMaximumLengthOf{0}": "Ce champ doit être une chaîne ou un type de tableau d'une longueur maximale de '{0}'.",
"ThisFieldMustBeAStringOrArrayTypeWithAMinimumLengthOf{0}": "Ce champ doit être un type de chaîne ou de tableau d'une longueur minimale de '{0}'.",
"ThisFieldIsNotAValidPhoneNumber.": "Ce champ n'est pas un numéro de téléphone valide.",
"ThisFieldMustBeBetween{0}And{1}": "Ce champ doit être compris entre {0} et {1}.",
"ThisFieldMustMatchTheRegularExpression{0}": "Ce champ doit correspondre à l'expression régulière '{0}'.",
"ThisFieldIsRequired.": "Ce champ est requis.",
"ThisFieldMustBeAStringWithAMaximumLengthOf{0}": "Ce champ doit être une chaîne d'une longueur maximale de {0}.",
"ThisFieldMustBeAStringWithAMinimumLengthOf{1}AndAMaximumLengthOf{0}": "Ce champ doit être une chaîne d'une longueur minimale de {1} et d'une longueur maximale de {0}.",
"ThisFieldIsNotAValidFullyQualifiedHttpHttpsOrFtpUrl": "Ce champ n'est pas une URL http, https ou ftp complète valide.",
"ThisFieldIsInvalid.": "Ce champ n'est pas valide."
}
}

7
framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Localization/Resource/fr.json

@ -0,0 +1,7 @@
{
"culture": "fr",
"texts": {
"BirthDate": "Date de naissance",
"Value1": "Valeur 1"
}
}

6
framework/test/Volo.Abp.Emailing.Tests/Volo/Abp/Emailing/Localization/fr.json

@ -0,0 +1,6 @@
{
"culture": "fr",
"texts": {
"hello": "Bonjour"
}
}

7
framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/Localization/fr.json

@ -0,0 +1,7 @@
{
"culture": "fr",
"texts": {
"HelloText": "Bonjour {0}",
"HowAreYou": "Comment ça va?"
}
}

60
modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fr.json

@ -0,0 +1,60 @@
{
"culture": "fr",
"texts": {
"UserName": "Nom d'utilisateur",
"EmailAddress": "Adresse e-mail",
"UserNameOrEmailAddress": "Nom d'utilisateur ou adresse e-mail",
"Password": "Mot de passe",
"RememberMe": "Souviens-toi de moi",
"UseAnotherServiceToLogin": "Utilisez un autre service pour vous connecter",
"UserLockedOutMessage": "Le compte utilisateur a été verrouillé en raison de tentatives de connexion non valides. Veuillez patienter un instant et réessayer.",
"InvalidUserNameOrPassword": "Nom d'utilisateur ou mot de passe invalide!",
"LoginIsNotAllowed": "Vous n'êtes pas autorisé à vous connecter! Vous devez confirmer votre e-mail / numéro de téléphone.",
"SelfRegistrationDisabledMessage": "L'auto-inscription est désactivée pour cette application. Veuillez contacter l'administrateur de l'application pour enregistrer un nouvel utilisateur.",
"LocalLoginDisabledMessage": "La connexion locale est désactivée pour cette application.",
"Login": "Connectez-vous",
"Cancel": "Annuler",
"Register": "S'inscrire",
"AreYouANewUser": "Êtes-vous un nouvel utilisateur?",
"AlreadyRegistered": "Déjà inscrit?",
"InvalidLoginRequest": "Demande de connexion non valide",
"ThereAreNoLoginSchemesConfiguredForThisClient": "Aucun schéma de connexion n'est configuré pour ce client.",
"LogInUsingYourProviderAccount": "Connectez-vous à l'aide de votre compte {0}",
"DisplayName:CurrentPassword": "Mot de passe actuel",
"DisplayName:NewPassword": "Nouveau mot de passe",
"DisplayName:NewPasswordConfirm": "Confirmer le nouveau mot de passe",
"PasswordChangedMessage": "Votre mot de passe a été changé avec succès.",
"DisplayName:UserName": "Nom d'utilisateur",
"DisplayName:Email": "Email",
"DisplayName:Name": "Nom",
"DisplayName:Surname": "Nom de famille",
"DisplayName:Password": "Mot de passe",
"DisplayName:EmailAddress": "Adresse e-mail",
"DisplayName:PhoneNumber": "Numéro de téléphone",
"PersonalSettings": "Paramètres personnels",
"PersonalSettingsSaved": "Paramètres personnels enregistrés",
"PasswordChanged": "Mot de passe changé",
"NewPasswordConfirmFailed": "Veuillez confirmer le nouveau mot de passe.",
"Manage": "Gérer",
"ManageYourProfile": "Gérez votre profil",
"DisplayName:Abp.Account.IsSelfRegistrationEnabled": "L’auto-inscription est-elle activée",
"Description:Abp.Account.IsSelfRegistrationEnabled": "Si un utilisateur peut enregistrer le compte par lui-même.",
"DisplayName:Abp.Account.EnableLocalLogin": "Authentifier avec un compte local",
"Description:Abp.Account.EnableLocalLogin": "Indique si le serveur permettra aux utilisateurs de s’authentifier avec un compte local.",
"LoggedOutTitle": "Se déconnecter",
"LoggedOutText": "Vous avez été déconnecté et vous serez bientôt redirigé.",
"ReturnToText": "Cliquez ici pour rediriger vers {0}",
"OrLoginWith": "Ou connectez-vous avec;",
"ForgotPassword": "Vous avez oublié le mot de passe ?",
"SendPasswordResetLink_Information": "Un lien de réinitialisation du mot de passe sera envoyé à votre adresse e-mail pour réinitialiser votre mot de passe. Si vous ne recevez pas d'e-mail dans quelques minutes, veuillez réessayer.",
"PasswordResetMailSentMessage": "E-mail de récupération de compte envoyé à votre adresse e-mail. Si vous ne voyez pas cet e-mail dans votre boîte de réception dans les 15 minutes, recherchez-le dans votre dossier de courrier indésirable. Si vous le trouvez là-bas, veuillez le marquer comme -Pas indésirable-.",
"ResetPassword": "Réinitialiser le mot de passe",
"ConfirmPassword": "Confirmer (répéter) le mot de passe",
"ResetPassword_Information": "Entrez votre nouveau mot de passe.",
"YourPasswordIsSuccessfullyReset": "Votre mot de passe a été réinitialisé avec succès.",
"GoToTheApplication": "Accédez à l’application",
"BackToLogin": "Retour à la connexion",
"ProfileTab:Password": "Changer le mot de passe",
"ProfileTab:PersonalInfo": "Informations personnelles"
}
}

6
modules/blob-storing-database/src/Volo.Abp.BlobStoring.Database.Domain.Shared/Volo/Abp/BlobStoring/Database/Localization/fr.json

@ -0,0 +1,6 @@
{
"culture": "fr",
"texts": {
"ManageYourProfile": "Gérer votre profil"
}
}

58
modules/blogging/src/Volo.Blogging.Domain.Shared/Volo/Blogging/Localization/Resources/fr.json

@ -0,0 +1,58 @@
{
"culture": "fr",
"texts": {
"Menu:Blogs": "Blogs",
"Menu:BlogManagement": "Bloguer",
"Permission:Management": "La gestion",
"Permission:Edit": "Éditer",
"Permission:Create": "Créer",
"Permission:Delete": "Supprimer",
"Permission:Blogging": "Blog",
"Permission:Blogs": "Blogs",
"Permission:Posts": "Des postes",
"Permission:Tags": "Mots clés",
"Permission:Comments": "commentaires",
"Title": "Titre",
"Delete": "Supprimer",
"Reply": "Répondre",
"ReplyTo": "Répondre à {0}",
"ContinueReading": "Continuer la lecture",
"DaysAgo": "Il y a {0} jours",
"YearsAgo": "Il y a {0} ans",
"MonthsAgo": "Il y a {0} mois",
"WeeksAgo": "Il y a {0} semaines",
"MinutesAgo": "Il y a {0} minutes",
"SecondsAgo": "Il y a {0} secondes",
"HoursAgo": "Il y a {0} heures",
"Now": "maintenant",
"Content": "Contenu",
"SeeAll": "Voir tout",
"PopularTags": "Tags populaires",
"WiewsWithCount": "{0} vues",
"LastPosts": "Derniers messages",
"LeaveComment": "Laisse un commentaire",
"TagsInThisArticle": "Tags dans cet article",
"Posts": "Des postes",
"Edit": "Éditer",
"BLOG": "BLOG",
"CommentDeletionWarningMessage": "Le commentaire sera supprimé.",
"PostDeletionWarningMessage": "Le message sera supprimé.",
"BlogDeletionWarningMessage": "Le blog sera supprimé.",
"AreYouSure": "Êtes-vous sûr?",
"CommentWithCount": "{0 commentaire",
"Comment": "Commentaire",
"ShareOnTwitter": "Partager sur Twitter",
"CoverImage": "Image de couverture",
"CreateANewPost": "Créer un nouveau message",
"CreateANewBlog": "Créer un nouveau blog",
"WhatIsNew": "Ce qui est nouveau?",
"Name": "Nom",
"ShortName": "Nom court",
"CreationTime": "Temps de creation",
"Description": "La description",
"Blogs": "Blogs",
"Tags": "Mots clés",
"ShareOn": "Partager sur",
"TitleLengthWarning": "Gardez la taille de votre titre sous 60 caractères pour être optimisé pour le référencement!"
}
}

22
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/fr.json

@ -0,0 +1,22 @@
{
"culture": "fr",
"texts": {
"PickYourReaction": "Choisissez votre réaction",
"YourComment": "Votre commentaire",
"YourReply": "Votre réponse",
"Comments": "Commentaires",
"Send": "Envoyer",
"Delete": "Supprimer",
"Reply": "Réponse",
"Update": "Mettre à jour",
"Edit": "Modifier",
"LoginToAddComment": "Connectez-vous pour ajouter un commentaire",
"LoginToReply": "Connectez-vous pour répondre",
"MessageDeletionConfirmationMessage": "Ce commentaire sera complètement supprimé.",
"CommentAuthorizationExceptionMessage": "Ces commentaires ne sont pas autorisés pour l'affichage public.",
"Undo": "Annuler",
"RatingUndoMessage": "Votre note sera annulée.",
"LoginToRate": "Connectez-vous pour évaluer",
"Star": "étoile"
}
}

10
modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/fr.json

@ -0,0 +1,10 @@
{
"culture": "fr",
"texts": {
"Features": "Fonctionnalités",
"NoFeatureFoundMessage": "Il n'y a aucune fonctionnalité disponible.",
"Permission:FeatureManagement": "Gestion des fonctionnalités",
"Permission:FeatureManagement.ManageHostFeatures": "Gérer les fonctionnalités de l'hôte",
"Volo.Abp.FeatureManagement:InvalidFeatureValue": "La valeur de la fonctionnalité {0} n'est pas valide!"
}
}

120
modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json

@ -0,0 +1,120 @@
{
"culture": "fr",
"texts": {
"Menu:IdentityManagement": "Gestion de l’identité",
"Users": "Utilisateurs",
"NewUser": "Nouvel utilisateur",
"UserName": "Nom d’utilisateur",
"EmailAddress": "Adresse e-mail",
"PhoneNumber": "Numéro de téléphone",
"UserInformations": "Informations utilisateur",
"DisplayName:IsDefault": "Par défaut",
"DisplayName:IsStatic": "Statique",
"DisplayName:IsPublic": "Public",
"Roles": "Rôles",
"Password": "mot de passe",
"PersonalInfo": "Mon profil",
"PersonalSettings": "Paramètres personnels",
"UserDeletionConfirmationMessage": "Les ' {0} ' de l’utilisateur seront supprimés. Vous le confirmez ?",
"RoleDeletionConfirmationMessage": "Le rôle '{0}' sera supprimé. Vous le confirmez ?",
"DisplayName:RoleName": "Nom du rôle",
"DisplayName:UserName": "Nom d’utilisateur",
"DisplayName:Name": "Nom",
"DisplayName:Surname": "Nom",
"DisplayName:Password": "mot de passe",
"DisplayName:Email": "Adresse e-mail",
"DisplayName:PhoneNumber": "Numéro de téléphone",
"DisplayName:TwoFactorEnabled": "Vérification de deux facteurs",
"DisplayName:LockoutEnabled": "Verrouiller le compte après l’échec des tentatives de connexion",
"NewRole": "Nouveau rôle",
"RoleName": "Nom du rôle",
"CreationTime": "Temps de création",
"Permissions": "Autorisations",
"DisplayName:CurrentPassword": "Mot de passe actuel",
"DisplayName:NewPassword": "Nouveau mot de passe",
"DisplayName:NewPasswordConfirm": "Confirmer un nouveau mot de passe",
"PasswordChangedMessage": "Votre mot de passe a été modifié avec succès.",
"PersonalSettingsSavedMessage": "Vos paramètres personnels ont été enregistrés avec succès.",
"Volo.Abp.Identity:DefaultError": "Une défaillance inconnue s’est produite.",
"Volo.Abp.Identity:ConcurrencyFailure": "Échec optimiste de la concurrence, l’objet a été modifié.",
"Volo.Abp.Identity:DuplicateEmail": "E-mail '{0}' est déjà prise.",
"Volo.Abp.Identity:DuplicateRoleName": "Le nom de rôle '{0}' est déjà pris.",
"Volo.Abp.Identity:DuplicateUserName": "Le nom d’utilisateur '{0}' est déjà pris.",
"Volo.Abp.Identity:InvalidEmail": "Le courrier électronique '{0}' n’est pas valide.",
"Volo.Abp.Identity:InvalidPasswordHasherCompatibilityMode": "Le passwordHasherCompatibilitéMode fourni n’est pas valide.",
"Volo.Abp.Identity:InvalidPasswordHasherIterationCount": "Le nombre d’itérations doit être un entier positif.",
"Volo.Abp.Identity:InvalidRoleName": "Le nom de rôle '{0}' n’est pas valide.",
"Volo.Abp.Identity:InvalidToken": "Jeton non valide.",
"Volo.Abp.Identity:InvalidUserName": "Le nom d’utilisateur '{0}' n’est pas valide, ne peut contenir que des lettres ou des chiffres.",
"Volo.Abp.Identity:LoginAlreadyAssociated": "Un utilisateur avec cette connexion existe déjà.",
"Volo.Abp.Identity:PasswordMismatch": "Mot de passe incorrect.",
"Volo.Abp.Identity:PasswordRequiresDigit": "Les mots de passe doivent avoir au moins un chiffre ('0'-'9').",
"Volo.Abp.Identity:PasswordRequiresLower": "Les mots de passe doivent avoir au moins une minuscule ('a'-'z').",
"Volo.Abp.Identity:PasswordRequiresNonAlphanumeric": "Les mots de passe doivent avoir au moins un caractère non alphanumérique.",
"Volo.Abp.Identity:PasswordRequiresUpper": "Les mots de passe doivent avoir au moins une majuscule ('A'-'Z').",
"Volo.Abp.Identity:PasswordTooShort": "Les mots de passe doivent être au moins {0} caractères.",
"Volo.Abp.Identity:RoleNotFound": "La {0} de rôle n’existe pas.",
"Volo.Abp.Identity:UserAlreadyHasPassword": "L’utilisateur dispose déjà d’un jeu de mots de passe.",
"Volo.Abp.Identity:UserAlreadyInRole": "Utilisateur déjà dans le rôle '{0}'.",
"Volo.Abp.Identity:UserLockedOut": "L’utilisateur est en lock-out.",
"Volo.Abp.Identity:UserLockoutNotEnabled": "Le lock-out n’est pas activé pour cet utilisateur.",
"Volo.Abp.Identity:UserNameNotFound": "La {0} de l’utilisateur n’existe pas.",
"Volo.Abp.Identity:UserNotInRole": "L’utilisateur n’est pas dans le rôle '{0}'.",
"Volo.Abp.Identity:PasswordConfirmationFailed": "Le mot de passe ne correspond pas au mot de passe de confirmation.",
"Volo.Abp.Identity:010001": "Vous ne pouvez pas supprimer votre propre compte!",
"Volo.Abp.Identity:010002": "Impossible de définir plus de {MaxUserMembershipCount} unité d’organisation pour un utilisateur!",
"Volo.Abp.Identity:010003": "Impossible de changer le mot de passe d’un utilisateur connecté à l’extérieur!",
"Volo.Abp.Identity:010004": "Il existe déjà une unité d’organisation dont le nom {0}. Deux unités du même nom ne peuvent pas être créées dans le même niveau.",
"Volo.Abp.Identity:010005": "Les rôles statiques ne peuvent pas être renommés.",
"Volo.Abp.Identity:010006": "Les rôles statiques ne peuvent pas être supprimés.",
"Volo.Abp.Identity:010007": "Vous ne pouvez pas modifier votre paramètre à deux facteurs.",
"Volo.Abp.Identity:010008": "Il n’est pas permis de changer deux facteurs de réglage.",
"Identity.OrganizationUnit.MaxUserMembershipCount": "Nombre maximal d’adhésions autorisées à l’unité d’organisation pour un utilisateur",
"Permission:IdentityManagement": "Gestion de l’identité",
"Permission:RoleManagement": "Gestion des rôles",
"Permission:Create": "Créer",
"Permission:Edit": "Modifier",
"Permission:Delete": "Supprimer",
"Permission:ChangePermissions": "Modifier les autorisations",
"Permission:UserManagement": "Gestion des utilisateurs",
"Permission:UserLookup": "Recherche utilisateur",
"Feature:IdentityGroup": "Identité",
"Feature:TwoFactor": "Deux facteurs",
"Feature:TwoFactorDescription": "Deux facteurs",
"Feature:TwoFactor.Optional": "Optionnel",
"Feature:TwoFactor.Disabled": "Handicapés",
"Feature:TwoFactor.Forced": "Forcé",
"DisplayName:Abp.Identity.Password.RequiredLength": "Longueur requise",
"DisplayName:Abp.Identity.Password.RequiredUniqueChars": "Nombre de caractères uniques requis",
"DisplayName:Abp.Identity.Password.RequireNonAlphanumeric": "Caractère non alphanumérique requis",
"DisplayName:Abp.Identity.Password.RequireLowercase": "Caractère de minuscule requis",
"DisplayName:Abp.Identity.Password.RequireUppercase": "Caractère de majuscule requis",
"DisplayName:Abp.Identity.Password.RequireDigit": "Chiffre requis",
"DisplayName:Abp.Identity.Lockout.AllowedForNewUsers": "Activé pour les nouveaux utilisateurs",
"DisplayName:Abp.Identity.Lockout.LockoutDuration": "Durée(secondes) du lock-out",
"DisplayName:Abp.Identity.Lockout.MaxFailedAccessAttempts": "Max a échoué tentatives d’accès",
"DisplayName:Abp.Identity.SignIn.RequireConfirmedEmail": "Exiger un e-mail confirmé",
"DisplayName:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "Permettre aux utilisateurs de confirmer leur numéro de téléphone",
"DisplayName:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "Exiger un numéro de téléphone confirmé",
"DisplayName:Abp.Identity.User.IsUserNameUpdateEnabled": "Permettre aux utilisateurs de modifier leurs noms d’utilisateur",
"DisplayName:Abp.Identity.User.IsEmailUpdateEnabled": "Permettre aux utilisateurs de modifier leurs adresses e-mail",
"Description:Abp.Identity.Password.RequiredLength": "La longueur minimale d’un mot de passe doit être.",
"Description:Abp.Identity.Password.RequiredUniqueChars": "Nombre minimum de caractères uniques qu’un mot de passe doit contenir.",
"Description:Abp.Identity.Password.RequireNonAlphanumeric": "Si les mots de passe doivent contenir un caractère non alphanumérique.",
"Description:Abp.Identity.Password.RequireLowercase": "Si les mots de passe doivent contenir un caractère ASCII minuscule.",
"Description:Abp.Identity.Password.RequireUppercase": "Si les mots de passe doivent contenir un caractère ASCII majuscule.",
"Description:Abp.Identity.Password.RequireDigit": "Si les mots de passe doivent contenir un chiffre.",
"Description:Abp.Identity.Lockout.AllowedForNewUsers": "Si un nouvel utilisateur peut être verrouillé.",
"Description:Abp.Identity.Lockout.LockoutDuration": "Durée pendant laquelle un utilisateur est verrouillé lorsqu’un lock-out se produit.",
"Description:Abp.Identity.Lockout.MaxFailedAccessAttempts": "Nombre de tentatives d’accès échouées avant qu’un utilisateur ne soit verrouillé, en supposant que le verrouillage est activé.",
"Description:Abp.Identity.SignIn.RequireConfirmedEmail": "Si une adresse e-mail confirmée est nécessaire pour se connecter.",
"Description:Abp.Identity.SignIn.EnablePhoneNumberConfirmation": "Si le téléphoneNumber peut être confirmé par l’utilisateur.",
"Description:Abp.Identity.SignIn.RequireConfirmedPhoneNumber": "Si un numéro de téléphone confirmé est nécessaire pour se connecter.",
"Description:Abp.Identity.User.IsUserNameUpdateEnabled": "Si le nom d’utilisateur peut être mis à jour par l’utilisateur.",
"Description:Abp.Identity.User.IsEmailUpdateEnabled": "Si l’e-mail peut être mis à jour par l’utilisateur.",
"DisplayName:Abp.Identity.TwoFactorBehaviour": "Comportement à deux facteurs",
"Description:Abp.Identity.TwoFactorBehaviour": "Comportement à deux facteurs",
"DisplayName:Abp.Identity.UsersCanChange": "Permettre aux utilisateurs de modifier leur facteur deux.",
"Description:Abp.Identity.UsersCanChange": "Permettre aux utilisateurs de modifier leur facteur deux."
}
}

10
modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo/Abp/PermissionManagement/Localization/Domain/fr.json

@ -0,0 +1,10 @@
{
"culture": "fr",
"texts": {
"Permissions": "Autorisations",
"OnlyProviderPermissons": "Seul ce fournisseur",
"All": "Tous",
"SelectAllInAllTabs": "Accorder toutes les autorisations",
"SelectAllInThisTab": "Sélectionner tous les"
}
}

7
modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo/Abp/SettingManagement/Localization/Resources/AbpSettingManagement/fr.json

@ -0,0 +1,7 @@
{
"culture": "fr",
"texts": {
"Settings": "Paramètres",
"SuccessfullySaved": "Enregistré avec succès"
}
}

23
modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo/Abp/TenantManagement/Localization/Resources/fr.json

@ -0,0 +1,23 @@
{
"culture": "fr",
"texts": {
"Menu:TenantManagement": "Gestion des locataires",
"Tenants": "Locataires",
"NewTenant": "Nouveau locataire",
"TenantName": "Nom du locataire",
"DisplayName:TenantName": "Nom du locataire",
"TenantDeletionConfirmationMessage": "Les ' {0} ' du locataire seront supprimés. Vous le confirmez ?",
"ConnectionStrings": "Chaînes de connexion",
"DisplayName:DefaultConnectionString": "Chaîne de connexion par défaut",
"DisplayName:UseSharedDatabase": "Utiliser la base de données partagée",
"ManageHostFeatures": "Gérer les fonctionnalités de l’hôte",
"Permission:TenantManagement": "Gestion des locataires",
"Permission:Create": "Créer",
"Permission:Edit": "Modifier",
"Permission:Delete": "Supprimer",
"Permission:ManageConnectionStrings": "Gérer les chaînes de connexion",
"Permission:ManageFeatures": "Gérer les fonctionnalités",
"DisplayName:AdminEmailAddress": "Adresse de messagerie d’administrateur",
"DisplayName:AdminPassword": "Mot de passe d’administrateur"
}
}

14
modules/virtual-file-explorer/src/Volo.Abp.VirtualFileExplorer.Web/Localization/Resources/fr.json

@ -0,0 +1,14 @@
{
"culture": "fr",
"texts": {
"VirtualFileExplorer": "Explorateur de fichiers virtuels",
"VirtualFileType": "Type de fichier virtuel",
"Menu:VirtualFileExplorer": "Explorateur de fichiers virtuels",
"LastUpdateTime": "Dernière heure de mise à jour",
"VirtualFileName": "Nom de fichier virtuel",
"FileContent": "Contenu du fichier",
"Size": "Taille",
"BackToRoot": "Retour à la racine",
"EmptyFileInfoList": "Il n’y a pas de fichiers virtuels"
}
}

29
npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.html

@ -23,20 +23,22 @@
<hr class="mt-2 mb-3" />
<div
class="row my-3"
class="mt-2"
*ngFor="let feature of features[group.name]; let i = index; trackBy: track.by('id')"
[ngStyle]="feature.style"
[ngSwitch]="feature.valueType?.name"
(keyup.enter)="save()"
>
<div *ngSwitchCase="valueTypes.ToggleStringValueType">
<ng-container *ngSwitchCase="valueTypes.ToggleStringValueType">
<div class="custom-checkbox custom-control">
<input
class="custom-control-input"
type="checkbox"
[id]="feature.name"
[(ngModel)]="feature.value"
(ngModelChange)="onCheckboxClick($event, feature)"
/>
<label class="custom-control-label" [htmlFor]="feature.name">{{
feature.displayName
}}</label>
@ -44,27 +46,32 @@
*ngTemplateOutlet="descTmp; context: { $implicit: feature.description }"
></ng-container>
</div>
</div>
<div *ngSwitchCase="valueTypes.FreeTextStringValueType">
<div class="form-group mb-0">
</ng-container>
<ng-container *ngSwitchCase="valueTypes.FreeTextStringValueType">
<div class="form-group">
<label [htmlFor]="feature.name">{{ feature.displayName }}</label>
<input
class="form-control"
type="text"
[id]="feature.name"
[(ngModel)]="feature.value"
[abpFeatureManagementFreeText]="feature"
/>
<ng-container
*ngTemplateOutlet="descTmp; context: { $implicit: feature.description }"
></ng-container>
</div>
</div>
<div *ngSwitchCase="valueTypes.SelectionStringValueType">
</ng-container>
<ng-container *ngSwitchCase="valueTypes.SelectionStringValueType">
<ng-container *ngIf="feature.valueType.itemSource?.items?.length">
<div class="form-group mb-0">
<div class="form-group">
<label [htmlFor]="feature.name">{{ feature.displayName }}</label>
<select class="form-control" [id]="feature.name" [(ngModel)]="feature.value">
<select
class="form-control custom-select"
[id]="feature.name"
[(ngModel)]="feature.value"
>
<option
*ngFor="
let item of feature.valueType.itemSource?.items;
@ -83,8 +90,8 @@
></ng-container>
</div>
</ng-container>
</div>
<div *ngSwitchDefault>{{ feature.displayName }}</div>
</ng-container>
<ng-container *ngSwitchDefault>{{ feature.displayName }}</ng-container>
</div>
</ng-template>
</li>

64
npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts

@ -119,6 +119,70 @@ export class FeatureManagementComponent
}
});
}
onCheckboxClick(val: boolean, feature: FeatureDto) {
if (val) {
this.checkToggleAncestors(feature);
} else {
this.uncheckToggleDescendants(feature);
}
}
private uncheckToggleDescendants(feature: FeatureDto) {
this.findAllDescendantsOfByType(feature, ValueTypes.ToggleStringValueType).forEach(node =>
this.setFeatureValue(node, false),
);
}
private checkToggleAncestors(feature: FeatureDto) {
this.findAllAncestorsOfByType(feature, ValueTypes.ToggleStringValueType).forEach(node =>
this.setFeatureValue(node, true),
);
}
private findAllAncestorsOfByType(feature: FeatureDto, type: ValueTypes) {
let parent = this.findParentByType(feature, type);
const ancestors = [];
while (parent) {
ancestors.push(parent);
parent = this.findParentByType(parent, type);
}
return ancestors;
}
private findAllDescendantsOfByType(feature: FeatureDto, type: ValueTypes) {
const descendants = [];
const queue = [feature];
while (queue.length) {
const node = queue.pop();
const newDescendants = this.findChildrenByType(node, type);
descendants.push(...newDescendants);
queue.push(...newDescendants);
}
return descendants;
}
private findParentByType(feature: FeatureDto, type: ValueTypes) {
return this.getCurrentGroup().find(
f => f.valueType.name === type && f.name === feature.parentName,
);
}
private findChildrenByType(feature: FeatureDto, type: ValueTypes) {
return this.getCurrentGroup().filter(
f => f.valueType.name === type && f.parentName === feature.name,
);
}
private getCurrentGroup() {
return this.features[this.selectedGroupDisplayName] ?? [];
}
private setFeatureValue(feature: FeatureDto, val: boolean) {
feature.value = val as any;
}
}
function mapFeatures(features: FeatureDto[], dir: LocaleDirection) {

38
npm/ng-packs/packages/feature-management/src/lib/directives/free-text-input.directive.ts

@ -0,0 +1,38 @@
import { Directive, Input, HostBinding } from '@angular/core';
// TODO: improve this type
export interface FreeTextType {
valueType: {
validator: {
name: string;
};
};
}
export const INPUT_TYPES = {
numeric: 'number',
default: 'text',
};
@Directive({
selector: 'input[abpFeatureManagementFreeText]',
exportAs: 'inputAbpFeatureManagementFreeText',
})
export class FreeTextInputDirective {
_feature: FreeTextType;
@Input('abpFeatureManagementFreeText') set feature(val: FreeTextType) {
this._feature = val;
this.setInputType();
}
get feature() {
return this._feature;
}
@HostBinding('type') type: string;
private setInputType() {
const validatorType = this.feature?.valueType?.validator?.name.toLowerCase();
this.type = INPUT_TYPES[validatorType] ?? INPUT_TYPES.default;
}
}

1
npm/ng-packs/packages/feature-management/src/lib/directives/index.ts

@ -0,0 +1 @@
export * from './free-text-input.directive';

11
npm/ng-packs/packages/feature-management/src/lib/feature-management.module.ts

@ -1,19 +1,22 @@
import { CoreModule } from '@abp/ng.core';
import { ThemeSharedModule } from '@abp/ng.theme.shared';
import { NgModule } from '@angular/core';
import { FeatureManagementComponent } from './components/feature-management/feature-management.component';
import { NgxsModule } from '@ngxs/store';
import { FeatureManagementState } from './states/feature-management.state';
import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap';
import { FreeTextInputDirective } from './directives/free-text-input.directive';
import { FeatureManagementComponent } from './components/feature-management/feature-management.component';
import { FeatureManagementState } from './states/feature-management.state';
const exported = [FeatureManagementComponent, FreeTextInputDirective];
@NgModule({
declarations: [FeatureManagementComponent],
declarations: [...exported],
imports: [
CoreModule,
ThemeSharedModule,
NgbNavModule,
NgxsModule.forFeature([FeatureManagementState]),
],
exports: [FeatureManagementComponent],
exports: [...exported],
})
export class FeatureManagementModule {}

8
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/fr.json

@ -0,0 +1,8 @@
{
"culture": "fr",
"texts": {
"Menu:Home": "Accueil",
"Welcome": "Bienvenue",
"LongWelcomeMessage": "Bienvenue dans l'application. Il s'agit d'un projet de démarrage basé sur le framework ABP. Pour plus d'informations, visitez abp.io."
}
}

1
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs

@ -115,6 +115,7 @@ namespace MyCompanyName.MyProjectName
options.Languages.Add(new LanguageInfo("ar", "ar", "العربية"));
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));

1
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs

@ -119,6 +119,7 @@ namespace MyCompanyName.MyProjectName
options.Languages.Add(new LanguageInfo("ar", "ar", "العربية"));
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));

1
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs

@ -61,6 +61,7 @@ namespace MyCompanyName.MyProjectName
options.Languages.Add(new LanguageInfo("ar", "ar", "العربية"));
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));

1
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs

@ -145,6 +145,7 @@ namespace MyCompanyName.MyProjectName.Web
options.Languages.Add(new LanguageInfo("ar", "ar", "العربية"));
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));

1
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs

@ -91,6 +91,7 @@ namespace MyCompanyName.MyProjectName
{
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));

1
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs

@ -102,6 +102,7 @@ namespace MyCompanyName.MyProjectName
{
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));

1
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs

@ -99,6 +99,7 @@ namespace MyCompanyName.MyProjectName
{
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português (Brasil)"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));

7
templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/fr.json

@ -0,0 +1,7 @@
{
"culture": "fr",
"texts": {
"ManageYourProfile": "Gérer votre profil",
"SamplePageMessage": "Exemple de page pour le module MyProjectName"
}
}
Loading…
Cancel
Save