merge de logs et de master

pull/31/head
kentin.brongniart 3 months ago
commit b8af563ce9

@ -0,0 +1,71 @@
kind: pipeline
name: CI
type: docker
trigger:
event:
- push
steps:
- name: build
image: mcr.microsoft.com/dotnet/sdk:6.0
commands:
- cd WF-WebAdmin/WF-WebAdmin
- dotnet restore WF-WebAdmin.csproj
- dotnet build WF-WebAdmin.csproj -c Release --no-restore
- dotnet publish WF-WebAdmin.csproj -c Release --no-restore -o $CI_PROJECT_DIR/build/publish
- name: tests
image: mcr.microsoft.com/dotnet/sdk:6.0
commands:
- cd WF-WebAdmin/WF-WebAdmin
- dotnet restore WF-WebAdmin.csproj
- dotnet test WF-WebAdmin.csproj --no-restore
depends_on: [ build ]
- name: code-analysis
image: hub.codefirst.iut.uca.fr/marc.chevaldonne/codefirst-dronesonarplugin-dotnet8
commands:
- cd WF-WebAdmin/
- dotnet restore WF-WebAdmin.sln
- dotnet sonarscanner begin /k:$${project_key} /d:sonar.host.url=$${sonar_host} /d:sonar.coverageReportPaths="coveragereport/SonarQube.xml" /d:sonar.coverage.exclusions=$${coverage_exclusions} /d:sonar.login=$${sonar_token}
- dotnet build WF-WebAdmin.sln -c Release --no-restore
- dotnet test WF-WebAdmin.sln --logger trx --no-restore /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --collect "XPlat Code Coverage"
- reportgenerator -reports:"**/coverage.cobertura.xml" -reporttypes:SonarQube -targetdir:"coveragereport"
- dotnet publish WF-WebAdmin.sln -c Release --no-restore -o $CI_PROJECT_DIR/build/release
- dotnet sonarscanner end /d:sonar.login=$${sonar_token}
secrets: [ SECRET_SONAR_LOGIN ]
environment:
sonar_host: https://codefirst.iut.uca.fr/sonar/
sonar_token:
from_secret: sonar_token
project_key: web_admin
coverage_exclusions: "Tests/**"
depends_on: [ tests ]
- name: generate-and-deploy-docs
image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-docdeployer
failure: ignore
volumes:
- name: docs
path: /docs
commands:
- /entrypoint.sh
when:
branch:
- master
depends_on: [ build ]
- name: docker_build
image: plugins/docker
settings:
repo: hub.codefirst.iut.uca.fr/whatthefantasy/wf-webadmin
registry: hub.codefirst.iut.uca.fr
dockerfile: Docker/Dockerfile
tags:
- latest
username:
from_secret: docker_username
password:
from_secret: docker_password
depends_on: [ build, tests, code-analysis ]

@ -0,0 +1,27 @@
# 1. Étape de build (SDK .NET 6)
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
# Copier le csproj et restaurer les dépendances
COPY WF-WebAdmin/WF-WebAdmin/WF-WebAdmin.csproj ./
RUN dotnet restore WF-WebAdmin.csproj
# Copier le reste du code et compiler
COPY WF-WebAdmin/WF-WebAdmin/ ./
RUN dotnet publish WF-WebAdmin.csproj -c Release -o /app/publish
# 2. Étape finale (runtime .NET 6)
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS final
WORKDIR /app
# Désactiver le rechargement de config pour éviter les erreurs inotify
ENV ASPNETCORE_HOSTBUILDER__RELOADCONFIGONCHANGE=false
# Copier les binaires publiés
COPY --from=build /app/publish ./
# Exposer le port HTTP (80) ; adapte si besoin
EXPOSE 80
# Lancement
ENTRYPOINT ["dotnet", "WF-WebAdmin.dll"]

@ -61,20 +61,20 @@ L'application devrait se lancer automatiquement dans votre navigateur par défau
# Blazor Apps (30 points)
🟨 En cours / ✅ Fait / ❌ Pas fait<br/><br/>
✅ Mise en place d'une page de visualisation des données avec pagination (2 points) <br/>
🟨 Page d'ajout d'un élement avec validation (2 point)<br/>
🟨 Page d'édition d'un élement avec validation (2 point)<br/>
Page d'ajout d'un élement avec validation (2 point)<br/>
Page d'édition d'un élement avec validation (2 point)<br/>
✅ Supression d'un élement avec une confirmation (2 point)<br/>
🟨 Composant complexe (5 point)<br/>
🟨 Use API (Get / Insert / Update / Delete) (3 point)<br/>
Utilisation IOC & DI (4 point)<br/>
🟨 Localisation & Globalisation (au moins deux langues) (1 point) <br/>
🟨 Utilisation de la configuration (1 point)<br/>
Utilisation IOC & DI (4 point)<br/>
Localisation & Globalisation (au moins deux langues) (1 point) <br/>
Utilisation de la configuration (1 point)<br/>
🟨 Logs (2 point)<br/>
❌ Propreté du code (Vous pouvez vous servir de sonarqube) (2 point)<br/>
✅ IHM (Design global, placement des boutons, ...) (2 point)<br/>
✅ Emplacement du code (Pas de code dans les vues) (2 point)<br/>
# Documentation (10 points)
🟨Le Readme (2 points)<br/>
❌Description du fonctionnement de la solution client (illustrutration au niveau du code) (6 points)<br/>
✅Merge request (2 points)<br/>
Le Readme (2 points)<br/>
Description du fonctionnement de la solution client (illustrutration au niveau du code) (6 points)<br/>
Merge request (2 points)<br/>

@ -0,0 +1,11 @@
namespace UnitTestWF
{
public class UnitTest1
{
[Fact]
public void Test1()
{
}
}
}

@ -0,0 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="xunit" Version="2.5.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
</ItemGroup>
<ItemGroup>
<Using Include="Xunit" />
</ItemGroup>
</Project>

@ -5,6 +5,8 @@ VisualStudioVersion = 17.9.34723.18
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WF-WebAdmin", "WF-WebAdmin\WF-WebAdmin.csproj", "{0E8D1007-ADDC-4103-847D-8EE48ACCDC62}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTestWF", "UnitTestWF\UnitTestWF.csproj", "{A4EC0EC4-7A46-4F8E-99C3-4FD32F173F2F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -15,6 +17,10 @@ Global
{0E8D1007-ADDC-4103-847D-8EE48ACCDC62}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0E8D1007-ADDC-4103-847D-8EE48ACCDC62}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0E8D1007-ADDC-4103-847D-8EE48ACCDC62}.Release|Any CPU.Build.0 = Release|Any CPU
{A4EC0EC4-7A46-4F8E-99C3-4FD32F173F2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A4EC0EC4-7A46-4F8E-99C3-4FD32F173F2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A4EC0EC4-7A46-4F8E-99C3-4FD32F173F2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A4EC0EC4-7A46-4F8E-99C3-4FD32F173F2F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

@ -0,0 +1,34 @@
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
namespace WF_WebAdmin.Controllers
{
/// <summary>
/// The culture controller.
/// </summary>
[Route("[controller]/[action]")]
public class CultureController : Controller
{
/// <summary>
/// Sets the culture.
/// </summary>
/// <param name="culture">The culture.</param>
/// <param name="redirectUri">The redirect URI.</param>
/// <returns>
/// The action result.
/// </returns>
public IActionResult SetCulture(string culture, string redirectUri)
{
if (culture != null)
{
// Define a cookie with the selected culture
this.HttpContext.Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(
new RequestCulture(culture)));
}
return this.LocalRedirect(redirectUri);
}
}
}

@ -9,7 +9,7 @@ namespace WF_WebAdmin.Converter
public string Content { get; set; }
public int Likes { get; set; }
public string Langue { get; set; }
public bool? IsValide { get; set; }
public bool IsValide { get; set; }
public string? Reason { get; set; }
public int? IdCaracter { get; set; }
public string NameCharac { get; set; }
@ -21,7 +21,7 @@ namespace WF_WebAdmin.Converter
public int? IdImg { get; set; }
public string ImgPath { get; set; }
public QuoteDTO(int id_quote,string content,int likes,string langue,bool? isValide,string? reason,int? id_caracter,string name_charac,int? id_source,string title,DateTime date,int? id_user_verif,string name_user ,int? id_img,string img_path)
public QuoteDTO(int id_quote,string content,int likes,string langue,bool isValide,string? reason,int? id_caracter,string name_charac,int? id_source,string title,DateTime date,int? id_user_verif,string name_user ,int? id_img,string img_path)
{
this.Id = id_quote;
this.Content = content;

@ -6,13 +6,13 @@ namespace WF_WebAdmin.Converter
{
public QuoteDTO QuoteToDTO(Quote q)
{
QuoteDTO quote = new QuoteDTO(q.Id, q.Content, q.Like, q.Langue, null,null, null,q.Charac,null,q.TitleSrc,q.DateSrc,null,q.UserProposition,null,q.ImgPath);
QuoteDTO quote = new QuoteDTO(q.Id, q.Content, q.Like, q.Langue, q.IsValid,null, null,q.Charac,null,q.TitleSrc,q.DateSrc,null,q.UserProposition,null,q.ImgPath);
return quote;
}
public Quote DTOToQuote(QuoteDTO q)
{
Quote quote = new Quote(q.Id, q.Content,q.NameCharac,q.ImgPath,q.TitleSrc,q.DateSrc,q.Likes,q.Langue,q.NameUser);
Quote quote = new Quote(q.Id, q.Content,q.NameCharac,q.ImgPath,q.TitleSrc,q.DateSrc,q.Likes,q.Langue,q.NameUser,q.IsValide);
return quote;
}
}

@ -0,0 +1,8 @@
namespace WF_WebAdmin.Model
{
public class Character
{
public int id_caracter { get; set; }
public string caracter { get; set; }
}
}

@ -9,6 +9,36 @@ namespace WF_WebAdmin.Model
public string AnswerC { get; set; }
public string AnswerD { get; set; }
public string CAnswer { get; set; }
public bool IsValid { get; set; }
public string UserProposition { get; set; }
public Quiz(int id, string question, string answerA, string answerB, string answerC, string answerD, string cAnswer, bool isValid, string userProposition)
{
Id = id;
Question = question;
AnswerA = answerA;
AnswerB = answerB;
AnswerC = answerC;
AnswerD = answerD;
CAnswer = cAnswer;
IsValid = isValid;
UserProposition = userProposition;
}
public Quiz(int id, string question, string answerA, string answerB, string answerC, string answerD, string cAnswer)
{
Id = id;
Question = question;
AnswerA = answerA;
AnswerB = answerB;
AnswerC = answerC;
AnswerD = answerD;
CAnswer = cAnswer;
IsValid = true;
UserProposition = "Admin";
}
public Quiz() {}
}
}

@ -0,0 +1,30 @@
using System.ComponentModel.DataAnnotations;
namespace WF_WebAdmin.Model
{
public class QuizModel
{
[Required]
[StringLength(200, ErrorMessage = "La question ne peut pas depasser les 200 caractère.")]
public string Question { get; set; }
[Required]
[StringLength(50, ErrorMessage = "La réponse ne peut pas depasser les 50 caractère.")]
public string AnswerA { get; set; }
[Required]
[StringLength(50, ErrorMessage = "La réponse ne peut pas depasser les 50 caractère.")]
public string AnswerB { get; set; }
[Required]
[StringLength(50, ErrorMessage = "La réponse ne peut pas depasser les 50 caractère.")]
public string AnswerC { get; set; }
[Required]
[StringLength(50, ErrorMessage = "La réponse ne peut pas depasser les 50 caractère.")]
public string AnswerD { get; set; }
[Required]
public string CAnswer { get; set; }
}
}

@ -13,8 +13,9 @@ namespace WF_WebAdmin.Model
public string TitleSrc { get; set; }
public DateTime DateSrc { get; set; }
public string UserProposition { get; set; }
public bool IsValid { get; set; }
public Quote(int id, string content, string charac, string imgPath, string titleSrc, DateTime dateSrc, int like, string langue, string userProposition)
public Quote(int id, string content, string charac, string imgPath, string titleSrc, DateTime dateSrc, int like, string langue, string userProposition, bool isvalid)
{
Id = id;
Content = content;
@ -25,6 +26,7 @@ namespace WF_WebAdmin.Model
Like = like;
Langue = langue;
UserProposition = userProposition;
IsValid = isvalid;
}
/*
public int Id { get; set; }

@ -0,0 +1,27 @@
using System.ComponentModel.DataAnnotations;
namespace WF_WebAdmin.Model
{
public class QuoteModel
{
public int Id { get; set; }
[Required]
[StringLength(300, ErrorMessage = "La citation ne peut pas dépasser les 300 caractère.")]
public string Content { get; set; }
public int Like { get; set; }
[Required]
[StringLength(2, ErrorMessage = "La langue ne peut pas dépasser 2 caractère.")]
public string Langue { get; set; }
public string Charac { get; set; }
public string ImgPath { get; set; }
public string TitleSrc { get; set; }
public DateTime DateSrc { get; set; }
public string UserProposition { get; set; }
public bool IsValid { get; set; }
}
}

@ -0,0 +1,11 @@
namespace WF_WebAdmin.Model
{
public class Source
{
public int id_source { get; set; }
public string title { get; set; }
public int date { get; set; }
}
}

@ -2,6 +2,7 @@
{
public class User
{
public int Id { get; set; }
public string Image { get; set; }
public string Name { get; set; }
public string Email { get; set; }

@ -1,11 +1,11 @@
@page "/Accueil"
@using WF_WebAdmin.Model
<PageTitle>Accueil</PageTitle>
<h2><strong>Bienvenu sur le tableau de bord de What the Fantasy</strong></h2>
<h2><strong>@Localizer["AccueilWelcome"]</strong></h2>
<h4>Citation du jour</h4>
<h4>@Localizer["AccueilTitle"]</h4>
@if (Dailyquote != null)
{
@ -15,8 +15,8 @@
<img class="imgProfil" src="@quote.ImgPath" />
<p class ="pseudo"> @quote.Content</p>
<p class="pseudo"><strong>Personnage :</strong> @quote.Charac</p>
<p class="pseudo"><strong>Source :</strong> @quote.TitleSrc</p>
<p class="pseudo"><strong>@Localizer["AccueilCharacter"]</strong> @quote.Charac</p>
<p class="pseudo"><strong>@Localizer["AccueilSrc"]</strong> @quote.TitleSrc</p>
</div>
}
@ -24,9 +24,9 @@
}
else
{
<p>Aucune citation du jour</p>
<p>@Localizer["AccueilNoQuote"]</p>
}
<h4>Changement de la citation manuellement</h4>
<button>Mettre une nouvellement citation aléatoire</button>
<h4>@Localizer["AccueilManualChange"]</h4>
<button>@Localizer["AccueilAddRandomQuote"]</button>

@ -1,5 +1,6 @@
using Blazorise.DataGrid;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Localization;
using WF_WebAdmin.Model;
@ -15,6 +16,8 @@ namespace WF_WebAdmin.Pages
[Inject]
public NavigationManager NavigationManager { get; set; }
[Inject]
public IStringLocalizer<Accueil> Localizer { get; set; }
protected override async Task OnInitializedAsync()
{
Dailyquote = await Http.GetFromJsonAsync<Quote[]>($"{NavigationManager.BaseUri}fake-dataDailyQuote.json");

@ -0,0 +1,58 @@
@using WF_WebAdmin.Model;
@page "/add"
<h3>@Localizer["TitleAddQuiz"]</h3>
<EditForm Model="@QuizModel" OnValidSubmit="@HandleValidSubmit">
<DataAnnotationsValidator />
<ValidationSummary />
<p>
<label for="display-quest">
@Localizer["TitleQuestion"]
<InputText id="display-quest" @bind-Value="QuizModel.Question" />
</label>
</p>
<p>
<label for="display-a">
@Localizer["AnswerA"]
<InputText id="display-a" @bind-Value="QuizModel.AnswerA" />
</label>
</p>
<p>
<label for="display-b">
@Localizer["AnswerB"]
<InputText id="display-b" @bind-Value="QuizModel.AnswerB" />
</label>
</p>
<p>
<label for="display-c">
@Localizer["AnswerC"]
<InputText id="display-c" @bind-Value="QuizModel.AnswerC" />
</label>
</p>
<p>
<label for="display-d">
@Localizer["AnswerD"]
<InputText id="display-d" @bind-Value="QuizModel.AnswerD" />
</label>
</p>
<p>
<label for="cA">
@Localizer["GoodAnser"]
<input name="cA" type="radio" @onchange="@(e => OnCAwnserChange("A", e.Value))" /> A
<input name="cA" type="radio" @onchange="@(e => OnCAwnserChange("B", e.Value))" /> B
<input name="cA" type="radio" @onchange="@(e => OnCAwnserChange("C", e.Value))" /> C
<input name="cA" type="radio" @onchange="@(e => OnCAwnserChange("D", e.Value))" /> D
</label>
</p>
<button type="submit">@Localizer["Submit"]</button>
</EditForm>

@ -0,0 +1,85 @@
using Microsoft.AspNetCore.Components;
using WF_WebAdmin.Service;
using WF_WebAdmin.Model;
using Microsoft.AspNetCore.Mvc;
using System.Text.RegularExpressions;
using Microsoft.Extensions.Localization;
namespace WF_WebAdmin.Pages
{
public partial class AddQuiz
{
[Inject]
public IStringLocalizer<AddQuiz> Localizer { get; set; }
[Inject]
private IQuizService quizService { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
private QuizModel QuizModel = new();
private async void HandleValidSubmit()
{
int id;
id = await quizService.getNbQuiz();
id++;
await quizService.addQuiz(new Quiz(
id,
validateInformation(QuizModel.Question),
validateInformation(QuizModel.AnswerA),
validateInformation(QuizModel.AnswerB),
validateInformation(QuizModel.AnswerC),
validateInformation(QuizModel.AnswerD),
validateReponse(QuizModel.CAnswer)
));
NavigationManager.NavigateTo("modifquiz");
}
private void OnCAwnserChange(string item, object checkedValue)
{
QuizModel.CAnswer = item;
}
private static string validateInformation(string item)
{
return item; // VALIDATION A FAIRE
}
private static string validateReponse(string item)
{
try
{
if (!string.IsNullOrEmpty(item))
{
switch (item)
{
case "A":
break;
case "B":
break;
case "C":
break;
case "D":
break;
default:
throw new InvalidDataException("Invalid item (validateReponse) : item must be A,B,C or D " + item + "give.");
}
}
else
{
throw new ArgumentNullException("Invalid item (validateReponse): null given.");
}
return item;
}
catch (Exception ex)
{
return "A"; //Default Argument
}
}
}
}

@ -1,36 +1,54 @@
@page "/deleteuser"
@using WF_WebAdmin.Model
<PageTitle>Gestion utilisateur</PageTitle>
<h3>Gestion des utilisateurs</h3>
<h3>@Localizer["TitleUser"]</h3>
@if(users == null)
{
<p><strong>Aucun utilisateur présent sur le site</strong></p>
<p><strong>@Localizer["UserNobody"]</strong></p>
}
else
{
<p>Utilisateurs présents:</p>
<DataGrid TItem="User"
Data="@users"
PageSize="@MaxValue"
ReadData="@OnReadData"
TotalItems="@totalItem"
ShowPager
Responsive>
<DataGridColumn TItem="User" Field="@nameof(User.Id)" Caption="Id" />
<DataGridColumn TItem="User" Field="@nameof(User.IsAdmin)" Caption="Admin" />
<DataGridColumn TItem="User" Field="@nameof(User.Name)" Caption="Nom" />
<DataGridColumn TItem="User" Field="@nameof(User.Email)" Caption="Email" />
<DataGridColumn TItem="User" Field="@nameof(User.DateCreation)" Caption="Date de création"/>
</DataGrid>
<p>@Localizer["UserHere"]</p>
@foreach (var user in users)
{
<div class="userDiv">
<div class="userDiv" id="@user.Id">
<img class="imgProfil" src="@user.Image" />
@if (user.IsAdmin)
{
<p class="pseudo"><strong>Nom d'utilisateur :</strong> @user.Name <strong>(Administrateur)</strong></p>
<p class="pseudo"><strong>@Localizer["UserName"]</strong> @user.Name <strong>(@Localizer["UserAdmin"])</strong></p>
}
else
{
<p class="pseudo"><strong>Nom d'utilisateur :</strong> @user.Name</p>
<p class="pseudo"><strong>@Localizer["UserName"]</strong> @user.Name</p>
}
<p class="mail"><strong>Email de l'utilisateur :</strong> @user.Email</p>
<p class="dateCrea"><strong>Date de création du compte :</strong> @user.DateCreation.ToShortDateString()</p>
<p class="mail"><strong>@Localizer["UserEmail"]</strong> @user.Email</p>
<p class="dateCrea"><strong>@Localizer["UserDate"]</strong> @user.DateCreation.ToShortDateString()</p>
@if(user.Comments != null)
{
<p class="titleComments"><strong>▶ Commentaire(s) posté(s) par @user.Name : </strong></p>
<p class="titleComments"><strong>▶ @Localizer["UserComment"] @user.Name : </strong></p>
@foreach (var comment in user.Comments)
{
<p class="comments">@comment.DateCreation.ToShortDateString() - @comment.Text</p>
@ -38,51 +56,63 @@ else
}
else
{
<p><i>Aucun commentaire sur le site</i></p>
<p><i>@Localizer["UserNoComment"]</i></p>
}
<button id="DeleteButton" @onclick="() => ShowConfirmation(user)">Supprimer l'utilisateur</button>
<button id="ModifyButton" @onclick="() => ShowModifyConfirmation(user)">Modifier l'utilisateur</button>
<button id="DeleteButton" @onclick="() => ShowConfirmation(user)">@Localizer["UserDelete"]</button>
@if (!user.IsAdmin)
{
<button id="AdminButton" @onclick="() => ShowConfirmationAdmin(user)">Ajouter en tant qu'administrateur</button>
<button id="AdminButton" @onclick="() => ShowConfirmationAdmin(user)">@Localizer["UserAddAdmin"]</button>
}
else
{
<button id="AdminButton" @onclick="() => ShowConfirmationAdmin(user)">Retirer en tant qu'administrateur</button>
<button id="AdminButton" @onclick="() => ShowConfirmationAdmin(user)">@Localizer["UserDeleteAdmin"]</button>
}
</div>
}
<!-- Fenêtre de confirmation de suppression -->
@if (showPopupDelete)
{
<div class="divPopup">
<div class="contentPopup">
<p>Êtes-vous sûr de vouloir supprimer cet utilisateur ?</p>
<button @onclick="() => RemoveUser()">Confirmer</button>
<p>@Localizer["UserPopupTitle"]</p>
<button @onclick="() => RemoveUser()">@Localizer["UserConfirmButton"]</button>
<button @onclick="ClosePopup">@Localizer["UserDeleteButton"]</button>
</div>
</div>
}
@if (showModifyPopup)
{
<div class="divPopup">
<div class="contentPopup">
<p>Modifier les informations de l'utilisateur :</p>
<label>Nom d'utilisateur:</label>
<input type="text" @bind="selectedUser.Name"/>
<label>Email:</label>
<input type="email" @bind="selectedUser.Email" />
<label>Image:</label>
<input type="text" @bind="selectedUser.Image" />
<button @onclick="ModifyUser">Sauvegarder</button>
<button @onclick="ClosePopup">Annuler</button>
</div>
</div>
}
}
<!-- Fenêtre de confirmation d'ajout admin-->
@if (showPopupAdmin)
{
<div class="divPopup">
<div class="contentPopup">
<p>Êtes-vous sûr de vouloir changer le rôle de cet utilisateur ?</p>
<button @onclick="() => Admin()">Confirmer</button>
<button @onclick="ClosePopup">Annuler</button>
<p>@Localizer["UserPopupTitle2"]</p>
<button @onclick="() => setAdmin()">@Localizer["UserConfirmButton"]</button>
<button @onclick="ClosePopup">@Localizer["UserDeleteButton"]</button>
</div>
</div>
}
}
@code {
}

@ -1,7 +1,11 @@
using Microsoft.AspNetCore.Components;
using Blazorise.DataGrid;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Configuration.UserSecrets;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Localization;
using System.Collections.Generic;
using WF_WebAdmin.Model;
using WF_WebAdmin.Service;
namespace WF_WebAdmin.Pages
{
@ -12,24 +16,55 @@ namespace WF_WebAdmin.Pages
private List<User> users;
private bool showPopupDelete = false;
private bool showDeletePopup = false;
private bool showModifyPopup = false;
private List<User> users;
private User userToDelete = null;
private User selectedUser;
private bool showPopupDelete = false;
private bool showPopupAdmin = false;
private User userToAdmin = null;
private int MaxValue = 5;
private int totalItem;
private int page = 1;
[Inject]
public HttpClient Http { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
[Inject]
private IUserService userService { get; set; }
[Inject]
public IStringLocalizer<DeleteUser> Localizer { get; set; }
protected override async Task OnInitializedAsync()
{
users = await Http.GetFromJsonAsync<List<User>>($"{NavigationManager.BaseUri}fake-dataUsers.json");
users = await userService.getSomeUser(MaxValue, 1);
}
private async Task OnReadData(DataGridReadDataEventArgs<User> e)
{
if (e.CancellationToken.IsCancellationRequested)
{
return;
}
var response = await userService.getSomeUser(e.PageSize, e.Page);
if (!e.CancellationToken.IsCancellationRequested)
{
totalItem = await userService.getNbUser();
users = new List<User>(response.ToArray());
page = e.Page;
}
}
// ------- Popup remove user -------
private void ShowConfirmation(User user)
@ -40,19 +75,34 @@ namespace WF_WebAdmin.Pages
showPopupDelete = true;
}
private void ShowModifyConfirmation(User user)
{
// Afficher la modale et mémoriser l'utilisateur à supprimer
selectedUser = user;
showModifyPopup = true;
}
private async Task RemoveUser()
{
if (userToDelete != null)
{
users.RemoveAll(u => u.Name == userToDelete.Name);
await userService.removeUser(userToDelete);
ClosePopup();
var response = await userService.getSomeUser(MaxValue, page);
users = new List<User>(response.ToArray());
}
}
private async Task ModifyUser()
{
await userService.updateUser(selectedUser);
ClosePopup();
}
private void ClosePopup()
{
showDeletePopup = false;
showModifyPopup = false;
showPopupDelete = false;
showPopupAdmin = false;
}
@ -67,20 +117,21 @@ namespace WF_WebAdmin.Pages
private async Task Admin()
private async Task setAdmin()
{
if (!userToAdmin.IsAdmin)
{
userToAdmin.IsAdmin = true;
await userService.updateUser(userToAdmin);
ClosePopup();
}
else
{
userToAdmin.IsAdmin = false;
await userService.updateUser(userToAdmin);
ClosePopup();
}
}
}
}

@ -0,0 +1,48 @@
@using WF_WebAdmin.Model
@page "/edit/{Id:int}"
<h3>Editer</h3>
<EditForm Model="@quoteModel" OnValidSubmit="@HandleValidSubmit">
<DataAnnotationsValidator />
<ValidationSummary />
<p>
<label for="display-cit">
Citation:
<InputText id="display-cit" @bind-Value="quoteModel.Content" />
</label>
</p>
<p>
<label for="lang">
Langue:
<input name="lang" type="radio" @onchange="@(e => OnlangChange("fr", e.Value))" /> fr
<input name="lang" type="radio" @onchange="@(e => OnlangChange("en", e.Value))" /> en
</label>
</p>
<p>
<label for="charac">
<InputSelect id="charac" @bind-Value="quoteModel.Charac">
@foreach (Character display in charac)
{
<option value="@display.caracter">@display.caracter (ID: @display.id_caracter)</option>
}
</InputSelect>
</label>
</p>
<p>
<label for="src">
<InputSelect id="src" @bind-Value="quoteModel.TitleSrc">
@foreach (Source display in src)
{
<option value="@display.title">@display.title (ID: @display.id_source)</option>
}
</InputSelect>
</label>
</p>
<button type="submit">Submit</button>
</EditForm>

@ -0,0 +1,65 @@
using Microsoft.AspNetCore.Components;
using WF_WebAdmin.Model;
using WF_WebAdmin.Service;
namespace WF_WebAdmin.Pages
{
public partial class Edit
{
[Parameter]
public int Id { get; set; }
[Inject]
private IQuoteService quoteService { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
private Quote q{ get; set; }
private QuoteModel quoteModel = new();
private List<Character> charac = new List<Character>();
private List<Source> src = new List<Source>();
protected override async Task OnInitializedAsync()
{
q = await quoteService.getOnequote(Id);
quoteModel.Content = q.Content;
quoteModel.Langue = q.Langue;
quoteModel.Charac = q.Charac;
quoteModel.TitleSrc = q.TitleSrc;
quoteModel.Id = q.Id;
quoteModel.Like = q.Like;
quoteModel.ImgPath = q.ImgPath;
quoteModel.DateSrc = q.DateSrc;
quoteModel.UserProposition = q.UserProposition;
quoteModel.IsValid = q.IsValid;
charac = await quoteService.getChar();
src = await quoteService.getSrc();
}
protected async void HandleValidSubmit()
{
q.Content = quoteModel.Content;
q.Langue = quoteModel.Langue;
q.TitleSrc = quoteModel.TitleSrc;
q.Charac = quoteModel.Charac;
await quoteService.updateQuote(q);
NavigationManager.NavigateTo("modifquote");
}
private void OnlangChange(string item, object checkedValue)
{
if(item == "fr" || item == "en")
{
quoteModel.Langue = item;
}
}
}
}

@ -1,22 +1,24 @@
@page "/"
@using WF_WebAdmin.Model
@using System.Globalization
<h1>▶ Connexion ◀</h1>
<h1>▶@Localizer["LoginTitle"]◀</h1>
<div class="login">
<EditForm Model="userLogin" OnValidSubmit="validlogin">
<DataAnnotationsValidator />
<ValidationSummary />
<label for="name"><strong>Identifiant *</strong></label>
<InputText @bind-Value="userLogin.Name" id="name" placeholder="Entrez votre pseudo" class="connexion" required />
<label for="name"><strong>@Localizer["LoginId"]*</strong></label>
<InputText @bind-Value="userLogin.Name" id="name" placeholder="@Localizer["LoginEnterPseudo"]" class="connexion" required />
<label for="mdp"><strong>Mot de passe*</strong></label>
<InputText @bind-Value="@userLogin.Mdp" type="password" placeholder="Entrez votre mot de passe" class="connexion" required />
<label for="mdp">
<strong>@Localizer["LoginPassWd"]*</strong></label>
<InputText @bind-Value="@userLogin.Mdp" type="password" placeholder="@Localizer["LoginEnterPassWd"]" class="connexion" required />
<div class="buttonSubmitDiv">
<button class="buttonSudmite"type="submit">Se Connecter</button>
<button class="buttonSudmite" type="submit">@Localizer["LoginConnexion"]</button>
</div>
<p class="ErrorMsg"><i>@ErrorConnexion</i></p>
</EditForm>

@ -1,5 +1,6 @@
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Configuration.UserSecrets;
using Microsoft.Extensions.Localization;
using WF_WebAdmin.Model;
@ -8,6 +9,8 @@ namespace WF_WebAdmin.Pages
{
public partial class Login
{
[Inject]
public IStringLocalizer<Login> Localizer { get; set; }
private UserLogin userLogin = new UserLogin();
@ -25,7 +28,7 @@ namespace WF_WebAdmin.Pages
protected override async Task OnInitializedAsync()
{
usersConnexion = await Http.GetFromJsonAsync<List<UserLogin>>($"{NavigationManager.BaseUri}fake-dataUsers.json");
usersConnexion = await Http.GetFromJsonAsync<List<UserLogin>>($"{NavigationManager.BaseUri}fake-dataUserLogin.json");
}

@ -0,0 +1,69 @@
@using WF_WebAdmin.Model
@page "/modifquiz"
<PageTitle>@Localizer["TitlePage"]</PageTitle>
<h3>@Localizer["TitlePage"]</h3>
<div>
<NavLink class="btn btn-primary" href="Add" Match="NavLinkMatch.All">
<i class="fa fa-plus"></i> @Localizer["Add"]
</NavLink>
</div>
<DataGrid TItem="Quiz"
Data="@quiz"
PageSize="@MaxValue"
ReadData="@OnReadData"
TotalItems="@totalItem"
ShowPager
Responsive>
<DataGridColumn TItem="Quiz" Field="@nameof(Quiz.Id)" Caption="@Localizer["Id"]" />
<DataGridColumn TItem="Quiz" Field="@nameof(Quiz.Question)" Caption="@Localizer["Question"]" />
<DataGridColumn TItem="Quiz" Field="@nameof(Quiz.AnswerA)" Caption="@Localizer["AnswerA"]" />
<DataGridColumn TItem="Quiz" Field="@nameof(Quiz.AnswerB)" Caption="@Localizer["AnswerB"]" />
<DataGridColumn TItem="Quiz" Field="@nameof(Quiz.AnswerC)" Caption="@Localizer["AnswerC"]" />
<DataGridColumn TItem="Quiz" Field="@nameof(Quiz.AnswerD)" Caption="@Localizer["AnswerD"]" />
<DataGridColumn TItem="Quiz" Field="@nameof(Quiz.CAnswer)" Caption="@Localizer["GoodAnswer"]" />
<DataGridColumn TItem="Quiz" Field="@nameof(Quiz.Id)" Caption="@Localizer["Action"]">
<DisplayTemplate>
<button type="button" class="btn btn-primary" @onclick="() => OnEditButtonClicked(context)"><i class="fa fa-edit"></i> @Localizer["Edit"]</button>
<button type="button" class="btn btn-primary" @onclick="() => OnDelete(context)"><i class="fa fa-trash"></i> @Localizer["Delete"]</button>
</DisplayTemplate>
</DataGridColumn>
</DataGrid>
@if (showEditQuiz && selectedQuiz != null)
{
<div class="divPopup">
<div class="contentPopup">
<p>@Localizer["ModifInfoUser"]</p>
<label>@Localizer["Question"]</label>
<input type="text" @bind="selectedQuiz.Question"/>
<label>@Localizer["AnswerA"]</label>
<input type="text" @bind="selectedQuiz.AnswerA" />
<label>@Localizer["AnswerB"]</label>
<input type="text" @bind="selectedQuiz.AnswerB" />
<label>@Localizer["AnswerC"]</label>
<input type="text" @bind="selectedQuiz.AnswerC" />
<label>@Localizer["AnswerD"]</label>
<input type="text" @bind="selectedQuiz.AnswerD" />
<label>@Localizer["GoodAnswer"]</label>
<input type="text" @bind="selectedQuiz.CAnswer" />
<button @onclick="EditQuiz">@Localizer["Save"] </button>
<button @onclick="ClosePopup">@Localizer["Delete"]</button>
</div>
</div>
}
@if (showPopupDelete)
{
<div class="divPopup">
<div class="contentPopup">
<p>@Localizer["PopupQuestion"]</p>
<button @onclick="RemoveQuote">@Localizer["Yes"]</button>
<button @onclick="ClosePopup">@Localizer["Cancel"]</button>
</div>
</div>
}

@ -0,0 +1,87 @@
using Blazorise.DataGrid;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Localization;
using WF_WebAdmin.Model;
using WF_WebAdmin.Service;
namespace WF_WebAdmin.Pages
{
public partial class ModifQuiz
{
private Quiz[] quiz;
private int MaxValue = 5;
private int totalItem;
private bool showEditQuiz = false;
private Quiz? selectedQuiz;
private bool showPopupDelete = false;
private int page = 1;
[Inject]
public IStringLocalizer<ModifQuiz> Localizer { get; set; }
[Inject]
public IQuizService QuizService { get; set; }
private async Task OnReadData(DataGridReadDataEventArgs<Quiz> e)
{
if (e.CancellationToken.IsCancellationRequested)
{
return;
}
var response = await QuizService.getSommeQuiz(e.PageSize, e.Page);
if (!e.CancellationToken.IsCancellationRequested)
{
totalItem = await QuizService.getNbQuiz();
quiz = response.ToArray();
page = e.Page;
}
}
private void OnEditButtonClicked(Quiz quiz)
{
if (quiz == null) return;
selectedQuiz = quiz;
showEditQuiz = true;
}
private void ClosePopup()
{
showEditQuiz = false;
showPopupDelete = false;
selectedQuiz = null;
}
private async Task EditQuiz()
{
await QuizService.updateQuiz(selectedQuiz);
selectedQuiz = null;
ClosePopup();
}
private void OnDelete(Quiz q)
{
selectedQuiz = q;
showPopupDelete = true;
}
private async void RemoveQuote()
{
if (selectedQuiz != null)
{
await QuizService.removeQuiz(selectedQuiz.Id);
selectedQuiz = null;
var response = await QuizService.getSommeQuiz(MaxValue, page);
quiz = response.ToArray();
}
showPopupDelete= false;
}
}
}

@ -1,24 +1,58 @@
@using WF_WebAdmin.Model
@page "/modifquote"
<PageTitle>Corection des citation</PageTitle>
<PageTitle>@Localizer["TitlePage"]</PageTitle>
<h3>Correction des citations</h3>
<h3>@Localizer["TitlePage"]</h3>
<p>Ajouter une recherche</p>
@if (quotes != null)
{
<DataGrid TItem="Quote"
<DataGrid TItem="Quote"
Data="@quotes"
PageSize="int.MaxValue"
PageSize="@MaxValue"
ReadData="@OnReadData"
TotalItems="@totalItem"
ShowPager
Responsive>
<DataGridColumn TItem="Quote" Field="@nameof(Quote.Id)" Caption="Id"/>
<DataGridColumn TItem="Quote" Field="@nameof(Quote.Content)" Caption="Citation"/>
<DataGridColumn TItem="Quote" Field="@nameof(Quote.Charac)" Caption="Personage"/>
<DataGridColumn TItem="Quote" Field="@nameof(Quote.TitleSrc)" Caption="Source" />
<DataGridColumn TItem="Quote" Field="@nameof(Quote.Langue)" Caption="Langue" />
<DataGridColumn TItem="Quote" Field="@nameof(Quote.DateSrc)" Caption="Date" DisplayFormat="{0:d}" DisplayFormatProvider="@System.Globalization.CultureInfo.GetCultureInfo("fr-FR")" />
</DataGrid>
<DataGridColumn TItem="Quote" Field="@nameof(Quote.Id)" Caption="@Localizer["Id"]" />
<DataGridColumn TItem="Quote" Field="@nameof(Quote.Content)" Caption="@Localizer["Quote"]" />
<DataGridColumn TItem="Quote" Field="@nameof(Quote.Charac)" Caption="@Localizer["Character"]" />
<DataGridColumn TItem="Quote" Field="@nameof(Quote.TitleSrc)" Caption="@Localizer["Source"]" />
<DataGridColumn TItem="Quote" Field="@nameof(Quote.Langue)" Caption="@Localizer["Language"]" />
<DataGridColumn TItem="Quote" Field="@nameof(Quote.DateSrc)" Caption="@Localizer["Date"]" DisplayFormat="{0:d}" DisplayFormatProvider="@System.Globalization.CultureInfo.GetCultureInfo("fr-FR")" />
<DataGridColumn TItem="Quote" Field="@nameof(Quote.Id)" Caption="@Localizer["Action"]">
<DisplayTemplate>
@* <button @onclick="() => OnEditButtonClicked(context) " style="background-color: lightgray; padding: 0">
<img alt="Bouton Modifier" src="edit.png" width="30" height="30"/>
</button> *@
<a href="Edit/@(context.Id)" class="btn btn-primary"><i class="fa fa-edit"></i> @Localizer["Edit"]</a>
<button type="button" class="btn btn-primary" @onclick="() => OnDelete(context)"><i class="fa fa-trash"></i> @Localizer["Delete"]</button>
</DisplayTemplate>
</DataGridColumn>
</DataGrid>
@* @if (showEditQuote && selectedQuote != null)
{
<div class="divPopup">
<div class="contentPopup">
<p>Modifier les informations de l'utilisateur :</p>
<label>Citation:</label>
<input type="text" @bind="selectedQuote.Content"/>
<label>Personnage:</label>
<input type="text" @bind="selectedQuote.Charac" />
<label>Source:</label>
<input type="text" @bind="selectedQuote.TitleSrc" />
<button @onclick="EditQuote">Sauvegarder </button>
<button @onclick="ClosePopup">Annuler</button>
</div>
</div> *@
@if (showPopupDelete)
{
<div class="divPopup">
<div class="contentPopup">
<p>@Localizer["PopupQuestion"]</p>
<button @onclick="RemoveQuote">@Localizer["Yes"]</button>
<button @onclick="ClosePopup">@Localizer["Cancel"]</button>
</div>
</div>
}

@ -1,5 +1,8 @@
using Blazorise.DataGrid;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Localization;
using WF_WebAdmin.Model;
using WF_WebAdmin.Service;
namespace WF_WebAdmin.Pages
{
@ -9,15 +12,76 @@ namespace WF_WebAdmin.Pages
private int MaxValue = 5;
private int totalItem;
/*private bool showEditQuote = false;*/
private Quote? selectedQuote;
private bool showPopupDelete = false;
private int page = 1;
[Inject]
public HttpClient Http { get; set; }
public IStringLocalizer<ModifQuote> Localizer { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
public IQuoteService QuoteService { get; set; }
private async Task OnReadData(DataGridReadDataEventArgs<Quote> e)
{
if (e.CancellationToken.IsCancellationRequested)
{
return;
}
var response = await QuoteService.getSomeQuote(e.PageSize, e.Page);
if (!e.CancellationToken.IsCancellationRequested)
{
totalItem = await QuoteService.getNbQuote();
quotes = response.ToArray();
page = e.Page;
}
}
/*private void OnEditButtonClicked(Quote quote)
{
if (selectedQuote == null) return;
selectedQuote = quote;
showEditQuote = true;
}*/
private void ClosePopup()
{
/*showEditQuote = false;*/
showPopupDelete = false;
selectedQuote = null;
}
/*private async Task EditQuote()
{
await QuoteService.updateQuote(selectedQuote);
selectedQuote = null;
ClosePopup();
}*/
private void OnDelete(Quote q)
{
selectedQuote = q;
showPopupDelete = true;
}
protected override async Task OnInitializedAsync()
private async void RemoveQuote()
{
//quotes = await Http.GetFromJsonAsync<Quote[]>($"{NavigationManager.BaseUri}fake-dataModifQuote.json");
if (selectedQuote != null)
{
await QuoteService.removeQuote(selectedQuote);
selectedQuote= null;
var response = await QuoteService.getSomeQuote(MaxValue, page);
quotes = response.ToArray();
}
showPopupDelete= false;
}
}
}

@ -2,28 +2,28 @@
@using System.Dynamic
@using WF_WebAdmin.Model
<h3> Quiz à valider </h3>
<h3>@Localizer["TitleQuiz"]</h3>
@if (quizzes == null)
{
<p> Chargement des quiz ... </p>
<p> @Localizer["LoadQuiz"] </p>
}
else
{
<p> Quizs en attente de validation : </p>
<p>@Localizer["QuizAwait"] </p>
<table>
<thead>
<tr>
<th>#</th>
<th>Question</th>
<th>Réponse A</th>
<th>Réponse B</th>
<th>Réponse C</th>
<th>Réponse D</th>
<th>Réponse Correcte</th>
<th>Utilisateur</th>
<th>Actions</th>
<th>@Localizer["Question"]</th>
<th>@Localizer["AnswerA"]</th>
<th>@Localizer["AnswerB"]</th>
<th>@Localizer["AnswerC"]</th>
<th>@Localizer["AnswerD"]</th>
<th>@Localizer["GoodAnswer"]</th>
<th>@Localizer["User"]</th>
<th>@Localizer["Action"]</th>
</tr>
</thead>
<tbody>

@ -1,13 +1,17 @@
using Blazorise.DataGrid;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Localization;
using WF_WebAdmin.Model;
using WF_WebAdmin.Service;
namespace WF_WebAdmin.Pages
{
public partial class ValidQuiz
{
private Quiz[] quizzes;
private int totalQuizzes;
private List<Quiz> quizzes;
[Inject]
public IStringLocalizer<ValidQuiz> Localizer { get; set; }
[Inject]
public HttpClient Http { get; set; }
@ -15,9 +19,12 @@ namespace WF_WebAdmin.Pages
[Inject]
public NavigationManager NavigationManager { get; set; }
[Inject]
public IQuizService QuizService { get; set; }
protected override async Task OnInitializedAsync()
{
quizzes = await Http.GetFromJsonAsync<Quiz[]>($"{NavigationManager.BaseUri}fake-dataQuiz.json");
quizzes = await QuizService.getQuizzesToValidate();
}
private void OnValidButton(Quiz quiz)
@ -28,6 +35,12 @@ namespace WF_WebAdmin.Pages
private void ValidateQuiz(Quiz quiz)
{
Console.WriteLine($"Quiz {quiz.Id} validated!");
Quiz newQuiz = quiz;
newQuiz.IsValid = true;
// Mis à jour de l'état du quiz
QuizService.updateQuiz(quiz);
}
private void OnRejectButton(Quiz quiz)
@ -38,6 +51,8 @@ namespace WF_WebAdmin.Pages
private void RejectQuiz(Quiz quiz)
{
Console.WriteLine($"Quiz {quiz.Id} rejected!");
QuizService.removeQuiz(quiz.Id);
}
}
}

@ -1,11 +1,11 @@
@page "/ValidQuote"
@using WF_WebAdmin.Model
<h3>Citations non validées</h3>
<h3>@Localizer["TitleValid"]</h3>
@if (quotes is null)
{
<p>Chargement des citations...</p>
<p>@Localizer["LoginQuote"]</p>
}
@* else if (quotes.Count == 0)
{
@ -13,20 +13,20 @@
} *@
else
{
<p>Citations en attente de validation :</p>
<p>@Localizer["QuoteValid"]</p>
@foreach (var quote in quotes)
{
<div class="QuoteDiv">
<p><strong>ID :</strong> @quote.Id</p>
<p><strong>Contenu :</strong> @quote.Content</p>
<p><strong>Langue :</strong> @quote.Langue</p>
<p><strong>@Localizer["Id"]</strong> @quote.Id</p>
<p><strong>@Localizer["Content"]</strong> @quote.Content</p>
<p><strong>@Localizer["Language"]</strong> @quote.Langue</p>
<p><strong>Personnage :</strong> @quote.Charac</p>
<p><strong>Image :</strong> @quote.ImgPath</p>
<p><strong>Source :</strong> @quote.TitleSrc</p>
<p><strong>Date de source :</strong> @quote.DateSrc.ToShortDateString()</p>
<p><strong>Utilisateur :</strong> @quote.UserProposition</p>
<p><strong>@Localizer["Character"]</strong> @quote.Charac</p>
<p><strong>@Localizer["Image"]</strong> @quote.ImgPath</p>
<p><strong>@Localizer["Source"]</strong> @quote.TitleSrc</p>
<p><strong>@Localizer["Date"]</strong> @quote.DateSrc.ToShortDateString()</p>
<p><strong>@Localizer["User"]</strong> @quote.UserProposition</p>
@* <button @onclick="() => ValiderQuote(quote.Id)">Valider</button>
<button @onclick="() => RejeterQuote(quote.Id)">Rejeter</button> *@

@ -6,6 +6,7 @@ using System.Collections.Generic;
using System;
using System.Threading.Tasks;
using System.Linq;
using Microsoft.Extensions.Localization;
namespace WF_WebAdmin.Pages
{
@ -13,6 +14,9 @@ namespace WF_WebAdmin.Pages
{
private Quote[] quotes;
[Inject]
public IStringLocalizer<ValidQuote> Localizer { get; set; }
[Inject]
public HttpClient Http { get; set; }

@ -3,20 +3,30 @@ using Blazorise.Bootstrap;
using Blazorise.Icons.FontAwesome;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Localization;
using System.Globalization;
using WF_WebAdmin.Data;
using WF_WebAdmin.Service;
using WF_WebAdmin.Model;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Options;
using Blazored.Modal;
using WF_WebAdmin.Service;
using Microsoft.Extensions.Logging;
[assembly: RootNamespace("WF_WebAdmin")]
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<WeatherForecastService>();
builder.Services.AddScoped<IQuoteService,QuoteServiceStub>();
builder.Services.AddScoped<IQuizService,QuizServiceStub>();
builder.Services.AddScoped<IUserService, UserServiceStub>();
builder.Services.AddHttpClient();
builder.Services.AddScoped<UserLogin>();
builder.WebHost.UseUrls("http://0.0.0.0:5000");
builder.Logging.AddConfiguration(builder.Configuration.GetSection("Logging"));
@ -26,6 +36,25 @@ builder.Services
.AddHttpClient()
.AddFontAwesomeIcons();
builder.Services.AddBlazoredModal();
// Add the controller of the app
builder.Services.AddControllers();
// Add the localization to the app and specify the resources path
builder.Services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; });
// Configure the localtization
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[] { "en-US", "fr-FR" };
options.DefaultRequestCulture = new RequestCulture(new CultureInfo("en-US"));
options.SupportedCultures = supportedCultures.Select(c=>new CultureInfo(c)).ToList();
options.SupportedUICultures = supportedCultures.Select(c => new CultureInfo(c)).ToList();
});
var app = builder.Build();
// Configure the HTTP request pipeline.
@ -42,6 +71,21 @@ app.UseStaticFiles();
app.UseRouting();
// Get the current localization options
var options = ((IApplicationBuilder)app).ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
if (options?.Value != null)
{
// use the default localization
app.UseRequestLocalization(options.Value);
}
// Add the controller to the endpoint
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

@ -0,0 +1,141 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="AccueilAddRandomQuote" xml:space="preserve">
<value>Put a New Random Quote</value>
</data>
<data name="AccueilCharacter" xml:space="preserve">
<value>Character:</value>
</data>
<data name="AccueilManualChange" xml:space="preserve">
<value>Changed Quote Manually</value>
</data>
<data name="AccueilNoQuote" xml:space="preserve">
<value>No Quote of the Day</value>
</data>
<data name="AccueilSrc" xml:space="preserve">
<value>Source:</value>
</data>
<data name="AccueilTitle" xml:space="preserve">
<value>Quote of the Day</value>
</data>
<data name="AccueilWelcome" xml:space="preserve">
<value>Welcome to the What the Fantasy Dashboard</value>
</data>
</root>

@ -0,0 +1,141 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="AccueilAddRandomQuote" xml:space="preserve">
<value>Mettre une nouvellement citation aléatoire</value>
</data>
<data name="AccueilCharacter" xml:space="preserve">
<value>Personnage :</value>
</data>
<data name="AccueilManualChange" xml:space="preserve">
<value>Changement de la citation manuellement</value>
</data>
<data name="AccueilNoQuote" xml:space="preserve">
<value>Aucune citation du jour</value>
</data>
<data name="AccueilSrc" xml:space="preserve">
<value>Source :</value>
</data>
<data name="AccueilTitle" xml:space="preserve">
<value>Citation du jour</value>
</data>
<data name="AccueilWelcome" xml:space="preserve">
<value>Bienvenu sur le tableau de bord de What the Fantasy</value>
</data>
</root>

@ -0,0 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="AnswerA" xml:space="preserve">
<value>Answer A:</value>
</data>
<data name="AnswerB" xml:space="preserve">
<value>Answer B:</value>
</data>
<data name="AnswerC" xml:space="preserve">
<value>Answer C:</value>
</data>
<data name="AnswerD" xml:space="preserve">
<value>Answer D:</value>
</data>
<data name="GoodAnswer" xml:space="preserve">
<value>Good answer:</value>
</data>
<data name="Submit" xml:space="preserve">
<value>Submit</value>
</data>
<data name="TitleAddQuiz" xml:space="preserve">
<value>Add a question</value>
</data>
<data name="TitleQuestion" xml:space="preserve">
<value>Question:</value>
</data>
</root>

@ -0,0 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="AnswerA" xml:space="preserve">
<value>Réponse A:</value>
</data>
<data name="AnswerB" xml:space="preserve">
<value>Réponse B:</value>
</data>
<data name="AnswerC" xml:space="preserve">
<value>Réponse C:</value>
</data>
<data name="AnswerD" xml:space="preserve">
<value>Réponse D:</value>
</data>
<data name="GoodAnswer" xml:space="preserve">
<value>Bonne réponse:</value>
</data>
<data name="Submit" xml:space="preserve">
<value>Valider</value>
</data>
<data name="TitleAddQuiz" xml:space="preserve">
<value>Ajouter une Question</value>
</data>
<data name="TitleQuestion" xml:space="preserve">
<value>Question:</value>
</data>
</root>

@ -0,0 +1,169 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="TitleUser" xml:space="preserve">
<value>User Management</value>
<comment>gestionaire user</comment>
</data>
<data name="UserAddAdmin" xml:space="preserve">
<value>Add as Admin</value>
</data>
<data name="UserAdmin" xml:space="preserve">
<value>Administrator</value>
</data>
<data name="UserComment" xml:space="preserve">
<value>Comment(s) Posted by</value>
</data>
<data name="UserConfirmButton" xml:space="preserve">
<value>Confirm</value>
</data>
<data name="UserDate" xml:space="preserve">
<value>Account Creation Date:</value>
</data>
<data name="UserDelete" xml:space="preserve">
<value>Delete User</value>
</data>
<data name="UserDeleteAdmin" xml:space="preserve">
<value>Remove as Admin</value>
</data>
<data name="UserDeleteButton" xml:space="preserve">
<value>Cancel</value>
</data>
<data name="UserEmail" xml:space="preserve">
<value>User Email:</value>
</data>
<data name="UserHere" xml:space="preserve">
<value>Users present:</value>
</data>
<data name="UserName" xml:space="preserve">
<value>Username</value>
</data>
<data name="UserNobody" xml:space="preserve">
<value>No users present on the site</value>
</data>
<data name="UserNoComment" xml:space="preserve">
<value>No comments on the site</value>
</data>
<data name="UserPopupTitle" xml:space="preserve">
<value>Are you sure you want to delete this user?</value>
</data>
<data name="UserPopupTitle2" xml:space="preserve">
<value>Are you sure you want to change this user's role?</value>
</data>
</root>

@ -0,0 +1,169 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="TitleUser" xml:space="preserve">
<value>Gestionnaire des utilisateurs</value>
<comment>gestion user</comment>
</data>
<data name="UserAddAdmin" xml:space="preserve">
<value>Ajouter en tant qu'administrateur</value>
</data>
<data name="UserAdmin" xml:space="preserve">
<value>Administrateur</value>
</data>
<data name="UserComment" xml:space="preserve">
<value>Commentaire(s) posté(s) par </value>
</data>
<data name="UserConfirmButton" xml:space="preserve">
<value>Confirmer</value>
</data>
<data name="UserDate" xml:space="preserve">
<value>Date de création du compte :</value>
</data>
<data name="UserDelete" xml:space="preserve">
<value>Supprimer l'utilisateur</value>
</data>
<data name="UserDeleteAdmin" xml:space="preserve">
<value>Retirer en tant qu'administrateur</value>
</data>
<data name="UserDeleteButton" xml:space="preserve">
<value>Annuler</value>
</data>
<data name="UserEmail" xml:space="preserve">
<value>Email de l'utilisateur :</value>
</data>
<data name="UserHere" xml:space="preserve">
<value>Utilisateurs présents:</value>
</data>
<data name="UserName" xml:space="preserve">
<value>Nom d'utilisateur :</value>
</data>
<data name="UserNobody" xml:space="preserve">
<value>Aucun utilisateur présent sur le site</value>
</data>
<data name="UserNoComment" xml:space="preserve">
<value>Aucun commentaire sur le site</value>
</data>
<data name="UserPopupTitle" xml:space="preserve">
<value>Êtes-vous sûr de vouloir supprimer cet utilisateur ?</value>
</data>
<data name="UserPopupTitle2" xml:space="preserve">
<value>Êtes-vous sûr de vouloir changer le rôle de cet utilisateur ?</value>
</data>
</root>

@ -0,0 +1,140 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="LoginConnexion" xml:space="preserve">
<value>Login</value>
</data>
<data name="LoginEnterPassWd" xml:space="preserve">
<value>Enter your password</value>
</data>
<data name="LoginEnterPseudo" xml:space="preserve">
<value>Enter your pseudo</value>
</data>
<data name="LoginId" xml:space="preserve">
<value>Pseudo</value>
<comment>id</comment>
</data>
<data name="LoginPassWd" xml:space="preserve">
<value>Password</value>
</data>
<data name="LoginTitle" xml:space="preserve">
<value>Login</value>
<comment>connexion</comment>
</data>
</root>

@ -0,0 +1,140 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="LoginConnexion" xml:space="preserve">
<value>Se Connecter</value>
</data>
<data name="LoginEnterPassWd" xml:space="preserve">
<value>Entrez votre mot de passe</value>
</data>
<data name="LoginEnterPseudo" xml:space="preserve">
<value>Entrez votre pseudo</value>
</data>
<data name="LoginId" xml:space="preserve">
<value>Identifiant</value>
<comment>id</comment>
</data>
<data name="LoginPassWd" xml:space="preserve">
<value>Mot de passe</value>
</data>
<data name="LoginTitle" xml:space="preserve">
<value>Connexion</value>
<comment>connexion</comment>
</data>
</root>

@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Action" xml:space="preserve">
<value>Action</value>
</data>
<data name="Add" xml:space="preserve">
<value>Add</value>
</data>
<data name="AnswerA" xml:space="preserve">
<value>Answer A</value>
</data>
<data name="AnswerB" xml:space="preserve">
<value>Answer B</value>
</data>
<data name="AnswerC" xml:space="preserve">
<value>Answer C</value>
</data>
<data name="AnswerD" xml:space="preserve">
<value>Answer D</value>
</data>
<data name="Cancel" xml:space="preserve">
<value>Cancel</value>
</data>
<data name="Delete" xml:space="preserve">
<value>Cancel</value>
</data>
<data name="Edit" xml:space="preserve">
<value>Edit</value>
</data>
<data name="GoodAnswer" xml:space="preserve">
<value>Good Answer</value>
</data>
<data name="Id" xml:space="preserve">
<value>ID</value>
</data>
<data name="ModifInfoUser" xml:space="preserve">
<value>Edit user information :</value>
</data>
<data name="PopupQuestion" xml:space="preserve">
<value>Are you sure you want to delete this quiz ?</value>
</data>
<data name="Question" xml:space="preserve">
<value>Question</value>
</data>
<data name="Save" xml:space="preserve">
<value>Save</value>
</data>
<data name="TitlePage" xml:space="preserve">
<value>Quiz Management</value>
</data>
<data name="Yes" xml:space="preserve">
<value>Confirm</value>
</data>
</root>

@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Action" xml:space="preserve">
<value>Action</value>
</data>
<data name="Add" xml:space="preserve">
<value>Ajouter</value>
</data>
<data name="AnswerA" xml:space="preserve">
<value>Réponse A</value>
</data>
<data name="AnswerB" xml:space="preserve">
<value>Réponse B</value>
</data>
<data name="AnswerC" xml:space="preserve">
<value>Réponse C</value>
</data>
<data name="AnswerD" xml:space="preserve">
<value>Réponse D</value>
</data>
<data name="Cancel" xml:space="preserve">
<value>Annuler</value>
</data>
<data name="Delete" xml:space="preserve">
<value>Supprimer</value>
</data>
<data name="Edit" xml:space="preserve">
<value>Editer</value>
</data>
<data name="GoodAnswer" xml:space="preserve">
<value>Bonne réponse</value>
</data>
<data name="Id" xml:space="preserve">
<value>ID</value>
</data>
<data name="ModifInfoUser" xml:space="preserve">
<value>Modifier les informations de l'utilisateur :</value>
</data>
<data name="PopupQuestion" xml:space="preserve">
<value>Êtes-vous sûr de vouloir supprimer ce quiz ?</value>
</data>
<data name="Question" xml:space="preserve">
<value>Question</value>
</data>
<data name="Save" xml:space="preserve">
<value>Sauvegarder</value>
</data>
<data name="TitlePage" xml:space="preserve">
<value>Gestion des quiz</value>
</data>
<data name="Yes" xml:space="preserve">
<value>Confirmer</value>
</data>
</root>

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Action" xml:space="preserve">
<value>Action</value>
</data>
<data name="Cancel" xml:space="preserve">
<value>Cancel</value>
</data>
<data name="Character" xml:space="preserve">
<value>Character</value>
</data>
<data name="Date" xml:space="preserve">
<value>Date</value>
</data>
<data name="Delete" xml:space="preserve">
<value>Delete</value>
</data>
<data name="Edit" xml:space="preserve">
<value>Edit</value>
</data>
<data name="Id" xml:space="preserve">
<value>Id</value>
</data>
<data name="Language" xml:space="preserve">
<value>Language</value>
</data>
<data name="PopupQuestion" xml:space="preserve">
<value>Are you sure you want to delete this quote ?</value>
</data>
<data name="Quote" xml:space="preserve">
<value>Quote</value>
</data>
<data name="Source" xml:space="preserve">
<value>Source</value>
</data>
<data name="TitlePage" xml:space="preserve">
<value>Corrections of quotes</value>
</data>
<data name="Yes" xml:space="preserve">
<value>Confirm</value>
</data>
</root>

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Action" xml:space="preserve">
<value>Action</value>
</data>
<data name="Cancel" xml:space="preserve">
<value>Annuler</value>
</data>
<data name="Character" xml:space="preserve">
<value>Personage</value>
</data>
<data name="Date" xml:space="preserve">
<value>Date</value>
</data>
<data name="Delete" xml:space="preserve">
<value>Supprimer</value>
</data>
<data name="Edit" xml:space="preserve">
<value>Editer</value>
</data>
<data name="Id" xml:space="preserve">
<value>Id</value>
</data>
<data name="Language" xml:space="preserve">
<value>Langue</value>
</data>
<data name="PopupQuestion" xml:space="preserve">
<value>Êtes-vous sûr de vouloir supprimer cette citation ?</value>
</data>
<data name="Quote" xml:space="preserve">
<value>Citation</value>
</data>
<data name="Source" xml:space="preserve">
<value>Source</value>
</data>
<data name="TitlePage" xml:space="preserve">
<value>Correction des citations</value>
</data>
<data name="Yes" xml:space="preserve">
<value>Confirmer</value>
</data>
</root>

@ -0,0 +1,153 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Action" xml:space="preserve">
<value>Actions</value>
</data>
<data name="AnswerA" xml:space="preserve">
<value>Answer A</value>
</data>
<data name="AnswerB" xml:space="preserve">
<value>Answer B</value>
</data>
<data name="AnswerC" xml:space="preserve">
<value>Answer C</value>
</data>
<data name="AnswerD" xml:space="preserve">
<value>Answer D</value>
</data>
<data name="GoodAnswer" xml:space="preserve">
<value>Correct answer</value>
</data>
<data name="LoadQuiz" xml:space="preserve">
<value>Loading quizzes</value>
</data>
<data name="Question" xml:space="preserve">
<value>Question</value>
</data>
<data name="QuizAwait" xml:space="preserve">
<value>Quiz awaiting validation</value>
</data>
<data name="TitleQuiz" xml:space="preserve">
<value>Quiz to validate</value>
</data>
<data name="User" xml:space="preserve">
<value>User</value>
</data>
</root>

@ -0,0 +1,153 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Action" xml:space="preserve">
<value>Actions</value>
</data>
<data name="AnswerA" xml:space="preserve">
<value>Réponse A </value>
</data>
<data name="AnswerB" xml:space="preserve">
<value>Réponse B</value>
</data>
<data name="AnswerC" xml:space="preserve">
<value>Réponse C</value>
</data>
<data name="AnswerD" xml:space="preserve">
<value>Réponse D</value>
</data>
<data name="GoodAnswer" xml:space="preserve">
<value>Réponse Correcte</value>
</data>
<data name="LoadQuiz" xml:space="preserve">
<value>Chargement des quiz ...</value>
</data>
<data name="Question" xml:space="preserve">
<value>Question</value>
</data>
<data name="QuizAwait" xml:space="preserve">
<value>Quizs en attente de validation :</value>
</data>
<data name="TitleQuiz" xml:space="preserve">
<value>Quiz à valider</value>
</data>
<data name="User" xml:space="preserve">
<value>Utilisateur</value>
</data>
</root>

@ -0,0 +1,153 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Character" xml:space="preserve">
<value>Character :</value>
</data>
<data name="Content" xml:space="preserve">
<value>Content :</value>
</data>
<data name="Date" xml:space="preserve">
<value>Source date</value>
</data>
<data name="Id" xml:space="preserve">
<value>ID :</value>
</data>
<data name="Image" xml:space="preserve">
<value>Image :</value>
</data>
<data name="Language" xml:space="preserve">
<value>Language :</value>
</data>
<data name="LoginQuote" xml:space="preserve">
<value>Loading quotes</value>
</data>
<data name="QuoteValid" xml:space="preserve">
<value>Quotes awaiting validation</value>
</data>
<data name="Source" xml:space="preserve">
<value>Source :</value>
</data>
<data name="TitleValid" xml:space="preserve">
<value>Unvalidated quotes</value>
</data>
<data name="User" xml:space="preserve">
<value>User :</value>
</data>
</root>

@ -0,0 +1,153 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Character" xml:space="preserve">
<value>Personnage :</value>
</data>
<data name="Content" xml:space="preserve">
<value>Contenu :</value>
</data>
<data name="Date" xml:space="preserve">
<value>Date de la source :</value>
</data>
<data name="Id" xml:space="preserve">
<value>ID :</value>
</data>
<data name="Image" xml:space="preserve">
<value>Image :</value>
</data>
<data name="Language" xml:space="preserve">
<value>Langue :</value>
</data>
<data name="LoginQuote" xml:space="preserve">
<value>Chargement des citations...</value>
</data>
<data name="QuoteValid" xml:space="preserve">
<value>Citations en attente de validation :</value>
</data>
<data name="Source" xml:space="preserve">
<value>Source :</value>
</data>
<data name="TitleValid" xml:space="preserve">
<value>Citations non validées</value>
</data>
<data name="User" xml:space="preserve">
<value>Utilisateur :</value>
</data>
</root>

@ -0,0 +1,26 @@
using WF_WebAdmin.Model;
namespace WF_WebAdmin.Service
{
public interface IQuizService
{
public Task addQuiz(Quiz quiz);
public Task updateQuiz(Quiz quiz);
public Task removeQuiz(int id);
public Task validateQuiz(int id);
public Task<List<Quiz>> getQuizzes();
public Task<List<Quiz>> getQuizzesToValidate();
public Task<Quiz> getQuiz(int id);
public Task<List<Quiz>> getSommeQuiz(int nb, int page);
public Task<int> getNbQuiz();
}
}

@ -16,12 +16,18 @@ namespace WF_WebAdmin.Service
public Task<List<Quote>> getSomeQuote(int nb, int page);
public Task<List<Quote>> getOnequote(int id);
public Task<Quote> getOnequote(int id);
public Task<List<Quote>> reserchQuote(string reserch, List<string> argument);
public Task<List<Quote>> getAllQuoteInvalid();
public Task<List<Quote>> getSomeQuoteInvalid(int nb, int page);
public Task<int> getNbQuote();
public Task<List<Character>> getChar();
public Task<List<Source>> getSrc();
}
}

@ -4,18 +4,22 @@ namespace WF_WebAdmin.Service
{
public interface IUserService
{
public void removeUser(User user);
public Task removeUser(User user);
public void updateRole(User user);
public Task updateRole(User user);
public void downgradeRole(User user);
public Task downgradeRole(User user);
public List<User> getAllUser();
public Task updateUser(User user);
public List<User> getSomeUser(int nb, int page);
public Task<List<User>> getAllUser();
public User getOneUser(int id);
public Task<List<User>> getSomeUser(int nb, int page);
public List<User> reserchUsers(string reserch, List<string> args);
public Task<User> getOneUser(int id);
public Task<List<User>> reserchUsers(string reserch, List<string> args);
public Task<int> getNbUser();
}
}

@ -1,25 +0,0 @@
using WF_WebAdmin.Model;
namespace WF_WebAdmin.Service;
public class QuizService
{
public List<Quiz> GetQuizToConfirm()
{
var res = new List<Quiz>();
return res;
}
public bool AddQuiz(Quiz quiz)
{
var res = false;
return res;
}
public bool RemoveQuiz(Quiz quiz)
{
var res = false;
return res;
}
}

@ -0,0 +1,106 @@
using System.Text.Json;
using WF_WebAdmin.Model;
namespace WF_WebAdmin.Service;
public class QuizServiceStub: IQuizService
{
private readonly string _jsonFilePath = Path.Combine(Environment.CurrentDirectory, "wwwroot", "fake_data_quiz.json");
public async Task saveQuizJson(List<Quiz> quizzes)
{
var json = JsonSerializer.Serialize(quizzes, new JsonSerializerOptions { WriteIndented = true });
await File.WriteAllTextAsync(_jsonFilePath, json);
}
public async Task addQuiz(Quiz quiz)
{
var data = await getQuizzes();
quiz.Id = data.Count > 0 ? data.Max(p => p.Id) + 1 : 1;
data.Add(quiz);
await saveQuizJson(data);
}
public async Task updateQuiz(Quiz quiz)
{
var data = await getQuizzes();
var existingQuiz = data.FirstOrDefault(q => q.Id == quiz.Id);
if (existingQuiz != null)
{
existingQuiz.Question = quiz.Question;
existingQuiz.AnswerA = quiz.AnswerA;
existingQuiz.AnswerB = quiz.AnswerB;
existingQuiz.AnswerC = quiz.AnswerC;
existingQuiz.AnswerD = quiz.AnswerD;
existingQuiz.CAnswer = quiz.CAnswer;
existingQuiz.IsValid = quiz.IsValid;
existingQuiz.UserProposition = quiz.UserProposition;
await saveQuizJson(data);
}
}
public async Task removeQuiz(int id)
{
var data = await getQuizzes();
var quiz = data.FirstOrDefault(q => q.Id == id);
if (quiz != null)
{
data.Remove(quiz);
await saveQuizJson(data);
}
}
public Task validateQuiz(int id)
{
throw new NotImplementedException();
}
public async Task<List<Quiz>> getQuizzes()
{
if (!File.Exists(_jsonFilePath))
{
Console.Out.WriteLine($"{_jsonFilePath} not found");
return new List<Quiz>();
}
var json = await File.ReadAllTextAsync(_jsonFilePath);
return JsonSerializer.Deserialize<List<Quiz>>(json) ?? new List<Quiz>();
}
public async Task<List<Quiz>> getQuizzesToValidate()
{
var quizzes = await getQuizzes();
return quizzes.Where(quiz => quiz.IsValid == false).ToList();
}
public async Task<Quiz> getQuiz(int id)
{
var data = await getQuizzes();
var q = data.FirstOrDefault(p => p.Id == id);
if (q != null)
{
return q;
}
return null;
}
public async Task<List<Quiz>> getSommeQuiz(int nb, int page)
{
var data = await getQuizzes();
if ((page - 1) * nb + nb > data.Count())
{
if(nb > data.Count())
{
return data.GetRange(0, data.Count()-1);
}
return data.GetRange(data.Count() - nb, nb);
}
return data.GetRange((page - 1) * nb, nb);
}
public async Task<int> getNbQuiz()
{
var data = await getQuizzes();
return data.Count;
}
}

@ -113,22 +113,37 @@ namespace WF_WebAdmin.Service
throw new NotImplementedException();
}
public Task<List<Quote>> getOnequote(int id)
public Task<List<Quote>> reserchQuote(string reserch, List<string> argument)
{
throw new NotImplementedException();
}
public Task<List<Quote>> reserchQuote(string reserch, List<string> argument)
public Task<List<Quote>> getAllQuoteInvalid()
{
throw new NotImplementedException();
}
public Task<List<Quote>> getAllQuoteInvalid()
public Task<List<Quote>> getSomeQuoteInvalid(int nb, int page)
{
throw new NotImplementedException();
}
public Task<List<Quote>> getSomeQuoteInvalid(int nb, int page)
public Task<Quote> getOnequote(int id)
{
throw new NotImplementedException();
}
public Task<int> getNbQuote()
{
throw new NotImplementedException();
}
public Task<List<Character>> getChar()
{
throw new NotImplementedException();
}
public Task<List<Source>> getSrc()
{
throw new NotImplementedException();
}

@ -1,69 +1,151 @@
using Microsoft.AspNetCore.Components;
using System.Text.Json;
using WF_WebAdmin.Model;
using static System.Net.WebRequestMethods;
namespace WF_WebAdmin.Service
{
namespace WF_WebAdmin.Service;
public class QuoteServiceStub : IQuoteService
{
[Inject]
public HttpClient Http { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
private readonly string _jsonFilePath = Path.Combine(Environment.CurrentDirectory, "wwwroot", "fake-dataQuote.json");
private readonly string _char = Path.Combine(Environment.CurrentDirectory, "wwwroot", "fake-dataCaracter.json");
private readonly string _src = Path.Combine(Environment.CurrentDirectory, "wwwroot", "fake-dataSource.json");
public async Task saveQuoteJson(List<Quote> quotes)
{
var json = JsonSerializer.Serialize(quotes, new JsonSerializerOptions { WriteIndented = true });
await File.WriteAllTextAsync(_jsonFilePath, json);
}
public async Task addQuote(Quote quote)
{
var data = await getAllQuote();
quote.Id = data.Count > 0 ? data.Max(p => p.Id) + 1 : 1;
data.Add(quote);
await saveQuoteJson(data);
}
public async Task removeQuote(Quote quote)
{
var data = await getAllQuote();
var q = data.FirstOrDefault(p => p.Id == quote.Id);
if (q != null)
{
data.Remove(q);
await saveQuoteJson(data);
}
}
public Task addQuote(Quote quote)
public async Task validQuote(Quote quote)
{
throw new NotImplementedException();
}
public Task<List<Quote>> getAllQuote()
public async Task updateQuote(Quote quote)
{
throw new NotImplementedException();
var data = await getAllQuote();
var q = data.FirstOrDefault(p => p.Id == quote.Id);
if (q != null)
{
q.Content = quote.Content;
q.Charac = quote.Charac;
q.ImgPath = quote.ImgPath;
q.TitleSrc = quote.TitleSrc;
q.DateSrc = quote.DateSrc;
q.Langue = quote.Langue;
await saveQuoteJson(data);
}
}
public Task<List<Quote>> getAllQuoteInvalid()
public async Task<List<Quote>> getAllQuote()
{
throw new NotImplementedException();
if (!File.Exists(_jsonFilePath))
{
Console.Out.WriteLine($"{_jsonFilePath} not found");
return new List<Quote>();
}
var json = await File.ReadAllTextAsync(_jsonFilePath);
return JsonSerializer.Deserialize<List<Quote>>(json) ?? new List<Quote>();
}
public Task<List<Quote>> getOnequote(int id)
public async Task<List<Quote>> getSomeQuote(int nb, int page)
{
throw new NotImplementedException();
var quotes = await getAllQuote();
if((page - 1) * nb + nb > quotes.Count())
{
if (nb > quotes.Count())
{
return quotes.GetRange(0, quotes.Count());
}
return quotes.GetRange(quotes.Count()-nb, nb);
}
return quotes.GetRange((page - 1) * nb, nb);
}
public Task<List<Quote>> getSomeQuote(int nb, int page)
public async Task<Quote> getOnequote(int id)
{
throw new NotImplementedException();
var data = await getAllQuote();
var q = data.FirstOrDefault(p => p.Id == id);
if (q != null)
{
return q;
}
return null;
}
public Task<List<Quote>> getSomeQuoteInvalid(int nb, int page)
public async Task<List<Quote>> reserchQuote(string reserch, List<string> argument)
{
throw new NotImplementedException();
}
public Task removeQuote(Quote quote)
public async Task<List<Quote>> getAllQuoteInvalid()
{
throw new NotImplementedException();
var quotes = await getAllQuote();
quotes = quotes.Where(q => q.IsValid == false).ToList();
return quotes;
}
public Task<List<Quote>> reserchQuote(string reserch, List<string> argument)
public async Task<List<Quote>> getSomeQuoteInvalid(int nb, int page)
{
throw new NotImplementedException();
var quotes = await getAllQuoteInvalid();
if ((page - 1) * nb + nb > quotes.Count())
{
if (nb > quotes.Count())
{
return quotes.GetRange(0, quotes.Count());
}
return quotes.GetRange(quotes.Count() - nb, nb);
}
return quotes.GetRange((page - 1) * nb, nb);
}
public Task updateQuote(Quote quote)
public async Task<int> getNbQuote()
{
throw new NotImplementedException();
var data = await getAllQuote();
return data.Count;
}
public Task validQuote(Quote quote)
public async Task<List<Character>> getChar()
{
throw new NotImplementedException();
if (!File.Exists(_char))
{
Console.Out.WriteLine($"{_char} not found");
return new List<Character>();
}
var json = await File.ReadAllTextAsync(_char);
return JsonSerializer.Deserialize<List<Character>>(json) ?? new List<Character>();
}
public async Task<List<Source>> getSrc()
{
if (!File.Exists(_src))
{
Console.Out.WriteLine($"{_src} not found");
return new List<Source>();
}
var json = await File.ReadAllTextAsync(_src);
return JsonSerializer.Deserialize<List<Source>>(json) ?? new List<Source>();
}
}
}

@ -0,0 +1,97 @@
using System.Text.Json;
using WF_WebAdmin.Model;
namespace WF_WebAdmin.Service;
public class UserServiceStub : IUserService
{
private readonly string _jsonFilePath = Path.Combine(Environment.CurrentDirectory, "wwwroot", "fake_data_users.json");
public async Task saveUsersJson(List<User> users)
{
var json = JsonSerializer.Serialize(users, new JsonSerializerOptions { WriteIndented = true });
await File.WriteAllTextAsync(_jsonFilePath, json);
}
public async Task removeUser(User user)
{
var data = await getAllUser();
var u = data.FirstOrDefault(p => p.Id == user.Id);
if (u != null)
{
data.Remove(u);
await saveUsersJson(data);
}
}
public Task updateRole(User user)
{
user.IsAdmin = true;
return updateUser(user);
}
public Task downgradeRole(User user)
{
user.IsAdmin = false;
return updateUser(user);
}
public async Task<List<User>> getAllUser()
{
if (!File.Exists(_jsonFilePath))
{
Console.Out.WriteLine($"{_jsonFilePath} not found");
return new List<User>();
}
var json = await File.ReadAllTextAsync(_jsonFilePath);
return JsonSerializer.Deserialize<List<User>>(json) ?? new List<User>();
}
public async Task<List<User>> getSomeUser(int nb, int page)
{
var users = await getAllUser();
if ((page - 1) * nb + nb > users.Count())
{
return users.GetRange(users.Count() - nb, nb);
}
return users.GetRange((page - 1) * nb, nb);
}
public async Task<User> getOneUser(int id)
{
var data = await getAllUser();
var u = data.FirstOrDefault(p => p.Id == id);
if (u != null)
{
return u;
}
return null;
}
public Task<List<User>> reserchUsers(string reserch, List<string> args)
{
throw new NotImplementedException();
}
public async Task<int> getNbUser()
{
var data = await getAllUser();
return data.Count;
}
public async Task updateUser(User user)
{
var data = await getAllUser();
var person = data.FirstOrDefault(p => p.Id == user.Id);
if (person != null)
{
person.Name = user.Name;
person.Email = user.Email;
person.Image = user.Image;
person.IsAdmin = user.IsAdmin;
await saveUsersJson(data);
}
}
}

@ -0,0 +1,43 @@
@using System.Globalization
@inject NavigationManager NavigationManager
<p>
<label>
Select your locale:
<select @bind="Culture">
@foreach (var culture in supportedCultures)
{
<option value="@culture">@culture.DisplayName</option>
}
</select>
</label>
</p>
@code
{
private CultureInfo[] supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("fr-FR")
};
private CultureInfo Culture
{
get => CultureInfo.CurrentCulture;
set
{
if (CultureInfo.CurrentUICulture == value)
{
return;
}
var culture = value.Name.ToLower(CultureInfo.InvariantCulture);
var uri = new Uri(this.NavigationManager.Uri).GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped);
var query = $"?culture={Uri.EscapeDataString(culture)}&" + $"redirectUri={Uri.EscapeDataString(uri)}";
// Redirect the user to the culture controller to set the cookie
this.NavigationManager.NavigateTo("/Culture/SetCulture" + query, forceLoad: true);
}
}
}

@ -15,6 +15,9 @@
<main>
<div class="top-row px-4">
<div class="px-4">
<CultureSelector />
</div>
@if (!string.IsNullOrEmpty(uLogin.Name))
{
<button class="buttonProfil" type="button"> <img class="imageProfil" src="@uLogin.Image" height="90" width="480" /></button>

@ -39,7 +39,13 @@
<div class="nav-item px-3">
<NavLink class="nav-link" href="modifquote">
<span class="oi oi-list-rich" aria-hidden="true"></span> Correction des citations
<span class="oi oi-list-rich" aria-hidden="true"></span> Gestion des citations
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="modifquiz">
<span class="oi oi-list-rich" aria-hidden="true"></span> Gestion des Question
</NavLink>
</div>

@ -8,11 +8,15 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Blazored.Modal" Version="7.2.0" />
<PackageReference Include="Blazorise.Bootstrap" Version="1.7.2" />
<PackageReference Include="Blazorise.DataGrid" Version="1.7.2" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.7.2" />
<PackageReference Include="bootstrap" Version="5.3.3" />
<PackageReference Include="Microsoft.Extensions.Localization" Version="9.0.1" />
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="9.0.1" />
<PackageReference Include="Npgsql" Version="9.0.2" />
<PackageReference Include="Blazored.Modal" Version="7.2.0" />
</ItemGroup>
</Project>

@ -9,4 +9,5 @@
@using WF_WebAdmin
@using WF_WebAdmin.Shared
@using Blazorise.DataGrid
@using Blazored.Modal

@ -83,8 +83,18 @@ button {
background-color: #C3C4C5;
}
.imgProfil, .imgQuote {
.imgProfil {
border-radius: 25px;
width: 150px; /* Taille standard */
height: 150px; /* Taille standard */
object-fit: cover;
}
.imgQuote {
border-radius: 20px;
width: 300px; /* Taille standard */
height: 300px; /* Taille standard */
object-fit: cover;
}
.pseudo, .mail, .idUser, .dateCrea, .idQuote, .contentQuote, .CaracterQuote, .SourceQuote, .langueQuote, .UserPropositionQuote {
@ -106,7 +116,7 @@ button {
left: 0;
width: 100%;
height: 100%;
background-color: white border-radius:20px;
border-radius:20px;
display: flex;
justify-content: center;
align-items: center;
@ -114,10 +124,11 @@ button {
}
.contentPopup {
background-color: white;
padding: 20px;
border-radius: 20px;
border: 3px solid black;
display: flex;
background-color: white;
flex-direction: column;
gap: 10px;
width: 300px;

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

@ -1,282 +0,0 @@
[
{
"id": 1,
"question": "Voluptate nulla laborum pariatur excepteur consequat officia ea esse ut nisi amet non.",
"answerA": "sit ullamco",
"answerB": "deserunt reprehenderit",
"answerC": "cupidatat deserunt",
"answerD": "ullamco aliqua",
"cAnswer": "B",
"userProposition": "Lori Myers"
},
{
"id": 2,
"question": "Ea elit esse minim aute aliquip cillum amet cupidatat fugiat exercitation.",
"answerA": "ullamco excepteur",
"answerB": "aliquip occaecat",
"answerC": "incididunt duis",
"answerD": "sunt dolor",
"cAnswer": "A",
"userProposition": "Louella Robinson"
},
{
"id": 3,
"question": "Aute commodo est proident sunt nulla est cillum eiusmod est voluptate dolore sit aliqua incididunt.",
"answerA": "reprehenderit mollit",
"answerB": "laboris consectetur",
"answerC": "cillum deserunt",
"answerD": "deserunt fugiat",
"cAnswer": "B",
"userProposition": "Richmond Joyner"
},
{
"id": 4,
"question": "Fugiat duis excepteur non amet tempor deserunt ut occaecat cupidatat eiusmod et amet enim.",
"answerA": "amet aute",
"answerB": "excepteur ad",
"answerC": "laboris veniam",
"answerD": "veniam in",
"cAnswer": "B",
"userProposition": "Brady Patrick"
},
{
"id": 5,
"question": "Occaecat minim velit dolor est ad ut irure eu labore velit in dolore exercitation.",
"answerA": "eu aliqua",
"answerB": "labore ipsum",
"answerC": "labore reprehenderit",
"answerD": "anim excepteur",
"cAnswer": "C",
"userProposition": "Mavis Boone"
},
{
"id": 6,
"question": "Non laboris adipisicing anim fugiat labore excepteur tempor elit in.",
"answerA": "in excepteur",
"answerB": "nostrud dolor",
"answerC": "nisi aliqua",
"answerD": "sint nisi",
"cAnswer": "C",
"userProposition": "Douglas Dejesus"
},
{
"id": 7,
"question": "Lorem proident exercitation elit fugiat do amet aute labore consectetur pariatur consequat.",
"answerA": "eiusmod nulla",
"answerB": "eu id",
"answerC": "proident tempor",
"answerD": "amet proident",
"cAnswer": "A",
"userProposition": "Mia Peterson"
},
{
"id": 8,
"question": "Incididunt magna commodo laborum do incididunt commodo proident non cillum magna elit irure voluptate.",
"answerA": "laborum fugiat",
"answerB": "laboris est",
"answerC": "in ea",
"answerD": "duis ullamco",
"cAnswer": "A",
"userProposition": "Juliet Fox"
},
{
"id": 9,
"question": "Qui labore fugiat sint Lorem ut minim in ex dolor.",
"answerA": "et deserunt",
"answerB": "labore sit",
"answerC": "in eiusmod",
"answerD": "amet incididunt",
"cAnswer": "C",
"userProposition": "Earnestine Poole"
},
{
"id": 10,
"question": "Voluptate pariatur ipsum magna sint Lorem adipisicing.",
"answerA": "sint velit",
"answerB": "non culpa",
"answerC": "nisi ut",
"answerD": "excepteur labore",
"cAnswer": "B",
"userProposition": "Alexis Cross"
},
{
"id": 11,
"question": "In labore sunt est cupidatat cillum.",
"answerA": "ut ad",
"answerB": "non deserunt",
"answerC": "do officia",
"answerD": "ut nostrud",
"cAnswer": "C",
"userProposition": "Brooks Martinez"
},
{
"id": 12,
"question": "Irure occaecat sit laborum nulla ea dolore et aliqua sunt Lorem enim esse.",
"answerA": "excepteur occaecat",
"answerB": "pariatur in",
"answerC": "reprehenderit excepteur",
"answerD": "laborum adipisicing",
"cAnswer": "D",
"userProposition": "Shields Roth"
},
{
"id": 13,
"question": "Laboris sint in sit exercitation nisi id cillum ex ea culpa fugiat in cupidatat.",
"answerA": "labore mollit",
"answerB": "in veniam",
"answerC": "labore eiusmod",
"answerD": "consequat veniam",
"cAnswer": "B",
"userProposition": "Carmella Chase"
},
{
"id": 14,
"question": "Proident dolor Lorem anim proident laborum sint minim sit laborum aliquip.",
"answerA": "velit exercitation",
"answerB": "voluptate esse",
"answerC": "occaecat cupidatat",
"answerD": "enim adipisicing",
"cAnswer": "D",
"userProposition": "Johns Solomon"
},
{
"id": 15,
"question": "Do magna dolore enim laborum consequat reprehenderit nisi consequat nostrud.",
"answerA": "proident do",
"answerB": "labore minim",
"answerC": "in elit",
"answerD": "in irure",
"cAnswer": "A",
"userProposition": "Alana Moore"
},
{
"id": 16,
"question": "Culpa anim id elit dolore veniam.",
"answerA": "ipsum nisi",
"answerB": "officia voluptate",
"answerC": "in excepteur",
"answerD": "ullamco non",
"cAnswer": "B",
"userProposition": "Russo Rios"
},
{
"id": 17,
"question": "Ea est consectetur exercitation aute ut mollit pariatur irure aute adipisicing dolore.",
"answerA": "fugiat elit",
"answerB": "pariatur nulla",
"answerC": "exercitation ipsum",
"answerD": "exercitation laboris",
"cAnswer": "A",
"userProposition": "Bobbi Lara"
},
{
"id": 18,
"question": "Laborum consectetur incididunt ad fugiat fugiat proident culpa mollit laborum.",
"answerA": "elit duis",
"answerB": "amet aute",
"answerC": "culpa nostrud",
"answerD": "do pariatur",
"cAnswer": "D",
"userProposition": "Lewis Mullins"
},
{
"id": 19,
"question": "Culpa anim aliquip mollit non labore.",
"answerA": "labore incididunt",
"answerB": "laborum non",
"answerC": "sunt laborum",
"answerD": "est sunt",
"cAnswer": "B",
"userProposition": "Mccray Mccoy"
},
{
"id": 20,
"question": "Ex exercitation deserunt aute cillum dolor.",
"answerA": "proident magna",
"answerB": "pariatur exercitation",
"answerC": "ipsum veniam",
"answerD": "culpa quis",
"cAnswer": "C",
"userProposition": "Moss Jefferson"
},
{
"id": 21,
"question": "Do mollit aute dolore anim id non aliqua.",
"answerA": "ipsum aute",
"answerB": "irure ex",
"answerC": "ex duis",
"answerD": "ipsum cupidatat",
"cAnswer": "B",
"userProposition": "Roth Valdez"
},
{
"id": 22,
"question": "Commodo sunt reprehenderit tempor sit ut ea Lorem esse minim elit et sunt sint qui.",
"answerA": "et do",
"answerB": "officia culpa",
"answerC": "et commodo",
"answerD": "irure tempor",
"cAnswer": "D",
"userProposition": "Adrienne Carpenter"
},
{
"id": 23,
"question": "Excepteur cupidatat ut sit commodo magna elit.",
"answerA": "pariatur tempor",
"answerB": "proident non",
"answerC": "velit elit",
"answerD": "pariatur fugiat",
"cAnswer": "D",
"userProposition": "Mcknight Cain"
},
{
"id": 24,
"question": "Laborum eu nisi consequat voluptate in laboris cillum in aute sint excepteur aliqua Lorem in.",
"answerA": "pariatur in",
"answerB": "voluptate qui",
"answerC": "et cillum",
"answerD": "adipisicing id",
"cAnswer": "D",
"userProposition": "Gay Barlow"
},
{
"id": 25,
"question": "Laborum ullamco occaecat excepteur deserunt nostrud dolor.",
"answerA": "magna labore",
"answerB": "ullamco veniam",
"answerC": "reprehenderit irure",
"answerD": "magna dolore",
"cAnswer": "B",
"userProposition": "Hannah Battle"
},
{
"id": 26,
"question": "Commodo in amet laboris Lorem et qui anim ea ullamco dolor dolor commodo.",
"answerA": "amet nulla",
"answerB": "laborum mollit",
"answerC": "amet in",
"answerD": "irure amet",
"cAnswer": "D",
"userProposition": "Dawson Mcpherson"
},
{
"id": 27,
"question": "Veniam non consectetur sit cillum.",
"answerA": "aliqua cupidatat",
"answerB": "nostrud culpa",
"answerC": "anim ullamco",
"answerD": "adipisicing et",
"cAnswer": "A",
"userProposition": "Reeves Love"
},
{
"id": 28,
"question": "Ullamco laboris voluptate nostrud commodo Lorem enim ad ipsum.",
"answerA": "id aute",
"answerB": "aliquip incididunt",
"answerC": "duis elit",
"answerD": "mollit ad",
"cAnswer": "B",
"userProposition": "Michael Holmes"
}
]

@ -1,112 +1,194 @@
[
{
"id_quote": "1",
"content": "Dans le monde il ny a pas dun côté le bien et le mal, il y a une part de lumière et dombre en chacun de nous. Ce qui compte cest celle que lon choisit de montrer dans nos actes, ça cest ce que lon est vraiment.",
"likes": 0,
"langue": "fr",
"isValide": true,
"reason": "insertion de test",
"id_caracter": 50,
"id_source": 38,
"id_user_verif": 1
"Id": 1,
"Content": "Que la force soit avec toi.",
"Like": 150,
"Langue": "en",
"Charac": "Drago Malefoy",
"ImgPath": "http://starwars.com",
"TitleSrc": "L\u00E0-haut",
"DateSrc": "2025-01-21T00:00:00",
"UserProposition": "user1",
"IsValid": false
},
{
"id_quote": "22",
"content": "Nous avons parié, mon père et moi. Je ne crois pas que tu tiendras dix minutes dans ce tournoi. Lui, il nest pas daccord, il croit que tu nen tiendras pas cinq.",
"likes": 0,
"langue": "fr",
"isValide": true,
"reason": "insertion de test",
"id_caracter": 7,
"id_source": 58,
"id_user_verif": 1
"Id": 2,
"Content": "Il n\u2019y a pas de place comme chez soi.",
"Like": 120,
"Langue": "fr",
"Charac": "test",
"ImgPath": "http://wizardofoz.com",
"TitleSrc": "Le Magicien d\u0027Oz",
"DateSrc": "2025-01-21T00:00:00",
"UserProposition": "user2",
"IsValid": false
},
{
"id_quote": "45",
"content": "Je vous aurais suivi mon frère, mon capitaine, mon roi.",
"likes": 0,
"langue": "fr",
"isValide": true,
"reason": "insertion de test",
"id_caracter": 77,
"id_source": 76,
"id_user_verif": 1
"Id": 3,
"Content": "C\u0027est le choix qui fait l\u0027homme, non le destin.",
"Like": 90,
"Langue": "fr",
"Charac": "test",
"ImgPath": "http://harrypotter.com",
"TitleSrc": "Harry Potter et la Chambre des Secrets",
"DateSrc": "2025-01-21T00:00:00",
"UserProposition": "user3",
"IsValid": false
},
{
"id_quote": "90",
"content": "Si vous le voulez bien, on se taillera des pipes plus tard, les enfants.",
"likes": 0,
"langue": "fr",
"isValide": true,
"reason": "insertion de test",
"id_caracter": 82,
"id_source": 9,
"id_user_verif": 1
"Id": 4,
"Content": "La magie, c\u2019est de croire en soi, c\u2019est \u00E7a la magie.",
"Like": 75,
"Langue": "fr",
"Charac": "test",
"ImgPath": "http://disney.com",
"TitleSrc": "La Belle et la B\u00EAte",
"DateSrc": "2025-01-21T00:00:00",
"UserProposition": "user4",
"IsValid": false
},
{
"id_quote": "91",
"content": "Je fais le mort dans la 5e.",
"likes": 0,
"langue": "fr",
"isValide": true,
"reason": "insertion de test",
"id_caracter": 53,
"id_source": 9,
"id_user_verif": 1
"Id": 5,
"Content": "La v\u00E9rit\u00E9 est plus \u00E9trange que la fiction.",
"Like": 65,
"Langue": "fr",
"Charac": "test",
"ImgPath": "http://theimaginarium.com",
"TitleSrc": "L\u0027Imaginarium du Docteur Parnassus",
"DateSrc": "2025-01-21T00:00:00",
"UserProposition": "user5",
"IsValid": false
},
{
"id_quote": "110",
"content": "Il les a tuées avec leur amour. Cest comme ça tous les jours dans le monde entier.",
"likes": 0,
"langue": "fr",
"isValide": true,
"reason": "insertion de test",
"id_caracter": 34,
"id_source": 74,
"id_user_verif": 1
"Id": 6,
"Content": "Un homme qui ne croit pas aux miracles n\u2019est pas un homme.",
"Like": 85,
"Langue": "fr",
"Charac": "test",
"ImgPath": "http://theprinceofpersia.com",
"TitleSrc": "Prince of Persia : Les Sables du Temps",
"DateSrc": "2025-01-21T00:00:00",
"UserProposition": "user6",
"IsValid": false
},
{
"id_quote": "118",
"content": "La vengeance est un déesse dévorante. Eux aussi en sont victimes… Je ne dois pas céder à son appel. La justice finira par triompher.",
"likes": 0,
"langue": "fr",
"isValide": false,
"reason": "insertion de test",
"id_caracter": 44,
"id_source": 30,
"id_user_verif": 1
"Id": 7,
"Content": "La seule limite \u00E0 notre r\u00E9alisation de demain sera nos doutes et h\u00E9sitations d\u2019aujourd\u2019hui.",
"Like": 100,
"Langue": "fr",
"Charac": "test",
"ImgPath": "http://backtothefuture.com",
"TitleSrc": "Retour vers le futur",
"DateSrc": "2025-01-21T00:00:00",
"UserProposition": "user7",
"IsValid": false
},
{
"id_quote": "185",
"content": "Tu viens de me montrer au complet ?!",
"likes": 0,
"langue": "fr",
"isValide": false,
"reason": "insertion de test",
"id_caracter": 38,
"id_source": 10,
"id_user_verif": 1
"Id": 8,
"Content": "L\u2019imagination est plus importante que la connaissance.",
"Like": 200,
"Langue": "fr",
"Charac": "test",
"ImgPath": "http://inceptionmovie.com",
"TitleSrc": "Inception",
"DateSrc": "2025-01-21T00:00:00",
"UserProposition": "user8",
"IsValid": false
},
{
"id_quote": "182",
"content": "Nouille ou pas nouille, tu te préoccupes trop de ce qui a été ou de ce qui sera.",
"likes": 0,
"langue": "fr",
"isValide": false,
"reason": "insertion de test",
"id_caracter": 29,
"id_source": 71,
"id_user_verif": 1
"Id": 9,
"Content": "Ce n\u2019est pas de la magie, c\u2019est de la science, mais on ne comprend pas encore tout.",
"Like": 110,
"Langue": "fr",
"Charac": "test",
"ImgPath": "http://doctorstrange.com",
"TitleSrc": "Doctor Strange",
"DateSrc": "2025-01-21T00:00:00",
"UserProposition": "user9",
"IsValid": false
},
{
"id_quote": "175",
"content": "Arrête de faire ton Jean-Jacques !",
"likes": 0,
"langue": "fr",
"isValide": false,
"reason": "insertion de test",
"id_caracter": 39,
"id_source": 68,
"id_user_verif": 1
"Id": 10,
"Content": "L\u2019important ce n\u2019est pas d\u2019\u00EAtre parfait, c\u2019est d\u2019\u00EAtre vrai.",
"Like": 130,
"Langue": "fr",
"Charac": "test",
"ImgPath": "http://narnia.com",
"TitleSrc": "Le Monde de Narnia",
"DateSrc": "2025-01-21T00:00:00",
"UserProposition": "user10",
"IsValid": false
},
{
"Id": 11,
"Content": "Vous ne pouvez pas vivre sans causer de dommages \u00E0 quelqu\u0027un d\u0027autre.",
"Like": 110,
"Langue": "fr",
"Charac": "test",
"ImgPath": "http://thematrix.com",
"TitleSrc": "The Matrix",
"DateSrc": "2025-01-21T00:00:00",
"UserProposition": "user11",
"IsValid": false
},
{
"Id": 12,
"Content": "Les r\u00EAves, ils ne peuvent pas vous mentir.",
"Like": 80,
"Langue": "fr",
"Charac": "test",
"ImgPath": "http://peterpanmovie.com",
"TitleSrc": "Peter Pan",
"DateSrc": "2025-01-21T00:00:00",
"UserProposition": "user12",
"IsValid": false
},
{
"Id": 14,
"Content": "La vie, c\u2019est ce qui nous arrive quand on est occup\u00E9 \u00E0 faire d\u2019autres projets.",
"Like": 140,
"Langue": "fr",
"Charac": "test",
"ImgPath": "http://forrestgump.com",
"TitleSrc": "Forrest Gump",
"DateSrc": "2025-01-21T00:00:00",
"UserProposition": "user14",
"IsValid": false
},
{
"Id": 15,
"Content": "Il faut toujours croire en l\u2019impossible, sinon la magie dispara\u00EEt.",
"Like": 60,
"Langue": "fr",
"Charac": "test",
"ImgPath": "http://harrypotter.com",
"TitleSrc": "Harry Potter \u00E0 l\u0027\u00E9cole des sorciers",
"DateSrc": "2025-01-21T00:00:00",
"UserProposition": "user15",
"IsValid": false
},
{
"Id": 16,
"Content": "Le pouvoir de l\u2019imaginaire est plus fort que tout.",
"Like": 120,
"Langue": "fr",
"Charac": "test",
"ImgPath": "http://theincrediblesmovie.com",
"TitleSrc": "Les Indestructibles",
"DateSrc": "2025-01-21T00:00:00",
"UserProposition": "user16",
"IsValid": false
},
{
"Id": 17,
"Content": "On peut conqu\u00E9rir l\u2019univers en une journ\u00E9e si on travaille ensemble.",
"Like": 130,
"Langue": "fr",
"Charac": "test",
"ImgPath": "http://guardiansofthegalaxy.com",
"TitleSrc": "Les Gardiens de la Galaxie",
"DateSrc": "2025-01-21T00:00:00",
"UserProposition": "user17",
"IsValid": false
}
]

@ -0,0 +1,9 @@
[
{
"Id": 4,
"Image": "https://tse2.mm.bing.net/th/id/OIP.3vXkEUJ9J8s-GsnBC6I3KAHaF0?w=185\u0026h=180\u0026c=7\u0026r=0\u0026o=5\u0026pid=1.7",
"Name": "jesus",
"Email": "jesus@allah.coran",
"DateCreation": "2024-10-10T00:00:00"
}
]

@ -2,9 +2,9 @@
{
"Id": 1,
"Image": "https://tse4.mm.bing.net/th/id/OIP.fc5TQflh0cbxB1GUeOdk6gHaK8?w=123&h=180&c=7&r=0&o=5&pid=1.7",
"Name": "Admin",
"Name": "admin",
"IsAdmin": true,
"Mdp" : "passwd"
"Mdp" : "admin"
},
{
"Id": 2,

@ -1,166 +0,0 @@
[
{
"Id": 1,
"Image": "https://tse4.mm.bing.net/th/id/OIP.fc5TQflh0cbxB1GUeOdk6gHaK8?w=123&h=180&c=7&r=0&o=5&pid=1.7",
"Name": "admin",
"Email": "admin@gmail.com",
"DateCreation": "2024-12-12",
"IsAdmin": true,
"Comments": [
{
"Text": "Commentaire 1",
"DateCreation": "2024-12-12"
},
{
"Text": "Commentaire 2",
"DateCreation": "2024-11-12"
}
],
"Mdp": "admin"
},
{
"Id": 2,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137&h=195&c=7&r=0&o=5&pid=1.7",
"Name": "exploit",
"Email": "exploit@gmail.com",
"DateCreation": "2024-11-12",
"IsAdmin": true,
"Mdp": "exploit"
},
{
"Id": 3,
"Image": "https://tse4.mm.bing.net/th/id/OIP.XNQPKwc1OUfvnSO9MsxDYgHaE7?w=202&h=180&c=7&r=0&o=5&pid=1.7",
"Name": "testeur",
"Email": "testeur@gmail.com",
"DateCreation": "2024-08-02",
"IsAdmin": false,
"Comments": [
{
"Text": "Premier test effectué, tout semble OK.",
"DateCreation": "2024-08-02"
}
]
},
{
"Id": 4,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137&h=195&c=7&r=0&o=5&pid=1.7",
"Name": "dev",
"Email": "dev@gmail.com",
"DateCreation": "2024-10-10",
"IsAdmin": false
},
{
"Id": 5,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137&h=195&c=7&r=0&o=5&pid=1.7",
"Name": "jean_doe",
"Email": "jean.doe@gmail.com",
"DateCreation": "2024-06-25",
"IsAdmin": false,
"Comments": [
{
"Text": "Utilisateur très actif, peut être un peu trop intrusif.",
"DateCreation": "2024-06-25"
}
]
},
{
"Id": 6,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137&h=195&c=7&r=0&o=5&pid=1.7",
"Name": "jane_smith",
"Email": "jane.smith@gmail.com",
"DateCreation": "2024-07-15",
"IsAdmin": false
},
{
"Id": 7,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137&h=195&c=7&r=0&o=5&pid=1.7",
"Name": "admin_joe",
"Email": "admin.joe@gmail.com",
"DateCreation": "2024-05-30",
"IsAdmin": true
},
{
"Id": 8,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137&h=195&c=7&r=0&o=5&pid=1.7",
"Name": "dev_anna",
"Email": "dev.anna@gmail.com",
"DateCreation": "2024-09-05",
"IsAdmin": false
},
{
"Id": 9,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137&h=195&c=7&r=0&o=5&pid=1.7",
"Name": "support_mark",
"Email": "support.mark@gmail.com",
"DateCreation": "2024-11-20",
"IsAdmin": false,
"Comments": [
{
"Text": "Support rapide et efficace, mais manquant un peu de détails.",
"DateCreation": "2024-11-20"
}
]
},
{
"Id": 10,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137&h=195&c=7&r=0&o=5&pid=1.7",
"Name": "dev_susan",
"Email": "dev.susan@gmail.com",
"DateCreation": "2024-08-12",
"IsAdmin": false
},
{
"Id": 11,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137&h=195&c=7&r=0&o=5&pid=1.7",
"Name": "designer_steve",
"Email": "designer.steve@gmail.com",
"DateCreation": "2024-07-01",
"IsAdmin": false,
"Comments": [
{
"Text": "Le design doit être retravaillé pour plus de clarté.",
"DateCreation": "2024-07-01"
}
]
},
{
"Id": 12,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137&h=195&c=7&r=0&o=5&pid=1.7",
"Name": "admin_lucas",
"Email": "admin.lucas@gmail.com",
"DateCreation": "2024-09-22",
"IsAdmin": true
},
{
"Id": 13,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137&h=195&c=7&r=0&o=5&pid=1.7",
"Name": "manager_anna",
"Email": "manager.anna@gmail.com",
"DateCreation": "2024-05-01",
"IsAdmin": false
},
{
"Id": 14,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137&h=195&c=7&r=0&o=5&pid=1.7",
"Name": "developer_mike",
"Email": "developer.mike@gmail.com",
"DateCreation": "2024-11-02",
"IsAdmin": false
},
{
"Id": 15,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137&h=195&c=7&r=0&o=5&pid=1.7",
"Name": "test_user_01",
"Email": "test.user01@gmail.com",
"DateCreation": "2024-06-10",
"IsAdmin": false
},
{
"Id": 16,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137&h=195&c=7&r=0&o=5&pid=1.7",
"Name": "admin_kate",
"Email": "admin.kate@gmail.com",
"DateCreation": "2024-04-16",
"IsAdmin": true
}
]

@ -0,0 +1,68 @@
[
{
"Id": 10,
"Question": "Voluptate pariatur ipsum magna sint Lorem adipisicing.",
"AnswerA": "sint velit",
"AnswerB": "non culpa",
"AnswerC": "nisi ut",
"AnswerD": "excepteur labore",
"CAnswer": "B",
"IsValid": false,
"UserProposition": "Alexis Cross"
},
{
"Id": 11,
"Question": "nv question",
"AnswerA": "repA",
"AnswerB": "non deserunt",
"AnswerC": "do officia",
"AnswerD": "ut nostrud",
"CAnswer": "C",
"IsValid": false,
"UserProposition": "Brooks Martinez"
},
{
"Id": 12,
"Question": "Irure occaecat sit laborum nul ea dolore et aliqua sunt Lorem enim esse.",
"AnswerA": "excepteur occaecat",
"AnswerB": "pariatur in",
"AnswerC": "reprehenderit excepteur",
"AnswerD": "laborum adipisicing",
"CAnswer": "D",
"IsValid": false,
"UserProposition": "Shields Roth"
},
{
"Id": 13,
"Question": "test",
"AnswerA": "a",
"AnswerB": "b",
"AnswerC": "c",
"AnswerD": "d",
"CAnswer": "D",
"IsValid": true,
"UserProposition": "Admin"
},
{
"Id": 14,
"Question": "bonjour",
"AnswerA": "ca",
"AnswerB": "va",
"AnswerC": "marcher",
"AnswerD": "!",
"CAnswer": "A",
"IsValid": true,
"UserProposition": "Admin"
},
{
"Id": 15,
"Question": "test",
"AnswerA": "a",
"AnswerB": "b",
"AnswerC": "c",
"AnswerD": "d",
"CAnswer": "C",
"IsValid": true,
"UserProposition": "Admin"
}
]

@ -0,0 +1,107 @@
[
{
"Id": 3,
"Image": "https://tse4.mm.bing.net/th/id/OIP.XNQPKwc1OUfvnSO9MsxDYgHaE7?w=202\u0026h=180\u0026c=7\u0026r=0\u0026o=5\u0026pid=1.7",
"Name": "testeur",
"Email": "testeur@gmail.com",
"DateCreation": "2024-08-02T00:00:00",
"IsAdmin": true,
"Comments": [
{
"Text": "Premier test effectu\u00E9, tout semble OK.",
"DateCreation": "2024-08-02T00:00:00"
}
]
},
{
"Id": 4,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137\u0026h=195\u0026c=7\u0026r=0\u0026o=5\u0026pid=1.7",
"Name": "dev",
"Email": "dev@gmail.com",
"DateCreation": "2024-10-10T00:00:00",
"IsAdmin": false,
"Comments": null
},
{
"Id": 5,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137\u0026h=195\u0026c=7\u0026r=0\u0026o=5\u0026pid=1.7",
"Name": "jean_doe",
"Email": "jean.doe@gmail.com",
"DateCreation": "2024-06-25T00:00:00",
"IsAdmin": false,
"Comments": [
{
"Text": "Utilisateur tr\u00E8s actif, peut \u00EAtre un peu trop intrusif.",
"DateCreation": "2024-06-25T00:00:00"
}
]
},
{
"Id": 6,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137\u0026h=195\u0026c=7\u0026r=0\u0026o=5\u0026pid=1.7",
"Name": "jane_smith",
"Email": "jane.smith@gmail.com",
"DateCreation": "2024-07-15T00:00:00",
"IsAdmin": false,
"Comments": null
},
{
"Id": 7,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137\u0026h=195\u0026c=7\u0026r=0\u0026o=5\u0026pid=1.7",
"Name": "test_n1",
"Email": "admin.joe@gmail.com",
"DateCreation": "2024-05-30T00:00:00",
"IsAdmin": false,
"Comments": null
},
{
"Id": 8,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137\u0026h=195\u0026c=7\u0026r=0\u0026o=5\u0026pid=1.7",
"Name": "dev_anna",
"Email": "dev.anna@gmail.com",
"DateCreation": "2024-09-05T00:00:00",
"IsAdmin": false,
"Comments": null
},
{
"Id": 9,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137\u0026h=195\u0026c=7\u0026r=0\u0026o=5\u0026pid=1.7",
"Name": "support_mark",
"Email": "support.mark@gmail.com",
"DateCreation": "2024-11-20T00:00:00",
"IsAdmin": false,
"Comments": [
{
"Text": "Support rapide et efficace, mais manquant un peu de d\u00E9tails.",
"DateCreation": "2024-11-20T00:00:00"
}
]
},
{
"Id": 10,
"Image": "https://th.bing.com/th/id/OIP.24T00MDK-RUhFnm1Do5PFwHaFj?w=229\u0026h=180\u0026c=7\u0026r=0\u0026o=5\u0026pid=1.7",
"Name": "dev_susan",
"Email": "dev.susan@gmail.com",
"DateCreation": "2024-08-12T00:00:00",
"IsAdmin": false,
"Comments": null
},
{
"Id": 12,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137\u0026h=195\u0026c=7\u0026r=0\u0026o=5\u0026pid=1.7",
"Name": "admin_lucas",
"Email": "admin.lucas@gmail.com",
"DateCreation": "2024-09-22T00:00:00",
"IsAdmin": false,
"Comments": null
},
{
"Id": 14,
"Image": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137\u0026h=195\u0026c=7\u0026r=0\u0026o=5\u0026pid=1.7",
"Name": "developer_mike",
"Email": "developer.mike@gmail.com",
"DateCreation": "2024-11-02T00:00:00",
"IsAdmin": false,
"Comments": null
}
]
Loading…
Cancel
Save