Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
CaseDocumentLangTranslator.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* CaseDocumentLangTranslator.cc (C) 2000-2022 */
9/* */
10/* Classe gérant la traduction d'un jeu de données dans une autre langue. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/Collection.h"
15#include "arcane/utils/Enumerator.h"
16#include "arcane/utils/OStringStream.h"
17#include "arcane/utils/ArgumentException.h"
18#include "arcane/utils/ScopedPtr.h"
19
20#include "arcane/impl/CaseDocumentLangTranslator.h"
21
22#include "arcane/AbstractCaseDocumentVisitor.h"
23#include "arcane/CaseOptions.h"
24#include "arcane/CaseOptionService.h"
25#include "arcane/ICaseMng.h"
26#include "arcane/ICaseDocument.h"
27#include "arcane/CaseNodeNames.h"
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32namespace Arcane
33{
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37
40, public TraceAccessor
41{
42 public:
45 {
46 m_new_lang = new_lang;
47 }
48 public:
49 void beginVisit(const ICaseOptions* opt) override
50 {
51 info() << "BeginOpt " << _getName(opt) << " {";
52 }
53 void endVisit(const ICaseOptions* opt) override
54 {
55 info() << "EndOptList " << opt->rootTagName() << " }";
56 }
57 void applyVisitor(const CaseOptionSimple* opt) override
58 {
59 info() << "SimpleOpt " << _getName(opt);
60 }
61 void applyVisitor(const CaseOptionMultiSimple* opt) override
62 {
63 info() << "MultiSimple " << _getName(opt);
64 }
65 void applyVisitor(const CaseOptionMultiExtended* opt) override
66 {
67 info() << "MultiExtended " << _getName(opt);
68 }
69 void applyVisitor(const CaseOptionExtended* opt) override
70 {
71 info() << "Extended " << _getName(opt);
72 }
73 void applyVisitor(const CaseOptionMultiEnum* opt) override
74 {
75 info() << "MultiEnum " << _getName(opt);
76 info() << "WARNING: MultiEnum not handled in translator";
77 }
78 void applyVisitor(const CaseOptionEnum* opt) override
79 {
80 info() << "Enum " << _getName(opt);
81 _manageEnum(opt);
82 }
83 void beginVisit(const CaseOptionServiceImpl* opt) override
84 {
85 info() << "BeginService " << _getName(opt);
86 }
87 void endVisit(const CaseOptionServiceImpl* opt) override
88 {
89 info() << "EndService " << _getName(opt);
90 }
91 void beginVisit(const CaseOptionMultiServiceImpl* opt,Integer index) override
92 {
93 info() << "BeginMultiService " << _getName(opt) << " index=" << index;
94 }
95 void endVisit(const CaseOptionMultiServiceImpl* opt,Integer index) override
96 {
97 info() << "EndMultiService " << _getName(opt) << " index=" << index;
98 }
99 String _getName(const CaseOptionBase* opt)
100 {
101 String full_xpath = opt->rootElement().xpathFullName();
102 String name = opt->name();
103 String new_name = opt->translatedName(m_new_lang);
104
105 if (name!=new_name)
106 m_stream() << full_xpath << "/" << name << ":" << new_name << '\n';
107 return name;
108 }
109 String _getName(const ICaseOptions* opt)
110 {
111 String full_xpath = opt->configList()->rootElement().xpathFullName();
112 String name = opt->rootTagName();
113 String new_name = opt->translatedName(m_new_lang);
114
115 if (name!=new_name)
116 m_stream() << full_xpath << ":" << new_name << '\n';
117 return name;
118 }
119 void _manageEnum(const CaseOptionEnum* opt)
120 {
121 // Rien à convertir si aucune élément associé à l'option
122 // ou si valeur invalide.
123 if (!opt->isPresent())
124 return;
125 if (!opt->hasValidValue())
126 return;
127
128 int v = opt->enumValueAsInt();
129 String new_name = opt->enumValues()->nameOfValue(v,m_new_lang);
130 m_stream() << opt->xpathFullName() << ":text#" << new_name << '\n';
131 }
132 public:
133 void printAll()
134 {
135 info() << "ALL: " << m_stream.str();
136 }
137 public:
138 String convertString() { return m_stream.str(); }
139 private:
140 OStringStream m_stream;
141 String m_new_lang;
142};
143
144/*---------------------------------------------------------------------------*/
145/*---------------------------------------------------------------------------*/
146
147CaseDocumentLangTranslator::
148CaseDocumentLangTranslator(ITraceMng* tm)
150{
151}
152
153/*---------------------------------------------------------------------------*/
154/*---------------------------------------------------------------------------*/
155
156CaseDocumentLangTranslator::
157~CaseDocumentLangTranslator()
158{
159}
160
161/*---------------------------------------------------------------------------*/
162/*---------------------------------------------------------------------------*/
163
164void CaseDocumentLangTranslator::
165build()
166{
167}
168
169/*---------------------------------------------------------------------------*/
170/*---------------------------------------------------------------------------*/
171
172String CaseDocumentLangTranslator::
173translate(ICaseMng* cm,const String& new_lang)
174{
175 if (new_lang.null())
176 throw ArgumentException(A_FUNCINFO,"Invalid value for langage");
177 CaseDocumentLangTranslatorVisitor my_visitor(traceMng(),new_lang);
178 CaseOptionsCollection opts = cm->blocks();
179 for( CaseOptionsCollection::Enumerator i(opts); ++i; ){
180 ICaseOptions* o = *i;
181 info() << " OptName=" << o->rootTagName();
182 o->visit(&my_visitor);
183 }
184 my_visitor.printAll();
185
186 ICaseDocument* cd = cm->caseDocument();
187 CaseNodeNames* current_cnn = cd->caseNodeNames();
188 ScopedPtrT<CaseNodeNames> cnn { new CaseNodeNames(new_lang) };
189
190 // NOTE: Ces conversions dépendent de CaseDocument et doivent être
191 // mise à jour si ce dernier change (ainsi que CaseNodeNames)
192
193 _addConvert(cd->fragment()->rootElement(),cnn->root);
194 _addConvert(cd->timeloopElement(),cnn->timeloop);
195 _addConvert(cd->titleElement(),cnn->title);
196 _addConvert(cd->descriptionElement(),cnn->description);
197 _addConvert(cd->modulesElement(),cnn->modules);
198
199 String slash = "/";
200 const XmlNodeList& mesh_elems = cd->meshElements();
201 for( Integer i=0, n=mesh_elems.size(); i<n; ++i ){
202 XmlNode xnode(mesh_elems.node(i));
203 _addConvert(xnode,cnn->mesh);
204 _addConvert(xnode.child(current_cnn->mesh_file),cnn->mesh_file);
205 }
206
207 _addConvert(cd->functionsElement(),cnn->functions);
208
209 // TODO: Gerer TiedInterface + CaseFunctions + Attributs suivants:
210 // TODO: Utiliser le format JSON pour sortir les informations
211 // de conversion.
212
213 /*m_user_class = m_root_elem.attrValue(cnn->user_class);
214 m_code_name = m_root_elem.attrValue(cnn->code_name);
215 m_code_version = m_root_elem.attrValue(cnn->code_version);
216 m_code_unit_system = m_root_elem.attrValue(cnn->code_unit);*/
217
218 return my_visitor.convertString() + m_global_convert_string;
219}
220
221/*---------------------------------------------------------------------------*/
222/*---------------------------------------------------------------------------*/
223
224void CaseDocumentLangTranslator::
225_addConvert(XmlNode node,const String& new_name)
226{
227 if (!node.null())
228 m_global_convert_string = m_global_convert_string + node.xpathFullName() + ":" + new_name + "\n";
229}
230
231/*---------------------------------------------------------------------------*/
232/*---------------------------------------------------------------------------*/
233
234} // End namespace Arcane
235
236/*---------------------------------------------------------------------------*/
237/*---------------------------------------------------------------------------*/
Visiteur abstrait pour une donnée scalaire.
Classe de base d'une option du jeu de donnée.
Option du jeu de donnée de type énumération.
Option du jeu de données de type étendu.
Option du jeu de données de type liste d'énumération.
Option du jeu de donnée de type liste de types étendus.
Classe de base d'une option service pouvant être présente plusieurs fois.
Classe de base de l'implémentation des options utilisant des services.
Classe de base des options simples (uniquement une valeur).
EnumeratorT< ICaseOptions * > Enumerator
Type d'un itérateur sur toute la collection.
Definition Collection.h:129
Interface d'une liste d'options du jeu de données.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Flot de sortie lié à une String.
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessage info() const
Flot pour un message d'information.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Collection< ICaseOptions * > CaseOptionsCollection
Collection d'options du jeu de données.