Browse Source

Improved locale files structure

Arnaud Vergnet 3 years ago
parent
commit
0d1fe124f4
51 changed files with 1322 additions and 1290 deletions
  1. 1
    1
      __tests__/utils/EquipmentBooking.test.js
  2. 491
    0
      locales/en.json
  3. 491
    0
      locales/fr.json
  4. 4
    4
      src/components/Amicale/Vote/VoteResults.js
  5. 6
    6
      src/components/Amicale/Vote/VoteSelect.js
  6. 3
    3
      src/components/Amicale/Vote/VoteTease.js
  7. 4
    4
      src/components/Amicale/Vote/VoteTitle.js
  8. 7
    7
      src/components/Amicale/Vote/VoteWait.js
  9. 2
    2
      src/components/Home/ActionsDashboardItem.js
  10. 4
    4
      src/components/Home/EventDashboardItem.js
  11. 1
    1
      src/components/Home/FeedItem.js
  12. 1
    1
      src/components/Home/PreviewEventDashboardItem.js
  13. 2
    2
      src/components/Lists/Clubs/ClubListHeader.js
  14. 4
    4
      src/components/Lists/Equipment/EquipmentListItem.js
  15. 1
    1
      src/components/Lists/Proximo/ProximoListItem.js
  16. 9
    9
      src/components/Lists/Proxiwash/ProxiwashListItem.js
  17. 2
    2
      src/components/Lists/Proxiwash/ProxiwashSectionHeader.js
  18. 1
    1
      src/components/Screens/ErrorView.js
  19. 1
    1
      src/components/Screens/WebSectionList.js
  20. 2
    2
      src/managers/LocaleManager.js
  21. 20
    20
      src/navigation/MainNavigator.js
  22. 17
    17
      src/navigation/TabNavigator.js
  23. 12
    12
      src/screens/About/AboutScreen.js
  24. 12
    12
      src/screens/Amicale/AmicaleContactScreen.js
  25. 4
    4
      src/screens/Amicale/Clubs/ClubAboutScreen.js
  26. 5
    5
      src/screens/Amicale/Clubs/ClubDisplayScreen.js
  27. 1
    1
      src/screens/Amicale/Clubs/ClubListScreen.js
  28. 5
    5
      src/screens/Amicale/Equipment/EquipmentConfirmScreen.js
  29. 2
    2
      src/screens/Amicale/Equipment/EquipmentListScreen.js
  30. 9
    9
      src/screens/Amicale/Equipment/EquipmentRentScreen.js
  31. 14
    14
      src/screens/Amicale/LoginScreen.js
  32. 22
    22
      src/screens/Amicale/ProfileScreen.js
  33. 6
    6
      src/screens/Home/HomeScreen.js
  34. 7
    7
      src/screens/Home/ScannerScreen.js
  35. 7
    7
      src/screens/Other/FeedbackScreen.js
  36. 17
    17
      src/screens/Other/SettingsScreen.js
  37. 2
    2
      src/screens/Planex/GroupSelectionScreen.js
  38. 5
    5
      src/screens/Planex/PlanexScreen.js
  39. 1
    1
      src/screens/Planning/PlanningDisplayScreen.js
  40. 3
    3
      src/screens/Planning/PlanningScreen.js
  41. 16
    16
      src/screens/Proxiwash/ProxiwashAboutScreen.js
  42. 22
    22
      src/screens/Proxiwash/ProxiwashScreen.js
  43. 4
    4
      src/screens/Services/Proximo/ProximoAboutScreen.js
  44. 7
    7
      src/screens/Services/Proximo/ProximoListScreen.js
  45. 3
    3
      src/screens/Services/Proximo/ProximoMainScreen.js
  46. 39
    39
      src/screens/Services/ServicesScreen.js
  47. 14
    14
      src/screens/Tetris/TetrisScreen.js
  48. 5
    5
      src/utils/EquipmentBooking.js
  49. 4
    4
      src/utils/Notifications.js
  50. 0
    482
      translations/en.json
  51. 0
    468
      translations/fr.json

+ 1
- 1
__tests__/utils/EquipmentBooking.test.js View File

79
         );
79
         );
80
     jest.spyOn(i18n, 't')
80
     jest.spyOn(i18n, 't')
81
         .mockImplementation((translationString: string) => {
81
         .mockImplementation((translationString: string) => {
82
-                const prefix = "equipmentScreen.";
82
+                const prefix = "screens.equipment.";
83
                 if (translationString === prefix + "otherYear")
83
                 if (translationString === prefix + "otherYear")
84
                     return "0";
84
                     return "0";
85
                 else if (translationString === prefix + "otherMonth")
85
                 else if (translationString === prefix + "otherMonth")

+ 491
- 0
locales/en.json View File

1
+{
2
+  "screens": {
3
+    "services": {
4
+      "title": "Services",
5
+      "categories": {
6
+        "amicale": "The Amicale",
7
+        "students": "Student services",
8
+        "insa": "INSA services"
9
+      },
10
+      "descriptions": {
11
+        "clubs": "See info about your favorite club and discover new ones",
12
+        "profile": "See your personal information",
13
+        "amicaleWebsite": "See more information on the website",
14
+        "vote": "Vote for the upcoming elections",
15
+        "proximo": "Check the store's stock",
16
+        "wiketud": "Read useful info about classes and campus life",
17
+        "elusEtudiants": "The students in contact with the administration",
18
+        "tutorInsa": "Give and take part in tutorials by students",
19
+        "map": "Find your way around the campus",
20
+        "self": "Check the RU menu",
21
+        "availableRooms": "See how many rooms are free",
22
+        "bib": "Book a Bib'Box for project work",
23
+        "mails": "Check your INSA mails",
24
+        "ent": "See your grades",
25
+        "insaAccount": "See your information and change your password",
26
+        "equipment": "Book a BBQ or other equipment"
27
+      },
28
+      "mascotDialog": {
29
+        "title": "So handy!",
30
+        "message": "There a lot of thing you can do with Campus!\n\nHere is a list of every service provided by the app.",
31
+        "button": "Thx buddy"
32
+      }
33
+    },
34
+    "proxiwash": {
35
+      "title": "Proxiwash",
36
+      "dryer": "Dryer",
37
+      "dryers": "Dryers",
38
+      "washer": "Washer",
39
+      "washers": "Washers",
40
+      "min": "min",
41
+      "listUpdated": "Machines state updated",
42
+      "listUpdateFail": "Error while updating machines state",
43
+      "error": "Could not update machines state. Pull down to retry.",
44
+      "loading": "Loading...",
45
+      "description": "This is the washing service operated by Promologis for INSA's residences (We don't mind if you do not live on the campus and you do your laundry here). The room is right next to the R2, with 3 dryers and 9 washers, is open 7d/7 24h/24 ! Here you can check their availability ! You can bring your own detergent, use the one given on site or buy it at the Proximo (cheaper than the one given by the machines ). You can pay by credit card or cash.",
46
+      "informationTab": "Information",
47
+      "paymentTab": "Payment",
48
+      "tariffs": "Tariffs",
49
+      "washersTariff": "3€ the washer + 0.80€ with detergent.",
50
+      "dryersTariff": "0.35€ for 5min of dryer usage.",
51
+      "paymentMethods": "Payment Methods",
52
+      "paymentMethodsDescription": "Cash up until 10€.\nCredit Card also accepted.",
53
+      "washerProcedure": "Put your laundry in the tumble without tamping it and by respecting charge limits.\n\nClose the machine's door.\n\nChoose a program using one of the four favorite program buttons.\n\nPay to the command central, then press the START button on the machine.\n\nWhen the program is finished, the screen indicates 'Programme terminé', press the yellow button to open the lid and retrieve your laundry.",
54
+      "washerTips": "Program 'blanc/couleur': 6kg of dry laundry (cotton linen, linen, underwear, sheets, jeans, towels).\n\nProgram 'non repassable': 3,5 kg of dry laundry (synthetic fibre linen, cotton and polyester mixed).\n\nProgram 'fin 30°C': 2,5 kg of dry laundry (delicate linen in synthetic fibres).\n\nProgram 'laine 30°C': 2,5 kg of dry laundry (wool textiles).",
55
+      "dryerProcedure": "Put your laundry in the tumble without tamping it and by respecting charge limits.\n\nClose the machine's door.\n\nChoose a program using one of the four favorite program buttons.\n\nPay to the command central, then press the START button on the machine.",
56
+      "dryerTips": "The advised dryer length is 35 minutes for 14 kg of laundry. You can choose a shorter length if the dryer is not fully charged.",
57
+      "procedure": "Procedure",
58
+      "tips": "Tips",
59
+      "numAvailable": "available",
60
+      "numAvailablePlural": "available",
61
+      "modal": {
62
+        "enableNotifications": "Notify me",
63
+        "disableNotifications": "Stop notifications",
64
+        "ok": "OK",
65
+        "cancel": "Cancel",
66
+        "finished": "This machine is finished. If you started it, you can get back your laundry.",
67
+        "ready": "This machine is empty and ready to use.",
68
+        "running": "This machine has been started at %{start} and will end at %{end}.\n\nRemaining time: %{remaining} min.\nProgram: %{program}",
69
+        "runningNotStarted": "This machine is ready but not started. Please make sure you pressed the start button.",
70
+        "broken": "This machine is out of order and cannot be used. Thank you for your comprehension.",
71
+        "error": "There has been an error and we are unable to get information from this machine. Sorry for the inconvenience.",
72
+        "unknown": "This machine is in an unknown state. Sorry for the inconvenience.",
73
+        "notificationErrorTitle": "Error",
74
+        "notificationErrorDescription": "Impossible to create notifications. Please make sure you enabled notifications then restart the app."
75
+      },
76
+      "states": {
77
+        "finished": "FINISHED",
78
+        "ready": "READY",
79
+        "running": "RUNNING",
80
+        "runningNotStarted": "NOT STARTED",
81
+        "broken": "OUT OF ORDER",
82
+        "error": "ERROR",
83
+        "unknown": "UNKNOWN"
84
+      },
85
+      "notifications": {
86
+        "machineFinishedTitle": "Laundry Ready",
87
+        "machineFinishedBody": "The machine n°{{number}} is finished and your laundry is ready to pickup",
88
+        "machineRunningTitle": "Laundry running: {{time}} minutes left",
89
+        "machineRunningBody": "The machine n°{{number}} is still running"
90
+      },
91
+      "mascotDialog": {
92
+        "title": "Notifications!",
93
+        "message": "Click on a running machine to enable notifications!\n\nYou will never forget your laundry again.",
94
+        "ok": "Got it!"
95
+      }
96
+    },
97
+    "home": {
98
+      "title": "Home",
99
+      "feed": "Details",
100
+      "listUpdated": "List updated!",
101
+      "listUpdateFail": "Error while updating list",
102
+      "servicesButton": "More services",
103
+      "dashboard": {
104
+        "seeMore": "Click to see more",
105
+        "todayEventsTitle": "Today's events",
106
+        "todayEventsSubtitleNA": "No events today",
107
+        "todayEventsSubtitle": " event coming today",
108
+        "todayEventsSubtitlePlural": " events coming today"
109
+      },
110
+      "mascotDialog": {
111
+        "title": "Welcome, you!",
112
+        "message": "Login to your Amicale account to get access to more services!\n\nYou will still be able to login later.",
113
+        "login": "Login",
114
+        "later": "Later"
115
+      }
116
+    },
117
+    "planning": {
118
+      "title": "Events",
119
+      "eventDetails": "Event details",
120
+      "invalidEvent": "Could not find the event. Please make sure the event you are trying to access is valid.",
121
+      "mascotDialog": {
122
+        "title": "Let's party!",
123
+        "message": "At the INSA, it's not all about classes!\n\nIf you want to see new people, this page is just for you. Here you will find the list of every event organised by students!",
124
+        "button": "Thx!"
125
+      }
126
+    },
127
+    "planex": {
128
+      "title": "Planex",
129
+      "noGroupSelected": "No group selected. Please select your group using the big beautiful red button bellow.",
130
+      "favorites": "Favorites",
131
+      "mascotDialog": {
132
+        "title": "Come here often?",
133
+        "message": "Set it as default screen!\n\nCampus will start on Planex so you never miss a class. Click on the button bellow to navigate to the settings page.",
134
+        "ok": "Yes please!",
135
+        "cancel": "Later"
136
+      }
137
+    },
138
+
139
+    "amicaleAbout": {
140
+      "title": "A question ?",
141
+      "subtitle": "Ask the Amicale",
142
+      "message": "You want to revive a club?\nYou want to start a new project?\nHere are al the contacts you need! Do not hesitate to write a mail or send a message to the Amicale's Facebook page!",
143
+      "roles": {
144
+        "interSchools": "Inter Schools",
145
+        "culture": "Culture",
146
+        "animation": "Animation",
147
+        "clubs": "Clubs",
148
+        "event": "Events",
149
+        "tech": "Technique",
150
+        "communication": "Communication",
151
+        "intraSchools": "Alumni / IAT",
152
+        "publicRelations": "Public Relations"
153
+      }
154
+    },
155
+    "proximo": {
156
+      "title": "Proximo",
157
+      "articleList": "Articles",
158
+      "emptyList": "Empty List",
159
+      "article": "Article",
160
+      "articles": "Articles",
161
+      "sortOrder": "Sort by",
162
+      "sortName": "Name",
163
+      "sortNameReverse": "Name (reverse)",
164
+      "sortPrice": "Price",
165
+      "sortPriceReverse": "Price (reverse)",
166
+      "listUpdated": "Article list updated!",
167
+      "listUpdateFail": "Error while updating article list",
168
+      "loading": "Loading...",
169
+      "inStock": "in stock",
170
+      "description": "The Proximo is your small grocery store maintained by students directly on the campus. Open every day from 18h30 to 19h30, we welcome you when you are short on pastas or sodas ! Different products for different problems, everything at cost price. You can pay by Lydia or cash.",
171
+      "openingHours": "Openning Hours",
172
+      "paymentMethods": "Payment Methods",
173
+      "paymentMethodsDescription": "Cash or Lydia",
174
+      "search": "Search",
175
+      "all": "All"
176
+    },
177
+    "insaAccount": {
178
+      "title": "INSA Account"
179
+    },
180
+    "menu": {
181
+      "title": "RU Menu"
182
+    },
183
+    "websites": {
184
+      "amicale": "Amicale's website",
185
+      "rooms": "Available rooms",
186
+      "bib": "Bib'Box",
187
+      "mails": "INSA Mails",
188
+      "ent": "INSA ENT"
189
+    },
190
+
191
+    "login": {
192
+      "title": "Login",
193
+      "subtitle": "Please enter your credentials",
194
+      "email": "Email",
195
+      "emailError": "Please enter a valid email",
196
+      "password": "Password",
197
+      "passwordError": "Please enter a password",
198
+      "resetPassword": "Forgot Password",
199
+      "whyAccountTitle": "Why have an account?",
200
+      "whyAccountSub": "What can you do wth an account",
201
+      "whyAccountParagraph": "An Amicale account allows you to take part in several activities around campus. You can join a club, or even create your own!",
202
+      "whyAccountParagraph2": "Logging into your Amicale account on the app will allow you to see all available clubs on the campus, vote for the upcoming elections, and more to come!",
203
+      "noAccount": "No Account? Go to the Amicale's building during open hours to create one."
204
+    },
205
+    "profile": {
206
+      "title": "Profile",
207
+      "personalInformation": "Personal information",
208
+      "noData": "No data",
209
+      "editInformation": "Edit Information",
210
+      "clubs": "Your clubs",
211
+      "clubsSubtitle": "Click on a club to show its information",
212
+      "isMember": "Member",
213
+      "isManager": "Manager",
214
+      "membership": "Membership Fee",
215
+      "membershipSubtitle": "Allows you to take part in various activities",
216
+      "membershipPayed": "Payed",
217
+      "membershipNotPayed": "Not payed",
218
+      "welcomeTitle": "Welcome %{name}!",
219
+      "welcomeDescription": "This is your Amicale INSA Toulouse personal space. Bellow are the current services you can access thanks to your account. Feels empty? You're right and we plan on fixing that, so stay tuned!",
220
+      "welcomeFeedback": "We plan on doing more! If you have any suggestions or found bugs, please tell us by clicking the button bellow."
221
+    },
222
+    "clubs": {
223
+      "title": "Clubs",
224
+      "details": "Club details",
225
+      "managers": "Managers",
226
+      "managersSubtitle": "These people make the club live",
227
+      "managersUnavailable": "This club has no one :(",
228
+      "categories": "Categories",
229
+      "categoriesFilterMessage": "Click on a category to filter the list",
230
+      "clubContact": "Contact the club",
231
+      "amicaleContact": "Contact the Amicale",
232
+      "invalidClub": "Could not find the club. Please make sure the club you are trying to access is valid.",
233
+      "about": {
234
+        "text": "The clubs, making the campus live, with more than sixty clubs offering various activities! From the philosophy club to the PABI (Production Artisanale de Bière Insaienne), without forgetting the multiple music and dance clubs, you will surely find an activity that suits you!",
235
+        "title": "A question ?",
236
+        "subtitle": "Ask the Amicale",
237
+        "message": "You have a question concerning the clubs?\nYou want to revive or create a club?\nContact the Amicale at the following address:"
238
+      }
239
+    },
240
+    "vote": {
241
+      "title": "Elections",
242
+      "select": {
243
+        "title": "Elections open",
244
+        "subtitle": "Vote now!",
245
+        "sendButton": "Send Vote",
246
+        "dialogTitle": "Send Vote?",
247
+        "dialogTitleLoading": "Sending vote...",
248
+        "dialogMessage": "Are you sure you want to send your vote? You will not be able to change it."
249
+      },
250
+      "tease": {
251
+        "title": "Elections incoming",
252
+        "subtitle": "Be ready to vote!",
253
+        "message": "Vote start:"
254
+      },
255
+      "wait": {
256
+        "titleSubmitted": "Vote submitted!",
257
+        "titleEnded": "Votes closed",
258
+        "subtitle": "Waiting for results...",
259
+        "messageSubmitted": "Vote submitted successfully.",
260
+        "messageVoted": "Thank you for your participation.",
261
+        "messageDate": "Results available:",
262
+        "messageDateUndefined": "Results will be available shortly"
263
+      },
264
+      "results": {
265
+        "title": "Results",
266
+        "subtitle": "Available until:",
267
+        "totalVotes": "Total votes:",
268
+        "votes": "votes"
269
+      },
270
+      "main": {
271
+        "title": "The Elections",
272
+        "subtitle": "Why your vote is important",
273
+        "paragraph1": "The Amicale's elections is the right moment for you to choose the next team, which will handle different projects on the campus, help organizing your favorite events, animate the campus life during the whole year, and relay your ideas to the administration, so that your campus life is the most enjoyable possible!\nYour turn to make a change!\uD83D\uDE09",
274
+        "paragraph2": "Note: If there is only one list, it is still important to vote to show your support, so that the administration knows the current list is supported by students. It is always a plus when taking difficult decisions! \uD83D\uDE09"
275
+      }
276
+    },
277
+    "equipment": {
278
+      "title": "Equipment Booking",
279
+      "book": "Book",
280
+      "confirm": "Confirmation",
281
+      "message": "Thanks to the Amicale, students have access to some equipment like BBQs and others. To book one of those items, click the equipment of your choice in the list bellow, enter your lend dates, then come around the Amicale to claim it and give your bail.",
282
+      "bail": "Bail: %{cost}€",
283
+      "available": "Available %{date}",
284
+      "today": "today",
285
+      "tomorrow": "tomorrow",
286
+      "thisMonth": "the %{date}",
287
+      "otherMonth": "the %{date} of %{month}",
288
+      "otherYear": "the %{date} of %{month} %{year}",
289
+      "bookingDay": "Booked for %{date}",
290
+      "bookingPeriod": "Booked from %{begin} to %{end}",
291
+      "booking": "Click on the calendar to set the start and end dates",
292
+      "bookButton": "Book selected dates",
293
+      "dialogTitle": "Confirm booking?",
294
+      "dialogTitleLoading": "Sending your booking...",
295
+      "dialogMessage": "Are you sure you want to confirm your booking?\n\nYou will then be able to claim the selected equipment at the Amicale for the duration of your booking in exchange of a bail.",
296
+      "bookingConfirmedMessage": "Do not forget to come by the Amicale to give your bail in exchange of the equipment."
297
+    },
298
+
299
+    "scanner": {
300
+      "title": "Scanotron 3000",
301
+      "permissions": {
302
+        "error": "Scanotron 3000 needs access to the camera in order to scan QR codes.\nThe camera will never be used for any other purpose.",
303
+        "button": "Grant camera access"
304
+      },
305
+      "error": {
306
+        "title": "QR code invalid",
307
+        "message": "The QR code scanned could not be recognised, please make sure it is valid."
308
+      },
309
+      "help": {
310
+        "button": "What can I scan?",
311
+        "title": "How to use Scanotron 3000",
312
+        "message": "Find Campus QR codes posted by clubs and events, scan them and get instant access to detailed information!"
313
+      }
314
+    },
315
+    "settings": {
316
+      "title": "Settings",
317
+      "generalCard": "General",
318
+      "nightMode": "Night Mode",
319
+      "nightModeSubOn": "Your eyes are at peace",
320
+      "nightModeSubOff": "Your eyes are burning",
321
+      "nightModeAuto": "Follow system dark mode",
322
+      "startScreen": "Start Screen",
323
+      "startScreenSub": "Select which screen to start the app on",
324
+      "proxiwashNotifReminder": "Machine running reminder",
325
+      "proxiwashNotifReminderSub": "How many minutes before",
326
+      "information": "Information"
327
+    },
328
+    "about": {
329
+      "title": "About",
330
+      "buttonDesc": "Information about the app and its creator",
331
+      "appstore": "See on the Appstore",
332
+      "playstore": "See on the Playstore",
333
+      "changelog": "Changelog",
334
+      "license": "License",
335
+      "debug": "Debug",
336
+      "team": "Team",
337
+      "author": "Author and maintainer",
338
+      "authorMail": "Send an email",
339
+      "additionalDev": "Development help",
340
+      "technologies": "Technologies",
341
+      "reactNative": "Made with React Native",
342
+      "expo": "Built with Expo",
343
+      "libs": "Libraries used"
344
+    },
345
+    "feedback": {
346
+      "title": "Feedback",
347
+      "bugs": "Report Bugs",
348
+      "bugsSubtitle": "Did you find a bug? Let us know!",
349
+      "bugsDescription": "Reporting bugs helps us make the app better. To do so, use one of the buttons below and be as precise as possible when describing your problem!",
350
+      "feedbackSubtitle": "Let us know what you think!",
351
+      "feedbackDescription": "Do you have a feature you want to be added/changed/removed, want to give your opinion on the app or simply chat with the dev? Use one of the links below!",
352
+      "contactMeans": "Using Gitea is recommended, to use it simply login with your INSA account.",
353
+      "homeButtonTitle": "Feedback/Bug report",
354
+      "homeButtonSubtitle": "Contact the devs"
355
+    },
356
+    "game": {
357
+      "title": "Game",
358
+      "pause": "Game Paused",
359
+      "pauseMessage": "The game is paused",
360
+      "resume": "Resume",
361
+      "restart": {
362
+        "text": "Restart",
363
+        "confirm": "Are you sure you want to restart?",
364
+        "confirmMessage": "You will lose you progress, continue?",
365
+        "confirmYes": "Yes",
366
+        "confirmNo": "No"
367
+      },
368
+      "gameOver": {
369
+        "text": "Game Over",
370
+        "score": "Score: ",
371
+        "level": "Level: ",
372
+        "time": "Time: ",
373
+        "exit": "leave Game"
374
+      }
375
+    },
376
+    "debug": {
377
+      "title": "Debug"
378
+    }
379
+  },
380
+  "intro": {
381
+    "slideMain": {
382
+      "title": "Welcome to CAMPUS",
383
+      "text": "The new app to use during your coffee break to get updates on the campus life!"
384
+    },
385
+    "slideEvents": {
386
+      "title": "Stay up to date",
387
+      "text": "CAMPUS allows you to be aware of any event occurring on the campus, from pancake sales to Enfoiros concerts!"
388
+    },
389
+    "slideProxiwash": {
390
+      "title": "Never forget your laundry",
391
+      "text": "CAMPUS will inform you on the availability of washing machines and will remind you just before yours finishes!"
392
+    },
393
+    "slidePlanex": {
394
+      "title": "Planex",
395
+      "text": "Lookup your next course on CAMPUS with a mobile friendly timetable"
396
+    },
397
+    "slideRU": {
398
+      "title": "RU Menu",
399
+      "text": "For the hungry, check this week's menu!"
400
+    },
401
+    "slideServices": {
402
+      "title": "More services!",
403
+      "text": "You can do much more with CAMPUS, explore the app to find out"
404
+    },
405
+    "slideDone": {
406
+      "title": "Made by a student",
407
+      "text": "This app is the work of one student (with some help here and there), so any feedback is appreciated!"
408
+    },
409
+    "updateSlide0": {
410
+      "title": "New in this update!",
411
+      "text": "Faster than ever and easier to use!\nThis update includes lots of changes to improve your experience.\nUse the brand new feedback button on the home screen to talk to the developer!"
412
+    },
413
+    "updateSlide1": {
414
+      "title": "Improved Planex!",
415
+      "text": "You now have access to new controls, improved display, and you can also mark groups as favorites."
416
+    },
417
+    "updateSlide2": {
418
+      "title": "Scanotron 3000!",
419
+      "text": "Say hello to Scanotron 3000!\nAvailable from the Qr-Code button on the home screen, it will help you get information about clubs and events around the campus.\n(Useless right now but we have hope for next year)"
420
+    },
421
+    "updateSlide3": {
422
+      "title": "Amicale Account!",
423
+      "text": "You can now connect to your Amicale INSAT account from within the app! See all available clubs and more to come!\nClick on the login button from the home screen."
424
+    },
425
+    "aprilFoolsSlide": {
426
+      "title": "New in this update!",
427
+      "text": "We heard you, you don't like the new design and colors, so we changed them!\nLove."
428
+    },
429
+    "buttons": {
430
+      "next": "Next",
431
+      "skip": "Skip",
432
+      "done": "Done"
433
+    }
434
+  },
435
+  "errors": {
436
+    "title": "Error!",
437
+    "badCredentials": "Email or password invalid.",
438
+    "badToken": "You are not logged in. Please login and try again.",
439
+    "noConsent": "You did not give your consent for data processing to the Amicale.",
440
+    "tokenSave": "Could not save session token. Please contact support.",
441
+    "badInput": "Invalid input. Please try again.",
442
+    "forbidden": "You do not have access to this data.",
443
+    "connectionError": "Network error. Please check your internet connection.",
444
+    "serverError": "Server error. Please contact support.",
445
+    "unknown": "Unknown error. Please contact support."
446
+  },
447
+  "dialog": {
448
+    "ok": "OK",
449
+    "yes": "Yes",
450
+    "cancel": "Cancel",
451
+    "disconnect": {
452
+      "title": "Disconnect",
453
+      "titleLoading": "Disconnecting...",
454
+      "message": "Are you sure you want to disconnect from your Amicale account?"
455
+    }
456
+  },
457
+  "general": {
458
+    "loading": "Loading...",
459
+    "retry": "Retry",
460
+    "networkError": "Unable to contact servers. Make sure you are connected to Internet.",
461
+    "goBack": "Go Back",
462
+    "goForward": "Go Forward",
463
+    "openInBrowser": "Open in Browser",
464
+    "notAvailable": "Not available"
465
+  },
466
+  "date": {
467
+    "daysOfWeek": {
468
+      "monday": "Monday",
469
+      "tuesday": "Tuesday",
470
+      "wednesday": "Wednesday",
471
+      "thursday": "Thursday",
472
+      "friday": "Friday",
473
+      "saturday": "Saturday",
474
+      "sunday": "Sunday"
475
+    },
476
+    "monthsOfYear": {
477
+      "january": "January",
478
+      "february": "February",
479
+      "march": "March",
480
+      "april": "April",
481
+      "may": "May",
482
+      "june": "June",
483
+      "july": "July",
484
+      "august": "August",
485
+      "september": "September",
486
+      "october": "October",
487
+      "november": "November",
488
+      "december": "December"
489
+    }
490
+  }
491
+}

+ 491
- 0
locales/fr.json View File

1
+{
2
+  "screens": {
3
+    "services": {
4
+      "title": "Services",
5
+      "categories": {
6
+        "amicale": "L'Amicale",
7
+        "students": "Services étudiants",
8
+        "insa": "Services de l'INSA"
9
+      },
10
+      "descriptions": {
11
+        "clubs": "Voir les informations sur les clubs",
12
+        "profile": "Voir vos informations personnelles",
13
+        "amicaleWebsite": "Plus d'informations sur le site",
14
+        "vote": "Votez pour les prochaines élections",
15
+        "proximo": "Regardez le stock du Proximo",
16
+        "wiketud": "Trouvez des informations utiles sur les cours et la vie du campus",
17
+        "elusEtudiants": "Les étudiants en contact avec l'administration",
18
+        "tutorInsa": "Donnez et bénéficiez de tutorats par d'autres étudiants",
19
+        "map": "Trouvez votre chemin sur le campus",
20
+        "self": "Regardez le menu du RU",
21
+        "availableRooms": "Vérifiez les salles disponibles",
22
+        "bib": "Réservez une Bib'Box pour les travaux de groupe",
23
+        "mails": "Vérifiez vos mails INSA",
24
+        "ent": "Retrouvez vos notes",
25
+        "insaAccount": "Accédez à vos informations et modifiez votre mot de passe",
26
+        "equipment": "Réservez un BBQ ou d'autre matériel"
27
+      },
28
+      "mascotDialog": {
29
+        "title": "",
30
+        "message": "",
31
+        "button": ""
32
+      }
33
+    },
34
+    "proxiwash": {
35
+      "title": "Proxiwash",
36
+      "dryer": "Sèche-Linge",
37
+      "dryers": "Sèche-Linges",
38
+      "washer": "Lave-Linge",
39
+      "washers": "Lave-Linges",
40
+      "min": "min",
41
+      "listUpdated": "État des machines mis à jour",
42
+      "listUpdateFail": "Erreur lors de la mise à jour de l'état des machines",
43
+      "error": "Impossible de mettre a jour l'état des machines. Tirez vers le bas pour réessayer.",
44
+      "loading": "Chargement...",
45
+      "description": "C'est le service de laverie proposé par promologis pour les résidences INSA (On t'en voudra pas si tu loges pas sur le campus et que tu fais ta machine ici). Le local situé au pied du R2 avec ses 3 sèche-linges et 9 machines est ouvert 7J/7 24h/24 ! Ici tu peux vérifier leur disponibilité ! Tu peux amener ta lessive, la prendre sur place ou encore mieux l'acheter au Proximo (moins chère qu'à la laverie directement). Tu peux payer par CB ou espèces.",
46
+      "informationTab": "Informations",
47
+      "paymentTab": "Paiement",
48
+      "tariffs": "Tarifs",
49
+      "washersTariff": "3€ la machine + 0.80€ avec la lessive.",
50
+      "dryersTariff": "0.35€ pour 5min de sèche linge.",
51
+      "paymentMethods": "Moyens de Paiement",
52
+      "paymentMethodsDescription": "Toute monnaie jusqu'à 10€.\nCarte bancaire acceptée.",
53
+      "washerProcedure": "Déposer le linge dans le tambour sans le tasser et en respectant les charges.\n\nFermer la porte de l'appareil.\n\nSélectionner un programme avec l'une des quatre touches de programme favori standard.\n\nAprès avoir payé à la centrale de commande, appuyer sur le bouton marqué START du lave-linge.\n\nDès que le programme est terminé, l’afficheur indique 'Programme terminé', appuyer sur le bouton jaune d’ouverture du hublot pour récupérer le linge.",
54
+      "washerTips": "Programme blanc/couleur : 6kg de linge sec (textiles en coton, lin, linge de corps, draps, jeans,serviettes de toilettes).\n\nProgramme nonrepassable : 3,5 kg de linge sec (textiles en fibres synthétiques, cotonet polyester mélangés).\n\nProgramme fin 30°C : 2,5 kg de linge sec (textiles délicats en fibres synthétiques, rayonne).\n\nProgramme laine 30°C : 2,5 kg de linge sec (textiles en laine et lainages lavables).",
55
+      "dryerProcedure": "Déposer le linge dans le tambour sans le tasser et en respectant les charges.\n\nFermer la porte de l'appareil.\n\nSélectionner un programme avec l'une des quatre touches de programme favori standard.\n\nAprès avoir payé à la centrale de commande, appuyer sur le bouton marqué START du lave-linge.",
56
+      "dryerTips": "La durée conseillée est de 35 minutes pour 14kg de linge. Vous pouvez choisir une durée plus courte si le sèche-linge n'est pas chargé.",
57
+      "procedure": "Procédure",
58
+      "tips": "Conseils",
59
+      "numAvailable": "disponible",
60
+      "numAvailablePlural": "disponibles",
61
+      "modal": {
62
+        "enableNotifications": "Me Notifier",
63
+        "disableNotifications": "Désactiver les  notifications",
64
+        "ok": "OK",
65
+        "cancel": "Annuler",
66
+        "finished": "Cette machine est terminée. Si vous l'avez démarrée, vous pouvez récupérer votre linge.",
67
+        "ready": "Cette machine est vide et prête à être utilisée.",
68
+        "running": "Cette machine a démarré à %{start} et terminera à %{end}.\n\nTemps restant : %{remaining} min.\nProgramme: %{program}",
69
+        "runningNotStarted": "Cette machine est prête mais n'est pas démarrée. Assurez vous de bien avoir appuyé sur le bouton start.",
70
+        "broken": "Cette machine est hors service. Merci pour votre compréhension.",
71
+        "error": "Il y a eu une erreur et il est impossible de récupérer les informations de cette machine. Veuillez nous excuser pour le gène occasionnée.",
72
+        "unknown": "Cette machine est dans un état inconnu. Veuillez nous excuser pour ce problème.",
73
+        "notificationErrorTitle": "Erreur",
74
+        "notificationErrorDescription": "Impossible de créer les notifications. Merci de vérifier que vous avez activé les notifications puis redémarrez l'appli."
75
+      },
76
+      "states": {
77
+        "finished": "TERMINÉ",
78
+        "ready": "DISPONIBLE",
79
+        "running": "EN COURS",
80
+        "runningNotStarted": "NON DÉMARRÉE",
81
+        "broken": "HORS SERVICE",
82
+        "error": "ERREUR",
83
+        "unknown": "INCONNU"
84
+      },
85
+      "notifications": {
86
+        "machineFinishedTitle": "Linge prêt",
87
+        "machineFinishedBody": "La machine n°{{number}} est terminée et votre linge est prêt à être récupéré",
88
+        "machineRunningTitle": "Machine en cours: {{time}} minutes restantes",
89
+        "machineRunningBody": "La machine n°{{number}} n'est pas encore terminée"
90
+      },
91
+      "mascotDialog": {
92
+        "title": "",
93
+        "message": "",
94
+        "ok": ""
95
+      }
96
+    },
97
+    "home": {
98
+      "title": "Accueil",
99
+      "feed": "Détails",
100
+      "listUpdated": "List mise à jour!",
101
+      "listUpdateFail": "Erreur lors de la mise à jour de la liste",
102
+      "servicesButton": "Plus de services",
103
+      "dashboard": {
104
+        "seeMore": "Cliquez pour plus d'infos",
105
+        "todayEventsTitle": "Événements aujourd'hui",
106
+        "todayEventsSubtitleNA": "Pas d'événement",
107
+        "todayEventsSubtitle": " événement aujourd'hui",
108
+        "todayEventsSubtitlePlural": " événements aujourd'hui"
109
+      },
110
+      "mascotDialog": {
111
+        "title": "Welcome, you!",
112
+        "message": "Connectez-vous à votre compte Amicale pour profiter de plus de services !",
113
+        "login": "Se Connecter",
114
+        "later": "Plus Tard"
115
+      }
116
+    },
117
+    "planning": {
118
+      "title": "Événements",
119
+      "eventDetails": "Détails",
120
+      "invalidEvent": "Impossible de trouver l'événement. Merci de vérifier que l'événement que vous voulez voir est valide.",
121
+      "mascotDialog": {
122
+        "title": "",
123
+        "message": "",
124
+        "button": ""
125
+      }
126
+    },
127
+    "planex": {
128
+      "title": "Planex",
129
+      "noGroupSelected": "Pas de groupe sélectionné. Merci de choisir un groupe avec le beau bouton rouge ci-dessous.",
130
+      "favorites": "Favoris",
131
+      "mascotDialog": {
132
+        "title": "",
133
+        "message": "",
134
+        "ok": "",
135
+        "cancel": ""
136
+      }
137
+    },
138
+
139
+    "amicaleAbout": {
140
+      "title": "Une Question ?",
141
+      "subtitle": "Posez vos questions à l'Amicale",
142
+      "message": "Vous voulez reprendre un club ?\nVous voulez vous lancer dans un projet ?\nVoici tous les contacts de l'amicale ! N'hésitez pas à nous écrire par mail ou sur la page facebook de l'Amicale !",
143
+      "roles": {
144
+        "interSchools": "Inter Écoles",
145
+        "culture": "Culture",
146
+        "animation": "Animation",
147
+        "clubs": "Clubs",
148
+        "event": "Événements",
149
+        "tech": "Technique",
150
+        "communication": "Communication",
151
+        "intraSchools": "Alumni / IAT",
152
+        "publicRelations": "Relations Publiques"
153
+      }
154
+    },
155
+    "proximo": {
156
+      "title": "Proximo",
157
+      "articleList": "Articles",
158
+      "emptyList": "Liste Vide",
159
+      "article": "Article",
160
+      "articles": "Articles",
161
+      "sortOrder": "Trier par :",
162
+      "sortName": "Nom",
163
+      "sortNameReverse": "Nom (inversé)",
164
+      "sortPrice": "Prix",
165
+      "sortPriceReverse": "Prix (inversé)",
166
+      "listUpdated": "Liste d'articles mise à jour !",
167
+      "listUpdateFail": "Erreur lors de la mise à jour de la list d'articles",
168
+      "loading": "Chargement...",
169
+      "inStock": "en stock",
170
+      "description": "Le Proximo c’est ta petite épicerie étudiante tenue par les étudiants directement sur le campus. Ouverte tous les jours de 18h30 à 19h30, nous t’accueillons et te sauvons quand tu n’as plus de pâtes ou de diluant ! Différents produits pour différentes galères, le tout à prix coûtant. Tu peux payer par Lydia ou par espèce.",
171
+      "openingHours": "Horaires d'ouverture",
172
+      "paymentMethods": "Moyens de Paiement",
173
+      "paymentMethodsDescription": "Espèce ou Lydia",
174
+      "search": "Rechercher",
175
+      "all": "Tout"
176
+    },
177
+    "insaAccount": {
178
+      "title": "INSA Account"
179
+    },
180
+    "menu": {
181
+      "title": "RU Menu"
182
+    },
183
+    "websites": {
184
+      "amicale": "Amicale's website",
185
+      "rooms": "Available rooms",
186
+      "bib": "Bib'Box",
187
+      "mails": "INSA Mails",
188
+      "ent": "INSA ENT"
189
+    },
190
+
191
+    "login": {
192
+      "title": "Connexion",
193
+      "subtitle": "Entrez vos identifiants",
194
+      "email": "Email",
195
+      "emailError": "Merci d'entrer un email valide",
196
+      "password": "Mot de passe",
197
+      "passwordError": "Merci d'entrer un mot de passe",
198
+      "resetPassword": "Mdp oublié",
199
+      "whyAccountTitle": "Un compte ?",
200
+      "whyAccountSub": "Ce qu'un compte vous apporte",
201
+      "whyAccountParagraph": "Un compte Amicale vous donne la possibilité de participer à diverses activités sur le campus. Vous pouvez rejoindre des clubs ou même créer le votre !",
202
+      "whyAccountParagraph2": "Vous connecter à votre compte Amicale sur l'appli vous permettra de voir tous les clubs en activité, de voter pour les prochaines élections, et plus à venir !",
203
+      "noAccount": "Pas de compte ? Passez à l'Amicale pendant une perm pour en créer un."
204
+    },
205
+    "profile": {
206
+      "title": "Profil",
207
+      "personalInformation": "Informations Personnelles",
208
+      "noData": "Pas de données",
209
+      "editInformation": "Modifier les informations",
210
+      "clubs": "Vos clubs",
211
+      "clubsSubtitle": "Cliquez sur un club pour afficher ses informations",
212
+      "isMember": "Membre",
213
+      "isManager": "Responsable",
214
+      "membership": "Cotisation",
215
+      "membershipSubtitle": "Permet de participer à diverses activités",
216
+      "membershipPayed": "Payée",
217
+      "membershipNotPayed": "Non payée",
218
+      "welcomeTitle": "Bonjour %{name} !",
219
+      "welcomeDescription": "Ceci est votre espace personnel Amicale INSA Toulouse. Vous trouverez ci-dessous les services disponibles avec votre compte. Un peu vide ? Vous avez raison et nous allons essayer de corriger ça, donc restez à jour !",
220
+      "welcomeFeedback": "Nous allons essayer de proposer plus de services ! Si vous avez des suggestions, ou avez trouvé des bugs, merci de nous contacter avec le bouton ci-dessous."
221
+    },
222
+    "clubs": {
223
+      "title": "Liste des Clubs",
224
+      "details": "Détails",
225
+      "managers": "Responsables",
226
+      "managersSubtitle": "Ces personnes font vivre le club",
227
+      "managersUnavailable": "Ce club est tout seul :(",
228
+      "categories": "Catégories",
229
+      "categoriesFilterMessage": "Cliquez sur une catégorie pour filtrer la liste",
230
+      "clubContact": "Contacter le club",
231
+      "amicaleContact": "Contacter l'Amicale",
232
+      "invalidClub": "Impossible de trouver le club. Merci de vérifier que le club que vous voulez voir est valide.",
233
+      "about": {
234
+        "text": "Les clubs, c'est ce qui fait vivre le campus au quotidien, plus d'une soixantaine de clubs qui proposent des activités diverses et variées ! Du club Philosophie au PABI (Production Artisanale de Bière Insaienne), en passant par les multiples clubs de musique et de danse, vous trouverez forcément une activité qui vous permettra de vous épanouir sur le campus !",
235
+        "title": "Une question ?",
236
+        "subtitle": "Posez vos questions à l'Amicale",
237
+        "message": "Vous avez question concernant les clubs ?\nVous voulez reprendre ou créer un club ?\nContactez les responsables au mail ci-dessous :"
238
+      }
239
+    },
240
+    "vote": {
241
+      "title": "Élections",
242
+      "select": {
243
+        "title": "Élections ouvertes",
244
+        "subtitle": "Votez maintenant !",
245
+        "sendButton": "Envoyer votre vote",
246
+        "dialogTitle": "Envoyer votre vote ?",
247
+        "dialogTitleLoading": "Envoi du vote...",
248
+        "dialogMessage": "Êtes vous sûr de vouloir envoyer votre vote ? Vous ne pourrez plus le changer."
249
+      },
250
+      "tease": {
251
+        "title": "Les élections arrivent",
252
+        "subtitle": "Préparez vous à voter !",
253
+        "message": "Début des votes :"
254
+      },
255
+      "wait": {
256
+        "titleSubmitted": "Vote envoyé !",
257
+        "titleEnded": "Votes fermés",
258
+        "subtitle": "Attente des résultats...",
259
+        "messageSubmitted": "Votre vote a bien été envoyé.",
260
+        "messageVoted": "Merci pour votre participation.",
261
+        "messageDate": "Disponibilité des résultats :",
262
+        "messageDateUndefined": "les résultats seront disponibles sous peu."
263
+      },
264
+      "results": {
265
+        "title": "Résultats",
266
+        "subtitle": "Disponibles jusqu'à :",
267
+        "totalVotes": "Nombre total de votes :",
268
+        "votes": "votes"
269
+      },
270
+      "main": {
271
+        "title": "Les Élections",
272
+        "subtitle": "Pourquoi votre vote est important",
273
+        "paragraph1": "Les élections de l'amicale, c'est le moment pour vous de choisir la prochaine équipe qui portera les différents projets du campus, qui soutiendra les organisations de vos événements favoris, qui vous proposera des animations tout au long de l'année, et qui poussera vos idées à l’administration pour que la vie de campus soit des plus riches !\nAlors à vous de jouer ! \uD83D\uDE09",
274
+        "paragraph2": "NB : Si par cas il n'y a qu'une liste qui se présente, il est important que tout le monde vote, afin qui la liste puisse montrer à l’administration que les INSAiens la soutiennent ! Ça compte toujours pour les décisions difficiles ! \uD83D\uDE09"
275
+      }
276
+    },
277
+    "equipment": {
278
+      "title": "Réservation de Matériel",
279
+      "book": "Réserver",
280
+      "confirm": "Confirmation",
281
+      "message": "L'Amicale mets à disposition des étudiants du matériel comme des BBQ, des appareils à raclette et autres. Pour réserver l'un de ces formidables appareils, cliquez sur celui de votre choix dans la liste, indiquez les dates du prêt, puis passez à l'Amicale pour le récupérer et donner votre caution.",
282
+      "bail": "Caution : %{cost}€",
283
+      "available": "",
284
+      "today": "",
285
+      "tomorrow": "",
286
+      "thisMonth": "",
287
+      "otherMonth": "",
288
+      "otherYear": "",
289
+      "bookingDay": "",
290
+      "bookingPeriod": "",
291
+      "booking": "",
292
+      "bookButton": "",
293
+      "dialogTitle": "",
294
+      "dialogTitleLoading": "",
295
+      "dialogMessage": "",
296
+      "bookingConfirmedMessage": ""
297
+    },
298
+
299
+    "scanner": {
300
+      "title": "Scanotron 3000",
301
+      "permissions": {
302
+        "error": "Scanotron 3000 a besoin d'accéder à la caméra pour scanner des QR codes.\nLa caméra ne sera jamais utilisée autrement.",
303
+        "button": "Autoriser l'accès à la caméra"
304
+      },
305
+      "error": {
306
+        "title": "QR code invalide",
307
+        "message": "Le QR code scannée n'a pas été reconnu. Merci de vérifier sa validité."
308
+      },
309
+      "help": {
310
+        "button": "Quoi scanner ?",
311
+        "title": "Comment utiliser Scanotron 3000",
312
+        "message": "Trouvez des QR codes Campus affichés par des clubs ou des respo d'évenements, scannez les et accédez à des informations détaillées !"
313
+      }
314
+    },
315
+    "settings": {
316
+      "title": "Paramètres",
317
+      "generalCard": "Général",
318
+      "nightMode": "Mode Nuit",
319
+      "nightModeSubOn": "Vos yeux vous remercient",
320
+      "nightModeSubOff": "Vos yeux brulent",
321
+      "nightModeAuto": "Mode nuit système",
322
+      "startScreen": "Écran de démarrage",
323
+      "startScreenSub": "Choisissez l'écran utilisé au démarrage",
324
+      "proxiwashNotifReminder": "Rappel de machine en cours",
325
+      "proxiwashNotifReminderSub": "Combien de minutes avant",
326
+      "information": "Informations"
327
+    },
328
+    "about": {
329
+      "title": "À Propos",
330
+      "buttonDesc": "Informations sur l'appli et son créateur",
331
+      "appstore": "Voir sur l'Appstore",
332
+      "playstore": "Voir sur le Playstore",
333
+      "changelog": "Historique des modifications",
334
+      "license": "Licence",
335
+      "debug": "Debug",
336
+      "team": "Équipe",
337
+      "author": "Auteur et mainteneur",
338
+      "authorMail": "Envoyer un mail",
339
+      "additionalDev": "Aide au développement",
340
+      "technologies": "Technologies",
341
+      "reactNative": "Créé avec React Native",
342
+      "expo": "Compilé avec Expo",
343
+      "libs": "Librairies utilisées"
344
+    },
345
+    "feedback": {
346
+      "title": "Feedback",
347
+      "bugs": "Rapporter des Bugs",
348
+      "bugsSubtitle": "Vous avez trouvé un bug ?",
349
+      "bugsDescription": "Rapporter les bugs nous aide à améliorer l'appli. Pour cela, merci d'utiliser un des boutons ci-dessous et de décrire votre problème le plus précisément possible !",
350
+      "feedbackSubtitle": "Dites nous ce que vous pensez !",
351
+      "feedbackDescription": "Vous voulez voir une fonctionnalité ajoutée/modifiée/supprimée ? Vous voulez donner votre opinion sur l'appli ou simplement discuter avec le développeur ? Utilisez un des liens ci-dessous !",
352
+      "contactMeans": "L'utilisation de Gitea est recommandée, pour l'utiliser, connectez vous avec vos identifiants INSA.",
353
+      "homeButtonTitle": "Feedback/Bugs",
354
+      "homeButtonSubtitle": "Contacter le développeur"
355
+    },
356
+    "game": {
357
+      "title": "Jeu",
358
+      "pause": "Pause",
359
+      "pauseMessage": "Le jeu est en pause",
360
+      "resume": "Continuer",
361
+      "restart": {
362
+        "text": "Redémarrer",
363
+        "confirm": "Êtes vous sûr de vouloir redémarrer ?",
364
+        "confirmMessage": "Tout votre progrès sera perdu, continuer ?",
365
+        "confirmYes": "Oui",
366
+        "confirmNo": "Non"
367
+      },
368
+      "gameOver": {
369
+        "text": "Game Over",
370
+        "score": "Score: ",
371
+        "level": "Niveau: ",
372
+        "time": "Temps: ",
373
+        "exit": "Quitter"
374
+      }
375
+    },
376
+    "debug": {
377
+      "title": "Debug"
378
+    }
379
+  },
380
+  "intro": {
381
+    "slideMain": {
382
+      "title": "Bienvenue sur CAMPUS",
383
+      "text": "La nouvelle appli à consulter pendant la pause café pour être au courant de la vie du campus !"
384
+    },
385
+    "slideEvents": {
386
+      "title": "Restez informés",
387
+      "text": "CAMPUS vous permet d'être au courant de tous les événements qui ont lieu sur le campus, de la vente de crêpes jusqu'aux concerts enfoiros !"
388
+    },
389
+    "slideProxiwash": {
390
+      "title": "N'oubliez plus votre linge !",
391
+      "text": "CAMPUS vous informe de la disponibilité des machines et vous permet d'être notifié lorsque la vôtre se termine bientôt !"
392
+    },
393
+    "slidePlanex": {
394
+      "title": "Planex",
395
+      "text": "Vérifiez votre prochain cours sur CAMPUS avec un emploi du temps adapté mobile"
396
+    },
397
+    "slideRU": {
398
+      "title": "Menu du RU",
399
+      "text": "Pour ceux qui ont faim, vérifiez le menu du RU de la semaine !"
400
+    },
401
+    "slideServices": {
402
+      "title": "Encore plus de services !",
403
+      "text": "CAMPUS vous permet de faire bien plus, explorez l'appli pour savoir quoi"
404
+    },
405
+    "slideDone": {
406
+      "title": "Fait par un étudiant",
407
+      "text": "Cette appli à été réalisée par un seul étudiant (avec un peu d'aide par-ci par-là), donc tous les retours sont les bienvenus !"
408
+    },
409
+    "updateSlide0": {
410
+      "title": "Nouveau dans cette mise à jour !",
411
+      "text": "Plus rapide que jamais et plus simple à utiliser !\nCette mise à jour contient de nombreux changements pour améliorer votre expérience.\nUtilisez le tout nouveau bouton de Feedback pour parler directement au développeur!"
412
+    },
413
+    "updateSlide1": {
414
+      "title": "Planex tout beau !",
415
+      "text": "Vous avez maintenant accès à de nouveaux contrôles, un affichage amélioré, et vous pouvez marquer des groupes en favoris."
416
+    },
417
+    "updateSlide2": {
418
+      "title": "Scanotron 3000 !",
419
+      "text": "Dites bonjour à Scanotron 3000 !\nDisponible depuis le bouton Qr-Code sur le menu principal, il vous aidera à avoir des informations sur les clubs et les événements du campus.\n(Inutile tout de suite mais on verra l'année pro)"
420
+    },
421
+    "updateSlide3": {
422
+      "title": "Compte Amicale !",
423
+      "text": "Vous pouvez maintenant vous connecter à votre compte Amicale depuis l'appli ! Accédez à la liste des clubs et plus à venir !\nCliquez sur le bouton Se Connecter dans le menu principal."
424
+    },
425
+    "aprilFoolsSlide": {
426
+      "title": "Nouveau dans cette mise à jour !",
427
+      "text": "Nous vous avons entendu, vous n'aimez pas le nouveau design et couleurs, alors on les as changés !\nLa bise."
428
+    },
429
+    "buttons": {
430
+      "next": "Suivant",
431
+      "skip": "Passer",
432
+      "done": "Commencer"
433
+    }
434
+  },
435
+  "errors": {
436
+    "title": "Erreur !",
437
+    "badCredentials": "Email ou mot de passe invalide.",
438
+    "badToken": "Vous n'êtes pas connecté. Merci de vous connecter puis réessayez.",
439
+    "noConsent": "Vous n'avez pas donné votre consentement pour l'utilisation de vos données personnelles.",
440
+    "tokenSave": "Impossible de sauvegarder le token de session. Merci de contacter le support.",
441
+    "badInput": "Entrée invalide. Merci de réessayer.",
442
+    "forbidden": "Vous n'avez pas accès à cette information.",
443
+    "connectionError": "Erreur de réseau. Merci de vérifier votre connexion Internet.",
444
+    "serverError": "Erreur de serveur. Merci de contacter le support.",
445
+    "unknown": "Erreur inconnue. Merci de contacter le support."
446
+  },
447
+  "dialog": {
448
+    "ok": "OK",
449
+    "yes": "Oui",
450
+    "cancel": "Annuler",
451
+    "disconnect": {
452
+      "title": "Déconnexion",
453
+      "titleLoading": "Déconnexion...",
454
+      "message": "Voulez vous vraiment vous déconnecter de votre compte Amicale ??"
455
+    }
456
+  },
457
+  "general": {
458
+    "loading": "Chargement...",
459
+    "retry": "Réessayer",
460
+    "networkError": "Impossible de contacter les serveurs. Assurez-vous d'être connecté à internet.",
461
+    "goBack": "Suivant",
462
+    "goForward": "Précédent",
463
+    "openInBrowser": "Ouvrir dans le navigateur",
464
+    "notAvailable": "Non disponible"
465
+  },
466
+  "date": {
467
+    "daysOfWeek": {
468
+      "monday": "Lundi",
469
+      "tuesday": "Mardi",
470
+      "wednesday": "Mercredi",
471
+      "thursday": "Jeudi",
472
+      "friday": "Vendredi",
473
+      "saturday": "Samedi",
474
+      "sunday": "Dimanche"
475
+    },
476
+    "monthsOfYear": {
477
+      "january": "Janvier",
478
+      "february": "Février",
479
+      "march": "Mars",
480
+      "april": "Avril",
481
+      "may": "Mai",
482
+      "june": "Juin",
483
+      "july": "Juillet",
484
+      "august": "Août",
485
+      "september": "Septembre",
486
+      "october": "Octobre",
487
+      "november": "Novembre",
488
+      "december": "Décembre"
489
+    }
490
+  }
491
+}

+ 4
- 4
src/components/Amicale/Vote/VoteResults.js View File

63
             }}>
63
             }}>
64
                 <List.Item
64
                 <List.Item
65
                     title={item.name}
65
                     title={item.name}
66
-                    description={item.votes + ' ' + i18n.t('voteScreen.results.votes')}
66
+                    description={item.votes + ' ' + i18n.t('screens.vote.results.votes')}
67
                     left={props => isWinner
67
                     left={props => isWinner
68
                         ? <List.Icon {...props} icon={isDraw ? "trophy-outline" : "trophy"} color={colors.primary}/>
68
                         ? <List.Icon {...props} icon={isDraw ? "trophy-outline" : "trophy"} color={colors.primary}/>
69
                         : null}
69
                         : null}
83
         return (
83
         return (
84
             <Card style={styles.card}>
84
             <Card style={styles.card}>
85
                 <Card.Title
85
                 <Card.Title
86
-                    title={i18n.t('voteScreen.results.title')}
87
-                    subtitle={i18n.t('voteScreen.results.subtitle') + ' ' + this.props.dateEnd}
86
+                    title={i18n.t('screens.vote.results.title')}
87
+                    subtitle={i18n.t('screens.vote.results.subtitle') + ' ' + this.props.dateEnd}
88
                     left={(props) => <Avatar.Icon
88
                     left={(props) => <Avatar.Icon
89
                         {...props}
89
                         {...props}
90
                         icon={"podium-gold"}
90
                         icon={"podium-gold"}
91
                     />}
91
                     />}
92
                 />
92
                 />
93
                 <Card.Content>
93
                 <Card.Content>
94
-                    <Subheading>{i18n.t('voteScreen.results.totalVotes') + ' ' + this.totalVotes}</Subheading>
94
+                    <Subheading>{i18n.t('screens.vote.results.totalVotes') + ' ' + this.totalVotes}</Subheading>
95
                     {/*$FlowFixMe*/}
95
                     {/*$FlowFixMe*/}
96
                     <FlatList
96
                     <FlatList
97
                         data={this.props.teams}
97
                         data={this.props.teams}

+ 6
- 6
src/components/Amicale/Vote/VoteSelect.js View File

75
             <View>
75
             <View>
76
                 <Card style={styles.card}>
76
                 <Card style={styles.card}>
77
                     <Card.Title
77
                     <Card.Title
78
-                        title={i18n.t('voteScreen.select.title')}
79
-                        subtitle={i18n.t('voteScreen.select.subtitle')}
78
+                        title={i18n.t('screens.vote.select.title')}
79
+                        subtitle={i18n.t('screens.vote.select.subtitle')}
80
                         left={(props) =>
80
                         left={(props) =>
81
                             <Avatar.Icon
81
                             <Avatar.Icon
82
                                 {...props}
82
                                 {...props}
105
                             style={{marginLeft: 'auto'}}
105
                             style={{marginLeft: 'auto'}}
106
                             disabled={this.state.selectedTeam === "none"}
106
                             disabled={this.state.selectedTeam === "none"}
107
                         >
107
                         >
108
-                            {i18n.t('voteScreen.select.sendButton')}
108
+                            {i18n.t('screens.vote.select.sendButton')}
109
                         </Button>
109
                         </Button>
110
                     </Card.Actions>
110
                     </Card.Actions>
111
                 </Card>
111
                 </Card>
113
                     visible={this.state.voteDialogVisible}
113
                     visible={this.state.voteDialogVisible}
114
                     onDismiss={this.onVoteDialogDismiss}
114
                     onDismiss={this.onVoteDialogDismiss}
115
                     onAccept={this.onVoteDialogAccept}
115
                     onAccept={this.onVoteDialogAccept}
116
-                    title={i18n.t('voteScreen.select.dialogTitle')}
117
-                    titleLoading={i18n.t('voteScreen.select.dialogTitleLoading')}
118
-                    message={i18n.t('voteScreen.select.dialogMessage')}
116
+                    title={i18n.t('screens.vote.select.dialogTitle')}
117
+                    titleLoading={i18n.t('screens.vote.select.dialogTitleLoading')}
118
+                    message={i18n.t('screens.vote.select.dialogMessage')}
119
                 />
119
                 />
120
                 <ErrorDialog
120
                 <ErrorDialog
121
                     visible={this.state.errorDialogVisible}
121
                     visible={this.state.errorDialogVisible}

+ 3
- 3
src/components/Amicale/Vote/VoteTease.js View File

19
         return (
19
         return (
20
             <Card style={styles.card}>
20
             <Card style={styles.card}>
21
                 <Card.Title
21
                 <Card.Title
22
-                    title={i18n.t('voteScreen.tease.title')}
23
-                    subtitle={i18n.t('voteScreen.tease.subtitle')}
22
+                    title={i18n.t('screens.vote.tease.title')}
23
+                    subtitle={i18n.t('screens.vote.tease.subtitle')}
24
                     left={props => <Avatar.Icon
24
                     left={props => <Avatar.Icon
25
                         {...props}
25
                         {...props}
26
                         icon="vote"/>}
26
                         icon="vote"/>}
27
                 />
27
                 />
28
                 <Card.Content>
28
                 <Card.Content>
29
                     <Paragraph>
29
                     <Paragraph>
30
-                        {i18n.t('voteScreen.tease.message') + ' ' + this.props.startDate}
30
+                        {i18n.t('screens.vote.tease.message') + ' ' + this.props.startDate}
31
                     </Paragraph>
31
                     </Paragraph>
32
                 </Card.Content>
32
                 </Card.Content>
33
             </Card>
33
             </Card>

+ 4
- 4
src/components/Amicale/Vote/VoteTitle.js View File

17
         return (
17
         return (
18
             <Card style={styles.card}>
18
             <Card style={styles.card}>
19
                 <Card.Title
19
                 <Card.Title
20
-                    title={i18n.t('voteScreen.title.title')}
21
-                    subtitle={i18n.t('voteScreen.title.subtitle')}
20
+                    title={i18n.t('screens.vote.main.title')}
21
+                    subtitle={i18n.t('screens.vote.main.subtitle')}
22
                     left={(props) => <Avatar.Image
22
                     left={(props) => <Avatar.Image
23
                         {...props}
23
                         {...props}
24
                         source={ICON_AMICALE}
24
                         source={ICON_AMICALE}
27
                 />
27
                 />
28
                 <Card.Content>
28
                 <Card.Content>
29
                     <Paragraph>
29
                     <Paragraph>
30
-                        {i18n.t('voteScreen.title.paragraph1')}
30
+                        {i18n.t('screens.vote.main.paragraph1')}
31
                     </Paragraph>
31
                     </Paragraph>
32
                     <Paragraph>
32
                     <Paragraph>
33
-                        {i18n.t('voteScreen.title.paragraph2')}
33
+                        {i18n.t('screens.vote.main.paragraph2')}
34
                     </Paragraph>
34
                     </Paragraph>
35
                 </Card.Content>
35
                 </Card.Content>
36
             </Card>
36
             </Card>

+ 7
- 7
src/components/Amicale/Vote/VoteWait.js View File

27
             <Card style={styles.card}>
27
             <Card style={styles.card}>
28
                 <Card.Title
28
                 <Card.Title
29
                     title={this.props.isVoteRunning
29
                     title={this.props.isVoteRunning
30
-                        ? i18n.t('voteScreen.wait.titleSubmitted')
31
-                        : i18n.t('voteScreen.wait.titleEnded')}
32
-                    subtitle={i18n.t('voteScreen.wait.subtitle')}
30
+                        ? i18n.t('screens.vote.wait.titleSubmitted')
31
+                        : i18n.t('screens.vote.wait.titleEnded')}
32
+                    subtitle={i18n.t('screens.vote.wait.subtitle')}
33
                     left={(props) => <ActivityIndicator {...props}/>}
33
                     left={(props) => <ActivityIndicator {...props}/>}
34
                 />
34
                 />
35
                 <Card.Content>
35
                 <Card.Content>
36
                     {
36
                     {
37
                         this.props.justVoted
37
                         this.props.justVoted
38
                             ? <Paragraph style={{color: colors.success}}>
38
                             ? <Paragraph style={{color: colors.success}}>
39
-                                {i18n.t('voteScreen.wait.messageSubmitted')}
39
+                                {i18n.t('screens.vote.wait.messageSubmitted')}
40
                             </Paragraph>
40
                             </Paragraph>
41
                             : null
41
                             : null
42
                     }
42
                     }
43
                     {
43
                     {
44
                         this.props.hasVoted
44
                         this.props.hasVoted
45
                             ? <Paragraph style={{color: colors.success}}>
45
                             ? <Paragraph style={{color: colors.success}}>
46
-                                {i18n.t('voteScreen.wait.messageVoted')}
46
+                                {i18n.t('screens.vote.wait.messageVoted')}
47
                             </Paragraph>
47
                             </Paragraph>
48
                             : null
48
                             : null
49
                     }
49
                     }
50
                     {
50
                     {
51
                         startDate != null
51
                         startDate != null
52
                             ? <Paragraph>
52
                             ? <Paragraph>
53
-                                {i18n.t('voteScreen.wait.messageDate') + ' ' + startDate}
53
+                                {i18n.t('screens.vote.wait.messageDate') + ' ' + startDate}
54
                             </Paragraph>
54
                             </Paragraph>
55
-                            : <Paragraph>{i18n.t('voteScreen.wait.messageDateUndefined')}</Paragraph>
55
+                            : <Paragraph>{i18n.t('screens.vote.wait.messageDateUndefined')}</Paragraph>
56
                     }
56
                     }
57
                 </Card.Content>
57
                 </Card.Content>
58
             </Card>
58
             </Card>

+ 2
- 2
src/components/Home/ActionsDashboardItem.js View File

22
         return (
22
         return (
23
             <View>
23
             <View>
24
                 <List.Item
24
                 <List.Item
25
-                    title={i18n.t("feedbackScreen.homeButtonTitle")}
26
-                    description={i18n.t("feedbackScreen.homeButtonSubtitle")}
25
+                    title={i18n.t("screens.feedback.homeButtonTitle")}
26
+                    description={i18n.t("screens.feedback.homeButtonSubtitle")}
27
                     left={props => <List.Icon {...props} icon={"bug"}/>}
27
                     left={props => <List.Icon {...props} icon={"bug"}/>}
28
                     right={props => <List.Icon {...props} icon={"chevron-right"}/>}
28
                     right={props => <List.Icon {...props} icon={"chevron-right"}/>}
29
                     onPress={() => this.props.navigation.navigate("feedback")}
29
                     onPress={() => this.props.navigation.navigate("feedback")}

+ 4
- 4
src/components/Home/EventDashboardItem.js View File

40
                     <Text style={{fontWeight: "bold"}}>{props.eventNumber}</Text>
40
                     <Text style={{fontWeight: "bold"}}>{props.eventNumber}</Text>
41
                     <Text>
41
                     <Text>
42
                         {props.eventNumber > 1
42
                         {props.eventNumber > 1
43
-                            ? i18n.t('homeScreen.dashboard.todayEventsSubtitlePlural')
44
-                            : i18n.t('homeScreen.dashboard.todayEventsSubtitle')}
43
+                            ? i18n.t('screens.home.dashboard.todayEventsSubtitlePlural')
44
+                            : i18n.t('screens.home.dashboard.todayEventsSubtitle')}
45
                     </Text>
45
                     </Text>
46
                 </Text>;
46
                 </Text>;
47
         } else
47
         } else
48
-            subtitle = i18n.t('homeScreen.dashboard.todayEventsSubtitleNA');
48
+            subtitle = i18n.t('screens.home.dashboard.todayEventsSubtitleNA');
49
         return (
49
         return (
50
             <Card
50
             <Card
51
                 style={styles.card}
51
                 style={styles.card}
52
                 onPress={props.clickAction}>
52
                 onPress={props.clickAction}>
53
                 <Card.Title
53
                 <Card.Title
54
-                    title={i18n.t('homeScreen.dashboard.todayEventsTitle')}
54
+                    title={i18n.t('screens.home.dashboard.todayEventsTitle')}
55
                     titleStyle={{color: textColor}}
55
                     titleStyle={{color: textColor}}
56
                     subtitle={subtitle}
56
                     subtitle={subtitle}
57
                     subtitleStyle={{color: textColor}}
57
                     subtitleStyle={{color: textColor}}

+ 1
- 1
src/components/Home/FeedItem.js View File

107
                         onPress={this.onPress}
107
                         onPress={this.onPress}
108
                         icon={'plus'}
108
                         icon={'plus'}
109
                         style={{marginLeft: 'auto'}}>
109
                         style={{marginLeft: 'auto'}}>
110
-                        {i18n.t('homeScreen.dashboard.seeMore')}
110
+                        {i18n.t('screens.home.dashboard.seeMore')}
111
                     </Button>
111
                     </Button>
112
                 </Card.Actions>
112
                 </Card.Actions>
113
             </Card>
113
             </Card>

+ 1
- 1
src/components/Home/PreviewEventDashboardItem.js View File

58
                         <Button
58
                         <Button
59
                             icon={'chevron-right'}
59
                             icon={'chevron-right'}
60
                         >
60
                         >
61
-                            {i18n.t("homeScreen.dashboard.seeMore")}
61
+                            {i18n.t("screens.home.dashboard.seeMore")}
62
                         </Button>
62
                         </Button>
63
                     </Card.Actions>
63
                     </Card.Actions>
64
                 </Card>
64
                 </Card>

+ 2
- 2
src/components/Lists/Clubs/ClubListHeader.js View File

46
         return (
46
         return (
47
             <Card style={styles.card}>
47
             <Card style={styles.card}>
48
                 <AnimatedAccordion
48
                 <AnimatedAccordion
49
-                    title={i18n.t("clubs.categories")}
49
+                    title={i18n.t("screens.clubs.categories")}
50
                     left={props => <List.Icon {...props} icon="star"/>}
50
                     left={props => <List.Icon {...props} icon="star"/>}
51
                     opened={true}
51
                     opened={true}
52
                 >
52
                 >
53
-                    <Text style={styles.text}>{i18n.t("clubs.categoriesFilterMessage")}</Text>
53
+                    <Text style={styles.text}>{i18n.t("screens.clubs.categoriesFilterMessage")}</Text>
54
                     <View style={styles.chipContainer}>
54
                     <View style={styles.chipContainer}>
55
                         {this.getCategoriesRender()}
55
                         {this.getCategoriesRender()}
56
                     </View>
56
                     </View>

+ 4
- 4
src/components/Lists/Equipment/EquipmentListItem.js View File

48
             const start = new Date(userDeviceRentDates[0]);
48
             const start = new Date(userDeviceRentDates[0]);
49
             const end = new Date(userDeviceRentDates[1]);
49
             const end = new Date(userDeviceRentDates[1]);
50
             if (start.getTime() !== end.getTime())
50
             if (start.getTime() !== end.getTime())
51
-                description = i18n.t('equipmentScreen.bookingPeriod', {
51
+                description = i18n.t('screens.equipment.bookingPeriod', {
52
                     begin: getRelativeDateString(start),
52
                     begin: getRelativeDateString(start),
53
                     end: getRelativeDateString(end)
53
                     end: getRelativeDateString(end)
54
                 });
54
                 });
55
             else
55
             else
56
-                description = i18n.t('equipmentScreen.bookingDay', {
56
+                description = i18n.t('screens.equipment.bookingDay', {
57
                     date: getRelativeDateString(start)
57
                     date: getRelativeDateString(start)
58
                 });
58
                 });
59
         } else if (isAvailable)
59
         } else if (isAvailable)
60
-            description = i18n.t('equipmentScreen.bail', {cost: item.caution});
60
+            description = i18n.t('screens.equipment.bail', {cost: item.caution});
61
         else
61
         else
62
-            description = i18n.t('equipmentScreen.available', {date: getRelativeDateString(firstAvailability)});
62
+            description = i18n.t('screens.equipment.available', {date: getRelativeDateString(firstAvailability)});
63
 
63
 
64
         let icon;
64
         let icon;
65
         if (isRented)
65
         if (isRented)

+ 1
- 1
src/components/Lists/Proximo/ProximoListItem.js View File

28
         return (
28
         return (
29
             <List.Item
29
             <List.Item
30
                 title={this.props.item.name}
30
                 title={this.props.item.name}
31
-                description={this.props.item.quantity + ' ' + i18n.t('proximoScreen.inStock')}
31
+                description={this.props.item.quantity + ' ' + i18n.t('screens.proximo.inStock')}
32
                 descriptionStyle={{color: this.props.color}}
32
                 descriptionStyle={{color: this.props.color}}
33
                 onPress={this.props.onPress}
33
                 onPress={this.props.onPress}
34
                 left={() => <Avatar.Image style={{backgroundColor: 'transparent'}} size={64}
34
                 left={() => <Avatar.Image style={{backgroundColor: 'transparent'}} size={64}

+ 9
- 9
src/components/Lists/Proxiwash/ProxiwashListItem.js View File

42
             displayNumber = AprilFoolsManager.getProxiwashMachineDisplayNumber(parseInt(props.item.number));
42
             displayNumber = AprilFoolsManager.getProxiwashMachineDisplayNumber(parseInt(props.item.number));
43
 
43
 
44
         this.title = props.isDryer
44
         this.title = props.isDryer
45
-            ? i18n.t('proxiwashScreen.dryer')
46
-            : i18n.t('proxiwashScreen.washer');
45
+            ? i18n.t('screens.proxiwash.dryer')
46
+            : i18n.t('screens.proxiwash.washer');
47
         this.title += ' n°' + displayNumber;
47
         this.title += ' n°' + displayNumber;
48
     }
48
     }
49
 
49
 
56
     }
56
     }
57
 
57
 
58
     updateStateStrings() {
58
     updateStateStrings() {
59
-        this.stateStrings[ProxiwashConstants.machineStates.AVAILABLE] = i18n.t('proxiwashScreen.states.ready');
60
-        this.stateStrings[ProxiwashConstants.machineStates.RUNNING] = i18n.t('proxiwashScreen.states.running');
61
-        this.stateStrings[ProxiwashConstants.machineStates.RUNNING_NOT_STARTED] = i18n.t('proxiwashScreen.states.runningNotStarted');
62
-        this.stateStrings[ProxiwashConstants.machineStates.FINISHED] = i18n.t('proxiwashScreen.states.finished');
63
-        this.stateStrings[ProxiwashConstants.machineStates.UNAVAILABLE] = i18n.t('proxiwashScreen.states.broken');
64
-        this.stateStrings[ProxiwashConstants.machineStates.ERROR] = i18n.t('proxiwashScreen.states.error');
65
-        this.stateStrings[ProxiwashConstants.machineStates.UNKNOWN] = i18n.t('proxiwashScreen.states.unknown');
59
+        this.stateStrings[ProxiwashConstants.machineStates.AVAILABLE] = i18n.t('screens.proxiwash.states.ready');
60
+        this.stateStrings[ProxiwashConstants.machineStates.RUNNING] = i18n.t('screens.proxiwash.states.running');
61
+        this.stateStrings[ProxiwashConstants.machineStates.RUNNING_NOT_STARTED] = i18n.t('screens.proxiwash.states.runningNotStarted');
62
+        this.stateStrings[ProxiwashConstants.machineStates.FINISHED] = i18n.t('screens.proxiwash.states.finished');
63
+        this.stateStrings[ProxiwashConstants.machineStates.UNAVAILABLE] = i18n.t('screens.proxiwash.states.broken');
64
+        this.stateStrings[ProxiwashConstants.machineStates.ERROR] = i18n.t('screens.proxiwash.states.error');
65
+        this.stateStrings[ProxiwashConstants.machineStates.UNKNOWN] = i18n.t('screens.proxiwash.states.unknown');
66
     }
66
     }
67
 
67
 
68
     updateStateColors() {
68
     updateStateColors() {

+ 2
- 2
src/components/Lists/Proxiwash/ProxiwashSectionHeader.js View File

27
         const props = this.props;
27
         const props = this.props;
28
         const subtitle = props.nbAvailable + ' ' + (
28
         const subtitle = props.nbAvailable + ' ' + (
29
             (props.nbAvailable <= 1)
29
             (props.nbAvailable <= 1)
30
-                ? i18n.t('proxiwashScreen.numAvailable')
31
-                : i18n.t('proxiwashScreen.numAvailablePlural'));
30
+                ? i18n.t('screens.proxiwash.numAvailable')
31
+                : i18n.t('screens.proxiwash.numAvailablePlural'));
32
         const iconColor = props.nbAvailable > 0
32
         const iconColor = props.nbAvailable > 0
33
         ? this.props.theme.colors.success
33
         ? this.props.theme.colors.success
34
         : this.props.theme.colors.primary;
34
         : this.props.theme.colors.primary;

+ 1
- 1
src/components/Screens/ErrorView.js View File

124
             onPress={this.goToLogin}
124
             onPress={this.goToLogin}
125
             style={styles.button}
125
             style={styles.button}
126
         >
126
         >
127
-            {i18n.t("screens.login")}
127
+            {i18n.t("screens.login.title")}
128
         </Button>;
128
         </Button>;
129
     }
129
     }
130
 
130
 

+ 1
- 1
src/components/Screens/WebSectionList.js View File

258
                         bottom: CustomTabBar.TAB_BAR_HEIGHT
258
                         bottom: CustomTabBar.TAB_BAR_HEIGHT
259
                     }}
259
                     }}
260
                 >
260
                 >
261
-                    {i18n.t("homeScreen.listUpdateFail")}
261
+                    {i18n.t("screens.home.listUpdateFail")}
262
                 </Snackbar>
262
                 </Snackbar>
263
             </View>
263
             </View>
264
         );
264
         );

+ 2
- 2
src/managers/LocaleManager.js View File

3
 import i18n from 'i18n-js';
3
 import i18n from 'i18n-js';
4
 import * as RNLocalize from "react-native-localize";
4
 import * as RNLocalize from "react-native-localize";
5
 
5
 
6
-import en from '../../translations/en';
7
-import fr from '../../translations/fr';
6
+import en from '../../locales/en';
7
+import fr from '../../locales/fr.json';
8
 
8
 
9
 /**
9
 /**
10
  * Static class used to manage locales
10
  * Static class used to manage locales

+ 20
- 20
src/navigation/MainNavigator.js View File

52
                 component={props.createTabNavigator}
52
                 component={props.createTabNavigator}
53
                 options={{
53
                 options={{
54
                     headerShown: false,
54
                     headerShown: false,
55
-                    title: i18n.t('screens.home'),
55
+                    title: i18n.t('screens.home.title'),
56
                 }}
56
                 }}
57
             />
57
             />
58
             <MainStack.Screen
58
             <MainStack.Screen
59
                 name="settings"
59
                 name="settings"
60
                 component={SettingsScreen}
60
                 component={SettingsScreen}
61
                 options={{
61
                 options={{
62
-                    title: i18n.t('screens.settings'),
62
+                    title: i18n.t('screens.settings.title'),
63
                 }}
63
                 }}
64
             />
64
             />
65
             <MainStack.Screen
65
             <MainStack.Screen
66
                 name="about"
66
                 name="about"
67
                 component={AboutScreen}
67
                 component={AboutScreen}
68
                 options={{
68
                 options={{
69
-                    title: i18n.t('screens.about'),
69
+                    title: i18n.t('screens.about.title'),
70
                 }}
70
                 }}
71
             />
71
             />
72
             <MainStack.Screen
72
             <MainStack.Screen
73
                 name="dependencies"
73
                 name="dependencies"
74
                 component={AboutDependenciesScreen}
74
                 component={AboutDependenciesScreen}
75
                 options={{
75
                 options={{
76
-                    title: i18n.t('aboutScreen.libs')
76
+                    title: i18n.t('screens.about.libs')
77
                 }}
77
                 }}
78
             />
78
             />
79
             <MainStack.Screen
79
             <MainStack.Screen
80
                 name="debug"
80
                 name="debug"
81
                 component={DebugScreen}
81
                 component={DebugScreen}
82
                 options={{
82
                 options={{
83
-                    title: i18n.t('aboutScreen.debug')
83
+                    title: i18n.t('screens.about.debug')
84
                 }}
84
                 }}
85
             />
85
             />
86
             <MainStack.Screen
86
             <MainStack.Screen
87
                 name="tetris"
87
                 name="tetris"
88
                 component={TetrisScreen}
88
                 component={TetrisScreen}
89
                 options={{
89
                 options={{
90
-                    title: i18n.t("game.title"),
90
+                    title: i18n.t("screens.game.title"),
91
                 }}
91
                 }}
92
             />
92
             />
93
             <MainStack.Screen
93
             <MainStack.Screen
94
                 name="login"
94
                 name="login"
95
                 component={LoginScreen}
95
                 component={LoginScreen}
96
                 options={{
96
                 options={{
97
-                    title: i18n.t('screens.login'),
97
+                    title: i18n.t('screens.login.title'),
98
                 }}
98
                 }}
99
             />
99
             />
100
 
100
 
101
             {getWebsiteStack("website", MainStack, WebsiteScreen, "")}
101
             {getWebsiteStack("website", MainStack, WebsiteScreen, "")}
102
 
102
 
103
 
103
 
104
-            {createScreenCollapsibleStack("self-menu", MainStack, SelfMenuScreen, i18n.t('screens.menuSelf'))}
105
-            {createScreenCollapsibleStack("proximo", MainStack, ProximoMainScreen, i18n.t('screens.proximo'))}
104
+            {createScreenCollapsibleStack("self-menu", MainStack, SelfMenuScreen, i18n.t('screens.menu.title'))}
105
+            {createScreenCollapsibleStack("proximo", MainStack, ProximoMainScreen, i18n.t('screens.proximo.title'))}
106
             {createScreenCollapsibleStack(
106
             {createScreenCollapsibleStack(
107
                 "proximo-list",
107
                 "proximo-list",
108
                 MainStack,
108
                 MainStack,
109
                 ProximoListScreen,
109
                 ProximoListScreen,
110
-                i18n.t('screens.proximoArticles'),
110
+                i18n.t('screens.proximo.articleList'),
111
                 true,
111
                 true,
112
                 {...screenTransition},
112
                 {...screenTransition},
113
             )}
113
             )}
115
                 name="proximo-about"
115
                 name="proximo-about"
116
                 component={ProximoAboutScreen}
116
                 component={ProximoAboutScreen}
117
                 options={{
117
                 options={{
118
-                    title: i18n.t('screens.proximo'),
118
+                    title: i18n.t('screens.proximo.title'),
119
                     ...modalTransition,
119
                     ...modalTransition,
120
                 }}
120
                 }}
121
             />
121
             />
122
 
122
 
123
-            {createScreenCollapsibleStack("profile", MainStack, ProfileScreen, i18n.t('screens.profile'))}
124
-            {createScreenCollapsibleStack("club-list", MainStack, ClubListScreen, i18n.t('clubs.clubList'))}
125
-            {createScreenCollapsibleStack("equipment-list", MainStack, EquipmentScreen, i18n.t('screens.equipmentList'))}
126
-            {createScreenCollapsibleStack("equipment-rent", MainStack, EquipmentLendScreen, i18n.t('screens.equipmentLend'))}
127
-            {createScreenCollapsibleStack("equipment-confirm", MainStack, EquipmentConfirmScreen, i18n.t('screens.equipmentConfirm'))}
123
+            {createScreenCollapsibleStack("profile", MainStack, ProfileScreen, i18n.t('screens.profile.title'))}
124
+            {createScreenCollapsibleStack("club-list", MainStack, ClubListScreen, i18n.t('screens.clubs.title'))}
125
+            {createScreenCollapsibleStack("equipment-list", MainStack, EquipmentScreen, i18n.t('screens.equipment.title'))}
126
+            {createScreenCollapsibleStack("equipment-rent", MainStack, EquipmentLendScreen, i18n.t('screens.equipment.book'))}
127
+            {createScreenCollapsibleStack("equipment-confirm", MainStack, EquipmentConfirmScreen, i18n.t('screens.equipment.confirm'))}
128
             <MainStack.Screen
128
             <MainStack.Screen
129
                 name="club-information"
129
                 name="club-information"
130
                 component={ClubDisplayScreen}
130
                 component={ClubDisplayScreen}
131
                 options={{
131
                 options={{
132
-                    title: i18n.t('screens.clubDisplayScreen'),
132
+                    title: i18n.t('screens.clubs.details'),
133
                     ...modalTransition,
133
                     ...modalTransition,
134
                 }}
134
                 }}
135
             />
135
             />
137
                 name="club-about"
137
                 name="club-about"
138
                 component={ClubAboutScreen}
138
                 component={ClubAboutScreen}
139
                 options={{
139
                 options={{
140
-                    title: i18n.t('screens.clubsAbout'),
140
+                    title: i18n.t('screens.clubs.title'),
141
                     ...modalTransition,
141
                     ...modalTransition,
142
                 }}
142
                 }}
143
             />
143
             />
145
                 name="vote"
145
                 name="vote"
146
                 component={VoteScreen}
146
                 component={VoteScreen}
147
                 options={{
147
                 options={{
148
-                    title: i18n.t('screens.vote'),
148
+                    title: i18n.t('screens.vote.title'),
149
                 }}
149
                 }}
150
             />
150
             />
151
 
151
 
153
                 name="feedback"
153
                 name="feedback"
154
                 component={BugReportScreen}
154
                 component={BugReportScreen}
155
                 options={{
155
                 options={{
156
-                    title: i18n.t('screens.feedback'),
156
+                    title: i18n.t('screens.feedback.title'),
157
                 }}
157
                 }}
158
             />
158
             />
159
         </MainStack.Navigator>
159
         </MainStack.Navigator>

+ 17
- 17
src/navigation/TabNavigator.js View File

42
             headerMode={"screen"}
42
             headerMode={"screen"}
43
             screenOptions={defaultScreenOptions}
43
             screenOptions={defaultScreenOptions}
44
         >
44
         >
45
-            {createScreenCollapsibleStack("index", ServicesStack, WebsitesHomeScreen, i18n.t('screens.services'))}
45
+            {createScreenCollapsibleStack("index", ServicesStack, WebsitesHomeScreen, i18n.t('screens.services.title'))}
46
             {createScreenCollapsibleStack("services-section", ServicesStack, ServicesSectionScreen, "SECTION")}
46
             {createScreenCollapsibleStack("services-section", ServicesStack, ServicesSectionScreen, "SECTION")}
47
-            {createScreenCollapsibleStack("amicale-contact", ServicesStack, AmicaleContactScreen, i18n.t('screens.amicaleAbout'))}
47
+            {createScreenCollapsibleStack("amicale-contact", ServicesStack, AmicaleContactScreen, i18n.t('screens.amicaleAbout.title'))}
48
         </ServicesStack.Navigator>
48
         </ServicesStack.Navigator>
49
     );
49
     );
50
 }
50
 }
58
             headerMode={"screen"}
58
             headerMode={"screen"}
59
             screenOptions={defaultScreenOptions}
59
             screenOptions={defaultScreenOptions}
60
         >
60
         >
61
-            {createScreenCollapsibleStack("index", ProxiwashStack, ProxiwashScreen, i18n.t('screens.proxiwash'))}
61
+            {createScreenCollapsibleStack("index", ProxiwashStack, ProxiwashScreen, i18n.t('screens.proxiwash.title'))}
62
             <ProxiwashStack.Screen
62
             <ProxiwashStack.Screen
63
                 name="proxiwash-about"
63
                 name="proxiwash-about"
64
                 component={ProxiwashAboutScreen}
64
                 component={ProxiwashAboutScreen}
65
-                options={{title: i18n.t('screens.proxiwash'),}}
65
+                options={{title: i18n.t('screens.proxiwash.title'),}}
66
             />
66
             />
67
         </ProxiwashStack.Navigator>
67
         </ProxiwashStack.Navigator>
68
     );
68
     );
80
             <PlanningStack.Screen
80
             <PlanningStack.Screen
81
                 name="index"
81
                 name="index"
82
                 component={PlanningScreen}
82
                 component={PlanningScreen}
83
-                options={{title: i18n.t('screens.planning'),}}
83
+                options={{title: i18n.t('screens.planning.title'),}}
84
             />
84
             />
85
             <PlanningStack.Screen
85
             <PlanningStack.Screen
86
                 name="planning-information"
86
                 name="planning-information"
87
                 component={PlanningDisplayScreen}
87
                 component={PlanningDisplayScreen}
88
-                options={{title: i18n.t('screens.planningDisplayScreen'),}}
88
+                options={{title: i18n.t('screens.planning.eventDetails'),}}
89
             />
89
             />
90
         </PlanningStack.Navigator>
90
         </PlanningStack.Navigator>
91
     );
91
     );
109
                     name="index"
109
                     name="index"
110
                     component={HomeScreen}
110
                     component={HomeScreen}
111
                     options={{
111
                     options={{
112
-                        title: i18n.t('screens.home'),
112
+                        title: i18n.t('screens.home.title'),
113
                         headerStyle: {
113
                         headerStyle: {
114
                             backgroundColor: colors.surface,
114
                             backgroundColor: colors.surface,
115
                         },
115
                         },
124
             <HomeStack.Screen
124
             <HomeStack.Screen
125
                 name="scanner"
125
                 name="scanner"
126
                 component={ScannerScreen}
126
                 component={ScannerScreen}
127
-                options={{title: i18n.t('screens.scanner'),}}
127
+                options={{title: i18n.t('screens.scanner.title'),}}
128
             />
128
             />
129
             <HomeStack.Screen
129
             <HomeStack.Screen
130
                 name="club-information"
130
                 name="club-information"
131
                 component={ClubDisplayScreen}
131
                 component={ClubDisplayScreen}
132
-                options={{title: i18n.t('screens.clubDisplayScreen'),}}
132
+                options={{title: i18n.t('screens.clubs.details'),}}
133
             />
133
             />
134
             <HomeStack.Screen
134
             <HomeStack.Screen
135
                 name="feed-information"
135
                 name="feed-information"
136
                 component={FeedItemScreen}
136
                 component={FeedItemScreen}
137
-                options={{title: i18n.t('screens.feedDisplayScreen'),}}
137
+                options={{title: i18n.t('screens.home.feed'),}}
138
             />
138
             />
139
             <HomeStack.Screen
139
             <HomeStack.Screen
140
                 name="planning-information"
140
                 name="planning-information"
141
                 component={PlanningDisplayScreen}
141
                 component={PlanningDisplayScreen}
142
-                options={{title: i18n.t('screens.planningDisplayScreen'),}}
142
+                options={{title: i18n.t('screens.planning.eventDetails'),}}
143
             />
143
             />
144
         </HomeStack.Navigator>
144
         </HomeStack.Navigator>
145
     );
145
     );
154
             headerMode={"screen"}
154
             headerMode={"screen"}
155
             screenOptions={defaultScreenOptions}
155
             screenOptions={defaultScreenOptions}
156
         >
156
         >
157
-            {getWebsiteStack("index", PlanexStack, PlanexScreen, "Planex")}
157
+            {getWebsiteStack("index", PlanexStack, PlanexScreen, i18n.t("screens.planex.title"))}
158
             {createScreenCollapsibleStack("group-select", PlanexStack, GroupSelectionScreen, "GROUP SELECT")}
158
             {createScreenCollapsibleStack("group-select", PlanexStack, GroupSelectionScreen, "GROUP SELECT")}
159
         </PlanexStack.Navigator>
159
         </PlanexStack.Navigator>
160
     );
160
     );
191
                     name="services"
191
                     name="services"
192
                     option
192
                     option
193
                     component={ServicesStackComponent}
193
                     component={ServicesStackComponent}
194
-                    options={{title: i18n.t('screens.services')}}
194
+                    options={{title: i18n.t('screens.services.title')}}
195
                 />
195
                 />
196
                 <Tab.Screen
196
                 <Tab.Screen
197
                     name="proxiwash"
197
                     name="proxiwash"
198
                     component={ProxiwashStackComponent}
198
                     component={ProxiwashStackComponent}
199
-                    options={{title: i18n.t('screens.proxiwash')}}
199
+                    options={{title: i18n.t('screens.proxiwash.title')}}
200
                 />
200
                 />
201
                 <Tab.Screen
201
                 <Tab.Screen
202
                     name="home"
202
                     name="home"
203
                     component={this.createHomeStackComponent}
203
                     component={this.createHomeStackComponent}
204
-                    options={{title: i18n.t('screens.home')}}
204
+                    options={{title: i18n.t('screens.home.title')}}
205
                 />
205
                 />
206
                 <Tab.Screen
206
                 <Tab.Screen
207
                     name="planning"
207
                     name="planning"
208
                     component={PlanningStackComponent}
208
                     component={PlanningStackComponent}
209
-                    options={{title: i18n.t('screens.planning')}}
209
+                    options={{title: i18n.t('screens.planning.title')}}
210
                 />
210
                 />
211
 
211
 
212
                 <Tab.Screen
212
                 <Tab.Screen
213
                     name="planex"
213
                     name="planex"
214
                     component={PlanexStackComponent}
214
                     component={PlanexStackComponent}
215
-                    options={{title: "Planex"}}
215
+                    options={{title: i18n.t("screens.planex.title")}}
216
                 />
216
                 />
217
             </Tab.Navigator>
217
             </Tab.Navigator>
218
         );
218
         );

+ 12
- 12
src/screens/About/AboutScreen.js View File

60
         {
60
         {
61
             onPressCallback: () => openWebLink(Platform.OS === "ios" ? links.appstore : links.playstore),
61
             onPressCallback: () => openWebLink(Platform.OS === "ios" ? links.appstore : links.playstore),
62
             icon: Platform.OS === "ios" ? 'apple' : 'google-play',
62
             icon: Platform.OS === "ios" ? 'apple' : 'google-play',
63
-            text: Platform.OS === "ios" ? i18n.t('aboutScreen.appstore') : i18n.t('aboutScreen.playstore'),
63
+            text: Platform.OS === "ios" ? i18n.t('screens.about.appstore') : i18n.t('screens.about.playstore'),
64
             showChevron: true
64
             showChevron: true
65
         },
65
         },
66
         {
66
         {
67
             onPressCallback: () => this.props.navigation.navigate("feedback"),
67
             onPressCallback: () => this.props.navigation.navigate("feedback"),
68
             icon: 'bug',
68
             icon: 'bug',
69
-            text: i18n.t("feedbackScreen.homeButtonTitle"),
69
+            text: i18n.t("screens.feedback.homeButtonTitle"),
70
             showChevron: true
70
             showChevron: true
71
         },
71
         },
72
         {
72
         {
78
         {
78
         {
79
             onPressCallback: () => openWebLink(links.changelog),
79
             onPressCallback: () => openWebLink(links.changelog),
80
             icon: 'refresh',
80
             icon: 'refresh',
81
-            text: i18n.t('aboutScreen.changelog'),
81
+            text: i18n.t('screens.about.changelog'),
82
             showChevron: true
82
             showChevron: true
83
         },
83
         },
84
         {
84
         {
85
             onPressCallback: () => openWebLink(links.license),
85
             onPressCallback: () => openWebLink(links.license),
86
             icon: 'file-document',
86
             icon: 'file-document',
87
-            text: i18n.t('aboutScreen.license'),
87
+            text: i18n.t('screens.about.license'),
88
             showChevron: true
88
             showChevron: true
89
         },
89
         },
90
     ];
90
     ];
101
         {
101
         {
102
             onPressCallback: () => openWebLink(links.authorMail),
102
             onPressCallback: () => openWebLink(links.authorMail),
103
             icon: 'email',
103
             icon: 'email',
104
-            text: i18n.t('aboutScreen.authorMail'),
104
+            text: i18n.t('screens.about.authorMail'),
105
             showChevron: true
105
             showChevron: true
106
         },
106
         },
107
         {
107
         {
124
         {
124
         {
125
             onPressCallback: () => openWebLink(links.yohanMail),
125
             onPressCallback: () => openWebLink(links.yohanMail),
126
             icon: 'email',
126
             icon: 'email',
127
-            text: i18n.t('aboutScreen.authorMail'),
127
+            text: i18n.t('screens.about.authorMail'),
128
             showChevron: true
128
             showChevron: true
129
         },
129
         },
130
         {
130
         {
141
         {
141
         {
142
             onPressCallback: () => openWebLink(links.react),
142
             onPressCallback: () => openWebLink(links.react),
143
             icon: 'react',
143
             icon: 'react',
144
-            text: i18n.t('aboutScreen.reactNative'),
144
+            text: i18n.t('screens.about.reactNative'),
145
             showChevron: true
145
             showChevron: true
146
         },
146
         },
147
         {
147
         {
148
             onPressCallback: () => this.props.navigation.navigate('dependencies'),
148
             onPressCallback: () => this.props.navigation.navigate('dependencies'),
149
             icon: 'developer-board',
149
             icon: 'developer-board',
150
-            text: i18n.t('aboutScreen.libs'),
150
+            text: i18n.t('screens.about.libs'),
151
             showChevron: true
151
             showChevron: true
152
         },
152
         },
153
     ];
153
     ];
224
         return (
224
         return (
225
             <Card style={{marginBottom: 10}}>
225
             <Card style={{marginBottom: 10}}>
226
                 <Card.Title
226
                 <Card.Title
227
-                    title={i18n.t('aboutScreen.team')}
227
+                    title={i18n.t('screens.about.team')}
228
                     left={(props) => <Avatar.Icon {...props} icon={'account-multiple'}/>}/>
228
                     left={(props) => <Avatar.Icon {...props} icon={'account-multiple'}/>}/>
229
                 <Card.Content>
229
                 <Card.Content>
230
-                    <Title>{i18n.t('aboutScreen.author')}</Title>
230
+                    <Title>{i18n.t('screens.about.author')}</Title>
231
                     <FlatList
231
                     <FlatList
232
                         data={this.authorData}
232
                         data={this.authorData}
233
                         keyExtractor={this.keyExtractor}
233
                         keyExtractor={this.keyExtractor}
234
                         listKey={"1"}
234
                         listKey={"1"}
235
                         renderItem={this.getCardItem}
235
                         renderItem={this.getCardItem}
236
                     />
236
                     />
237
-                    <Title>{i18n.t('aboutScreen.additionalDev')}</Title>
237
+                    <Title>{i18n.t('screens.about.additionalDev')}</Title>
238
                     <FlatList
238
                     <FlatList
239
                         data={this.additionalDevData}
239
                         data={this.additionalDevData}
240
                         keyExtractor={this.keyExtractor}
240
                         keyExtractor={this.keyExtractor}
255
         return (
255
         return (
256
             <Card style={{marginBottom: 10}}>
256
             <Card style={{marginBottom: 10}}>
257
                 <Card.Content>
257
                 <Card.Content>
258
-                    <Title>{i18n.t('aboutScreen.technologies')}</Title>
258
+                    <Title>{i18n.t('screens.about.technologies')}</Title>
259
                     <FlatList
259
                     <FlatList
260
                         data={this.technoData}
260
                         data={this.technoData}
261
                         keyExtractor={this.keyExtractor}
261
                         keyExtractor={this.keyExtractor}

+ 12
- 12
src/screens/Amicale/AmicaleContactScreen.js View File

26
     // Dataset containing information about contacts
26
     // Dataset containing information about contacts
27
     CONTACT_DATASET = [
27
     CONTACT_DATASET = [
28
         {
28
         {
29
-            name: i18n.t("amicaleAbout.roles.interSchools"),
29
+            name: i18n.t("screens.amicaleAbout.roles.interSchools"),
30
             email: "inter.ecoles@amicale-insat.fr",
30
             email: "inter.ecoles@amicale-insat.fr",
31
             icon: "share-variant"
31
             icon: "share-variant"
32
         },
32
         },
33
         {
33
         {
34
-            name: i18n.t("amicaleAbout.roles.culture"),
34
+            name: i18n.t("screens.amicaleAbout.roles.culture"),
35
             email: "culture@amicale-insat.fr",
35
             email: "culture@amicale-insat.fr",
36
             icon: "book"
36
             icon: "book"
37
         },
37
         },
38
         {
38
         {
39
-            name: i18n.t("amicaleAbout.roles.animation"),
39
+            name: i18n.t("screens.amicaleAbout.roles.animation"),
40
             email: "animation@amicale-insat.fr",
40
             email: "animation@amicale-insat.fr",
41
             icon: "emoticon"
41
             icon: "emoticon"
42
         },
42
         },
43
         {
43
         {
44
-            name: i18n.t("amicaleAbout.roles.clubs"),
44
+            name: i18n.t("screens.amicaleAbout.roles.clubs"),
45
             email: "clubs@amicale-insat.fr",
45
             email: "clubs@amicale-insat.fr",
46
             icon: "account-group"
46
             icon: "account-group"
47
         },
47
         },
48
         {
48
         {
49
-            name: i18n.t("amicaleAbout.roles.event"),
49
+            name: i18n.t("screens.amicaleAbout.roles.event"),
50
             email: "evenements@amicale-insat.fr",
50
             email: "evenements@amicale-insat.fr",
51
             icon: "calendar-range"
51
             icon: "calendar-range"
52
         },
52
         },
53
         {
53
         {
54
-            name: i18n.t("amicaleAbout.roles.tech"),
54
+            name: i18n.t("screens.amicaleAbout.roles.tech"),
55
             email: "technique@amicale-insat.fr",
55
             email: "technique@amicale-insat.fr",
56
             icon: "settings"
56
             icon: "settings"
57
         },
57
         },
58
         {
58
         {
59
-            name: i18n.t("amicaleAbout.roles.communication"),
59
+            name: i18n.t("screens.amicaleAbout.roles.communication"),
60
             email: "amicale@amicale-insat.fr",
60
             email: "amicale@amicale-insat.fr",
61
             icon: "comment-account"
61
             icon: "comment-account"
62
         },
62
         },
63
         {
63
         {
64
-            name: i18n.t("amicaleAbout.roles.intraSchools"),
64
+            name: i18n.t("screens.amicaleAbout.roles.intraSchools"),
65
             email: "intra.ecoles@amicale-insat.fr",
65
             email: "intra.ecoles@amicale-insat.fr",
66
             icon: "school"
66
             icon: "school"
67
         },
67
         },
68
         {
68
         {
69
-            name: i18n.t("amicaleAbout.roles.publicRelations"),
69
+            name: i18n.t("screens.amicaleAbout.roles.publicRelations"),
70
             email: "rp@amicale-insat.fr",
70
             email: "rp@amicale-insat.fr",
71
             icon: "account-tie"
71
             icon: "account-tie"
72
         },
72
         },
105
                 </View>
105
                 </View>
106
                 <Card style={{margin: 5}}>
106
                 <Card style={{margin: 5}}>
107
                     <Card.Title
107
                     <Card.Title
108
-                        title={i18n.t("amicaleAbout.title")}
109
-                        subtitle={i18n.t("amicaleAbout.subtitle")}
108
+                        title={i18n.t("screens.amicaleAbout.title")}
109
+                        subtitle={i18n.t("screens.amicaleAbout.subtitle")}
110
                         left={props => <List.Icon {...props} icon={'information'}/>}
110
                         left={props => <List.Icon {...props} icon={'information'}/>}
111
                     />
111
                     />
112
                     <Card.Content>
112
                     <Card.Content>
113
-                        <Text>{i18n.t("amicaleAbout.message")}</Text>
113
+                        <Text>{i18n.t("screens.amicaleAbout.message")}</Text>
114
                         {/*$FlowFixMe*/}
114
                         {/*$FlowFixMe*/}
115
                         <FlatList
115
                         <FlatList
116
                             data={this.CONTACT_DATASET}
116
                             data={this.CONTACT_DATASET}

+ 4
- 4
src/screens/Amicale/Clubs/ClubAboutScreen.js View File

28
                         style={{flex: 1, resizeMode: "contain"}}
28
                         style={{flex: 1, resizeMode: "contain"}}
29
                         resizeMode="contain"/>
29
                         resizeMode="contain"/>
30
                 </View>
30
                 </View>
31
-                <Text>{i18n.t("clubs.about.text")}</Text>
31
+                <Text>{i18n.t("screens.clubs.about.text")}</Text>
32
                 <Card style={{margin: 5}}>
32
                 <Card style={{margin: 5}}>
33
                     <Card.Title
33
                     <Card.Title
34
-                        title={i18n.t("clubs.about.title")}
35
-                        subtitle={i18n.t("clubs.about.subtitle")}
34
+                        title={i18n.t("screens.clubs.about.title")}
35
+                        subtitle={i18n.t("screens.clubs.about.subtitle")}
36
                         left={props => <List.Icon {...props} icon={'information'}/>}
36
                         left={props => <List.Icon {...props} icon={'information'}/>}
37
                     />
37
                     />
38
                     <Card.Content>
38
                     <Card.Content>
39
-                        <Text>{i18n.t("clubs.about.message")}</Text>
39
+                        <Text>{i18n.t("screens.clubs.about.message")}</Text>
40
                         <Autolink
40
                         <Autolink
41
                             text={CONTACT_LINK}
41
                             text={CONTACT_LINK}
42
                             component={Text}
42
                             component={Text}

+ 5
- 5
src/screens/Amicale/Clubs/ClubDisplayScreen.js View File

123
         return (
123
         return (
124
             <Card style={{marginTop: 10, marginBottom: CustomTabBar.TAB_BAR_HEIGHT + 20}}>
124
             <Card style={{marginTop: 10, marginBottom: CustomTabBar.TAB_BAR_HEIGHT + 20}}>
125
                 <Card.Title
125
                 <Card.Title
126
-                    title={i18n.t('clubs.managers')}
127
-                    subtitle={hasManagers ? i18n.t('clubs.managersSubtitle') : i18n.t('clubs.managersUnavailable')}
126
+                    title={i18n.t('screens.clubs.managers')}
127
+                    subtitle={hasManagers ? i18n.t('screens.clubs.managersSubtitle') : i18n.t('screens.clubs.managersUnavailable')}
128
                     left={(props) => <Avatar.Icon
128
                     left={(props) => <Avatar.Icon
129
                         {...props}
129
                         {...props}
130
                         style={{backgroundColor: 'transparent'}}
130
                         style={{backgroundColor: 'transparent'}}
151
             ? email
151
             ? email
152
             : AMICALE_MAIL;
152
             : AMICALE_MAIL;
153
         const text = email != null && hasManagers
153
         const text = email != null && hasManagers
154
-            ? i18n.t("clubs.clubContact")
155
-            : i18n.t("clubs.amicaleContact");
154
+            ? i18n.t("screens.clubs.clubContact")
155
+            : i18n.t("screens.clubs.amicaleContact");
156
         return (
156
         return (
157
             <Card.Actions>
157
             <Card.Actions>
158
                 <Button
158
                 <Button
235
                 errorViewOverride={[
235
                 errorViewOverride={[
236
                     {
236
                     {
237
                         errorCode: ERROR_TYPE.BAD_INPUT,
237
                         errorCode: ERROR_TYPE.BAD_INPUT,
238
-                        message: i18n.t("clubs.invalidClub"),
238
+                        message: i18n.t("screens.clubs.invalidClub"),
239
                         icon: "account-question",
239
                         icon: "account-question",
240
                         showRetryButton: false
240
                         showRetryButton: false
241
                     }
241
                     }

+ 1
- 1
src/screens/Amicale/Clubs/ClubListScreen.js View File

73
     getSearchBar = () => {
73
     getSearchBar = () => {
74
         return (
74
         return (
75
             <Searchbar
75
             <Searchbar
76
-                placeholder={i18n.t('proximoScreen.search')}
76
+                placeholder={i18n.t('screens.proximo.search')}
77
                 onChangeText={this.onSearchStringChange}
77
                 onChangeText={this.onSearchStringChange}
78
             />
78
             />
79
         );
79
         );

+ 5
- 5
src/screens/Amicale/Equipment/EquipmentConfirmScreen.js View File

76
                                         lineHeight: 35,
76
                                         lineHeight: 35,
77
                                         marginLeft: 10,
77
                                         marginLeft: 10,
78
                                     }}>
78
                                     }}>
79
-                                        ({i18n.t('equipmentScreen.bail', {cost: item.caution})})
79
+                                        ({i18n.t('screens.equipment.bail', {cost: item.caution})})
80
                                     </Caption>
80
                                     </Caption>
81
                                 </View>
81
                                 </View>
82
                             </View>
82
                             </View>
87
                             >
87
                             >
88
                                 {
88
                                 {
89
                                     start == null
89
                                     start == null
90
-                                        ? i18n.t('equipmentScreen.booking')
90
+                                        ? i18n.t('screens.equipment.booking')
91
                                         : end != null && start.getTime() !== end.getTime()
91
                                         : end != null && start.getTime() !== end.getTime()
92
-                                        ? i18n.t('equipmentScreen.bookingPeriod', {
92
+                                        ? i18n.t('screens.equipment.bookingPeriod', {
93
                                             begin: getRelativeDateString(start),
93
                                             begin: getRelativeDateString(start),
94
                                             end: getRelativeDateString(end)
94
                                             end: getRelativeDateString(end)
95
                                         })
95
                                         })
96
-                                        : i18n.t('equipmentScreen.bookingDay', {
96
+                                        : i18n.t('screens.equipment.bookingDay', {
97
                                             date: getRelativeDateString(start)
97
                                             date: getRelativeDateString(start)
98
                                         })
98
                                         })
99
                                 }
99
                                 }
100
                             </Button>
100
                             </Button>
101
                             <Paragraph style={{textAlign: "center"}}>
101
                             <Paragraph style={{textAlign: "center"}}>
102
-                                {i18n.t("equipmentScreen.bookingConfirmedMessage")}
102
+                                {i18n.t("screens.equipment.bookingConfirmedMessage")}
103
                             </Paragraph>
103
                             </Paragraph>
104
                         </Card.Content>
104
                         </Card.Content>
105
                     </Card>
105
                     </Card>

+ 2
- 2
src/screens/Amicale/Equipment/EquipmentListScreen.js View File

86
     getListHeader() {
86
     getListHeader() {
87
         return <Card style={{margin: 5}}>
87
         return <Card style={{margin: 5}}>
88
             <Card.Title
88
             <Card.Title
89
-                title={i18n.t('equipmentScreen.title')}
89
+                title={i18n.t('screens.equipment.title')}
90
                 left={(props) => <Avatar.Image
90
                 left={(props) => <Avatar.Image
91
                     {...props}
91
                     {...props}
92
                     source={ICON_AMICALE}
92
                     source={ICON_AMICALE}
95
             />
95
             />
96
             <Card.Content>
96
             <Card.Content>
97
                 <Paragraph>
97
                 <Paragraph>
98
-                    {i18n.t('equipmentScreen.message')}
98
+                    {i18n.t('screens.equipment.message')}
99
                 </Paragraph>
99
                 </Paragraph>
100
             </Card.Content>
100
             </Card.Content>
101
         </Card>;
101
         </Card>;

+ 9
- 9
src/screens/Amicale/Equipment/EquipmentRentScreen.js View File

305
                                             lineHeight: 35,
305
                                             lineHeight: 35,
306
                                             marginLeft: 10,
306
                                             marginLeft: 10,
307
                                         }}>
307
                                         }}>
308
-                                            ({i18n.t('equipmentScreen.bail', {cost: item.caution})})
308
+                                            ({i18n.t('screens.equipment.bail', {cost: item.caution})})
309
                                         </Caption>
309
                                         </Caption>
310
                                     </View>
310
                                     </View>
311
                                 </View>
311
                                 </View>
315
                                     color={isAvailable ? this.props.theme.colors.success : this.props.theme.colors.primary}
315
                                     color={isAvailable ? this.props.theme.colors.success : this.props.theme.colors.primary}
316
                                     mode="text"
316
                                     mode="text"
317
                                 >
317
                                 >
318
-                                    {i18n.t('equipmentScreen.available', {date: getRelativeDateString(firstAvailability)})}
318
+                                    {i18n.t('screens.equipment.available', {date: getRelativeDateString(firstAvailability)})}
319
                                 </Button>
319
                                 </Button>
320
                                 <Subheading style={{
320
                                 <Subheading style={{
321
                                     textAlign: "center",
321
                                     textAlign: "center",
324
                                 }}>
324
                                 }}>
325
                                     {
325
                                     {
326
                                         start == null
326
                                         start == null
327
-                                            ? i18n.t('equipmentScreen.booking')
327
+                                            ? i18n.t('screens.equipment.booking')
328
                                             : end != null && start.getTime() !== end.getTime()
328
                                             : end != null && start.getTime() !== end.getTime()
329
-                                            ? i18n.t('equipmentScreen.bookingPeriod', {
329
+                                            ? i18n.t('screens.equipment.bookingPeriod', {
330
                                                 begin: getRelativeDateString(start),
330
                                                 begin: getRelativeDateString(start),
331
                                                 end: getRelativeDateString(end)
331
                                                 end: getRelativeDateString(end)
332
                                             })
332
                                             })
333
-                                            : i18n.t('equipmentScreen.bookingDay', {
333
+                                            : i18n.t('screens.equipment.bookingDay', {
334
                                                 date: getRelativeDateString(start)
334
                                                 date: getRelativeDateString(start)
335
                                             })
335
                                             })
336
                                     }
336
                                     }
401
                         visible={this.state.dialogVisible}
401
                         visible={this.state.dialogVisible}
402
                         onDismiss={this.onDialogDismiss}
402
                         onDismiss={this.onDialogDismiss}
403
                         onAccept={this.onDialogAccept}
403
                         onAccept={this.onDialogAccept}
404
-                        title={i18n.t('equipmentScreen.dialogTitle')}
405
-                        titleLoading={i18n.t('equipmentScreen.dialogTitleLoading')}
406
-                        message={i18n.t('equipmentScreen.dialogMessage')}
404
+                        title={i18n.t('screens.equipment.dialogTitle')}
405
+                        titleLoading={i18n.t('screens.equipment.dialogTitleLoading')}
406
+                        message={i18n.t('screens.equipment.dialogMessage')}
407
                     />
407
                     />
408
 
408
 
409
                     <ErrorDialog
409
                     <ErrorDialog
436
                                 borderRadius: 10
436
                                 borderRadius: 10
437
                             }}
437
                             }}
438
                         >
438
                         >
439
-                            {i18n.t('equipmentScreen.bookButton')}
439
+                            {i18n.t('screens.equipment.bookButton')}
440
                         </Button>
440
                         </Button>
441
                     </Animatable.View>
441
                     </Animatable.View>
442
 
442
 

+ 14
- 14
src/screens/Amicale/LoginScreen.js View File

111
     /**
111
     /**
112
      * Navigates to the Amicale website screen with the reset password link as navigation parameters
112
      * Navigates to the Amicale website screen with the reset password link as navigation parameters
113
      */
113
      */
114
-    onResetPasswordClick = () => this.props.navigation.navigate("website", {host: AvailableWebsites.websites.AMICALE, path: RESET_PASSWORD_PATH, title: i18n.t('screens.amicaleWebsite')});
114
+    onResetPasswordClick = () => this.props.navigation.navigate("website", {host: AvailableWebsites.websites.AMICALE, path: RESET_PASSWORD_PATH, title: i18n.t('screens.websites.amicale')});
115
 
115
 
116
     /**
116
     /**
117
      * The user has unfocused the input, his email is ready to be validated
117
      * The user has unfocused the input, his email is ready to be validated
229
         return (
229
         return (
230
             <View>
230
             <View>
231
                 <TextInput
231
                 <TextInput
232
-                    label={i18n.t("loginScreen.email")}
232
+                    label={i18n.t("screens.login.email")}
233
                     mode='outlined'
233
                     mode='outlined'
234
                     value={this.state.email}
234
                     value={this.state.email}
235
                     onChangeText={this.onEmailChange}
235
                     onChangeText={this.onEmailChange}
248
                     type="error"
248
                     type="error"
249
                     visible={this.shouldShowEmailError()}
249
                     visible={this.shouldShowEmailError()}
250
                 >
250
                 >
251
-                    {i18n.t("loginScreen.emailError")}
251
+                    {i18n.t("screens.login.emailError")}
252
                 </HelperText>
252
                 </HelperText>
253
                 <TextInput
253
                 <TextInput
254
                     ref={this.passwordInputRef}
254
                     ref={this.passwordInputRef}
255
-                    label={i18n.t("loginScreen.password")}
255
+                    label={i18n.t("screens.login.password")}
256
                     mode='outlined'
256
                     mode='outlined'
257
                     value={this.state.password}
257
                     value={this.state.password}
258
                     onChangeText={this.onPasswordChange}
258
                     onChangeText={this.onPasswordChange}
271
                     type="error"
271
                     type="error"
272
                     visible={this.shouldShowPasswordError()}
272
                     visible={this.shouldShowPasswordError()}
273
                 >
273
                 >
274
-                    {i18n.t("loginScreen.passwordError")}
274
+                    {i18n.t("screens.login.passwordError")}
275
                 </HelperText>
275
                 </HelperText>
276
             </View>
276
             </View>
277
         );
277
         );
285
         return (
285
         return (
286
             <Card style={styles.card}>
286
             <Card style={styles.card}>
287
                 <Card.Title
287
                 <Card.Title
288
-                    title={i18n.t("loginScreen.title")}
289
-                    subtitle={i18n.t("loginScreen.subtitle")}
288
+                    title={i18n.t("screens.login.title")}
289
+                    subtitle={i18n.t("screens.login.subtitle")}
290
                     left={(props) => <Avatar.Image
290
                     left={(props) => <Avatar.Image
291
                         {...props}
291
                         {...props}
292
                         source={ICON_AMICALE}
292
                         source={ICON_AMICALE}
302
                             loading={this.state.loading}
302
                             loading={this.state.loading}
303
                             onPress={this.onSubmit}
303
                             onPress={this.onSubmit}
304
                             style={{marginLeft: 'auto'}}>
304
                             style={{marginLeft: 'auto'}}>
305
-                            {i18n.t("loginScreen.login")}
305
+                            {i18n.t("screens.login.title")}
306
                         </Button>
306
                         </Button>
307
                     </Card.Actions>
307
                     </Card.Actions>
308
                     <Card.Actions>
308
                     <Card.Actions>
311
                             mode="contained"
311
                             mode="contained"
312
                             onPress={this.onResetPasswordClick}
312
                             onPress={this.onResetPasswordClick}
313
                             style={{marginLeft: 'auto'}}>
313
                             style={{marginLeft: 'auto'}}>
314
-                            {i18n.t("loginScreen.resetPassword")}
314
+                            {i18n.t("screens.login.resetPassword")}
315
                         </Button>
315
                         </Button>
316
                     </Card.Actions>
316
                     </Card.Actions>
317
                 </Card.Content>
317
                 </Card.Content>
328
         return (
328
         return (
329
             <Card style={styles.card}>
329
             <Card style={styles.card}>
330
                 <Card.Title
330
                 <Card.Title
331
-                    title={i18n.t("loginScreen.whyAccountTitle")}
332
-                    subtitle={i18n.t("loginScreen.whyAccountSub")}
331
+                    title={i18n.t("screens.login.whyAccountTitle")}
332
+                    subtitle={i18n.t("screens.login.whyAccountSub")}
333
                     left={(props) => <Avatar.Icon
333
                     left={(props) => <Avatar.Icon
334
                         {...props}
334
                         {...props}
335
                         icon={"help"}
335
                         icon={"help"}
337
                         style={{backgroundColor: 'transparent'}}/>}
337
                         style={{backgroundColor: 'transparent'}}/>}
338
                 />
338
                 />
339
                 <Card.Content>
339
                 <Card.Content>
340
-                    <Paragraph>{i18n.t("loginScreen.whyAccountParagraph")}</Paragraph>
341
-                    <Paragraph>{i18n.t("loginScreen.whyAccountParagraph2")}</Paragraph>
342
-                    <Paragraph>{i18n.t("loginScreen.noAccount")}</Paragraph>
340
+                    <Paragraph>{i18n.t("screens.login.whyAccountParagraph")}</Paragraph>
341
+                    <Paragraph>{i18n.t("screens.login.whyAccountParagraph2")}</Paragraph>
342
+                    <Paragraph>{i18n.t("screens.login.noAccount")}</Paragraph>
343
                 </Card.Content>
343
                 </Card.Content>
344
             </Card>
344
             </Card>
345
         );
345
         );

+ 22
- 22
src/screens/Amicale/ProfileScreen.js View File

69
         ]
69
         ]
70
         this.amicaleDataset = [
70
         this.amicaleDataset = [
71
             {
71
             {
72
-                title: i18n.t('screens.clubsAbout'),
73
-                subtitle: i18n.t('servicesScreen.descriptions.clubs'),
72
+                title: i18n.t('screens.clubs.title'),
73
+                subtitle: i18n.t('screens.services.descriptions.clubs'),
74
                 image: CLUBS_IMAGE,
74
                 image: CLUBS_IMAGE,
75
                 onPress: () => this.props.navigation.navigate("club-list"),
75
                 onPress: () => this.props.navigation.navigate("club-list"),
76
             },
76
             },
77
             {
77
             {
78
-                title: i18n.t('screens.vote'),
79
-                subtitle: i18n.t('servicesScreen.descriptions.vote'),
78
+                title: i18n.t('screens.vote.title'),
79
+                subtitle: i18n.t('screens.services.descriptions.vote'),
80
                 image: VOTE_IMAGE,
80
                 image: VOTE_IMAGE,
81
                 onPress: () => this.props.navigation.navigate("vote"),
81
                 onPress: () => this.props.navigation.navigate("vote"),
82
             },
82
             },
83
             {
83
             {
84
-                title: i18n.t('screens.amicaleWebsite'),
85
-                subtitle: i18n.t('servicesScreen.descriptions.amicaleWebsite'),
84
+                title: i18n.t('screens.websites.amicale'),
85
+                subtitle: i18n.t('screens.services.descriptions.amicaleWebsite'),
86
                 image: ICON_AMICALE,
86
                 image: ICON_AMICALE,
87
-                onPress: () => this.props.navigation.navigate("website", {host: AvailableWebsites.websites.AMICALE, title: i18n.t('screens.amicaleWebsite')}),
87
+                onPress: () => this.props.navigation.navigate("website", {host: AvailableWebsites.websites.AMICALE, title: i18n.t('screens.websites.amicale')}),
88
             },
88
             },
89
         ];
89
         ];
90
     }
90
     }
178
         return (
178
         return (
179
             <Card style={styles.card}>
179
             <Card style={styles.card}>
180
                 <Card.Title
180
                 <Card.Title
181
-                    title={i18n.t("profileScreen.welcomeTitle", {name: this.data.first_name})}
181
+                    title={i18n.t("screens.profile.welcomeTitle", {name: this.data.first_name})}
182
                     left={() => <Avatar.Image
182
                     left={() => <Avatar.Image
183
                         size={64}
183
                         size={64}
184
                         source={ICON_AMICALE}
184
                         source={ICON_AMICALE}
189
                 <Card.Content>
189
                 <Card.Content>
190
                     <Divider/>
190
                     <Divider/>
191
                     <Paragraph>
191
                     <Paragraph>
192
-                        {i18n.t("profileScreen.welcomeDescription")}
192
+                        {i18n.t("screens.profile.welcomeDescription")}
193
                     </Paragraph>
193
                     </Paragraph>
194
                     {this.getServicesList()}
194
                     {this.getServicesList()}
195
                     <Paragraph>
195
                     <Paragraph>
196
-                        {i18n.t("profileScreen.welcomeFeedback")}
196
+                        {i18n.t("screens.profile.welcomeFeedback")}
197
                     </Paragraph>
197
                     </Paragraph>
198
                     <Divider/>
198
                     <Divider/>
199
                     <Card.Actions>
199
                     <Card.Actions>
202
                             mode="contained"
202
                             mode="contained"
203
                             onPress={() => this.props.navigation.navigate('feedback')}
203
                             onPress={() => this.props.navigation.navigate('feedback')}
204
                             style={styles.editButton}>
204
                             style={styles.editButton}>
205
-                            {i18n.t("feedbackScreen.homeButtonTitle")}
205
+                            {i18n.t("screens.feedback.homeButtonTitle")}
206
                         </Button>
206
                         </Button>
207
                     </Card.Actions>
207
                     </Card.Actions>
208
                 </Card.Content>
208
                 </Card.Content>
230
     getFieldValue(field: ?string) {
230
     getFieldValue(field: ?string) {
231
         return this.isFieldAvailable(field)
231
         return this.isFieldAvailable(field)
232
             ? field
232
             ? field
233
-            : i18n.t("profileScreen.noData");
233
+            : i18n.t("screens.profile.noData");
234
     }
234
     }
235
 
235
 
236
     /**
236
     /**
277
                 <Card.Content>
277
                 <Card.Content>
278
                     <Divider/>
278
                     <Divider/>
279
                     <List.Section>
279
                     <List.Section>
280
-                        <List.Subheader>{i18n.t("profileScreen.personalInformation")}</List.Subheader>
280
+                        <List.Subheader>{i18n.t("screens.profile.personalInformation")}</List.Subheader>
281
                         {this.getPersonalListItem(this.data.birthday, "cake-variant")}
281
                         {this.getPersonalListItem(this.data.birthday, "cake-variant")}
282
                         {this.getPersonalListItem(this.data.phone, "phone")}
282
                         {this.getPersonalListItem(this.data.phone, "phone")}
283
                         {this.getPersonalListItem(this.data.email, "email")}
283
                         {this.getPersonalListItem(this.data.email, "email")}
288
                         <Button
288
                         <Button
289
                             icon="account-edit"
289
                             icon="account-edit"
290
                             mode="contained"
290
                             mode="contained"
291
-                            onPress={() => this.props.navigation.navigate("website", {host: AvailableWebsites.websites.AMICALE, path: this.data.link, title: i18n.t('screens.amicaleWebsite')})}
291
+                            onPress={() => this.props.navigation.navigate("website", {host: AvailableWebsites.websites.AMICALE, path: this.data.link, title: i18n.t('screens.websites.amicale')})}
292
                             style={styles.editButton}>
292
                             style={styles.editButton}>
293
-                            {i18n.t("profileScreen.editInformation")}
293
+                            {i18n.t("screens.profile.editInformation")}
294
                         </Button>
294
                         </Button>
295
                     </Card.Actions>
295
                     </Card.Actions>
296
                 </Card.Content>
296
                 </Card.Content>
307
         return (
307
         return (
308
             <Card style={styles.card}>
308
             <Card style={styles.card}>
309
                 <Card.Title
309
                 <Card.Title
310
-                    title={i18n.t("profileScreen.clubs")}
311
-                    subtitle={i18n.t("profileScreen.clubsSubtitle")}
310
+                    title={i18n.t("screens.profile.clubs")}
311
+                    subtitle={i18n.t("screens.profile.clubsSubtitle")}
312
                     left={(props) => <Avatar.Icon
312
                     left={(props) => <Avatar.Icon
313
                         {...props}
313
                         {...props}
314
                         icon="account-group"
314
                         icon="account-group"
333
         return (
333
         return (
334
             <Card style={styles.card}>
334
             <Card style={styles.card}>
335
                 <Card.Title
335
                 <Card.Title
336
-                    title={i18n.t("profileScreen.membership")}
337
-                    subtitle={i18n.t("profileScreen.membershipSubtitle")}
336
+                    title={i18n.t("screens.profile.membership")}
337
+                    subtitle={i18n.t("screens.profile.membershipSubtitle")}
338
                     left={(props) => <Avatar.Icon
338
                     left={(props) => <Avatar.Icon
339
                         {...props}
339
                         {...props}
340
                         icon="credit-card"
340
                         icon="credit-card"
359
     getMembershipItem(state: boolean) {
359
     getMembershipItem(state: boolean) {
360
         return (
360
         return (
361
             <List.Item
361
             <List.Item
362
-                title={state ? i18n.t("profileScreen.membershipPayed") : i18n.t("profileScreen.membershipNotPayed")}
362
+                title={state ? i18n.t("screens.profile.membershipPayed") : i18n.t("screens.profile.membershipNotPayed")}
363
                 left={props => <List.Icon
363
                 left={props => <List.Icon
364
                     {...props}
364
                     {...props}
365
                     color={state ? this.props.theme.colors.success : this.props.theme.colors.danger}
365
                     color={state ? this.props.theme.colors.success : this.props.theme.colors.danger}
385
      */
385
      */
386
     clubListItem = ({item}: { item: Club }) => {
386
     clubListItem = ({item}: { item: Club }) => {
387
         const onPress = () => this.openClubDetailsScreen(item.id);
387
         const onPress = () => this.openClubDetailsScreen(item.id);
388
-        let description = i18n.t("profileScreen.isMember");
388
+        let description = i18n.t("screens.profile.isMember");
389
         let icon = (props) => <List.Icon {...props} icon="chevron-right"/>;
389
         let icon = (props) => <List.Icon {...props} icon="chevron-right"/>;
390
         if (item.is_manager) {
390
         if (item.is_manager) {
391
-            description = i18n.t("profileScreen.isManager");
391
+            description = i18n.t("screens.profile.isManager");
392
             icon = (props) => <List.Icon {...props} icon="star" color={this.props.theme.colors.primary}/>;
392
             icon = (props) => <List.Icon {...props} icon="star" color={this.props.theme.colors.primary}/>;
393
         }
393
         }
394
         return <List.Item
394
         return <List.Item

+ 6
- 6
src/screens/Home/HomeScreen.js View File

191
         const onPressSettings = () => this.props.navigation.navigate("settings");
191
         const onPressSettings = () => this.props.navigation.navigate("settings");
192
         return <MaterialHeaderButtons>
192
         return <MaterialHeaderButtons>
193
             <Item title="log" iconName={logIcon} color={logColor} onPress={onPressLog}/>
193
             <Item title="log" iconName={logIcon} color={logColor} onPress={onPressLog}/>
194
-            <Item title={i18n.t("screens.settings")} iconName={"settings"} onPress={onPressSettings}/>
194
+            <Item title={i18n.t("screens.settings.title")} iconName={"settings"} onPress={onPressSettings}/>
195
         </MaterialHeaderButtons>;
195
         </MaterialHeaderButtons>;
196
     };
196
     };
197
 
197
 
246
                 id: SECTIONS_ID[0]
246
                 id: SECTIONS_ID[0]
247
             },
247
             },
248
             {
248
             {
249
-                title: i18n.t('homeScreen.newsFeed'),
249
+                title: '',
250
                 data: this.currentNewFeed,
250
                 data: this.currentNewFeed,
251
                 id: SECTIONS_ID[1]
251
                 id: SECTIONS_ID[1]
252
             }
252
             }
602
                 </View>
602
                 </View>
603
                 <MascotPopup
603
                 <MascotPopup
604
                     visible={this.state.mascotDialogVisible}
604
                     visible={this.state.mascotDialogVisible}
605
-                    title={i18n.t("homeScreen.loginBanner.title")}
606
-                    message={i18n.t("homeScreen.loginBanner.message")}
605
+                    title={i18n.t("screens.home.mascotDialog.title")}
606
+                    message={i18n.t("screens.home.mascotDialog.message")}
607
                     icon={"check"}
607
                     icon={"check"}
608
                     buttons={{
608
                     buttons={{
609
                         action: {
609
                         action: {
610
-                            message: i18n.t("homeScreen.loginBanner.login"),
610
+                            message: i18n.t("screens.home.mascotDialog.login"),
611
                             icon: "login",
611
                             icon: "login",
612
                             onPress: this.onLogin,
612
                             onPress: this.onLogin,
613
                         },
613
                         },
614
                         cancel: {
614
                         cancel: {
615
-                            message: i18n.t("homeScreen.loginBanner.later"),
615
+                            message: i18n.t("screens.home.mascotDialog.later"),
616
                             icon: "close",
616
                             icon: "close",
617
                             color: this.props.theme.colors.warning,
617
                             color: this.props.theme.colors.warning,
618
                             onPress: this.hideMascotDialog,
618
                             onPress: this.hideMascotDialog,

+ 7
- 7
src/screens/Home/ScannerScreen.js View File

80
      */
80
      */
81
     getPermissionScreen() {
81
     getPermissionScreen() {
82
         return <View style={{marginLeft: 10, marginRight: 10}}>
82
         return <View style={{marginLeft: 10, marginRight: 10}}>
83
-            <Text>{i18n.t("scannerScreen.errorPermission")}</Text>
83
+            <Text>{i18n.t("screens.scanner.permissions.error")}</Text>
84
             <Button
84
             <Button
85
                 icon="camera"
85
                 icon="camera"
86
                 mode="contained"
86
                 mode="contained"
91
                     marginRight: 'auto',
91
                     marginRight: 'auto',
92
                 }}
92
                 }}
93
             >
93
             >
94
-                {i18n.t("scannerScreen.buttonPermission")}
94
+                {i18n.t("screens.scanner.permissions.button")}
95
             </Button>
95
             </Button>
96
         </View>
96
         </View>
97
     }
97
     }
103
         this.setState({
103
         this.setState({
104
             dialogVisible: true,
104
             dialogVisible: true,
105
             scanned: true,
105
             scanned: true,
106
-            dialogTitle: i18n.t("scannerScreen.helpTitle"),
107
-            dialogMessage: i18n.t("scannerScreen.helpMessage"),
106
+            dialogTitle: i18n.t("screens.scanner.help.title"),
107
+            dialogMessage: i18n.t("screens.scanner.help.message"),
108
         });
108
         });
109
     };
109
     };
110
 
110
 
125
         this.setState({
125
         this.setState({
126
             dialogVisible: true,
126
             dialogVisible: true,
127
             scanned: true,
127
             scanned: true,
128
-            dialogTitle: i18n.t("scannerScreen.errorTitle"),
129
-            dialogMessage: i18n.t("scannerScreen.errorMessage"),
128
+            dialogTitle: i18n.t("screens.scanner.error.title"),
129
+            dialogMessage: i18n.t("screens.scanner.error.message"),
130
         });
130
         });
131
     }
131
     }
132
 
132
 
184
                     onPress={this.showHelpDialog}
184
                     onPress={this.showHelpDialog}
185
                     style={styles.button}
185
                     style={styles.button}
186
                 >
186
                 >
187
-                    {i18n.t("scannerScreen.helpButton")}
187
+                    {i18n.t("screens.scanner.help.button")}
188
                 </Button>
188
                 </Button>
189
                 <AlertDialog
189
                 <AlertDialog
190
                     visible={this.state.dialogVisible}
190
                     visible={this.state.dialogVisible}

+ 7
- 7
src/screens/Other/FeedbackScreen.js View File

79
             <ScrollView style={{padding: 5}}>
79
             <ScrollView style={{padding: 5}}>
80
                 <Card>
80
                 <Card>
81
                     <Card.Title
81
                     <Card.Title
82
-                        title={i18n.t('feedbackScreen.bugs')}
83
-                        subtitle={i18n.t('feedbackScreen.bugsSubtitle')}
82
+                        title={i18n.t('screens.feedback.bugs')}
83
+                        subtitle={i18n.t('screens.feedback.bugsSubtitle')}
84
                         left={(props) => <Avatar.Icon {...props} icon="bug"/>}
84
                         left={(props) => <Avatar.Icon {...props} icon="bug"/>}
85
                     />
85
                     />
86
                     <Card.Content>
86
                     <Card.Content>
87
                         <Paragraph>
87
                         <Paragraph>
88
-                            {i18n.t('feedbackScreen.bugsDescription')}
88
+                            {i18n.t('screens.feedback.bugsDescription')}
89
                         </Paragraph>
89
                         </Paragraph>
90
                         <Paragraph style={{color: this.props.theme.colors.primary}}>
90
                         <Paragraph style={{color: this.props.theme.colors.primary}}>
91
-                            {i18n.t('feedbackScreen.contactMeans')}
91
+                            {i18n.t('screens.feedback.contactMeans')}
92
                         </Paragraph>
92
                         </Paragraph>
93
                     </Card.Content>
93
                     </Card.Content>
94
                     {this.getButtons(true)}
94
                     {this.getButtons(true)}
96
 
96
 
97
                 <Card style={{marginTop: 20, marginBottom: 10}}>
97
                 <Card style={{marginTop: 20, marginBottom: 10}}>
98
                     <Card.Title
98
                     <Card.Title
99
-                        title={i18n.t('feedbackScreen.feedback')}
100
-                        subtitle={i18n.t('feedbackScreen.feedbackSubtitle')}
99
+                        title={i18n.t('screens.feedback.title')}
100
+                        subtitle={i18n.t('screens.feedback.feedbackSubtitle')}
101
                         left={(props) => <Avatar.Icon {...props} icon="comment"/>}
101
                         left={(props) => <Avatar.Icon {...props} icon="comment"/>}
102
                     />
102
                     />
103
                     <Card.Content>
103
                     <Card.Content>
104
                         <Paragraph>
104
                         <Paragraph>
105
-                            {i18n.t('feedbackScreen.feedbackDescription')}
105
+                            {i18n.t('screens.feedback.feedbackDescription')}
106
                         </Paragraph>
106
                         </Paragraph>
107
                     </Card.Content>
107
                     </Card.Content>
108
                     {this.getButtons(false)}
108
                     {this.getButtons(false)}

+ 17
- 17
src/screens/Other/SettingsScreen.js View File

176
         return (
176
         return (
177
             <ScrollView>
177
             <ScrollView>
178
                 <Card style={{margin: 5}}>
178
                 <Card style={{margin: 5}}>
179
-                    <Card.Title title={i18n.t('settingsScreen.generalCard')}/>
179
+                    <Card.Title title={i18n.t('screens.settings.generalCard')}/>
180
                     <List.Section>
180
                     <List.Section>
181
                         {Appearance.getColorScheme() !== 'no-preference' ? this.getToggleItem(
181
                         {Appearance.getColorScheme() !== 'no-preference' ? this.getToggleItem(
182
                             this.onToggleNightModeFollowSystem,
182
                             this.onToggleNightModeFollowSystem,
183
                             'theme-light-dark',
183
                             'theme-light-dark',
184
-                            i18n.t('settingsScreen.nightModeAuto'),
184
+                            i18n.t('screens.settings.nightModeAuto'),
185
                             this.state.nightMode ?
185
                             this.state.nightMode ?
186
-                                i18n.t('settingsScreen.nightModeSubOn') :
187
-                                i18n.t('settingsScreen.nightModeSubOff'),
186
+                                i18n.t('screens.settings.nightModeSubOn') :
187
+                                i18n.t('screens.settings.nightModeSubOff'),
188
                             this.state.nightModeFollowSystem
188
                             this.state.nightModeFollowSystem
189
                         ) : null}
189
                         ) : null}
190
                         {
190
                         {
192
                                 this.getToggleItem(
192
                                 this.getToggleItem(
193
                                     this.onToggleNightMode,
193
                                     this.onToggleNightMode,
194
                                     'theme-light-dark',
194
                                     'theme-light-dark',
195
-                                    i18n.t('settingsScreen.nightMode'),
195
+                                    i18n.t('screens.settings.nightMode'),
196
                                     this.state.nightMode ?
196
                                     this.state.nightMode ?
197
-                                        i18n.t('settingsScreen.nightModeSubOn') :
198
-                                        i18n.t('settingsScreen.nightModeSubOff'),
197
+                                        i18n.t('screens.settings.nightModeSubOn') :
198
+                                        i18n.t('screens.settings.nightModeSubOff'),
199
                                     this.state.nightMode
199
                                     this.state.nightMode
200
                                 ) : null
200
                                 ) : null
201
                         }
201
                         }
202
                         <List.Item
202
                         <List.Item
203
-                            title={i18n.t('settingsScreen.startScreen')}
204
-                            subtitle={i18n.t('settingsScreen.startScreenSub')}
203
+                            title={i18n.t('screens.settings.startScreen')}
204
+                            subtitle={i18n.t('screens.settings.startScreenSub')}
205
                             left={props => <List.Icon {...props} icon="power"/>}
205
                             left={props => <List.Icon {...props} icon="power"/>}
206
                         />
206
                         />
207
                         {this.getStartScreenPicker()}
207
                         {this.getStartScreenPicker()}
211
                     <Card.Title title="Proxiwash"/>
211
                     <Card.Title title="Proxiwash"/>
212
                     <List.Section>
212
                     <List.Section>
213
                         <List.Item
213
                         <List.Item
214
-                            title={i18n.t('settingsScreen.proxiwashNotifReminder')}
215
-                            description={i18n.t('settingsScreen.proxiwashNotifReminderSub')}
214
+                            title={i18n.t('screens.settings.proxiwashNotifReminder')}
215
+                            description={i18n.t('screens.settings.proxiwashNotifReminderSub')}
216
                             left={props => <List.Icon {...props} icon="washing-machine"/>}
216
                             left={props => <List.Icon {...props} icon="washing-machine"/>}
217
                             opened={true}
217
                             opened={true}
218
                         />
218
                         />
222
                     </List.Section>
222
                     </List.Section>
223
                 </Card>
223
                 </Card>
224
                 <Card style={{margin: 5}}>
224
                 <Card style={{margin: 5}}>
225
-                    <Card.Title title={i18n.t('settingsScreen.information')}/>
225
+                    <Card.Title title={i18n.t('screens.settings.information')}/>
226
                     <List.Section>
226
                     <List.Section>
227
                         {this.state.isDebugUnlocked
227
                         {this.state.isDebugUnlocked
228
                             ? <List.Item
228
                             ? <List.Item
229
-                                title={i18n.t('screens.debug')}
229
+                                title={i18n.t('screens.debug.title')}
230
                                 left={props => <List.Icon {...props} icon="bug-check"/>}
230
                                 left={props => <List.Icon {...props} icon="bug-check"/>}
231
                                 onPress={() => this.props.navigation.navigate("debug")}
231
                                 onPress={() => this.props.navigation.navigate("debug")}
232
                             />
232
                             />
233
                             : null}
233
                             : null}
234
                         <List.Item
234
                         <List.Item
235
-                            title={i18n.t('screens.about')}
236
-                            description={i18n.t('aboutScreen.buttonDesc')}
235
+                            title={i18n.t('screens.about.title')}
236
+                            description={i18n.t('screens.about.buttonDesc')}
237
                             left={props => <List.Icon {...props} icon="information"/>}
237
                             left={props => <List.Icon {...props} icon="information"/>}
238
                             onPress={() => this.props.navigation.navigate("about")}
238
                             onPress={() => this.props.navigation.navigate("about")}
239
                             onLongPress={this.unlockDebugMode}
239
                             onLongPress={this.unlockDebugMode}
240
                         />
240
                         />
241
                         <List.Item
241
                         <List.Item
242
-                            title={i18n.t('feedbackScreen.homeButtonTitle')}
243
-                            description={i18n.t('feedbackScreen.homeButtonSubtitle')}
242
+                            title={i18n.t('screens.feedback.homeButtonTitle')}
243
+                            description={i18n.t('screens.feedback.homeButtonSubtitle')}
244
                             left={props => <List.Icon {...props} icon="bug"/>}
244
                             left={props => <List.Icon {...props} icon="bug"/>}
245
                             onPress={() => this.props.navigation.navigate("feedback")}
245
                             onPress={() => this.props.navigation.navigate("feedback")}
246
                         />
246
                         />

+ 2
- 2
src/screens/Planex/GroupSelectionScreen.js View File

78
     getSearchBar = () => {
78
     getSearchBar = () => {
79
         return (
79
         return (
80
             <Searchbar
80
             <Searchbar
81
-                placeholder={i18n.t('proximoScreen.search')}
81
+                placeholder={i18n.t('screens.proximo.search')}
82
                 onChangeText={this.onSearchStringChange}
82
                 onChangeText={this.onSearchStringChange}
83
             />
83
             />
84
         );
84
         );
230
             data.push(fetchedData[key]);
230
             data.push(fetchedData[key]);
231
         }
231
         }
232
         data.sort(sortName);
232
         data.sort(sortName);
233
-        data.unshift({name: i18n.t("planexScreen.favorites"), id: 0, content: this.state.favoriteGroups});
233
+        data.unshift({name: i18n.t("screens.planex.favorites"), id: 0, content: this.state.favoriteGroups});
234
         return data;
234
         return data;
235
     }
235
     }
236
 
236
 

+ 5
- 5
src/screens/Planex/PlanexScreen.js View File

330
                     ? <ErrorView
330
                     ? <ErrorView
331
                         {...this.props}
331
                         {...this.props}
332
                         icon={'account-clock'}
332
                         icon={'account-clock'}
333
-                        message={i18n.t("planexScreen.noGroupSelected")}
333
+                        message={i18n.t("screens.planex.noGroupSelected")}
334
                         showRetryButton={false}
334
                         showRetryButton={false}
335
                     />
335
                     />
336
                     : null}
336
                     : null}
364
                 </View>
364
                 </View>
365
                 <MascotPopup
365
                 <MascotPopup
366
                     visible={this.state.mascotDialogVisible}
366
                     visible={this.state.mascotDialogVisible}
367
-                    title={i18n.t("planexScreen.enableStartScreenTitle")}
368
-                    message={i18n.t("planexScreen.enableStartScreenMessage")}
367
+                    title={i18n.t("screens.planex.mascotDialog.title")}
368
+                    message={i18n.t("screens.planex.mascotDialog.message")}
369
                     icon={"power"}
369
                     icon={"power"}
370
                     buttons={{
370
                     buttons={{
371
                         action: {
371
                         action: {
372
-                            message: i18n.t("planexScreen.enableStartOK"),
372
+                            message: i18n.t("screens.planex.mascotDialog.ok"),
373
                             icon: "settings",
373
                             icon: "settings",
374
                             onPress: this.onGoToSettings,
374
                             onPress: this.onGoToSettings,
375
                         },
375
                         },
376
                         cancel: {
376
                         cancel: {
377
-                            message: i18n.t("planexScreen.enableStartCancel"),
377
+                            message: i18n.t("screens.planex.mascotDialog.cancel"),
378
                             icon: "close",
378
                             icon: "close",
379
                             color: this.props.theme.colors.warning,
379
                             color: this.props.theme.colors.warning,
380
                             onPress: this.onMascotDialogCancel,
380
                             onPress: this.onMascotDialogCancel,

+ 1
- 1
src/screens/Planning/PlanningDisplayScreen.js View File

144
      */
144
      */
145
     getErrorView() {
145
     getErrorView() {
146
         if (this.errorCode === ERROR_TYPE.BAD_INPUT)
146
         if (this.errorCode === ERROR_TYPE.BAD_INPUT)
147
-            return <ErrorView {...this.props} showRetryButton={false} message={i18n.t("planningScreen.invalidEvent")}
147
+            return <ErrorView {...this.props} showRetryButton={false} message={i18n.t("screens.planning.invalidEvent")}
148
                               icon={"calendar-remove"}/>;
148
                               icon={"calendar-remove"}/>;
149
         else
149
         else
150
             return <ErrorView {...this.props} errorCode={this.errorCode} onRefresh={this.fetchData}/>;
150
             return <ErrorView {...this.props} errorCode={this.errorCode} onRefresh={this.fetchData}/>;

+ 3
- 3
src/screens/Planning/PlanningScreen.js View File

254
                 />
254
                 />
255
                 <MascotPopup
255
                 <MascotPopup
256
                     visible={this.state.mascotDialogVisible}
256
                     visible={this.state.mascotDialogVisible}
257
-                    title={i18n.t("planningScreen.mascotTitle")}
258
-                    message={i18n.t("planningScreen.mascotMessage")}
257
+                    title={i18n.t("screens.planning.mascotDialog.title")}
258
+                    message={i18n.t("screens.planning.mascotDialog.message")}
259
                     icon={"calendar-range"}
259
                     icon={"calendar-range"}
260
                     buttons={{
260
                     buttons={{
261
                         action: null,
261
                         action: null,
262
                         cancel: {
262
                         cancel: {
263
-                            message: i18n.t("planningScreen.mascotButton"),
263
+                            message: i18n.t("screens.planning.mascotDialog.button"),
264
                             icon: "check",
264
                             icon: "check",
265
                             onPress: this.onHideMascotDialog,
265
                             onPress: this.onHideMascotDialog,
266
                         }
266
                         }

+ 16
- 16
src/screens/Proxiwash/ProxiwashAboutScreen.js View File

30
                         source={{uri: LOGO}}
30
                         source={{uri: LOGO}}
31
                         style={{height: '100%', width: '100%', resizeMode: "contain"}}/>
31
                         style={{height: '100%', width: '100%', resizeMode: "contain"}}/>
32
                 </View>
32
                 </View>
33
-                <Text>{i18n.t('proxiwashScreen.description')}</Text>
33
+                <Text>{i18n.t('screens.proxiwash.description')}</Text>
34
                 <Card style={{margin: 5}}>
34
                 <Card style={{margin: 5}}>
35
                     <Card.Title
35
                     <Card.Title
36
-                        title={i18n.t('proxiwashScreen.dryer')}
36
+                        title={i18n.t('screens.proxiwash.dryer')}
37
                         left={props => <List.Icon {...props} icon={'tumble-dryer'}/>}
37
                         left={props => <List.Icon {...props} icon={'tumble-dryer'}/>}
38
                     />
38
                     />
39
                     <Card.Content>
39
                     <Card.Content>
40
-                        <Title>{i18n.t('proxiwashScreen.procedure')}</Title>
41
-                        <Paragraph>{i18n.t('proxiwashScreen.dryerProcedure')}</Paragraph>
42
-                        <Title>{i18n.t('proxiwashScreen.tips')}</Title>
43
-                        <Paragraph>{i18n.t('proxiwashScreen.dryerTips')}</Paragraph>
40
+                        <Title>{i18n.t('screens.proxiwash.procedure')}</Title>
41
+                        <Paragraph>{i18n.t('screens.proxiwash.dryerProcedure')}</Paragraph>
42
+                        <Title>{i18n.t('screens.proxiwash.tips')}</Title>
43
+                        <Paragraph>{i18n.t('screens.proxiwash.dryerTips')}</Paragraph>
44
                     </Card.Content>
44
                     </Card.Content>
45
                 </Card>
45
                 </Card>
46
 
46
 
47
                 <Card style={{margin: 5}}>
47
                 <Card style={{margin: 5}}>
48
                     <Card.Title
48
                     <Card.Title
49
-                        title={i18n.t('proxiwashScreen.washer')}
49
+                        title={i18n.t('screens.proxiwash.washer')}
50
                         left={props => <List.Icon {...props} icon={'washing-machine'}/>}
50
                         left={props => <List.Icon {...props} icon={'washing-machine'}/>}
51
                     />
51
                     />
52
                     <Card.Content>
52
                     <Card.Content>
53
-                        <Title>{i18n.t('proxiwashScreen.procedure')}</Title>
54
-                        <Paragraph>{i18n.t('proxiwashScreen.washerProcedure')}</Paragraph>
55
-                        <Title>{i18n.t('proxiwashScreen.tips')}</Title>
56
-                        <Paragraph>{i18n.t('proxiwashScreen.washerTips')}</Paragraph>
53
+                        <Title>{i18n.t('screens.proxiwash.procedure')}</Title>
54
+                        <Paragraph>{i18n.t('screens.proxiwash.washerProcedure')}</Paragraph>
55
+                        <Title>{i18n.t('screens.proxiwash.tips')}</Title>
56
+                        <Paragraph>{i18n.t('screens.proxiwash.washerTips')}</Paragraph>
57
                     </Card.Content>
57
                     </Card.Content>
58
                 </Card>
58
                 </Card>
59
 
59
 
60
                 <Card style={{margin: 5}}>
60
                 <Card style={{margin: 5}}>
61
                     <Card.Title
61
                     <Card.Title
62
-                        title={i18n.t('proxiwashScreen.tariffs')}
62
+                        title={i18n.t('screens.proxiwash.tariffs')}
63
                         left={props => <List.Icon {...props} icon={'coins'}/>}
63
                         left={props => <List.Icon {...props} icon={'coins'}/>}
64
                     />
64
                     />
65
                     <Card.Content>
65
                     <Card.Content>
66
-                        <Paragraph>{i18n.t('proxiwashScreen.washersTariff')}</Paragraph>
67
-                        <Paragraph>{i18n.t('proxiwashScreen.dryersTariff')}</Paragraph>
66
+                        <Paragraph>{i18n.t('screens.proxiwash.washersTariff')}</Paragraph>
67
+                        <Paragraph>{i18n.t('screens.proxiwash.dryersTariff')}</Paragraph>
68
                     </Card.Content>
68
                     </Card.Content>
69
                 </Card>
69
                 </Card>
70
                 <Card style={{margin: 5, marginBottom: CustomTabBar.TAB_BAR_HEIGHT + 20}}>
70
                 <Card style={{margin: 5, marginBottom: CustomTabBar.TAB_BAR_HEIGHT + 20}}>
71
                     <Card.Title
71
                     <Card.Title
72
-                        title={i18n.t('proxiwashScreen.paymentMethods')}
72
+                        title={i18n.t('screens.proxiwash.paymentMethods')}
73
                         left={props => <List.Icon {...props} icon={'cash'}/>}
73
                         left={props => <List.Icon {...props} icon={'cash'}/>}
74
                     />
74
                     />
75
                     <Card.Content>
75
                     <Card.Content>
76
-                        <Paragraph>{i18n.t('proxiwashScreen.paymentMethodsDescription')}</Paragraph>
76
+                        <Paragraph>{i18n.t('screens.proxiwash.paymentMethodsDescription')}</Paragraph>
77
                     </Card.Content>
77
                     </Card.Content>
78
                 </Card>
78
                 </Card>
79
             </ScrollView>
79
             </ScrollView>

+ 22
- 22
src/screens/Proxiwash/ProxiwashScreen.js View File

75
      */
75
      */
76
     constructor(props) {
76
     constructor(props) {
77
         super(props);
77
         super(props);
78
-        modalStateStrings[ProxiwashConstants.machineStates.AVAILABLE] = i18n.t('proxiwashScreen.modal.ready');
79
-        modalStateStrings[ProxiwashConstants.machineStates.RUNNING] = i18n.t('proxiwashScreen.modal.running');
80
-        modalStateStrings[ProxiwashConstants.machineStates.RUNNING_NOT_STARTED] = i18n.t('proxiwashScreen.modal.runningNotStarted');
81
-        modalStateStrings[ProxiwashConstants.machineStates.FINISHED] = i18n.t('proxiwashScreen.modal.finished');
82
-        modalStateStrings[ProxiwashConstants.machineStates.UNAVAILABLE] = i18n.t('proxiwashScreen.modal.broken');
83
-        modalStateStrings[ProxiwashConstants.machineStates.ERROR] = i18n.t('proxiwashScreen.modal.error');
84
-        modalStateStrings[ProxiwashConstants.machineStates.UNKNOWN] = i18n.t('proxiwashScreen.modal.unknown');
78
+        modalStateStrings[ProxiwashConstants.machineStates.AVAILABLE] = i18n.t('screens.proxiwash.modal.ready');
79
+        modalStateStrings[ProxiwashConstants.machineStates.RUNNING] = i18n.t('screens.proxiwash.modal.running');
80
+        modalStateStrings[ProxiwashConstants.machineStates.RUNNING_NOT_STARTED] = i18n.t('screens.proxiwash.modal.runningNotStarted');
81
+        modalStateStrings[ProxiwashConstants.machineStates.FINISHED] = i18n.t('screens.proxiwash.modal.finished');
82
+        modalStateStrings[ProxiwashConstants.machineStates.UNAVAILABLE] = i18n.t('screens.proxiwash.modal.broken');
83
+        modalStateStrings[ProxiwashConstants.machineStates.ERROR] = i18n.t('screens.proxiwash.modal.error');
84
+        modalStateStrings[ProxiwashConstants.machineStates.UNKNOWN] = i18n.t('screens.proxiwash.modal.unknown');
85
     }
85
     }
86
 
86
 
87
     /**
87
     /**
151
      */
151
      */
152
     showNotificationsDisabledWarning() {
152
     showNotificationsDisabledWarning() {
153
         Alert.alert(
153
         Alert.alert(
154
-            i18n.t("proxiwashScreen.modal.notificationErrorTitle"),
155
-            i18n.t("proxiwashScreen.modal.notificationErrorDescription"),
154
+            i18n.t("screens.proxiwash.modal.notificationErrorTitle"),
155
+            i18n.t("screens.proxiwash.modal.notificationErrorDescription"),
156
         );
156
         );
157
     }
157
     }
158
 
158
 
209
             getCleanedMachineWatched(this.state.machinesWatched, [...data.dryers, ...data.washers]);
209
             getCleanedMachineWatched(this.state.machinesWatched, [...data.dryers, ...data.washers]);
210
         return [
210
         return [
211
             {
211
             {
212
-                title: i18n.t('proxiwashScreen.dryers'),
212
+                title: i18n.t('screens.proxiwash.dryers'),
213
                 icon: 'tumble-dryer',
213
                 icon: 'tumble-dryer',
214
                 data: data.dryers === undefined ? [] : data.dryers,
214
                 data: data.dryers === undefined ? [] : data.dryers,
215
                 keyExtractor: this.getKeyExtractor
215
                 keyExtractor: this.getKeyExtractor
216
             },
216
             },
217
             {
217
             {
218
-                title: i18n.t('proxiwashScreen.washers'),
218
+                title: i18n.t('screens.proxiwash.washers'),
219
                 icon: 'washing-machine',
219
                 icon: 'washing-machine',
220
                 data: data.washers === undefined ? [] : data.washers,
220
                 data: data.washers === undefined ? [] : data.washers,
221
                 keyExtractor: this.getKeyExtractor
221
                 keyExtractor: this.getKeyExtractor
262
      */
262
      */
263
     getModalContent(title: string, item: Machine, isDryer: boolean) {
263
     getModalContent(title: string, item: Machine, isDryer: boolean) {
264
         let button = {
264
         let button = {
265
-            text: i18n.t("proxiwashScreen.modal.ok"),
265
+            text: i18n.t("screens.proxiwash.modal.ok"),
266
             icon: '',
266
             icon: '',
267
             onPress: undefined
267
             onPress: undefined
268
         };
268
         };
276
             button =
276
             button =
277
                 {
277
                 {
278
                     text: isMachineWatched(item, this.state.machinesWatched) ?
278
                     text: isMachineWatched(item, this.state.machinesWatched) ?
279
-                        i18n.t("proxiwashScreen.modal.disableNotifications") :
280
-                        i18n.t("proxiwashScreen.modal.enableNotifications"),
279
+                        i18n.t("screens.proxiwash.modal.disableNotifications") :
280
+                        i18n.t("screens.proxiwash.modal.enableNotifications"),
281
                     icon: '',
281
                     icon: '',
282
                     onPress: onPress
282
                     onPress: onPress
283
                 }
283
                 }
284
             ;
284
             ;
285
-            message = i18n.t('proxiwashScreen.modal.running',
285
+            message = i18n.t('screens.proxiwash.modal.running',
286
                 {
286
                 {
287
                     start: item.startTime,
287
                     start: item.startTime,
288
                     end: item.endTime,
288
                     end: item.endTime,
291
                 });
291
                 });
292
         } else if (item.state === ProxiwashConstants.machineStates.AVAILABLE) {
292
         } else if (item.state === ProxiwashConstants.machineStates.AVAILABLE) {
293
             if (isDryer)
293
             if (isDryer)
294
-                message += '\n' + i18n.t('proxiwashScreen.dryersTariff');
294
+                message += '\n' + i18n.t('screens.proxiwash.dryersTariff');
295
             else
295
             else
296
-                message += '\n' + i18n.t('proxiwashScreen.washersTariff');
296
+                message += '\n' + i18n.t('screens.proxiwash.washersTariff');
297
         }
297
         }
298
         return (
298
         return (
299
             <View style={{
299
             <View style={{
363
      * @return {*}
363
      * @return {*}
364
      */
364
      */
365
     getRenderSectionHeader = ({section}: Object) => {
365
     getRenderSectionHeader = ({section}: Object) => {
366
-        const isDryer = section.title === i18n.t('proxiwashScreen.dryers');
366
+        const isDryer = section.title === i18n.t('screens.proxiwash.dryers');
367
         const nbAvailable = this.getMachineAvailableNumber(isDryer);
367
         const nbAvailable = this.getMachineAvailableNumber(isDryer);
368
         return (
368
         return (
369
             <ProxiwashSectionHeader
369
             <ProxiwashSectionHeader
381
      * @returns {React.Node}
381
      * @returns {React.Node}
382
      */
382
      */
383
     getRenderItem = ({item, section}: Object) => {
383
     getRenderItem = ({item, section}: Object) => {
384
-        const isDryer = section.title === i18n.t('proxiwashScreen.dryers');
384
+        const isDryer = section.title === i18n.t('screens.proxiwash.dryers');
385
         return (
385
         return (
386
             <ProxiwashListItem
386
             <ProxiwashListItem
387
                 item={item}
387
                 item={item}
416
                 </View>
416
                 </View>
417
                 <MascotPopup
417
                 <MascotPopup
418
                     visible={this.state.mascotDialogVisible}
418
                     visible={this.state.mascotDialogVisible}
419
-                    title={i18n.t("proxiwashScreen.bannerTitle")}
420
-                    message={i18n.t("proxiwashScreen.enableNotificationsTip")}
419
+                    title={i18n.t("screens.proxiwash.mascotDialog.title")}
420
+                    message={i18n.t("screens.proxiwash.mascotDialog.message")}
421
                     icon={"bell"}
421
                     icon={"bell"}
422
                     buttons={{
422
                     buttons={{
423
                         action: null,
423
                         action: null,
424
                         cancel: {
424
                         cancel: {
425
-                            message: i18n.t("proxiwashScreen.bannerButton"),
425
+                            message: i18n.t("screens.proxiwash.mascotDialog.ok"),
426
                             icon: "check",
426
                             icon: "check",
427
                             onPress: this.onHideMascotDialog,
427
                             onPress: this.onHideMascotDialog,
428
                         }
428
                         }

+ 4
- 4
src/screens/Services/Proximo/ProximoAboutScreen.js View File

33
                         source={{uri: LOGO}}
33
                         source={{uri: LOGO}}
34
                         style={{height: '100%', width: '100%', resizeMode: "contain"}}/>
34
                         style={{height: '100%', width: '100%', resizeMode: "contain"}}/>
35
                 </View>
35
                 </View>
36
-                <Text>{i18n.t('proximoScreen.description')}</Text>
36
+                <Text>{i18n.t('screens.proximo.description')}</Text>
37
                 <Card style={{margin: 5}}>
37
                 <Card style={{margin: 5}}>
38
                     <Card.Title
38
                     <Card.Title
39
-                        title={i18n.t('proximoScreen.openingHours')}
39
+                        title={i18n.t('screens.proximo.openingHours')}
40
                         left={props => <List.Icon {...props} icon={'clock-outline'}/>}
40
                         left={props => <List.Icon {...props} icon={'clock-outline'}/>}
41
                     />
41
                     />
42
                     <Card.Content>
42
                     <Card.Content>
45
                 </Card>
45
                 </Card>
46
                 <Card style={{margin: 5, marginBottom: CustomTabBar.TAB_BAR_HEIGHT + 20}}>
46
                 <Card style={{margin: 5, marginBottom: CustomTabBar.TAB_BAR_HEIGHT + 20}}>
47
                     <Card.Title
47
                     <Card.Title
48
-                        title={i18n.t('proximoScreen.paymentMethods')}
48
+                        title={i18n.t('screens.proximo.paymentMethods')}
49
                         left={props => <List.Icon {...props} icon={'cash'}/>}
49
                         left={props => <List.Icon {...props} icon={'cash'}/>}
50
                     />
50
                     />
51
                     <Card.Content>
51
                     <Card.Content>
52
-                        <Paragraph>{i18n.t('proximoScreen.paymentMethodsDescription')}</Paragraph>
52
+                        <Paragraph>{i18n.t('screens.proximo.paymentMethodsDescription')}</Paragraph>
53
                     </Card.Content>
53
                     </Card.Content>
54
                 </Card>
54
                 </Card>
55
             </ScrollView>
55
             </ScrollView>

+ 7
- 7
src/screens/Services/Proximo/ProximoListScreen.js View File

95
     getSearchBar = () => {
95
     getSearchBar = () => {
96
         return (
96
         return (
97
             <Searchbar
97
             <Searchbar
98
-                placeholder={i18n.t('proximoScreen.search')}
98
+                placeholder={i18n.t('screens.proximo.search')}
99
                 onChangeText={this.onSearchStringChange}
99
                 onChangeText={this.onSearchStringChange}
100
             />
100
             />
101
         );
101
         );
200
                     <Subheading style={{
200
                     <Subheading style={{
201
                         color: this.getStockColor(parseInt(item.quantity)),
201
                         color: this.getStockColor(parseInt(item.quantity)),
202
                     }}>
202
                     }}>
203
-                        {item.quantity + ' ' + i18n.t('proximoScreen.inStock')}
203
+                        {item.quantity + ' ' + i18n.t('screens.proximo.inStock')}
204
                     </Subheading>
204
                     </Subheading>
205
                     <Subheading style={{marginLeft: 'auto'}}>{item.price}€</Subheading>
205
                     <Subheading style={{marginLeft: 'auto'}}>{item.price}€</Subheading>
206
                 </View>
206
                 </View>
227
                 flex: 1,
227
                 flex: 1,
228
                 padding: 20
228
                 padding: 20
229
             }}>
229
             }}>
230
-                <Title style={{marginBottom: 10}}>{i18n.t('proximoScreen.sortOrder')}</Title>
230
+                <Title style={{marginBottom: 10}}>{i18n.t('screens.proximo.sortOrder')}</Title>
231
                 <RadioButton.Group
231
                 <RadioButton.Group
232
                     onValueChange={value => this.setSortMode(value)}
232
                     onValueChange={value => this.setSortMode(value)}
233
                     value={this.state.currentSortMode}
233
                     value={this.state.currentSortMode}
234
                 >
234
                 >
235
-                    <RadioButton.Item label={i18n.t('proximoScreen.sortPrice')} value={1}/>
236
-                    <RadioButton.Item label={i18n.t('proximoScreen.sortPriceReverse')} value={2}/>
237
-                    <RadioButton.Item label={i18n.t('proximoScreen.sortName')} value={3}/>
238
-                    <RadioButton.Item label={i18n.t('proximoScreen.sortNameReverse')} value={4}/>
235
+                    <RadioButton.Item label={i18n.t('screens.proximo.sortPrice')} value={1}/>
236
+                    <RadioButton.Item label={i18n.t('screens.proximo.sortPriceReverse')} value={2}/>
237
+                    <RadioButton.Item label={i18n.t('screens.proximo.sortName')} value={3}/>
238
+                    <RadioButton.Item label={i18n.t('screens.proximo.sortNameReverse')} value={4}/>
239
                 </RadioButton.Group>
239
                 </RadioButton.Group>
240
             </View>
240
             </View>
241
         );
241
         );

+ 3
- 3
src/screens/Services/Proximo/ProximoMainScreen.js View File

75
             data: {
75
             data: {
76
                 type: {
76
                 type: {
77
                     id: "0",
77
                     id: "0",
78
-                    name: i18n.t('proximoScreen.all'),
78
+                    name: i18n.t('screens.proximo.all'),
79
                     icon: 'star'
79
                     icon: 'star'
80
                 },
80
                 },
81
                 data: this.articles !== undefined ?
81
                 data: this.articles !== undefined ?
146
             finalData.push({
146
             finalData.push({
147
                 type: {
147
                 type: {
148
                     id: -1,
148
                     id: -1,
149
-                    name: i18n.t('proximoScreen.all'),
149
+                    name: i18n.t('screens.proximo.all'),
150
                     icon: 'star'
150
                     icon: 'star'
151
                 },
151
                 },
152
                 data: this.getAvailableArticles(this.articles, undefined)
152
                 data: this.getAvailableArticles(this.articles, undefined)
193
             shouldFocusSearchBar: false,
193
             shouldFocusSearchBar: false,
194
             data: item,
194
             data: item,
195
         };
195
         };
196
-        const subtitle = item.data.length + " " + (item.data.length > 1 ? i18n.t('proximoScreen.articles') : i18n.t('proximoScreen.article'));
196
+        const subtitle = item.data.length + " " + (item.data.length > 1 ? i18n.t('screens.proximo.articles') : i18n.t('screens.proximo.article'));
197
         const onPress = this.props.navigation.navigate.bind(this, 'proximo-list', dataToSend);
197
         const onPress = this.props.navigation.navigate.bind(this, 'proximo-list', dataToSend);
198
         if (item.data.length > 0) {
198
         if (item.data.length > 0) {
199
             return (
199
             return (

+ 39
- 39
src/screens/Services/ServicesScreen.js View File

74
         const nav = props.navigation;
74
         const nav = props.navigation;
75
         this.amicaleDataset = [
75
         this.amicaleDataset = [
76
             {
76
             {
77
-                title: i18n.t('screens.clubsAbout'),
78
-                subtitle: i18n.t('servicesScreen.descriptions.clubs'),
77
+                title: i18n.t('screens.clubs.title'),
78
+                subtitle: i18n.t('screens.services.descriptions.clubs'),
79
                 image: CLUBS_IMAGE,
79
                 image: CLUBS_IMAGE,
80
                 onPress: () => this.onAmicaleServicePress("club-list"),
80
                 onPress: () => this.onAmicaleServicePress("club-list"),
81
             },
81
             },
82
             {
82
             {
83
-                title: i18n.t('screens.profile'),
84
-                subtitle: i18n.t('servicesScreen.descriptions.profile'),
83
+                title: i18n.t('screens.profile.title'),
84
+                subtitle: i18n.t('screens.services.descriptions.profile'),
85
                 image: PROFILE_IMAGE,
85
                 image: PROFILE_IMAGE,
86
                 onPress: () => this.onAmicaleServicePress("profile"),
86
                 onPress: () => this.onAmicaleServicePress("profile"),
87
             },
87
             },
88
             {
88
             {
89
-                title: i18n.t('screens.equipmentList'),
90
-                subtitle: i18n.t('servicesScreen.descriptions.equipment'),
89
+                title: i18n.t('screens.equipment.title'),
90
+                subtitle: i18n.t('screens.services.descriptions.equipment'),
91
                 image: EQUIPMENT_IMAGE,
91
                 image: EQUIPMENT_IMAGE,
92
                 onPress: () => this.onAmicaleServicePress("equipment-list"),
92
                 onPress: () => this.onAmicaleServicePress("equipment-list"),
93
             },
93
             },
94
             {
94
             {
95
-                title: i18n.t('screens.amicaleWebsite'),
96
-                subtitle: i18n.t('servicesScreen.descriptions.amicaleWebsite'),
95
+                title: i18n.t('screens.websites.amicale'),
96
+                subtitle: i18n.t('screens.services.descriptions.amicaleWebsite'),
97
                 image: AMICALE_IMAGE,
97
                 image: AMICALE_IMAGE,
98
-                onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.AMICALE, title: i18n.t('screens.amicaleWebsite')}),
98
+                onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.AMICALE, title: i18n.t('screens.websites.amicale')}),
99
             },
99
             },
100
             {
100
             {
101
-                title: i18n.t('screens.vote'),
102
-                subtitle: i18n.t('servicesScreen.descriptions.vote'),
101
+                title: i18n.t('screens.vote.title'),
102
+                subtitle: i18n.t('screens.services.descriptions.vote'),
103
                 image: VOTE_IMAGE,
103
                 image: VOTE_IMAGE,
104
                 onPress: () => this.onAmicaleServicePress("vote"),
104
                 onPress: () => this.onAmicaleServicePress("vote"),
105
             },
105
             },
106
         ];
106
         ];
107
         this.studentsDataset = [
107
         this.studentsDataset = [
108
             {
108
             {
109
-                title: i18n.t('screens.proximo'),
110
-                subtitle: i18n.t('servicesScreen.descriptions.proximo'),
109
+                title: i18n.t('screens.proximo.title'),
110
+                subtitle: i18n.t('screens.services.descriptions.proximo'),
111
                 image: PROXIMO_IMAGE,
111
                 image: PROXIMO_IMAGE,
112
                 onPress: () => nav.navigate("proximo"),
112
                 onPress: () => nav.navigate("proximo"),
113
             },
113
             },
114
             {
114
             {
115
                 title: "Wiketud",
115
                 title: "Wiketud",
116
-                subtitle: i18n.t('servicesScreen.descriptions.wiketud'),
116
+                subtitle: i18n.t('screens.services.descriptions.wiketud'),
117
                 image: WIKETUD_IMAGE,
117
                 image: WIKETUD_IMAGE,
118
                 onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.WIKETUD, title: "Wiketud"}),
118
                 onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.WIKETUD, title: "Wiketud"}),
119
             },
119
             },
120
             {
120
             {
121
                 title: "Élus Étudiants",
121
                 title: "Élus Étudiants",
122
-                subtitle: i18n.t('servicesScreen.descriptions.elusEtudiants'),
122
+                subtitle: i18n.t('screens.services.descriptions.elusEtudiants'),
123
                 image: EE_IMAGE,
123
                 image: EE_IMAGE,
124
                 onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.ELUS_ETUDIANTS, title: "Élus Étudiants"}),
124
                 onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.ELUS_ETUDIANTS, title: "Élus Étudiants"}),
125
             },
125
             },
126
             {
126
             {
127
                 title: "Tutor'INSA",
127
                 title: "Tutor'INSA",
128
-                subtitle: i18n.t('servicesScreen.descriptions.tutorInsa'),
128
+                subtitle: i18n.t('screens.services.descriptions.tutorInsa'),
129
                 image: TUTORINSA_IMAGE,
129
                 image: TUTORINSA_IMAGE,
130
                 onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.TUTOR_INSA, title: "Tutor'INSA"})
130
                 onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.TUTOR_INSA, title: "Tutor'INSA"})
131
             },
131
             },
132
         ];
132
         ];
133
         this.insaDataset = [
133
         this.insaDataset = [
134
             {
134
             {
135
-                title: i18n.t('screens.menuSelf'),
136
-                subtitle: i18n.t('servicesScreen.descriptions.self'),
135
+                title: i18n.t('screens.menu.title'),
136
+                subtitle: i18n.t('screens.services.descriptions.self'),
137
                 image: RU_IMAGE,
137
                 image: RU_IMAGE,
138
                 onPress: () => nav.navigate("self-menu"),
138
                 onPress: () => nav.navigate("self-menu"),
139
             },
139
             },
140
             {
140
             {
141
-                title: i18n.t('screens.availableRooms'),
142
-                subtitle: i18n.t('servicesScreen.descriptions.availableRooms'),
141
+                title: i18n.t('screens.websites.rooms'),
142
+                subtitle: i18n.t('screens.services.descriptions.availableRooms'),
143
                 image: ROOM_IMAGE,
143
                 image: ROOM_IMAGE,
144
-                onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.AVAILABLE_ROOMS, title: i18n.t('screens.availableRooms')}),
144
+                onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.AVAILABLE_ROOMS, title: i18n.t('screens.websites.rooms')}),
145
             },
145
             },
146
             {
146
             {
147
-                title: i18n.t('screens.bib'),
148
-                subtitle: i18n.t('servicesScreen.descriptions.bib'),
147
+                title: i18n.t('screens.websites.bib'),
148
+                subtitle: i18n.t('screens.services.descriptions.bib'),
149
                 image: BIB_IMAGE,
149
                 image: BIB_IMAGE,
150
-                onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.BIB, title: i18n.t('screens.bib')}),
150
+                onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.BIB, title: i18n.t('screens.websites.bib')}),
151
             },
151
             },
152
             {
152
             {
153
-                title: i18n.t('screens.bluemind'),
154
-                subtitle: i18n.t('servicesScreen.descriptions.mails'),
153
+                title: i18n.t('screens.websites.mails'),
154
+                subtitle: i18n.t('screens.services.descriptions.mails'),
155
                 image: EMAIL_IMAGE,
155
                 image: EMAIL_IMAGE,
156
-                onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.BLUEMIND, title: i18n.t('screens.bluemind')}),
156
+                onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.BLUEMIND, title: i18n.t('screens.websites.mails')}),
157
             },
157
             },
158
             {
158
             {
159
-                title: i18n.t('screens.ent'),
160
-                subtitle: i18n.t('servicesScreen.descriptions.ent'),
159
+                title: i18n.t('screens.websites.ent'),
160
+                subtitle: i18n.t('screens.services.descriptions.ent'),
161
                 image: ENT_IMAGE,
161
                 image: ENT_IMAGE,
162
-                onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.ENT, title: i18n.t('screens.ent')}),
162
+                onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.ENT, title: i18n.t('screens.websites.ent')}),
163
             },
163
             },
164
             {
164
             {
165
-                title: i18n.t('screens.insaAccount'),
166
-                subtitle: i18n.t('servicesScreen.descriptions.insaAccount'),
165
+                title: i18n.t('screens.insaAccount.title'),
166
+                subtitle: i18n.t('screens.services.descriptions.insaAccount.title'),
167
                 image: ACCOUNT_IMAGE,
167
                 image: ACCOUNT_IMAGE,
168
-                onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.INSA_ACCOUNT, title: i18n.t('screens.insaAccount')}),
168
+                onPress: () => nav.navigate("website", {host: AvailableWebsites.websites.INSA_ACCOUNT, title: i18n.t('screens.insaAccount.title')}),
169
             },
169
             },
170
         ];
170
         ];
171
         this.finalDataset = [
171
         this.finalDataset = [
172
             {
172
             {
173
-                title: i18n.t("servicesScreen.amicale"),
173
+                title: i18n.t("screens.services.categories.amicale"),
174
                 description: "LOGIN",
174
                 description: "LOGIN",
175
                 image: AMICALE_LOGO,
175
                 image: AMICALE_LOGO,
176
                 shouldLogin: true,
176
                 shouldLogin: true,
177
                 content: this.amicaleDataset
177
                 content: this.amicaleDataset
178
             },
178
             },
179
             {
179
             {
180
-                title: i18n.t("servicesScreen.students"),
180
+                title: i18n.t("screens.services.categories.students"),
181
                 description: "SERVICES OFFERED BY STUDENTS",
181
                 description: "SERVICES OFFERED BY STUDENTS",
182
                 image: 'account-group',
182
                 image: 'account-group',
183
                 shouldLogin: false,
183
                 shouldLogin: false,
184
                 content: this.studentsDataset
184
                 content: this.studentsDataset
185
             },
185
             },
186
             {
186
             {
187
-                title: i18n.t("servicesScreen.insa"),
187
+                title: i18n.t("screens.services.categories.insa"),
188
                 description: "SERVICES OFFERED BY INSA",
188
                 description: "SERVICES OFFERED BY INSA",
189
                 image: 'school',
189
                 image: 'school',
190
                 shouldLogin: false,
190
                 shouldLogin: false,
312
                 />
312
                 />
313
                 <MascotPopup
313
                 <MascotPopup
314
                     visible={this.state.mascotDialogVisible}
314
                     visible={this.state.mascotDialogVisible}
315
-                    title={i18n.t("servicesScreen.mascot.title")}
316
-                    message={i18n.t("servicesScreen.mascot.message")}
315
+                    title={i18n.t("screens.services.mascotDialog.title")}
316
+                    message={i18n.t("screens.services.mascotDialog.message")}
317
                     icon={"calendar-range"}
317
                     icon={"calendar-range"}
318
                     buttons={{
318
                     buttons={{
319
                         action: null,
319
                         action: null,
320
                         cancel: {
320
                         cancel: {
321
-                            message: i18n.t("servicesScreen.mascot.button"),
321
+                            message: i18n.t("screens.services.mascotDialog.button"),
322
                             icon: "check",
322
                             icon: "check",
323
                             onPress: this.onHideMascotDialog,
323
                             onPress: this.onHideMascotDialog,
324
                         }
324
                         }

+ 14
- 14
src/screens/Tetris/TetrisScreen.js View File

132
 
132
 
133
     showPausePopup() {
133
     showPausePopup() {
134
         Alert.alert(
134
         Alert.alert(
135
-            i18n.t("game.pause"),
136
-            i18n.t("game.pauseMessage"),
135
+            i18n.t("screens.game.pause"),
136
+            i18n.t("screens.game.pauseMessage"),
137
             [
137
             [
138
-                {text: i18n.t("game.restart.text"), onPress: () => this.showRestartConfirm()},
139
-                {text: i18n.t("game.resume"), onPress: () => this.togglePause()},
138
+                {text: i18n.t("screens.game.restart.text"), onPress: () => this.showRestartConfirm()},
139
+                {text: i18n.t("screens.game.resume"), onPress: () => this.togglePause()},
140
             ],
140
             ],
141
             {cancelable: false},
141
             {cancelable: false},
142
         );
142
         );
144
 
144
 
145
     showRestartConfirm() {
145
     showRestartConfirm() {
146
         Alert.alert(
146
         Alert.alert(
147
-            i18n.t("game.restart.confirm"),
148
-            i18n.t("game.restart.confirmMessage"),
147
+            i18n.t("screens.game.restart.confirm"),
148
+            i18n.t("screens.game.restart.confirmMessage"),
149
             [
149
             [
150
-                {text: i18n.t("game.restart.confirmNo"), onPress: () => this.showPausePopup()},
151
-                {text: i18n.t("game.restart.confirmYes"), onPress: () => this.startGame()},
150
+                {text: i18n.t("screens.game.restart.confirmNo"), onPress: () => this.showPausePopup()},
151
+                {text: i18n.t("screens.game.restart.confirmYes"), onPress: () => this.startGame()},
152
             ],
152
             ],
153
             {cancelable: false},
153
             {cancelable: false},
154
         );
154
         );
155
     }
155
     }
156
 
156
 
157
     showGameOverConfirm() {
157
     showGameOverConfirm() {
158
-        let message = i18n.t("game.gameOver.score") + this.state.gameScore + '\n';
159
-        message += i18n.t("game.gameOver.level") + this.state.gameLevel + '\n';
160
-        message += i18n.t("game.gameOver.time") + this.getFormattedTime(this.state.gameTime) + '\n';
158
+        let message = i18n.t("screens.game.gameOver.score") + this.state.gameScore + '\n';
159
+        message += i18n.t("screens.game.gameOver.level") + this.state.gameLevel + '\n';
160
+        message += i18n.t("screens.game.gameOver.time") + this.getFormattedTime(this.state.gameTime) + '\n';
161
         Alert.alert(
161
         Alert.alert(
162
-            i18n.t("game.gameOver.text"),
162
+            i18n.t("screens.game.gameOver.text"),
163
             message,
163
             message,
164
             [
164
             [
165
-                {text: i18n.t("game.gameOver.exit"), onPress: () => this.props.navigation.goBack()},
166
-                {text: i18n.t("game.restart.text"), onPress: () => this.startGame()},
165
+                {text: i18n.t("screens.game.gameOver.exit"), onPress: () => this.props.navigation.goBack()},
166
+                {text: i18n.t("screens.game.restart.text"), onPress: () => this.startGame()},
167
             ],
167
             ],
168
             {cancelable: false},
168
             {cancelable: false},
169
         );
169
         );

+ 5
- 5
src/utils/EquipmentBooking.js View File

75
     const yearDelta = date.getUTCFullYear() - today.getUTCFullYear();
75
     const yearDelta = date.getUTCFullYear() - today.getUTCFullYear();
76
     const monthDelta = date.getUTCMonth() - today.getUTCMonth();
76
     const monthDelta = date.getUTCMonth() - today.getUTCMonth();
77
     const dayDelta = date.getUTCDate() - today.getUTCDate();
77
     const dayDelta = date.getUTCDate() - today.getUTCDate();
78
-    let translatedString = i18n.t('equipmentScreen.today');
78
+    let translatedString = i18n.t('screens.equipment.today');
79
     if (yearDelta > 0)
79
     if (yearDelta > 0)
80
-        translatedString = i18n.t('equipmentScreen.otherYear', {
80
+        translatedString = i18n.t('screens.equipment.otherYear', {
81
             date: date.getDate(),
81
             date: date.getDate(),
82
             month: DateManager.getInstance().getMonthsOfYear()[date.getMonth()],
82
             month: DateManager.getInstance().getMonthsOfYear()[date.getMonth()],
83
             year: date.getFullYear()
83
             year: date.getFullYear()
84
         });
84
         });
85
     else if (monthDelta > 0)
85
     else if (monthDelta > 0)
86
-        translatedString = i18n.t('equipmentScreen.otherMonth', {
86
+        translatedString = i18n.t('screens.equipment.otherMonth', {
87
             date: date.getDate(),
87
             date: date.getDate(),
88
             month: DateManager.getInstance().getMonthsOfYear()[date.getMonth()],
88
             month: DateManager.getInstance().getMonthsOfYear()[date.getMonth()],
89
         });
89
         });
90
     else if (dayDelta > 1)
90
     else if (dayDelta > 1)
91
-        translatedString = i18n.t('equipmentScreen.thisMonth', {
91
+        translatedString = i18n.t('screens.equipment.thisMonth', {
92
             date: date.getDate(),
92
             date: date.getDate(),
93
         });
93
         });
94
     else if (dayDelta === 1)
94
     else if (dayDelta === 1)
95
-        translatedString = i18n.t('equipmentScreen.tomorrow');
95
+        translatedString = i18n.t('screens.equipment.tomorrow');
96
 
96
 
97
     return translatedString;
97
     return translatedString;
98
 }
98
 }

+ 4
- 4
src/utils/Notifications.js View File

49
         let reminderDate = new Date(date);
49
         let reminderDate = new Date(date);
50
         reminderDate.setMinutes(reminderDate.getMinutes() - reminder);
50
         reminderDate.setMinutes(reminderDate.getMinutes() - reminder);
51
         PushNotification.localNotificationSchedule({
51
         PushNotification.localNotificationSchedule({
52
-            title: i18n.t("proxiwashScreen.notifications.machineRunningTitle", {time: reminder}),
53
-            message: i18n.t("proxiwashScreen.notifications.machineRunningBody", {number: machineID}),
52
+            title: i18n.t("screens.proxiwash.notifications.machineRunningTitle", {time: reminder}),
53
+            message: i18n.t("screens.proxiwash.notifications.machineRunningBody", {number: machineID}),
54
             id: id.toString(),
54
             id: id.toString(),
55
             date: reminderDate,
55
             date: reminderDate,
56
         });
56
         });
59
         console.log("Setting up notifications for ", date);
59
         console.log("Setting up notifications for ", date);
60
 
60
 
61
     PushNotification.localNotificationSchedule({
61
     PushNotification.localNotificationSchedule({
62
-        title: i18n.t("proxiwashScreen.notifications.machineFinishedTitle"),
63
-        message: i18n.t("proxiwashScreen.notifications.machineFinishedBody", {number: machineID}),
62
+        title: i18n.t("screens.proxiwash.notifications.machineFinishedTitle"),
63
+        message: i18n.t("screens.proxiwash.notifications.machineFinishedBody", {number: machineID}),
64
         id: machineID,
64
         id: machineID,
65
         date: date,
65
         date: date,
66
     });
66
     });

+ 0
- 482
translations/en.json View File

1
-{
2
-  "screens": {
3
-    "home": "Home",
4
-    "planning": "Events",
5
-    "planningDisplayScreen": "Event details",
6
-    "clubDisplayScreen": "Club details",
7
-    "feedDisplayScreen": "Details",
8
-    "clubsAbout": "Clubs",
9
-    "amicaleAbout": "Contact",
10
-    "amicaleWebsite": "Amicale's website",
11
-    "proxiwash": "Proxiwash",
12
-    "services": "Services",
13
-    "proximo": "Proximo",
14
-    "proximoArticles": "Articles",
15
-    "menuSelf": "RU Menu",
16
-    "settings": "Settings",
17
-    "availableRooms": "Available rooms",
18
-    "bib": "Bib'Box",
19
-    "bluemind": "INSA Mails",
20
-    "ent": "INSA ENT",
21
-    "about": "About",
22
-    "debug": "Debug",
23
-    "login": "Login",
24
-    "logout": "Logout",
25
-    "profile": "Profile",
26
-    "vote": "Elections",
27
-    "scanner": "Scanotron 3000",
28
-    "feedback": "Feedback",
29
-    "insaAccount": "INSA Account",
30
-    "equipmentList": "Equipment Booking",
31
-    "equipmentLend": "Book",
32
-    "equipmentConfirm": "Confirmation"
33
-  },
34
-  "intro": {
35
-    "slideMain": {
36
-      "title": "Welcome to CAMPUS",
37
-      "text": "The new app to use during your coffee break to get updates on the campus life!"
38
-    },
39
-    "slideEvents": {
40
-      "title": "Stay up to date",
41
-      "text": "CAMPUS allows you to be aware of any event occurring on the campus, from pancake sales to Enfoiros concerts!"
42
-    },
43
-    "slideProxiwash": {
44
-      "title": "Never forget your laundry",
45
-      "text": "CAMPUS will inform you on the availability of washing machines and will remind you just before yours finishes!"
46
-    },
47
-    "slidePlanex": {
48
-      "title": "Planex",
49
-      "text": "Lookup your next course on CAMPUS with a mobile friendly timetable"
50
-    },
51
-    "slideRU": {
52
-      "title": "RU Menu",
53
-      "text": "For the hungry, check this week's menu!"
54
-    },
55
-    "slideServices": {
56
-      "title": "More services!",
57
-      "text": "You can do much more with CAMPUS, explore the app to find out"
58
-    },
59
-    "slideDone": {
60
-      "title": "Made by a student",
61
-      "text": "This app is the work of one student (with some help here and there), so any feedback is appreciated!"
62
-    },
63
-    "updateSlide0": {
64
-      "title": "New in this update!",
65
-      "text": "Faster than ever and easier to use!\nThis update includes lots of changes to improve your experience.\nUse the brand new feedback button on the home screen to talk to the developer!"
66
-    },
67
-    "updateSlide1": {
68
-      "title": "Improved Planex!",
69
-      "text": "You now have access to new controls, improved display, and you can also mark groups as favorites."
70
-    },
71
-    "updateSlide2": {
72
-      "title": "Scanotron 3000!",
73
-      "text": "Say hello to Scanotron 3000!\nAvailable from the Qr-Code button on the home screen, it will help you get information about clubs and events around the campus.\n(Useless right now but we have hope for next year)"
74
-    },
75
-    "updateSlide3": {
76
-      "title": "Amicale Account!",
77
-      "text": "You can now connect to your Amicale INSAT account from within the app! See all available clubs and more to come!\nClick on the login button from the home screen."
78
-    },
79
-    "aprilFoolsSlide": {
80
-      "title": "New in this update!",
81
-      "text": "We heard you, you don't like the new design and colors, so we changed them!\nLove."
82
-    },
83
-    "buttons": {
84
-      "next": "Next",
85
-      "skip": "Skip",
86
-      "done": "Done"
87
-    }
88
-  },
89
-  "settingsScreen": {
90
-    "generalCard": "General",
91
-    "nightMode": "Night Mode",
92
-    "nightModeSubOn": "Your eyes are at peace",
93
-    "nightModeSubOff": "Your eyes are burning",
94
-    "nightModeAuto": "Follow system dark mode",
95
-    "startScreen": "Start Screen",
96
-    "startScreenSub": "Select which screen to start the app on",
97
-    "proxiwashNotifReminder": "Machine running reminder",
98
-    "proxiwashNotifReminderSub": "How many minutes before",
99
-    "information": "Information"
100
-  },
101
-  "homeScreen": {
102
-    "listUpdated": "List updated!",
103
-    "listUpdateFail": "Error while updating list",
104
-    "servicesButton": "More services",
105
-    "newsFeed": "Campus News",
106
-    "dashboard": {
107
-      "seeMore": "Click to see more",
108
-      "todayEventsTitle": "Today's events",
109
-      "todayEventsSubtitleNA": "No events today",
110
-      "todayEventsSubtitle": " event coming today",
111
-      "todayEventsSubtitlePlural": " events coming today",
112
-      "amicaleTitle": "The Amicale",
113
-      "amicaleConnect": "Login",
114
-      "amicaleConnected": "See available services"
115
-    },
116
-    "loginBanner": {
117
-      "login": "Login",
118
-      "later": "Later",
119
-      "title": "Welcome, you!",
120
-      "message": "Login to your Amicale account to get access to more services!\n\nYou will still be able to login later."
121
-    }
122
-  },
123
-  "aboutScreen": {
124
-    "buttonDesc": "Information about the app and its creator",
125
-    "appstore": "See on the Appstore",
126
-    "playstore": "See on the Playstore",
127
-    "changelog": "Changelog",
128
-    "license": "License",
129
-    "debug": "Debug",
130
-    "team": "Team",
131
-    "author": "Author and maintainer",
132
-    "authorMail": "Send an email",
133
-    "additionalDev": "Development help",
134
-    "technologies": "Technologies",
135
-    "reactNative": "Made with React Native",
136
-    "expo": "Built with Expo",
137
-    "libs": "Libraries used"
138
-  },
139
-  "proximoScreen": {
140
-    "emptyList": "Empty List",
141
-    "article": "Article",
142
-    "articles": "Articles",
143
-    "sortOrder": "Sort by",
144
-    "sortName": "Name",
145
-    "sortNameReverse": "Name (reverse)",
146
-    "sortPrice": "Price",
147
-    "sortPriceReverse": "Price (reverse)",
148
-    "listUpdated": "Article list updated!",
149
-    "listUpdateFail": "Error while updating article list",
150
-    "loading": "Loading...",
151
-    "inStock": "in stock",
152
-    "description": "The Proximo is your small grocery store maintained by students directly on the campus. Open every day from 18h30 to 19h30, we welcome you when you are short on pastas or sodas ! Different products for different problems, everything at cost price. You can pay by Lydia or cash.",
153
-    "openingHours": "Openning Hours",
154
-    "paymentMethods": "Payment Methods",
155
-    "paymentMethodsDescription": "Cash or Lydia",
156
-    "search": "Search",
157
-    "all": "All"
158
-  },
159
-  "proxiwashScreen": {
160
-    "dryer": "Dryer",
161
-    "dryers": "Dryers",
162
-    "washer": "Washer",
163
-    "washers": "Washers",
164
-    "min": "min",
165
-    "listUpdated": "Machines state updated",
166
-    "listUpdateFail": "Error while updating machines state",
167
-    "error": "Could not update machines state. Pull down to retry.",
168
-    "loading": "Loading...",
169
-    "description": "This is the washing service operated by Promologis for INSA's residences (We don't mind if you do not live on the campus and you do your laundry here). The room is right next to the R2, with 3 dryers and 9 washers, is open 7d/7 24h/24 ! Here you can check their availability ! You can bring your own detergent, use the one given on site or buy it at the Proximo (cheaper than the one given by the machines ). You can pay by credit card or cash.",
170
-    "informationTab": "Information",
171
-    "paymentTab": "Payment",
172
-    "tariffs": "Tariffs",
173
-    "washersTariff": "3€ the washer + 0.80€ with detergent.",
174
-    "dryersTariff": "0.35€ for 5min of dryer usage.",
175
-    "paymentMethods": "Payment Methods",
176
-    "paymentMethodsDescription": "Cash up until 10€.\nCredit Card also accepted.",
177
-    "washerProcedure": "Put your laundry in the tumble without tamping it and by respecting charge limits.\n\nClose the machine's door.\n\nChoose a program using one of the four favorite program buttons.\n\nPay to the command central, then press the START button on the machine.\n\nWhen the program is finished, the screen indicates 'Programme terminé', press the yellow button to open the lid and retrieve your laundry.",
178
-    "washerTips": "Program 'blanc/couleur': 6kg of dry laundry (cotton linen, linen, underwear, sheets, jeans, towels).\n\nProgram 'non repassable': 3,5 kg of dry laundry (synthetic fibre linen, cotton and polyester mixed).\n\nProgram 'fin 30°C': 2,5 kg of dry laundry (delicate linen in synthetic fibres).\n\nProgram 'laine 30°C': 2,5 kg of dry laundry (wool textiles).",
179
-    "dryerProcedure": "Put your laundry in the tumble without tamping it and by respecting charge limits.\n\nClose the machine's door.\n\nChoose a program using one of the four favorite program buttons.\n\nPay to the command central, then press the START button on the machine.",
180
-    "dryerTips": "The advised dryer length is 35 minutes for 14 kg of laundry. You can choose a shorter length if the dryer is not fully charged.",
181
-    "procedure": "Procedure",
182
-    "tips": "Tips",
183
-    "enableNotificationsTip": "Click on a running machine to enable notifications!\n\nYou will never forget your laundry again.",
184
-    "numAvailable": "available",
185
-    "numAvailablePlural": "available",
186
-    "bannerTitle": "Notifications!",
187
-    "bannerButton": "Got it!",
188
-    "modal": {
189
-      "enableNotifications": "Notify me",
190
-      "disableNotifications": "Stop notifications",
191
-      "ok": "OK",
192
-      "cancel": "Cancel",
193
-      "finished": "This machine is finished. If you started it, you can get back your laundry.",
194
-      "ready": "This machine is empty and ready to use.",
195
-      "running": "This machine has been started at %{start} and will end at %{end}.\n\nRemaining time: %{remaining} min.\nProgram: %{program}",
196
-      "runningNotStarted": "This machine is ready but not started. Please make sure you pressed the start button.",
197
-      "broken": "This machine is out of order and cannot be used. Thank you for your comprehension.",
198
-      "error": "There has been an error and we are unable to get information from this machine. Sorry for the inconvenience.",
199
-      "unknown": "This machine is in an unknown state. Sorry for the inconvenience.",
200
-      "notificationErrorTitle": "Error",
201
-      "notificationErrorDescription": "Impossible to create notifications. Please make sure you enabled notifications then restart the app."
202
-    },
203
-    "states": {
204
-      "finished": "FINISHED",
205
-      "ready": "READY",
206
-      "running": "RUNNING",
207
-      "runningNotStarted": "NOT STARTED",
208
-      "broken": "OUT OF ORDER",
209
-      "error": "ERROR",
210
-      "unknown": "UNKNOWN"
211
-    },
212
-    "notifications": {
213
-      "machineFinishedTitle": "Laundry Ready",
214
-      "machineFinishedBody": "The machine n°{{number}} is finished and your laundry is ready to pickup",
215
-      "machineRunningTitle": "Laundry running: {{time}} minutes left",
216
-      "machineRunningBody": "The machine n°{{number}} is still running"
217
-    }
218
-  },
219
-  "planexScreen": {
220
-    "enableStartScreenTitle": "Come here often?",
221
-    "enableStartScreenMessage": "Set it as default screen!\n\nCampus will start on Planex so you never miss a class. Click on the button bellow to navigate to the settings page.",
222
-    "enableStartOK": "Yes please!",
223
-    "enableStartCancel": "Later",
224
-    "noGroupSelected": "No group selected. Please select your group using the big beautiful red button bellow.",
225
-    "favorites": "Favorites"
226
-  },
227
-  "availableRoomScreen": {
228
-    "normalRoom": "Work",
229
-    "computerRoom": "Computer",
230
-    "bibRoom": "Bib'Box"
231
-  },
232
-  "profileScreen": {
233
-    "personalInformation": "Personal information",
234
-    "noData": "No data",
235
-    "editInformation": "Edit Information",
236
-    "clubs": "Your clubs",
237
-    "clubsSubtitle": "Click on a club to show its information",
238
-    "isMember": "Member",
239
-    "isManager": "Manager",
240
-    "membership": "Membership Fee",
241
-    "membershipSubtitle": "Allows you to take part in various activities",
242
-    "membershipPayed": "Payed",
243
-    "membershipNotPayed": "Not payed",
244
-    "welcomeTitle": "Welcome %{name}!",
245
-    "welcomeDescription": "This is your Amicale INSA Toulouse personal space. Bellow are the current services you can access thanks to your account. Feels empty? You're right and we plan on fixing that, so stay tuned!",
246
-    "welcomeFeedback": "We plan on doing more! If you have any suggestions or found bugs, please tell us by clicking the button bellow."
247
-  },
248
-  "scannerScreen": {
249
-    "errorPermission": "Scanotron 3000 needs access to the camera in order to scan QR codes.\nThe camera will never be used for any other purpose.",
250
-    "buttonPermission": "Grant camera access",
251
-    "errorTitle": "QR code invalid",
252
-    "errorMessage": "The QR code scanned could not be recognised, please make sure it is valid.",
253
-    "helpButton": "What can I scan?",
254
-    "helpTitle": "How to use Scanotron 3000",
255
-    "helpMessage": "Find Campus QR codes posted by clubs and events, scan them and get instant access to detailed information!"
256
-  },
257
-  "loginScreen": {
258
-    "title": "Amicale account",
259
-    "subtitle": "Please enter your credentials",
260
-    "email": "Email",
261
-    "emailError": "Please enter a valid email",
262
-    "password": "Password",
263
-    "passwordError": "Please enter a password",
264
-    "login": "Login",
265
-    "resetPassword": "Forgot Password",
266
-    "whyAccountTitle": "Why have an account?",
267
-    "whyAccountSub": "What can you do wth an account",
268
-    "whyAccountParagraph": "An Amicale account allows you to take part in several activities around campus. You can join a club, or even create your own!",
269
-    "whyAccountParagraph2": "Logging into your Amicale account on the app will allow you to see all available clubs on the campus, vote for the upcoming elections, and more to come!",
270
-    "noAccount": "No Account? Go to the Amicale's building during open hours to create one."
271
-  },
272
-  "errors": {
273
-    "title": "Error!",
274
-    "badCredentials": "Email or password invalid.",
275
-    "badToken": "You are not logged in. Please login and try again.",
276
-    "noConsent": "You did not give your consent for data processing to the Amicale.",
277
-    "tokenSave": "Could not save session token. Please contact support.",
278
-    "badInput": "Invalid input. Please try again.",
279
-    "forbidden": "You do not have access to this data.",
280
-    "connectionError": "Network error. Please check your internet connection.",
281
-    "serverError": "Server error. Please contact support.",
282
-    "unknown": "Unknown error. Please contact support."
283
-  },
284
-  "clubs": {
285
-    "clubList": "Club list",
286
-    "managers": "Managers",
287
-    "managersSubtitle": "These people make the club live",
288
-    "managersUnavailable": "This club has no one :(",
289
-    "categories": "Categories",
290
-    "categoriesFilterMessage": "Click on a category to filter the list",
291
-    "clubContact": "Contact the club",
292
-    "amicaleContact": "Contact the Amicale",
293
-    "invalidClub": "Could not find the club. Please make sure the club you are trying to access is valid.",
294
-    "about": {
295
-      "text": "The clubs, making the campus live, with more than sixty clubs offering various activities! From the philosophy club to the PABI (Production Artisanale de Bière Insaienne), without forgetting the multiple music and dance clubs, you will surely find an activity that suits you!",
296
-      "title": "A question ?",
297
-      "subtitle": "Ask the Amicale",
298
-      "message": "You have a question concerning the clubs?\nYou want to revive or create a club?\nContact the Amicale at the following address:"
299
-    }
300
-  },
301
-  "amicaleAbout": {
302
-    "title": "A question ?",
303
-    "subtitle": "Ask the Amicale",
304
-    "message": "You want to revive a club?\nYou want to start a new project?\nHere are al the contacts you need! Do not hesitate to write a mail or send a message to the Amicale's Facebook page!",
305
-    "roles": {
306
-      "interSchools": "Inter Schools",
307
-      "culture": "Culture",
308
-      "animation": "Animation",
309
-      "clubs": "Clubs",
310
-      "event": "Events",
311
-      "tech": "Technique",
312
-      "communication": "Communication",
313
-      "intraSchools": "Alumni / IAT",
314
-      "publicRelations": "Public Relations"
315
-    }
316
-  },
317
-  "voteScreen": {
318
-    "select": {
319
-      "title": "Elections open",
320
-      "subtitle": "Vote now!",
321
-      "sendButton": "Send Vote",
322
-      "dialogTitle": "Send Vote?",
323
-      "dialogTitleLoading": "Sending vote...",
324
-      "dialogMessage": "Are you sure you want to send your vote? You will not be able to change it."
325
-    },
326
-    "tease": {
327
-      "title": "Elections incoming",
328
-      "subtitle": "Be ready to vote!",
329
-      "message": "Vote start:"
330
-    },
331
-    "wait": {
332
-      "titleSubmitted": "Vote submitted!",
333
-      "titleEnded": "Votes closed",
334
-      "subtitle": "Waiting for results...",
335
-      "messageSubmitted": "Vote submitted successfully.",
336
-      "messageVoted": "Thank you for your participation.",
337
-      "messageDate": "Results available:",
338
-      "messageDateUndefined": "Results will be available shortly"
339
-    },
340
-    "results": {
341
-      "title": "Results",
342
-      "subtitle": "Available until:",
343
-      "totalVotes": "Total votes:",
344
-      "votes": "votes"
345
-    },
346
-    "title": {
347
-      "title": "The Elections",
348
-      "subtitle": "Why your vote is important",
349
-      "paragraph1": "The Amicale's elections is the right moment for you to choose the next team, which will handle different projects on the campus, help organizing your favorite events, animate the campus life during the whole year, and relay your ideas to the administration, so that your campus life is the most enjoyable possible!\nYour turn to make a change!\uD83D\uDE09",
350
-      "paragraph2": "Note: If there is only one list, it is still important to vote to show your support, so that the administration knows the current list is supported by students. It is always a plus when taking difficult decisions! \uD83D\uDE09"
351
-    }
352
-  },
353
-  "dialog": {
354
-    "ok": "OK",
355
-    "yes": "Yes",
356
-    "cancel": "Cancel",
357
-    "disconnect": {
358
-      "title": "Disconnect",
359
-      "titleLoading": "Disconnecting...",
360
-      "message": "Are you sure you want to disconnect from your Amicale account?"
361
-    }
362
-  },
363
-  "general": {
364
-    "loading": "Loading...",
365
-    "retry": "Retry",
366
-    "networkError": "Unable to contact servers. Make sure you are connected to Internet.",
367
-    "goBack": "Go Back",
368
-    "goForward": "Go Forward",
369
-    "openInBrowser": "Open in Browser",
370
-    "notAvailable": "Not available"
371
-  },
372
-  "date": {
373
-    "daysOfWeek": {
374
-      "monday": "Monday",
375
-      "tuesday": "Tuesday",
376
-      "wednesday": "Wednesday",
377
-      "thursday": "Thursday",
378
-      "friday": "Friday",
379
-      "saturday": "Saturday",
380
-      "sunday": "Sunday"
381
-    },
382
-    "monthsOfYear": {
383
-      "january": "January",
384
-      "february": "February",
385
-      "march": "March",
386
-      "april": "April",
387
-      "may": "May",
388
-      "june": "June",
389
-      "july": "July",
390
-      "august": "August",
391
-      "september": "September",
392
-      "october": "October",
393
-      "november": "November",
394
-      "december": "December"
395
-    }
396
-  },
397
-  "game": {
398
-    "title": "Game",
399
-    "pause": "Game Paused",
400
-    "pauseMessage": "The game is paused",
401
-    "resume": "Resume",
402
-    "restart": {
403
-      "text": "Restart",
404
-      "confirm": "Are you sure you want to restart?",
405
-      "confirmMessage": "You will lose you progress, continue?",
406
-      "confirmYes": "Yes",
407
-      "confirmNo": "No"
408
-    },
409
-    "gameOver": {
410
-      "text": "Game Over",
411
-      "score": "Score: ",
412
-      "level": "Level: ",
413
-      "time": "Time: ",
414
-      "exit": "leave Game"
415
-    }
416
-  },
417
-  "servicesScreen": {
418
-    "amicale": "The Amicale",
419
-    "students": "Student services",
420
-    "insa": "INSA services",
421
-    "notLoggedIn": "Not logged in",
422
-    "descriptions": {
423
-      "clubs": "See info about your favorite club and discover new ones",
424
-      "profile": "See your personal information",
425
-      "amicaleWebsite": "See more information on the website",
426
-      "vote": "Vote for the upcoming elections",
427
-      "proximo": "Check the store's stock",
428
-      "wiketud": "Read useful info about classes and campus life",
429
-      "elusEtudiants": "The students in contact with the administration",
430
-      "tutorInsa": "Give and take part in tutorials by students",
431
-      "map": "Find your way around the campus",
432
-      "self": "Check the RU menu",
433
-      "availableRooms": "See how many rooms are free",
434
-      "bib": "Book a Bib'Box for project work",
435
-      "mails": "Check your INSA mails",
436
-      "ent": "See your grades",
437
-      "insaAccount": "See your information and change your password",
438
-      "equipment": "Book a BBQ or other equipment"
439
-    },
440
-    "mascot": {
441
-      "title": "So handy!",
442
-      "message": "There a lot of thing you can do with Campus!\n\nHere is a list of every service provided by the app.",
443
-      "button": "Thx buddy"
444
-    }
445
-  },
446
-  "planningScreen": {
447
-    "invalidEvent": "Could not find the event. Please make sure the event you are trying to access is valid.",
448
-    "mascotTitle": "Let's party!",
449
-    "mascotMessage": "At the INSA, it's not all about classes!\n\nIf you want to see new people, this page is just for you. Here you will find the list of every event organised by students!",
450
-    "mascotButton": "Thx!"
451
-  },
452
-  "feedbackScreen": {
453
-    "bugs": "Report Bugs",
454
-    "bugsSubtitle": "Did you find a bug? Let us know!",
455
-    "bugsDescription": "Reporting bugs helps us make the app better. To do so, use one of the buttons below and be as precise as possible when describing your problem!",
456
-    "feedback": "Feedback",
457
-    "feedbackSubtitle": "Let us know what you think!",
458
-    "feedbackDescription": "Do you have a feature you want to be added/changed/removed, want to give your opinion on the app or simply chat with the dev? Use one of the links below!",
459
-    "contactMeans": "Using Gitea is recommended, to use it simply login with your INSA account.",
460
-    "homeButtonTitle": "Feedback/Bug report",
461
-    "homeButtonSubtitle": "Contact the devs"
462
-  },
463
-  "equipmentScreen": {
464
-    "title": "Equipment booking",
465
-    "message": "Thanks to the Amicale, students have access to some equipment like BBQs and others. To book one of those items, click the equipment of your choice in the list bellow, enter your lend dates, then come around the Amicale to claim it and give your bail.",
466
-    "bail": "Bail: %{cost}€",
467
-    "available": "Available %{date}",
468
-    "today": "today",
469
-    "tomorrow": "tomorrow",
470
-    "thisMonth": "the %{date}",
471
-    "otherMonth": "the %{date} of %{month}",
472
-    "otherYear": "the %{date} of %{month} %{year}",
473
-    "bookingDay": "Booked for %{date}",
474
-    "bookingPeriod": "Booked from %{begin} to %{end}",
475
-    "booking": "Click on the calendar to set the start and end dates",
476
-    "bookButton": "Book selected dates",
477
-    "dialogTitle": "Confirm booking?",
478
-    "dialogTitleLoading": "Sending your booking...",
479
-    "dialogMessage": "Are you sure you want to confirm your booking?\n\nYou will then be able to claim the selected equipment at the Amicale for the duration of your booking in exchange of a bail.",
480
-    "bookingConfirmedMessage": "Do not forget to come by the Amicale to give your bail in exchange of the equipment."
481
-  }
482
-}

+ 0
- 468
translations/fr.json View File

1
-{
2
-  "screens": {
3
-    "home": "Accueil",
4
-    "planning": "Événements",
5
-    "planningDisplayScreen": "Détails",
6
-    "clubDisplayScreen": "Détails",
7
-    "feedDisplayScreen": "Détails",
8
-    "clubsAbout": "Les Clubs",
9
-    "amicaleAbout": "Contact",
10
-    "amicaleWebsite": "Site de l'Amicale",
11
-    "proxiwash": "Proxiwash",
12
-    "services": "Services",
13
-    "proximo": "Proximo",
14
-    "proximoArticles": "Articles",
15
-    "menuSelf": "Menu du RU",
16
-    "settings": "Paramètres",
17
-    "availableRooms": "Salles dispo",
18
-    "bib": "Bib'Box",
19
-    "bluemind": "Mails INSA",
20
-    "ent": "ENT INSA",
21
-    "about": "À Propos",
22
-    "debug": "Debug",
23
-    "login": "Se Connecter",
24
-    "logout": "Se Déconnecter",
25
-    "profile": "Profil",
26
-    "vote": "Élections",
27
-    "scanner": "Scanotron 3000",
28
-    "feedback": "Votre avis",
29
-    "insaAccount": "Compte INSA",
30
-    "equipmentList": "Réservation Matériel",
31
-    "equipmentLend": "Réserver"
32
-  },
33
-  "intro": {
34
-    "slideMain": {
35
-      "title": "Bienvenue sur CAMPUS",
36
-      "text": "La nouvelle appli à consulter pendant la pause café pour être au courant de la vie du campus !"
37
-    },
38
-    "slideEvents": {
39
-      "title": "Restez informés",
40
-      "text": "CAMPUS vous permet d'être au courant de tous les événements qui ont lieu sur le campus, de la vente de crêpes jusqu'aux concerts enfoiros !"
41
-    },
42
-    "slideProxiwash": {
43
-      "title": "N'oubliez plus votre linge !",
44
-      "text": "CAMPUS vous informe de la disponibilité des machines et vous permet d'être notifié lorsque la vôtre se termine bientôt !"
45
-    },
46
-    "slidePlanex": {
47
-      "title": "Planex",
48
-      "text": "Vérifiez votre prochain cours sur CAMPUS avec un emploi du temps adapté mobile"
49
-    },
50
-    "slideRU": {
51
-      "title": "Menu du RU",
52
-      "text": "Pour ceux qui ont faim, vérifiez le menu du RU de la semaine !"
53
-    },
54
-    "slideServices": {
55
-      "title": "Encore plus de services !",
56
-      "text": "CAMPUS vous permet de faire bien plus, explorez l'appli pour savoir quoi"
57
-    },
58
-    "slideDone": {
59
-      "title": "Fait par un étudiant",
60
-      "text": "Cette appli à été réalisée par un seul étudiant (avec un peu d'aide par-ci par-là), donc tous les retours sont les bienvenus !"
61
-    },
62
-    "updateSlide0": {
63
-      "title": "Nouveau dans cette mise à jour !",
64
-      "text": "Plus rapide que jamais et plus simple à utiliser !\nCette mise à jour contient de nombreux changements pour améliorer votre expérience.\nUtilisez le tout nouveau bouton de Feedback pour parler directement au développeur!"
65
-    },
66
-    "updateSlide1": {
67
-      "title": "Planex tout beau !",
68
-      "text": "Vous avez maintenant accès à de nouveaux contrôles, un affichage amélioré, et vous pouvez marquer des groupes en favoris."
69
-    },
70
-    "updateSlide2": {
71
-      "title": "Scanotron 3000 !",
72
-      "text": "Dites bonjour à Scanotron 3000 !\nDisponible depuis le bouton Qr-Code sur le menu principal, il vous aidera à avoir des informations sur les clubs et les événements du campus.\n(Inutile tout de suite mais on verra l'année pro)"
73
-    },
74
-    "updateSlide3": {
75
-      "title": "Compte Amicale !",
76
-      "text": "Vous pouvez maintenant vous connecter à votre compte Amicale depuis l'appli ! Accédez à la liste des clubs et plus à venir !\nCliquez sur le bouton Se Connecter dans le menu principal."
77
-    },
78
-    "aprilFoolsSlide": {
79
-      "title": "Nouveau dans cette mise à jour !",
80
-      "text": "Nous vous avons entendu, vous n'aimez pas le nouveau design et couleurs, alors on les as changés !\nLa bise."
81
-    },
82
-    "buttons": {
83
-      "next": "Suivant",
84
-      "skip": "Passer",
85
-      "done": "Commencer"
86
-    }
87
-  },
88
-  "settingsScreen": {
89
-    "generalCard": "Général",
90
-    "nightMode": "Mode Nuit",
91
-    "nightModeSubOn": "Vos yeux vous remercient",
92
-    "nightModeSubOff": "Vos yeux brulent",
93
-    "nightModeAuto": "Mode nuit système",
94
-    "startScreen": "Écran de démarrage",
95
-    "startScreenSub": "Choisissez l'écran utilisé au démarrage",
96
-    "proxiwashNotifReminder": "Rappel de machine en cours",
97
-    "proxiwashNotifReminderSub": "Combien de minutes avant",
98
-    "information": "Informations"
99
-  },
100
-  "homeScreen": {
101
-    "listUpdated": "List mise à jour!",
102
-    "listUpdateFail": "Erreur lors de la mise à jour de la liste",
103
-    "servicesButton": "Plus de services",
104
-    "newsFeed": "Nouvelles du campus",
105
-    "dashboard": {
106
-      "seeMore": "Cliquez pour plus d'infos",
107
-      "todayEventsTitle": "Événements aujourd'hui",
108
-      "todayEventsSubtitleNA": "Pas d'événement",
109
-      "todayEventsSubtitle": " événement aujourd'hui",
110
-      "todayEventsSubtitlePlural": " événements aujourd'hui",
111
-      "amicaleTitle": "L'Amicale",
112
-      "amicaleConnect": "Se connecter",
113
-      "amicaleConnected": "Voir les services disponibles"
114
-    },
115
-    "loginBanner": {
116
-      "login": "Se Connecter",
117
-      "later": "Plus Tard",
118
-      "message": "Connectez-vous à votre compte Amicale pour profiter de plus de services !"
119
-    }
120
-
121
-  },
122
-  "aboutScreen": {
123
-    "buttonDesc": "Informations sur l'appli et son créateur",
124
-    "appstore": "Voir sur l'Appstore",
125
-    "playstore": "Voir sur le Playstore",
126
-    "changelog": "Historique des modifications",
127
-    "license": "Licence",
128
-    "debug": "Debug",
129
-    "team": "Équipe",
130
-    "author": "Auteur et mainteneur",
131
-    "authorMail": "Envoyer un mail",
132
-    "additionalDev": "Aide au développement",
133
-    "technologies": "Technologies",
134
-    "reactNative": "Créé avec React Native",
135
-    "expo": "Compilé avec Expo",
136
-    "libs": "Librairies utilisées"
137
-  },
138
-  "proximoScreen": {
139
-    "emptyList": "Liste Vide",
140
-    "article": "Article",
141
-    "articles": "Articles",
142
-    "sortOrder": "Trier par :",
143
-    "sortName": "Nom",
144
-    "sortNameReverse": "Nom (inversé)",
145
-    "sortPrice": "Prix",
146
-    "sortPriceReverse": "Prix (inversé)",
147
-    "listUpdated": "Liste d'articles mise à jour !",
148
-    "listUpdateFail": "Erreur lors de la mise à jour de la list d'articles",
149
-    "loading": "Chargement...",
150
-    "inStock": "en stock",
151
-    "description": "Le Proximo c’est ta petite épicerie étudiante tenue par les étudiants directement sur le campus. Ouverte tous les jours de 18h30 à 19h30, nous t’accueillons et te sauvons quand tu n’as plus de pâtes ou de diluant ! Différents produits pour différentes galères, le tout à prix coûtant. Tu peux payer par Lydia ou par espèce.",
152
-    "openingHours": "Horaires d'ouverture",
153
-    "paymentMethods": "Moyens de Paiement",
154
-    "paymentMethodsDescription": "Espèce ou Lydia",
155
-    "search": "Rechercher",
156
-    "all": "Tout"
157
-  },
158
-  "proxiwashScreen": {
159
-    "dryer": "Sèche-Linge",
160
-    "dryers": "Sèche-Linges",
161
-    "washer": "Lave-Linge",
162
-    "washers": "Lave-Linges",
163
-    "min": "min",
164
-    "listUpdated": "État des machines mis à jour",
165
-    "listUpdateFail": "Erreur lors de la mise à jour de l'état des machines",
166
-    "error": "Impossible de mettre a jour l'état des machines. Tirez vers le bas pour réessayer.",
167
-    "loading": "Chargement...",
168
-    "description": "C'est le service de laverie proposé par promologis pour les résidences INSA (On t'en voudra pas si tu loges pas sur le campus et que tu fais ta machine ici). Le local situé au pied du R2 avec ses 3 sèche-linges et 9 machines est ouvert 7J/7 24h/24 ! Ici tu peux vérifier leur disponibilité ! Tu peux amener ta lessive, la prendre sur place ou encore mieux l'acheter au Proximo (moins chère qu'à la laverie directement). Tu peux payer par CB ou espèces.",
169
-    "informationTab": "Informations",
170
-    "paymentTab": "Paiement",
171
-    "tariffs": "Tarifs",
172
-    "washersTariff": "3€ la machine + 0.80€ avec la lessive.",
173
-    "dryersTariff": "0.35€ pour 5min de sèche linge.",
174
-    "paymentMethods": "Moyens de Paiement",
175
-    "paymentMethodsDescription": "Toute monnaie jusqu'à 10€.\nCarte bancaire acceptée.",
176
-    "washerProcedure": "Déposer le linge dans le tambour sans le tasser et en respectant les charges.\n\nFermer la porte de l'appareil.\n\nSélectionner un programme avec l'une des quatre touches de programme favori standard.\n\nAprès avoir payé à la centrale de commande, appuyer sur le bouton marqué START du lave-linge.\n\nDès que le programme est terminé, l’afficheur indique 'Programme terminé', appuyer sur le bouton jaune d’ouverture du hublot pour récupérer le linge.",
177
-    "washerTips": "Programme blanc/couleur : 6kg de linge sec (textiles en coton, lin, linge de corps, draps, jeans,serviettes de toilettes).\n\nProgramme nonrepassable : 3,5 kg de linge sec (textiles en fibres synthétiques, cotonet polyester mélangés).\n\nProgramme fin 30°C : 2,5 kg de linge sec (textiles délicats en fibres synthétiques, rayonne).\n\nProgramme laine 30°C : 2,5 kg de linge sec (textiles en laine et lainages lavables).",
178
-    "dryerProcedure": "Déposer le linge dans le tambour sans le tasser et en respectant les charges.\n\nFermer la porte de l'appareil.\n\nSélectionner un programme avec l'une des quatre touches de programme favori standard.\n\nAprès avoir payé à la centrale de commande, appuyer sur le bouton marqué START du lave-linge.",
179
-    "dryerTips": "La durée conseillée est de 35 minutes pour 14kg de linge. Vous pouvez choisir une durée plus courte si le sèche-linge n'est pas chargé.",
180
-    "procedure": "Procédure",
181
-    "tips": "Conseils",
182
-    "enableNotificationsTip": "Cliquez sur une machine en cours pour activer les notifications",
183
-    "numAvailable": "disponible",
184
-    "numAvailablePlural": "disponibles",
185
-    "bannerButton": "Compris !",
186
-    "modal": {
187
-      "enableNotifications": "Me Notifier",
188
-      "disableNotifications": "Désactiver les  notifications",
189
-      "ok": "OK",
190
-      "cancel": "Annuler",
191
-      "finished": "Cette machine est terminée. Si vous l'avez démarrée, vous pouvez récupérer votre linge.",
192
-      "ready": "Cette machine est vide et prête à être utilisée.",
193
-      "running": "Cette machine a démarré à %{start} et terminera à %{end}.\n\nTemps restant : %{remaining} min.\nProgramme: %{program}",
194
-      "runningNotStarted": "Cette machine est prête mais n'est pas démarrée. Assurez vous de bien avoir appuyé sur le bouton start.",
195
-      "broken": "Cette machine est hors service. Merci pour votre compréhension.",
196
-      "error": "Il y a eu une erreur et il est impossible de récupérer les informations de cette machine. Veuillez nous excuser pour le gène occasionnée.",
197
-      "unknown": "Cette machine est dans un état inconnu. Veuillez nous excuser pour ce problème.",
198
-      "notificationErrorTitle": "Erreur",
199
-      "notificationErrorDescription": "Impossible de créer les notifications. Merci de vérifier que vous avez activé les notifications puis redémarrez l'appli."
200
-    },
201
-    "states": {
202
-      "finished": "TERMINÉ",
203
-      "ready": "DISPONIBLE",
204
-      "running": "EN COURS",
205
-      "runningNotStarted": "NON DÉMARRÉE",
206
-      "broken": "HORS SERVICE",
207
-      "error": "ERREUR",
208
-      "unknown": "INCONNU"
209
-    },
210
-    "notifications": {
211
-      "machineFinishedTitle": "Linge prêt",
212
-      "machineFinishedBody": "La machine n°{{number}} est terminée et votre linge est prêt à être récupéré",
213
-      "machineRunningTitle": "Machine en cours: {{time}} minutes restantes",
214
-      "machineRunningBody": "La machine n°{{number}} n'est pas encore terminée"
215
-    }
216
-  },
217
-  "planexScreen": {
218
-    "enableStartScreen": "Vous venez souvent ici ? Démarrez l'appli sur cette page!",
219
-    "enableStartOK": "Oui svp!",
220
-    "enableStartCancel": "Plus tard",
221
-    "noGroupSelected": "Pas de groupe sélectionné. Merci de choisir un groupe avec le beau bouton rouge ci-dessous.",
222
-    "favorites": "Favoris"
223
-  },
224
-  "availableRoomScreen": {
225
-    "normalRoom": "Travail",
226
-    "computerRoom": "Ordi",
227
-    "bibRoom": "Bib'Box"
228
-  },
229
-  "profileScreen": {
230
-    "personalInformation": "Informations Personnelles",
231
-    "noData": "Pas de données",
232
-    "editInformation": "Modifier les informations",
233
-    "clubs": "Vos clubs",
234
-    "clubsSubtitle": "Cliquez sur un club pour afficher ses informations",
235
-    "isMember": "Membre",
236
-    "isManager": "Responsable",
237
-    "membership": "Cotisation",
238
-    "membershipSubtitle": "Permet de participer à diverses activités",
239
-    "membershipPayed": "Payée",
240
-    "membershipNotPayed": "Non payée",
241
-    "welcomeTitle": "Bonjour %{name} !",
242
-    "welcomeDescription": "Ceci est votre espace personnel Amicale INSA Toulouse. Vous trouverez ci-dessous les services disponibles avec votre compte. Un peu vide ? Vous avez raison et nous allons essayer de corriger ça, donc restez à jour !",
243
-    "welcomeFeedback": "Nous allons essayer de proposer plus de services ! Si vous avez des suggestions, ou avez trouvé des bugs, merci de nous contacter avec le bouton ci-dessous."
244
-
245
-  },
246
-  "scannerScreen": {
247
-    "errorPermission": "Scanotron 3000 a besoin d'accéder à la caméra pour scanner des QR codes.\nLa caméra ne sera jamais utilisée autrement.",
248
-    "buttonPermission": "Autoriser l'accès à la caméra",
249
-    "errorTitle": "QR code invalide",
250
-    "errorMessage": "Le QR code scannée n'a pas été reconnu. Merci de vérifier sa validité.",
251
-    "helpButton": "Quoi scanner ?",
252
-    "helpTitle": "Comment utiliser Scanotron 3000",
253
-    "helpMessage": "Trouvez des QR codes Campus affichés par des clubs ou des respo d'évenements, scannez les et accédez à des informations détaillées !"
254
-  },
255
-  "loginScreen": {
256
-    "title": "Compte Amicale",
257
-    "subtitle": "Entrez vos identifiants",
258
-    "email": "Email",
259
-    "emailError": "Merci d'entrer un email valide",
260
-    "password": "Mot de passe",
261
-    "passwordError": "Merci d'entrer un mot de passe",
262
-    "login": "Connexion",
263
-    "resetPassword": "Mdp oublié",
264
-    "whyAccountTitle": "Un compte ?",
265
-    "whyAccountSub": "Ce qu'un compte vous apporte",
266
-    "whyAccountParagraph": "Un compte Amicale vous donne la possibilité de participer à diverses activités sur le campus. Vous pouvez rejoindre des clubs ou même créer le votre !",
267
-    "whyAccountParagraph2": "Vous connecter à votre compte Amicale sur l'appli vous permettra de voir tous les clubs en activité, de voter pour les prochaines élections, et plus à venir !",
268
-    "noAccount": "Pas de compte ? Passez à l'Amicale pendant une perm pour en créer un."
269
-  },
270
-  "errors": {
271
-    "title": "Erreur !",
272
-    "badCredentials": "Email ou mot de passe invalide.",
273
-    "badToken": "Vous n'êtes pas connecté. Merci de vous connecter puis réessayez.",
274
-    "noConsent": "Vous n'avez pas donné votre consentement pour l'utilisation de vos données personnelles.",
275
-    "tokenSave": "Impossible de sauvegarder le token de session. Merci de contacter le support.",
276
-    "badInput": "Entrée invalide. Merci de réessayer.",
277
-    "forbidden": "Vous n'avez pas accès à cette information.",
278
-    "connectionError": "Erreur de réseau. Merci de vérifier votre connexion Internet.",
279
-    "serverError": "Erreur de serveur. Merci de contacter le support.",
280
-    "unknown": "Erreur inconnue. Merci de contacter le support."
281
-  },
282
-  "clubs": {
283
-    "clubList": "Liste des clubs",
284
-    "managers": "Responsables",
285
-    "managersSubtitle": "Ces personnes font vivre le club",
286
-    "managersUnavailable": "Ce club est tout seul :(",
287
-    "categories": "Catégories",
288
-    "categoriesFilterMessage": "Cliquez sur une catégorie pour filtrer la liste",
289
-    "clubContact": "Contacter le club",
290
-    "amicaleContact": "Contacter l'Amicale",
291
-    "invalidClub": "Impossible de trouver le club. Merci de vérifier que le club que vous voulez voir est valide.",
292
-    "about": {
293
-      "text": "Les clubs, c'est ce qui fait vivre le campus au quotidien, plus d'une soixantaine de clubs qui proposent des activités diverses et variées ! Du club Philosophie au PABI (Production Artisanale de Bière Insaienne), en passant par les multiples clubs de musique et de danse, vous trouverez forcément une activité qui vous permettra de vous épanouir sur le campus !",
294
-      "title": "Une question ?",
295
-      "subtitle": "Posez vos questions à l'Amicale",
296
-      "message": "Vous avez question concernant les clubs ?\nVous voulez reprendre ou créer un club ?\nContactez les responsables au mail ci-dessous :"
297
-    }
298
-  },
299
-  "amicaleAbout": {
300
-    "title": "Une Question ?",
301
-    "subtitle": "Posez vos questions à l'Amicale",
302
-    "message": "Vous voulez reprendre un club ?\nVous voulez vous lancer dans un projet ?\nVoici tous les contacts de l'amicale ! N'hésitez pas à nous écrire par mail ou sur la page facebook de l'Amicale !",
303
-    "roles": {
304
-      "interSchools": "Inter Écoles",
305
-      "culture": "Culture",
306
-      "animation": "Animation",
307
-      "clubs": "Clubs",
308
-      "event": "Événements",
309
-      "tech": "Technique",
310
-      "communication": "Communication",
311
-      "intraSchools": "Alumni / IAT",
312
-      "publicRelations": "Relations Publiques"
313
-    }
314
-  },
315
-  "voteScreen": {
316
-    "select": {
317
-      "title": "Élections ouvertes",
318
-      "subtitle": "Votez maintenant !",
319
-      "sendButton": "Envoyer votre vote",
320
-      "dialogTitle": "Envoyer votre vote ?",
321
-      "dialogTitleLoading": "Envoi du vote...",
322
-      "dialogMessage": "Êtes vous sûr de vouloir envoyer votre vote ? Vous ne pourrez plus le changer."
323
-    },
324
-    "tease": {
325
-      "title": "Les élections arrivent",
326
-      "subtitle": "Préparez vous à voter !",
327
-      "message": "Début des votes :"
328
-    },
329
-    "wait": {
330
-      "titleSubmitted": "Vote envoyé !",
331
-      "titleEnded": "Votes fermés",
332
-      "subtitle": "Attente des résultats...",
333
-      "messageSubmitted": "Votre vote a bien été envoyé.",
334
-      "messageVoted": "Merci pour votre participation.",
335
-      "messageDate": "Disponibilité des résultats :",
336
-      "messageDateUndefined": "les résultats seront disponibles sous peu."
337
-    },
338
-    "results": {
339
-      "title": "Résultats",
340
-      "subtitle": "Disponibles jusqu'à :",
341
-      "totalVotes": "Nombre total de votes :",
342
-      "votes": "votes"
343
-    },
344
-    "title": {
345
-      "title": "Les Élections",
346
-      "subtitle": "Pourquoi votre vote est important",
347
-      "paragraph1": "Les élections de l'amicale, c'est le moment pour vous de choisir la prochaine équipe qui portera les différents projets du campus, qui soutiendra les organisations de vos événements favoris, qui vous proposera des animations tout au long de l'année, et qui poussera vos idées à l’administration pour que la vie de campus soit des plus riches !\nAlors à vous de jouer ! \uD83D\uDE09",
348
-      "paragraph2": "NB : Si par cas il n'y a qu'une liste qui se présente, il est important que tout le monde vote, afin qui la liste puisse montrer à l’administration que les INSAiens la soutiennent ! Ça compte toujours pour les décisions difficiles ! \uD83D\uDE09"
349
-    }
350
-  },
351
-  "dialog": {
352
-    "ok": "OK",
353
-    "yes": "Oui",
354
-    "cancel": "Annuler",
355
-    "disconnect": {
356
-      "title": "Déconnexion",
357
-      "titleLoading": "Déconnexion...",
358
-      "message": "Voulez vous vraiment vous déconnecter de votre compte Amicale ??"
359
-    }
360
-  },
361
-  "general": {
362
-    "loading": "Chargement...",
363
-    "retry": "Réessayer",
364
-    "networkError": "Impossible de contacter les serveurs. Assurez-vous d'être connecté à internet.",
365
-    "goBack": "Suivant",
366
-    "goForward": "Précédent",
367
-    "openInBrowser": "Ouvrir dans le navigateur",
368
-    "notAvailable": "Non disponible"
369
-  },
370
-  "date": {
371
-    "daysOfWeek": {
372
-      "monday": "Lundi",
373
-      "tuesday": "Mardi",
374
-      "wednesday": "Mercredi",
375
-      "thursday": "Jeudi",
376
-      "friday": "Vendredi",
377
-      "saturday": "Samedi",
378
-      "sunday": "Dimanche"
379
-    },
380
-    "monthsOfYear": {
381
-      "january": "Janvier",
382
-      "february": "Février",
383
-      "march": "Mars",
384
-      "april": "Avril",
385
-      "may": "Mai",
386
-      "june": "Juin",
387
-      "july": "Juillet",
388
-      "august": "Août",
389
-      "september": "Septembre",
390
-      "october": "Octobre",
391
-      "november": "Novembre",
392
-      "december": "Décembre"
393
-    }
394
-  },
395
-  "game": {
396
-    "title": "Jeu",
397
-    "pause": "Pause",
398
-    "pauseMessage": "Le jeu est en pause",
399
-    "resume": "Continuer",
400
-    "restart": {
401
-      "text": "Redémarrer",
402
-      "confirm": "Êtes vous sûr de vouloir redémarrer ?",
403
-      "confirmMessage": "Tout votre progrès sera perdu, continuer ?",
404
-      "confirmYes": "Oui",
405
-      "confirmNo": "Non"
406
-    },
407
-    "gameOver": {
408
-      "text": "Game Over",
409
-      "score": "Score: ",
410
-      "level": "Niveau: ",
411
-      "time": "Temps: ",
412
-      "exit": "Quitter"
413
-    }
414
-  },
415
-  "servicesScreen": {
416
-    "amicale": "L'Amicale",
417
-    "students": "Services étudiants",
418
-    "insa": "Services de l'INSA",
419
-    "notLoggedIn": "Non connecté",
420
-    "descriptions": {
421
-      "clubs": "Voir les informations sur les clubs",
422
-      "profile": "Voir vos informations personnelles",
423
-      "amicaleWebsite": "Plus d'informations sur le site",
424
-      "vote": "Votez pour les prochaines élections",
425
-      "proximo": "Regardez le stock du Proximo",
426
-      "wiketud": "Trouvez des informations utiles sur les cours et la vie du campus",
427
-      "elusEtudiants": "Les étudiants en contact avec l'administration",
428
-      "tutorInsa": "Donnez et bénéficiez de tutorats par d'autres étudiants",
429
-      "map": "Trouvez votre chemin sur le campus",
430
-      "self": "Regardez le menu du RU",
431
-      "availableRooms": "Vérifiez les salles disponibles",
432
-      "bib": "Réservez une Bib'Box pour les travaux de groupe",
433
-      "mails": "Vérifiez vos mails INSA",
434
-      "ent": "Retrouvez vos notes",
435
-      "insaAccount": "Accédez à vos informations et modifiez votre mot de passe",
436
-      "equipment": "Réservez un BBQ ou d'autre matériel"
437
-    }
438
-  },
439
-  "planningScreen": {
440
-    "invalidEvent": "Impossible de trouver l'événement. Merci de vérifier que l'événement que vous voulez voir est valide."
441
-  },
442
-  "feedbackScreen": {
443
-    "bugs": "Rapporter des Bugs",
444
-    "bugsSubtitle": "Vous avez trouvé un bug ?",
445
-    "bugsDescription": "Rapporter les bugs nous aide à améliorer l'appli. Pour cela, merci d'utiliser un des boutons ci-dessous et de décrire votre problème le plus précisément possible !",
446
-    "feedback": "Feedback",
447
-    "feedbackSubtitle": "Dites nous ce que vous pensez !",
448
-    "feedbackDescription": "Vous voulez voir une fonctionnalité ajoutée/modifiée/supprimée ? Vous voulez donner votre opinion sur l'appli ou simplement discuter avec le développeur ? Utilisez un des liens ci-dessous !",
449
-    "contactMeans": "L'utilisation de Gitea est recommandée, pour l'utiliser, connectez vous avec vos identifiants INSA.",
450
-    "homeButtonTitle": "Feedback/Bugs",
451
-    "homeButtonSubtitle": "Contacter le développeur"
452
-  },
453
-  "equipmentScreen": {
454
-    "title": "Réservation de Matériel",
455
-    "message": "L'Amicale mets à disposition des étudiants du matériel comme des BBQ, des appareils à raclette et autres. Pour réserver l'un de ces formidables appareils, cliquez sur celui de votre choix dans la liste, indiquez les dates du prêt, puis passez à l'Amicale pour le récupérer et donner votre caution.",
456
-    "bail": "Caution : %{cost}€",
457
-    "availableAt": "Disponible à : %{date}",
458
-    "available": "Disponible !",
459
-    "booking": "Cliquez sur le calendrier pour choisir les dates de début et de fin de la réservation",
460
-    "startDate": "Début: ",
461
-    "endDate": "Fin: ",
462
-    "notSet": "Non défini",
463
-    "bookButton": "Choisir ces dates",
464
-    "dialogTitle": "Confirmer la réservation ?",
465
-    "dialogTitleLoading": "Envoi de la réservation...",
466
-    "dialogMessage": "Êtes vous sûr de vouloir confirmer cette réservation?\n\nVous pourrez ensuite récupérer le matériel à l'Amicale pour la durée de votre reservation en échange d'une caution."
467
-  }
468
-}

Loading…
Cancel
Save