Add a localisation API to LibreOfficeKitClass
Combines the LanguageTag::Create() and Translate::get() (or nget()) functionality. Also add an ABI test for the Kit class in the LibreOfficeKit unit test, and a test for the translation function. Change-Id: I78c48a8bbb434d6f204869290822830288022a53 Reviewed-on: https://gerrit.libreoffice.org/64882 Tested-by: Jenkins Reviewed-by: Tor Lillqvist <tml@collabora.com>
This commit is contained in:
@@ -33,6 +33,7 @@
|
||||
#include <osl/conditn.hxx>
|
||||
#include <osl/thread.hxx>
|
||||
#include <svl/srchitem.hxx>
|
||||
#include <svtools/strings.hrc>
|
||||
#include <LibreOfficeKit/LibreOfficeKitEnums.h>
|
||||
#include <unotools/tempfile.hxx>
|
||||
#include <sfx2/viewsh.hxx>
|
||||
@@ -118,6 +119,7 @@ public:
|
||||
void testCommentsImpress();
|
||||
void testCommentsCallbacksWriter();
|
||||
void testRunMacro();
|
||||
void testTranslate();
|
||||
void testExtractParameter();
|
||||
void testGetSignatureState_NonSigned();
|
||||
void testGetSignatureState_Signed();
|
||||
@@ -165,6 +167,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);
|
||||
@@ -2219,6 +2222,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();
|
||||
@@ -2463,6 +2480,11 @@ void DesktopLOKTest::testInsertCertificatePEM()
|
||||
|
||||
namespace {
|
||||
|
||||
constexpr size_t classOffset(int i)
|
||||
{
|
||||
return sizeof(static_cast<struct _LibreOfficeKitClass*>(nullptr)->nSize) + i * sizeof(void*);
|
||||
}
|
||||
|
||||
constexpr size_t documentClassOffset(int i)
|
||||
{
|
||||
return sizeof(static_cast<struct _LibreOfficeKitDocumentClass*>(nullptr)->nSize) + i * sizeof(void*);
|
||||
@@ -2473,6 +2495,21 @@ constexpr 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));
|
||||
|
||||
|
||||
@@ -1422,6 +1422,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() )
|
||||
@@ -1445,6 +1447,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;
|
||||
}
|
||||
@@ -1672,6 +1676,24 @@ 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 n, const char* pPrefixName, const char* pBcp47LanguageTag)
|
||||
{
|
||||
LanguageTag tag(OUString::fromUtf8(pBcp47LanguageTag));
|
||||
std::locale locale = Translate::Create(pPrefixName, tag);
|
||||
OUString result = Translate::nget(pId, n, locale);
|
||||
|
||||
return strdup(result.toUtf8().getStr());
|
||||
}
|
||||
|
||||
static void lo_registerCallback (LibreOfficeKit* pThis,
|
||||
LibreOfficeKitCallback pCallback,
|
||||
void* pData)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -791,6 +791,29 @@ 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 );
|
||||
|
||||
/**
|
||||
* Fetch translation for a string corresponding to a specific number of something.
|
||||
*
|
||||
* @since LibreOffice 6.3
|
||||
* @returns the translated string, if available
|
||||
* @param pId the context and string, separated by a '\004' character
|
||||
* @param n the number
|
||||
* @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 );
|
||||
};
|
||||
|
||||
/// Factory method to create a lok::Office instance.
|
||||
|
||||
Reference in New Issue
Block a user