36bool lcl_isNextGroup(OString &sGroup_out, std::string_view sLineTrim)
48void lcl_RemoveUTF8ByteOrderMarker( OString &rString )
50 if( rString.getLength() >= 3 && rString[0] ==
'\xEF' &&
51 rString[1] ==
'\xBB' && rString[2] ==
'\xBF' )
53 rString = rString.copy(3);
62 : sSource(
std::move( sLngFile ))
64 std::ifstream aStream(
sSource.getStr());
65 if (!aStream.is_open())
68 bool bFirstLine =
true;
70 std::getline(aStream, s);
71 while (!aStream.eof())
73 OString sLine(s.data(), s.length());
78 lcl_RemoveUTF8ByteOrderMarker( sLine );
83 std::getline(aStream, s);
96 std::cerr <<
"Ulfex error: Can't open po file:" << rPOFile <<
"\n";
101 OString sGroup, sLine;
119 Text.erase(
"x-comment");
129 "Ulfex", aPOStream, rActFileName,
"LngText",
130 rID, OString(), rText_inout.count(
"x-comment") ? rText_inout[
"x-comment"] : OString(), rText_inout[
"en-US"]);
135 return lcl_isNextGroup(sGroup_out,
o3tl::trim(sLine_in));
144 if (!sLang.isEmpty()) {
146 rText_inout[sLang] = sText;
152 const OString &rPOFile,
153 const OString &rDestinationFile,
154 std::string_view rLanguage )
156 std::ofstream aDestination(
157 rDestinationFile.getStr(), std::ios_base::out | std::ios_base::trunc);
173 OString sID( sGroup );
174 std::size_t nLastLangPos = 0;
182 OString sLanguagesDone;
187 if ( lcl_isNextGroup(sGroup, sLine) )
196 OString sLang(sLine.getToken(0,
'=',
n));
197 if (
n == -1 ||
static_cast<bool>(sLine.match(
"/*")))
203 sLang = sLang.trim();
205 OString sSearch{
";" + sLang +
";" };
207 if ( sLanguagesDone.indexOf( sSearch ) != -1 ) {
212 if( !sLang.isEmpty() )
215 pEntrys->
GetText( sNewText, sLang,
true );
219 if ( !sNewText.isEmpty()) {
223 + sNewText.replaceAll(
"\"",
"\\\"").replaceAll(
"\\\\\"",
"\\\"")
225 Text[ sLang ] = sNewText;
230 sLanguagesDone += sSearch;
235 sLanguagesDone += sSearch;
246 if( !sCur.equalsIgnoreAsciiCase(
"en-US") &&
Text[sCur].isEmpty() && pEntrys )
250 pEntrys->
GetText( sNewText, sCur,
true );
253 if ( !sNewText.isEmpty() && sCur !=
"x-comment")
255 const OString sLine { sCur
258 + sNewText.replaceAll(
"\"",
"\\\"").replaceAll(
"\\\\\"",
"\\\"")
264 if ( nLastLangPos <
mvLines.size() ) {
278 aDestination.close();
std::unordered_map< OString, OString > OStringHashMap
void Merge(const OString &rPOFile, const OString &rDestinationFile, std::string_view rLanguage)
static void ReadLine(std::string_view rLine_in, OStringHashMap &rText_inout)
LngParser(OString sLngFile)
std::vector< OString > aLanguages
std::vector< OString > mvLines
static void WritePO(PoOfstream &aPOStream, OStringHashMap &rText_inout, const OString &rActFileName, const OString &rID)
static bool isNextGroup(OString &sGroup_out, std::string_view sLine_in)
void CreatePO(const OString &rPOFile)
Purpose: holds information of data to merge, read from PO file.
MergeEntrys * GetMergeEntrys(ResData *pResData)
std::vector< OString > GetLanguages() const
Purpose: holds information of data to merge.
bool GetText(OString &rReturn, const OString &nLangIndex, bool bDel=false)
Interface to write po entry to files as output streams.
Purpose: holds mandatory data to export a single res.
void writePoEntry(const OString &rExecutable, PoOfstream &rPoStream, const OString &rSourceFile, std::string_view rResType, const OString &rGroupId, const OString &rLocalId, const OString &rHelpText, const OString &rText, const PoEntry::TYPE eType)
Write out a PoEntry with attention to exceptions.
std::basic_string_view< charT, traits > trim(std::basic_string_view< charT, traits > str)
bool equalsIgnoreAsciiCase(std::u16string_view s1, std::u16string_view s2)
constexpr bool ends_with(std::basic_string_view< charT, traits > sv, std::basic_string_view< charT, traits > x) noexcept
constexpr bool starts_with(std::basic_string_view< charT, traits > sv, std::basic_string_view< charT, traits > x) noexcept
std::basic_string_view< charT, traits > getToken(std::basic_string_view< charT, traits > sv, charT delimiter, std::size_t &position)