1 /************************************************************************
2  **
3  **  @file   vtranslatevars.cpp
4  **  @author Roman Telezhynskyi <dismine(at)gmail.com>
5  **  @date   10 6, 2015
6  **
7  **  @brief
8  **  @copyright
9  **  This source code is part of the Valentina project, a pattern making
10  **  program, whose allow create and modeling patterns of clothing.
11  **  Copyright (C) 2015 Valentina project
12  **  <https://gitlab.com/smart-pattern/valentina> All Rights Reserved.
13  **
14  **  Valentina is free software: you can redistribute it and/or modify
15  **  it under the terms of the GNU General Public License as published by
16  **  the Free Software Foundation, either version 3 of the License, or
17  **  (at your option) any later version.
18  **
19  **  Valentina is distributed in the hope that it will be useful,
20  **  but WITHOUT ANY WARRANTY; without even the implied warranty of
21  **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  **  GNU General Public License for more details.
23  **
24  **  You should have received a copy of the GNU General Public License
25  **  along with Valentina.  If not, see <http://www.gnu.org/licenses/>.
26  **
27  *************************************************************************/
28 
29 #include "vtranslatevars.h"
30 
31 #include <QList>
32 #include <QLocale>
33 #include <QMap>
34 #include <QMessageLogger>
35 #include <QString>
36 #include <QtDebug>
37 
38 #include "../ifc/ifcdef.h"
39 #include "../qmuparser/qmuparsererror.h"
40 #include "../qmuparser/qmutokenparser.h"
41 #include "../qmuparser/qmutranslation.h"
42 #include "../vpatterndb/vtranslatevars.h"
43 #include "../vmisc/def.h"
44 #include "../vmisc/vabstractapplication.h"
45 #include "vtranslatemeasurements.h"
46 #include "pmsystems.h"
47 
48 //---------------------------------------------------------------------------------------------------------------------
VTranslateVars()49 VTranslateVars::VTranslateVars()
50     :VTranslateMeasurements()
51 {
52     InitPatternMakingSystems();
53     InitVariables();
54     InitFunctions();
55 
56     PrepareFunctionTranslations();
57 }
58 
59 #define translate(context, source, disambiguation) qmu::QmuTranslation::translate((context), (source), (disambiguation))
60 
61 //---------------------------------------------------------------------------------------------------------------------
InitPatternMakingSystems()62 void VTranslateVars::InitPatternMakingSystems()
63 {
64     //Note. We can't use here function and variables because lupdate tool doesn't see string in variables and doesn't
65     //mark such string to translation.
66     qmu::QmuTranslation name;
67     qmu::QmuTranslation author;
68     qmu::QmuTranslation book;
69 
70     //=================================================================================================================
71     name = translate("VTranslateVars", "Bunka", "System name");
72     author = translate("VTranslateVars", "Bunka Fashion College", "Author name");
73     book = translate("VTranslateVars", "Fundamentals of Garment Design", "Book name");
74     InitSystem(p0_S, name, author, book);
75     //=================================================================================================================
76     name = translate("VTranslateVars", "Barnfield and Richard", "System name");
77     author = translate("VTranslateVars", "Jo Barnfield and Andrew Richards", "Author name");
78     book = translate("VTranslateVars", "Pattern Making Primer", "Book name");
79     InitSystem(p1_S, name, author, book);
80     //=================================================================================================================
81     name = translate("VTranslateVars", "Friendship/Women", "System name");
82     author = translate("VTranslateVars", "Elizabeth Friendship", "Author name");
83     book = translate("VTranslateVars",
84                      "Creating Historical Clothes - Pattern Cutting from the 16th to the 19th Centuries", "Book name");
85     InitSystem(p2_S, name, author, book);
86     //=================================================================================================================
87     name = translate("VTranslateVars", "Morris, K.", "System name");
88     author = translate("VTranslateVars", "Karen Morris", "Author name");
89     book = translate("VTranslateVars", "Sewing Lingerie that Fits", "Book name");
90     InitSystem(p3_S, name, author, book);
91     //=================================================================================================================
92     name = translate("VTranslateVars", "Castro", "System name");
93     author = translate("VTranslateVars", "Lucia Mors de Castro", "Author name");
94     book = translate("VTranslateVars", "Patternmaking in Practic", "Book name");
95     InitSystem(p4_S, name, author, book);
96     //=================================================================================================================
97     name = translate("VTranslateVars", "Kim & Uh", "System name");
98     author = translate("VTranslateVars", "Injoo Kim and Mykyung Uh", "Author name");
99     book = translate("VTranslateVars", "Apparel Making in Fashion Design", "Book name");
100     InitSystem(p5_S, name, author, book);
101     //=================================================================================================================
102     name = translate("VTranslateVars", "Waugh", "System name");
103     author = translate("VTranslateVars", "Norah Waugh", "Author name");
104     book = translate("VTranslateVars", "Corsets and Crinolines", "Book name");
105     InitSystem(p6_S, name, author, book);
106     //=================================================================================================================
107     name = translate("VTranslateVars", "Grimble", "System name");
108     author = translate("VTranslateVars", "Frances Grimble", "Author name");
109     book = translate("VTranslateVars", "Fashions of the Gilded Age", "Book name");
110     InitSystem(p7_S, name, author, book);
111     //=================================================================================================================
112     name = translate("VTranslateVars", "Thornton's International System", "System name");
113     author = translate("VTranslateVars", "ed. R. L. Shep", "Author name");
114     book = translate("VTranslateVars", "The Great War: Styles and Patterns of the 1910s", "Book name");
115     InitSystem(p8_S, name, author, book);
116     //=================================================================================================================
117     name = translate("VTranslateVars", "Hillhouse & Mansfield", "System name");
118     author = translate("VTranslateVars", "Marion S. Hillhouse and Evelyn A. Mansfield", "Author name");
119     book = translate("VTranslateVars", "Dress Design: Draping and Flat Pattern Making", "Book name");
120     InitSystem(p9_S, name, author, book);
121     //=================================================================================================================
122     name = translate("VTranslateVars", "Pivnick", "System name");
123     author = translate("VTranslateVars", "Esther Kaplan Pivnick", "Author name");
124     book = translate("VTranslateVars", "How to Design Beautiful Clothes: Designing and Pattern Making", "Book name");
125     InitSystem(p10_S, name, author, book);
126     //=================================================================================================================
127     name = translate("VTranslateVars", "Minister & Son", "System name");
128     author = translate("VTranslateVars", "Edward Minister & Son, ed. R. L. Shep", "Author name");
129     book = translate("VTranslateVars", "The Complete Guide to Practical Cutting (1853)", "Book name");
130     InitSystem(p11_S, name, author, book);
131     //=================================================================================================================
132     name = translate("VTranslateVars", "Strickland", "System name");
133     author = translate("VTranslateVars", "Gertrude Strickland", "Author name");
134     book = translate("VTranslateVars", "A Tailoring Manual", "Book name");
135     InitSystem(p12_S, name, author, book);
136     //=================================================================================================================
137     name = translate("VTranslateVars", "Loh & Lewis", "System name");
138     author = translate("VTranslateVars", "May Loh and Diehl Lewis", "Author name");
139     book = translate("VTranslateVars", "Patternless Fashion Design", "Book name");
140     InitSystem(p13_S, name, author, book);
141     //=================================================================================================================
142     name = translate("VTranslateVars", "Morris, F. R.", "System name");
143     author = translate("VTranslateVars", "F. R. Morris", "Author name");
144     book = translate("VTranslateVars", "Ladies Garment Cutting and Making", "Book name");
145     InitSystem(p14_S, name, author, book);
146     //=================================================================================================================
147     name = translate("VTranslateVars", "Mason", "System name");
148     author = translate("VTranslateVars", "Gertrude Mason", "Author name");
149     book = translate("VTranslateVars", "Gertrude Mason's Patternmaking Book", "Book name");
150     InitSystem(p15_S, name, author, book);
151     //=================================================================================================================
152     name = translate("VTranslateVars", "Kimata", "System name");
153     author = translate("VTranslateVars", "K. Kimata", "Author name");
154     book = translate("VTranslateVars", "K.Kimata's Simplified Drafting Book for Dressmaking", "Book name");
155     InitSystem(p16_S, name, author, book);
156     //=================================================================================================================
157     name = translate("VTranslateVars", "Master Designer", "System name");
158     author = translate("VTranslateVars", "The Master Designer (Chicago, IL)", "Author name");
159     book = translate("VTranslateVars", "Master Designer's System of Designing, Cutting and Grading", "Book name");
160     InitSystem(p17_S, name, author, book);
161     //=================================================================================================================
162     name = translate("VTranslateVars", "Kopp", "System name");
163     author = translate("VTranslateVars", "Ernestine Kopp, Vittorina Rolfo, Beatrice Zelin, Lee Gross", "Author name");
164     book = translate("VTranslateVars", "How to Draft Basic Patterns", "Book name");
165     InitSystem(p18_S, name, author, book);
166     //=================================================================================================================
167     name = translate("VTranslateVars", "Ekern", "System name");
168     author = translate("VTranslateVars", "Doris Ekern", "Author name");
169     book = translate("VTranslateVars", "Slacks Cut-to-Fit for Your Figure", "Book name");
170     InitSystem(p19_S, name, author, book);
171     //=================================================================================================================
172     name = translate("VTranslateVars", "Doyle", "System name");
173     author = translate("VTranslateVars", "Sarah J. Doyle", "Author name");
174     book = translate("VTranslateVars", "Sarah's Key to Pattern Drafting", "Book name");
175     InitSystem(p20_S, name, author, book);
176     //=================================================================================================================
177     name = translate("VTranslateVars", "Shelton", "System name");
178     author = translate("VTranslateVars", "Karla J. Shelton", "Author name");
179     book = translate("VTranslateVars", "Design and Sew Jeans", "Book name");
180     InitSystem(p21_S, name, author, book);
181     //=================================================================================================================
182     name = translate("VTranslateVars", "Lady Boutique", "System name");
183     author = translate("VTranslateVars", "Lady Boutique", "Author name");
184     book = translate("VTranslateVars", "Lady Boutique magazine (Japan)", "Book name");
185     InitSystem(p22_S, name, author, book);
186     //=================================================================================================================
187     name = translate("VTranslateVars", "Rohr", "System name");
188     author = translate("VTranslateVars", "M. Rohr", "Author name");
189     book = translate("VTranslateVars", "Pattern Drafting and Grading: Women's nd Misses' Garment Design", "Book name");
190     InitSystem(p23_S, name, author, book);
191     //=================================================================================================================
192     name = translate("VTranslateVars", "Moore", "System name");
193     author = translate("VTranslateVars", "Dorothy Moore", "Author name");
194     book = translate("VTranslateVars", "Dorothy Moore's Pattern Drafting and Dressmaking", "Book name");
195     InitSystem(p24_S, name, author, book);
196     //=================================================================================================================
197     name = translate("VTranslateVars", "Abling", "System name");
198     author = translate("VTranslateVars", "Bina Abling", "Author name");
199     book = translate("VTranslateVars", "Integrating Draping, Drafting and Drawing", "Book name");
200     InitSystem(p25_S, name, author, book);
201     //=================================================================================================================
202     name = translate("VTranslateVars", "Fukomoto", "System name");
203     author = translate("VTranslateVars", "Sue S. Fukomoto", "Author name");
204     book = translate("VTranslateVars", "Scientific Pattern Drafting as taught at Style Center School of Costume "
205                      "Design, Dressmaking and Millinery", "Book name");
206     InitSystem(p26_S, name, author, book);
207     //=================================================================================================================
208     name = translate("VTranslateVars", "Dressmaking International", "System name");
209     author = translate("VTranslateVars", "Dressmaking International", "Author name");
210     book = translate("VTranslateVars", "Dressmaking International magazine (Japan)", "Book name");
211     InitSystem(p27_S, name, author, book);
212     //=================================================================================================================
213     name = translate("VTranslateVars", "Erwin", "System name");
214     author = translate("VTranslateVars", "Mabel D. Erwin", "Author name");
215     book = translate("VTranslateVars", "Practical Dress Design", "Book name");
216     InitSystem(p28_S, name, author, book);
217     //=================================================================================================================
218     name = translate("VTranslateVars", "Gough", "System name");
219     author = translate("VTranslateVars", "E. L. G. Gough", "Author name");
220     book = translate("VTranslateVars", "Principles of Garment Cutting", "Book name");
221     InitSystem(p29_S, name, author, book);
222     //=================================================================================================================
223     name = translate("VTranslateVars", "Allemong", "System name");
224     author = translate("VTranslateVars", "Elizabeth M. Allemong", "Author name");
225     book = translate("VTranslateVars", "European Cut", "Book name");
226     InitSystem(p30_S, name, author, book);
227     //=================================================================================================================
228     name = translate("VTranslateVars", "McCunn", "System name");
229     author = translate("VTranslateVars", "Donald H. McCunn", "Author name");
230     book = translate("VTranslateVars", "How to Make Your Own Sewing Patterns", "Book name");
231     InitSystem(p31_S, name, author, book);
232     //=================================================================================================================
233     name = translate("VTranslateVars", "Zarapkar", "System name");
234     author = translate("VTranslateVars", "Shri K. R. Zarapkar and Shri Arvind K. Zarapkar", "Author name");
235     book = translate("VTranslateVars", "Zarapkar System of Cutting", "Book name");
236     InitSystem(p32_S, name, author, book);
237     //=================================================================================================================
238     name = translate("VTranslateVars", "Kunick", "System name");
239     author = translate("VTranslateVars", "Philip Kunick", "Author name");
240     book = translate("VTranslateVars", "Sizing, Pattern Construction and Grading for Women's and Children's Garments",
241                      "Book name");
242     InitSystem(p33_S, name, author, book);
243     //=================================================================================================================
244     name = translate("VTranslateVars", "Handford", "System name");
245     author = translate("VTranslateVars", "Jack Handford", "Author name");
246     book = translate("VTranslateVars", "Professional Patternmaking for Designers: Women's Wear, Men's Casual Wear",
247                      "Book name");
248     InitSystem(p34_S, name, author, book);
249     //=================================================================================================================
250     name = translate("VTranslateVars", "Davis", "System name");
251     author = translate("VTranslateVars", "R. I. Davis", "Author name");
252     book = translate("VTranslateVars", "Men's 17th & 18th Century Costume, Cut & Fashion", "Book name");
253     InitSystem(p35_S, name, author, book);
254     //=================================================================================================================
255     name = translate("VTranslateVars", "MacLochlainn", "System name");
256     author = translate("VTranslateVars", "Jason MacLochlainn", "Author name");
257     book = translate("VTranslateVars", "The Victorian Tailor: An Introduction to Period Tailoring", "Book name");
258     InitSystem(p36_S, name, author, book);
259     //=================================================================================================================
260     name = translate("VTranslateVars", "Joseph-Armstrong", "System name");
261     author = translate("VTranslateVars", "Helen Joseph-Armstrong", "Author name");
262     book = translate("VTranslateVars", "Patternmaking for Fashion Design", "Book name");
263     InitSystem(p37_S, name, author, book);
264     //=================================================================================================================
265     name = translate("VTranslateVars", "Supreme System", "System name");
266     author = translate("VTranslateVars", "Frederick T. Croonberg", "Author name");
267     book = translate("VTranslateVars", "The Blue Book of Men's Tailoring, Grand Edition of Supreme System for "
268                      "Producing Mens Garments (1907)", "Book name");
269     InitSystem(p38_S, name, author, book);
270     //=================================================================================================================
271     name = translate("VTranslateVars", "Sugino", "System name");
272     author = translate("VTranslateVars", "Dressmaking", "Author name");
273     book = translate("VTranslateVars", "Pattern Drafting Vols. I, II, III (Japan)", "Book name");
274     InitSystem(p39_S, name, author, book);
275     //=================================================================================================================
276     name = translate("VTranslateVars", "Centre Point System", "System name");
277     author = translate("VTranslateVars", "Louis Devere", "Author name");
278     book = translate("VTranslateVars", "The Handbook of Practical Cutting on the Centre Point System", "Book name");
279     InitSystem(p40_S, name, author, book);
280     //=================================================================================================================
281     name = translate("VTranslateVars", "Aldrich/Men", "System name");
282     author = translate("VTranslateVars", "Winifred Aldrich", "Author name");
283     book = translate("VTranslateVars", "Metric Pattern Cutting for Menswear", "Book name");
284     InitSystem(p41_S, name, author, book);
285     //=================================================================================================================
286     name = translate("VTranslateVars", "Aldrich/Women", "System name");
287     author = translate("VTranslateVars", "Winifred Aldrich", "Author name");
288     book = translate("VTranslateVars", "Metric Pattern Cutting for Women's Wear", "Book name");
289     InitSystem(p42_S, name, author, book);
290     //=================================================================================================================
291     name = translate("VTranslateVars", "Kershaw", "System name");
292     author = translate("VTranslateVars", "Gareth Kershaw", "Author name");
293     book = translate("VTranslateVars", "Patternmaking for Menswear", "Book name");
294     InitSystem(p43_S, name, author, book);
295     //=================================================================================================================
296     name = translate("VTranslateVars", "Gilewska", "System name");
297     author = translate("VTranslateVars", "Teresa Gilewska", "Author name");
298     book = translate("VTranslateVars", "Pattern-Drafting for Fashion: The Basics", "Book name");
299     InitSystem(p44_S, name, author, book);
300     //=================================================================================================================
301     name = translate("VTranslateVars", "Lo", "System name");
302     author = translate("VTranslateVars", "Dennic Chunman Lo", "Author name");
303     book = translate("VTranslateVars", "Pattern Cutting", "Book name");
304     InitSystem(p45_S, name, author, book);
305     //=================================================================================================================
306     name = translate("VTranslateVars", "Bray", "System name");
307     author = translate("VTranslateVars", "Natalie Bray", "Author name");
308     book = translate("VTranslateVars", "Dress Pattern Designing: The Basic Principles of Cut and Fit", "Book name");
309     InitSystem(p46_S, name, author, book);
310     //=================================================================================================================
311     name = translate("VTranslateVars", "Knowles/Men", "System name");
312     author = translate("VTranslateVars", "Lori A. Knowles", "Author name");
313     book = translate("VTranslateVars", "The Practical Guide to Patternmaking for Fashion Designers: Menswear",
314                      "Book name");
315     InitSystem(p47_S, name, author, book);
316     //=================================================================================================================
317     name = translate("VTranslateVars", "Friendship/Men", "System name");
318     author = translate("VTranslateVars", "Elizabeth Friendship", "Author name");
319     book = translate("VTranslateVars", "Pattern Cutting for Men's Costume", "Book name");
320     InitSystem(p48_S, name, author, book);
321     //=================================================================================================================
322     name = translate("VTranslateVars", "Brown", "System name");
323     author = translate("VTranslateVars", "P. Clement Brown", "Author name");
324     book = translate("VTranslateVars", "Art in Dress", "Book name");
325     InitSystem(p49_S, name, author, book);
326     //=================================================================================================================
327     name = translate("VTranslateVars", "Mitchell", "System name");
328     author = translate("VTranslateVars", "Jno. J. Mitchell", "Author name");
329     book = translate("VTranslateVars", "\"Standard\" Work on Cutting (Men's Garments) 1886: The Art and Science of "
330                      "Garment Cutting", "Book name");
331     InitSystem(p50_S, name, author, book);
332     //=================================================================================================================
333     name = translate("VTranslateVars", "GOST 17917-86", "System name");
334     author = translate("VTranslateVars", "Ministry of consumer industry of the USSR", "Author name");
335     book = translate("VTranslateVars", "Standard figure boys", "Book name");
336     InitSystem(p51_S, name, author, book);
337     //=================================================================================================================
338     name = translate("VTranslateVars", "Eddy", "System name");
339     author = translate("VTranslateVars", "Josephine F. Eddy and Elizabeth C. B. Wiley", "Author name");
340     book = translate("VTranslateVars", "Pattern and Dress Design", "Book name");
341     InitSystem(p52_S, name, author, book);
342     //=================================================================================================================
343     name = translate("VTranslateVars", "Knowles/Women", "System name");
344     author = translate("VTranslateVars", "Lori A. Knowles", "Author name");
345     book = translate("VTranslateVars", "Practical Guide to Patternmaking for Fashion Designers: Juniors, Misses, and "
346                      "Women", "Book name");
347     InitSystem(p53_S, name, author, book);
348     //=================================================================================================================
349     name = translate("VTranslateVars", "American Garment Cutter", "System name");
350     author = translate("VTranslateVars", "ed. R. L. Shep", "Author name");
351     book = translate("VTranslateVars", "The Great War: Styles and Patterns of the 1910s", "Book name");
352     InitSystem(p54_S, name, author, book);
353     //=================================================================================================================
354     name = translate("VTranslateVars", "None", "System name");
355     author = translate("VTranslateVars", "Valentina team", "Author name");
356     book = translate("VTranslateVars", "Valentina's internal standard", "Book name");
357     InitSystem(p998_S, name, author, book);
358     //=================================================================================================================
359 }
360 
361 //---------------------------------------------------------------------------------------------------------------------
InitVariables()362 void VTranslateVars::InitVariables()
363 {
364     variables.insert(measurement_, translate("VTranslateVars", "M_", "Left symbol _ in the name"));
365     variables.insert(increment_, translate("VTranslateVars", "Increment_", "Left symbol _ in the name"));
366     variables.insert(line_, translate("VTranslateVars", "Line_", "Left symbol _ in the name"));
367     variables.insert(angleLine_, translate("VTranslateVars", "AngleLine_", "Left symbol _ in the name"));
368     variables.insert(arc_, translate("VTranslateVars", "Arc_", "Left symbol _ in the name"));
369     variables.insert(elarc_, translate("VTranslateVars", "ElArc_", "Left symbol _ in the name"));
370     variables.insert(spl_, translate("VTranslateVars", "Spl_", "Left symbol _ in the name"));
371     variables.insert(splPath, translate("VTranslateVars", "SplPath", "Do not add symbol _ to the end of the name"));
372     variables.insert(radiusArc_, translate("VTranslateVars", "RadiusArc_", "Left symbol _ in the name"));
373     variables.insert(radius1ElArc_, translate("VTranslateVars", "Radius1ElArc_", "Left symbol _ in the name"));
374     variables.insert(radius2ElArc_, translate("VTranslateVars", "Radius2ElArc_", "Left symbol _ in the name"));
375     variables.insert(angle1Arc_, translate("VTranslateVars", "Angle1Arc_", "Left symbol _ in the name"));
376     variables.insert(angle2Arc_, translate("VTranslateVars", "Angle2Arc_", "Left symbol _ in the name"));
377     variables.insert(angle1ElArc_, translate("VTranslateVars", "Angle1ElArc_", "Left symbol _ in the name"));
378     variables.insert(angle2ElArc_, translate("VTranslateVars", "Angle2ElArc_", "Left symbol _ in the name"));
379     variables.insert(angle1Spl_, translate("VTranslateVars", "Angle1Spl_", "Left symbol _ in the name"));
380     variables.insert(angle2Spl_, translate("VTranslateVars", "Angle2Spl_", "Left symbol _ in the name"));
381     variables.insert(angle1SplPath, translate("VTranslateVars", "Angle1SplPath",
382                                               "Do not add symbol _ to the end of the name"));
383     variables.insert(angle2SplPath, translate("VTranslateVars", "Angle2SplPath",
384                                               "Do not add symbol _ to the end of the name"));
385     variables.insert(seg_, translate("VTranslateVars", "Seg_", "Segment. Left symbol _ in the name"));
386     variables.insert(currentLength, translate("VTranslateVars", "CurrentLength", "Do not add space between words"));
387     variables.insert(currentSeamAllowance, translate("VTranslateVars", "CurrentSeamAllowance",
388                                                      "Do not add space between words"));
389     variables.insert(c1LengthSpl_, translate("VTranslateVars", "C1LengthSpl_", "Left symbol _ in the name"));
390     variables.insert(c2LengthSpl_, translate("VTranslateVars", "C2LengthSpl_", "Left symbol _ in the name"));
391     variables.insert(c1LengthSplPath, translate("VTranslateVars", "C1LengthSplPath",
392                                                 "Do not add symbol _ to the end of the name"));
393     variables.insert(c2LengthSplPath, translate("VTranslateVars", "C2LengthSplPath",
394                                                 "Do not add symbol _ to the end of the name"));
395     variables.insert(rotationElArc_, translate("VTranslateVars", "RotationElArc_", "Left symbol _ in the name"));
396 }
397 
398 //---------------------------------------------------------------------------------------------------------------------
InitFunctions()399 void VTranslateVars::InitFunctions()
400 {
401     functions.insert(degTorad_F, translate("VTranslateVars", "degTorad", "converts degrees to radian"));
402     functionsDescriptions.insert(degTorad_F, translate("VTranslateVars", "converts degrees to radian",
403                                                       "functionm degTorad"));
404 
405     functions.insert(radTodeg_F, translate("VTranslateVars", "radTodeg", "converts radian to degrees"));
406     functionsDescriptions.insert(radTodeg_F, translate("VTranslateVars", "converts radian to degrees",
407                                                       "function radTodeg"));
408 
409     functions.insert(sin_F, translate("VTranslateVars", "sin", "sine function working with radians"));
410     functionsDescriptions.insert(sin_F, translate("VTranslateVars", "sine function working with radians",
411                                                  "function sin"));
412 
413     functions.insert(cos_F, translate("VTranslateVars", "cos", "cosine function working with radians"));
414     functionsDescriptions.insert(cos_F, translate("VTranslateVars", "cosine function working with radians",
415                                                  "function cos"));
416 
417     functions.insert(tan_F, translate("VTranslateVars", "tan", "tangens function working with radians"));
418     functionsDescriptions.insert(tan_F, translate("VTranslateVars", "tangens function working with radians",
419                                                  "function tan"));
420 
421     functions.insert(asin_F, translate("VTranslateVars", "asin", "arcus sine function working with radians"));
422     functionsDescriptions.insert(asin_F, translate("VTranslateVars", "arcus sine function working with radians",
423                                                   "function asin"));
424 
425     functions.insert(acos_F, translate("VTranslateVars", "acos", "arcus cosine function working with radians"));
426     functionsDescriptions.insert(acos_F, translate("VTranslateVars", "arcus cosine function working with radians",
427                                                   "function acos"));
428 
429     functions.insert(atan_F, translate("VTranslateVars", "atan", "arcus tangens function working with radians"));
430     functionsDescriptions.insert(atan_F, translate("VTranslateVars", "arcus tangens function working with radians",
431                                                   "function atan"));
432 
433     functions.insert(sinh_F, translate("VTranslateVars", "sinh", "hyperbolic sine function"));
434     functionsDescriptions.insert(sinh_F, translate("VTranslateVars", "hyperbolic sine function", "function sinh"));
435 
436     functions.insert(cosh_F, translate("VTranslateVars", "cosh", "hyperbolic cosine"));
437     functionsDescriptions.insert(cosh_F, translate("VTranslateVars", "hyperbolic cosine", "function cosh"));
438 
439     functions.insert(tanh_F, translate("VTranslateVars", "tanh", "hyperbolic tangens function"));
440     functionsDescriptions.insert(tanh_F, translate("VTranslateVars", "hyperbolic tangens function", "function tanh"));
441 
442     functions.insert(asinh_F, translate("VTranslateVars", "asinh", "hyperbolic arcus sine function"));
443     functionsDescriptions.insert(asinh_F, translate("VTranslateVars", "hyperbolic arcus sine function",
444                                                    "function asinh"));
445 
446     functions.insert(acosh_F, translate("VTranslateVars", "acosh", "hyperbolic arcus cosine function"));
447     functionsDescriptions.insert(acosh_F, translate("VTranslateVars", "hyperbolic arcus cosine function",
448                                                    "function acosh"));
449 
450     functions.insert(atanh_F, translate("VTranslateVars", "atanh", "hyperbolic arcur tangens function"));
451     functionsDescriptions.insert(atanh_F, translate("VTranslateVars", "hyperbolic arcur tangens function",
452                                                    "function atanh"));
453 
454     functions.insert(sinD_F, translate("VTranslateVars", "sinD", "sine function working with degrees"));
455     functionsDescriptions.insert(sinD_F, translate("VTranslateVars", "sine function working with degrees",
456                                                   "function sinD"));
457 
458     functions.insert(cosD_F, translate("VTranslateVars", "cosD", "cosine function working with degrees"));
459     functionsDescriptions.insert(cosD_F, translate("VTranslateVars", "cosine function working with degrees",
460                                                   "function cosD"));
461 
462     functions.insert(tanD_F, translate("VTranslateVars", "tanD", "tangens function working with degrees"));
463     functionsDescriptions.insert(tanD_F, translate("VTranslateVars", "tangens function working with degrees",
464                                                   "function tanD"));
465 
466     functions.insert(asinD_F, translate("VTranslateVars", "asinD", "arcus sine function working with degrees"));
467     functionsDescriptions.insert(asinD_F, translate("VTranslateVars", "arcus sine function working with degrees",
468                                                    "function asinD"));
469 
470     functions.insert(acosD_F, translate("VTranslateVars", "acosD", "arcus cosine function working with degrees"));
471     functionsDescriptions.insert(acosD_F, translate("VTranslateVars", "arcus cosine function working with degrees",
472                                                    "function acosD"));
473 
474     functions.insert(atanD_F, translate("VTranslateVars", "atanD", "arcus tangens function working with degrees"));
475     functionsDescriptions.insert(atanD_F, translate("VTranslateVars", "arcus tangens function working with degrees",
476                                                    "function atanD"));
477 
478     functions.insert(log2_F, translate("VTranslateVars", "log2", "logarithm to the base 2"));
479     functionsDescriptions.insert(log2_F, translate("VTranslateVars", "logarithm to the base 2",  "function log2"));
480 
481     functions.insert(log10_F, translate("VTranslateVars", "log10", "logarithm to the base 10"));
482     functionsDescriptions.insert(log10_F, translate("VTranslateVars", "logarithm to the base 10", "function log10"));
483 
484     functions.insert(log_F, translate("VTranslateVars", "log", "logarithm to the base 10"));
485     functionsDescriptions.insert(log_F, translate("VTranslateVars", "logarithm to the base 10", "function log"));
486 
487     functions.insert(ln_F, translate("VTranslateVars", "ln", "logarithm to base e (2.71828...)"));
488     functionsDescriptions.insert(ln_F, translate("VTranslateVars", "logarithm to base e (2.71828...)", "function ln"));
489 
490     functions.insert(exp_F, translate("VTranslateVars", "exp", "e raised to the power of x"));
491     functionsDescriptions.insert(exp_F, translate("VTranslateVars", "e raised to the power of x", "function exp"));
492 
493     functions.insert(sqrt_F, translate("VTranslateVars", "sqrt", "square root of a value"));
494     functionsDescriptions.insert(sqrt_F, translate("VTranslateVars", "square root of a value", "function sqrt"));
495 
496     functions.insert(sign_F, translate("VTranslateVars", "sign", "sign function -1 if x<0; 1 if x>0"));
497     functionsDescriptions.insert(sign_F, translate("VTranslateVars", "sign function -1 if x<0; 1 if x>0",
498                                                   "function sign"));
499 
500     functions.insert(rint_F, translate("VTranslateVars", "rint", "round to nearest integer"));
501     functionsDescriptions.insert(rint_F, translate("VTranslateVars", "round to nearest integer", "function rint"));
502 
503     functions.insert(r2cm_F, translate("VTranslateVars", "r2cm", "round to up to 1 decimal"));
504     functionsDescriptions.insert(r2cm_F, translate("VTranslateVars", "round to up to 1 decimal", "function r2cm"));
505 
506     functions.insert(csrCm_F, translate("VTranslateVars", "csrCm", "cut, split and rotate modeling operation. Takes"
507                                                                    " cm units."));
508     functionsDescriptions.insert(csrCm_F, translate("VTranslateVars", "cut, split and rotate modeling operation. Takes "
509                                                                      "cm units.", "function csrCm"));
510 
511     functions.insert(csrInch_F, translate("VTranslateVars", "csrInch", "cut, split and rotate modeling operation. Takes"
512                                                                        " inch units."));
513     functionsDescriptions.insert(csrInch_F, translate("VTranslateVars", "cut, split and rotate modeling operation. Takes"
514                                                                        " inch units.", "function csrInch"));
515 
516     functions.insert(abs_F, translate("VTranslateVars", "abs", "absolute value"));
517     functionsDescriptions.insert(abs_F, translate("VTranslateVars", "absolute value", "function abs"));
518 
519     functions.insert(min_F, translate("VTranslateVars", "min", "min of all arguments"));
520     functionsDescriptions.insert(min_F, translate("VTranslateVars", "min of all arguments", "function min"));
521 
522     functions.insert(max_F, translate("VTranslateVars", "max", "max of all arguments"));
523     functionsDescriptions.insert(max_F, translate("VTranslateVars", "max of all arguments", "function max"));
524 
525     functions.insert(sum_F, translate("VTranslateVars", "sum", "sum of all arguments"));
526     functionsDescriptions.insert(sum_F, translate("VTranslateVars", "sum of all arguments", "function sum"));
527 
528     functions.insert(avg_F, translate("VTranslateVars", "avg", "mean value of all arguments"));
529     functionsDescriptions.insert(avg_F, translate("VTranslateVars", "mean value of all arguments", "function avg"));
530 
531     functions.insert(fmod_F, translate("VTranslateVars", "fmod",
532                                        "Returns the floating-point remainder of numer/denom (rounded towards zero)"));
533     functionsDescriptions.insert(fmod_F, translate("VTranslateVars", "Returns the floating-point remainder of "
534                                                                     "numer/denom (rounded towards zero)",
535                                                   "function fmod"));
536     functions.insert(warning_F, translate("VTranslateVars", "warning", "Calculation warning"));
537     functionsDescriptions.insert(warning_F, translate("VTranslateVars", "Show a warning in calculations",
538                                                       "function warning"));
539 }
540 
541 #undef translate
542 
543 //---------------------------------------------------------------------------------------------------------------------
PrepareFunctionTranslations()544 void VTranslateVars::PrepareFunctionTranslations()
545 {
546     translatedFunctions.clear();
547     QMap<QString, qmu::QmuTranslation>::const_iterator i = functions.constBegin();
548     while (i != functions.constEnd())
549     {
550         const QString translated = i.value().translate(VAbstractApplication::VApp()->Settings()->GetLocale());
551         if (i.key() != translated)
552         {
553             translatedFunctions.insert(translated, i.key());
554         }
555         ++i;
556     }
557 }
558 
559 //---------------------------------------------------------------------------------------------------------------------
InitSystem(const QString & code,const qmu::QmuTranslation & name,const qmu::QmuTranslation & author,const qmu::QmuTranslation & book)560 void VTranslateVars::InitSystem(const QString &code, const qmu::QmuTranslation &name, const qmu::QmuTranslation &author,
561                                 const qmu::QmuTranslation &book)
562 {
563     PMSystemNames.insert(code, name);
564     PMSystemAuthors.insert(code, author);
565     PMSystemBooks.insert(code, book);
566 }
567 
568 //---------------------------------------------------------------------------------------------------------------------
569 /**
570  * @brief CorrectionsPositions correct position tokens in expression after token translation.
571  *
572  * Because translated string can have different length compare to original need make correction after each translation.
573  * If bias = 0 correction will not happens.
574  *
575  * @param position position currecnt token in expression
576  * @param bias difference between original token length and translated
577  * @param tokens all tokens
578  * @param numbers all numbers
579  */
CorrectionsPositions(int position,int bias,QMap<int,QString> & tokens,QMap<int,QString> & numbers) const580 void VTranslateVars::CorrectionsPositions(int position, int bias, QMap<int, QString> &tokens,
581                                           QMap<int, QString> &numbers) const
582 {
583     if (bias == 0)
584     {
585         return;// Nothing to correct;
586     }
587 
588     BiasTokens(position, bias, tokens);
589     BiasTokens(position, bias, numbers);
590 }
591 
592 //---------------------------------------------------------------------------------------------------------------------
593 /**
594  * @brief BiasTokens change position for each token that have position more then "position".
595  * @param position token position
596  * @param bias difference between original token length and translated
597  * @param tokens all tokens
598  */
BiasTokens(int position,int bias,QMap<int,QString> & tokens)599 void VTranslateVars::BiasTokens(int position, int bias, QMap<int, QString> &tokens)
600 {
601     QMap<int, QString> newTokens;
602     QMap<int, QString>::const_iterator i = tokens.constBegin();
603     while (i != tokens.constEnd())
604     {
605         if (i.key()<= position)
606         { // Tokens before position "position" did not change his positions.
607             newTokens.insert(i.key(), i.value());
608         }
609         else
610         {
611             newTokens.insert(i.key()-bias, i.value());
612         }
613         ++i;
614     }
615     tokens = newTokens;
616 }
617 
618 
619 
620 //---------------------------------------------------------------------------------------------------------------------
621 /**
622  * @brief VariablesFromUser translate variable to internal look.
623  * @param newFormula [in|out] expression to translate
624  * @param position token position
625  * @param token token to translate
626  * @param bias hold change of length between translated and origin token string
627  * @return true if was found variable with same name.
628  */
VariablesFromUser(QString & newFormula,int position,const QString & token,int & bias) const629 bool VTranslateVars::VariablesFromUser(QString &newFormula, int position, const QString &token, int &bias) const
630 {
631     const QString currentLengthTr =
632             variables.value(currentLength).translate(VAbstractApplication::VApp()->Settings()->GetLocale());
633     const QString currentSeamAllowanceTr = variables.value(currentSeamAllowance)
634             .translate(VAbstractApplication::VApp()->Settings()->GetLocale());
635 
636     QMap<QString, qmu::QmuTranslation>::const_iterator i = variables.constBegin();
637     while (i != variables.constEnd())
638     {
639         const qmu::QmuTranslation &var = i.value();
640         const QString varTr = var.translate(VAbstractApplication::VApp()->Settings()->GetLocale());
641 
642         if (token.indexOf(varTr) == 0)
643         {
644             if ((varTr == currentLengthTr || varTr == currentSeamAllowanceTr) && token != varTr)
645             {
646                 ++i;
647                 continue;
648             }
649 
650             newFormula.replace(position, varTr.length(), i.key());
651             QString newToken = token;
652             newToken.replace(0, varTr.length(), i.key());
653             bias = token.length() - newToken.length();
654             return true;
655         }
656         ++i;
657     }
658     return false;
659 }
660 
661 //---------------------------------------------------------------------------------------------------------------------
662 /**
663  * @brief FunctionsFromUser translate function name to internal look.
664  * @param newFormula [in|out] expression to translate
665  * @param position token position
666  * @param token token to translate
667  * @param bias hold change of length between translated and origin token string
668  * @return true if was found function with same name.
669  */
FunctionsFromUser(QString & newFormula,int position,const QString & token,int & bias) const670 bool VTranslateVars::FunctionsFromUser(QString &newFormula, int position, const QString &token, int &bias) const
671 {
672     QMap<QString, qmu::QmuTranslation>::const_iterator i = functions.constBegin();
673     while (i != functions.constEnd())
674     {
675         if (token == i.value().translate(VAbstractApplication::VApp()->Settings()->GetLocale()))
676         {
677             newFormula.replace(position, token.length(), i.key());
678             bias = token.length() - i.key().length();
679             return true;
680         }
681         ++i;
682     }
683     return false;
684 }
685 
686 //---------------------------------------------------------------------------------------------------------------------
687 /**
688  * @brief VariablesToUser translate variable name to user.
689  * @param newFormula [in|out] expression to translate
690  * @param position token position
691  * @param token token to translate
692  * @param bias hold change of length between translated and origin token string
693  * @return true if was found variable with same name.
694  */
VariablesToUser(QString & newFormula,int position,const QString & token,int & bias) const695 bool VTranslateVars::VariablesToUser(QString &newFormula, int position, const QString &token, int &bias) const
696 {
697     QMap<QString, qmu::QmuTranslation>::const_iterator i = variables.constBegin();
698     while (i != variables.constEnd())
699     {
700         if (token.indexOf( i.key() ) == 0)
701         {
702             if ((i.key() == currentLength || i.key() == currentSeamAllowance) && token != i.key())
703             {
704                 ++i;
705                 continue;
706             }
707 
708             newFormula.replace(position, i.key().length(),
709                                i.value().translate(VAbstractApplication::VApp()->Settings()->GetLocale()));
710 
711             QString newToken = token;
712             newToken.replace(0, i.key().length(),
713                              i.value().translate(VAbstractApplication::VApp()->Settings()->GetLocale()));
714             bias = token.length() - newToken.length();
715             return true;
716         }
717         ++i;
718     }
719     return false;
720 }
721 
722 //---------------------------------------------------------------------------------------------------------------------
InternalVarToUser(const QString & var) const723 QString VTranslateVars::InternalVarToUser(const QString &var) const
724 {
725     QString newVar = var;
726     int bias = 0;
727     if (VariablesToUser(newVar, 0, var, bias))
728     {
729         return newVar;
730     }
731     else
732     {
733         return var;
734     }
735 }
736 
737 //---------------------------------------------------------------------------------------------------------------------
VarToUser(const QString & var) const738 QString VTranslateVars::VarToUser(const QString &var) const
739 {
740     if (VAbstractApplication::VApp()->Settings()->GetLocale() == QStringLiteral("zh_CN"))
741     {
742         return var; // We do not support translation of variables for Chinese
743     }
744 
745     if (measurements.contains(var))
746     {
747         return measurements.value(var).translate(VAbstractApplication::VApp()->Settings()->GetLocale());
748     }
749 
750     if (functions.contains(var))
751     {
752         return functions.value(var).translate(VAbstractApplication::VApp()->Settings()->GetLocale());
753     }
754 
755     return InternalVarToUser(var);
756 }
757 
758 //---------------------------------------------------------------------------------------------------------------------
VarFromUser(const QString & var) const759 QString VTranslateVars::VarFromUser(const QString &var) const
760 {
761     if (VAbstractApplication::VApp()->Settings()->GetLocale() == QStringLiteral("zh_CN"))
762     {
763         return var; // We do not support translation of variables for Chinese
764     }
765 
766     QString newVar = var;
767     int bias = 0;
768     if (MeasurementsFromUser(newVar, 0, var, bias))
769     {
770         return newVar;
771     }
772 
773     if (VariablesFromUser(newVar, 0, var, bias))
774     {
775         return newVar;
776     }
777 
778     if (FunctionsFromUser(newVar, 0, var, bias))
779     {
780         return newVar;
781     }
782     return newVar;
783 }
784 
785 //---------------------------------------------------------------------------------------------------------------------
PMSystemName(const QString & code) const786 QString VTranslateVars::PMSystemName(const QString &code) const
787 {
788     return PMSystemNames.value(code).translate(VAbstractApplication::VApp()->Settings()->GetLocale());
789 }
790 
791 //---------------------------------------------------------------------------------------------------------------------
PMSystemAuthor(const QString & code) const792 QString VTranslateVars::PMSystemAuthor(const QString &code) const
793 {
794     return PMSystemAuthors.value(code).translate(VAbstractApplication::VApp()->Settings()->GetLocale());
795 }
796 
797 //---------------------------------------------------------------------------------------------------------------------
PMSystemBook(const QString & code) const798 QString VTranslateVars::PMSystemBook(const QString &code) const
799 {
800     return PMSystemBooks.value(code).translate(VAbstractApplication::VApp()->Settings()->GetLocale());
801 }
802 
803 //---------------------------------------------------------------------------------------------------------------------
804 /**
805  * @brief FormulaFromUser replace all known tokens in formula to internal look. Also change decimal
806  * separator in numbers.
807  * @param formula expression that need translate
808  * @throw qmu::QmuParserError in case of a wrong expression
809  * @return translated expression
810  */
FormulaFromUser(const QString & formula,bool osSeparator) const811 QString VTranslateVars::FormulaFromUser(const QString &formula, bool osSeparator) const
812 {
813     if (formula.isEmpty())
814     {
815         return formula;
816     }
817     QString newFormula = formula;// Local copy for making changes
818 
819     // Eval formula
820     QScopedPointer<qmu::QmuTokenParser> cal(new qmu::QmuTokenParser(formula, osSeparator, true, GetTranslatedFunctions()));
821     QMap<int, QString> tokens = cal->GetTokens();// Tokens (variables, measurements)
822     QMap<int, QString> numbers = cal->GetNumbers();// All numbers in expression for changing decimal separator
823     delete cal.take();
824 
825     QList<int> tKeys = tokens.keys();// Take all tokens positions
826     QList<QString> tValues = tokens.values();
827     for (int i = 0; i < tKeys.size(); ++i)
828     {
829         int bias = 0;
830         if (MeasurementsFromUser(newFormula, tKeys.at(i), tValues.at(i), bias))
831         {
832             if (bias != 0)
833             {// Translated token has different length than original. Position next tokens need to be corrected.
834                 CorrectionsPositions(tKeys.at(i), bias, tokens, numbers);
835                 tKeys = tokens.keys();
836                 tValues = tokens.values();
837             }
838             continue;
839         }
840 
841         if (VariablesFromUser(newFormula, tKeys.at(i), tValues.at(i), bias))
842         {
843             if (bias != 0)
844             {// Translated token has different length than original. Position next tokens need to be corrected.
845                 CorrectionsPositions(tKeys.at(i), bias, tokens, numbers);
846                 tKeys = tokens.keys();
847                 tValues = tokens.values();
848             }
849             continue;
850         }
851 
852         if (FunctionsFromUser(newFormula, tKeys.at(i), tValues.at(i), bias))
853         {
854             if (bias != 0)
855             {// Translated token has different length than original. Position next tokens need to be corrected.
856                 CorrectionsPositions(tKeys.at(i), bias, tokens, numbers);
857                 tKeys = tokens.keys();
858                 tValues = tokens.values();
859             }
860             continue;
861         }
862 
863         if (tValues.at(i) == QLocale().negativeSign())
864         {// unary minus
865             newFormula.replace(tKeys.at(i), 1, '-');
866         }
867     }
868 
869     QLocale loc = QLocale(); // User locale
870     if (loc != QLocale::c() && osSeparator)
871     {// User want use Os separator
872         QList<int> nKeys = numbers.keys();// Positions for all numbers in expression
873         QList<QString> nValues = numbers.values();
874         for (int i = 0; i < nKeys.size(); ++i)
875         {
876             loc = QLocale();// From system locale
877             bool ok = false;
878             const qreal d = loc.toDouble(nValues.at(i), &ok);
879             if (ok == false)
880             {
881                 qDebug()<<"Can't convert to double token"<<nValues.at(i);
882                 continue;//Leave with out translation
883             }
884 
885             loc = QLocale::c();// To internal locale
886             const QString dStr = loc.toString(d);// Internal look for number
887             newFormula.replace(nKeys.at(i), nValues.at(i).length(), dStr);
888             const int bias = nValues.at(i).length() - dStr.length();
889             if (bias != 0)
890             {// Translated number has different length than original. Position next tokens need to be corrected.
891                 CorrectionsPositions(nKeys.at(i), bias, tokens, numbers);
892                 nKeys = numbers.keys();
893                 nValues = numbers.values();
894             }
895         }
896     }
897 
898     return newFormula;
899 }
900 
901 //---------------------------------------------------------------------------------------------------------------------
TryFormulaFromUser(const QString & formula,bool osSeparator)902 QString VTranslateVars::TryFormulaFromUser(const QString &formula, bool osSeparator)
903 {
904     try
905     {
906         SCASSERT(VAbstractApplication::VApp()->TrVars() != nullptr)
907         return VAbstractApplication::VApp()->TrVars()->FormulaFromUser(formula, osSeparator);
908     }
909     catch (qmu::QmuParserError &e)// In case something bad will happen
910     {
911         Q_UNUSED(e)
912         return formula;
913     }
914 }
915 
916 //---------------------------------------------------------------------------------------------------------------------
917 /**
918  * @brief FormulaToUser replace all known tokens in formula to user look. Also change decimal
919  * separator in numbers.
920  * @param formula expression that need translate
921  * @return translated expression
922  */
FormulaToUser(const QString & formula,bool osSeparator) const923 QString VTranslateVars::FormulaToUser(const QString &formula, bool osSeparator) const
924 {
925     if (formula.isEmpty())
926     {
927         return formula;
928     }
929 
930     QString newFormula = formula;// Local copy for making changes
931 
932     QMap<int, QString> tokens;
933     QMap<int, QString> numbers;
934     try
935     {
936         QScopedPointer<qmu::QmuTokenParser> cal(new qmu::QmuTokenParser(formula, false, false));// Eval formula
937         tokens = cal->GetTokens();// Tokens (variables, measurements)
938         numbers = cal->GetNumbers();// All numbers in expression for changing decimal separator
939     }
940     catch (qmu::QmuParserError &e)
941     {
942         qDebug() << "\nMath parser error:\n"
943                  << "--------------------------------------\n"
944                  << "Message:     " << e.GetMsg()  << "\n"
945                  << "Expression:  " << e.GetExpr() << "\n"
946                  << "--------------------------------------";
947         return newFormula;
948     }
949 
950     QList<int> tKeys = tokens.keys();
951     QList<QString> tValues = tokens.values();
952     for (int i = 0; i < tKeys.size(); ++i)
953     {
954         if (measurements.contains(tValues.at(i)))
955         {
956             newFormula.replace(tKeys.at(i), tValues.at(i).length(),
957                                measurements.value(tValues.at(i))
958                                .translate(VAbstractApplication::VApp()->Settings()->GetLocale()));
959             int bias = tValues.at(i).length() - measurements.value(tValues.at(i))
960                     .translate(VAbstractApplication::VApp()->Settings()->GetLocale()).length();
961             if (bias != 0)
962             {// Translated token has different length than original. Position next tokens need to be corrected.
963                 CorrectionsPositions(tKeys.at(i), bias, tokens, numbers);
964                 tKeys = tokens.keys();
965                 tValues = tokens.values();
966             }
967             continue;
968         }
969 
970         if (functions.contains(tValues.at(i)))
971         {
972             newFormula.replace(tKeys.at(i), tValues.at(i).length(),
973                                functions.value(tValues.at(i))
974                                .translate(VAbstractApplication::VApp()->Settings()->GetLocale()));
975             int bias = tValues.at(i).length() - functions.value(tValues.at(i))
976                     .translate(VAbstractApplication::VApp()->Settings()->GetLocale()).length();
977             if (bias != 0)
978             {// Translated token has different length than original. Position next tokens need to be corrected.
979                 CorrectionsPositions(tKeys.at(i), bias, tokens, numbers);
980                 tKeys = tokens.keys();
981                 tValues = tokens.values();
982             }
983             continue;
984         }
985 
986         int bias = 0;
987         if (VariablesToUser(newFormula, tKeys.at(i), tValues.at(i), bias))
988         {
989             if (bias != 0)
990             {// Translated token has different length than original. Position next tokens need to be corrected.
991                 CorrectionsPositions(tKeys.at(i), bias, tokens, numbers);
992                 tKeys = tokens.keys();
993                 tValues = tokens.values();
994             }
995             continue;
996         }
997 
998         if (tValues.at(i) == QChar('-'))
999         {// unary minus
1000             newFormula.replace(tKeys.at(i), 1, QLocale().negativeSign());
1001         }
1002     }
1003 
1004     QLocale loc = QLocale();// User locale
1005     if (loc != QLocale::C && osSeparator)
1006     {// User want use Os separator
1007         QList<int> nKeys = numbers.keys();// Positions for all numbers in expression
1008         QList<QString> nValues = numbers.values();
1009         for (int i = 0; i < nKeys.size(); ++i)
1010         {
1011             loc = QLocale::c();// From pattern locale
1012             bool ok = false;
1013             const qreal d = loc.toDouble(nValues.at(i), &ok);
1014             if (ok == false)
1015             {
1016                 qDebug()<<"Can't convert to double token"<<nValues.at(i);
1017                 continue;//Leave with out translation
1018             }
1019 
1020             loc = QLocale();// To user locale
1021             QString dStr = loc.toString(d);// Number string in user locale
1022             if (loc.groupSeparator().isSpace())
1023             {
1024                 dStr.replace(loc.groupSeparator(), QString());
1025             }
1026             newFormula.replace(nKeys.at(i), nValues.at(i).length(), dStr);
1027             const int bias = nValues.at(i).length() - dStr.length();
1028             if (bias != 0)
1029             {// Translated number has different length than original. Position next tokens need to be corrected.
1030                 CorrectionsPositions(nKeys.at(i), bias, tokens, numbers);
1031                 nKeys = numbers.keys();
1032                 nValues = numbers.values();
1033             }
1034         }
1035     }
1036 
1037     return newFormula;
1038 }
1039 
1040 //---------------------------------------------------------------------------------------------------------------------
TryFormulaToUser(const QString & formula,bool osSeparator)1041 QString VTranslateVars::TryFormulaToUser(const QString &formula, bool osSeparator)
1042 {
1043     try
1044     {
1045         return VAbstractApplication::VApp()->TrVars()->FormulaToUser(formula, osSeparator);
1046     }
1047     catch (qmu::QmuParserError &e)// In case something bad will happen
1048     {
1049         Q_UNUSED(e)
1050         return formula;
1051     }
1052 }
1053 
1054 //---------------------------------------------------------------------------------------------------------------------
Retranslate()1055 void VTranslateVars::Retranslate()
1056 {
1057     VTranslateMeasurements::Retranslate();
1058 
1059     PMSystemNames.clear();
1060     PMSystemAuthors.clear();
1061     PMSystemBooks.clear();
1062     variables.clear();
1063     functions.clear();
1064     functionsDescriptions.clear();
1065     stDescriptions.clear();
1066 
1067     InitPatternMakingSystems();
1068     InitVariables();
1069     InitFunctions();
1070 
1071     PrepareFunctionTranslations();
1072 }
1073 
1074 //---------------------------------------------------------------------------------------------------------------------
GetTranslatedFunctions() const1075 QMap<QString, QString> VTranslateVars::GetTranslatedFunctions() const
1076 {
1077     return translatedFunctions;
1078 }
1079 
1080 //---------------------------------------------------------------------------------------------------------------------
GetFunctions() const1081 QMap<QString, qmu::QmuTranslation> VTranslateVars::GetFunctions() const
1082 {
1083     return functions;
1084 }
1085 
1086 //---------------------------------------------------------------------------------------------------------------------
GetFunctionsDescriptions() const1087 QMap<QString, qmu::QmuTranslation> VTranslateVars::GetFunctionsDescriptions() const
1088 {
1089     return functionsDescriptions;
1090 }
1091