• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdesdk API Reference
  • KDE Home
  • Contact Us
 

lokalize

  • sources
  • kde-4.14
  • kdesdk
  • lokalize
  • src
  • catalog
  • xliff
xliffstorage.cpp
Go to the documentation of this file.
1 /*
2 Copyright 2008-2009 Nick Shaforostoff <shaforostoff@kde.ru>
3 
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License as
6 published by the Free Software Foundation; either version 2 of
7 the License or (at your option) version 3 or any later version
8 accepted by the membership of KDE e.V. (or its successor approved
9 by the membership of KDE e.V.), which shall act as a proxy
10 defined in Section 14 of version 3 of the license.
11 
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20 
21 #include "xliffstorage.h"
22 
23 #include "gettextheader.h"
24 #include "project.h"
25 #include "version.h"
26 #include "prefs_lokalize.h"
27 
28 #include <QProcess>
29 #include <QString>
30 #include <QMap>
31 #include <QDomDocument>
32 #include <QTime>
33 #include <QPair>
34 #include <QList>
35 
36 
37 #include <kdebug.h>
38 #include <kglobal.h>
39 #include <klocale.h>
40 #include <kdatetime.h>
41 #include <QXmlSimpleReader>
42 
43 static const QString noyes[]={"no","yes"};
44 static const QString bintargettarget[]={"bin-target","target"};
45 static const QString binsourcesource[]={"bin-source","source"};
46 
47 XliffStorage::XliffStorage()
48  : CatalogStorage()
49 {
50 }
51 
52 XliffStorage::~XliffStorage()
53 {
54 }
55 
56 int XliffStorage::capabilities() const
57 {
58  return KeepsNoteAuthors|MultipleNotes|Phases|ExtendedStates|Tags;
59 }
60 
61 //BEGIN OPEN/SAVE
62 
63 int XliffStorage::load(QIODevice* device)
64 {
65  QTime chrono;chrono.start();
66 
67 
68  QXmlSimpleReader reader;
69  reader.setFeature("http://qtsoftware.com/xml/features/report-whitespace-only-CharData",true);
70  reader.setFeature("http://xml.org/sax/features/namespaces",false);
71  QXmlInputSource source(device);
72 
73  QString errorMsg;
74  int errorLine;//+errorColumn;
75  bool success=m_doc.setContent(&source, &reader, &errorMsg, &errorLine/*,errorColumn*/);
76 
77  if (!success)
78  {
79  kWarning()<<errorMsg;
80  return errorLine+1;
81  }
82 
83 
84  QDomElement file=m_doc.elementsByTagName("file").at(0).toElement();
85  m_sourceLangCode=file.attribute("source-language");
86  m_targetLangCode=file.attribute("target-language");
87  m_numberOfPluralForms=numberOfPluralFormsForLangCode(m_targetLangCode);
88 
89  //Create entry mapping.
90  //Along the way: for langs with more than 2 forms
91  //we create any form-entries additionally needed
92 
93  entries=m_doc.elementsByTagName("trans-unit");
94  int size=entries.size();
95  m_map.clear();
96  m_map.reserve(size);
97  for(int i=0;i<size;++i)
98  {
99  QDomElement parentElement=entries.at(i).parentNode().toElement();
100  //if (KDE_ISUNLIKELY( e.isNull() ))//sanity
101  // continue;
102  m_map<<i;
103  m_unitsById[entries.at(i).toElement().attribute("id")]=i;
104 
105  if (parentElement.tagName()=="group" && parentElement.attribute("restype")=="x-gettext-plurals")
106  {
107  m_plurals.insert(i);
108  int localPluralNum=m_numberOfPluralForms;
109  while (--localPluralNum>0 && (++i)<size)
110  {
111  QDomElement p=entries.at(i).parentNode().toElement();
112  if (p.tagName()=="group" && p.attribute("restype")=="x-gettext-plurals")
113  continue;
114 
115  parentElement.appendChild(entries.at(m_map.last()).cloneNode());
116  }
117  }
118  }
119 
120  binEntries=m_doc.elementsByTagName("bin-unit");
121  size=binEntries.size();
122  int offset=m_map.size();
123  for(int i=0;i<size;++i)
124  m_unitsById[binEntries.at(i).toElement().attribute("id")]=offset+i;
125 
126 // entries=m_doc.elementsByTagName("body");
127 // uint i=0;
128 // uint lim=size();
129 // while (i<lim)
130 // {
131 // CatalogItem& item=m_entries[i];
132 // if (item.isPlural()
133 // && item.msgstrPlural().count()<m_numberOfPluralForms
134 // )
135 // {
136 // QVector<QString> msgstr(item.msgstrPlural());
137 // while (msgstr.count()<m_numberOfPluralForms)
138 // msgstr.append(QString());
139 // item.setMsgstr(msgstr);
140 //
141 // }
142 // ++i;
143 //
144 // }
145 
146 
147  QDomElement header=file.firstChildElement("header");
148  if (header.isNull())
149  header=file.insertBefore(m_doc.createElement("header"), QDomElement()).toElement();
150  QDomElement toolElem=header.firstChildElement("tool");
151  while (!toolElem.isNull() && toolElem.attribute("tool-id")!="lokalize-" LOKALIZE_VERSION)
152  toolElem=toolElem.nextSiblingElement("tool");
153 
154  if (toolElem.isNull())
155  {
156  toolElem=header.appendChild(m_doc.createElement("tool")).toElement();
157  toolElem.setAttribute("tool-id","lokalize-" LOKALIZE_VERSION);
158  toolElem.setAttribute("tool-name","Lokalize");
159  toolElem.setAttribute("tool-version",LOKALIZE_VERSION);
160  }
161 
162  kWarning()<<chrono.elapsed();
163  return 0;
164 }
165 
166 bool XliffStorage::save(QIODevice* device, bool belongsToProject)
167 {
168  QTextStream stream(device);
169  m_doc.save(stream,2);
170  return true;
171 }
172 //END OPEN/SAVE
173 
174 //BEGIN STORAGE TRANSLATION
175 
176 int XliffStorage::size() const
177 {
178  return m_map.size();
179 }
180 
181 
182 
183 
187 struct ContentEditingData
188 {
189  enum ActionType{Get,DeleteText,InsertText,DeleteTag,InsertTag,CheckLength};
190 
191  QList<InlineTag> tags;
192  QString stringToInsert;
193  int pos;
194  int lengthOfStringToRemove;
195  ActionType actionType;
196 
198  ContentEditingData(ActionType type=Get)
199  : pos(-1)
200  , lengthOfStringToRemove(-1)
201  , actionType(type)
202  {}
203 
205  ContentEditingData(int p, int l)
206  : pos(p)
207  , lengthOfStringToRemove(l)
208  , actionType(DeleteText)
209  {}
210 
212  ContentEditingData(int p,const QString& s)
213  : stringToInsert(s)
214  , pos(p)
215  , lengthOfStringToRemove(-1)
216  , actionType(InsertText)
217  {}
218 
220  ContentEditingData(int p,const InlineTag& range)
221  : pos(p)
222  , lengthOfStringToRemove(-1)
223  , actionType(InsertTag)
224  {
225  tags.append(range);
226  }
227 
229  ContentEditingData(int p)
230  : pos(p)
231  , lengthOfStringToRemove(-1)
232  , actionType(DeleteTag)
233  {}
234 
235 };
236 
237 static QString doContent(QDomElement elem, int startingPos, ContentEditingData* data);
238 
245 static QString content(QDomElement elem, ContentEditingData* data=0)
246 {
247  return doContent(elem, 0, data);
248 }
249 
250 static QString doContent(QDomElement elem, int startingPos, ContentEditingData* data)
251 {
252  //actually startingPos is current pos
253 
254  QString result;
255 
256  if (elem.isNull()
257  || (!result.isEmpty() && ContentEditingData::CheckLength))
258  return QString();
259 
260  bool seenCharacterDataAfterElement=false;
261 
262  QDomNode n = elem.firstChild();
263  while (!n.isNull())
264  {
265  if (n.isCharacterData())
266  {
267  seenCharacterDataAfterElement=true;
268 
269  QDomCharacterData c=n.toCharacterData();
270  QString cData=c.data();
271 
272  if (data && data->pos!=-1 &&
273  data->pos>=startingPos && data->pos<=startingPos+cData.size())
274  {
275  // time to do some action! ;)
276  int localStartPos=data->pos-startingPos;
277 
278  //BEGIN DELETE TEXT
279  if (data->actionType==ContentEditingData::DeleteText) //(data->lengthOfStringToRemove!=-1)
280  {
281  if (localStartPos+data->lengthOfStringToRemove>cData.size())
282  {
283  //text is fragmented into several QDomCharacterData
284  int localDelLen=cData.size()-localStartPos;
285  //qWarning()<<"text is fragmented into several QDomCharacterData. localDelLen:"<<localDelLen<<"cData:"<<cData;
286  c.deleteData(localStartPos,localDelLen);
287  //setup data for future iterations
288  data->lengthOfStringToRemove=data->lengthOfStringToRemove-localDelLen;
289  //data->pos=startingPos;
290  //qWarning()<<"\tsetup:"<<data->pos<<data->lengthOfStringToRemove;
291  }
292  else
293  {
294  //qWarning()<<"simple delete"<<localStartPos<<data->lengthOfStringToRemove;
295  c.deleteData(localStartPos,data->lengthOfStringToRemove);
296  data->actionType=ContentEditingData::CheckLength;
297  return QString('a');//so it exits 100%
298  }
299  }
300  //END DELETE TEXT
301  //INSERT
302  else if (data->actionType==ContentEditingData::InsertText)
303  {
304  c.insertData(localStartPos,data->stringToInsert);
305  data->actionType=ContentEditingData::CheckLength;
306  return QString('a');//so it exits 100%
307  }
308  //BEGIN INSERT TAG
309  else if (data->actionType==ContentEditingData::InsertTag)
310  {
311  const InlineTag& tag=data->tags.first();
312  QString mid=cData.mid(localStartPos);
313  qWarning()<<"inserting tag"<<tag.name()<<tag.id<<tag.start<<tag.end<<mid<<data->pos<<startingPos;
314  if (mid.size())
315  c.deleteData(localStartPos,mid.size());
316  QDomElement newNode=elem.insertAfter( elem.ownerDocument().createElement(tag.getElementName()),n).toElement();
317  newNode.setAttribute("id",tag.id);
318  if (!tag.xid.isEmpty())
319  newNode.setAttribute("xid",tag.xid);
320 
321  if (tag.isPaired()&&tag.end>(tag.start+1))
322  {
323  //qWarning()<<"isPaired";
324  int len=tag.end-tag.start-1;//-image symbol
325  int localLen=qMin(len,mid.size());
326  if (localLen)//appending text
327  {
328  //qWarning()<<"localLen. appending"<<localLen<<mid.left(localLen);
329  newNode.appendChild( elem.ownerDocument().createTextNode(mid.left(localLen)) );
330  mid=mid.mid(localLen);
331  }
332  if (len-localLen) //need to eat more (strings or elements) into newNode
333  {
334  int missingLen=len-localLen;
335  //qWarning()<<"len-localLen";
336  //iterate over siblings until we get childrenCumulativeLen>missingLen (or siblings end)
337  int childrenCumulativeLen=0;
338  QDomNode sibling=newNode.nextSibling();
339  while(!sibling.isNull())//&&(childrenCumulativeLen<missingLen))
340  {
341  QDomNode tmp=sibling;
342  sibling=sibling.nextSibling();
343  if (tmp.isAttr())
344  continue;
345  ContentEditingData subData(ContentEditingData::Get);
346  if (tmp.isElement())
347  {
348  childrenCumulativeLen++;
349  childrenCumulativeLen+=InlineTag::isPaired(InlineTag::getElementType(tmp.toElement().tagName().toUtf8()));
350  kWarning()<<"calling sub";
351  QString subContent=doContent(tmp.toElement(),/*we don't care about position*/0,&subData);
352  kWarning()<<"called sub";
353  childrenCumulativeLen+=subContent.size();
354  }
355  else if (tmp.isCharacterData())
356  childrenCumulativeLen+=tmp.toCharacterData().data().size();
357  //qWarning()<<"brbr"<<tmp.nodeName()<<tmp.nodeValue()
358  //<<childrenCumulativeLen<<missingLen;
359 
360  if (childrenCumulativeLen>missingLen)
361  {
362  if (tmp.isCharacterData())
363  {
364  //divide the last string
365  const QString& endData=tmp.toCharacterData().data();
366  QString last=endData.left(endData.size()-(childrenCumulativeLen-missingLen));
367  newNode.appendChild( elem.ownerDocument().createTextNode(last));
368  tmp.toCharacterData().deleteData(0,last.size());
369  //qWarning()<<"end of add"<<last;
370  }
371  break;
372  }
373  newNode.appendChild( tmp );
374  }
375 
376  }
377  if (!newNode.lastChild().isCharacterData())
378  newNode.appendChild( elem.ownerDocument().createTextNode(QString()));
379  }
380  if (!mid.isEmpty())
381  elem.insertAfter( elem.ownerDocument().createTextNode(mid),newNode);
382  else if (!newNode.nextSibling().isCharacterData()) //keep our DOM in a nice state
383  elem.insertAfter( elem.ownerDocument().createTextNode(QString()),newNode);
384 
385  data->actionType=ContentEditingData::CheckLength;
386  return QString('a');//we're done here
387  }
388  //END INSERT TAG
389  cData=c.data();
390  }
391  //else
392  // if (data&&data->pos!=-1/*&& n.nextSibling().isNull()*/)
393  // kWarning()<<"arg!"<<startingPos<<"data->pos"<<data->pos;
394 
395  result += cData;
396  startingPos+=cData.size();
397  }
398  else if (n.isElement())
399  {
400  QDomElement el=n.toElement();
401  //BEGIN DELETE TAG
402  if (data&&data->actionType==ContentEditingData::DeleteTag
403  &&data->pos==startingPos)
404  {
405  //qWarning()<<"start deleting tag";
406  data->tags.append(InlineTag(startingPos, -1, InlineTag::getElementType(el.tagName().toUtf8()), el.attribute("id"), el.attribute("xid")));
407  if (data->tags.first().isPaired())
408  {
409  //get end position
410  ContentEditingData subData(ContentEditingData::Get);
411  QString subContent=doContent(el,startingPos,&subData);
412  data->tags[0].end=1+startingPos+subContent.size();//tagsymbol+text
413  //qWarning()<<"get end position"<<startingPos<<subContent.size();
414 
415  //move children upper
416  QDomNode local = n.firstChild();
417  QDomNode refNode=n;
418  while (!local.isNull())
419  {
420  QDomNode tmp=local;
421  local = local.nextSibling();
422  if (!tmp.isAttr())
423  {
424  //qWarning()<<"here is another child"<<tmp.nodeType()<<tmp.nodeName()<<tmp.nodeValue();
425  refNode=elem.insertAfter(tmp,refNode);
426  }
427  }
428 
429  }
430  QDomNode temp=n;
431  n=n.nextSibling();
432  elem.removeChild(temp);
433  data->actionType=ContentEditingData::CheckLength;
434  return QString('a');//we're done here
435  }
436  //END DELETE TAG
437 
438  if (!seenCharacterDataAfterElement) //add empty charData child so that user could add some text
439  elem.insertBefore( elem.ownerDocument().createTextNode(QString()),n);
440  seenCharacterDataAfterElement=false;
441 
442  if (data)
443  {result += QChar(TAGRANGE_IMAGE_SYMBOL); ++startingPos;}
444  int oldStartingPos=startingPos;
445 
446  //detect type of the tag
447  InlineTag::InlineElement i=InlineTag::getElementType(el.tagName().toUtf8());
448 
449  //1 or 2 images to represent it?
450  //2 = there may be content inside
451  if (InlineTag::isPaired(i))
452  {
453  QString recursiveContent=doContent(el,startingPos,data);
454  if (!recursiveContent.isEmpty())
455  result += recursiveContent; startingPos+=recursiveContent.size();
456  if (data)
457  {result += QChar(TAGRANGE_IMAGE_SYMBOL); ++startingPos;}
458  }
459 
460  if (data&&data->actionType==ContentEditingData::Get)
461  {
462  QString id=el.attribute("id");
463  if (i==InlineTag::mrk)//TODO attr map
464  id=el.attribute("mtype");
465 
466  //kWarning()<<"tagName"<<el.tagName()<<"id"<<id<<"start"<<oldStartingPos-1<<startingPos-1;
467  data->tags.append(InlineTag(oldStartingPos-1,startingPos-1,i,id,el.attribute("xid")));
468  }
469  }
470  n = n.nextSibling();
471  }
472  if (!seenCharacterDataAfterElement)
473  {
474  //add empty charData child so that user could add some text
475  elem.appendChild( elem.ownerDocument().createTextNode(QString()));
476  }
477 
478  return result;
479 }
480 
481 
482 
483 //flat-model interface (ignores XLIFF grouping)
484 
485 CatalogString XliffStorage::catalogString(QDomElement unit, DocPosition::Part part) const
486 {
487  static const QString names[]={"source","target"};
488  CatalogString catalogString;
489  ContentEditingData data(ContentEditingData::Get);
490  catalogString.string=content(unit.firstChildElement( names[part==DocPosition::Target]), &data );
491  catalogString.tags=data.tags;
492  return catalogString;
493 }
494 
495 CatalogString XliffStorage::catalogString(const DocPosition& pos) const
496 {
497  return catalogString(unitForPos(pos.entry), pos.part);
498 }
499 
500 CatalogString XliffStorage::targetWithTags(DocPosition pos) const
501 {
502  return catalogString(unitForPos(pos.entry), DocPosition::Target);
503 }
504 CatalogString XliffStorage::sourceWithTags(DocPosition pos) const
505 {
506  return catalogString(unitForPos(pos.entry), DocPosition::Source);
507 }
508 
509 static QString genericContent(QDomElement elem, bool nonbin)
510 {
511  return nonbin?content(elem):elem.firstChildElement("external-file").attribute("href");
512 }
513 QString XliffStorage::source(const DocPosition& pos) const
514 {
515  return genericContent(sourceForPos(pos.entry),pos.entry<size());
516 }
517 QString XliffStorage::target(const DocPosition& pos) const
518 {
519  return genericContent(targetForPos(pos.entry),pos.entry<size());
520 }
521 
522 
523 void XliffStorage::targetDelete(const DocPosition& pos, int count)
524 {
525  if (pos.entry<size())
526  {
527  ContentEditingData data(pos.offset,count);
528  content(targetForPos(pos.entry),&data);
529  }
530  else
531  {
532  //only bulk delete requests are generated
533  targetForPos(pos.entry).firstChildElement("external-file").setAttribute("href",QString());
534  }
535 }
536 
537 void XliffStorage::targetInsert(const DocPosition& pos, const QString& arg)
538 {
539  kWarning()<<pos.entry<<arg;
540  QDomElement targetEl=targetForPos(pos.entry);
541  //BEGIN add <*target>
542  if (targetEl.isNull())
543  {
544  QDomNode unitEl=unitForPos(pos.entry);
545  QDomNode refNode=unitEl.firstChildElement("seg-source");//obey standard
546  if (refNode.isNull()) refNode=unitEl.firstChildElement(binsourcesource[pos.entry<size()]);
547  targetEl = unitEl.insertAfter(m_doc.createElement(bintargettarget[pos.entry<size()]),refNode).toElement();
548  targetEl.setAttribute("state","new");
549 
550  if (pos.entry<size())
551  {
552  targetEl.appendChild(m_doc.createTextNode(arg));//i bet that pos.offset is 0 ;)
553  return;
554  }
555  }
556  //END add <*target>
557  if (arg.isEmpty()) return; //means we were called just to add <taget> tag
558 
559  if (pos.entry>=size())
560  {
561  QDomElement ef=targetEl.firstChildElement("external-file");
562  if (ef.isNull())
563  ef=targetEl.appendChild(m_doc.createElement("external-file")).toElement();
564  ef.setAttribute("href",arg);
565  return;
566  }
567 
568  ContentEditingData data(pos.offset,arg);
569  content(targetEl,&data);
570 }
571 
572 void XliffStorage::targetInsertTag(const DocPosition& pos, const InlineTag& tag)
573 {
574  targetInsert(pos,QString()); //adds <taget> if needed
575  ContentEditingData data(tag.start,tag);
576  content(targetForPos(pos.entry),&data);
577 }
578 
579 InlineTag XliffStorage::targetDeleteTag(const DocPosition& pos)
580 {
581  ContentEditingData data(pos.offset);
582  content(targetForPos(pos.entry),&data);
583  if (data.tags[0].end==-1) data.tags[0].end=data.tags[0].start;
584  return data.tags.first();
585 }
586 
587 void XliffStorage::setTarget(const DocPosition& pos, const QString& arg)
588 {
589  Q_UNUSED(pos);
590  Q_UNUSED(arg);
591 //TODO
592 }
593 
594 
595 QVector<AltTrans> XliffStorage::altTrans(const DocPosition& pos) const
596 {
597  QVector<AltTrans> result;
598 
599  QDomElement elem = unitForPos(pos.entry).firstChildElement("alt-trans");
600  while (!elem.isNull())
601  {
602  AltTrans aTrans;
603  aTrans.source=catalogString(elem, DocPosition::Source);
604  aTrans.target=catalogString(elem, DocPosition::Target);
605  aTrans.phase=elem.attribute("phase-name");
606  aTrans.origin=elem.attribute("origin");
607  aTrans.score=elem.attribute("match-quality").toInt();
608  aTrans.lang=elem.firstChildElement("target").attribute("xml:lang");
609 
610  const char* const types[]={
611  "proposal",
612  "previous-version",
613  "rejected",
614  "reference",
615  "accepted"
616  };
617  QString typeStr=elem.attribute("alttranstype");
618  int i=-1;
619  while (++i<int(sizeof(types)/sizeof(char*)) && types[i]!=typeStr)
620  ;
621  aTrans.type=AltTrans::Type(i);
622 
623  result<<aTrans;
624 
625  elem=elem.nextSiblingElement("alt-trans");
626  }
627  return result;
628 }
629 
630 static QDomElement phaseElement(QDomDocument m_doc, const QString& name, QDomElement& phasegroup)
631 {
632  QDomElement file=m_doc.elementsByTagName("file").at(0).toElement();
633  QDomElement header=file.firstChildElement("header");
634  phasegroup=header.firstChildElement("phase-group");
635  if (phasegroup.isNull())
636  {
637  phasegroup=m_doc.createElement("phase-group");
638  //order following XLIFF spec
639  QDomElement skl=header.firstChildElement("skl");
640  if (!skl.isNull())
641  header.insertAfter(phasegroup, skl);
642  else
643  header.insertBefore(phasegroup, header.firstChildElement());
644  }
645  QDomElement phaseElem=phasegroup.firstChildElement("phase");
646  while (!phaseElem.isNull() && phaseElem.attribute("phase-name")!=name)
647  phaseElem=phaseElem.nextSiblingElement("phase");
648 
649  return phaseElem;
650 }
651 
652 static Phase phaseFromElement(QDomElement phaseElem)
653 {
654  Phase phase;
655  phase.name =phaseElem.attribute("phase-name");
656  phase.process =phaseElem.attribute("process-name");
657  phase.company =phaseElem.attribute("company-name");
658  phase.contact =phaseElem.attribute("contact-name");
659  phase.email =phaseElem.attribute("contact-email");
660  phase.phone =phaseElem.attribute("contact-phone");
661  phase.tool =phaseElem.attribute("tool-id");
662  phase.date=QDate::fromString(phaseElem.attribute("date"),Qt::ISODate);
663  return phase;
664 }
665 
666 Phase XliffStorage::updatePhase(const Phase& phase)
667 {
668  QDomElement phasegroup;
669  QDomElement phaseElem=phaseElement(m_doc,phase.name,phasegroup);
670  Phase prev=phaseFromElement(phaseElem);
671 
672  if (phaseElem.isNull()&&!phase.name.isEmpty())
673  {
674  phaseElem=phasegroup.appendChild(m_doc.createElement("phase")).toElement();
675  phaseElem.setAttribute("phase-name",phase.name);
676  }
677 
678  phaseElem.setAttribute("process-name", phase.process);
679  if (!phase.company.isEmpty()) phaseElem.setAttribute("company-name", phase.company);
680  phaseElem.setAttribute("contact-name", phase.contact);
681  phaseElem.setAttribute("contact-email",phase.email);
682  if (!phase.phone.isEmpty()) phaseElem.setAttribute("contact-phone",phase.phone);
683  phaseElem.setAttribute("tool-id", phase.tool);
684  if (phase.date.isValid()) phaseElem.setAttribute("date",phase.date.toString(Qt::ISODate));
685  return prev;
686 }
687 
688 QList<Phase> XliffStorage::allPhases() const
689 {
690  QList<Phase> result;
691  QDomElement file=m_doc.elementsByTagName("file").at(0).toElement();
692  QDomElement header=file.firstChildElement("header");
693  QDomElement phasegroup=header.firstChildElement("phase-group");
694  QDomElement phaseElem=phasegroup.firstChildElement("phase");
695  while (!phaseElem.isNull())
696  {
697  result.append(phaseFromElement(phaseElem));
698  phaseElem=phaseElem.nextSiblingElement("phase");
699  }
700  return result;
701 }
702 
703 Phase XliffStorage::phase(const QString& name) const
704 {
705  QDomElement phasegroup;
706  QDomElement phaseElem=phaseElement(m_doc,name,phasegroup);
707 
708  return phaseFromElement(phaseElem);
709 }
710 
711 QMap<QString,Tool> XliffStorage::allTools() const
712 {
713  QMap<QString,Tool> result;
714  QDomElement file=m_doc.elementsByTagName("file").at(0).toElement();
715  QDomElement header=file.firstChildElement("header");
716  QDomElement toolElem=header.firstChildElement("tool");
717  while (!toolElem.isNull())
718  {
719  Tool tool;
720  tool.tool =toolElem.attribute("tool-id");
721  tool.name =toolElem.attribute("tool-name");
722  tool.version =toolElem.attribute("tool-version");
723  tool.company =toolElem.attribute("tool-company");
724 
725  result.insert(tool.tool, tool);
726  toolElem=toolElem.nextSiblingElement("tool");
727  }
728  return result;
729 }
730 
731 QStringList XliffStorage::sourceFiles(const DocPosition& pos) const
732 {
733  QStringList result;
734 
735  QDomElement elem = unitForPos(pos.entry).firstChildElement("context-group");
736  while (!elem.isNull())
737  {
738  if (elem.attribute("purpose").contains("location"))
739  {
740  QDomElement context = elem.firstChildElement("context");
741  while (!context.isNull())
742  {
743  QString sourcefile;
744  QString linenumber;
745  if (context.attribute("context-type")=="sourcefile")
746  sourcefile=context.text();
747  else if (context.attribute("context-type")=="linenumber")
748  linenumber=context.text();
749  if (!( sourcefile.isEmpty()&&linenumber.isEmpty() ))
750  result.append(sourcefile+':'+linenumber);
751 
752  context=context.nextSiblingElement("context");
753  }
754  }
755 
756  elem=elem.nextSiblingElement("context-group");
757  }
758  //qSort(result);
759 
760  return result;
761 }
762 
763 static void initNoteFromElement(Note& note, QDomElement elem)
764 {
765  note.content=elem.text();
766  note.from=elem.attribute("from");
767  note.lang=elem.attribute("xml:lang");
768  if (elem.attribute("annotates")=="source")
769  note.annotates=Note::Source;
770  else if (elem.attribute("annotates")=="target")
771  note.annotates=Note::Target;
772  bool ok;
773  note.priority=elem.attribute("priority").toInt(&ok);
774  if (!ok) note.priority=0;
775 }
776 
777 QVector<Note> XliffStorage::notes(const DocPosition& pos) const
778 {
779  QList<Note> result;
780 
781  QDomElement elem = entries.at(m_map.at(pos.entry)).firstChildElement("note");
782  while (!elem.isNull())
783  {
784  Note note;
785  initNoteFromElement(note,elem);
786  result.append(note);
787  elem=elem.nextSiblingElement("note");
788  }
789  qSort(result);
790  return result.toVector();
791 }
792 
793 QVector<Note> XliffStorage::developerNotes(const DocPosition& pos) const
794 {
795  Q_UNUSED(pos);
796  //TODO
797  return QVector<Note>();
798 }
799 
800 Note XliffStorage::setNote(DocPosition pos, const Note& note)
801 {
802  //kWarning()<<int(pos.form)<<note.content;
803  QDomElement unit=unitForPos(pos.entry);
804  QDomElement elem;
805  Note oldNote;
806  if (pos.form==-1 && !note.content.isEmpty())
807  {
808  QDomElement ref=unit.lastChildElement("note");
809  elem=unit.insertAfter( m_doc.createElement("note"),ref).toElement();
810  elem.appendChild(m_doc.createTextNode(QString()));
811  }
812  else
813  {
814  QDomNodeList list=unit.elementsByTagName("note");
815  if (pos.form==-1) pos.form=list.size()-1;
816  if (pos.form<list.size())
817  {
818  elem = unit.elementsByTagName("note").at(pos.form).toElement();
819  initNoteFromElement(oldNote,elem);
820  }
821  }
822 
823  if (elem.isNull()) return oldNote;
824 
825  if (!elem.text().isEmpty())
826  {
827  ContentEditingData data(0,elem.text().size());
828  content(elem,&data);
829  }
830 
831  if (!note.content.isEmpty())
832  {
833  ContentEditingData data(0,note.content); content(elem,&data);
834  if (!note.from.isEmpty()) elem.setAttribute("from",note.from);
835  if (note.priority) elem.setAttribute("priority",note.priority);
836  }
837  else
838  unit.removeChild(elem);
839 
840  return oldNote;
841 }
842 
843 QStringList XliffStorage::noteAuthors() const
844 {
845  QSet<QString> result;
846  QDomNodeList notes=m_doc.elementsByTagName("note");
847  int i=notes.size();
848  while (--i>=0)
849  {
850  QString from=notes.at(i).toElement().attribute("from");
851  if (!from.isEmpty())
852  result.insert(from);
853  }
854  return result.toList();
855 }
856 
857 QVector<Note> phaseNotes(QDomDocument m_doc, const QString& phasename, bool remove=false)
858 {
859  QVector<Note> result;
860 
861  QDomElement phasegroup;
862  QDomElement phaseElem=phaseElement(m_doc,phasename,phasegroup);
863 
864  QDomElement noteElem=phaseElem.firstChildElement("note");
865  while (!noteElem.isNull())
866  {
867  Note note;
868  initNoteFromElement(note,noteElem);
869  result.append(note);
870  QDomElement old=noteElem;
871  noteElem=noteElem.nextSiblingElement("note");
872  if (remove) phaseElem.removeChild(old);
873  }
874  return result;
875 }
876 
877 QVector<Note> XliffStorage::phaseNotes(const QString& phasename) const
878 {
879  return ::phaseNotes(m_doc, phasename, false);
880 }
881 
882 QVector<Note> XliffStorage::setPhaseNotes(const QString& phasename, QVector<Note> notes)
883 {
884  QVector<Note> result=::phaseNotes(m_doc, phasename, true);
885 
886  QDomElement phasegroup;
887  QDomElement phaseElem=phaseElement(m_doc,phasename,phasegroup);
888 
889  foreach(const Note& note, notes)
890  {
891  QDomElement elem=phaseElem.appendChild(m_doc.createElement("note")).toElement();
892  elem.appendChild(m_doc.createTextNode(note.content));
893  if (!note.from.isEmpty()) elem.setAttribute("from",note.from);
894  if (note.priority) elem.setAttribute("priority",note.priority);
895  }
896 
897  return result;
898 }
899 
900 
901 QString XliffStorage::setPhase(const DocPosition& pos, const QString& phase)
902 {
903  targetInsert(pos,QString()); //adds <taget> if needed
904 
905  QDomElement target=targetForPos(pos.entry);
906  QString result=target.attribute("phase-name");
907  if (phase.isEmpty())
908  target.removeAttribute("phase-name");
909  else
910  target.setAttribute("phase-name",phase);
911 
912  return result;
913 }
914 
915 QString XliffStorage::phase(const DocPosition& pos) const
916 {
917  QDomElement target=targetForPos(pos.entry);
918  return target.attribute("phase-name");
919 }
920 
921 QStringList XliffStorage::context(const DocPosition& pos) const
922 {
923  Q_UNUSED(pos);
924  //TODO
925  return QStringList(QString());
926 }
927 
928 QStringList XliffStorage::matchData(const DocPosition& pos) const
929 {
930  Q_UNUSED(pos);
931  return QStringList();
932 }
933 
934 QString XliffStorage::id(const DocPosition& pos) const
935 {
936  return unitForPos(pos.entry).attribute("id");
937 }
938 
939 bool XliffStorage::isPlural(const DocPosition& pos) const
940 {
941  return m_plurals.contains(pos.entry);
942 }
943 /*
944 bool XliffStorage::isApproved(const DocPosition& pos) const
945 {
946  return entries.at(m_map.at(pos.entry)).toElement().attribute("approved")=="yes";
947 }
948 void XliffStorage::setApproved(const DocPosition& pos, bool approved)
949 {
950  static const char* const noyes[]={"no","yes"};
951  entries.at(m_map.at(pos.entry)).toElement().setAttribute("approved",noyes[approved]);
952 }
953 */
954 
955 static const char* const states[]={
956  "new", "needs-translation", "needs-l10n", "needs-adaptation", "translated",
957  "needs-review-translation", "needs-review-l10n", "needs-review-adaptation", "final",
958  "signed-off"};
959 
960 
961 static TargetState stringToState(const QString& state)
962 {
963  int i=sizeof(states)/sizeof(char*);
964  while (--i>0 && state!=states[i])
965  ;
966  return TargetState(i);
967 }
968 
969 TargetState XliffStorage::setState(const DocPosition& pos, TargetState state)
970 {
971  targetInsert(pos,QString()); //adds <taget> if needed
972  QDomElement target=targetForPos(pos.entry);
973  TargetState prev=stringToState(target.attribute("state"));
974  target.setAttribute("state",states[state]);
975  return prev;
976 }
977 
978 TargetState XliffStorage::state(const DocPosition& pos) const
979 {
980  QDomElement target=targetForPos(pos.entry);
981  if (!target.hasAttribute("state") && unitForPos(pos.entry).attribute("approved")=="yes")
982  return SignedOff;
983  return stringToState(target.attribute("state"));
984 }
985 
986 bool XliffStorage::isEmpty(const DocPosition& pos) const
987 {
988  ContentEditingData data(ContentEditingData::CheckLength);
989  return content(targetForPos(pos.entry),&data).isEmpty();
990 }
991 
992 bool XliffStorage::isEquivTrans(const DocPosition& pos) const
993 {
994  return targetForPos(pos.entry).attribute("equiv-trans")!="no";
995 }
996 
997 void XliffStorage::setEquivTrans(const DocPosition& pos, bool equivTrans)
998 {
999  targetForPos(pos.entry).setAttribute("equiv-trans",noyes[equivTrans]);
1000 }
1001 
1002 QDomElement XliffStorage::unitForPos(int pos) const
1003 {
1004  if (pos<size())
1005  return entries.at(m_map.at(pos)).toElement();
1006 
1007  return binEntries.at(pos-size()).toElement();
1008 }
1009 
1010 QDomElement XliffStorage::targetForPos(int pos) const
1011 {
1012  return unitForPos(pos).firstChildElement(bintargettarget[pos<size()]);
1013 }
1014 
1015 QDomElement XliffStorage::sourceForPos(int pos) const
1016 {
1017  return unitForPos(pos).firstChildElement(binsourcesource[pos<size()]);
1018 }
1019 
1020 int XliffStorage::binUnitsCount() const
1021 {
1022  return binEntries.size();
1023 }
1024 
1025 int XliffStorage::unitById(const QString& id) const
1026 {
1027  return m_unitsById.contains(id)?m_unitsById.value(id):-1;
1028 }
1029 
1030 
1031 //END STORAGE TRANSLATION
1032 
1033 
XliffStorage::catalogString
CatalogString catalogString(const DocPosition &pos) const
Definition: xliffstorage.cpp:495
QIODevice
Phase::company
QString company
Definition: phase.h:38
doContent
static QString doContent(QDomElement elem, int startingPos, ContentEditingData *data)
Definition: xliffstorage.cpp:250
xliffstorage.h
DocPosition::part
Part part
Definition: pos.h:49
QDomElement::elementsByTagName
QDomNodeList elementsByTagName(const QString &tagname) const
project.h
InsertTag
Definition: cmd.h:40
AltTrans::score
short score
Definition: alttrans.h:39
XliffStorage::XliffStorage
XliffStorage()
Definition: xliffstorage.cpp:47
QMap::contains
bool contains(const Key &key) const
InlineTag::isPaired
static bool isPaired(InlineElement type)
Definition: catalogstring.h:105
InlineTag::xid
QString xid
Definition: catalogstring.h:72
QDomNode::appendChild
QDomNode appendChild(const QDomNode &newChild)
QDate::toString
QString toString(Qt::DateFormat format) const
QXmlSimpleReader
QVector::append
void append(const T &value)
DocPosition::Target
Definition: pos.h:44
TAGRANGE_IMAGE_SYMBOL
#define TAGRANGE_IMAGE_SYMBOL
Definition: catalogstring.h:33
QDomElement::attribute
QString attribute(const QString &name, const QString &defValue) const
DocPosition::Part
Part
Definition: pos.h:40
Phase::contact
QString contact
Definition: phase.h:40
QDomCharacterData::data
QString data() const
DeleteTag
Definition: cmd.h:40
QChar
QDomNode::insertAfter
QDomNode insertAfter(const QDomNode &newChild, const QDomNode &refChild)
MultipleNotes
Definition: catalogcapabilities.h:30
QDomNode::isElement
bool isElement() const
QDomNodeList
Phase::phone
QString phone
Definition: phase.h:42
QMap< QString, Tool >
Tool::name
QString name
Definition: phase.h:71
QVector::last
T & last()
QString::size
int size() const
AltTrans::phase
QString phase
Definition: alttrans.h:43
Note::lang
QString lang
Definition: note.h:37
QDomNode::nextSiblingElement
QDomElement nextSiblingElement(const QString &tagName) const
Note
Definition: note.h:29
XliffStorage::phaseNotes
QVector< Note > phaseNotes(const QString &phase) const
Definition: xliffstorage.cpp:877
CatalogStorage::m_numberOfPluralForms
int m_numberOfPluralForms
Definition: catalogstorage.h:156
QList::toVector
QVector< T > toVector() const
QDomNode
XliffStorage::targetDeleteTag
InlineTag targetDeleteTag(const DocPosition &)
Definition: xliffstorage.cpp:579
XliffStorage::~XliffStorage
~XliffStorage()
Definition: xliffstorage.cpp:52
CatalogString::string
QString string
Definition: catalogstring.h:130
QSet::insert
const_iterator insert(const T &value)
QDomNode::isAttr
bool isAttr() const
QTime
XliffStorage::matchData
QStringList matchData(const DocPosition &pos) const
user-invisible data for matching, e.g.
Definition: xliffstorage.cpp:928
XliffStorage::setPhase
QString setPhase(const DocPosition &pos, const QString &phase)
Definition: xliffstorage.cpp:901
XliffStorage::isEmpty
bool isEmpty() const
XliffStorage::targetInsertTag
void targetInsertTag(const DocPosition &, const InlineTag &)
Definition: xliffstorage.cpp:572
QTextStream
InlineTag::getElementType
static InlineElement getElementType(const QByteArray &)
Definition: catalogstring.cpp:58
XliffStorage::updatePhase
Phase updatePhase(const Phase &phase)
Definition: xliffstorage.cpp:666
QDomNode::nextSibling
QDomNode nextSibling() const
DocPosition::offset
uint offset
Definition: pos.h:51
DocPosition::entry
int entry
Definition: pos.h:48
QDomNode::toElement
QDomElement toElement() const
DocPosition
This struct represents a position in a catalog.
Definition: pos.h:38
phaseNotes
QVector< Note > phaseNotes(QDomDocument m_doc, const QString &phasename, bool remove=false)
Definition: xliffstorage.cpp:857
QDomNode::lastChild
QDomNode lastChild() const
InlineTag::isPaired
bool isPaired() const
Definition: catalogstring.h:106
QDate::fromString
QDate fromString(const QString &string, Qt::DateFormat format)
XliffStorage::state
TargetState state(const DocPosition &pos) const
Definition: xliffstorage.cpp:978
QVector::clear
void clear()
QTime::elapsed
int elapsed() const
QList::append
void append(const T &value)
Phase::date
QDate date
Definition: phase.h:39
Phase::name
QString name
Definition: phase.h:36
QDomNode::ownerDocument
QDomDocument ownerDocument() const
QDomElement::text
QString text() const
QDomElement::hasAttribute
bool hasAttribute(const QString &name) const
InlineTag::InlineElement
InlineElement
Definition: catalogstring.h:49
Phase::email
QString email
Definition: phase.h:41
initNoteFromElement
static void initNoteFromElement(Note &note, QDomElement elem)
Definition: xliffstorage.cpp:763
QDomElement::setAttribute
void setAttribute(const QString &name, const QString &value)
bintargettarget
static const QString bintargettarget[]
Definition: xliffstorage.cpp:44
Tags
Definition: catalogcapabilities.h:33
XliffStorage::capabilities
int capabilities() const
Definition: xliffstorage.cpp:56
XliffStorage::allTools
QMap< QString, Tool > allTools() const
Definition: xliffstorage.cpp:711
QString::toInt
int toInt(bool *ok, int base) const
QDomDocument::elementsByTagName
QDomNodeList elementsByTagName(const QString &tagname) const
XliffStorage::targetInsert
void targetInsert(const DocPosition &pos, const QString &arg)
Definition: xliffstorage.cpp:537
QString::isEmpty
bool isEmpty() const
AltTrans::lang
QString lang
Definition: alttrans.h:41
XliffStorage::context
QStringList context(const DocPosition &pos) const
Definition: xliffstorage.cpp:921
InlineTag::start
int start
Definition: catalogstring.h:68
DocPosition::form
char form
Definition: pos.h:50
LOKALIZE_VERSION
#define LOKALIZE_VERSION
Definition: version.h:11
Note::annotates
Owner annotates
Definition: note.h:35
QDomCharacterData::insertData
void insertData(unsigned long offset, const QString &arg)
XliffStorage::setTarget
void setTarget(const DocPosition &pos, const QString &arg)
Definition: xliffstorage.cpp:587
InlineTag::id
QString id
Definition: catalogstring.h:71
XliffStorage::isPlural
bool isPlural(const DocPosition &pos) const
Definition: xliffstorage.cpp:939
QDate::isValid
bool isValid() const
QXmlSimpleReader::setFeature
virtual void setFeature(const QString &name, bool enable)
gettextheader.h
CatalogStorage::m_targetLangCode
QString m_targetLangCode
Definition: catalogstorage.h:154
phaseFromElement
static Phase phaseFromElement(QDomElement phaseElem)
Definition: xliffstorage.cpp:652
QSet
states
static const char *const states[]
Definition: xliffstorage.cpp:955
XliffStorage::setEquivTrans
void setEquivTrans(const DocPosition &pos, bool equivTrans)
Definition: xliffstorage.cpp:997
QString
QList< InlineTag >
phaseElement
static QDomElement phaseElement(QDomDocument m_doc, const QString &name, QDomElement &phasegroup)
Definition: xliffstorage.cpp:630
Phase
Definition: phase.h:34
InlineTag::name
const char * name() const
Definition: catalogstring.h:104
CatalogStorage
Abstract interface for storage of translation file.
Definition: catalogstorage.h:45
SignedOff
Definition: state.h:41
QStringList
names
static const QString names[]
Definition: tsstorage.cpp:45
XliffStorage::allPhases
QList< Phase > allPhases() const
Definition: xliffstorage.cpp:688
XliffStorage::noteAuthors
QStringList noteAuthors() const
Definition: xliffstorage.cpp:843
binsourcesource
static const QString binsourcesource[]
Definition: xliffstorage.cpp:45
QDomDocument::createTextNode
QDomText createTextNode(const QString &value)
QVector::reserve
void reserve(int size)
XliffStorage::sourceFiles
QStringList sourceFiles(const DocPosition &pos) const
Definition: xliffstorage.cpp:731
QDomNode::removeChild
QDomNode removeChild(const QDomNode &oldChild)
QString::contains
bool contains(QChar ch, Qt::CaseSensitivity cs) const
content
static QString content(QDomElement elem, ContentEditingData *data=0)
walks through XLIFF XML and performs actions depending on ContentEditingData:
Definition: xliffstorage.cpp:245
XliffStorage::phase
Phase phase(const QString &name) const
Definition: xliffstorage.cpp:703
noyes
static const QString noyes[]
Definition: xliffstorage.cpp:43
XliffStorage::source
QString source(const DocPosition &pos) const
flat-model interface (ignores XLIFF grouping)
Definition: xliffstorage.cpp:513
QDomDocument
XliffStorage::targetDelete
void targetDelete(const DocPosition &pos, int count)
edit operations used by undo/redo system and sync-mode
Definition: xliffstorage.cpp:523
AltTrans::target
CatalogString target
Definition: alttrans.h:37
Tool::company
QString company
Definition: phase.h:73
QSet::contains
bool contains(const T &value) const
QDomNode::isNull
bool isNull() const
version.h
genericContent
static QString genericContent(QDomElement elem, bool nonbin)
Definition: xliffstorage.cpp:509
XliffStorage::altTrans
QVector< AltTrans > altTrans(const DocPosition &pos) const
Definition: xliffstorage.cpp:595
Note::content
QString content
Definition: note.h:33
CatalogString
data structure used to pass info about inline elements a XLIFF tag is represented by a TAGRANGE_IMAGE...
Definition: catalogstring.h:128
QVector::at
const T & at(int i) const
QXmlInputSource
QDomNode::save
void save(QTextStream &str, int indent) const
QDomNode::firstChild
QDomNode firstChild() const
QDomNode::isCharacterData
bool isCharacterData() const
QString::mid
QString mid(int position, int n) const
QDomCharacterData::deleteData
void deleteData(unsigned long offset, unsigned long count)
ExtendedStates
Definition: catalogcapabilities.h:32
QVector< AltTrans >
prefs_lokalize.h
XliffStorage::sourceWithTags
CatalogString sourceWithTags(DocPosition pos) const
Definition: xliffstorage.cpp:504
Note::priority
char priority
Definition: note.h:34
Tool
Definition: phase.h:68
XliffStorage::size
int size() const
Definition: xliffstorage.cpp:176
XliffStorage::load
int load(QIODevice *device)
Definition: xliffstorage.cpp:63
QDomNode::parentNode
QDomNode parentNode() const
QDomCharacterData
XliffStorage::save
bool save(QIODevice *device, bool belongsToProject=false)
Definition: xliffstorage.cpp:166
XliffStorage::notes
QVector< Note > notes(const DocPosition &pos) const
Definition: xliffstorage.cpp:777
CatalogString::tags
QList< InlineTag > tags
Definition: catalogstring.h:131
Phase::tool
QString tool
Definition: phase.h:43
DocPosition::Source
Definition: pos.h:43
QDomNode::firstChildElement
QDomElement firstChildElement(const QString &tagName) const
QDomNode::lastChildElement
QDomElement lastChildElement(const QString &tagName) const
stringToState
static TargetState stringToState(const QString &state)
Definition: xliffstorage.cpp:961
XliffStorage::targetWithTags
CatalogString targetWithTags(DocPosition pos) const
Definition: xliffstorage.cpp:500
AltTrans::source
CatalogString source
Definition: alttrans.h:36
Tool::version
QString version
Definition: phase.h:72
CatalogStorage::m_sourceLangCode
QString m_sourceLangCode
Definition: catalogstorage.h:153
AltTrans::origin
QString origin
Definition: alttrans.h:42
XliffStorage::id
QString id(const DocPosition &pos) const
entry id unique for this file
Definition: xliffstorage.cpp:934
XliffStorage::setState
TargetState setState(const DocPosition &pos, TargetState state)
Definition: xliffstorage.cpp:969
InlineTag::mrk
Definition: catalogstring.h:57
Phase::process
QString process
Definition: phase.h:37
QString::left
QString left(int n) const
QSet::toList
QList< T > toList() const
QTime::start
void start()
XliffStorage::setNote
Note setNote(DocPosition pos, const Note &note)
pos.form is note number
Definition: xliffstorage.cpp:800
QMap::insert
iterator insert(const Key &key, const T &value)
XliffStorage::unitById
int unitById(const QString &id) const
Definition: xliffstorage.cpp:1025
Note::from
QString from
Definition: note.h:36
QDomElement::removeAttribute
void removeAttribute(const QString &name)
XliffStorage::isEquivTrans
bool isEquivTrans(const DocPosition &pos) const
Definition: xliffstorage.cpp:992
QDomElement::tagName
QString tagName() const
KeepsNoteAuthors
Definition: catalogcapabilities.h:29
QDomNodeList::size
int size() const
XliffStorage::developerNotes
QVector< Note > developerNotes(const DocPosition &pos) const
Definition: xliffstorage.cpp:793
Note::Target
Definition: note.h:31
QDomDocument::createElement
QDomElement createElement(const QString &tagName)
InlineTag::getElementName
static const char * getElementName(InlineElement type)
Definition: catalogstring.cpp:29
Phases
Definition: catalogcapabilities.h:31
InlineTag::end
int end
Definition: catalogstring.h:69
QDomNode::toCharacterData
QDomCharacterData toCharacterData() const
TargetState
TargetState
Definition: state.h:30
XliffStorage::setPhaseNotes
QVector< Note > setPhaseNotes(const QString &phase, QVector< Note > notes)
Definition: xliffstorage.cpp:882
QVector::size
int size() const
XliffStorage::target
QString target(const DocPosition &pos) const
Definition: xliffstorage.cpp:517
QDomElement
AltTrans::type
Type type
Definition: alttrans.h:34
XliffStorage::binUnitsCount
int binUnitsCount() const
Definition: xliffstorage.cpp:1020
QDomNode::insertBefore
QDomNode insertBefore(const QDomNode &newChild, const QDomNode &refChild)
Note::Source
Definition: note.h:31
AltTrans
Definition: alttrans.h:30
AltTrans::Type
Type
Definition: alttrans.h:33
InlineTag
data structure used to pass info about inline elements a XLIFF tag is represented by a TAGRANGE_IMAGE...
Definition: catalogstring.h:44
numberOfPluralFormsForLangCode
int numberOfPluralFormsForLangCode(const QString &langCode)
Definition: gettextheader.cpp:151
Tool::tool
QString tool
Definition: phase.h:70
QDomNodeList::at
QDomNode at(int index) const
QDomDocument::setContent
bool setContent(const QByteArray &data, bool namespaceProcessing, QString *errorMsg, int *errorLine, int *errorColumn)
QMap::value
const T value(const Key &key) const
QString::toUtf8
QByteArray toUtf8() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:40:07 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

lokalize

Skip menu "lokalize"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdesdk API Reference

Skip menu "kdesdk API Reference"
  • kapptemplate
  • kcachegrind
  • kompare
  • lokalize
  • umbrello
  •   umbrello

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal