diff options
| author | maxim_productengine <mnikolenko@productengine.com> | 2019-05-02 10:47:30 +0300 | 
|---|---|---|
| committer | maxim_productengine <mnikolenko@productengine.com> | 2019-05-02 10:47:30 +0300 | 
| commit | 9ac109040215a765d03addcf03ef4bfcac68f03e (patch) | |
| tree | 09e4d51af1c6af1dc56a8c6740ec7163ad5685fc /indra | |
| parent | ca0fd82199536a3c14b3ea8a6c6632fff222cbad (diff) | |
SL-10992 FIXED SLURLs and SLApp links are translated in chat when using the translator
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/lltranslate.cpp | 64 | ||||
| -rw-r--r-- | indra/newview/lltranslate.h | 3 | ||||
| -rw-r--r-- | indra/newview/llviewermessage.cpp | 2 | 
3 files changed, 67 insertions, 2 deletions
| diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp index 1936e24761..e424983cf8 100644 --- a/indra/newview/lltranslate.cpp +++ b/indra/newview/lltranslate.cpp @@ -38,8 +38,12 @@  #include "llcoros.h"  #include "reader.h"  #include "llcorehttputil.h" +#include "llurlregistry.h" +static const std::string BING_NOTRANSLATE_OPENING_TAG("<div class=\"notranslate\">"); +static const std::string BING_NOTRANSLATE_CLOSING_TAG("</div>"); +  /**  * Handler of an HTTP machine translation service.  * @@ -99,6 +103,8 @@ public:      */      virtual bool isConfigured() const = 0; +    virtual LLTranslate::EService getCurrentService() = 0; +      virtual void verifyKey(const std::string &key, LLTranslate::KeyVerificationResult_fn fnc) = 0;      virtual void translateMessage(LanguagePair_t fromTo, std::string msg, LLTranslate::TranslationSuccess_fn success, LLTranslate::TranslationFailure_fn failure); @@ -248,6 +254,8 @@ public:          std::string& err_msg) const;      /*virtual*/ bool isConfigured() const; +    /*virtual*/ LLTranslate::EService getCurrentService() { return LLTranslate::EService::SERVICE_GOOGLE; } +      /*virtual*/ void verifyKey(const std::string &key, LLTranslate::KeyVerificationResult_fn fnc);  private: @@ -409,6 +417,8 @@ public:          std::string& err_msg) const;      /*virtual*/ bool isConfigured() const; +    /*virtual*/ LLTranslate::EService getCurrentService() { return LLTranslate::EService::SERVICE_BING; } +      /*virtual*/ void verifyKey(const std::string &key, LLTranslate::KeyVerificationResult_fn fnc);  private:      static std::string getAPIKey(); @@ -520,7 +530,59 @@ void LLTranslate::translateMessage(const std::string &from_lang, const std::stri  {      LLTranslationAPIHandler& handler = getPreferredHandler(); -    handler.translateMessage(LLTranslationAPIHandler::LanguagePair_t(from_lang, to_lang), mesg, success, failure); +    handler.translateMessage(LLTranslationAPIHandler::LanguagePair_t(from_lang, to_lang), addNoTranslateTags(mesg), success, failure); +} + +std::string LLTranslate::addNoTranslateTags(std::string mesg) +{ +    if (getPreferredHandler().getCurrentService() != SERVICE_BING) +    { +        return mesg; +    } + +    std::string upd_msg(mesg); +    LLUrlMatch match; +    S32 dif = 0; +    //surround all links (including SLURLs) with 'no-translate' tags to prevent unnecessary translation +    while (LLUrlRegistry::instance().findUrl(mesg, match)) +    { +        upd_msg.insert(dif + match.getStart(), BING_NOTRANSLATE_OPENING_TAG); +        upd_msg.insert(dif + BING_NOTRANSLATE_OPENING_TAG.size() + match.getEnd() + 1, BING_NOTRANSLATE_CLOSING_TAG); +        mesg.erase(match.getStart(), match.getEnd() - match.getStart()); +        dif += match.getEnd() - match.getStart() + BING_NOTRANSLATE_OPENING_TAG.size() + BING_NOTRANSLATE_CLOSING_TAG.size(); +    } +    return upd_msg; +} + +std::string LLTranslate::removeNoTranslateTags(std::string mesg) +{ +    if (getPreferredHandler().getCurrentService() != SERVICE_BING) +    { +        return mesg; +    } +    std::string upd_msg(mesg); +    LLUrlMatch match; +    S32 opening_tag_size = BING_NOTRANSLATE_OPENING_TAG.size(); +    S32 closing_tag_size = BING_NOTRANSLATE_CLOSING_TAG.size(); +    S32 dif = 0; +    //remove 'no-translate' tags we added to the links before +    while (LLUrlRegistry::instance().findUrl(mesg, match)) +    { +        if (upd_msg.substr(dif + match.getStart() - opening_tag_size, opening_tag_size) == BING_NOTRANSLATE_OPENING_TAG) +        { +            upd_msg.erase(dif + match.getStart() - opening_tag_size, opening_tag_size); +            dif -= opening_tag_size; + +            if (upd_msg.substr(dif + match.getEnd() + 1, closing_tag_size) == BING_NOTRANSLATE_CLOSING_TAG) +            { +                upd_msg.replace(dif + match.getEnd() + 1, closing_tag_size, " "); +                dif -= closing_tag_size - 1; +            } +        } +        mesg.erase(match.getStart(), match.getUrl().size()); +        dif += match.getUrl().size(); +    } +    return upd_msg;  }  /*static*/ diff --git a/indra/newview/lltranslate.h b/indra/newview/lltranslate.h index bf431cdfbb..e0722fbd83 100644 --- a/indra/newview/lltranslate.h +++ b/indra/newview/lltranslate.h @@ -91,6 +91,9 @@ public :  	 */  	static bool isTranslationConfigured(); +    static std::string addNoTranslateTags(std::string mesg); +    static std::string removeNoTranslateTags(std::string mesg); +  private:  	static LLTranslationAPIHandler& getPreferredHandler();  	static LLTranslationAPIHandler& getHandler(EService service); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index e50c8ee9f0..c8f75c79c4 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2415,7 +2415,7 @@ void translateSuccess(LLChat chat, LLSD toastArgs, std::string originalMsg, std:          && ((detected_language.empty()) || (expectLang != detected_language))          && (LLStringUtil::compareInsensitive(translation, originalMsg) != 0))      { -        chat.mText += " (" + translation + ")"; +        chat.mText += " (" + LLTranslate::removeNoTranslateTags(translation) + ")";      }      LLNotificationsUI::LLNotificationManager::instance().onChat(chat, toastArgs); | 
