Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions MeoAsstMac/Configuration Views/AwardSettingsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ struct AwardSettingsView: View {
Form {
Toggle("领取每日/每周任务奖励", isOn: $config.award)

Toggle("领取所有邮件奖励", isOn: $config.mail)
Toggle(String(localized: "领取所有邮件奖励"), isOn: $config.mail)

Toggle("进行每日免费单抽", isOn: $config.recruit)
Toggle(String(localized: "进行每日免费单抽"), isOn: $config.recruit)

Toggle("领取幸运墙合成玉奖励", isOn: $config.orundum)
Toggle(String(localized: "领取幸运墙合成玉奖励"), isOn: $config.orundum)

Toggle("领取限时开采许可合成玉奖励", isOn: $config.mining)
Toggle(String(localized: "领取限时开采许可合成玉奖励"), isOn: $config.mining)

Toggle("领取周年庆赠送月卡奖励", isOn: $config.specialaccess)
Toggle(String(localized: "领取周年庆赠送月卡奖励"), isOn: $config.specialaccess)
}
.padding()
}
Expand Down
24 changes: 12 additions & 12 deletions MeoAsstMac/Configuration Views/FightSettingsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,19 @@ struct FightSettingsView: View {
Section {
HStack(spacing: 20) {
if useCustomStage || stageNotListed {
TextField("关卡名", text: $config.stage)
TextField(String(localized: "关卡名"), text: $config.stage)
} else {
Picker("关卡选择", selection: $config.stage) {
Picker(String(localized: "关卡选择"), selection: $config.stage) {
Text("当前/上次").tag("")
Text("1-7").tag("1-7")
Text("CE-6").tag("CE-6")
Text("AP-5").tag("AP-5")
Text("CA-5").tag("CA-5")
Text("LS-6").tag("LS-6")
Text("剿灭模式").tag("Annihilation")
Text(String(localized: "剿灭模式")).tag("Annihilation")
}
}
Toggle("手动输入关卡名", isOn: isUsingCustomStage)
Toggle(String(localized: "手动输入关卡名"), isOn: isUsingCustomStage)
}
.animation(.default, value: config.stage)
}
Expand All @@ -43,25 +43,25 @@ struct FightSettingsView: View {

Section {
TextField(value: $config.medicine, format: .number) {
Toggle("吃理智药", isOn: useMedicine)
Toggle(String(localized: "吃理智药"), isOn: useMedicine)
}

TextField(value: $config.stone, format: .number) {
Toggle("吃源石", isOn: useStone)
Toggle(String(localized: "吃源石"), isOn: useStone)
}

TextField(value: $config.times, format: .number) {
Toggle("指定次数", isOn: limitBattles)
Toggle(String(localized: "指定次数"), isOn: limitBattles)
}

Picker(selection: $config.series) {
Text(verbatim: "AUTO").tag(0)
ForEach((1...6).reversed(), id: \.self) { i in
Text(verbatim: "\(i)").tag(i)
}
Text("不使用").tag(Int?.none)
Text(String(localized: "不使用")).tag(Int?.none)
} label: {
Toggle("连战次数", isOn: seriesBattles)
Toggle(String(localized: "连战次数"), isOn: seriesBattles)
}
}

Expand All @@ -74,11 +74,11 @@ struct FightSettingsView: View {
Text($1.0).tag($0 as Int?)
}
} label: {
Toggle("指定材料", isOn: dropItemToggle)
Toggle(String(localized: "指定材料"), isOn: dropItemToggle)
}
if dropItemToggle.wrappedValue {
TextField(value: dropItemCount, format: .number) {
Text("刷取数量")
Text(String(localized: "刷取数量"))
}
}
}.onAppear {
Expand All @@ -96,7 +96,7 @@ struct FightSettingsView: View {
Divider()

Section {
Toggle("博朗台碎石模式", isOn: $config.DrGrandet)
Toggle(String(localized: "博朗台碎石模式"), isOn: $config.DrGrandet)
Toggle("无限吃48小时内过期的理智药", isOn: useExpiringMedicine)
}

Expand Down
36 changes: 18 additions & 18 deletions MeoAsstMac/Configuration Views/InfrastSettingsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@ struct InfrastSettingsView: View {
var body: some View {
VStack {
Form {
Picker("基建模式", selection: $config.mode) {
Text("常规模式").tag(InfrastConfiguration.Mode.default)
Text("队列轮换").tag(InfrastConfiguration.Mode.rotation)
Text("自定义基建配置").tag(InfrastConfiguration.Mode.custom)
Picker(String(localized: "基建模式"), selection: $config.mode) {
Text(String(localized: "常规模式")).tag(InfrastConfiguration.Mode.default)
Text(String(localized: "队列轮换")).tag(InfrastConfiguration.Mode.rotation)
Text(String(localized: "自定义基建配置")).tag(InfrastConfiguration.Mode.custom)
}
if config.mode == .custom {
customPlanView
} else {
Picker("无人机用途", selection: $config.drones) {
Picker(String(localized: "无人机用途"), selection: $config.drones) {
ForEach(droneUsages, id: \.self) { usage in
Text(usage.description).tag(usage)
}
Expand Down Expand Up @@ -65,58 +65,58 @@ struct InfrastSettingsView: View {
config.facility.move(fromOffsets: source, toOffset: destination)
}
} header: {
Text("已启用")
Text(String(localized: "已启用"))
}

Section {
ForEach(disabledFacilities) { facility in
Toggle(facility.description, isOn: facilityBinding(for: facility))
}
} header: {
Text("未启用")
Text(String(localized: "未启用"))
}
}
.animation(.default, value: config.facility)
.frame(height: 12 * rowHeight)
}

@ViewBuilder private var preferenceForm: some View {
Toggle("宿舍空余位置蹭信赖", isOn: $config.dorm_trust_enabled)
Toggle("不将已进驻的干员放入宿舍", isOn: $config.dorm_notstationed_enabled)
Toggle("源石碎片自动补货", isOn: $config.replenish)
Toggle("会客室信息板收取信用", isOn: $config.reception_message_board)
Toggle("训练完成后继续尝试专精当前技能", isOn: $config.continue_training)
Toggle(String(localized: "宿舍空余位置蹭信赖"), isOn: $config.dorm_trust_enabled)
Toggle(String(localized: "不将已进驻的干员放入宿舍"), isOn: $config.dorm_notstationed_enabled)
Toggle(String(localized: "源石碎片自动补货"), isOn: $config.replenish)
Toggle(String(localized: "会客室信息板收取信用"), isOn: $config.reception_message_board)
Toggle(String(localized: "训练完成后继续尝试专精当前技能"), isOn: $config.continue_training)
}

@ViewBuilder private var customPlanView: some View {
VStack {
Picker("方案", selection: customPlan) {
Picker(String(localized: "方案"), selection: customPlan) {
Section {
ForEach(customInfrastPaths, id: \.self) { path in
path.label
}
} header: {
Text("自定义排班")
Text(String(localized: "自定义排班"))
}

Section {
ForEach(String.bundledPlans, id: \.self) { path in
path.label
}
} header: {
Text("内置排班")
Text(String(localized: "内置排班"))
}
}

Picker("班次", selection: $config.plan_index) {
Picker(String(localized: "班次"), selection: $config.plan_index) {
try? MAAInfrast(path: config.filename).planList
}

HStack(spacing: 20) {
Button("打开自定义排班文件夹…") {
NSWorkspace.shared.selectFile(nil, inFileViewerRootedAtPath: customInfrastDirectory.path)
}
Button("重新加载文件") {
Button(String(localized: "重新加载文件")) {
refreshCustomPlans.toggle()
}
}
Expand Down Expand Up @@ -218,7 +218,7 @@ extension String {
if let plan = try? MAAInfrast(path: self) {
return Text(plan.title ?? self).tag(self)
} else {
return Text("无效文件").tag(self)
return Text(String(localized: "无效文件")).tag(self)
}
}

Expand Down
93 changes: 88 additions & 5 deletions MeoAsstMac/Configuration Views/MallSettingsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@ struct MallSettingsView: View {
VStack(spacing: 30) {
HStack(spacing: 10) {
Spacer()
Toggle("信用购物", isOn: $config.shopping)
Toggle("信用溢出时无视黑名单", isOn: $config.force_shopping_if_credit_full)
Toggle("借助战赚信用", isOn: .constant(false))
Toggle(String(localized: "信用购物"), isOn: $config.shopping)
Toggle(String(localized: "信用溢出时无视黑名单"), isOn: $config.force_shopping_if_credit_full)
Toggle(String(localized: "借助战赚信用"), isOn: .constant(false))
Spacer()
}

HStack(spacing: 20) {
EditableTextList(title: "优先购买", texts: $config.buy_first)
EditableTextList(title: "黑名单", texts: $config.blacklist)
LocalizedEditableTextList(title: LocalizedStringKey("优先购买"), chineseTexts: $config.buy_first)
LocalizedEditableTextList(title: LocalizedStringKey("黑名单"), chineseTexts: $config.blacklist)
}
.frame(height: 12 * rowHeight)
}
Expand All @@ -38,6 +38,89 @@ struct MallSettingsView_Previews: PreviewProvider {
}
}

// MARK: - LocalizedEditableTextList

/// A localized version of EditableTextList that displays item names in user's language
/// while storing Chinese names internally for MaaCore compatibility.
private struct LocalizedEditableTextList: View {
let title: LocalizedStringKey
@Binding var chineseTexts: [String] // Stored as Chinese for MaaCore

private struct TextEntry: Identifiable {
let id: Int
}

@State private var selection: Int?
@FocusState private var focusedField: Int?

var body: some View {
List(selection: $selection) {
Section {
ForEach(0..<chineseTexts.count, id: \.self) { index in
HStack {
TextField("", text: Binding(
get: { ItemNameLocalizer.localizedDisplayName(for: chineseTexts[index]) },
set: { newValue in
chineseTexts[index] = ItemNameLocalizer.chineseName(for: newValue)
}
))
.focused($focusedField, equals: index)

Button {
selection = index
focusedField = index
} label: {
Image(systemName: "pencil")
.contentShape(Rectangle())
}
.buttonStyle(.plain)
}
}
.onMove(perform: moveEntry)
} header: {
Text(title)
} footer: {
editButtons()
}
}
.animation(.default, value: chineseTexts)
}

@ViewBuilder private func editButtons() -> some View {
HStack {
Button {
addEntry()
} label: {
Image(systemName: "plus")
}
.buttonStyle(.plain)

Button {
deleteEntry()
} label: {
Image(systemName: "trash")
}
.buttonStyle(.plain)
}
}

private func moveEntry(source: IndexSet, destination: Int) {
chineseTexts.move(fromOffsets: source, toOffset: destination)
}

private func addEntry() {
chineseTexts.append("")
selection = chineseTexts.count - 1
}

private func deleteEntry() {
if let selection {
chineseTexts.remove(at: selection)
}
selection = nil
}
}

// MARK: - EditableTextList

private struct EditableTextList: View {
Expand Down
2 changes: 1 addition & 1 deletion MeoAsstMac/Configuration Views/RecruitSettingsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ struct RecruitSettingsView: View {
VStack(alignment: .leading) {
Toggle("自动刷新3星Tags", isOn: $config.refresh)

Toggle("自动使用加急许可", isOn: $config.expedite)
Toggle(String(localized: "自动使用加急许可"), isOn: $config.expedite)

Toggle("3星设置7:40而非9:00", isOn: level3UseShortTime)

Expand Down
Loading
Loading