mirror of
https://github.com/xiaoyifang/goldendict-ng.git
synced 2024-11-27 19:24:08 +00:00
152 lines
4.9 KiB
C++
152 lines
4.9 KiB
C++
/* This file is (c) 2015 Zhe Wang <0x1997@gmail.com>
|
|
* Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */
|
|
|
|
#include "chinese.hh"
|
|
#include <stdexcept>
|
|
#include <QCoreApplication>
|
|
#ifdef Q_OS_MAC
|
|
#include <opencc/opencc.h>
|
|
#endif
|
|
#include <opencc/Export.hpp>
|
|
#include <opencc/SimpleConverter.hpp>
|
|
#include "folding.hh"
|
|
#include "gddebug.hh"
|
|
#include "transliteration.hh"
|
|
#include "utf8.hh"
|
|
|
|
namespace Chinese {
|
|
|
|
class CharacterConversionDictionary: public Transliteration::BaseTransliterationDictionary
|
|
{
|
|
#ifdef Q_OS_MAC
|
|
opencc_t converter;
|
|
#else
|
|
opencc::SimpleConverter* converter;
|
|
#endif
|
|
|
|
public:
|
|
|
|
CharacterConversionDictionary( std::string const & id, std::string const & name,
|
|
QIcon icon, QString const & openccConfig);
|
|
~CharacterConversionDictionary();
|
|
|
|
std::vector< gd::wstring > getAlternateWritings( gd::wstring const & )
|
|
throw();
|
|
};
|
|
|
|
CharacterConversionDictionary::CharacterConversionDictionary( std::string const & id,
|
|
std::string const & name_,
|
|
QIcon icon_,
|
|
QString const & openccConfig):
|
|
Transliteration::BaseTransliterationDictionary( id, name_, icon_, false ),
|
|
converter( NULL )
|
|
{
|
|
try {
|
|
#ifdef Q_OS_MAC
|
|
converter = opencc_open( openccConfig.toLocal8Bit().constData() );
|
|
if( converter == reinterpret_cast< opencc_t >( -1 ) )
|
|
{
|
|
gdWarning( "CharacterConversionDictionary: failed to initialize OpenCC from config %s: %s\n",
|
|
openccConfig.toLocal8Bit().constData(), opencc_error() );
|
|
}
|
|
#else
|
|
converter = new opencc::SimpleConverter( openccConfig.toLocal8Bit().constData() );
|
|
#endif
|
|
} catch ( std::runtime_error& e ) {
|
|
gdWarning( "CharacterConversionDictionary: failed to initialize OpenCC from config %s: %s\n",
|
|
openccConfig.toLocal8Bit().constData(), e.what() );
|
|
}
|
|
}
|
|
|
|
CharacterConversionDictionary::~CharacterConversionDictionary()
|
|
{
|
|
#ifdef Q_OS_MAC
|
|
if ( converter != NULL && converter != reinterpret_cast< opencc_t >( -1 ) )
|
|
opencc_close( converter );
|
|
#else
|
|
if ( converter != NULL )
|
|
delete converter;
|
|
#endif
|
|
}
|
|
|
|
std::vector< gd::wstring > CharacterConversionDictionary::getAlternateWritings( gd::wstring const & str )
|
|
throw()
|
|
{
|
|
std::vector< gd::wstring > results;
|
|
|
|
if ( converter != NULL ) {
|
|
gd::wstring folded = Folding::applySimpleCaseOnly( str );
|
|
std::string input = Utf8::encode( folded );
|
|
std::string output;
|
|
gd::wstring result;
|
|
|
|
try {
|
|
#ifdef Q_OS_MAC
|
|
if ( converter != NULL && converter != reinterpret_cast< opencc_t >( -1 ) )
|
|
{
|
|
char * tmp = opencc_convert_utf8( converter, input.c_str(), input.length() );
|
|
if( tmp )
|
|
{
|
|
output = std::string( tmp );
|
|
opencc_convert_utf8_free( tmp );
|
|
}
|
|
else
|
|
gdWarning( "OpenCC: conversion failed %s\n", opencc_error() );
|
|
}
|
|
#else
|
|
output = converter->Convert( input );
|
|
#endif
|
|
result = Utf8::decode( output );
|
|
} catch ( std::exception& ex ) {
|
|
gdWarning( "OpenCC: conversion failed %s\n", ex.what() );
|
|
}
|
|
|
|
if ( !result.empty() && result != folded )
|
|
results.push_back( result );
|
|
}
|
|
|
|
return results;
|
|
}
|
|
|
|
std::vector< sptr< Dictionary::Class > > makeDictionaries( Config::Chinese const & cfg )
|
|
|
|
{
|
|
std::vector< sptr< Dictionary::Class > > result;
|
|
|
|
#ifdef Q_OS_LINUX
|
|
QString configDir = "";
|
|
#else
|
|
QString configDir = Config::getOpenCCDir();
|
|
if( !configDir.isEmpty() )
|
|
configDir += "/";
|
|
#endif
|
|
|
|
if ( cfg.enable )
|
|
{
|
|
if ( cfg.enableSCToTWConversion )
|
|
{
|
|
result.push_back( new CharacterConversionDictionary( "bf1c33a59cbacea8f39b5b5475787cfd",
|
|
QCoreApplication::translate( "ChineseConversion", "Simplified to traditional Chinese (Taiwan variant) conversion" ).toUtf8().data(),
|
|
QIcon( ":/flags/tw.png" ), configDir + "s2tw.json" ) );
|
|
}
|
|
|
|
if ( cfg.enableSCToHKConversion )
|
|
{
|
|
result.push_back( new CharacterConversionDictionary( "9e0681fb9e1c0b6c90e6fb46111d96b5",
|
|
QCoreApplication::translate( "ChineseConversion", "Simplified to traditional Chinese (Hong Kong variant) conversion" ).toUtf8().data(),
|
|
QIcon( ":/flags/hk.png" ), configDir + "s2hk.json" ) );
|
|
}
|
|
|
|
if ( cfg.enableTCToSCConversion )
|
|
{
|
|
result.push_back( new CharacterConversionDictionary( "0db536ce0bdc52ea30d11a82c5db4a27",
|
|
QCoreApplication::translate( "ChineseConversion", "Traditional to simplified Chinese conversion" ).toUtf8().data(),
|
|
QIcon( ":/flags/cn.png" ), configDir + "t2s.json" ) );
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
}
|