Rename to Looper

This commit is contained in:
Zachary Hall 2024-01-21 15:21:18 -08:00
parent 893cd8f9d4
commit ad7f2ae105
11 changed files with 22 additions and 613 deletions

View file

@ -10,7 +10,7 @@
#include <SDL_video.h>
#include <string>
#include "theme.h"
static const char* NAME = "Neko Player";
static const char* NAME = "Looper";
class RendererBackend {
public:
double scale = 1.0;
@ -39,4 +39,4 @@ class RendererBackend {
void GetWindowsize(int *w, int *h);
RendererBackend();
~RendererBackend();
};
};

View file

@ -1,10 +1,10 @@
[Desktop Entry]
Type=Application
Name=Neko Player
Name=Looper
Comment=An audio player that can properly loop audio files
GenericName=Looping audio player
Exec=neko-player %f
Icon=neko-player
Exec=looper %f
Icon=looper
MimeType=audio/x-wav;audio/ogg;audio/x-vorbis+ogg;audio/x-opus+ogg;audio/mpeg;audio/flac;audio/xm;audio/x-mod;
StartupWMClass=neko-player
StartupWMClass=looper
Categories=Audio;AudioVideo;

View file

@ -1,585 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# ,fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Neko Player\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-25 14:02-0700\n"
"PO-Revision-Date: 2023-07-25 14:22-0700\n"
"Last-Translator: \n"
"Language-Team: None\n"
"Language: ja_JP\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 3.3.2\n"
"X-Poedit-KeywordsList: _TR;_TRS;_TRIS:2;_TRI:2;_TR_CTX:1c,2;_TRS_CTX:1c,2;"
"_TRIS_CTX:2c,3;_TRI_CTX:2c,3\n"
"X-Poedit-Basepath: ../..\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-SearchPath-0: theme.cpp\n"
"X-Poedit-SearchPath-1: main.cpp\n"
#: main.cpp:120
msgctxt "Language name"
msgid "English (United States)"
msgstr "Japanese (Japan)"
#: main.cpp:292
msgctxt "Built-in themes | Theme default strings | name"
msgid "(built-in)"
msgstr "(内蔵)"
#: main.cpp:296
msgctxt "Built-in light theme | Theme default strings | name"
msgid "Default light"
msgstr "デフォルトのライト"
#: main.cpp:304
msgctxt "Built-in dark theme | Theme default strings | name"
msgid "Default dark"
msgstr "デフォルトの暗い"
#: main.cpp:368
msgctxt "Main menu"
msgid "File"
msgstr "ファイル"
#: main.cpp:369
msgctxt "Main menu | File"
msgid "Open"
msgstr "開ける"
#: main.cpp:371
msgctxt "File dialog title"
msgid "Open..."
msgstr "開ける..."
#: main.cpp:372
msgctxt "File dialog filter name"
msgid "Audio files"
msgstr "オーディオファイル"
#: main.cpp:375
msgctxt "Main menu | File"
msgid "Quit"
msgstr "辞める"
#: main.cpp:380
msgctxt "Main menu"
msgid "Edit"
msgstr "編集"
#: main.cpp:381
msgctxt "Main menu | Edit"
msgid "Preferences..."
msgstr "設定..."
#: main.cpp:387
msgctxt "Main menu (in debug builds)"
msgid "Debug"
msgstr "デバッグ"
#: main.cpp:388
msgctxt "Main menu | Debug"
msgid "Show ImGui Demo Window"
msgstr "デモウィンドウを表示"
#: main.cpp:394
msgctxt "Main menu"
msgid "Help"
msgstr "ヘルプ"
#: main.cpp:395
msgctxt "Main menu | Help"
msgid "About"
msgstr "に関しては"
#: main.cpp:403
msgctxt "Main window title"
msgid "Player"
msgstr "プレーヤー"
#: main.cpp:432
#, c-format
msgctxt "Playback controls | slider"
msgid "Speed: %.2fx"
msgstr "速度: %.2fx"
#: main.cpp:436
#, c-format
msgctxt "Playback controls | slider"
msgid "Tempo: %.2fx"
msgstr "テン: %.2fx"
#: main.cpp:440
#, c-format
msgctxt "Playback controls | slider"
msgid "Pitch: %.2fx"
msgstr "ピッチ: %.2fx"
#: main.cpp:448
msgctxt "Window title, window opened by menu item"
msgid "Preferences..."
msgstr "設定..."
#: main.cpp:450
msgctxt "Preference | VSync checkbox"
msgid "Enable VSync"
msgstr "VSync を有効にする"
#: main.cpp:455
#, c-format
msgctxt "Preferences | Framerate slider"
msgid "Max framerate without VSync: %d"
msgstr "最大フレームレート: %d"
#: main.cpp:456
msgctxt "Preference | Related non-preference button"
msgid "Theme Editor"
msgstr "テーマエディタ"
#: main.cpp:460
msgctxt "Preference | override enable checkbox"
msgid "Override language"
msgstr "言語を上書きする"
#: main.cpp:476
msgctxt "Preference | Theme selector | Filter label"
msgid "Filter:"
msgstr "フィルター:"
#: main.cpp:479
msgctxt "Preferences | Theme selector | Selector label"
msgid "Select a theme..."
msgstr "テーマを選択する..."
#: main.cpp:516
#, c-format
msgctxt ""
"Preference | Accent hue slider, range 0-360 from HSV algorithm hue component"
msgid "Accent color hue: %.0f°"
msgstr "アクセントカラーの色相: %.0f°"
#: main.cpp:524
msgctxt "Window title, window opened by menu item"
msgid "About and Licenses"
msgstr "ライセンスについて"
#: main.cpp:526
msgctxt ""
"Application name - Japanese word should remain Japanese and stay the same "
"when translating for stylistic purposes."
msgid "ねこ Player"
msgstr "ねこ プレーヤー"
#: main.cpp:530
msgctxt ""
"Application name - Japanese word should be converted to the translated "
"language's characters. Use a string with only a single underscore to disable "
"for Japanese."
msgid "(Neko Player)"
msgstr "_"
#: main.cpp:535
msgctxt "Version string format specifier"
msgid "Version "
msgstr "バージョン "
#: main.cpp:535
msgctxt "Suffix to the version string in the about window, if needed"
msgid " "
msgstr ""
#: main.cpp:541
msgctxt "Library name"
msgid "SDL Mixer X"
msgstr "SDL Mixer X"
#: main.cpp:542
msgctxt "Library name"
msgid "JsonCpp"
msgstr "JsonCpp"
#: main.cpp:543
msgctxt "Library name"
msgid "SoundTouch"
msgstr "SoundTouch"
#: main.cpp:544
msgctxt "Library name"
msgid "libintl"
msgstr "libintl"
#: main.cpp:545
msgctxt "Library name"
msgid "Dear ImGui"
msgstr "Dear ImGui"
#: main.cpp:546
msgctxt "Library name"
msgid "imgui-filebrowser"
msgstr "imgui-filebrowser"
#: main.cpp:548
msgctxt "Library name"
msgid "libportal"
msgstr "libportal"
#: main.cpp:550
msgctxt "Library name"
msgid "Noto Sans"
msgstr "Noto Sans"
#: main.cpp:551
msgctxt "Library name"
msgid "Fork Awesome"
msgstr "Fork Awesome"
#: main.cpp:552
msgctxt "Library name"
msgid "IconFontCppHeaders"
msgstr "IconFontCppHeaders"
#: main.cpp:577
msgctxt "Project selector label."
msgid "Project"
msgstr "プロジェクト"
#: main.cpp:592
msgctxt "License viewer label"
msgid "License"
msgstr "ライセンス"
#: main.cpp:595
#, c-format
msgctxt ""
"License viewer | information above license - string 1: selected project, "
"string 2: SPDX license identifier"
msgid "%s: %s"
msgstr "%s: %s"
#: theme.cpp:39
msgctxt "Window title"
msgid "Theme Editor"
msgstr "テーマエディタ"
#: theme.cpp:43
msgctxt "Theme Editor | preset button"
msgid "Create light"
msgstr "ライトテーマを作成する"
#: theme.cpp:52
msgctxt "Theme Editor | preset button"
msgid "Create dark"
msgstr "ダークテーマを作成する"
#: theme.cpp:60
msgctxt "Theme Editor | import button. Opens the theme import file dialog"
msgid "Import..."
msgstr "インポート..."
#: theme.cpp:61
msgctxt "Theme Editor file dialog title"
msgid "Import theme..."
msgstr "テーマのインポート..."
#: theme.cpp:62 theme.cpp:76
msgctxt "Theme Editor file dialog filter name"
msgid "Theme JSON files"
msgstr "テーマの JSON ファイル"
#: theme.cpp:74
msgctxt "Theme Editor | export button. Opens the theme export file dialog"
msgid "Export..."
msgstr "テーマをエクス..."
#: theme.cpp:75
msgctxt "Theme Editor file dialog title"
msgid "Export theme..."
msgstr "テーマをエクスポート..."
#: theme.cpp:98
msgctxt "Theme Editor | button. Reverts to saved file."
msgid "Revert"
msgstr "元に戻す"
#: theme.cpp:107
msgctxt ""
"Theme Editor | button. Saves the theme to it's current location. Not shown "
"when it doesn't already have one."
msgid "Save"
msgstr "保存"
#: theme.cpp:111
msgctxt ""
"Theme Editor | button. Opens the theme loading dialog for themes created or "
"imported by the user."
msgid "Load..."
msgstr "オープン..."
#: theme.cpp:115
msgctxt ""
"Theme Editor | button. Opens the theme saving dialog for themes created or "
"imported by the user."
msgid "Save as..."
msgstr "に名前を付けて保存..."
#: theme.cpp:120
msgctxt "Theme Editor | slider. Simplified frame rounding."
msgid "Frame Rounding"
msgstr "フレームの丸め"
#: theme.cpp:122
msgctxt "Theme Editor | checkbox"
msgid "Window Border"
msgstr "ウィンドウの境界線"
#: theme.cpp:124
msgctxt "Theme Editor | checkbox"
msgid "Frame Border"
msgstr "フレームの境界線"
#: theme.cpp:126
msgctxt "Theme Editor | checkbox"
msgid "Popup Border"
msgstr "ポップアップウィンドウの境界線"
#: theme.cpp:132
msgctxt "Theme Editor | Tab label"
msgid "Strings"
msgstr "ストリングス"
#: theme.cpp:134
msgctxt "Theme Editor | Strings | Name input label"
msgid "Name"
msgstr "名前"
#: theme.cpp:135
msgctxt "Theme Editor | Strings | Description input label"
msgid "Description"
msgstr "形容"
#: theme.cpp:139
msgctxt "Theme Editor | Tab label"
msgid "Sizes"
msgstr "サイズ"
#: theme.cpp:141
msgctxt "Theme Editor | Sizes | Section label"
msgid "Sizing"
msgstr "サイズ"
#: theme.cpp:142
msgctxt "Theme Editor | Sizes | Sizing | label of XY sliders"
msgid "Window Padding"
msgstr "ウィンドウのパディング"
#: theme.cpp:143
msgctxt "Theme Editor | Sizes | Sizing | label of XY sliders"
msgid "Frame Padding"
msgstr "フレームのパディング"
#: theme.cpp:144
msgctxt "Theme Editor | Sizes | Sizing | label of XY sliders"
msgid "Cell Padding"
msgstr "セルの余白"
#: theme.cpp:145
msgctxt "Theme Editor | Sizes | Sizing | label of XY sliders"
msgid "Item Spacing"
msgstr "項目の間隔"
#: theme.cpp:146
msgctxt "Theme Editor | Sizes | Sizing | label of XY sliders"
msgid "Inner Item Spacing"
msgstr "項目内の間隔"
#: theme.cpp:149
msgctxt "Theme Editor | Sizes | Sizing | slider label"
msgid "Scrollbar Size"
msgstr "スクロールバーのサイズ"
#: theme.cpp:150
msgctxt "Theme Editor | Sizes | Sizing | slider label"
msgid "Minimum Grabber Size"
msgstr "最小グラバーサイズ"
#: theme.cpp:151
msgctxt "Theme Editor | Sizes | Sizing | label of XY sliders"
msgid "Separator Text Padding"
msgstr "区切りテキストの余白"
#: theme.cpp:153
msgctxt "Theme Editor | Sizes | Section label"
msgid "Borders"
msgstr "国境"
#: theme.cpp:154
msgctxt "Theme Editor | Sizes | Borders | slider label"
msgid "Window Border Size"
msgstr "ウィンドウの境界線のサイズ"
#: theme.cpp:155
msgctxt "Theme Editor | Sizes | Borders | slider label"
msgid "Child Border Size"
msgstr "子ウィンドウの境界線のサイズ"
#: theme.cpp:156
msgctxt "Theme Editor | Sizes | Borders | slider label"
msgid "Popup Border Size"
msgstr "ポップアップウィンドウの境界線のサイズ"
#: theme.cpp:157
msgctxt "Theme Editor | Sizes | Borders | slider label"
msgid "Frame Border Size"
msgstr "枠線サイズ"
#: theme.cpp:158
msgctxt "Theme Editor | Sizes | Borders | slider label"
msgid "Tab Border Size"
msgstr "タブの境界線のサイズ"
#: theme.cpp:159
msgctxt "Theme Editor | Sizes | Borders | slider label"
msgid "Separator Text Border Size"
msgstr "区切りテキストの境界線のサイズ"
#: theme.cpp:161
msgctxt "Theme Editor | Sizes | Section label"
msgid "Rounding"
msgstr "丸め"
#: theme.cpp:162
msgctxt "Theme Editor | Sizes | Rounding | slider label"
msgid "Window Rounding"
msgstr "ウィンドウの丸め"
#: theme.cpp:163
msgctxt "Theme Editor | Sizes | Rounding | slider label"
msgid "Child Rounding"
msgstr "子ウィンドウの丸め"
#: theme.cpp:164
msgctxt "Theme Editor | Sizes | Rounding | slider label"
msgid "Frame Rounding"
msgstr "フレームの丸め"
#: theme.cpp:165
msgctxt "Theme Editor | Sizes | Rounding | slider label"
msgid "Popup Rounding"
msgstr "ポップアップウィンドウの丸め"
#: theme.cpp:166
msgctxt "Theme Editor | Sizes | Rounding | slider label"
msgid "Scrollbar Rounding"
msgstr "スクロールバーの丸め"
#: theme.cpp:167
msgctxt "Theme Editor | Sizes | Rounding | slider label"
msgid "Grabber Rounding"
msgstr "グラバー丸め"
#: theme.cpp:168
msgctxt "Theme Editor | Sizes | Rounding | slider label"
msgid "Tab Rounding"
msgstr "タブの丸め"
#: theme.cpp:173
msgctxt "Theme Editor | Tab label"
msgid "Colors"
msgstr "色"
#: theme.cpp:177
msgctxt "Theme Editor | Colors | text filter"
msgid "Filter colors"
msgstr "フィルターの色"
#: theme.cpp:180
msgctxt "Theme Editor | Colors | preview settings radio button"
msgid "Opaque"
msgstr "オペーク"
#: theme.cpp:181
msgctxt "Theme Editor | Colors | preview settings radio button"
msgid "Alpha"
msgstr "アルファ"
#: theme.cpp:182
msgctxt "Theme Editor | Colors | preview settings radio button"
msgid "Both"
msgstr "両方とも"
#: theme.cpp:193
msgctxt "Theme Editor | Colors | (Any color) | recoloring checkbox"
msgid "Match hue preference"
msgstr "色相設定の一致"
#: theme.cpp:230 theme.cpp:233
msgctxt "Theme Editor | Custom modal dialog title"
msgid "Load..."
msgstr "オープン..."
#: theme.cpp:236
msgctxt "Theme Editor | Load dialog | Theme selector | filter label"
msgid "Filter:"
msgstr "フィルター:"
#: theme.cpp:239
msgctxt "Theme Editor | Load dialog | Theme selector | label"
msgid "Available themes..."
msgstr "利用可能なテーマ..."
#: theme.cpp:255
msgctxt "Theme Editor | Load dialog | Load button"
msgid "Load"
msgstr "負荷"
#: theme.cpp:267
msgctxt "Theme Editor | Load dialog | Cancel button"
msgid "Cancel"
msgstr "キャンセル"
#: theme.cpp:276 theme.cpp:279
msgctxt "Theme Editor | Custom modal dialog title"
msgid "Save as..."
msgstr "に名前を付けて保存..."
#: theme.cpp:282
msgctxt "Theme Editor | Save as dialog | Theme selector | filter label"
msgid "Filter:"
msgstr "フィルター:"
#: theme.cpp:285
msgctxt "Theme Editor | Save as dialog | Theme selector | label"
msgid "Available themes..."
msgstr "利用可能なテーマ..."
#: theme.cpp:302
msgctxt "Theme Editor | Save as dialog | Theme name input label"
msgid "Theme name: "
msgstr "テーマ名: "
#: theme.cpp:303
msgctxt "Theme Editor | Save as dialog | Save button"
msgid "Save"
msgstr "保存"
#: theme.cpp:314
msgctxt "Theme Editor | Save as dialog | Cancel button"
msgid "Cancel"
msgstr "キャンセル"
#: theme.cpp:473
msgctxt "Theme default strings | name"
msgid "A theme"
msgstr "テーマ"
#: theme.cpp:474
msgctxt "Theme default strings | description"
msgid "(No description)"
msgstr "(説明なし)"

View file

@ -25,7 +25,7 @@ done
add_base85 'icon.png' 'icon'
add_basic 'Noto_Sans/OFL.txt' 'notosans_license'
add_basic 'Noto_Sans_JP/OFL.txt' 'notosansjp_license'
add_basic '../LICENSE' 'nekoplayer_license'
add_basic '../LICENSE' 'looper_license'
add_basic '../subprojects/jsoncpp/LICENSE' 'jsoncpp_license'
add_basic '../subprojects/SDL-Mixer-X/COPYING.txt' 'sdl_mixer_x_license'
add_basic '../imgui-filebrowser/LICENSE' 'imgui_filebrowser_license'
@ -42,4 +42,4 @@ for i in "${ASSETS[@]}"; do
echo "#include \"$i\"" >> 'assets.h'
done
rm btcc
popd
popd

View file

@ -37,7 +37,7 @@ string TimeToString(double time_code, uint8_t min_components = 1) {
}
void MainLoop::Init() {
#ifdef PORTALS
g_set_application_name("Neko Player");
g_set_application_name("Looper");
#endif
// Our state
show_demo_window = false;
@ -95,8 +95,8 @@ void MainLoop::Init() {
stream.close();
}
if (is_empty(Theme::themeDir)) {
path lightPath = Theme::themeDir / "light.json";
path darkPath = Theme::themeDir / "dark.json";
path lightPath = Theme::themeDir / "light.toml";
path darkPath = Theme::themeDir / "dark.toml";
string builtinDescription = _TRS_CTX("Built-in themes | Theme default strings | name", "(built-in)");
if (!exists(lightPath)) {
Theme light(false);
@ -308,15 +308,10 @@ void MainLoop::GuiFunction() {
ImGui::SetNextWindowDockID(dockid);
if (ImGui::Begin(_TRI_CTX(ICON_FK_INFO, "Window title, window opened by menu item", "About and Licenses"), &about_window)) {
ImGui::PushFont(title);
static const string APP_NAME_STR = _TR_CTX("Application name - Japanese word should remain Japanese and stay the same when translating for stylistic purposes.", "ねこ Player");
static const string APP_NAME_STR = _TR_CTX("Application name.", "Looper");
ImGui::SetCursorPosX((ImGui::GetWindowWidth() - ImGui::GetFont()->CalcTextSizeA(ImGui::GetFontSize(), FLT_MAX, 0.0f, APP_NAME_STR.c_str()).x) / 2.0f);
ImGui::Text(APP_NAME_STR.c_str());
ImGui::PopFont();
static const string APP_NAME_ROMANIZED = _TR_CTX("Application name - Japanese word should be converted to the translated language's characters. Use a string with only a single underscore to disable for Japanese.", "(Neko Player)");
if (APP_NAME_ROMANIZED != "_") {
ImGui::SetCursorPosX((ImGui::GetWindowWidth() - ImGui::GetFont()->CalcTextSizeA(ImGui::GetFontSize(), FLT_MAX, 0.0f, APP_NAME_ROMANIZED.c_str()).x) / 2.0f);
ImGui::Text(APP_NAME_ROMANIZED.c_str());
}
static const string VER_STRING = _TR_CTX("Version string format specifier", "Version ") + string(TAG) + _TRS_CTX("Suffix to the version string in the about window, if needed", " ");
ImGui::SetCursorPosX((ImGui::GetWindowWidth() - ImGui::GetFont()->CalcTextSizeA(ImGui::GetFontSize(), FLT_MAX, 0.0f, VER_STRING.c_str()).x) / 2.0f);
ImGui::Text(VER_STRING.c_str());
@ -343,7 +338,7 @@ void MainLoop::GuiFunction() {
{
int i = 0;
// Use a variable instead of hardcoding so that a #ifdef can change the indices later on.
LOAD_LICENSE(projects[i], nekoplayer); i++;
LOAD_LICENSE(projects[i], looper); i++;
LOAD_LICENSE(projects[i], sdl_mixer_x); i++;
LOAD_LICENSE(projects[i], cli11); i++;
LOAD_LICENSE(projects[i], jsoncpp); i++;

View file

@ -1,4 +1,4 @@
project('neko-player', ['c', 'cpp'],
project('looper', ['c', 'cpp'],
version : '0.1',
default_options : ['warning_level=3',
'cpp_std=c++20'])
@ -62,7 +62,6 @@ if get_option('portals') and target_machine.system() == 'linux'
endif
srcs = [
'IconSet.cpp',
'main.cpp',
'RendererBackend.cpp',
'playback.cpp',
@ -90,7 +89,7 @@ include_dirs = [
res = run_command('./assets/update-assets.sh', check: true)
# Validate MetaInfo file
metainfo_file = '/path/to/com.experimentalcraft.NekoPlayer.metainfo.xml'
metainfo_file = './assets/com.experimentalcraft.Looper.metainfo.xml'
ascli_exe = find_program('appstreamcli', required: false)
if ascli_exe.found()
test('validate metainfo file',
@ -101,11 +100,11 @@ if ascli_exe.found()
metainfo_file]
)
endif
install_data('assets/icon.svg', rename: 'neko-player', install_dir: 'share/icons/hicolor/scalable/apps/')
install_data('assets/neko-player.desktop', install_dir: 'share/applications')
install_data('assets/com.experimentalcraft.NekoPlayer.metainfo.xml', install_dir: 'share/metainfo')
install_subdir('assets/translations/', exclude_files: 'neko_player.pot', strip_directory: true, install_dir: get_option('localedir'))
exe = executable('neko-player', srcs,
install_data('assets/icon.svg', rename: 'looper.svg', install_dir: 'share/icons/hicolor/scalable/apps/')
install_data('assets/looper.desktop', install_dir: 'share/applications')
install_data('assets/com.experimentalcraft.Looper.metainfo.xml', install_dir: 'share/metainfo')
install_subdir('assets/translations/', exclude_files: 'looper.pot', strip_directory: true, install_dir: get_option('localedir'))
exe = executable('looper', srcs,
dependencies: deps,
include_directories: include_dirs,
install : true,

View file

@ -60,7 +60,7 @@ bool Theme::ShowEditor(bool* open, Theme* &theme, ImGuiID dockid, int window_wid
}
if (ImGui::Button(_TR_CTX("Theme Editor | import button. Opens the theme import file dialog", "Import..."), buttonSize)) {
importDialog.SetTitle(_TR_CTX("Theme Editor file dialog title", "Import theme..."));
importDialog.SetTypeFilters(_TR_CTX("Theme Editor file dialog filter name", "Theme JSON files"), { ".json"});
importDialog.SetTypeFilters(_TR_CTX("Theme Editor file dialog filter name", "Theme JSON files"), { ".toml"});
std::string userdir = std::getenv(
#ifdef _WIN32
"UserProfile"
@ -74,7 +74,7 @@ bool Theme::ShowEditor(bool* open, Theme* &theme, ImGuiID dockid, int window_wid
ImGui::SameLine();
if (ImGui::Button(_TR_CTX("Theme Editor | export button. Opens the theme export file dialog", "Export..."), buttonSize)) {
exportDialog.SetTitle(_TR_CTX("Theme Editor file dialog title", "Export theme..."));
exportDialog.SetTypeFilters(_TR_CTX("Theme Editor file dialog filter name", "Theme JSON files"), { ".json"});
exportDialog.SetTypeFilters(_TR_CTX("Theme Editor file dialog filter name", "Theme JSON files"), { ".toml"});
std::string userdir = std::getenv(
#ifdef _WIN32
"UserProfile"