Merge pull request 'LanguageApp' (#20) from LanguageApp into dev

Reviewed-on: #20
pull/22/head^2
Louis DUFOUR 11 months ago
commit bbdb62a4ed

Binary file not shown.

@ -7,12 +7,15 @@
objects = {
/* Begin PBXBuildFile section */
16820AB62C09C06A00C7F360 /* ItemCollectionParty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16820AB52C09C06A00C7F360 /* ItemCollectionParty.swift */; };
16820AB92C09C81500C7F360 /* PartyEnregistery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16820AB82C09C81500C7F360 /* PartyEnregistery.swift */; };
16820ABB2C09C85000C7F360 /* Stub.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16820ABA2C09C85000C7F360 /* Stub.swift */; };
168CD4FB2C0625A400419510 /* fr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 168CD4F92C0625A400419510 /* fr.lproj */; };
168CD4FC2C0625A400419510 /* en.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 168CD4FA2C0625A400419510 /* en.lproj */; };
168CD4FF2C06265B00419510 /* LanguageSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168CD4FE2C06265B00419510 /* LanguageSettings.swift */; };
82CE59E92C045D1100ADEE24 /* GameScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82CE59E82C045D1100ADEE24 /* GameScene.swift */; };
82CE59EB2C045E3800ADEE24 /* GameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82CE59EA2C045E3800ADEE24 /* GameView.swift */; };
82CE59EF2C0460E500ADEE24 /* SpriteMoople.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82CE59EE2C0460E500ADEE24 /* SpriteMoople.swift */; };
82F9D3312BFE3A9F009EDFAF /* HistoryGameDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82F9D3302BFE3A9F009EDFAF /* HistoryGameDetail.swift */; };
82F9D3332BFE3B12009EDFAF /* HistoryHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82F9D3322BFE3B12009EDFAF /* HistoryHeader.swift */; };
82F9D3362BFE3B3C009EDFAF /* HistoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82F9D3352BFE3B3C009EDFAF /* HistoryView.swift */; };
C20310D62BFCB5FB0031657D /* PickerComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20310D52BFCB5FB0031657D /* PickerComponent.swift */; };
C20310D82BFCC2410031657D /* GeneralParametersMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20310D72BFCC2410031657D /* GeneralParametersMenuView.swift */; };
C20310DA2BFCC8600031657D /* ToggleComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20310D92BFCC8600031657D /* ToggleComponent.swift */; };
@ -51,12 +54,15 @@
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
16820AB52C09C06A00C7F360 /* ItemCollectionParty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemCollectionParty.swift; sourceTree = "<group>"; };
16820AB82C09C81500C7F360 /* PartyEnregistery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartyEnregistery.swift; sourceTree = "<group>"; };
16820ABA2C09C85000C7F360 /* Stub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Stub.swift; sourceTree = "<group>"; };
168CD4F92C0625A400419510 /* fr.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = fr.lproj; sourceTree = "<group>"; };
168CD4FA2C0625A400419510 /* en.lproj */ = {isa = PBXFileReference; lastKnownFileType = folder; path = en.lproj; sourceTree = "<group>"; };
168CD4FE2C06265B00419510 /* LanguageSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LanguageSettings.swift; sourceTree = "<group>"; };
82CE59E82C045D1100ADEE24 /* GameScene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameScene.swift; sourceTree = "<group>"; };
82CE59EA2C045E3800ADEE24 /* GameView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameView.swift; sourceTree = "<group>"; };
82CE59EE2C0460E500ADEE24 /* SpriteMoople.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpriteMoople.swift; sourceTree = "<group>"; };
82F9D3302BFE3A9F009EDFAF /* HistoryGameDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryGameDetail.swift; sourceTree = "<group>"; };
82F9D3322BFE3B12009EDFAF /* HistoryHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryHeader.swift; sourceTree = "<group>"; };
82F9D3352BFE3B3C009EDFAF /* HistoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryView.swift; sourceTree = "<group>"; };
C20310D52BFCB5FB0031657D /* PickerComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PickerComponent.swift; sourceTree = "<group>"; };
C20310D72BFCC2410031657D /* GeneralParametersMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralParametersMenuView.swift; sourceTree = "<group>"; };
C20310D92BFCC8600031657D /* ToggleComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToggleComponent.swift; sourceTree = "<group>"; };
@ -105,13 +111,12 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
16820AB72C09C7B700C7F360 /* PartyEnregistery */ = {
168CD4FD2C06264300419510 /* Utils */ = {
isa = PBXGroup;
children = (
16820ABA2C09C85000C7F360 /* Stub.swift */,
16820AB82C09C81500C7F360 /* PartyEnregistery.swift */,
168CD4FE2C06265B00419510 /* LanguageSettings.swift */,
);
path = PartyEnregistery;
path = Utils;
sourceTree = "<group>";
};
8203E9052BF60117005F5C4A /* Frameworks */ = {
@ -139,9 +144,21 @@
path = SKNodes;
sourceTree = "<group>";
};
82F9D32F2BFE3A75009EDFAF /* History */ = {
isa = PBXGroup;
children = (
82F9D3302BFE3A9F009EDFAF /* HistoryGameDetail.swift */,
82F9D3322BFE3B12009EDFAF /* HistoryHeader.swift */,
82F9D3352BFE3B3C009EDFAF /* HistoryView.swift */,
);
path = History;
sourceTree = "<group>";
};
C205A2AA2BF373360097BD93 = {
isa = PBXGroup;
children = (
168CD4FA2C0625A400419510 /* en.lproj */,
168CD4F92C0625A400419510 /* fr.lproj */,
C205A2B52BF373360097BD93 /* ArkitDoushiQi */,
C205A2C62BF373380097BD93 /* ArkitDoushiQiTests */,
C205A2D02BF373380097BD93 /* ArkitDoushiQiUITests */,
@ -163,6 +180,7 @@
C205A2B52BF373360097BD93 /* ArkitDoushiQi */ = {
isa = PBXGroup;
children = (
168CD4FD2C06264300419510 /* Utils */,
82CE59E52C045C7500ADEE24 /* Game */,
C205A2B62BF373360097BD93 /* ArkitDoushiQiApp.swift */,
C205A2B82BF373360097BD93 /* ContentView.swift */,
@ -175,12 +193,12 @@
C205A2BC2BF373380097BD93 /* Views */ = {
isa = PBXGroup;
children = (
16820AB72C09C7B700C7F360 /* PartyEnregistery */,
C24DAB5A2C061DAA00681CD0 /* Enum */,
C25220F02C00AD7F0026B71F /* Components */,
C25220EC2C00AC530026B71F /* GameParametersMenu */,
C25220EB2C00A9230026B71F /* GeneralParametersMenu */,
C25220EA2C00A9010026B71F /* MainMenu */,
82F9D32F2BFE3A75009EDFAF /* History */,
C205A2BD2BF373380097BD93 /* Preview Assets.xcassets */,
);
path = Views;
@ -261,7 +279,6 @@
isa = PBXGroup;
children = (
C2F3940A2C0463940070B4F6 /* ProfileComponent.swift */,
16820AB52C09C06A00C7F360 /* ItemCollectionParty.swift */,
);
path = Visuals;
sourceTree = "<group>";
@ -352,6 +369,7 @@
knownRegions = (
en,
Base,
fr,
);
mainGroup = C205A2AA2BF373360097BD93;
productRefGroup = C205A2B42BF373360097BD93 /* Products */;
@ -370,7 +388,9 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
168CD4FC2C0625A400419510 /* en.lproj in Resources */,
C205A2BE2BF373380097BD93 /* Preview Assets.xcassets in Resources */,
168CD4FB2C0625A400419510 /* fr.lproj in Resources */,
C205A2BB2BF373380097BD93 /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -397,21 +417,22 @@
buildActionMask = 2147483647;
files = (
C205A2B92BF373360097BD93 /* ContentView.swift in Sources */,
16820ABB2C09C85000C7F360 /* Stub.swift in Sources */,
82CE59EF2C0460E500ADEE24 /* SpriteMoople.swift in Sources */,
82CE59E92C045D1100ADEE24 /* GameScene.swift in Sources */,
82F9D3312BFE3A9F009EDFAF /* HistoryGameDetail.swift in Sources */,
C24659E92BF60FAA004E80D5 /* ButtonComponent.swift in Sources */,
C24DAB5E2C061E3A00681CD0 /* Language.swift in Sources */,
C2F394082C0462400070B4F6 /* PhotoButtonComponent.swift in Sources */,
C24659E52BF5FE09004E80D5 /* MainMenu.swift in Sources */,
82F9D3362BFE3B3C009EDFAF /* HistoryView.swift in Sources */,
C20310D82BFCC2410031657D /* GeneralParametersMenuView.swift in Sources */,
168CD4FF2C06265B00419510 /* LanguageSettings.swift in Sources */,
C2F3940B2C0463940070B4F6 /* ProfileComponent.swift in Sources */,
16820AB62C09C06A00C7F360 /* ItemCollectionParty.swift in Sources */,
16820AB92C09C81500C7F360 /* PartyEnregistery.swift in Sources */,
C205A2B72BF373360097BD93 /* ArkitDoushiQiApp.swift in Sources */,
C24DAB5C2C061DC700681CD0 /* AI.swift in Sources */,
C25220F32C00AF490026B71F /* EditComponent.swift in Sources */,
C20310D62BFCB5FB0031657D /* PickerComponent.swift in Sources */,
82F9D3332BFE3B12009EDFAF /* HistoryHeader.swift in Sources */,
82CE59EB2C045E3800ADEE24 /* GameView.swift in Sources */,
C20310DA2BFCC8600031657D /* ToggleComponent.swift in Sources */,
C25220EE2C00AC7E0026B71F /* GameParametersMenuView.swift in Sources */,

@ -17,10 +17,16 @@ enum Theme {
struct ArkitDoushiQiApp: App {
@AppStorage("isDarkMode") private var isDarkMode = false
var body: some Scene {
WindowGroup {
MainMenu(playButtonText: "Jouer", registeredGamesButtonText: "Parties enregistrées",ParametersButtontText: "Paramètres")
.preferredColorScheme(isDarkMode ? .dark : .light)
}
}
@StateObject private var languageSettings = LanguageSettings(selectedLanguage: .English)
var body: some Scene {
WindowGroup {
MainMenu(
playButtonText: "Play",
registeredGamesButtonText: "Registered Games",
parametersButtonText: "Parameters"
)
.environmentObject(languageSettings)
}
}
}

@ -0,0 +1,27 @@
//
// LanguageSettings.swift
// ArkitDoushiQi
//
// Created by Louis DUFOUR on 28/05/2024.
//
import Foundation
class LanguageSettings: ObservableObject {
@Published var selectedLanguage: Language {
didSet {
UserDefaults.standard.set([selectedLanguage.localeIdentifier], forKey: "AppleLanguages")
UserDefaults.standard.synchronize()
NotificationCenter.default.post(name: NSNotification.Name("LanguageChanged"), object: nil)
}
}
init(selectedLanguage: Language) {
self.selectedLanguage = selectedLanguage
UserDefaults.standard.set([selectedLanguage.localeIdentifier], forKey: "AppleLanguages")
}
func changeLanguage(to newLanguage: Language) {
selectedLanguage = newLanguage
}
}

@ -8,11 +8,11 @@
import SwiftUI
struct PickerComponent<EnumType: RawRepresentable & Identifiable & Hashable>: View where EnumType.RawValue == String {
let title: String
let title: LocalizedStringKey
@Binding var selectedOption: EnumType
let options: [EnumType]
init(title: String, selectedOption: Binding<EnumType>, options: [EnumType]) {
init(title: LocalizedStringKey, selectedOption: Binding<EnumType>, options: [EnumType]) {
self.title = title
self._selectedOption = selectedOption
self.options = options
@ -25,7 +25,8 @@ struct PickerComponent<EnumType: RawRepresentable & Identifiable & Hashable>: Vi
Picker(title, selection: $selectedOption) {
ForEach(options) { option in
Text(option.rawValue.description)
.padding()
.tag(option)
.padding()
}
}
.labelsHidden()
@ -49,16 +50,12 @@ struct PickerComponent<EnumType: RawRepresentable & Identifiable & Hashable>: Vi
}
struct PickerComponent_Previews: PreviewProvider {
@State static var selectedItem = AI.RandomAction
@State static var selectedItem = Language.English
static var previews: some View {
PickerComponent(
title: "Selectionne une IA :",
title: "Select Language:",
selectedOption: $selectedItem,
options: AI.allCases
)
options: Language.allCases
)
}
}

@ -8,29 +8,29 @@
import SwiftUI
struct ToggleComponent: View {
let description: String
let booleanName : String
@AppStorage private var boolean : Bool
let description: LocalizedStringKey
let booleanName: String
@AppStorage private var boolean: Bool
init(description: String, booleanName: String, booleanDefaultValue: Bool) {
init(description: LocalizedStringKey, booleanName: String, booleanDefaultValue: Bool) {
self.description = description
self.booleanName = booleanName
_boolean = AppStorage(wrappedValue: booleanDefaultValue, booleanName)
}
var body: some View {
Divider().background(Color.gray).padding(.vertical, 1)
Toggle(description, isOn: $boolean)
.toggleStyle(SwitchToggleStyle(tint: .blue))
.padding(EdgeInsets(top: 0, leading: 48, bottom: 0, trailing: 48))
Divider().background(Color.gray).padding(.vertical, 1)
Toggle(description, isOn: $boolean)
.toggleStyle(SwitchToggleStyle(tint: .blue))
.padding(EdgeInsets(top: 0, leading: 48, bottom: 0, trailing: 48))
Divider().background(Color.gray).padding(.vertical, 1)
}
}
struct ToggleComponent_Previews: PreviewProvider {
static var previews: some View {
VStack{
ToggleComponent(description: "Dark mode", booleanName: "isDarkMode", booleanDefaultValue: false)
VStack {
ToggleComponent(description: LocalizedStringKey("Dark mode"), booleanName: "isDarkMode", booleanDefaultValue: false)
}
}
}

@ -7,8 +7,19 @@
import Foundation
enum Language: String, CaseIterable, Identifiable, Hashable {
case French = "Français"
case English = "English"
enum Language: String, CaseIterable, Identifiable {
case English = "en"
case French = "fr"
var id: String { self.rawValue }
var localeIdentifier: String { self.rawValue }
var description: String {
switch self {
case .English:
return "English"
case .French:
return "Français"
}
}
}

@ -8,52 +8,46 @@
import SwiftUI
struct GeneralParametersMenuView: View {
@EnvironmentObject var languageSettings: LanguageSettings
@State private var selectedAIOption: AI
@State private var selectedLanguageOption: Language
@State private var selectedRulesOption: Rules
let ParametersTitle : String
let DarkModeDescription : String
let DarModeBooleanName : String
let DarkModeDefaultValue : Bool
let LanguagePickerTitle : String
init(parametersTitle: String,selectedAIOption: AI, selectedLanguageOption: Language, selectedRulesOption: Rules, DarkModeDescription: String, DarModeBooleanName: String, DarkModeDefaultValue: Bool, LanguagePickerTitle: String) {
self.ParametersTitle = parametersTitle
self.selectedAIOption = selectedAIOption
self.selectedLanguageOption = selectedLanguageOption
self.selectedRulesOption = selectedRulesOption
self.DarkModeDescription = DarkModeDescription
self.DarModeBooleanName = DarModeBooleanName
self.DarkModeDefaultValue = DarkModeDefaultValue
self.LanguagePickerTitle = LanguagePickerTitle
let parametersTitle = LocalizedStringKey("ParametersTitle")
let darkModeDescription = LocalizedStringKey("DarkModeDescription")
let darkModeBooleanName: String = "isDarkMode"
let darkModeDefaultValue: Bool = false
let languagePickerTitle = LocalizedStringKey("LanguagePickerTitle")
init(selectedAIOption: AI, selectedRulesOption: Rules) {
self._selectedAIOption = State(initialValue: selectedAIOption)
self._selectedRulesOption = State(initialValue: selectedRulesOption)
}
var body: some View {
VStack(alignment: .leading) {
HStack(alignment: .center) {
Text(ParametersTitle).bold().font(.title)
Text(parametersTitle).bold().font(.title)
}.frame(maxWidth: .infinity)
Spacer().frame(maxHeight: 30)
ToggleComponent(description: "Dark mode", booleanName: "isDarkMode", booleanDefaultValue: false)
PickerComponent(title: "Sélectionne un langage :",
selectedOption: $selectedLanguageOption,
options: Language.allCases)
}.frame(maxHeight: .infinity, alignment: .top)
ToggleComponent(description: darkModeDescription, booleanName: darkModeBooleanName, booleanDefaultValue: darkModeDefaultValue)
PickerComponent(title: languagePickerTitle,
selectedOption: $languageSettings.selectedLanguage,
options: Language.allCases)
.onChange(of: languageSettings.selectedLanguage) { newLanguage in
languageSettings.changeLanguage(to: newLanguage)
}
}
.frame(maxHeight: .infinity, alignment: .top)
}
}
struct GeneralParametersMenuView_Previews: PreviewProvider {
static var previews: some View {
let languageSettings = LanguageSettings(selectedLanguage: .French)
GeneralParametersMenuView(
parametersTitle: "Paramètres",
selectedAIOption: .RandomAction,
selectedLanguageOption: .French,
selectedRulesOption: .Regular,
DarkModeDescription: "Dark Mode",
DarModeBooleanName: "isDarkMode",
DarkModeDefaultValue: false,
LanguagePickerTitle: "Séléctionne un langage"
selectedRulesOption: .Regular
)
.environmentObject(languageSettings)
}
}

@ -8,11 +8,14 @@
import SwiftUI
struct MainMenu: View {
let playButtonText : String
let registeredGamesButtonText : String
let ParametersButtontText : String
@EnvironmentObject var languageSettings: LanguageSettings
let playButtonText: String
let registeredGamesButtonText: String
let parametersButtonText: String
@State private var action: Int? = 0
@AppStorage("isDarkMode") private var isDarkMode = false
@State private var reloadView = false // Déclarer reloadView ici
var body: some View {
ZStack {
NavigationView {
@ -33,26 +36,26 @@ struct MainMenu: View {
Spacer().frame(height: 30)
ButtonComponent(title: ParametersButtontText)
{ GeneralParametersMenuView(
parametersTitle: "Paramètres",
selectedAIOption: .RandomAction,
selectedLanguageOption: .French,
selectedRulesOption: .Regular,
DarkModeDescription: "Dark Mode",
DarModeBooleanName: "isDarkMode",
DarkModeDefaultValue: false,
LanguagePickerTitle: "Séléctionne un langage"
) }
selectedRulesOption: .Regular
).id(reloadView) // Utilisez l'ID pour forcer le rechargement de la vue
}
Spacer()
}
.padding(EdgeInsets(top: 10, leading: 32, bottom: 10, trailing: 32))
Spacer()
}
.padding(EdgeInsets(top: 10, leading: 32, bottom: 10, trailing: 32))
}
.environmentObject(languageSettings)
.onReceive(NotificationCenter.default.publisher(for: NSNotification.Name("LanguageChanged"))) { _ in
self.reloadView.toggle() // Changez la valeur pour forcer le rechargement
}
}
}
}
struct MainMenu_Previews: PreviewProvider {
static var previews: some View {
MainMenu(playButtonText: "Jouer", registeredGamesButtonText: "Parties enregistrées",ParametersButtontText: "Paramètres")
MainMenu(playButtonText: "Jouer", registeredGamesButtonText: "Parties enregistrées", parametersButtonText: "Paramètres")
.environmentObject(LanguageSettings(selectedLanguage: .French))
}
}

@ -0,0 +1,11 @@
/*
Localizable.strings
ArkitDoushiQi
Created by Louis DUFOUR on 28/05/2024.
*/
"ParametersTitle" = "Parameters";
"DarkModeDescription" = "Dark Mode";
"LanguagePickerTitle" = "Language";

@ -0,0 +1,11 @@
/*
Localizable.strings
ArkitDoushiQi
Created by Louis DUFOUR on 28/05/2024.
*/
"ParametersTitle" = "Paramètres";
"DarkModeDescription" = "Mode sombre";
"LanguagePickerTitle" = "Langue";
Loading…
Cancel
Save