oh-my-dear-ai commited on
Commit
d606caf
·
1 Parent(s): 1fb0d85

feat: enhance UI localization

Browse files
Files changed (4) hide show
  1. app.py +25 -7
  2. solver.py +1 -1
  3. ui/display.py +120 -45
  4. ui/labels.json +171 -3
app.py CHANGED
@@ -12,6 +12,7 @@ from ui.display import (
12
  get_strategy,
13
  get_talent_price_bonus,
14
  prerender_inventory_inputs,
 
15
  update_dishes_selector_on_language,
16
  update_inventory_inputs,
17
  update_inventory_ui_by_language,
@@ -70,18 +71,18 @@ with gr.Blocks(js=js, css=css, theme=gr.themes.Monochrome()) as demo:
70
  </a>
71
  </div>""")
72
  with gr.Column(key="main"):
73
- language: gr.Dropdown = get_language()
74
- currency: gr.Radio = get_currency()
75
- budget: gr.Number = get_budget()
76
 
77
  plants_selector: gr.CheckboxGroup = get_plants_selector("en", "gold")
78
  dishes_selector: gr.CheckboxGroup = get_dishes_selector("en", "gold")
79
  with gr.Row(key="inventory_inputs"):
80
  inventory_inputs = prerender_inventory_inputs()
81
- strategy: gr.Radio = get_strategy()
82
- blooms_rate: gr.Dropdown = get_blooms_acquisition_rate()
83
- confiserie_rate: gr.Dropdown = get_confiserie_acquisition_rate()
84
- talent_price_bonus: gr.Number = get_talent_price_bonus()
85
  solve_button = gr.Button("Solve")
86
  results_output = gr.Textbox(label="Results", show_copy_button=True)
87
 
@@ -106,6 +107,23 @@ with gr.Blocks(js=js, css=css, theme=gr.themes.Monochrome()) as demo:
106
  outputs=dishes_selector,
107
  )
108
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
109
  currency.change(
110
  update_selectors_on_currency,
111
  inputs=[language, currency],
 
12
  get_strategy,
13
  get_talent_price_bonus,
14
  prerender_inventory_inputs,
15
+ update_all_ui_components,
16
  update_dishes_selector_on_language,
17
  update_inventory_inputs,
18
  update_inventory_ui_by_language,
 
71
  </a>
72
  </div>""")
73
  with gr.Column(key="main"):
74
+ language: gr.Dropdown = get_language("en")
75
+ currency: gr.Radio = get_currency("en")
76
+ budget: gr.Number = get_budget("en")
77
 
78
  plants_selector: gr.CheckboxGroup = get_plants_selector("en", "gold")
79
  dishes_selector: gr.CheckboxGroup = get_dishes_selector("en", "gold")
80
  with gr.Row(key="inventory_inputs"):
81
  inventory_inputs = prerender_inventory_inputs()
82
+ strategy: gr.Radio = get_strategy("en")
83
+ blooms_rate: gr.Dropdown = get_blooms_acquisition_rate("en")
84
+ confiserie_rate: gr.Dropdown = get_confiserie_acquisition_rate("en")
85
+ talent_price_bonus: gr.Number = get_talent_price_bonus("en")
86
  solve_button = gr.Button("Solve")
87
  results_output = gr.Textbox(label="Results", show_copy_button=True)
88
 
 
107
  outputs=dishes_selector,
108
  )
109
 
110
+ gr.on(
111
+ language.change,
112
+ fn=update_all_ui_components,
113
+ inputs=[language],
114
+ outputs=[
115
+ language,
116
+ currency,
117
+ budget,
118
+ blooms_rate,
119
+ confiserie_rate,
120
+ strategy,
121
+ talent_price_bonus,
122
+ results_output,
123
+ solve_button,
124
+ ],
125
+ )
126
+
127
  currency.change(
128
  update_selectors_on_currency,
129
  inputs=[language, currency],
solver.py CHANGED
@@ -134,4 +134,4 @@ def get_results(
134
  results["total_price"] = outputs["total_price"]
135
  results["total_count"] = outputs["total_count"]
136
  results["remaining"] = outputs["remaining"]
137
- return format_results(results)
 
134
  results["total_price"] = outputs["total_price"]
135
  results["total_count"] = outputs["total_count"]
136
  results["remaining"] = outputs["remaining"]
137
+ return format_results(results, language)
ui/display.py CHANGED
@@ -16,15 +16,15 @@ from data_loader import (
16
  )
17
 
18
 
19
- def get_language():
20
  """
21
  Returns a Gradio Dropdown component for selecting language.
22
  """
23
  return gr.Dropdown(
24
  choices=[("English", "en"), ("简体中文", "cn"), ("日本語", "ja")],
25
  value="en",
26
- label="Language",
27
- info="Select the language for the interface. Currently, only part of texts are translated.",
28
  elem_id="language-select",
29
  interactive=True,
30
  )
@@ -47,30 +47,33 @@ def update_inventory_ui_by_language(language):
47
  return inventory_inputs
48
 
49
 
50
- def get_currency():
51
  """
52
  Returns a Gradio Radio component for selecting currency.
53
  """
54
  return gr.Radio(
55
- choices=[("Gold", "gold"), ("Gems", "gems")],
 
 
 
56
  value="gold",
57
  type="value",
58
- label="Currency",
59
- info="Select the currency.",
60
  interactive=True,
61
  elem_id="currency-radio",
62
  render=True,
63
  )
64
 
65
 
66
- def get_budget():
67
  """
68
  Returns a Gradio Number component for budget input.
69
  """
70
  return gr.Number(
71
  value=0,
72
- label="Budget💸",
73
- info="Enter your budget amount.",
74
  elem_id="budget-number",
75
  interactive=True,
76
  precision=0,
@@ -80,38 +83,30 @@ def get_budget():
80
  )
81
 
82
 
83
- def get_blooms_acquisition_rate():
84
  """
85
  Returns a Gradio Dropdown component for Blooms Acquisition Rate.
86
  """
87
  return gr.Dropdown(
88
  choices=[
89
- "0(Gabby's Acquisition)",
90
- "+100%(HVA for Shop Level 1 & 2)",
91
- "+200%(HVA for Shop Level 3 & 4)",
92
- "+300%(HVA for Shop Level 5 & 6)",
93
  ],
94
- value="0(Gabby's Acquisition)",
95
- type="index",
96
- label="Blooms Extra Acquisition Rate🌿",
97
- info="Select your high-value acquisition rate for Bewildering Blooms.",
98
  interactive=True,
99
  )
100
 
101
 
102
- def get_confiserie_acquisition_rate():
103
  """Returns a Gradio Dropdown component for Confiserie Acquisition Rate."""
104
  return gr.Dropdown(
105
  choices=[
106
- "0(Andre's Acquisition)",
107
- "+100%(HVA for Shop Level 1 & 2)",
108
- "+200%(HVA for Shop Level 3 & 4)",
109
- "+300%(HVA for Shop Level 5 & 6)",
110
  ],
111
- value="0(Andre's Acquisition)",
112
- type="index",
113
- label="Confiserie Extra Acquisition Rate🍜",
114
- info="Select your high-value acquisition rate for The Confiserie.",
115
  interactive=True,
116
  )
117
 
@@ -148,8 +143,8 @@ def get_plants_selector(language, currency):
148
  choices=filtered_plants_labels,
149
  value=default_value,
150
  type="value",
151
- label="Plants",
152
- info="Select plants",
153
  interactive=True,
154
  )
155
  return checkbox_group
@@ -208,8 +203,8 @@ def get_dishes_selector(language, currency):
208
  choices=filtered_dishes_labels,
209
  value=default_value,
210
  type="value",
211
- label="Dishes",
212
- info="Select dishes.",
213
  interactive=True,
214
  )
215
 
@@ -306,14 +301,14 @@ def update_inventory_inputs(
306
  return _out
307
 
308
 
309
- def get_talent_price_bonus():
310
  """
311
  Returns a Gradio Number component for talent price bonus input.
312
  """
313
  return gr.Number(
314
  value=0,
315
- label="Talent Price Bonus(%)",
316
- info="Enter the total percentage increase in dish selling price from your talents.",
317
  elem_id="talent-price-bonus",
318
  interactive=True,
319
  precision=0,
@@ -323,41 +318,121 @@ def get_talent_price_bonus():
323
  )
324
 
325
 
326
- def get_strategy():
327
  """
328
  Returns a Gradio Radio component for selecting the selling strategy.
329
  """
330
  return gr.Radio(
331
  choices=[
332
- ("Prioritize high-priced items", "MaximizeStock"),
333
- ("Prioritize low-priced items", "MinimizeStock"),
334
  ],
335
  value="MinimizeStock",
336
  type="value",
337
- label="Selling Strategy📈📉",
338
- info="Select the strategy for selling items.",
339
  interactive=True,
340
  elem_id="strategy-radio",
341
  )
342
 
343
 
344
- def format_results(results):
345
  """
346
  Format the results for display.
347
 
348
  Args:
349
  results (dict): The results dictionary containing solution, total_price, total_count, and remaining.
 
350
 
351
  Returns:
352
  str: A formatted string representation of the results.
353
  """
354
  output = []
355
- output.append("Solution:")
356
  for item, count in results["solution"].items():
357
  output.append(f"{item}: {count}")
358
 
359
- output.append(f"\n{'Total Value:'} {results['total_price']}")
360
- output.append(f"{'Total Count:'} {results['total_count']}")
361
- output.append(f"{'Remaining Budget'}: {results['remaining']}")
 
 
 
 
 
 
362
 
363
  return "\n".join(output)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  )
17
 
18
 
19
+ def get_language(language="en"):
20
  """
21
  Returns a Gradio Dropdown component for selecting language.
22
  """
23
  return gr.Dropdown(
24
  choices=[("English", "en"), ("简体中文", "cn"), ("日本語", "ja")],
25
  value="en",
26
+ label=LABELS[language]["ui"]["language"]["label"],
27
+ info=LABELS[language]["ui"]["language"]["info"],
28
  elem_id="language-select",
29
  interactive=True,
30
  )
 
47
  return inventory_inputs
48
 
49
 
50
+ def get_currency(language="en"):
51
  """
52
  Returns a Gradio Radio component for selecting currency.
53
  """
54
  return gr.Radio(
55
+ choices=[
56
+ (LABELS[language]["ui"]["currency"]["gold"], "gold"),
57
+ (LABELS[language]["ui"]["currency"]["gems"], "gems"),
58
+ ],
59
  value="gold",
60
  type="value",
61
+ label=LABELS[language]["ui"]["currency"]["label"],
62
+ info=LABELS[language]["ui"]["currency"]["info"],
63
  interactive=True,
64
  elem_id="currency-radio",
65
  render=True,
66
  )
67
 
68
 
69
+ def get_budget(language="en"):
70
  """
71
  Returns a Gradio Number component for budget input.
72
  """
73
  return gr.Number(
74
  value=0,
75
+ label=LABELS[language]["ui"]["budget"]["label"],
76
+ info=LABELS[language]["ui"]["budget"]["info"],
77
  elem_id="budget-number",
78
  interactive=True,
79
  precision=0,
 
83
  )
84
 
85
 
86
+ def get_blooms_acquisition_rate(language="en"):
87
  """
88
  Returns a Gradio Dropdown component for Blooms Acquisition Rate.
89
  """
90
  return gr.Dropdown(
91
  choices=[
92
+ (option, i)
93
+ for i, option in enumerate(LABELS[language]["ui"]["blooms_rate"]["options"])
 
 
94
  ],
95
+ label=LABELS[language]["ui"]["blooms_rate"]["label"],
96
+ info=LABELS[language]["ui"]["blooms_rate"]["info"],
 
 
97
  interactive=True,
98
  )
99
 
100
 
101
+ def get_confiserie_acquisition_rate(language="en"):
102
  """Returns a Gradio Dropdown component for Confiserie Acquisition Rate."""
103
  return gr.Dropdown(
104
  choices=[
105
+ (option, i)
106
+ for i, option in enumerate(LABELS[language]["ui"]["blooms_rate"]["options"])
 
 
107
  ],
108
+ label=LABELS[language]["ui"]["confiserie_rate"]["label"],
109
+ info=LABELS[language]["ui"]["confiserie_rate"]["info"],
 
 
110
  interactive=True,
111
  )
112
 
 
143
  choices=filtered_plants_labels,
144
  value=default_value,
145
  type="value",
146
+ label=LABELS[language]["ui"]["plants_selector"]["label"],
147
+ info=LABELS[language]["ui"]["plants_selector"]["info"],
148
  interactive=True,
149
  )
150
  return checkbox_group
 
203
  choices=filtered_dishes_labels,
204
  value=default_value,
205
  type="value",
206
+ label=LABELS[language]["ui"]["dishes_selector"]["label"],
207
+ info=LABELS[language]["ui"]["dishes_selector"]["info"],
208
  interactive=True,
209
  )
210
 
 
301
  return _out
302
 
303
 
304
+ def get_talent_price_bonus(language="en"):
305
  """
306
  Returns a Gradio Number component for talent price bonus input.
307
  """
308
  return gr.Number(
309
  value=0,
310
+ label=LABELS[language]["ui"]["talent_price_bonus"],
311
+ info=LABELS[language]["ui"]["talent_price_bonus_info"],
312
  elem_id="talent-price-bonus",
313
  interactive=True,
314
  precision=0,
 
318
  )
319
 
320
 
321
+ def get_strategy(language="en"):
322
  """
323
  Returns a Gradio Radio component for selecting the selling strategy.
324
  """
325
  return gr.Radio(
326
  choices=[
327
+ (LABELS[language]["ui"]["strategy"]["maximize_stock"], "MaximizeStock"),
328
+ (LABELS[language]["ui"]["strategy"]["minimize_stock"], "MinimizeStock"),
329
  ],
330
  value="MinimizeStock",
331
  type="value",
332
+ label=LABELS[language]["ui"]["strategy"]["label"],
333
+ info=LABELS[language]["ui"]["strategy"]["info"],
334
  interactive=True,
335
  elem_id="strategy-radio",
336
  )
337
 
338
 
339
+ def format_results(results, language="en"):
340
  """
341
  Format the results for display.
342
 
343
  Args:
344
  results (dict): The results dictionary containing solution, total_price, total_count, and remaining.
345
+ language (str): The language code for localization.
346
 
347
  Returns:
348
  str: A formatted string representation of the results.
349
  """
350
  output = []
351
+ output.append(f"{LABELS[language]['ui']['results']['solution']}: ")
352
  for item, count in results["solution"].items():
353
  output.append(f"{item}: {count}")
354
 
355
+ output.append(
356
+ f"\n{LABELS[language]['ui']['results']['total_value']}: {results['total_price']}"
357
+ )
358
+ output.append(
359
+ f"{LABELS[language]['ui']['results']['total_count']}: {results['total_count']}"
360
+ )
361
+ output.append(
362
+ f"{LABELS[language]['ui']['results']['remaining_budget']}: {results['remaining']} {'😞' if results['remaining'] else '😁'}"
363
+ )
364
 
365
  return "\n".join(output)
366
+
367
+
368
+ def update_all_ui_components(language):
369
+ """
370
+ Update all UI components with localized text.
371
+
372
+ Args:
373
+ language (str): The language code for localization.
374
+
375
+ Returns:
376
+ list: List of gr.update objects for all components.
377
+ """
378
+ return [
379
+ # Language component
380
+ gr.update(
381
+ label=LABELS[language]["ui"]["language"]["label"],
382
+ info=LABELS[language]["ui"]["language"]["info"],
383
+ ),
384
+ # Currency component
385
+ gr.update(
386
+ label=LABELS[language]["ui"]["currency"]["label"],
387
+ info=LABELS[language]["ui"]["currency"]["info"],
388
+ choices=[
389
+ (LABELS[language]["ui"]["currency"]["gold"], "gold"),
390
+ (LABELS[language]["ui"]["currency"]["gems"], "gems"),
391
+ ],
392
+ ),
393
+ # Budget component
394
+ gr.update(
395
+ label=LABELS[language]["ui"]["budget"]["label"],
396
+ info=LABELS[language]["ui"]["budget"]["info"],
397
+ ),
398
+ # Blooms acquisition rate component
399
+ gr.update(
400
+ label=LABELS[language]["ui"]["blooms_rate"]["label"],
401
+ info=LABELS[language]["ui"]["blooms_rate"]["info"],
402
+ choices=[
403
+ (option, i)
404
+ for i, option in enumerate(
405
+ LABELS[language]["ui"]["blooms_rate"]["options"]
406
+ )
407
+ ],
408
+ ),
409
+ # Confiserie acquisition rate component
410
+ gr.update(
411
+ label=LABELS[language]["ui"]["confiserie_rate"]["label"],
412
+ info=LABELS[language]["ui"]["confiserie_rate"]["info"],
413
+ choices=[
414
+ (option, i)
415
+ for i, option in enumerate(
416
+ LABELS[language]["ui"]["confiserie_rate"]["options"]
417
+ )
418
+ ],
419
+ ),
420
+ # Strategy component
421
+ gr.update(
422
+ label=LABELS[language]["ui"]["strategy"]["label"],
423
+ info=LABELS[language]["ui"]["strategy"]["info"],
424
+ choices=[
425
+ (LABELS[language]["ui"]["strategy"]["maximize_stock"], "MaximizeStock"),
426
+ (LABELS[language]["ui"]["strategy"]["minimize_stock"], "MinimizeStock"),
427
+ ],
428
+ ),
429
+ # Talent price bonus component
430
+ gr.update(
431
+ label=LABELS[language]["ui"]["talent_price_bonus"],
432
+ info=LABELS[language]["ui"]["talent_price_bonus_info"],
433
+ ),
434
+ # Results component
435
+ gr.update(label=LABELS[language]["ui"]["results"]["label"]),
436
+ # Solve button
437
+ gr.update(value=LABELS[language]["ui"]["solve_button"]),
438
+ ]
ui/labels.json CHANGED
@@ -77,7 +77,63 @@
77
  },
78
  "ui": {
79
  "talent_price_bonus": "Talent Price Bonus(%)",
80
- "talent_price_bonus_info": "Enter the total percentage increase in dish selling price from your talents."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
  }
82
  },
83
  "cn": {
@@ -158,7 +214,63 @@
158
  },
159
  "ui": {
160
  "talent_price_bonus": "天赋价格加成(%)",
161
- "talent_price_bonus_info": "输入天赋导致的菜品售价增幅百分比"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
162
  }
163
  },
164
  "ja": {
@@ -239,7 +351,63 @@
239
  },
240
  "ui": {
241
  "talent_price_bonus": "才能価格ボーナス(%)",
242
- "talent_price_bonus_info": "才能による料理販売価格の上昇率を入力してください"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
243
  }
244
  }
245
  }
 
77
  },
78
  "ui": {
79
  "talent_price_bonus": "Talent Price Bonus(%)",
80
+ "talent_price_bonus_info": "Enter the total percentage increase in dish selling price from your talents.",
81
+ "language": {
82
+ "label": "Language",
83
+ "info": "Select the language for the interface."
84
+ },
85
+ "currency": {
86
+ "label": "Currency",
87
+ "info": "Select the currency.",
88
+ "gold": "Gold",
89
+ "gems": "Gems"
90
+ },
91
+ "budget": {
92
+ "label": "Budget💸",
93
+ "info": "Enter your budget amount."
94
+ },
95
+ "strategy": {
96
+ "label": "Selling Strategy📈📉",
97
+ "info": "Select the strategy for selling items.",
98
+ "maximize_stock": "Prioritize high-priced items",
99
+ "minimize_stock": "Prioritize low-priced items"
100
+ },
101
+ "blooms_rate": {
102
+ "label": "Blooms Extra Acquisition Rate🌿",
103
+ "info": "Select your high-value acquisition rate for Bewildering Blooms.",
104
+ "options": [
105
+ "0(Gabby's Acquisition)",
106
+ "+100%(HVA for Shop Level 1 & 2)",
107
+ "+200%(HVA for Shop Level 3 & 4)",
108
+ "+300%(HVA for Shop Level 5 & 6)"
109
+ ]
110
+ },
111
+ "confiserie_rate": {
112
+ "label": "Confiserie Extra Acquisition Rate🍜",
113
+ "info": "Select your high-value acquisition rate for The Confiserie.",
114
+ "options": [
115
+ "0(Andre's Acquisition)",
116
+ "+100%(HVA for Shop Level 1 & 2)",
117
+ "+200%(HVA for Shop Level 3 & 4)",
118
+ "+300%(HVA for Shop Level 5 & 6)"
119
+ ]
120
+ },
121
+ "plants_selector": {
122
+ "label": "Plants",
123
+ "info": "Select plants"
124
+ },
125
+ "dishes_selector": {
126
+ "label": "Dishes",
127
+ "info": "Select dishes."
128
+ },
129
+ "solve_button": "Solve",
130
+ "results": {
131
+ "label": "Results",
132
+ "solution": "Solution",
133
+ "total_value": "Total Value",
134
+ "total_count": "Total Count",
135
+ "remaining_budget": "Remaining Budget"
136
+ }
137
  }
138
  },
139
  "cn": {
 
214
  },
215
  "ui": {
216
  "talent_price_bonus": "天赋价格加成(%)",
217
+ "talent_price_bonus_info": "输入天赋导致的菜品售价增幅百分比",
218
+ "language": {
219
+ "label": "语言",
220
+ "info": "选择界面语言"
221
+ },
222
+ "currency": {
223
+ "label": "货币",
224
+ "info": "选择货币类型",
225
+ "gold": "金币",
226
+ "gems": "宝石"
227
+ },
228
+ "budget": {
229
+ "label": "预算💸",
230
+ "info": "输入您的预算金额"
231
+ },
232
+ "strategy": {
233
+ "label": "销售策略📈📉",
234
+ "info": "选择物品销售策略",
235
+ "maximize_stock": "优先出售高价物品",
236
+ "minimize_stock": "优先出售低价物品"
237
+ },
238
+ "blooms_rate": {
239
+ "label": "疯狂藤蔓加价倍率🌿",
240
+ "info": "选择疯狂藤蔓收购的加价倍率",
241
+ "options": [
242
+ "0(普通收购)",
243
+ "+100%(商店等级1-2的高价收购)",
244
+ "+200%(商店等级3-4的高价收购)",
245
+ "+300%(商店等级5-6的高价收购)"
246
+ ]
247
+ },
248
+ "confiserie_rate": {
249
+ "label": "美味工坊加价倍率🍜",
250
+ "info": "选择美味工坊收购的加价倍率",
251
+ "options": [
252
+ "0(普通收购)",
253
+ "+100%(商店等级1-2的高价收购)",
254
+ "+200%(商店等级3-4的高价收购)",
255
+ "+300%(商店等级5-6的高价收购)"
256
+ ]
257
+ },
258
+ "plants_selector": {
259
+ "label": "植物",
260
+ "info": "选择植物"
261
+ },
262
+ "dishes_selector": {
263
+ "label": "菜品",
264
+ "info": "选择菜品"
265
+ },
266
+ "solve_button": "求解",
267
+ "results": {
268
+ "label": "结果",
269
+ "solution": "组合方案",
270
+ "total_value": "总价值",
271
+ "total_count": "总数量",
272
+ "remaining_budget": "剩余预算"
273
+ }
274
  }
275
  },
276
  "ja": {
 
351
  },
352
  "ui": {
353
  "talent_price_bonus": "才能価格ボーナス(%)",
354
+ "talent_price_bonus_info": "才能による料理販売価格の上昇率を入力してください",
355
+ "language": {
356
+ "label": "言語",
357
+ "info": "インターフェースの言語を選択"
358
+ },
359
+ "currency": {
360
+ "label": "通貨",
361
+ "info": "通貨を選択",
362
+ "gold": "ゴールド",
363
+ "gems": "ジェム"
364
+ },
365
+ "budget": {
366
+ "label": "予算💸",
367
+ "info": "予算額を入力してください"
368
+ },
369
+ "strategy": {
370
+ "label": "販売戦略📈📉",
371
+ "info": "アイテムの販売戦略を選択",
372
+ "maximize_stock": "高価格アイテムを���先",
373
+ "minimize_stock": "低価格アイテムを優先"
374
+ },
375
+ "blooms_rate": {
376
+ "label": "花々の追加取得率🌿",
377
+ "info": "花々の高価値取得率を選択",
378
+ "options": [
379
+ "0(ギャビーの通常取得)",
380
+ "+100%(ショップレベル1-2の高価値取得)",
381
+ "+200%(ショップレベル3-4の高価値取得)",
382
+ "+300%(ショップレベル5-6の高価値取得)"
383
+ ]
384
+ },
385
+ "confiserie_rate": {
386
+ "label": "菓子店の追加取得率🍜",
387
+ "info": "菓子店の高価値取得率を選択",
388
+ "options": [
389
+ "0(アンドレの通常取得)",
390
+ "+100%(ショップレベル1-2の高価値取得)",
391
+ "+200%(ショップレベル3-4の高価値取得)",
392
+ "+300%(ショップレベル5-6の高価値取得)"
393
+ ]
394
+ },
395
+ "plants_selector": {
396
+ "label": "植物",
397
+ "info": "植物を選択"
398
+ },
399
+ "dishes_selector": {
400
+ "label": "料理",
401
+ "info": "料理を選択"
402
+ },
403
+ "solve_button": "解決",
404
+ "results": {
405
+ "label": "結果",
406
+ "solution": "解決策",
407
+ "total_value": "合計価値",
408
+ "total_count": "合計数",
409
+ "remaining_budget": "残り予算"
410
+ }
411
  }
412
  }
413
  }