You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
188 lines
5.8 KiB
188 lines
5.8 KiB
/*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership.
|
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
|
* (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
/*
|
|
* $Id: Xlat_ICUResourceBundle.cpp 698386 2008-09-23 22:54:08Z amassari $
|
|
*/
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Includes
|
|
// ---------------------------------------------------------------------------
|
|
#include "Xlat.hpp"
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// ICUResBundFormatter: Constructors and Destructor
|
|
// ---------------------------------------------------------------------------
|
|
ICUResBundFormatter::ICUResBundFormatter()
|
|
:fOutFl(0)
|
|
,fTranscoder(0)
|
|
{
|
|
//
|
|
// Try to create a transcoder for the format that we were told
|
|
// to output in.
|
|
//
|
|
// <TBD> Right now we are just using an LCP transcoding, which is not
|
|
// really the right thing to do!
|
|
//
|
|
fTranscoder = XMLPlatformUtils::fgTransService->makeNewLCPTranscoder(XMLPlatformUtils::fgMemoryManager);
|
|
if (!fTranscoder)
|
|
{
|
|
wprintf(L"Could not create LCP transcoder\n");
|
|
throw ErrReturn_NoTranscoder;
|
|
}
|
|
}
|
|
|
|
ICUResBundFormatter::~ICUResBundFormatter()
|
|
{
|
|
delete fTranscoder;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// ICUResBundFormatter: Implementation of the formatter interface
|
|
// ---------------------------------------------------------------------------
|
|
void ICUResBundFormatter::endDomain(const XMLCh* const domainName
|
|
, const unsigned int msgCount)
|
|
{
|
|
fwprintf(fOutFl, L"\t\t} \n\n");
|
|
}
|
|
|
|
|
|
void ICUResBundFormatter::endMsgType(const MsgTypes type)
|
|
{
|
|
#ifndef ICU_RESBUNDLE_IN_TABLE_FORM
|
|
fwprintf(fOutFl, L"\t\t\"%s End \" ,\n", xmlStrToPrintable(typePrefixes[type]) );
|
|
releasePrintableStr
|
|
#endif
|
|
}
|
|
|
|
|
|
void ICUResBundFormatter::endOutput()
|
|
{
|
|
// Close the output files
|
|
fwprintf(fOutFl, L"} \n\n");
|
|
fclose(fOutFl);
|
|
}
|
|
|
|
void
|
|
ICUResBundFormatter::nextMessage(const XMLCh* const msgText
|
|
, const XMLCh* const msgId
|
|
, const unsigned int messageId
|
|
, const unsigned int curId)
|
|
{
|
|
//
|
|
// We have to transcode the message text to UTF-8 in order to be able
|
|
// to write it out to a message catalog (which is not Unicode enabled.)
|
|
// If the text is just US-ASCII, this won't have any effect, but don't
|
|
// bother checking, just do it simple and stupid.
|
|
//
|
|
|
|
//
|
|
// array_name {
|
|
// "xxx" ,
|
|
// "yyy" ,
|
|
// }
|
|
//
|
|
//
|
|
// table_name {
|
|
// AB { "xxx" }
|
|
// CD { "yyy" }
|
|
// }
|
|
//
|
|
|
|
#ifdef ICU_RESBUNDLE_IN_TABLE_FORM
|
|
fwprintf(fOutFl, L"\t\t %3d { \"%s\" } \n", curId, xmlStrToPrintable(msgText));
|
|
releasePrintableStr
|
|
// need to print leading 0 if less than 100, not tested yet
|
|
#else
|
|
fwprintf(fOutFl, L"\t\t\"%s\" ,\n", xmlStrToPrintable(msgText));
|
|
releasePrintableStr
|
|
// need a space between the last character and the closing "
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
void ICUResBundFormatter::startDomain(const XMLCh* const domainName
|
|
, const XMLCh* const nameSpace)
|
|
{
|
|
//
|
|
// Output:
|
|
// // an array
|
|
// domainName {
|
|
//
|
|
int index = XMLString::lastIndexOf(domainName, chForwardSlash);
|
|
|
|
#ifdef ICU_RESBUNDLE_IN_TABLE_FORM
|
|
fwprintf(fOutFl, L"\n\t // a table \n");
|
|
#else
|
|
fwprintf(fOutFl, L"\n\t // an array \n");
|
|
#endif
|
|
|
|
fwprintf(fOutFl, L"\t%s { \n" , xmlStrToPrintable(&(domainName[index+1])));
|
|
releasePrintableStr
|
|
|
|
}
|
|
|
|
|
|
void ICUResBundFormatter::startMsgType(const MsgTypes type)
|
|
{
|
|
#ifndef ICU_RESBUNDLE_IN_TABLE_FORM
|
|
fwprintf(fOutFl, L"\t\t\"%s Start \" , \n", xmlStrToPrintable(typePrefixes[type]) );
|
|
releasePrintableStr
|
|
#endif
|
|
}
|
|
|
|
|
|
void ICUResBundFormatter::startOutput(const XMLCh* const msgLocale
|
|
, const XMLCh* const outPath)
|
|
{
|
|
//
|
|
// Ok, lets try to open the the output file. All of the messages
|
|
// for all the domains are put into a single Msg file, which can be
|
|
// compiled into the program.
|
|
//
|
|
// CppErrMsgs_xxxx.Msg
|
|
//
|
|
// where xxx is the locale suffix passed in.
|
|
//
|
|
const unsigned int bufSize = 4095;
|
|
XMLCh tmpBuf[bufSize + 1];
|
|
tmpBuf[0] = 0;
|
|
XMLCh *tmpXMLStr = XMLString::transcode(".txt");
|
|
|
|
// ICU Resource Bundles now uses "root" as locale
|
|
XMLCh* locale = XMLString::transcode ("root");
|
|
XMLString::catString(tmpBuf, outPath);
|
|
XMLString::catString(tmpBuf, locale);
|
|
XMLString::catString(tmpBuf, tmpXMLStr );
|
|
XMLString::release(&tmpXMLStr);
|
|
char *tmpStr = XMLString::transcode(tmpBuf);
|
|
fOutFl = fopen(tmpStr, "wt");
|
|
XMLString::release(&tmpStr);
|
|
if ((!fOutFl) || (fwide(fOutFl, 1) < 0))
|
|
{
|
|
wprintf(L"Could not open the output file: %s\n\n", xmlStrToPrintable(tmpBuf) );
|
|
releasePrintableStr
|
|
throw ErrReturn_OutFileOpenFailed;
|
|
}
|
|
|
|
// Set the message delimiter
|
|
fwprintf(fOutFl, L"%s { \n", xmlStrToPrintable(locale) );
|
|
releasePrintableStr
|
|
XMLString::release(&locale);
|
|
}
|