diff --git a/src/im/keyboard/keyboard.cpp b/src/im/keyboard/keyboard.cpp index 2ae19409..baa200c0 100644 --- a/src/im/keyboard/keyboard.cpp +++ b/src/im/keyboard/keyboard.cpp @@ -253,8 +253,7 @@ std::vector KeyboardEngine::listInputMethods() { auto language = findBestLanguage(isoCodes, layoutInfo.description, layoutInfo.languages); auto description = - formatUnchecked(_("Keyboard - {0}"), - D_("xkeyboard-config", layoutInfo.description)); + _("Keyboard - {0}", D_("xkeyboard-config", layoutInfo.description)); auto uniqueName = imNamePrefix + layoutInfo.name; if (uniqueName == "keyboard-us") { usExists = true; @@ -271,10 +270,10 @@ std::vector KeyboardEngine::listInputMethods() { !variantInfo.languages.empty() ? variantInfo.languages : layoutInfo.languages); - auto description = formatUnchecked( - _("Keyboard - {0} - {1}"), - D_("xkeyboard-config", layoutInfo.description), - D_("xkeyboard-config", variantInfo.description)); + auto description = + _("Keyboard - {0} - {1}", + D_("xkeyboard-config", layoutInfo.description), + D_("xkeyboard-config", variantInfo.description)); auto uniqueName = stringutils::concat(imNamePrefix, layoutInfo.name, "-", variantInfo.name); @@ -311,13 +310,12 @@ std::vector KeyboardEngine::listInputMethods() { if (uniqueName == "keyboard-us") { usExists = true; } - result.push_back(std::move( - InputMethodEntry( - uniqueName, - formatUnchecked(_("{0} (Not Available)"), *desc), *lang, - "keyboard") - .setLabel(*label) - .setIcon("input-keyboard"))); + result.push_back( + std::move(InputMethodEntry(uniqueName, + _("{0} (Not Available)", *desc), + *lang, "keyboard") + .setLabel(*label) + .setIcon("input-keyboard"))); } } } else { diff --git a/src/lib/fcitx-utils/i18n.h b/src/lib/fcitx-utils/i18n.h index 1f07f55c..5dd1fe0a 100644 --- a/src/lib/fcitx-utils/i18n.h +++ b/src/lib/fcitx-utils/i18n.h @@ -8,7 +8,11 @@ #define _FCITX_UTILS_I18N_H_ #include +#include #include +#if __cplusplus >= 202002L +#include +#endif namespace fcitx { @@ -28,19 +32,54 @@ translateDomainCtx(const char *domain, const char *ctx, const std::string &s); FCITXUTILS_EXPORT const char * translateDomainCtx(const char *domain, const char *ctx, const char *s); FCITXUTILS_EXPORT void registerDomain(const char *domain, const char *dir); + +#if __cplusplus >= 202002L +template +auto translate(std::format_string s, Args &&...args) + -> std::enable_if_t<(sizeof...(Args) >= 1), std::string> { + return std::vformat(translate(std::string(s.get())), + std::make_format_args(args...)); +} + +template +auto translateCtx(const char *ctx, std::format_string s, + Args &&...args) + -> std::enable_if_t<(sizeof...(Args) >= 1), std::string> { + return std::vformat(translateCtx(ctx, std::string(s.get())), + std::make_format_args(args...)); +} + +template +auto translateDomain(const char *domain, std::format_string s, + Args &&...args) + -> std::enable_if_t<(sizeof...(Args) >= 1), std::string> { + return std::vformat(translateDomain(domain, std::string(s.get())), + std::make_format_args(args...)); +} + +template +auto translateDomainCtx(const char *domain, const char *ctx, + std::format_string s, Args &&...args) + -> std::enable_if_t<(sizeof...(Args) >= 1), std::string> { + return std::vformat(translateDomainCtx(domain, ctx, std::string(s.get())), + std::make_format_args(args...)); +} +#endif + } // namespace fcitx #ifndef FCITX_NO_I18N_MACRO #ifdef FCITX_GETTEXT_DOMAIN -#define _(x) ::fcitx::translateDomain(FCITX_GETTEXT_DOMAIN, x) -#define C_(c, x) ::fcitx::translateDomainCtx(FCITX_GETTEXT_DOMAIN, c, x) +#define _(...) ::fcitx::translateDomain(FCITX_GETTEXT_DOMAIN, __VA_ARGS__) +#define C_(c, ...) \ + ::fcitx::translateDomainCtx(FCITX_GETTEXT_DOMAIN, c, __VA_ARGS__) #else -#define _(x) ::fcitx::translate(x) -#define C_(c, x) ::fcitx::translateCtx(c, x) +#define _(...) ::fcitx::translate(__VA_ARGS__) +#define C_(c, ...) ::fcitx::translateCtx(c, __VA_ARGS__) #endif -#define D_(d, x) ::fcitx::translateDomain(d, x) +#define D_(d, ...) ::fcitx::translateDomain(d, __VA_ARGS__) #define NC_(c, x) (x) #define N_(x) (x) diff --git a/src/lib/fcitx-utils/misc_p.h b/src/lib/fcitx-utils/misc_p.h index 4f41efc9..71f5da07 100644 --- a/src/lib/fcitx-utils/misc_p.h +++ b/src/lib/fcitx-utils/misc_p.h @@ -23,7 +23,6 @@ #include #include #include -#include #include "config.h" // IWYU pragma: keep #ifdef _WIN32 @@ -339,12 +338,6 @@ static inline uint32_t FromLittleEndian32(const T *d) { return le32toh(t); } -template -FCITX_NODISCARD inline std::string formatUnchecked(std::string_view fmt, - Args &&...args) { - return std::vformat(fmt, std::make_format_args(args...)); -} - } // namespace fcitx #endif // _FCITX_UTILS_MISC_P_H_ diff --git a/src/lib/fcitx/instance.cpp b/src/lib/fcitx/instance.cpp index fed3bfff..cd336b67 100644 --- a/src/lib/fcitx/instance.cpp +++ b/src/lib/fcitx/instance.cpp @@ -374,8 +374,7 @@ void InstancePrivate::buildDefaultGroup() { if (imLayouts.size() == 1) { groupName = _("Default"); } else { - groupName = - formatUnchecked(_("Group {}"), imManager_.groupCount() + 1); + groupName = _("Group {}", imManager_.groupCount() + 1); } imManager_.addEmptyGroup(groupName); groupOrders.push_back(groupName); @@ -421,17 +420,16 @@ void InstancePrivate::showInputMethodInformation(InputContext *ic) { } else if (subMode.empty()) { display = std::move(name); } else { - display = formatUnchecked(_("{0} ({1})"), name, subMode); + display = _("{0} ({1})", name, subMode); } } else if (entry) { - display = formatUnchecked(_("{0} (Not available)"), entry->name()); + display = _("{0} (Not available)", entry->name()); } else { display = _("(Not available)"); } if (!globalConfig_.compactInputMethodInformation() && imManager.groupCount() > 1) { - display = formatUnchecked(_("Group {0}: {1}"), - imManager.currentGroup().name(), display); + display = _("Group {0}: {1}", imManager.currentGroup().name(), display); } inputState->showInputMethodInformation(display); } @@ -467,9 +465,8 @@ void InstancePrivate::navigateGroup(InputContext *ic, const Key &key, notifications_->call( "enumerate-group", _("Input Method"), "input-keyboard", _("Switch group"), - formatUnchecked( - _("Switch group to {0}"), - imManager_.groups()[inputState->pendingGroupIndex_]), + _("Switch group to {0}", + imManager_.groups()[inputState->pendingGroupIndex_]), 3000); } } @@ -697,8 +694,8 @@ Instance::Instance(int argc, char **argv) { d->notifications_->call( "enumerate-group", _("Input Method"), "input-keyboard", _("Switch group"), - formatUnchecked(_("Switched group to {0}"), - d->imManager_.currentGroup().name()), + _("Switched group to {0}", + d->imManager_.currentGroup().name()), 3000); } d->lastGroup_ = newGroup; diff --git a/src/modules/xcb/xcbconnection.cpp b/src/modules/xcb/xcbconnection.cpp index 6b6f8547..b4c1cfe0 100644 --- a/src/modules/xcb/xcbconnection.cpp +++ b/src/modules/xcb/xcbconnection.cpp @@ -563,9 +563,7 @@ void XCBConnection::navigateGroup(const Key &key, bool forward) { parent_->notifications()->call( "enumerate-group", _("Input Method"), "input-keyboard", _("Switch group"), - formatUnchecked(_("Switch group to {0}"), - imManager.groups()[groupIndex_]), - 3000); + _("Switch group to {0}", imManager.groups()[groupIndex_]), 3000); } }