Browse Source

Improved locale files structure

Arnaud Vergnet 2 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,7 +79,7 @@ test('getRelativeDateString', () => {
79 79
         );
80 80
     jest.spyOn(i18n, 't')
81 81
         .mockImplementation((translationString: string) => {
82
-                const prefix = "equipmentScreen.";
82
+                const prefix = "screens.equipment.";
83 83
                 if (translationString === prefix + "otherYear")
84 84
                     return "0";
85 85
                 else if (translationString === prefix + "otherMonth")

+ 491
- 0
locales/en.json View File

@@ -0,0 +1,491 @@
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

@@ -0,0 +1,491 @@
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,7 +63,7 @@ class VoteResults extends React.Component<Props> {
63 63
             }}>
64 64
                 <List.Item
65 65
                     title={item.name}
66
-                    description={item.votes + ' ' + i18n.t('voteScreen.results.votes')}
66
+                    description={item.votes + ' ' + i18n.t('screens.vote.results.votes')}
67 67
                     left={props => isWinner
68 68
                         ? <List.Icon {...props} icon={isDraw ? "trophy-outline" : "trophy"} color={colors.primary}/>
69 69
                         : null}
@@ -83,15 +83,15 @@ class VoteResults extends React.Component<Props> {
83 83
         return (
84 84
             <Card style={styles.card}>
85 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 88
                     left={(props) => <Avatar.Icon
89 89
                         {...props}
90 90
                         icon={"podium-gold"}
91 91
                     />}
92 92
                 />
93 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 95
                     {/*$FlowFixMe*/}
96 96
                     <FlatList
97 97
                         data={this.props.teams}

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

@@ -75,8 +75,8 @@ export default class VoteSelect extends React.PureComponent<Props, State> {
75 75
             <View>
76 76
                 <Card style={styles.card}>
77 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 80
                         left={(props) =>
81 81
                             <Avatar.Icon
82 82
                                 {...props}
@@ -105,7 +105,7 @@ export default class VoteSelect extends React.PureComponent<Props, State> {
105 105
                             style={{marginLeft: 'auto'}}
106 106
                             disabled={this.state.selectedTeam === "none"}
107 107
                         >
108
-                            {i18n.t('voteScreen.select.sendButton')}
108
+                            {i18n.t('screens.vote.select.sendButton')}
109 109
                         </Button>
110 110
                     </Card.Actions>
111 111
                 </Card>
@@ -113,9 +113,9 @@ export default class VoteSelect extends React.PureComponent<Props, State> {
113 113
                     visible={this.state.voteDialogVisible}
114 114
                     onDismiss={this.onVoteDialogDismiss}
115 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 120
                 <ErrorDialog
121 121
                     visible={this.state.errorDialogVisible}

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

@@ -19,15 +19,15 @@ export default class VoteTease extends React.Component<Props> {
19 19
         return (
20 20
             <Card style={styles.card}>
21 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 24
                     left={props => <Avatar.Icon
25 25
                         {...props}
26 26
                         icon="vote"/>}
27 27
                 />
28 28
                 <Card.Content>
29 29
                     <Paragraph>
30
-                        {i18n.t('voteScreen.tease.message') + ' ' + this.props.startDate}
30
+                        {i18n.t('screens.vote.tease.message') + ' ' + this.props.startDate}
31 31
                     </Paragraph>
32 32
                 </Card.Content>
33 33
             </Card>

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

@@ -17,8 +17,8 @@ export default class VoteTitle extends React.Component<{}> {
17 17
         return (
18 18
             <Card style={styles.card}>
19 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 22
                     left={(props) => <Avatar.Image
23 23
                         {...props}
24 24
                         source={ICON_AMICALE}
@@ -27,10 +27,10 @@ export default class VoteTitle extends React.Component<{}> {
27 27
                 />
28 28
                 <Card.Content>
29 29
                     <Paragraph>
30
-                        {i18n.t('voteScreen.title.paragraph1')}
30
+                        {i18n.t('screens.vote.main.paragraph1')}
31 31
                     </Paragraph>
32 32
                     <Paragraph>
33
-                        {i18n.t('voteScreen.title.paragraph2')}
33
+                        {i18n.t('screens.vote.main.paragraph2')}
34 34
                     </Paragraph>
35 35
                 </Card.Content>
36 36
             </Card>

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

@@ -27,32 +27,32 @@ class VoteWait extends React.Component<Props> {
27 27
             <Card style={styles.card}>
28 28
                 <Card.Title
29 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 33
                     left={(props) => <ActivityIndicator {...props}/>}
34 34
                 />
35 35
                 <Card.Content>
36 36
                     {
37 37
                         this.props.justVoted
38 38
                             ? <Paragraph style={{color: colors.success}}>
39
-                                {i18n.t('voteScreen.wait.messageSubmitted')}
39
+                                {i18n.t('screens.vote.wait.messageSubmitted')}
40 40
                             </Paragraph>
41 41
                             : null
42 42
                     }
43 43
                     {
44 44
                         this.props.hasVoted
45 45
                             ? <Paragraph style={{color: colors.success}}>
46
-                                {i18n.t('voteScreen.wait.messageVoted')}
46
+                                {i18n.t('screens.vote.wait.messageVoted')}
47 47
                             </Paragraph>
48 48
                             : null
49 49
                     }
50 50
                     {
51 51
                         startDate != null
52 52
                             ? <Paragraph>
53
-                                {i18n.t('voteScreen.wait.messageDate') + ' ' + startDate}
53
+                                {i18n.t('screens.vote.wait.messageDate') + ' ' + startDate}
54 54
                             </Paragraph>
55
-                            : <Paragraph>{i18n.t('voteScreen.wait.messageDateUndefined')}</Paragraph>
55
+                            : <Paragraph>{i18n.t('screens.vote.wait.messageDateUndefined')}</Paragraph>
56 56
                     }
57 57
                 </Card.Content>
58 58
             </Card>

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

@@ -22,8 +22,8 @@ class ActionsDashBoardItem extends React.Component<Props> {
22 22
         return (
23 23
             <View>
24 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 27
                     left={props => <List.Icon {...props} icon={"bug"}/>}
28 28
                     right={props => <List.Icon {...props} icon={"chevron-right"}/>}
29 29
                     onPress={() => this.props.navigation.navigate("feedback")}

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

@@ -40,18 +40,18 @@ class EventDashBoardItem extends React.Component<Props> {
40 40
                     <Text style={{fontWeight: "bold"}}>{props.eventNumber}</Text>
41 41
                     <Text>
42 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 45
                     </Text>
46 46
                 </Text>;
47 47
         } else
48
-            subtitle = i18n.t('homeScreen.dashboard.todayEventsSubtitleNA');
48
+            subtitle = i18n.t('screens.home.dashboard.todayEventsSubtitleNA');
49 49
         return (
50 50
             <Card
51 51
                 style={styles.card}
52 52
                 onPress={props.clickAction}>
53 53
                 <Card.Title
54
-                    title={i18n.t('homeScreen.dashboard.todayEventsTitle')}
54
+                    title={i18n.t('screens.home.dashboard.todayEventsTitle')}
55 55
                     titleStyle={{color: textColor}}
56 56
                     subtitle={subtitle}
57 57
                     subtitleStyle={{color: textColor}}

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

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

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

@@ -58,7 +58,7 @@ class PreviewEventDashboardItem extends React.Component<Props> {
58 58
                         <Button
59 59
                             icon={'chevron-right'}
60 60
                         >
61
-                            {i18n.t("homeScreen.dashboard.seeMore")}
61
+                            {i18n.t("screens.home.dashboard.seeMore")}
62 62
                         </Button>
63 63
                     </Card.Actions>
64 64
                 </Card>

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

@@ -46,11 +46,11 @@ class ClubListHeader extends React.Component<Props> {
46 46
         return (
47 47
             <Card style={styles.card}>
48 48
                 <AnimatedAccordion
49
-                    title={i18n.t("clubs.categories")}
49
+                    title={i18n.t("screens.clubs.categories")}
50 50
                     left={props => <List.Icon {...props} icon="star"/>}
51 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 54
                     <View style={styles.chipContainer}>
55 55
                         {this.getCategoriesRender()}
56 56
                     </View>

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

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

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

@@ -28,7 +28,7 @@ class ProximoListItem extends React.Component<Props> {
28 28
         return (
29 29
             <List.Item
30 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 32
                 descriptionStyle={{color: this.props.color}}
33 33
                 onPress={this.props.onPress}
34 34
                 left={() => <Avatar.Image style={{backgroundColor: 'transparent'}} size={64}

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

@@ -42,8 +42,8 @@ class ProxiwashListItem extends React.Component<Props> {
42 42
             displayNumber = AprilFoolsManager.getProxiwashMachineDisplayNumber(parseInt(props.item.number));
43 43
 
44 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 47
         this.title += ' n°' + displayNumber;
48 48
     }
49 49
 
@@ -56,13 +56,13 @@ class ProxiwashListItem extends React.Component<Props> {
56 56
     }
57 57
 
58 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 68
     updateStateColors() {

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

@@ -27,8 +27,8 @@ class ProxiwashListItem extends React.Component<Props> {
27 27
         const props = this.props;
28 28
         const subtitle = props.nbAvailable + ' ' + (
29 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 32
         const iconColor = props.nbAvailable > 0
33 33
         ? this.props.theme.colors.success
34 34
         : this.props.theme.colors.primary;

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

@@ -124,7 +124,7 @@ class ErrorView extends React.PureComponent<Props, State> {
124 124
             onPress={this.goToLogin}
125 125
             style={styles.button}
126 126
         >
127
-            {i18n.t("screens.login")}
127
+            {i18n.t("screens.login.title")}
128 128
         </Button>;
129 129
     }
130 130
 

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

@@ -258,7 +258,7 @@ class WebSectionList extends React.PureComponent<Props, State> {
258 258
                         bottom: CustomTabBar.TAB_BAR_HEIGHT
259 259
                     }}
260 260
                 >
261
-                    {i18n.t("homeScreen.listUpdateFail")}
261
+                    {i18n.t("screens.home.listUpdateFail")}
262 262
                 </Snackbar>
263 263
             </View>
264 264
         );

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

@@ -3,8 +3,8 @@
3 3
 import i18n from 'i18n-js';
4 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 10
  * Static class used to manage locales

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

@@ -52,62 +52,62 @@ function MainStackComponent(props: { createTabNavigator: () => React.Node }) {
52 52
                 component={props.createTabNavigator}
53 53
                 options={{
54 54
                     headerShown: false,
55
-                    title: i18n.t('screens.home'),
55
+                    title: i18n.t('screens.home.title'),
56 56
                 }}
57 57
             />
58 58
             <MainStack.Screen
59 59
                 name="settings"
60 60
                 component={SettingsScreen}
61 61
                 options={{
62
-                    title: i18n.t('screens.settings'),
62
+                    title: i18n.t('screens.settings.title'),
63 63
                 }}
64 64
             />
65 65
             <MainStack.Screen
66 66
                 name="about"
67 67
                 component={AboutScreen}
68 68
                 options={{
69
-                    title: i18n.t('screens.about'),
69
+                    title: i18n.t('screens.about.title'),
70 70
                 }}
71 71
             />
72 72
             <MainStack.Screen
73 73
                 name="dependencies"
74 74
                 component={AboutDependenciesScreen}
75 75
                 options={{
76
-                    title: i18n.t('aboutScreen.libs')
76
+                    title: i18n.t('screens.about.libs')
77 77
                 }}
78 78
             />
79 79
             <MainStack.Screen
80 80
                 name="debug"
81 81
                 component={DebugScreen}
82 82
                 options={{
83
-                    title: i18n.t('aboutScreen.debug')
83
+                    title: i18n.t('screens.about.debug')
84 84
                 }}
85 85
             />
86 86
             <MainStack.Screen
87 87
                 name="tetris"
88 88
                 component={TetrisScreen}
89 89
                 options={{
90
-                    title: i18n.t("game.title"),
90
+                    title: i18n.t("screens.game.title"),
91 91
                 }}
92 92
             />
93 93
             <MainStack.Screen
94 94
                 name="login"
95 95
                 component={LoginScreen}
96 96
                 options={{
97
-                    title: i18n.t('screens.login'),
97
+                    title: i18n.t('screens.login.title'),
98 98
                 }}
99 99
             />
100 100
 
101 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 106
             {createScreenCollapsibleStack(
107 107
                 "proximo-list",
108 108
                 MainStack,
109 109
                 ProximoListScreen,
110
-                i18n.t('screens.proximoArticles'),
110
+                i18n.t('screens.proximo.articleList'),
111 111
                 true,
112 112
                 {...screenTransition},
113 113
             )}
@@ -115,21 +115,21 @@ function MainStackComponent(props: { createTabNavigator: () => React.Node }) {
115 115
                 name="proximo-about"
116 116
                 component={ProximoAboutScreen}
117 117
                 options={{
118
-                    title: i18n.t('screens.proximo'),
118
+                    title: i18n.t('screens.proximo.title'),
119 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 128
             <MainStack.Screen
129 129
                 name="club-information"
130 130
                 component={ClubDisplayScreen}
131 131
                 options={{
132
-                    title: i18n.t('screens.clubDisplayScreen'),
132
+                    title: i18n.t('screens.clubs.details'),
133 133
                     ...modalTransition,
134 134
                 }}
135 135
             />
@@ -137,7 +137,7 @@ function MainStackComponent(props: { createTabNavigator: () => React.Node }) {
137 137
                 name="club-about"
138 138
                 component={ClubAboutScreen}
139 139
                 options={{
140
-                    title: i18n.t('screens.clubsAbout'),
140
+                    title: i18n.t('screens.clubs.title'),
141 141
                     ...modalTransition,
142 142
                 }}
143 143
             />
@@ -145,7 +145,7 @@ function MainStackComponent(props: { createTabNavigator: () => React.Node }) {
145 145
                 name="vote"
146 146
                 component={VoteScreen}
147 147
                 options={{
148
-                    title: i18n.t('screens.vote'),
148
+                    title: i18n.t('screens.vote.title'),
149 149
                 }}
150 150
             />
151 151
 
@@ -153,7 +153,7 @@ function MainStackComponent(props: { createTabNavigator: () => React.Node }) {
153 153
                 name="feedback"
154 154
                 component={BugReportScreen}
155 155
                 options={{
156
-                    title: i18n.t('screens.feedback'),
156
+                    title: i18n.t('screens.feedback.title'),
157 157
                 }}
158 158
             />
159 159
         </MainStack.Navigator>

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

@@ -42,9 +42,9 @@ function ServicesStackComponent() {
42 42
             headerMode={"screen"}
43 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 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 48
         </ServicesStack.Navigator>
49 49
     );
50 50
 }
@@ -58,11 +58,11 @@ function ProxiwashStackComponent() {
58 58
             headerMode={"screen"}
59 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 62
             <ProxiwashStack.Screen
63 63
                 name="proxiwash-about"
64 64
                 component={ProxiwashAboutScreen}
65
-                options={{title: i18n.t('screens.proxiwash'),}}
65
+                options={{title: i18n.t('screens.proxiwash.title'),}}
66 66
             />
67 67
         </ProxiwashStack.Navigator>
68 68
     );
@@ -80,12 +80,12 @@ function PlanningStackComponent() {
80 80
             <PlanningStack.Screen
81 81
                 name="index"
82 82
                 component={PlanningScreen}
83
-                options={{title: i18n.t('screens.planning'),}}
83
+                options={{title: i18n.t('screens.planning.title'),}}
84 84
             />
85 85
             <PlanningStack.Screen
86 86
                 name="planning-information"
87 87
                 component={PlanningDisplayScreen}
88
-                options={{title: i18n.t('screens.planningDisplayScreen'),}}
88
+                options={{title: i18n.t('screens.planning.eventDetails'),}}
89 89
             />
90 90
         </PlanningStack.Navigator>
91 91
     );
@@ -109,7 +109,7 @@ function HomeStackComponent(initialRoute: string | null, defaultData: { [key: st
109 109
                     name="index"
110 110
                     component={HomeScreen}
111 111
                     options={{
112
-                        title: i18n.t('screens.home'),
112
+                        title: i18n.t('screens.home.title'),
113 113
                         headerStyle: {
114 114
                             backgroundColor: colors.surface,
115 115
                         },
@@ -124,22 +124,22 @@ function HomeStackComponent(initialRoute: string | null, defaultData: { [key: st
124 124
             <HomeStack.Screen
125 125
                 name="scanner"
126 126
                 component={ScannerScreen}
127
-                options={{title: i18n.t('screens.scanner'),}}
127
+                options={{title: i18n.t('screens.scanner.title'),}}
128 128
             />
129 129
             <HomeStack.Screen
130 130
                 name="club-information"
131 131
                 component={ClubDisplayScreen}
132
-                options={{title: i18n.t('screens.clubDisplayScreen'),}}
132
+                options={{title: i18n.t('screens.clubs.details'),}}
133 133
             />
134 134
             <HomeStack.Screen
135 135
                 name="feed-information"
136 136
                 component={FeedItemScreen}
137
-                options={{title: i18n.t('screens.feedDisplayScreen'),}}
137
+                options={{title: i18n.t('screens.home.feed'),}}
138 138
             />
139 139
             <HomeStack.Screen
140 140
                 name="planning-information"
141 141
                 component={PlanningDisplayScreen}
142
-                options={{title: i18n.t('screens.planningDisplayScreen'),}}
142
+                options={{title: i18n.t('screens.planning.eventDetails'),}}
143 143
             />
144 144
         </HomeStack.Navigator>
145 145
     );
@@ -154,7 +154,7 @@ function PlanexStackComponent() {
154 154
             headerMode={"screen"}
155 155
             screenOptions={defaultScreenOptions}
156 156
         >
157
-            {getWebsiteStack("index", PlanexStack, PlanexScreen, "Planex")}
157
+            {getWebsiteStack("index", PlanexStack, PlanexScreen, i18n.t("screens.planex.title"))}
158 158
             {createScreenCollapsibleStack("group-select", PlanexStack, GroupSelectionScreen, "GROUP SELECT")}
159 159
         </PlanexStack.Navigator>
160 160
     );
@@ -191,28 +191,28 @@ export default class TabNavigator extends React.Component<Props> {
191 191
                     name="services"
192 192
                     option
193 193
                     component={ServicesStackComponent}
194
-                    options={{title: i18n.t('screens.services')}}
194
+                    options={{title: i18n.t('screens.services.title')}}
195 195
                 />
196 196
                 <Tab.Screen
197 197
                     name="proxiwash"
198 198
                     component={ProxiwashStackComponent}
199
-                    options={{title: i18n.t('screens.proxiwash')}}
199
+                    options={{title: i18n.t('screens.proxiwash.title')}}
200 200
                 />
201 201
                 <Tab.Screen
202 202
                     name="home"
203 203
                     component={this.createHomeStackComponent}
204
-                    options={{title: i18n.t('screens.home')}}
204
+                    options={{title: i18n.t('screens.home.title')}}
205 205
                 />
206 206
                 <Tab.Screen
207 207
                     name="planning"
208 208
                     component={PlanningStackComponent}
209
-                    options={{title: i18n.t('screens.planning')}}
209
+                    options={{title: i18n.t('screens.planning.title')}}
210 210
                 />
211 211
 
212 212
                 <Tab.Screen
213 213
                     name="planex"
214 214
                     component={PlanexStackComponent}
215
-                    options={{title: "Planex"}}
215
+                    options={{title: i18n.t("screens.planex.title")}}
216 216
                 />
217 217
             </Tab.Navigator>
218 218
         );

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

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

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

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

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

@@ -28,15 +28,15 @@ class ClubAboutScreen extends React.Component<Props> {
28 28
                         style={{flex: 1, resizeMode: "contain"}}
29 29
                         resizeMode="contain"/>
30 30
                 </View>
31
-                <Text>{i18n.t("clubs.about.text")}</Text>
31
+                <Text>{i18n.t("screens.clubs.about.text")}</Text>
32 32
                 <Card style={{margin: 5}}>
33 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 36
                         left={props => <List.Icon {...props} icon={'information'}/>}
37 37
                     />
38 38
                     <Card.Content>
39
-                        <Text>{i18n.t("clubs.about.message")}</Text>
39
+                        <Text>{i18n.t("screens.clubs.about.message")}</Text>
40 40
                         <Autolink
41 41
                             text={CONTACT_LINK}
42 42
                             component={Text}

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

@@ -123,8 +123,8 @@ class ClubDisplayScreen extends React.Component<Props, State> {
123 123
         return (
124 124
             <Card style={{marginTop: 10, marginBottom: CustomTabBar.TAB_BAR_HEIGHT + 20}}>
125 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 128
                     left={(props) => <Avatar.Icon
129 129
                         {...props}
130 130
                         style={{backgroundColor: 'transparent'}}
@@ -151,8 +151,8 @@ class ClubDisplayScreen extends React.Component<Props, State> {
151 151
             ? email
152 152
             : AMICALE_MAIL;
153 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 156
         return (
157 157
             <Card.Actions>
158 158
                 <Button
@@ -235,7 +235,7 @@ class ClubDisplayScreen extends React.Component<Props, State> {
235 235
                 errorViewOverride={[
236 236
                     {
237 237
                         errorCode: ERROR_TYPE.BAD_INPUT,
238
-                        message: i18n.t("clubs.invalidClub"),
238
+                        message: i18n.t("screens.clubs.invalidClub"),
239 239
                         icon: "account-question",
240 240
                         showRetryButton: false
241 241
                     }

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

@@ -73,7 +73,7 @@ class ClubListScreen extends React.Component<Props, State> {
73 73
     getSearchBar = () => {
74 74
         return (
75 75
             <Searchbar
76
-                placeholder={i18n.t('proximoScreen.search')}
76
+                placeholder={i18n.t('screens.proximo.search')}
77 77
                 onChangeText={this.onSearchStringChange}
78 78
             />
79 79
         );

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

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

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

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

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

@@ -305,7 +305,7 @@ class EquipmentRentScreen extends React.Component<Props, State> {
305 305
                                             lineHeight: 35,
306 306
                                             marginLeft: 10,
307 307
                                         }}>
308
-                                            ({i18n.t('equipmentScreen.bail', {cost: item.caution})})
308
+                                            ({i18n.t('screens.equipment.bail', {cost: item.caution})})
309 309
                                         </Caption>
310 310
                                     </View>
311 311
                                 </View>
@@ -315,7 +315,7 @@ class EquipmentRentScreen extends React.Component<Props, State> {
315 315
                                     color={isAvailable ? this.props.theme.colors.success : this.props.theme.colors.primary}
316 316
                                     mode="text"
317 317
                                 >
318
-                                    {i18n.t('equipmentScreen.available', {date: getRelativeDateString(firstAvailability)})}
318
+                                    {i18n.t('screens.equipment.available', {date: getRelativeDateString(firstAvailability)})}
319 319
                                 </Button>
320 320
                                 <Subheading style={{
321 321
                                     textAlign: "center",
@@ -324,13 +324,13 @@ class EquipmentRentScreen extends React.Component<Props, State> {
324 324
                                 }}>
325 325
                                     {
326 326
                                         start == null
327
-                                            ? i18n.t('equipmentScreen.booking')
327
+                                            ? i18n.t('screens.equipment.booking')
328 328
                                             : end != null && start.getTime() !== end.getTime()
329
-                                            ? i18n.t('equipmentScreen.bookingPeriod', {
329
+                                            ? i18n.t('screens.equipment.bookingPeriod', {
330 330
                                                 begin: getRelativeDateString(start),
331 331
                                                 end: getRelativeDateString(end)
332 332
                                             })
333
-                                            : i18n.t('equipmentScreen.bookingDay', {
333
+                                            : i18n.t('screens.equipment.bookingDay', {
334 334
                                                 date: getRelativeDateString(start)
335 335
                                             })
336 336
                                     }
@@ -401,9 +401,9 @@ class EquipmentRentScreen extends React.Component<Props, State> {
401 401
                         visible={this.state.dialogVisible}
402 402
                         onDismiss={this.onDialogDismiss}
403 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 409
                     <ErrorDialog
@@ -436,7 +436,7 @@ class EquipmentRentScreen extends React.Component<Props, State> {
436 436
                                 borderRadius: 10
437 437
                             }}
438 438
                         >
439
-                            {i18n.t('equipmentScreen.bookButton')}
439
+                            {i18n.t('screens.equipment.bookButton')}
440 440
                         </Button>
441 441
                     </Animatable.View>
442 442
 

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

@@ -111,7 +111,7 @@ class LoginScreen extends React.Component<Props, State> {
111 111
     /**
112 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 117
      * The user has unfocused the input, his email is ready to be validated
@@ -229,7 +229,7 @@ class LoginScreen extends React.Component<Props, State> {
229 229
         return (
230 230
             <View>
231 231
                 <TextInput
232
-                    label={i18n.t("loginScreen.email")}
232
+                    label={i18n.t("screens.login.email")}
233 233
                     mode='outlined'
234 234
                     value={this.state.email}
235 235
                     onChangeText={this.onEmailChange}
@@ -248,11 +248,11 @@ class LoginScreen extends React.Component<Props, State> {
248 248
                     type="error"
249 249
                     visible={this.shouldShowEmailError()}
250 250
                 >
251
-                    {i18n.t("loginScreen.emailError")}
251
+                    {i18n.t("screens.login.emailError")}
252 252
                 </HelperText>
253 253
                 <TextInput
254 254
                     ref={this.passwordInputRef}
255
-                    label={i18n.t("loginScreen.password")}
255
+                    label={i18n.t("screens.login.password")}
256 256
                     mode='outlined'
257 257
                     value={this.state.password}
258 258
                     onChangeText={this.onPasswordChange}
@@ -271,7 +271,7 @@ class LoginScreen extends React.Component<Props, State> {
271 271
                     type="error"
272 272
                     visible={this.shouldShowPasswordError()}
273 273
                 >
274
-                    {i18n.t("loginScreen.passwordError")}
274
+                    {i18n.t("screens.login.passwordError")}
275 275
                 </HelperText>
276 276
             </View>
277 277
         );
@@ -285,8 +285,8 @@ class LoginScreen extends React.Component<Props, State> {
285 285
         return (
286 286
             <Card style={styles.card}>
287 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 290
                     left={(props) => <Avatar.Image
291 291
                         {...props}
292 292
                         source={ICON_AMICALE}
@@ -302,7 +302,7 @@ class LoginScreen extends React.Component<Props, State> {
302 302
                             loading={this.state.loading}
303 303
                             onPress={this.onSubmit}
304 304
                             style={{marginLeft: 'auto'}}>
305
-                            {i18n.t("loginScreen.login")}
305
+                            {i18n.t("screens.login.title")}
306 306
                         </Button>
307 307
                     </Card.Actions>
308 308
                     <Card.Actions>
@@ -311,7 +311,7 @@ class LoginScreen extends React.Component<Props, State> {
311 311
                             mode="contained"
312 312
                             onPress={this.onResetPasswordClick}
313 313
                             style={{marginLeft: 'auto'}}>
314
-                            {i18n.t("loginScreen.resetPassword")}
314
+                            {i18n.t("screens.login.resetPassword")}
315 315
                         </Button>
316 316
                     </Card.Actions>
317 317
                 </Card.Content>
@@ -328,8 +328,8 @@ class LoginScreen extends React.Component<Props, State> {
328 328
         return (
329 329
             <Card style={styles.card}>
330 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 333
                     left={(props) => <Avatar.Icon
334 334
                         {...props}
335 335
                         icon={"help"}
@@ -337,9 +337,9 @@ class LoginScreen extends React.Component<Props, State> {
337 337
                         style={{backgroundColor: 'transparent'}}/>}
338 338
                 />
339 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 343
                 </Card.Content>
344 344
             </Card>
345 345
         );

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

@@ -69,22 +69,22 @@ class ProfileScreen extends React.Component<Props, State> {
69 69
         ]
70 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 74
                 image: CLUBS_IMAGE,
75 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 80
                 image: VOTE_IMAGE,
81 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 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,7 +178,7 @@ class ProfileScreen extends React.Component<Props, State> {
178 178
         return (
179 179
             <Card style={styles.card}>
180 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 182
                     left={() => <Avatar.Image
183 183
                         size={64}
184 184
                         source={ICON_AMICALE}
@@ -189,11 +189,11 @@ class ProfileScreen extends React.Component<Props, State> {
189 189
                 <Card.Content>
190 190
                     <Divider/>
191 191
                     <Paragraph>
192
-                        {i18n.t("profileScreen.welcomeDescription")}
192
+                        {i18n.t("screens.profile.welcomeDescription")}
193 193
                     </Paragraph>
194 194
                     {this.getServicesList()}
195 195
                     <Paragraph>
196
-                        {i18n.t("profileScreen.welcomeFeedback")}
196
+                        {i18n.t("screens.profile.welcomeFeedback")}
197 197
                     </Paragraph>
198 198
                     <Divider/>
199 199
                     <Card.Actions>
@@ -202,7 +202,7 @@ class ProfileScreen extends React.Component<Props, State> {
202 202
                             mode="contained"
203 203
                             onPress={() => this.props.navigation.navigate('feedback')}
204 204
                             style={styles.editButton}>
205
-                            {i18n.t("feedbackScreen.homeButtonTitle")}
205
+                            {i18n.t("screens.feedback.homeButtonTitle")}
206 206
                         </Button>
207 207
                     </Card.Actions>
208 208
                 </Card.Content>
@@ -230,7 +230,7 @@ class ProfileScreen extends React.Component<Props, State> {
230 230
     getFieldValue(field: ?string) {
231 231
         return this.isFieldAvailable(field)
232 232
             ? field
233
-            : i18n.t("profileScreen.noData");
233
+            : i18n.t("screens.profile.noData");
234 234
     }
235 235
 
236 236
     /**
@@ -277,7 +277,7 @@ class ProfileScreen extends React.Component<Props, State> {
277 277
                 <Card.Content>
278 278
                     <Divider/>
279 279
                     <List.Section>
280
-                        <List.Subheader>{i18n.t("profileScreen.personalInformation")}</List.Subheader>
280
+                        <List.Subheader>{i18n.t("screens.profile.personalInformation")}</List.Subheader>
281 281
                         {this.getPersonalListItem(this.data.birthday, "cake-variant")}
282 282
                         {this.getPersonalListItem(this.data.phone, "phone")}
283 283
                         {this.getPersonalListItem(this.data.email, "email")}
@@ -288,9 +288,9 @@ class ProfileScreen extends React.Component<Props, State> {
288 288
                         <Button
289 289
                             icon="account-edit"
290 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 292
                             style={styles.editButton}>
293
-                            {i18n.t("profileScreen.editInformation")}
293
+                            {i18n.t("screens.profile.editInformation")}
294 294
                         </Button>
295 295
                     </Card.Actions>
296 296
                 </Card.Content>
@@ -307,8 +307,8 @@ class ProfileScreen extends React.Component<Props, State> {
307 307
         return (
308 308
             <Card style={styles.card}>
309 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 312
                     left={(props) => <Avatar.Icon
313 313
                         {...props}
314 314
                         icon="account-group"
@@ -333,8 +333,8 @@ class ProfileScreen extends React.Component<Props, State> {
333 333
         return (
334 334
             <Card style={styles.card}>
335 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 338
                     left={(props) => <Avatar.Icon
339 339
                         {...props}
340 340
                         icon="credit-card"
@@ -359,7 +359,7 @@ class ProfileScreen extends React.Component<Props, State> {
359 359
     getMembershipItem(state: boolean) {
360 360
         return (
361 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 363
                 left={props => <List.Icon
364 364
                     {...props}
365 365
                     color={state ? this.props.theme.colors.success : this.props.theme.colors.danger}
@@ -385,10 +385,10 @@ class ProfileScreen extends React.Component<Props, State> {
385 385
      */
386 386
     clubListItem = ({item}: { item: Club }) => {
387 387
         const onPress = () => this.openClubDetailsScreen(item.id);
388
-        let description = i18n.t("profileScreen.isMember");
388
+        let description = i18n.t("screens.profile.isMember");
389 389
         let icon = (props) => <List.Icon {...props} icon="chevron-right"/>;
390 390
         if (item.is_manager) {
391
-            description = i18n.t("profileScreen.isManager");
391
+            description = i18n.t("screens.profile.isManager");
392 392
             icon = (props) => <List.Icon {...props} icon="star" color={this.props.theme.colors.primary}/>;
393 393
         }
394 394
         return <List.Item

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

@@ -191,7 +191,7 @@ class HomeScreen extends React.Component<Props, State> {
191 191
         const onPressSettings = () => this.props.navigation.navigate("settings");
192 192
         return <MaterialHeaderButtons>
193 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 195
         </MaterialHeaderButtons>;
196 196
     };
197 197
 
@@ -246,7 +246,7 @@ class HomeScreen extends React.Component<Props, State> {
246 246
                 id: SECTIONS_ID[0]
247 247
             },
248 248
             {
249
-                title: i18n.t('homeScreen.newsFeed'),
249
+                title: '',
250 250
                 data: this.currentNewFeed,
251 251
                 id: SECTIONS_ID[1]
252 252
             }
@@ -602,17 +602,17 @@ class HomeScreen extends React.Component<Props, State> {
602 602
                 </View>
603 603
                 <MascotPopup
604 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 607
                     icon={"check"}
608 608
                     buttons={{
609 609
                         action: {
610
-                            message: i18n.t("homeScreen.loginBanner.login"),
610
+                            message: i18n.t("screens.home.mascotDialog.login"),
611 611
                             icon: "login",
612 612
                             onPress: this.onLogin,
613 613
                         },
614 614
                         cancel: {
615
-                            message: i18n.t("homeScreen.loginBanner.later"),
615
+                            message: i18n.t("screens.home.mascotDialog.later"),
616 616
                             icon: "close",
617 617
                             color: this.props.theme.colors.warning,
618 618
                             onPress: this.hideMascotDialog,

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

@@ -80,7 +80,7 @@ class ScannerScreen extends React.Component<Props, State> {
80 80
      */
81 81
     getPermissionScreen() {
82 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 84
             <Button
85 85
                 icon="camera"
86 86
                 mode="contained"
@@ -91,7 +91,7 @@ class ScannerScreen extends React.Component<Props, State> {
91 91
                     marginRight: 'auto',
92 92
                 }}
93 93
             >
94
-                {i18n.t("scannerScreen.buttonPermission")}
94
+                {i18n.t("screens.scanner.permissions.button")}
95 95
             </Button>
96 96
         </View>
97 97
     }
@@ -103,8 +103,8 @@ class ScannerScreen extends React.Component<Props, State> {
103 103
         this.setState({
104 104
             dialogVisible: true,
105 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,8 +125,8 @@ class ScannerScreen extends React.Component<Props, State> {
125 125
         this.setState({
126 126
             dialogVisible: true,
127 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,7 +184,7 @@ class ScannerScreen extends React.Component<Props, State> {
184 184
                     onPress={this.showHelpDialog}
185 185
                     style={styles.button}
186 186
                 >
187
-                    {i18n.t("scannerScreen.helpButton")}
187
+                    {i18n.t("screens.scanner.help.button")}
188 188
                 </Button>
189 189
                 <AlertDialog
190 190
                     visible={this.state.dialogVisible}

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

@@ -79,16 +79,16 @@ class FeedbackScreen extends React.Component<Props> {
79 79
             <ScrollView style={{padding: 5}}>
80 80
                 <Card>
81 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 84
                         left={(props) => <Avatar.Icon {...props} icon="bug"/>}
85 85
                     />
86 86
                     <Card.Content>
87 87
                         <Paragraph>
88
-                            {i18n.t('feedbackScreen.bugsDescription')}
88
+                            {i18n.t('screens.feedback.bugsDescription')}
89 89
                         </Paragraph>
90 90
                         <Paragraph style={{color: this.props.theme.colors.primary}}>
91
-                            {i18n.t('feedbackScreen.contactMeans')}
91
+                            {i18n.t('screens.feedback.contactMeans')}
92 92
                         </Paragraph>
93 93
                     </Card.Content>
94 94
                     {this.getButtons(true)}
@@ -96,13 +96,13 @@ class FeedbackScreen extends React.Component<Props> {
96 96
 
97 97
                 <Card style={{marginTop: 20, marginBottom: 10}}>
98 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 101
                         left={(props) => <Avatar.Icon {...props} icon="comment"/>}
102 102
                     />
103 103
                     <Card.Content>
104 104
                         <Paragraph>
105
-                            {i18n.t('feedbackScreen.feedbackDescription')}
105
+                            {i18n.t('screens.feedback.feedbackDescription')}
106 106
                         </Paragraph>
107 107
                     </Card.Content>
108 108
                     {this.getButtons(false)}

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

@@ -176,15 +176,15 @@ class SettingsScreen extends React.Component<Props, State> {
176 176
         return (
177 177
             <ScrollView>
178 178
                 <Card style={{margin: 5}}>
179
-                    <Card.Title title={i18n.t('settingsScreen.generalCard')}/>
179
+                    <Card.Title title={i18n.t('screens.settings.generalCard')}/>
180 180
                     <List.Section>
181 181
                         {Appearance.getColorScheme() !== 'no-preference' ? this.getToggleItem(
182 182
                             this.onToggleNightModeFollowSystem,
183 183
                             'theme-light-dark',
184
-                            i18n.t('settingsScreen.nightModeAuto'),
184
+                            i18n.t('screens.settings.nightModeAuto'),
185 185
                             this.state.nightMode ?
186
-                                i18n.t('settingsScreen.nightModeSubOn') :