Browse Source

Merge branch 'search_proximo' into dev

keplyx 2 years ago
parent
commit
4e2045925a

+ 42
- 4
components/CustomHeader.js View File

@@ -1,15 +1,19 @@
1 1
 // @flow
2 2
 
3 3
 import * as React from "react";
4
-import {Body, Header, Left, Right, Title} from "native-base";
4
+import {Body, Header, Input, Item, Left, Right, Title, Form} from "native-base";
5 5
 import {Platform, StyleSheet, View} from "react-native";
6 6
 import {getStatusBarHeight} from "react-native-status-bar-height";
7 7
 import Touchable from 'react-native-platform-touchable';
8 8
 import ThemeManager from "../utils/ThemeManager";
9 9
 import CustomMaterialIcon from "./CustomMaterialIcon";
10
+import i18n from "i18n-js";
10 11
 
11 12
 type Props = {
12 13
     hasBackButton: boolean,
14
+    hasSearchField: boolean,
15
+    searchCallback: Function,
16
+    shouldFocusSearchBar: boolean,
13 17
     leftButton: React.Node,
14 18
     rightButton: React.Node,
15 19
     title: string,
@@ -29,11 +33,43 @@ export default class CustomHeader extends React.Component<Props> {
29 33
 
30 34
     static defaultProps = {
31 35
         hasBackButton: false,
36
+        hasSearchField: false,
37
+        searchCallback: () => null,
38
+        shouldFocusSearchBar: false,
39
+        title: '',
32 40
         leftButton: <View/>,
33 41
         rightButton: <View/>,
34 42
         hasTabs: false,
35 43
     };
36 44
 
45
+    componentDidMount() {
46
+        if (this.refs.searchInput !== undefined && this.refs.searchInput._root !== undefined && this.props.shouldFocusSearchBar) {
47
+            // does not work if called to early for some reason...
48
+            setTimeout(() => this.refs.searchInput._root.focus(), 500);
49
+        }
50
+    }
51
+
52
+    getSearchBar() {
53
+        return (
54
+            <Form>
55
+            <Item
56
+                style={{
57
+                    width: '100%',
58
+                    marginBottom: 7
59
+                }}>
60
+                <CustomMaterialIcon
61
+                    icon={'magnify'}
62
+                    color={ThemeManager.getCurrentThemeVariables().toolbarBtnColor}/>
63
+                <Input
64
+                    ref="searchInput"
65
+                    placeholder={i18n.t('proximoScreen.search')}
66
+                    placeholderTextColor={ThemeManager.getCurrentThemeVariables().toolbarPlaceholderColor}
67
+                    onChangeText={(text) => this.props.searchCallback(text)}/>
68
+            </Item>
69
+            </Form>
70
+        );
71
+    }
72
+
37 73
     render() {
38 74
         let button;
39 75
         // Does the app have a back button or a burger menu ?
@@ -52,13 +88,15 @@ export default class CustomHeader extends React.Component<Props> {
52 88
         return (
53 89
             <Header style={styles.header}
54 90
                     hasTabs={this.props.hasTabs}>
55
-                <Left>
91
+                <Left style={{flex: 0}}>
56 92
                     {button}
57 93
                 </Left>
58 94
                 <Body>
59
-                    <Title>{this.props.title}</Title>
95
+                    {this.props.hasSearchField ?
96
+                        this.getSearchBar() :
97
+                        <Title>{this.props.title}</Title>}
60 98
                 </Body>
61
-                <Right>
99
+                <Right style={{flex: this.props.hasSearchField ? 0 : 1}}>
62 100
                     {this.props.rightButton}
63 101
                     {this.props.hasBackButton ? <View/> :
64 102
                         <Touchable

+ 1
- 0
native-base-theme/variables/platform.js View File

@@ -154,6 +154,7 @@ export default {
154 154
     toolbarHeight: platform === "ios" ? 64 : 56,
155 155
     toolbarSearchIconSize: platform === "ios" ? 20 : 23,
156 156
     toolbarInputColor: platform === "ios" ? "#CECDD2" : "#fff",
157
+    toolbarPlaceholderColor: platform === "ios" ? "#CECDD2" : "#CECDD2",
157 158
     searchBarHeight: platform === "ios" ? 30 : 40,
158 159
     searchBarInputHeight: platform === "ios" ? 30 : 50,
159 160
     toolbarBtnTextColor: platform === "ios" ? "#be1522" : "#fff",

+ 1
- 0
native-base-theme/variables/platformDark.js View File

@@ -155,6 +155,7 @@ export default {
155 155
     toolbarHeight: platform === "ios" ? 64 : 56,
156 156
     toolbarSearchIconSize: platform === "ios" ? 20 : 23,
157 157
     toolbarInputColor: platform === "ios" ? "#CECDD2" : "#fff",
158
+    toolbarPlaceholderColor: platform === "ios" ? "#CECDD2" : "#CECDD2",
158 159
     searchBarHeight: platform === "ios" ? 30 : 40,
159 160
     searchBarInputHeight: platform === "ios" ? 30 : 50,
160 161
     toolbarBtnTextColor: platform === "ios" ? "#be1522" : "#fff",

+ 77
- 35
screens/Proximo/ProximoListScreen.js View File

@@ -45,12 +45,12 @@ type Props = {
45 45
 }
46 46
 
47 47
 type State = {
48
-    navData: Array<Object>,
49 48
     currentSortMode: string,
50 49
     isSortReversed: boolean,
51 50
     sortPriceIcon: React.Node,
52 51
     sortNameIcon: React.Node,
53 52
     modalCurrentDisplayItem: Object,
53
+    currentlyDisplayedData: Array<Object>,
54 54
 };
55 55
 
56 56
 /**
@@ -58,20 +58,24 @@ type State = {
58 58
  */
59 59
 export default class ProximoListScreen extends React.Component<Props, State> {
60 60
 
61
-    modalRef:  { current: null | Modalize };
61
+    modalRef: { current: null | Modalize };
62
+    originalData: Array<Object>;
63
+    navData = this.props.navigation.getParam('data', []);
64
+    shouldFocusSearchBar = this.props.navigation.getParam('shouldFocusSearchBar', false);
62 65
 
63 66
     constructor(props: any) {
64 67
         super(props);
65 68
         this.modalRef = React.createRef();
69
+        this.originalData = this.navData['data'];
66 70
     }
67 71
 
68 72
     state = {
69
-        navData: this.props.navigation.getParam('data', []).sort(sortPrice),
73
+        currentlyDisplayedData: this.navData['data'].sort(sortPrice),
70 74
         currentSortMode: sortMode.price,
71 75
         isSortReversed: false,
72 76
         sortPriceIcon: '',
73 77
         sortNameIcon: '',
74
-        modalCurrentDisplayItem: {}
78
+        modalCurrentDisplayItem: {},
75 79
     };
76 80
 
77 81
     _menu: Menu;
@@ -111,7 +115,7 @@ export default class ProximoListScreen extends React.Component<Props, State> {
111 115
             currentSortMode: mode,
112 116
             isSortReversed: isReverse
113 117
         });
114
-        let data = this.state.navData;
118
+        let data = this.state.currentlyDisplayedData;
115 119
         switch (mode) {
116 120
             case sortMode.price:
117 121
                 if (isReverse) {
@@ -192,6 +196,35 @@ export default class ProximoListScreen extends React.Component<Props, State> {
192 196
         }
193 197
     }
194 198
 
199
+
200
+    sanitizeString(str: string) {
201
+        return str.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "");
202
+    }
203
+
204
+    /**
205
+     * Returns only the articles whose name contains str. Case and accents insensitive.
206
+     * @param str
207
+     * @returns {[]}
208
+     */
209
+    filterData(str: string) {
210
+        let filteredData = [];
211
+        const testStr = this.sanitizeString(str);
212
+        const articles = this.originalData;
213
+        for (const article of articles) {
214
+            const name = this.sanitizeString(article.name);
215
+            if (name.includes(testStr)) {
216
+                filteredData.push(article)
217
+            }
218
+        }
219
+        return filteredData;
220
+    }
221
+
222
+    search(str: string) {
223
+        this.setState({
224
+            currentlyDisplayedData: this.filterData(str)
225
+        })
226
+    }
227
+
195 228
     getModalContent() {
196 229
         return (
197 230
             <View style={{
@@ -232,10 +265,39 @@ export default class ProximoListScreen extends React.Component<Props, State> {
232 265
         }
233 266
     }
234 267
 
268
+    getSortMenu() {
269
+        return (
270
+            <Menu
271
+                ref={this.setMenuRef}
272
+                button={
273
+                    <Touchable
274
+                        style={{padding: 6}}
275
+                        onPress={() =>
276
+                            this._menu.show()
277
+                        }>
278
+                        <CustomMaterialIcon
279
+                            color={Platform.OS === 'ios' ? ThemeManager.getCurrentThemeVariables().brandPrimary : "#fff"}
280
+                            icon={'sort'}/>
281
+                    </Touchable>
282
+                }
283
+            >
284
+                <MenuItem
285
+                    onPress={() => this.sortModeSelected(sortMode.name)}>
286
+                    {this.state.sortNameIcon}
287
+                    {i18n.t('proximoScreen.sortName')}
288
+                </MenuItem>
289
+                <MenuItem
290
+                    onPress={() => this.sortModeSelected(sortMode.price)}>
291
+                    {this.state.sortPriceIcon}
292
+                    {i18n.t('proximoScreen.sortPrice')}
293
+                </MenuItem>
294
+            </Menu>
295
+        );
296
+    }
297
+
235 298
     render() {
236 299
         const nav = this.props.navigation;
237 300
         const navType = nav.getParam('type', '{name: "Error"}');
238
-
239 301
         return (
240 302
             <Container>
241 303
                 <Modalize ref={this.modalRef}
@@ -243,38 +305,18 @@ export default class ProximoListScreen extends React.Component<Props, State> {
243 305
                           modalStyle={{backgroundColor: ThemeManager.getCurrentThemeVariables().containerBgColor}}>
244 306
                     {this.getModalContent()}
245 307
                 </Modalize>
246
-                <CustomHeader hasBackButton={true} navigation={nav} title={navType.name} rightButton={
247
-                    <Menu
248
-                        ref={this.setMenuRef}
249
-                        button={
250
-                            <Touchable
251
-                                style={{padding: 6}}
252
-                                onPress={() =>
253
-                                    this._menu.show()
254
-                                }>
255
-                                <CustomMaterialIcon
256
-                                    color={Platform.OS === 'ios' ? ThemeManager.getCurrentThemeVariables().brandPrimary : "#fff"}
257
-                                    icon={'sort'}/>
258
-                            </Touchable>
259
-                        }
260
-                    >
261
-                        <MenuItem
262
-                            onPress={() => this.sortModeSelected(sortMode.name)}>
263
-                            {this.state.sortNameIcon}
264
-                            {i18n.t('proximoScreen.sortName')}
265
-                        </MenuItem>
266
-                        <MenuItem
267
-                            onPress={() => this.sortModeSelected(sortMode.price)}>
268
-                            {this.state.sortPriceIcon}
269
-                            {i18n.t('proximoScreen.sortPrice')}
270
-                        </MenuItem>
271
-                    </Menu>
272
-                }/>
308
+                <CustomHeader
309
+                    hasBackButton={true}
310
+                    navigation={nav}
311
+                    hasSearchField={true}
312
+                    searchCallback={(text) => this.search(text)}
313
+                    shouldFocusSearchBar={this.shouldFocusSearchBar}
314
+                    rightButton={this.getSortMenu()}/>
273 315
 
274 316
                 <Content>
275 317
                     <FlatList
276
-                        data={this.state.navData}
277
-                        extraData={this.state.navData}
318
+                        data={this.state.currentlyDisplayedData}
319
+                        extraData={this.state.currentlyDisplayedData}
278 320
                         keyExtractor={(item) => item.name + item.code}
279 321
                         style={{minHeight: 300, width: '100%'}}
280 322
                         renderItem={({item}) =>

+ 73
- 19
screens/Proximo/ProximoMainScreen.js View File

@@ -2,7 +2,7 @@
2 2
 
3 3
 import * as React from 'react';
4 4
 import {Platform, View} from 'react-native'
5
-import {Badge, Body, H2, Left, ListItem, Right, Text} from 'native-base';
5
+import {Badge, Body, Left, ListItem, Right, Text} from 'native-base';
6 6
 import i18n from "i18n-js";
7 7
 import CustomMaterialIcon from "../../components/CustomMaterialIcon";
8 8
 import FetchedDataSectionList from "../../components/FetchedDataSectionList";
@@ -38,7 +38,7 @@ export default class ProximoMainScreen extends FetchedDataSectionList {
38 38
         return [
39 39
             {
40 40
                 title: '',
41
-                data: ProximoMainScreen.generateData(fetchedData),
41
+                data: this.generateData(fetchedData),
42 42
                 extraData: super.state,
43 43
                 keyExtractor: this.getKeyExtractor
44 44
             }
@@ -52,66 +52,120 @@ export default class ProximoMainScreen extends FetchedDataSectionList {
52 52
      * @param fetchedData The array of articles represented by objects
53 53
      * @returns {Array} The formatted dataset
54 54
      */
55
-    static generateData(fetchedData: Object) {
55
+    generateData(fetchedData: Object) {
56 56
         let finalData = [];
57 57
         if (fetchedData.types !== undefined && fetchedData.articles !== undefined) {
58 58
             let types = fetchedData.types;
59 59
             let articles = fetchedData.articles;
60
+            finalData.push({
61
+                type: {
62
+                    id: "0",
63
+                    name: i18n.t('proximoScreen.all'),
64
+                    icon: 'star'
65
+                },
66
+                data: this.getAvailableArticles(articles, undefined)
67
+            });
60 68
             for (let i = 0; i < types.length; i++) {
61 69
                 finalData.push({
62 70
                     type: types[i],
63
-                    data: []
71
+                    data: this.getAvailableArticles(articles, types[i])
64 72
                 });
65
-                for (let k = 0; k < articles.length; k++) {
66
-                    if (articles[k]['type'].includes(types[i].id) && parseInt(articles[k]['quantity']) > 0) {
67
-                        finalData[i].data.push(articles[k]);
68
-                    }
69
-                }
73
+
70 74
             }
71 75
         }
72 76
         finalData.sort(ProximoMainScreen.sortFinalData);
73 77
         return finalData;
74 78
     }
75 79
 
80
+    /**
81
+     * Get an array of available articles (in stock) of the given type
82
+     *
83
+     * @param articles The list of all articles
84
+     * @param type The type of articles to find (undefined for any type)
85
+     * @return {Array} The array of available articles
86
+     */
87
+    getAvailableArticles(articles: Array<Object>, type: ?Object) {
88
+        let availableArticles = [];
89
+        for (let k = 0; k < articles.length; k++) {
90
+            if ((type !== undefined && type !== null && articles[k]['type'].includes(type['id'])
91
+                || type === undefined)
92
+                && parseInt(articles[k]['quantity']) > 0) {
93
+                availableArticles.push(articles[k]);
94
+            }
95
+        }
96
+        return availableArticles;
97
+    }
98
+
76 99
     static sortFinalData(a: Object, b: Object) {
77 100
         return a.type.id - b.type.id;
78 101
     }
79 102
 
80 103
     getRightButton() {
104
+        let searchScreenData = {
105
+            shouldFocusSearchBar: true,
106
+            data: {
107
+                type: {
108
+                    id: "0",
109
+                    name: i18n.t('proximoScreen.all'),
110
+                    icon: 'star'
111
+                },
112
+                data: this.state.fetchedData.articles !== undefined ?
113
+                    this.getAvailableArticles(this.state.fetchedData.articles, undefined) : []
114
+            },
115
+        };
116
+
117
+
81 118
         return (
82
-            <Touchable
83
-                style={{padding: 6}}
84
-                onPress={() => this.props.navigation.navigate('ProximoAboutScreen')}>
85
-                <CustomMaterialIcon
86
-                    color={Platform.OS === 'ios' ? ThemeManager.getCurrentThemeVariables().brandPrimary : "#fff"}
87
-                    icon="information"/>
88
-            </Touchable>
119
+            <View
120
+                style={{
121
+                    flexDirection: 'row'
122
+                }}>
123
+                <Touchable
124
+                    style={{padding: 6}}
125
+                    onPress={() => this.props.navigation.navigate('ProximoListScreen', searchScreenData)}>
126
+                    <CustomMaterialIcon
127
+                        color={Platform.OS === 'ios' ? ThemeManager.getCurrentThemeVariables().brandPrimary : "#fff"}
128
+                        icon="magnify"/>
129
+                </Touchable>
130
+                <Touchable
131
+                    style={{padding: 6}}
132
+                    onPress={() => this.props.navigation.navigate('ProximoAboutScreen')}>
133
+                    <CustomMaterialIcon
134
+                        color={Platform.OS === 'ios' ? ThemeManager.getCurrentThemeVariables().brandPrimary : "#fff"}
135
+                        icon="information"/>
136
+                </Touchable>
137
+            </View>
89 138
         );
90 139
     }
91 140
 
92 141
     getRenderItem(item: Object, section: Object, data: Object) {
142
+        let dataToSend = {
143
+            shouldFocusSearchBar: false,
144
+            data: item,
145
+        };
93 146
         if (item.data.length > 0) {
94 147
             return (
95 148
                 <ListItem
96 149
                     button
97 150
                     thumbnail
98 151
                     onPress={() => {
99
-                        this.props.navigation.navigate('ProximoListScreen', item);
152
+                        this.props.navigation.navigate('ProximoListScreen', dataToSend);
100 153
                     }}
101 154
                 >
102 155
                     <Left>
103 156
                         <CustomMaterialIcon
104 157
                             icon={item.type.icon}
105 158
                             fontSize={30}
159
+                            color={ThemeManager.getCurrentThemeVariables().brandPrimary}
106 160
                         />
107 161
                     </Left>
108 162
                     <Body>
109 163
                         <Text>
110 164
                             {item.type.name}
111 165
                         </Text>
112
-                        <Badge><Text>
166
+                        <Text note>
113 167
                             {item.data.length} {item.data.length > 1 ? i18n.t('proximoScreen.articles') : i18n.t('proximoScreen.article')}
114
-                        </Text></Badge>
168
+                        </Text>
115 169
                     </Body>
116 170
                     <Right>
117 171
                         <CustomMaterialIcon icon="chevron-right"/>

+ 5
- 3
translations/en.json View File

@@ -25,7 +25,7 @@
25 25
     },
26 26
     "slide4": {
27 27
       "title": "Proximo",
28
-      "text": "Are you short on pasta? Or you maybe you feel a little peckish, then look up your INSA shop's stock in real time"
28
+      "text": "Are you short on pasta? Or maybe you feel a little peckish, then look up your INSA shop's stock in real time"
29 29
     },
30 30
     "slide5": {
31 31
       "title": "Planex",
@@ -129,7 +129,9 @@
129 129
     "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.",
130 130
     "openingHours": "Openning Hours",
131 131
     "paymentMethods": "Payment Methods",
132
-    "paymentMethodsDescription": "Cash or Lydia"
132
+    "paymentMethodsDescription": "Cash or Lydia",
133
+    "search": "Search",
134
+    "all": "All"
133 135
   },
134 136
   "proxiwashScreen": {
135 137
     "dryer": "Dryer",
@@ -141,7 +143,7 @@
141 143
     "listUpdateFail": "Error while updating machines state",
142 144
     "error": "Could not update machines state. Pull down to retry.",
143 145
     "loading": "Loading...",
144
-    "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 b credit card or cash.",
146
+    "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.",
145 147
     "informationTab": "Information",
146 148
     "paymentTab": "Payment",
147 149
     "tariffs": "Tariffs",

+ 14
- 12
translations/fr.json View File

@@ -21,11 +21,11 @@
21 21
     },
22 22
     "slide3": {
23 23
       "title": "N'oubliez plus votre linge !",
24
-      "text": "CAMPUS vous informe de la disponibilité des machines et vous permet d'être notifiés lorsque la vôtre se termine bientôt !"
24
+      "text": "CAMPUS vous informe de la disponibilité des machines et vous permet d'être notifié lorsque la vôtre se termine bientôt !"
25 25
     },
26 26
     "slide4": {
27 27
       "title": "Proximo",
28
-      "text": "Il vous manque des pâtes ? Ou un petit creux au gouter, regardez les stocks de votre supérette insaienne en temps réel"
28
+      "text": "Il vous manque des pâtes ? Ou un petit creux au goûter, regardez les stocks de votre supérette insaienne en temps réel"
29 29
     },
30 30
     "slide5": {
31 31
       "title": "Planex",
@@ -75,7 +75,7 @@
75 75
     "dashboard": {
76 76
       "seeMore": "Cliquez pour plus d'infos",
77 77
       "todayEventsTitle": "Événements aujourd'hui",
78
-      "todayEventsSubtitleNA": "Pas d'événements",
78
+      "todayEventsSubtitleNA": "Pas d'événement",
79 79
       "todayEventsSubtitle": " événement aujourd'hui",
80 80
       "todayEventsSubtitlePlural": " événements aujourd'hui",
81 81
       "proximoTitle": "Proximo",
@@ -126,10 +126,12 @@
126 126
     "listUpdateFail": "Erreur lors de la mise à jour de la list d'articles",
127 127
     "loading": "Chargement...",
128 128
     "inStock": "en stock",
129
-    "description": "Le Proximo c’est ta petite épicerie étudiante tenu par les étudiants directement sur le campus. Ouvert tous les jours de 18h30 à 19h30, nous t’accueillons et te souvent quand tu n’as plus de pâtes ou de diluant ! Différents produits pour différentes galère, le tout à prix coûtant. Tu peux payer par Lydia ou par espèce.",
129
+    "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.",
130 130
     "openingHours": "Horaires d'ouverture",
131 131
     "paymentMethods" : "Moyens de Paiement",
132
-    "paymentMethodsDescription" : "Espèce ou Lydia"
132
+    "paymentMethodsDescription" : "Espèce ou Lydia",
133
+    "search": "Rechercher",
134
+    "all": "Tout"
133 135
   },
134 136
   "proxiwashScreen": {
135 137
     "dryer": "Sèche-Linge",
@@ -137,9 +139,9 @@
137 139
     "washer": "Lave-Linge",
138 140
     "washers": "Lave-Linges",
139 141
     "min": "min",
140
-    "listUpdated": "Etat des machines mis à jour",
141
-    "listUpdateFail": "Erreur lors de la mise à jour del'état des machines",
142
-    "error": "Impossible de mettre a jour l'état des machines. Tirez vers le bas pour reessayer.",
142
+    "listUpdated": "État des machines mis à jour",
143
+    "listUpdateFail": "Erreur lors de la mise à jour de l'état des machines",
144
+    "error": "Impossible de mettre a jour l'état des machines. Tirez vers le bas pour réessayer.",
143 145
     "loading": "Chargement...",
144 146
     "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.",
145 147
     "informationTab": "Informations",
@@ -152,7 +154,7 @@
152 154
     "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.",
153 155
     "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).",
154 156
     "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.",
155
-    "dryerTips": "La durée conseillée est de 35 minutes pour 14kg de linge. Vous pouvez choisir une durée plus courte si le seche-linge n'est pas chargé.",
157
+    "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é.",
156 158
     "procedure": "Procédure",
157 159
     "tips": "Conseils",
158 160
 
@@ -161,7 +163,7 @@
161 163
       "disableNotifications": "Désactiver les  notifications",
162 164
       "ok": "OK",
163 165
       "cancel": "Annuler",
164
-      "finished": "Cette machine est terminée. Si vous l'avez l'avez démarée, vous pouvez récupérer votre linge.",
166
+      "finished": "Cette machine est terminée. Si vous l'avez démarrée, vous pouvez récupérer votre linge.",
165 167
       "ready": "Cette machine est vide et prête à être utilisée.",
166 168
       "running": "Cette machine a démarré à %{start} et terminera à %{end}.\nTemps restant : %{remaining} min",
167 169
       "broken": "Cette machine est hors service. Merci pour votre compréhension.",
@@ -171,7 +173,7 @@
171 173
 
172 174
     },
173 175
     "states": {
174
-      "finished": "TERMINE",
176
+      "finished": "TERMINÉ",
175 177
       "ready": "DISPONIBLE",
176 178
       "running": "EN COURS",
177 179
       "broken": "HORS SERVICE",
@@ -195,7 +197,7 @@
195 197
   },
196 198
   "general": {
197 199
     "loading": "Chargement...",
198
-    "networkError": "Impossible de contacter les serveurs. Assurez vous d'être connecté à internet."
200
+    "networkError": "Impossible de contacter les serveurs. Assurez-vous d'être connecté à internet."
199 201
   },
200 202
   "date": {
201 203
     "daysOfWeek": {

Loading…
Cancel
Save