std::shared_ptr<ustringtools::UCollator> getUCollator()
{
vehiclevariants::LanguageCollation languageCollation = vehiclevariants::VehicleVariants().getCollateRule();
DLT_LOG_CXX(browserContext, DLT_LOG_INFO, "LanguageCollation id:", static_cast<int32_t>(languageCollation));
std::vector<int32_t> baseOrderRules(BASE_ORDER_RULES.begin(), BASE_ORDER_RULES.end());
baseOrderRules.insert(languageCollation == vehiclevariants::LanguageCollation::COLLATE_JAPANESE_FIRST
? baseOrderRules.begin()
: baseOrderRules.end(),
JP_ORDER_RULES.begin(),
JP_ORDER_RULES.end());
// Set the following group order
static const std::vector<int32_t> REORDER_RULES(baseOrderRules.begin(), baseOrderRules.end());
static std::once_flag flagToCreateCollatorObject;
static auto ucollator = ustringtools::UCollator::createRuleBasedCollator(std::string(COLLATION_RULES));
static bool SortObjectConfigured = false;
std::call_once(flagToCreateCollatorObject, [](){ /* 此处使用了labma表达式 */
if (ucollator == nullptr)
{
DLT_LOG_CXX(browserContext, DLT_LOG_ERROR, "ERROR! Object Collator was not created. m_ucollator = nullptr");
return;
}
DLT_LOG_CXX(browserContext, DLT_LOG_INFO, "=*= Object Collator was created.");
if ((ucollator->setReorderCodesProperty(REORDER_RULES)) != true)
{
DLT_LOG_CXX(browserContext, DLT_LOG_ERROR, "ERROR! Object Collator reorder group was not set");
return;
}
DLT_LOG_CXX(browserContext, DLT_LOG_INFO, "=*= Reorder group was set for Object Collator.");
// Set sorting order like "Name_99 Name_100 Name_101"
if ((ucollator->setCollationAttribute(UCOL_NUMERIC_COLLATION, UCOL_ON)) != true)
{
DLT_LOG_CXX(browserContext, DLT_LOG_ERROR, "ERROR! Object Collator. Property numeric was not set");
return;
}
DLT_LOG_CXX(browserContext, DLT_LOG_INFO, "=*= Object Collator was parametrizied.");
SortObjectConfigured = true;
});
if (SortObjectConfigured)
{
return ucollator;
}
else
{
return nullptr;
}
}