|
|
/*
* 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); }
|