desktop/qa/desktop_lib/test_desktop_lib.cxx | 37 ++++++++++++++++++++++++++++ desktop/source/lib/init.cxx | 23 +++++++++++++++++ include/LibreOfficeKit/LibreOfficeKit.h | 10 +++++++ include/LibreOfficeKit/LibreOfficeKit.hxx | 29 +++++++++++++++++++++ 4 files changed, 99 insertions(+)
New commits: commit 36beb79184e5f4153c8cc92b176b21b697594228 Author: Tor Lillqvist <t...@collabora.com> AuthorDate: Mon Dec 10 16:12:08 2018 +0200 Commit: Tor Lillqvist <t...@collabora.com> CommitDate: Mon Dec 10 21:39:03 2018 +0100 Add a localisation API to LibreOfficeKitClass Combines the LanguageTag::Create() and Translate::get() functionality. Also add an ABI test for the Kit class in the LibreOfficeKit unit test, and a test for the translation function. (In this branch there is no Translate::nget() so no such functionality.) Change-Id: I78c48a8bbb434d6f204869290822830288022a53 Reviewed-on: https://gerrit.libreoffice.org/64894 Reviewed-by: Tor Lillqvist <t...@collabora.com> Tested-by: Tor Lillqvist <t...@collabora.com> diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx index 2b571921738c..7a5756e5ed35 100644 --- a/desktop/qa/desktop_lib/test_desktop_lib.cxx +++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx @@ -32,6 +32,7 @@ #include <comphelper/propertysequence.hxx> #include <osl/conditn.hxx> #include <svl/srchitem.hxx> +#include <svtools/strings.hrc> #include <LibreOfficeKit/LibreOfficeKitEnums.h> #include <unotools/tempfile.hxx> #include <sfx2/viewsh.hxx> @@ -117,6 +118,7 @@ public: void testCommentsImpress(); void testCommentsCallbacksWriter(); void testRunMacro(); + void testTranslate(); void testExtractParameter(); void testGetSignatureState_NonSigned(); void testGetSignatureState_Signed(); @@ -164,6 +166,7 @@ public: CPPUNIT_TEST(testCommentsImpress); CPPUNIT_TEST(testCommentsCallbacksWriter); CPPUNIT_TEST(testRunMacro); + CPPUNIT_TEST(testTranslate); CPPUNIT_TEST(testExtractParameter); CPPUNIT_TEST(testGetSignatureState_Signed); CPPUNIT_TEST(testGetSignatureState_NonSigned); @@ -2218,6 +2221,20 @@ void DesktopLOKTest::testRunMacro() comphelper::LibreOfficeKit::setActive(false); } +void DesktopLOKTest::testTranslate() +{ + comphelper::LibreOfficeKit::setActive(); + + LibLibreOffice_Impl aOffice; + + // Try translating to a non-existent locale, should return the English string + char *translated = aOffice.m_pOfficeClass->translateGet(&aOffice, STR_DESCRIPTION_FACTORY_WRITER, "svt", "foo"); + CPPUNIT_ASSERT_EQUAL(0, strcmp(translated, "Text Document")); + free(translated); + + comphelper::LibreOfficeKit::setActive(false); +} + void DesktopLOKTest::testExtractParameter() { comphelper::LibreOfficeKit::setActive(); @@ -2462,6 +2479,11 @@ void DesktopLOKTest::testInsertCertificatePEM() namespace { +size_t classOffset(int i) +{ + return sizeof(static_cast<struct _LibreOfficeKitClass*>(nullptr)->nSize) + i * sizeof(void*); +} + size_t documentClassOffset(int i) { return sizeof(static_cast<struct _LibreOfficeKitDocumentClass*>(nullptr)->nSize) + i * sizeof(void*); @@ -2472,6 +2494,21 @@ size_t documentClassOffset(int i) void DesktopLOKTest::testABI() { // STABLE ABI, NEVER CHANGE (unless there's a very good reason, agreed by ESC, etc.) + + CPPUNIT_ASSERT_EQUAL(classOffset(0), offsetof(struct _LibreOfficeKitClass, destroy)); + CPPUNIT_ASSERT_EQUAL(classOffset(1), offsetof(struct _LibreOfficeKitClass, documentLoad)); + CPPUNIT_ASSERT_EQUAL(classOffset(2), offsetof(struct _LibreOfficeKitClass, getError)); + CPPUNIT_ASSERT_EQUAL(classOffset(3), offsetof(struct _LibreOfficeKitClass, documentLoadWithOptions)); + CPPUNIT_ASSERT_EQUAL(classOffset(4), offsetof(struct _LibreOfficeKitClass, freeError)); + CPPUNIT_ASSERT_EQUAL(classOffset(5), offsetof(struct _LibreOfficeKitClass, registerCallback)); + CPPUNIT_ASSERT_EQUAL(classOffset(6), offsetof(struct _LibreOfficeKitClass, getFilterTypes)); + CPPUNIT_ASSERT_EQUAL(classOffset(7), offsetof(struct _LibreOfficeKitClass, setOptionalFeatures)); + CPPUNIT_ASSERT_EQUAL(classOffset(8), offsetof(struct _LibreOfficeKitClass, setDocumentPassword)); + CPPUNIT_ASSERT_EQUAL(classOffset(9), offsetof(struct _LibreOfficeKitClass, getVersionInfo)); + CPPUNIT_ASSERT_EQUAL(classOffset(10), offsetof(struct _LibreOfficeKitClass, runMacro)); + CPPUNIT_ASSERT_EQUAL(classOffset(11), offsetof(struct _LibreOfficeKitClass, translateGet)); + CPPUNIT_ASSERT_EQUAL(classOffset(12), offsetof(struct _LibreOfficeKitClass, translateNGet)); + CPPUNIT_ASSERT_EQUAL(documentClassOffset(0), offsetof(struct _LibreOfficeKitDocumentClass, destroy)); CPPUNIT_ASSERT_EQUAL(documentClassOffset(1), offsetof(struct _LibreOfficeKitDocumentClass, saveAs)); diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 42a06ce2be6c..2bb9ba95b3fd 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -1423,6 +1423,8 @@ static void lo_setDocumentPassword(LibreOfficeKit* pThis, const char* pPassword); static char* lo_getVersionInfo(LibreOfficeKit* pThis); static int lo_runMacro (LibreOfficeKit* pThis, const char* pURL); +static char* lo_translateGet (LibreOfficeKit *pThis, const char* pId, const char* pPrefixName, const char* pBcp47LanguageTag); +static char* lo_translateNGet (LibreOfficeKit *pThis, const char* pId, int n, const char* pPrefixName, const char* pBcp47LanguageTag); LibLibreOffice_Impl::LibLibreOffice_Impl() : m_pOfficeClass( gOfficeClass.lock() ) @@ -1446,6 +1448,8 @@ LibLibreOffice_Impl::LibLibreOffice_Impl() m_pOfficeClass->setDocumentPassword = lo_setDocumentPassword; m_pOfficeClass->getVersionInfo = lo_getVersionInfo; m_pOfficeClass->runMacro = lo_runMacro; + m_pOfficeClass->translateGet = lo_translateGet; + m_pOfficeClass->translateNGet = lo_translateNGet; gOfficeClass = m_pOfficeClass; } @@ -1673,6 +1677,25 @@ static int lo_runMacro(LibreOfficeKit* pThis, const char *pURL) return false; } +static char* lo_translateGet(LibreOfficeKit *, const char* pId, const char* pPrefixName, const char* pBcp47LanguageTag) +{ + LanguageTag tag(OUString::fromUtf8(pBcp47LanguageTag)); + std::locale locale = Translate::Create(pPrefixName, tag); + OUString result = Translate::get(pId, locale); + + return strdup(result.toUtf8().getStr()); +} + +static char* lo_translateNGet(LibreOfficeKit *, const char* pId, int, const char* pPrefixName, const char* pBcp47LanguageTag) +{ + LanguageTag tag(OUString::fromUtf8(pBcp47LanguageTag)); + std::locale locale = Translate::Create(pPrefixName, tag); + // In this branch there is no Translate::nget(). + OUString result = Translate::get(pId, locale); + + return strdup(result.toUtf8().getStr()); +} + static void lo_registerCallback (LibreOfficeKit* pThis, LibreOfficeKitCallback pCallback, void* pData) diff --git a/include/LibreOfficeKit/LibreOfficeKit.h b/include/LibreOfficeKit/LibreOfficeKit.h index 0581513d7701..583e5b7f23d7 100644 --- a/include/LibreOfficeKit/LibreOfficeKit.h +++ b/include/LibreOfficeKit/LibreOfficeKit.h @@ -94,6 +94,16 @@ struct _LibreOfficeKitClass @since LibreOffice 6.0 */ int (*runMacro) (LibreOfficeKit *pThis, const char* pURL); + + /** @see lok::Office::translateGet(). + @since LibreOffice 6.3 + */ + char* (*translateGet) (LibreOfficeKit *pThis, const char* pId, const char* pPrefixName, const char* pBcp47LanguageTag); + + /** @see lok::Office::translateNGet(). + @since LibreOffice 6.3 + */ + char* (*translateNGet) (LibreOfficeKit *pThis, const char* pId, int n, const char* pPrefixName, const char* pBcp47LanguageTag); }; #define LIBREOFFICEKIT_DOCUMENT_HAS(pDoc,member) LIBREOFFICEKIT_HAS_MEMBER(LibreOfficeKitDocumentClass,member,(pDoc)->pClass->nSize) diff --git a/include/LibreOfficeKit/LibreOfficeKit.hxx b/include/LibreOfficeKit/LibreOfficeKit.hxx index ffcb87f4e5d0..f0e77bdb40ec 100644 --- a/include/LibreOfficeKit/LibreOfficeKit.hxx +++ b/include/LibreOfficeKit/LibreOfficeKit.hxx @@ -763,6 +763,35 @@ public: { return mpThis->pClass->runMacro( mpThis, pURL ); } + + /** + * Fetch translation for a string. + * + * @since LibreOffice 6.3 + * @returns the translated string, if available + * @param pId the context and string, separated by a '\004' character + * @param pPrefixName the prefix passed to Translate::Create() + * @param pBcp47LanguageTag the locale into which the string should be translated + */ + char* translateGet( const char* pId, const char* pPrefixName, const char* pBcp47LanguageTag ) + { + return mpThis->pClass->translateGet( mpThis, pId, pPrefixName, pBcp47LanguageTag ); + } + + /** + * In this branch this is equivalent to translateGet(). + * + * @since LibreOffice 6.3 + * @returns the translated string, if available + * @param pId the context and string, separated by a '\004' character + * @param n Ignored in this branch + * @param pPrefixName the prefix passed to Translate::Create() + * @param pBcp47LanguageTag the locale into which the string should be translated + */ + char* translateNGet( const char* pId, int n, const char* pPrefixName, const char* pBcp47LanguageTag ) + { + return mpThis->pClass->translateNGet( mpThis, pId, n, pPrefixName, pBcp47LanguageTag ); + } }; /// Factory method to create a lok::Office instance. _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits