diff --git a/README-JP.md b/README-JP.md new file mode 100644 index 00000000..1e49fbc6 --- /dev/null +++ b/README-JP.md @@ -0,0 +1,40 @@ +[![wakatime](https://wakatime.com/badge/user/f0147aa6-69b8-4142-806c-050d6fee026e/project/68da356a-cd0b-40cb-996c-0799e406179f.svg)](https://wakatime.com/badge/user/f0147aa6-69b8-4142-806c-050d6fee026e/project/68da356a-cd0b-40cb-996c-0799e406179f) +# 毎晩の原神音楽とスカイミュージックへようこそ +このプロジェクトでは、Genshin と Sky Cotl の 2 つの音楽アプリのコードを保存し、公開したアプリを表示できます [specy.app](https://specy.app) +![Composer](docs/assets/composer.webp) +![Player](docs/assets/player.webp) + +# 開発モードでの実行方法 +node.jsコンピュータにインストールする必要があり、 [こちらから](https://nodejs.org/en/)ダウンロードできます. +次に、repoをフォルダーに複製し、`npm i` で依存関係をインストールし、 +インストール後に`npm-run start`で開発サーバーを実行します。 +特定のアプリケーションとして実行したり、特定のアプリケーションとして構築したりできる便利なスクリプトが 4 つあります。 +`npm run dev:sky`または`npm run dev:genshin`を実行すると、 +ゲーム固有のWebアプリが実行され、リソースファイルが交換されます。 + +# 翻訳者募集のお知らせ +アプリを他の言語に翻訳するのを手伝ってくれる人を探しています、興味があれば、[翻訳の議論を見てください](https://github.com/Specy/genshin-music/discussions/52) + +# デスクトップアプリケーションを開発モードで実行する方法 +最初に開発サーバーを起動する必要があります、チュートリアルについてはここを[参照](#how-to-run-in-dev-mode) してください 。 +その後、実行できます `npm run start-tauri` + +# ビルド方法 +スクリプトを使用できます `npm run build:genshin` と `npm run build:sky` 正しいアプリケーションが構築されます, または使用します `npm run build:all` 2 つのプログラムを構築する。 + +# デスクトップアプリケーションを構築する方法 +このアプリケーションは、サンドボックス化されたネットワーク ビューである`tauri`をデスクトップ バンドルとして使用します。 +`npm run build-tauri:genshin` , `npm run build-tauri:sky`, `npm run build-tauri:all`を使用してビルドできます。 +構成は変更ログを許可するように事前に設定されており、署名キーがない場合、ビルドは失敗します。 +変更ログなしでビルドしたい場合は、`src-tauri/tauri.conf.json`ファイルに移動し、`updater`を`false`に設定します。 + +# 材料 +ここでアプリケーションプロファイルを[参照](https://github.com/Specy/genshin-music/wiki)できます +あまり詳しくはありませんが、この形式がどのように機能するかを理解するのに役立つかもしれません。 + +# プロジェクトへの参加方法 +やりたいことを記載した新しい質問を追加し、私が質問を割り当てるまで待ちます。このようにして、問題の修正/追加が効果的かどうかを伝えることもできます。 + +# README.MD +English | 简体中文 | 日本語 + diff --git a/README-TR.md b/README-TR.md new file mode 100644 index 00000000..6e9c1afd --- /dev/null +++ b/README-TR.md @@ -0,0 +1,56 @@ +[![wakatime](https://wakatime.com/badge/user/f0147aa6-69b8-4142-806c-050d6fee026e/project/68da356a-cd0b-40cb-996c-0799e406179f.svg)](https://wakatime.com/badge/user/f0147aa6-69b8-4142-806c-050d6fee026e/project/68da356a-cd0b-40cb-996c-0799e406179f) +# Genshin music ve Sky music nightly'e Hoş geldiniz + +Bu Repository Genshin ve Sky Cotl olmak üzere iki müzik uygulamasının kodlarını içerir, Bu bağlantıdan uygulamaları inceleyebilirsiniz: [specy.app](https://specy.app) + +![Besteleyici](docs/assets/composer.webp) +![Oynatıcı](docs/assets/player.webp) + + +# Çevirilerle ilgili yardıma mı ihtiyacınız var? + +Uygulamamı diğer dillere çevirme konusunda yardımcı olacak kişiler arıyorum, Eğer ilgileniyorsanız [Çeviri tartışmaları bölümüne bakın](https://github.com/Specy/genshin-music/discussions/52) + + + +# Geliştirici modunda nasıl çalıştırılır? +Öncelikle bilgisayarınızda node.js kurulu olması gerekiyor, [buradan indirebilirsiniz](https://nodejs.org/en/), +Sonrasında bu Repository’i bilgisayarınıza indirin, +ve bağımlılıkları `npm i` komutu ile yükleyin. Bağımlılıklar yüklendikten sonra, geliştirme sunucusunu `npm run start` komutu ile çalıştırın. + + +Sizin için kullanışlı olabilecek 4 tane komut bulunmakta, belirli bir uygulama olarak çalıştır ve belirli bir uygulama olarak derle. + +`npm run dev:sky` veya `npm run dev:genshin` komutları GenshinMusic veya SkyMusic için web uygulamalarını çalıştırır veya geçiş yapar + + + +# Geliştirici modunda masaüstü uygulaması olarak nasıl çalıştırılır? +Öncelikle geliştirici sunucusunu başlatmanız gerekiyor, nasıl yapacağınızı [buradan](#how-to-run-in-dev-mode) öğrenin. +Sonrasında `npm run start-tauri` komutunu çalıştırın. + + +# Nasıl derlenir? +Hangisini derlemek istediğinize göre `npm run build:genshin` veya `npm run build:sky` komutunu kullanabilirsiniz, ikisini birden derlemek için `npm run build:all` komutunu kullanın. + + + +# Masaüstü uygulaması olarak nasıl derlenir? + +Çok fazla geliştirilmediği için masaüstü uygulamasını kullanmanızı pek tavsiye etmem, onu formalite icabı yaptım, masaüstü yerine web uygulamasını kullanın. + +Uygulama masaüstü paketlemesi için tauri kullanıyor, bu da bir sanal web görüntüleyicisidir (sandboxed webview). `npm run build-tauri:genshin`, `npm run build-tauri:sky`, `npm run build-tauri:all` komutlarını kullanarak derleyebilirsiniz. Yapılandırma, değişiklik günlüğü için önceden yapılandırılmıştır; eğer bir imza anahtarınız yoksa, derleme başarısız olacaktır. Değişiklik günlüğü olmadan derlemek isterseniz, `src-tauri/tauri.conf.json` dosyasına gidin ve `updater` ayarını false olarak ayarlayın. + + + +# Dökümantasyon +Uygulamanın dökümantasyonuna [buradan](https://github.com/Specy/genshin-music/wiki) ulaşabilirsiniz. + +Çok detaylı olmasa da bazı dosya formatların nasıl çalıştığına dair yardımı dokunabilir. + +# Nasıl Katkıda bulunurum? +Ne üzerinde çalışmak istediğinizi açıklayan yeni bir issue (konu) oluşturun sonra benim konuyu atamamı bekleyin. Bu şekilde, düzeltilecek/eklenecek geçerli bir konu olup olmadığını da iletişim halinde değerlendirebiliriz. + + +# README.MD +English | 简体中文 | 日本語 | Türkçe diff --git a/README-ZH.md b/README-ZH.md index 5f8ef2af..149bb372 100644 --- a/README-ZH.md +++ b/README-ZH.md @@ -10,6 +10,10 @@ 还有4个脚本可能很有用,可以作为特定的应用程序运行,也可以作为特定应用程序构建。 您可以运行 `npm run dev:sky` 或 `npm run dev:genshin` ,这将运行特定游戏的网络应用程序并交换资源文件。 +# 寻找翻译人员 +我正在寻找有人帮助我将我的应用程序翻译成其他语言, +如果您感兴趣,请参照翻译[讨论](https://github.com/Specy/genshin-music/discussions/52) + # 如何在开发模式下运行桌面应用程序 您需要首先启动开发服务器, 教程看 [这](#how-to-run-in-dev-mode) . 然后你可以运行 `npm run start-tauri` @@ -29,5 +33,5 @@ # 如何参与项目 添加一个新的问题,说明你想做什么,然后等待我分配问题。通过这种方式,我们还可以沟通修复/添加问题是否有效。 -# README.md -简体中文|English| +# README.MD +English | 简体中文 | 日本語 diff --git a/README.md b/README.md index 33a6b8fb..6d8272ce 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,41 @@ -[![wakatime](https://wakatime.com/badge/user/f0147aa6-69b8-4142-806c-050d6fee026e/project/68da356a-cd0b-40cb-996c-0799e406179f.svg)](https://wakatime.com/badge/user/f0147aa6-69b8-4142-806c-050d6fee026e/project/68da356a-cd0b-40cb-996c-0799e406179f) -# Welcome to Genshin music and Sky music nightly - -This repository holds the code of the two music apps for Genshin and Sky Cotl, you can see the published apps at [specy.app](https://specy.app) -![Composer](docs/assets/composer.webp) -![Player](docs/assets/player.webp) - -# Looking for help in translation -I'm looking for people who could help me translate the app to other languages, if you are interested, [look at the translation discussion here](https://github.com/Specy/genshin-music/discussions/52) - -# How to run in dev mode -You need node.js installed on your computer, you can get it [here](https://nodejs.org/en/). -Then clone the repo to a folder and install the dependencies with `npm i`, once installed, run the development server with `npm run start` - -There are 4 more scripts which might be useful, run as a specific app and build as a specific app. - -You can run `npm run dev:sky` or `npm run dev:genshin`, this will run the webapps for the specific game and swap the assets. - -# How to run desktop app in dev mode -You need to first start the development server, look [here](#how-to-run-in-dev-mode) for how to do that. -Then you can run `npm run start-tauri` -# How to build - -You can use the scripts `npm run build:genshin` and `npm run build:sky` which will build the correct app, or `npm run build:all` to build both - -# How to build desktop app -I advise not to use the desktop app as it's not developed much, it was mostly a proof of concept, use the webapp instead. - -The app uses tauri for the desktop bundle which is a sandboxed webview. You can build it by using `npm run build-tauri:genshin`, `npm run build-tauri:sky`, `npm run build-tauri:all`. The config is premade to allow for changelog, if you dont have a signing key, the build will fail. If you want to build without changelog, go to `src-tauri/tauri.conf.json` and set `updater` to false - - -# Documentation -You can find the documentation of the app [here](https://github.com/Specy/genshin-music/wiki) -It is not very detailed but might help to understand how the format works. - -# How to contribute -Make a new issue saying what you want to work on and wait for me to assign the issue. This way we can also communicate whether or it would be a valid issue to fix/add - -# README.MD -English | 简体中文 +[![wakatime](https://wakatime.com/badge/user/f0147aa6-69b8-4142-806c-050d6fee026e/project/68da356a-cd0b-40cb-996c-0799e406179f.svg)](https://wakatime.com/badge/user/f0147aa6-69b8-4142-806c-050d6fee026e/project/68da356a-cd0b-40cb-996c-0799e406179f) +# Welcome to Genshin music and Sky music nightly + +This repository holds the code of the two music apps for Genshin and Sky Cotl, you can see the published apps at [specy.app](https://specy.app) +![Composer](docs/assets/composer.webp) +![Player](docs/assets/player.webp) + +# Looking for help in translation +I'm looking for people who could help me translate the app to other languages, if you are interested, [look at the translation discussion here](https://github.com/Specy/genshin-music/discussions/52) + +# How to run in dev mode +You need node.js installed on your computer, you can get it [here](https://nodejs.org/en/). +Then clone the repo to a folder and install the dependencies with `npm i`, once installed, run the development server with `npm run start` + +There are 4 more scripts which might be useful, run as a specific app and build as a specific app. + +You can run `npm run dev:sky` or `npm run dev:genshin`, this will run the webapps for the specific game and swap the assets. + +# How to run desktop app in dev mode +You need to first start the development server, look [here](#how-to-run-in-dev-mode) for how to do that. +Then you can run `npm run start-tauri` +# How to build + +You can use the scripts `npm run build:genshin` and `npm run build:sky` which will build the correct app, or `npm run build:all` to build both + +# How to build desktop app +I advise not to use the desktop app as it's not developed much, it was mostly a proof of concept, use the webapp instead. + +The app uses tauri for the desktop bundle which is a sandboxed webview. You can build it by using `npm run build-tauri:genshin`, `npm run build-tauri:sky`, `npm run build-tauri:all`. The config is premade to allow for changelog, if you dont have a signing key, the build will fail. If you want to build without changelog, go to `src-tauri/tauri.conf.json` and set `updater` to false + + +# Documentation +You can find the documentation of the app [here](https://github.com/Specy/genshin-music/wiki) +It is not very detailed but might help to understand how the format works. + +# How to contribute +Make a new issue saying what you want to work on and wait for me to assign the issue. This way we can also communicate whether or it would be a valid issue to fix/add + +# README.MD +English | 简体中文 | 日本語 | Türkçe + diff --git a/docs/assets/Default theme.theme.json b/docs/assets/Default theme.theme.json index ca12a9b9..8a18fe42 100644 --- a/docs/assets/Default theme.theme.json +++ b/docs/assets/Default theme.theme.json @@ -11,13 +11,13 @@ "name": "background", "css": "background", "value": "#394248", - "text": "#edeae5" + "text": "#eae8e6" }, "primary": { "name": "primary", "css": "primary", "value": "#495466", - "text": "#edeae5" + "text": "#eae8e6" }, "secondary": { "name": "secondary", diff --git a/public/locales/id.json b/public/locales/id.json index 186e2c10..977b519f 100644 --- a/public/locales/id.json +++ b/public/locales/id.json @@ -105,7 +105,7 @@ "new": "Baru" }, "home": { - "app_description": "Aplikasi tempat Anda dapat membuat, berlatih, dan memutar lagu dengan {{APP_NAME}}", + "app_description": "Aplikasi tempat Anda dapat membuat, berlatih, dan memutar lagu untuk {{APP_NAME}}", "add_to_home_screen": "Untuk membuat aplikasi web dalam layar penuh, tambahkan situs web ke layar beranda", "clear_cache_warning": "Menghapus cache/penyimpanan browser Anda dapat menghapus lagu-lagu Anda, pastikan Anda membuat cadangan", "persistent_storage_button": "Klik tombol di bawah ini untuk memastikan bahwa browser Anda tidak akan menghapus lagu Anda jika Anda kekurangan penyimpanan", @@ -182,7 +182,7 @@ "filter_date-created": "Tanggal dibuat", "open_in_composer": "Buka di komposer", "recorded": "Teremkam", - "composed": "Terbuat", + "composed": "Tersusun", "vsrg": "VSRG", "midi": "MIDI", "song_library": "Library lagu" @@ -712,4 +712,4 @@ "SFX_MantaCall": "Manta Call", "SFX_MothCall": "Moth Call" } -} \ No newline at end of file +} diff --git a/public/locales/pt.json b/public/locales/pt.json index 546606a2..db36de37 100644 --- a/public/locales/pt.json +++ b/public/locales/pt.json @@ -471,7 +471,7 @@ "deleted_all_songs_notice": "Todas as músicas foram excluídas", "deleted_all_themes_notice": "Todos os temas foram excluídos", "error_validating_song": "Erro ao validar a música \"{{song_name}}\"", - "error_validating_folder": "Erro ao validar a pasta \"{{folder_name}}", + "error_validating_folder": "Erro ao validar a pasta \"{{folder_name}}\"", "error_validating_theme": "Erro ao validar o tema \"{{theme_name}}\"", "validating_songs": "Validando músicas", "validating_folders": "Validando pastas", diff --git a/public/locales/ru.json b/public/locales/ru.json new file mode 100644 index 00000000..6d48e590 --- /dev/null +++ b/public/locales/ru.json @@ -0,0 +1,714 @@ +{ + "logs": { + "update_available": "Доступна новая версия приложения, хотите перезагрузиться для обновления? Убедитесь, что вы закрыли/обновили другие вкладки приложения", + "error_with_the_app": "В приложении произошла ошибка!", + "loading_instruments": "Загружаем инструменты...", + "loading_song": "Загружаем мелодию...", + "could_not_find_song": "Мелодия не найдена", + "error_loading_instrument": "Не получилось загрузить инструмент", + "error_loading_song": "Не вышло загрузить мелодию", + "error_loading_theme": "Не смогли загрузить тему", + "error_opening_file": "Не получилось открыть файл", + "error_downloading_audio": "Не получилось скачать аудиофайл, может мелодия слишком длинная?", + "song_downloaded": "Мелодия загружена", + "error_downloading_song": "Не получилось скачать мелодию", + "error_downloading_songs": "Не вышло скачать мелодии", + "error_importing_file": "Не удалось импортировать файл \"{{file_name}}}\"", + "error_importing_file_generic": "Ошибка при импорте файла", + "error_importing_invalid_format": "Ошибка при импорте файла, недопустимый формат", + "song_backup_downloaded": "Резервная копия мелодии загружена", + "no_songs_to_backup": "Мелодий для резервного копирования нет", + "no_empty_name": "Пожалуйста, введите непустое имя", + "cloned_song": "Клонированная мелодия: \"{{song_name}}\"", + "converting_recorded_to_composed_warning": "Создание готовой мелодии из записанной, аудио может быть неточным", + "suggest_backup": "Вы давно не делали резервной копии своих мелодий, не забывайте иногда их загружать!", + "storage_persisted": "Получен доступ к постоянному хранилищу", + "storage_persisted_error": "Возникла ошибка при настройке постоянного хранилища", + "importing_files": "Импортируем файлы...", + "could_not_load_song": "Не удалось загрузить мелодию", + "song_added_to_folder": "Мелодия \"{{song_name}}\" была добавлена в папку {{folder_name}}", + "error_importing_files": "Ошибка при импортировании файлов", + "n_things_failed_to_import": "Не удалось импортировать {{n}} объектов", + "imported_n_songs": "Количество импортированных мелодий: {{n}}", + "imported_n_folders": "Количество импортированных папок: {{n}}", + "imported_n_themes": "Количество импортированных папок: {{n}}", + "error_importing_song": "Ошибка при импортировании мелодии \"{{song_name}}\"", + "error_importing_folder": "Ошибка при импортировании папки \"{{folder_name}}\"", + "error_importing_theme": "Ошибка при импортировании темы \"{{theme_name}}\"", + "error_importing_unknown_file": "Ошибка при импортировании неизвестного файла {{file_name}}", + "imported_theme": "Импортирована тема \"{{theme_name}}\"", + "imported_folder": "Импортирована папка \"{{folder_name}}\"", + "imported_song": "Импортирована {{song_type}} мелодия \"{{song_name}}\"" + }, + "question": { + "unsaved_song_save": "Вы не сохранили изменения мелодии: \"{{song_name}}\", хотите сохранить? НЕСОХРАНЁННЫЕ ИЗМЕНЕНИЯ БУДУТ УТЕРЯНЫ", + "enter_song_name": "Введите название мелодии", + "enter_folder_name": "Введите название папки", + "ask_song_name_cancellable": "Введите имя мелодии, нажмите \"Отмена\" чтобы проигнорировать" + }, + "confirm": { + "delete_song": "Вы уверены, что хотите удалить мелодию \"{{song_name}}\"?", + "confirm_import_opened_file": "Вы открыли файлы \"{{files_names}}\", хотите их импортировать?" + }, + "common": { + "warning": "Предупреждение", + "error": "Ошибка", + "success": "Успех", + "cancel": "Отмена", + "close": "Закрыть", + "save": "Сохранить", + "delete": "Удалить", + "edit": "Изменить", + "create": "Создать", + "add": "Добавть", + "remove": "Убрать", + "yes": "Да", + "no": "Нет", + "ok": "ОК", + "on": "Вкл.", + "off": "Выкл.", + "help": "Помощь", + "color": "Цвет", + "change": "Изменить", + "reverb": "Эхо", + "undo": "Отмена", + "confirm": "Подтвердить", + "loading": "Загрузка", + "privacy": "Конфиденциальность", + "donate": "Задонатить", + "open": "Открыть", + "play": "Проиграть", + "record": "Записать", + "stop": "Остановить", + "erase": "Стереть", + "copy": "Копировать", + "paste": "Вставить", + "pause": "Пауза", + "settings": "Настройки", + "search": "Поиск", + "rename": "Переименовать", + "create_song": "Создать мелодию", + "edit_song": "Изменить мелодию", + "none": "Без папки", + "instrument": "Инструмент", + "download": "Скачать", + "download_midi": "Скачать MIDI", + "pitch": "Высота", + "bpm": "bpm", + "connect": "Соединить", + "import": "Импорт", + "border": "Контур", + "line": "Линия", + "circle": "Круг", + "reset": "Сброс", + "add_new_instrument": "Добавить инструмент", + "new": "Новое" + }, + "home": { + "app_description": "Приложение, в котором можно создавать, разучивать и играть мелодии для {{APP_NAME}}", + "add_to_home_screen": "Чтобы открыть это веб-приложение на весь экран, добавьте сайт на рабочий стол", + "clear_cache_warning": "Очистка кэша браузера / хранилища может привести к удалению мелодий, не забывайте делать резервные копии", + "persistent_storage_button": "Нажмите на кнопку внизу чтобы убедиться, что ваши мелодии не будут удалены браузером, когда у вас будет заканчиваться память", + "privacy_policy": "Мы используем файлы cookie для аналитики. Продолжая использование приложения, вы соглашаетесь с использованием файлов cookie. Подробнее:", + "no_affiliation": "Это приложение не связано с {{company_name}}, оно было сделано фанатами.", + "composer_description": "Создавайте или редактируйте мелодии с полноценным секвенсором. Также с MIDI", + "player_description": "Играйте, скачивайте, записывайте и импортируйте мелодии. Разучите мелодию в реальном времени или в режиме тренировки.", + "cache_reload_warning": "Вы уверены, что хотите очистить кэш? Страница будет перезагружена", + "cache_cleared": "Кэш очищен", + "error_clearing_cache": "Не удалось очистить кэш", + "close_home_menu": "Закрыть домашнее меню", + "composer_name": "Секвенсор", + "player_name": "Плеер", + "vsrg_composer_name": "VSRG Секвенсор", + "donate_name": "Задонатить", + "vsrg_player_name": "VSRG Плеер", + "zen_keyboard_name": "Простая Клавиатура", + "sheet_visualizer_name": "Музыкальная Нотация", + "themes_name": "Темы", + "blog_and_guides_name": "Блог и Руководства", + "keybinds_or_midi_name": "Привязка Клавиш / MIDI", + "keybinds_name": "Привязка Клавиш", + "partners_name": "Партнёры", + "backup_name": "Резервная Копия", + "changelog_name": "Список Изменений", + "other_apps_name": "Ещё приложения", + "clear_cache_name": "Очистить Кэш", + "scale": "Масштаб", + "rights": "© Все права защищены {{company_name}}. Другие права принадлежат соответствующим владельцам.", + "hide_on_open": "Спрятать при открытии", + "beta": "Бета", + "about_to_leave_warning": "Вы выйдете из приложения и перейдёте на \"{{to}}\", хотите продолжить?", + "find_out_more": "Узнать больше", + "close_promotion": "Закрыть рекламу", + "install_app": "Установить приложение", + "rotate_screen": "Для удобного использования добавьте веб-сайт на рабочий стол и переверните устройство", + "expand_screen": "Пожалуйста, увеличьте размер окна", + "drop_files_here": "Поместите файлы сюда", + "new_changes_to_page": "Страница получила обновление!", + "how_to_install": "Как добавлять на рабочий стол" + }, + "menu": { + "close_menu": "Закрыть меню", + "toggle_menu": "Переключатели", + "open_settings_menu": "Открыть настройки", + "open_home_menu": "Открыть домашнее меню", + "open_songs_menu": "Открыть меню мелодий", + "open_library_menu": "Открыть Библиотеку", + "open_info_menu": "Иформацию", + "settings": "Найстрокйи", + "song_menu": "Меню Мелодий", + "help": "Помощь", + "settings_menu": "Настройки", + "song_name": "Имя Мелодии", + "go_back": "Назад", + "play_song": "Проиграть", + "invalid_song": "Недействительная мелодия", + "download_song": "Скачать {{song_name}}", + "delete_song": "Удалить {{song_name}}", + "change_app_theme": "Сменить тему", + "download_all_songs_backup": "Скачать все мелодии (копия)", + "connect_midi_keyboard": "Подключить MIDI клавиатуру", + "import_song_sheet": "Импортировать мелодию", + "compose_song": "Создать мелодию", + "select_menu": "Выбрать меню", + "create_folder": "Создать папку", + "hint_no_composed_songs": "Пусто... Создай мелодию!", + "hint_no_recorded_songs": "Ничего... Запиши мелодию!", + "hint_no_songs_in_folder": "Сюда можно добавить мелодии!", + "folder_empty": "Папка пуста", + "midi_download_warning": "Используя MIDI, вы теряете точность мелодии, если планируете ей поделиться с другими, желательно выбрать другой формат (кнопка выше). Всё ещё хотите скачать?", + "confirm_delete_folder": "Уверены, что хотите удалить папку \"{{folder_name}}\"? \n Мелодии останутся невредимыми", + "filter_alphabetical": "По алфавиту", + "filter_date-created": "Дата создания", + "open_in_composer": "Открыть в секвенсоре", + "recorded": "Записи", + "composed": "Композиции", + "vsrg": "VSRG", + "midi": "MIDI" + }, + "settings": { + "toggle_metronome": "Метроном", + "change_keybinds": "Назначить клавиши", + "more_options": "Больше опций", + "memory_persisted": "Данные в постоянном хранилище", + "memory_not_persisted": "Данные не в постоянном хранилище", + "memory_persisted_description": " Your data is persisted in the browser, the browser should not automatically clear it.\n Always make sure to download a backup sometimes, especially when you will not use the app\n for a long time", + "memory_not_persisted_description": "The browser didn't allow to store data persistently, it might happen that you will loose\n data\n when cache is automatically cleared. To get persistent storage, add the app to the home\n screen.\n If that still doesn't work, make sure you do a backup often", + "props": { + "composer_bpm": "Bpm", + "composer_bpm_description": "Beats per minute, the speed of the song. Usually the BPM inside the app should be 4 times the BPM of the song you are trying to compose", + "composer_base_pitch": "Base pitch", + "composer_base_pitch_description": "The main pitch of the song", + "composer_beat_marks": "Beat marks", + "composer_beat_marks_description": "The number of beats per measure, 3/4 is 3 beats per measure, 4/4 is 4 beats per measure", + "composer_note_name_type": "Note name type", + "composer_note_name_type_description": "The type of text which will be written on the note", + "composer_columns_per_canvas": "Number of visible columns", + "composer_columns_per_canvas_description": "How many columns are visible at a time, more columns might cause lag", + "composer_reverb": "Base reverb (cave mode)", + "composer_reverb_description": "Makes it sound like you are in a cave, this is the default value applied to every instrument", + "composer_autosave": "Autosave changes", + "composer_autosave_description": "Autosaves the changes to a song every 5 edits and when you change page/song", + "composer_use_keyboard_side_buttons": "Put next/previous column buttons around keyboard", + "composer_use_keyboard_side_buttons_description": "Puts the buttons to select the next/previous column on the left/right of the keyboard", + "composer_sync_tabs": "Autoplay in all tabs (pc only)", + "composer_sync_tabs_description": "Advanced feature, it syncs other browser tabs to all play at the same time", + "composer_lookahead_time": "Lookahead time", + "composer_lookahead_time_description": "How many milliseconds ahead the composer will look for notes to play, a higher value improves playback accuracy by reducing stutters, but feels less responsive", + "player_instrument": "Instrument", + "player_instrument_description": "The main (first) instrument of the player, will also be saved in the song you record", + "player_pitch": "Pitch", + "player_pitch_description": "The pitch of the player, will also be saved in the song you record", + "player_bpm": "Bpm", + "player_bpm_description": "Beats per minute, used by the metronome and will be used when converting the song with the composer", + "player_sync_song_data": "Auto sync the song's instruments and pitch", + "player_sync_song_data_description": "Whenever you load a song, the instruments and pitch of that song will be loaded too", + "player_metronome_beats": "Metronome beats", + "player_metronome_beats_description": "After how many times a stronger beat is played", + "player_metronome_volume": "Metronome volume", + "player_metronome_volume_description": "The volume of the metronome", + "player_reverb": "Reverb (cave mode)", + "player_reverb_description": "Makes it sound like you are in a cave", + "player_note_name_type": "Note name type", + "player_note_name_type_description": "The type of text which will be written on the note", + "player_keyboard_size": "Keyboard size", + "player_keyboard_size_description": "Scales the keyboard size", + "player_keyboard_y_position": "Keyboard vertical position", + "player_keyboard_y_position_description": "The vertical position of the keyboard", + "player_approach_speed": "Approach Rate (AR)", + "player_approach_speed_description": "The time between when the notes appear and when they reach the end (in ms)", + "player_note_animation": "Note animation", + "player_note_animation_description": "Toggle the animation of the notes (will reduce performance)", + "player_show_visual_sheet": "Show visual sheet", + "player_show_visual_sheet_description": "Show the sheet above the keyboard (might reduce performance)", + "vsrg_composer_keys": "Keys", + "vsrg_composer_keys_description": "How many keys the song has, reducing this value will delete the notes in the extra keys", + "vsrg_composer_bpm": "Bpm", + "vsrg_composer_bpm_description": "Beats per minute, the speed of the song", + "vsrg_composer_pitch": "Base pitch", + "vsrg_composer_pitch_description": "The main pitch of the song", + "vsrg_composer_is_vertical": "Vertical editor", + "vsrg_composer_is_vertical_description": "If the editor is set horizontally or vertically", + "vsrg_composer_max_fps": "Max FPS (high values could stutter)", + "vsrg_composer_max_fps_description": "The FPS limiter of the editor, higher values could cause audio stutters", + "vsrg_scroll_snap": "Snap the scroll to snap point", + "vsrg_scroll_snap_description": "When scrolling, snap the timestamp to the closest snap point", + "vsrg_composer_autosave": "Autosave changes", + "vsrg_composer_autosave_description": "Autosaves the changes to a song every 5 edits and when you change page/song", + "vsrg_composer_difficulty": "Difficulty", + "vsrg_composer_difficulty_description": "Higher values means the notes need to be pressed more accurately", + "vsrg_player_approach_time": "Approaching time", + "vsrg_player_approach_time_description": "The time between when the notes appear and when they reach the end (in ms)", + "vsrg_player_max_fps": "Max FPS", + "vsrg_player_max_fps_description": "The FPS limiter of the player, too high values could cause stutters", + "vsrg_player_keyboard_layout": "Keyboard layout", + "vsrg_player_keyboard_layout_description": "The keyboard layout of the player", + "vsrg_player_offset": "Audio Offset", + "vsrg_player_offset_description": "An offset to the audio if it plays too early/late (in ms)", + "vsrg_player_vertical_offset": "Vertical position", + "vsrg_player_vertical_offset_description": "The Vertical offset for the line layout", + "vsrg_player_horizontal_offset": "Horizontal position", + "vsrg_player_horizontal_offset_description": "The Horizontal offset for the line layout", + "zen_instrument": "Instrument", + "zen_instrument_description": "The main instrument of the keyboard", + "zen_pitch": "Pitch", + "zen_pitch_description": "The pitch of the keyboard", + "zen_metronome_beats": "Metronome beats", + "zen_metronome_beats_description": "After how many times a stronger beat is played", + "zen_metronome_volume": "Metronome volume", + "zen_metronome_volume_description": "The volume of the metronome", + "zen_metronome_bpm": "Metronome bpm", + "zen_metronome_bpm_description": "The bpm of the metronome", + "zen_reverb": "Reverb (cave mode)", + "zen_reverb_description": "Makes it sound like you are in a cave", + "zen_note_name_type": "Note name type", + "zen_note_name_type_description": "The type of text which will be written on the note", + "zen_keyboard_size": "Keyboard size", + "zen_keyboard_size_description": "Scales the keyboard size", + "zen_keyboard_y_position": "Vertical position", + "zen_keyboard_y_position_description": "The vertical position of the keyboard", + "zen_keyboard_spacing": "Keyboard spacing", + "zen_keyboard_spacing_description": "The spacing between the notes" + }, + "category": { + "keyboard": "Keyboard", + "metronome": "Metronome", + "layout_settings": "Layout settings", + "player_settings": "Player settings", + "song_settings": "Song settings", + "composer_settings": "Composer settings", + "editor_settings": "Editor settings" + }, + "select_language": "Select language" + }, + "zen_keyboard": { + "loading_instrument": "Loading instrument: {{instrument}}..." + }, + "vsrg_composer": { + "delete_track_question": "Are you sure you want to remove this track? All notes will be deleted.", + "cannot_delete_last_track": "Cannot delete last track", + "snap": "Snap", + "background_song": "Background Song", + "background_song_info": "You can select one of your songs to be played on the background", + "no_background_song_selected": "No background song selected", + "instrument_modifiers": "Instrument modifiers", + "tap": "Tap", + "hold": "Hold", + "delete": "Delete", + "track_name": "Track name", + "remove_background_song": "Remove background song", + "click_to_add_time": "Click to add time", + "click_to_remove_time": "Click to remove time" + }, + "vsrg_player": { + "amazing": "Amazing", + "perfect": "Perfect", + "great": "Great", + "good": "Good", + "bad": "Bad", + "miss": "Miss", + "combo": "Combo" + }, + "transfer": { + "connecting_please_wait": "Connecting please wait...", + "error_connecting": "Error connecting, please visit the domain, there might be changelog.", + "import_data_from_other_domains_title": "Import data from other domains", + "import_data_from_other_domains_description": "Here you can import data from other existing domains of the app, select the domain you want to import\n from and click import.\n You will be shown all the data from the other domain, and you can select to import it all at once or\n only what you need.", + "select_a_website_to_import_data": "Select a website to import data from", + "data": "Data", + "import_all": "Import all", + "no_data_to_import": "No data to import" + }, + "theme": { + "error_importing_theme": "There was an error importing this theme, is it the correct file?", + "choose_theme_name": "How do you want to name the theme?", + "confirm_delete_theme": "Are you sure you want to delete the theme \"{{theme_name}}\"?", + "import_theme": "Import Theme", + "theme_prop": { + "background_image": "Background image (URL)", + "composer_background_image": "Composer Background image (URL)", + "theme_name": "Theme name" + }, + "opaque_performance_warning": "GIF backgrounds and opaque (transparent) colors could reduce performance", + "your_themes": "Your Themes", + "new_theme": "New Theme", + "default_themes": "Default Themes", + "preview": "Preview", + "view_player": "View player", + "view_composer": "View composer", + "colors": { + "background": "Background", + "primary": "Primary", + "secondary": "Secondary", + "accent": "Accent", + "composer_accent": "Composer accent", + "composer_main_layer": "Composer main layer", + "composer_secondary_layer": "Composer secondary layer", + "icon_color": "Icon color", + "menu_background": "Menu background", + "note_background": "Note background" + } + }, + "sheet_visualizer": { + "note_names": "Note names", + "merge_empty_spaces": "Merge empty spaces", + "no_song_selected": "No song selected", + "print_as_pdf": "Print as PDF", + "sheet_visualizer_instructions": "Select a song from the menu on the left.\n Remember that you can learn a song with the interactive\n practice tool in the Player", + "per_row": "Per row", + "invalid_song_to_visualize": "Invalid song, it is not composed or recorded", + "error_converting_to_visual_song_try_convert_in_recorded": "Error converting song to visual song, trying to convert to recorded song first...", + "error_converting_to_visual_song": "Error converting song to visual song" + }, + "player": { + "finish_recording": "Finish recording", + "record_audio": "Record audio", + "change_speed": "Change speed", + "stop_song": "Stop song", + "accuracy": "Accuracy", + "score": "Score", + "combo": "Combo", + "practice_mode": "Practice", + "practice_mode_description": "Practice song \"{{song_name}}\"", + "approach_mode": "Approach mode", + "approach_mode_description": "Play in Approach mode the song \"{{song_name}}\"", + "song_search_no_results": "No results", + "song_search_description": "Here you can find songs to learn, they are provided by the sky-music library.", + "midi_or_audio_import_redirect_warning": "You cannot directly import this file format. MIDI, Video and Audio files need to be converted in the composer, do you want to open it?" + }, + "keybinds": { + "already_used_keybind": "This keybind is already used by the note \"{{note_name}}\"", + "midi_keybinds": "MIDI keybinds", + "keyboard_keybinds": "Keyboard keybinds", + "keyboard_keybinds_description": "You can remap the keyboard keys to whatever key on your keyboard, press the note you want to remap\n then press the key you want to assign to it.", + "composer_shortcuts": "Composer shortcuts", + "player_shortcuts": "Player shortcuts", + "vsrg_composer_shortcuts": "Vsrg composer shortcuts", + "vsrg_player_shortcuts": "Vsrg player shortcuts", + "vsrg_keybinds": "Vsrg keybinds", + "connected_midi_devices": "Connected MIDI devices", + "no_connected_devices": "No connected devices", + "midi_layout_preset": "MIDI layout preset", + "delete_midi_preset": "Delete preset", + "create_midi_preset": "Create new preset", + "midi_note_selection_description": "Click on the note to select it, then press your MIDI keyboard to assign that note to the key. You\n can click it again to change it.", + "midi_shortcuts": "MIDI Shortcuts", + "confirm_delete_preset": "Are you sure you want to delete the preset \"{{preset_name}}\"?", + "cannot_delete_builtin_preset": "Cannot delete built-in preset", + "already_existing_preset": "Preset with this name already exists", + "ask_preset_name": "Write the name of the preset", + "key_already_used": "Key already used", + "cannot_edit_builtin_preset": "Cannot edit built-in preset, create a new one to edit it", + "midi_status": "MIDI status", + "midi_access_denied": "MIDI access was denied, please allow it in the browser settings and reload the page", + "midi_access_unsupported": "MIDI is not supported in this browser", + "midi_access_pending": "Waiting for MIDI access...", + "midi_access_granted": "MIDI available!", + "shortcuts": { + "toggle_play": "Toggle play", + "next_column": "Next column", + "previous_column": "Previous column", + "add_column": "Add column", + "remove_column": "Remove column", + "change_layer": "Change layer" + } + }, + "error": { + "confirm_delete_all_songs": "Are you sure you want to delete ALL SONGS?", + "settings_reset_notice": "Settings have been reset", + "error_page_description": "If you unexpectedly see this page it means an error has occoured.\n Here you can download or delete your songs, if one caused an error, delete it.\n If you need help, join our discord server and send the log file below.", + "reset_settings": "Reset settings", + "delete_all_songs": "Delete all songs", + "error_logs": "Error logs", + "download_logs": "Download logs" + }, + "donate": { + "donate_message": "Each App I make takes months of learning and development. Added to that\n are also the costs of hosting. With a higher budget I can afford to not\n worry so much about how much I spend on the server, giving you the best\n possible experience.\n \n I care about giving users all features without\n having to pay for it, neither having intrusive ads which can be annoying.\n For this same reason, there is no source of income except donations.\n\n\n I would be really thankful if you could consider donating in order to fund\n development and costs." + }, + "cache": { + "cache": "Cache", + "reset_cache": "Reset cache", + "reset_cache_message": "This page will clear the cache of the application. This will remove all cached data and reload the page.\n It will not\n delete your songs or data, only the cached assets. As soon as you visit this page, it will clear the\n cache automatically.\n You can also click the button below to clear the cache manually.", + "clear_cache": "Clear Cache" + }, + "changelog": { + "view_error_logs": "View Error logs" + }, + "page404": { + "page_not_found": "The page was not found, click here to go back to the home page" + }, + "backup": { + "confirm_after_songs_validation_error": "There were errors validating some songs. Do you want to continue downloading?", + "confirm_after_folders_validation_error": "There were errors validating some folders. Do you want to continue downloading?", + "confirm_after_themes_validation_error": "There were errors validating some themes. Do you want to continue downloading?", + "confirm_delete_songs_step_1": "Write 'delete' if you want to delete all songs, press cancel to ignore", + "confirm_delete_songs_step_2": "Are you REALLY sure you want to delete all songs?", + "confirm_delete_themes_step_1": "Write 'delete' if you want to delete all themes, press cancel to ignore", + "confirm_delete_themes_step_2": "Are you REALLY sure you want to delete all themes?", + "deleted_all_songs_notice": "Deleted all songs", + "deleted_all_themes_notice": "Deleted all themes", + "error_validating_song": "Error validating song \"{{song_name}}\"", + "error_validating_folder": "Error validating folder \"{{folder_name}}\"", + "error_validating_theme": "Error validating_theme \"{{theme_name}}\"", + "validating_songs": "Validating songs", + "validating_folders": "Validating folders", + "validating_themes": "Validating themes", + "action_cancelled": "Action cancelled", + "zipping_files": "Zipping files", + "transfer_from_other_domain": "Transfer from other domain", + "transfer_data_notice": "If you want to transfer your data from another domain of the app, click here", + "transfer": "Transfer", + "backup_as": "Backup as", + "backup_advice": "Make sure you create a backup every now and then. Especially if you just finished a new song.\n The browser shouldn't delete your data, especially if you installed the app, but there is always a chance.", + "backup_download_tooltip": "Download all the data of the app, aka themes, songs, folders", + "backup_downloaded": "Downloaded backup", + "backup_download_error": "Error downloading backup", + "download_all_backup": "Download all backup", + "download_all_backup_tooltip": "Downloads a backup containing all songs and folders", + "no_items_to_backup": "There is nothing to backup", + "download_songs_tooltip": "Downloads a backup containing all songs and folders", + "downloaded_songs_notice": "Downloaded songs backup", + "download_songs_backup": "Download songs backup", + "download_themes_tooltip": "Downloads a backup of all the custom themes", + "no_themes_to_backup": "There are no themes to backup", + "downloaded_themes_notice": "Downloaded themes backup", + "download_themes_backup": "Download themes backup", + "import_backup": "Import backup", + "import_backup_description": "If you have a backup, you can import it here, they will be added to your existing data. (if you already have\n the same song,\n a duplicate will be created).", + "error_reading_file": "There was an error reading the file", + "import_backup_tooltip": "Here you can import any backup you have", + "songs": "songs", + "themes": "themes", + "delete_data": "Delete data", + "delete_data_description": "If you want, you can also delete all your data here, once deleted it can't be recovered.\n Don't worry you will be asked to confirm before anything is deleted.", + "delete_songs_and_folders": "Delete songs and folders", + "delete_songs_and_folders_tooltip": "Here you can delete all your themes", + "delete_themes_tooltip": "Here you can delete all your themes", + "delete_themes": "Delete themes" + }, + "composer": { + "add_new_page": "Add new page", + "remove_column": "Remove column", + "add_column": "Add column", + "open_tools": "Open tools", + "clone_song": "Clone song", + "remove_breakpoint": "Remove breakpoint", + "add_breakpoint": "Add breakpoint", + "cant_remove_all_layers": "You can't remove all layers!", + "confirm_layer_remove": "Are you sure you want to remove \"{{layer_name}}\"? ALL NOTES OF THIS LAYER WILL BE DELETED", + "cant_add_more_than_n_layers": "You can't add more than {{max_layers}} layers!", + "ask_song_name_for_composed_song_version": "Write the song name for the composed version, press cancel to ignore", + "start_recording_audio": "Start recording audio", + "stop_recording_audio": "Stop recording audio", + "create_new_song": "Create new song", + "create_from_midi_or_audio": "Create from MIDI/Audio", + "previous_breakpoint": "Previous Breakpoint", + "next_breakpoint": "Next Breakpoint", + "tempo": "Tempo", + "error_with_this_layer": "There was an error with this layer", + "recording_audio": "Recording Audio", + "tools": { + "move_notes_up": "Move notes up", + "move_notes_up_description": "Push notes up by 1 position", + "move_notes_down": "Move notes down", + "move_notes_down_description": "Push notes down by 1 position", + "only_layer": "Only layer", + "clear_selection": "Clear selection", + "all_layers": "All layers", + "all_layers_description": "Select all the layers in the highlighted columns", + "paste_in_layer_n": "Paste in layer {{layer_number}}", + "insert_in_layer_n": "Insert in layer {{layer_number}}", + "paste_all_layers": "Paste all", + "insert_all_layers": "Insert all", + "select_layer_description": "Select all the notes in the highlighted columns or only the ones of the current layer", + "delete_selected_columns": "Delete selected columns", + "erase_all_selected_notes": "Erase all selected notes", + "insert_copied_notes": "Insert copied notes", + "paste_copied_notes": "Paste copied notes", + "copy_notes": "Copy all notes" + }, + "midi_parser": { + "out_of_range": "Out of range", + "accidentals": "Accidentals", + "total_notes": "Total notes", + "select_midi_tracks": "Select MIDI tracks", + "ignore_empty_tracks": "Ignore empty tracks", + "include_accidentals": "Include accidentals", + "global_note_offset": "Global note offset", + "global_note_offset_description": "The index of each note will be pushed up/down by this amount, you can use it to make\n the song fit into the app range. You can also change the offset of each layer.", + "local_note_offset": "Local track notes offset", + "local_note_offset_description": " Changes the index of each note by this amount.", + "max_octave_scaling": "Max notes octave scaling", + "max_octave_scaling_description": " Scale down/up the notes which are out of scale by theose octaves.", + "number_of_notes": "Number of notes", + "open_midi_audio_file": "Open MIDI/Audio/Video file", + "there_are_no_notes": "There are no notes", + "error_is_file_midi": "There was an error importing this file, is it a .mid file?", + "converting_audio_to_midi": "Converting audio to midi (might take a while)..", + "detecting_notes": "Detecting notes", + "loading_converter": "Loading converter", + "audio_conversion_warning": "🔬 This feature is experimental, it might not work or get stuck. \nAudio and video conversion is less accurate than MIDI, if you can, it's better to use MIDI or compose manually. \nUse audio and videos that have only one instrument playing." + }, + "warning_opening_midi_importer": "Opening the midi importer to import a MIDI file, please reselect the file", + "warning_opening_audio_importer": "Opening the midi importer to import a video/audio file... Please reselect the file. video/audio conversion is not very accurate", + "error_importing_file_invalid_format": "Error importing file, invalid format", + "error_importing_file_invalid_format_audio_video": "Error importing file, invalid format, if it's a MIDI,Video or audio file, use the \"Create from MIDI\" button", + "ask_download_of_current_song": "You are currently editing this song (\"{{song_name}}\"), do you want to save it before downloading?" + }, + "instrument_settings": { + "no_instrument_selected": "No instrument selected", + "layer_name": "Layer name", + "use_song_pitch": "Use song pitch", + "use_song_reverb": "Use song reverb", + "note_icon": "Note icon", + "volume": "Volume", + "volume_high_warning": "If you hear distortion, reduce the volume", + "move_down": "Move down", + "move_up": "Move up" + }, + "tutorials": { + "composer": { + "li_1": "Click the song name to load it", + "li_2": "You can use different instruments and pitch for each layer", + "li_3": "Tempo changers help you make faster parts of a song without having very high bpm", + "li_4": "You can quickly create a song by importing a MIDI file and editing it, not all songs are convertable directly, you might need to edit it a bit.", + "li_5": "You can also quickly create a song from audio / video, this is an experimental feature and not very accurate", + "li_6": "You can add breakpoints to the timeline (the bar below the composer) to quickly jump between parts of a song" + }, + "player": { + "li_1": "Click the song name to play it", + "li_2": "You can import songs made by other users (does not accept audio files). Or you can download yours to share", + "li_3": "To create your song, you can record the notes you play or create one in the composer", + "li_4": "Start the practice mode", + "li_5": "Start the approaching notes mode", + "li_6": "You can connect a MIDI keyboard to play" + }, + "help": { + "question_mark_description": "Hover over the buttons to see a tooltip.\n When clicking this button (?), it will show you more info.", + "example_help": "Example help", + "learn_how_to_use_player": "Learn how to use the Player", + "learn_how_to_use_composer": "Learn how to use the composer", + "learn_how_to_use_vsrg_composer": "Learn how to use the Vsrg composer", + "click_to_visit_blog": "Click here to visit the tutorial", + "change_keybinds": "Change keybinds", + "composer_shortcuts": "Composer shortcuts", + "vsrg_composer_shortcuts": "Vsrg composer shortcuts", + "player_shortcuts": "Player shortcuts" + } + }, + "shortcuts": { + "holdable": "Holdable", + "props": { + "toggle_play": "Toggle play", + "previous_column": "Previous column", + "next_column": "Next column", + "remove_column": "Remove column", + "add_column": "Add column", + "previous_layer": "Previous layer", + "next_layer": "Next layer", + "next_breakpoint": "Next breakpoint", + "previous_breakpoint": "Previous breakpoint", + "toggle_record": "Toggle record", + "stop": "Stop", + "restart": "Restart", + "toggle_menu": "Toggle menu", + "close_menu": "Close menu", + "move_up": "Move up", + "move_down": "Move down", + "move_left": "Move left", + "move_right": "Move right", + "deselect": "Deselect", + "delete": "Delete", + "next_track": "Next track", + "previous_track": "Previous track", + "set_tap_hand": "Set tap hand", + "set_hold_hand": "Set hold hand", + "set_delete_hand": "Set delete hand", + "toggle_play_description": "Toggle play / pause", + "previous_column_description": "Select the previous column", + "next_column_description": "Select the next column", + "remove_column_description": "Remove the selected column", + "add_column_description": "Add a column after the selected column", + "previous_layer_description": "Select the previous layer", + "next_layer_description": "Select the next layer", + "next_breakpoint_description": "Move to the next breakpoint", + "previous_breakpoint_description": "Move to the previous breakpoint", + "toggle_record_description": "Toggle keyboard recording", + "stop_description": "Stop playing / recording / practicing", + "restart_description": "Restart the song or practice", + "toggle_menu_description": "Toggle the menu", + "close_menu_description": "Close the menu", + "move_up_description": "Move the selected note up", + "move_down_description": "Move the selected note down", + "move_left_description": "Move the selected note left", + "move_right_description": "Move the selected note right", + "deselect_description": "Deselect the selected note", + "delete_description": "Delete the selected note", + "next_track_description": "Select the next track", + "previous_track_description": "Select the previous track", + "set_tap_hand_description": "Set the click to create a tap note", + "set_hold_hand_description": "Set the click to create a hold note", + "set_delete_hand_description": "Set the click to delete a note", + "vsrg_add_hit_object": "Add hit object (syncs to the registered keybinds)" + } + }, + "instruments": { + "Lyre": "Lyre", + "Vintage-Lyre": "Vintage Lyre", + "Zither": "Zither", + "Old-Zither": "Old Zither", + "DunDun": "DunDun", + "Piano": "Piano", + "Contrabass": "Contrabass", + "Guitar": "Guitar", + "LightGuitar": "Light Guitar", + "Harp": "Harp", + "Horn": "Horn", + "Trumpet": "Trumpet", + "Pipa": "Pipa", + "WinterPiano": "Winter Piano", + "Xylophone": "Xylophone", + "Flute": "Flute", + "Panflute": "Panflute", + "Ocarina": "Ocarina", + "MantaOcarina": "Manta Ocarina", + "Aurora": "Aurora", + "Kalimba": "Kalimba", + "ToyUkulele": "Toy Ukulele", + "Drum": "Drum", + "Bells": "Bells", + "HandPan": "HandPan", + "SFX_SineSynth": "Sine Synth", + "SFX_BassSynth": "Bass Synth", + "SFX_ChimeSynth": "Chime Synth", + "SFX_TR-909": "TR-909", + "SFX_Dance": "Dance", + "SFX_BirdCall": "Bird Call", + "SFX_CrabCall": "Crab Call", + "SFX_FishCall": "Fish Call", + "SFX_SpiritMantaCall": "Spirit Manta Call", + "SFX_JellyCall": "Jelly Call", + "SFX_MantaCall": "Manta Call", + "SFX_MothCall": "Moth Call" + } +} \ No newline at end of file diff --git a/public/locales/tr.json b/public/locales/tr.json new file mode 100644 index 00000000..bfe40e75 --- /dev/null +++ b/public/locales/tr.json @@ -0,0 +1,714 @@ +{ + "logs": { + "update_available": "Uygulamanın yeni bir sürümü mevcut, güncellemek için yeniden yüklemek ister misiniz? Uygulamanın diğer sekmelerini kapattığınızdan veya yenilediğinizden emin olun.", + "error_with_the_app": "Uygulamada bir hata oluştu!", + "loading_instruments": "Enstrümanlar yükleniyor...", + "loading_song": "Şarkı yükleniyor...", + "could_not_find_song": "Şarkı bulunamadı.", + "error_loading_instrument": "Enstrümanlar yüklenirken bir hata oluştu", + "error_loading_song": "Şarkı yüklenirken bir hata oluştu", + "error_loading_theme": "Tema yüklenirken bir hata oluştu", + "error_opening_file": "Bu dosya açılırken bir hata oluştu", + "error_downloading_audio": "Ses dosyası indirilirken bir sorun oluştu, Müzik çok uzun olabilir mi?", + "song_downloaded": "Şarkı indirildi", + "error_downloading_song": "Şarkı indirilirken hata oluştu.", + "error_downloading_songs": "Şarkılar indirilirken hata oluştu.", + "error_importing_file": "\"{{file_name}}}\" Dosyası içe aktarılırken hata oluştu", + "error_importing_file_generic": "Dosya içe aktarılırken hata oluştu.", + "error_importing_invalid_format": "Dosya içe aktarılırken hata oluştu, hatalı format", + "song_backup_downloaded": "Yedeklenen şarkılar indirildi.", + "no_songs_to_backup": "Yedeklenecek şarkı yok", + "no_empty_name": "Lütfen isim kısmını boş bırakma", + "cloned_song": "Klonlanmış şarkı: \"{{song_name}}\"", + "converting_recorded_to_composed_warning": "Kaydedilen şarkıyı bestelenmiş hale dönüştürülüyor, sesde ufak bir sorun olabilir.", + "suggest_backup": "Son zamanlarda şarkılarınızı yedeklemediniz, ara sıra yedekleyip indirmeyi unutmayın!", + "storage_persisted": "Kalıcı depolama izni verildi", + "storage_persisted_error": "Kalıcı depolama ayarları yapılırken bir hata oluştu.", + "importing_files": "Dosyalar içe aktarılıyor...", + "could_not_load_song": "Şarkı yüklenemedi.", + "song_added_to_folder": "\"{{song_name}}\" Müziği, {{folder_name}} klasörüne eklendi.", + "error_importing_files": "Dosya içe aktarma sorunu!", + "n_things_failed_to_import": "{{n}} içe aktarılamadı.", + "imported_n_songs": "{{n}} Müziği içe aktarıldı.", + "imported_n_folders": "{{n}} klasör içe aktarıldı.", + "imported_n_themes": "{{n}} teması içe aktarıldı.", + "error_importing_song": "Hata, \"{{song_name}}\" Müziğini içe aktarılamadı.", + "error_importing_folder": "Hata, \"{{folder_name}}\" klasörü içe aktarılamadı.", + "error_importing_theme": "Hata, \"{{theme_name}}\" Teması içe aktarılamadı.", + "error_importing_unknown_file": "Hata, bilinmeyen {{file_name}} isimli dosya içe aktarılamadı.", + "imported_theme": "\"{{theme_name}}\" isimli tema içe aktarıldı.", + "imported_folder": "\"{{folder_name}}\" isimli klasör içe aktarıldı.", + "imported_song": "{{song_type}} türündeki, \"{{song_name}}\" isimli dosya içe aktarıldı." + }, + "question": { + "unsaved_song_save": "\"{{song_name}}\" şarkısında kaydedilmemiş değişiklikleriniz var. Şimdi kaydetmek ister misiniz? KAYDEDİLMEYEN DEĞİŞİKLİKLER KAYBOLACAKTIR.", + "enter_song_name": "Müzik adını yazın.", + "enter_folder_name": "Klasör ismini yazın.", + "ask_song_name_cancellable": "Müzik adını yazın, Görmezden gelmek için iptal'e basın" + }, + "confirm": { + "delete_song": "\"{{song_name}}\" isimli müziği silmek istediğine emin misin?", + "confirm_import_opened_file": "\"{{files_names}}\" dosyasını açtın, onu içe aktarmak ister misin?" + }, + "common": { + "warning": "Uyarı", + "error": "Hata", + "success": "Tamamlandı", + "cancel": "İptal", + "close": "Kapat", + "save": "Kaydet", + "delete": "Sil", + "edit": "Düzenle", + "create": "Oluştur", + "add": "Ekle", + "remove": "Kaldır", + "yes": "Evet", + "no": "Hayır", + "ok": "Tamam", + "on": "Açık", + "off": "Kapalı", + "help": "Yardım", + "color": "Renk", + "change": "Değiştir", + "reverb": "Yankı", + "undo": "Geri Al", + "confirm": "Onayla", + "loading": "Yükleniyor", + "privacy": "Gizlilik", + "donate": "Bağış", + "open": "Aç", + "play": "Oynat", + "record": "Kaydet", + "stop": "Durdur", + "erase": "Sil", + "copy": "Kopyala", + "paste": "Yapıştır", + "pause": "Durdur", + "settings": "Ayarlar", + "search": "Ara", + "rename": "Yeniden adlandır", + "create_song": "Müzik oluştur", + "edit_song": "Müziği düzenle", + "none": "Yok", + "instrument": "Enstrüman", + "download": "İndir", + "download_midi": "MIDI İndir", + "pitch": "Akort", + "bpm": "bpm", + "connect": "Bağla", + "import": "İçe aktar", + "border": "Sınır", + "line": "Çizgi", + "circle": "Daire", + "reset": "Sıfırla", + "add_new_instrument": "Yeni enstrüman ekle", + "new": "Yeni" + }, + "home": { + "app_description": "{{APP_NAME}} için şarkılar oluşturabileceğiniz, pratik yapabileceğiniz ve çalabileceğiniz bir uygulama.", + "add_to_home_screen": "Web uygulamasını tam ekranda kullanmak için lütfen web sitesini ana ekrana ekleyin.", + "clear_cache_warning": "Tarayıcı önbelleğini / verilerini temizlemek şarkılarınızı silebilir, yedeklerinizi almayı unutmayın.", + "persistent_storage_button": "Depolama alanınız yetersizse tarayıcınızın şarkılarınızı silmemesi için Onayla butonuna tıklayın.", + "privacy_policy": "Analizler için çerezleri kullanıyoruz. Bu uygulamayı kullanmaya devam ederek çerez kullanımımızı kabul etmiş olursunuz, Daha fazlası için: ", + "no_affiliation": "Bu uygulama {{company_name}} ile ilişkili değildir, hayranlar tarafından yapılmış bir uygulamadır.", + "composer_description": "Tam teşekküllü bir müzik besteleyicisi ile şarkı oluşturun veya düzenleyin. Ayrıca MIDI desteği de bulunmaktadır.", + "player_description": "Şarkıları çal, indir, kaydet ve içe aktar. Nota yakalama modu ve pratik modu ile bir şarkıyı öğren.", + "cache_reload_warning": "Önbelleği temizlemek istediğine emin misin? Sayfa yeniden yüklenecek.", + "cache_cleared": "Önbellek temizlendi.", + "error_clearing_cache": "Hata, Önbellek temizlenemedi.", + "close_home_menu": "Menüyü kapat", + "composer_name": "Besteleyici", + "player_name": "Oynatıcı", + "vsrg_composer_name": "VSRG Besteleyicisi", + "donate_name": "Bağış", + "vsrg_player_name": "VSRG Oynatıcı", + "zen_keyboard_name": "Zen Klavye", + "sheet_visualizer_name": "Nota Görselleştirici", + "themes_name": "Temalar", + "blog_and_guides_name": "Blog ve Rehberler", + "keybinds_or_midi_name": "Tuş Bağlamaları / MIDI", + "keybinds_name": "Tuş Bağlamaları", + "partners_name": "Ortaklar", + "backup_name": "Yedekleme", + "changelog_name": "Değişiklik Günlüğü", + "other_apps_name": "Diğer uygulamalar", + "clear_cache_name": "Önbelleği temizle", + "scale": "Ölçek", + "rights": "© Tüm hakları {{company_name}}'e aittir. Diğer özellikler ilgili sahiplerine aittir.", + "hide_on_open": "Açıkken Gizle", + "beta": "Beta", + "about_to_leave_warning": "Bu siteden ayrılıp \"{{to}}\" sitesine yönlendiriliyorsun, devam etmek ister misin?", + "find_out_more": "Daha fazlası", + "close_promotion": "Promosyonu kapat", + "install_app": "Uygulamayı yükle", + "rotate_screen": "Daha iyi bir deneyim için, Uygulamayı ana ekranınıza ekleyin ve cihazınızı yatay çevirin.", + "expand_screen": "Lütfen pencere boyutunuzu artırın", + "drop_files_here": "Dosyaları buraya sürükleyin", + "new_changes_to_page": "Bu sayfada yeni değişiklikler var!", + "how_to_install": "Ana ekrana nasıl eklenir" + }, + "menu": { + "close_menu": "menüyü kapat", + "toggle_menu": "Menüyü Aç/Kapat", + "open_settings_menu": "Ayarlar Menüsünü Aç", + "open_home_menu": "Anasayfa menüsünü aç", + "open_songs_menu": "Şarkı menüsünü aç", + "open_library_menu": "Kütüphane menüsünü aç", + "open_info_menu": "Bilgi menüsünü aç", + "settings": "Ayarlar", + "song_menu": "Müzik menüsü", + "help": "Yardım", + "settings_menu": "Ayarlar Menüsü", + "song_name": "Müzik Adı", + "go_back": "Geri git", + "play_song": "Müziği Oynat", + "invalid_song": "Geçersiz Şarkı", + "download_song": "{{song_name}} isimli müziği indir.", + "delete_song": "{{song_name}} isimli müziği sil.", + "change_app_theme": "Uygulama temasını değiştir", + "download_all_songs_backup": "Yedeklenen tüm şarkıları indir", + "connect_midi_keyboard": " MIDI klavyesini bağla", + "import_song_sheet": "Müzik notasını içe aktar", + "compose_song": "Şarkı oluştur", + "select_menu": "Menü seç", + "create_folder": "Klasör oluştur", + "hint_no_composed_songs": "Burada müzik yok, Hemen oluştur!", + "hint_no_recorded_songs": "Burada kayıt yok, Hemen kaydet!", + "hint_no_songs_in_folder": "Burada şarkı yok, hemen ekle!", + "folder_empty": "Klasör boş", + "midi_download_warning": "Eğer MIDI kullanıyorsan Şarkı olduğundan biraz değişebilir, Eğer şarkıyı başkalarıyla paylaşmak istiyorsan başka format kullan (yukarıdaki buton). Hala indirmek İstiyor musun?", + "confirm_delete_folder": "\"{{folder_name}}\" isimli klasörü silmek istediğine emin misin? şarkı silinmeyecek", + "filter_alphabetical": "Alfabetik", + "filter_date-created": "Oluşturulma Tarihi", + "open_in_composer": "Besteleyicide Aç", + "recorded": "Kaydedilmiş", + "composed": "Bestelenmiş", + "vsrg": "VSRG", + "midi": "MIDI" + }, + "settings": { + "toggle_metronome": "Metronomu Aç/Kapat", + "change_keybinds": "Tuş Bağlamalarını Değiştir", + "more_options": "Diğer seçenekler", + "memory_persisted": "Depolama kalıcı hale getirildi", + "memory_not_persisted": "Depolama kalıcı hale getirilemedi", + "memory_persisted_description": " Verileriniz tarayıcıda kalıcı olarak saklanır, tarayıcı verilerinizi otomatik olarak silmez. \n Uygulamayı uzun süre kullanmayacaksanız, ara sıra yedekleri indirmeyi unutmayın.", + "memory_not_persisted_description": "Tarayıcı kalıcı depolamaya izin vermedi. \n Önbellek otomatik olarak temizlendiğinde verilerinizi kaybedebilirsiniz.\n Kalıcı depolama için uygulamayı ana ekrana ekleyin.\n Bu hala işe yaramazsa, sık sık yedekleme yaptığınızdan emin olun.", + "props": { + "composer_bpm": "Bpm (DK başı vuruş)", + "composer_bpm_description": "Dakika başına vuruş sayısı (BPM), şarkının hızını belirtir. Genellikle uygulamadaki BPM, bestelemek istediğiniz şarkının BPM'inin 4 katı olmalıdır.", + "composer_base_pitch": "Temel Akort", + "composer_base_pitch_description": "Notaların Akortu", + "composer_beat_marks": "Vuruş İşaretleri", + "composer_beat_marks_description": "Ölçekteki vuruş sayısı, örneğin 3/4'te her ölçekte 3 vuruş, 4/4'te ise her ölçekte 4 vuruş vardır.", + "composer_note_name_type": "Nota İsim Türü", + "composer_note_name_type_description": "Nota üzerine yazılacak metnin türü", + "composer_columns_per_canvas": "Görünür sütunların sayısı", + "composer_columns_per_canvas_description": "Tek seferde kaç sütun görülebilir, çok sütun takılmalara neden olabilir", + "composer_reverb": "Temel yankı (mağara modu)", + "composer_reverb_description": "Sesi bir mağaradaymışsınız gibi çıkarır, bu her enstrümana uygulanan varsayılan değerdir", + "composer_autosave": "Değişiklikleri otomatik kaydet", + "composer_autosave_description": "Her 5 düzenleme ve sayfa/şarkı değiştirdiğinizde değişiklikleri otomatik olarak kaydeder", + "composer_use_keyboard_side_buttons": "Klavyenin etrafına sonraki/önceki sütun butonlarını yerleştirin", + "composer_use_keyboard_side_buttons_description": "Sonraki/önceki sütunu seçmek için butonları klavyenin soluna/sağına yerleştirir", + "composer_sync_tabs": "Tüm sekmelerde otomatik oynatma (yalnızca bilgisayar)", + "composer_sync_tabs_description": "Gelişmiş özellik, diğer tarayıcı sekmelerini aynı anda oynatacak şekilde senkronize eder", + "composer_lookahead_time": "Ön Görülen Zaman", + "composer_lookahead_time_description": "Besteleyicinin çalınacak notaları aramak için kaç milisaniye önde bakacağı; daha yüksek bir değer, takılmaları azaltarak çalma doğruluğunu artırır, ancak daha az duyarlı hissettirir.", + "player_instrument": "Enstrüman", + "player_instrument_description": "Oynatıcının ana (ilk) enstrümanı, kaydettiğiniz şarkıya da kaydedilecektir", + "player_pitch": "Akort", + "player_pitch_description": "Oynatıcı akordu, kaydettiğiniz şarkıya da kaydedilecektir", + "player_bpm": "Bpm (DK başı vuruş)", + "player_bpm_description": "Metronom tarafından kullanılan ve besteleyici ile şarkıyı dönüştürürken kullanılacak olan dakika başına vuruş sayısı", + "player_sync_song_data": "Şarkının enstrümanlarını ve akordunu otomatik olarak senkronize et", + "player_sync_song_data_description": "Bir şarkı yüklediğinde, o şarkının enstrümanları ve akordu da yüklenecektir", + "player_metronome_beats": "Metronom vuruşları", + "player_metronome_beats_description": "Daha güçlü bir vuruşun ne kadar sıklıkla çalınacağı", + "player_metronome_volume": "Metronom sesi", + "player_metronome_volume_description": "Metronomun ses düzeyi", + "player_reverb": "Yankı (mağara modu)", + "player_reverb_description": "Mağaradaymışsın gibi sesi yankılandır.", + "player_note_name_type": "Nota metin türü", + "player_note_name_type_description": "Nota üzerine yazılacak metnin türü", + "player_keyboard_size": "Klavye boyutu", + "player_keyboard_size_description": "Klavye boyutunu ölçekler", + "player_keyboard_y_position": "Klavyenin dikey pozisyonu", + "player_keyboard_y_position_description": "Klavyenin dikey pozisyonu", + "player_approach_speed": "Yaklaşma Oranı (AR)", + "player_approach_speed_description": "Notaların göründüğü ve sona ulaştığı zaman arasındaki süre (salise cinsinden)", + "player_note_animation": "Nota animasyonu", + "player_note_animation_description": "Nota basım animasyonunu Aç/Kapat (Performansı Düşürebilir)", + "player_show_visual_sheet": "Notaları görselleştir", + "player_show_visual_sheet_description": "Notaları Tuşların üzerinde göster (Performansı Düşürebilir)", + "vsrg_composer_keys": "Tuşlar", + "vsrg_composer_keys_description": "Şarkının kaç tuşu var, bu değeri azaltmak, ek tuşlardaki notaları silecektir", + "vsrg_composer_bpm": "Bpm (DK başı vuruş)", + "vsrg_composer_bpm_description": "Dakikadaki vuruş sayısı, şarkının hızı", + "vsrg_composer_pitch": "Temel Akort", + "vsrg_composer_pitch_description": "Şarkının ana akordu", + "vsrg_composer_is_vertical": "Dikey düzenleyici", + "vsrg_composer_is_vertical_description": "Editörün yatay mı yoksa dikey mi", + "vsrg_composer_max_fps": "Max FPS (yüksek değerler takılma yapabilir)", + "vsrg_composer_max_fps_description": "Düzenleyicinin FPS sınırlayıcısı, yüksek değerler ses takılmalarına neden olabilir", + "vsrg_scroll_snap": "Kaydırmayı yakalama noktasına oturt", + "vsrg_scroll_snap_description": "Kaydırırken, zaman damgasını en yakın tutma noktasına oturt.", + "vsrg_composer_autosave": "Değişiklikleri otomatik kaydet", + "vsrg_composer_autosave_description": "Şarkıdaki her 5 düzenlemeden ve sayfa/şarkı değiştirdiğinizde değişiklikleri otomatik olarak kaydeder", + "vsrg_composer_difficulty": "Zorluk", + "vsrg_composer_difficulty_description": "Yüksek değerler, notaların daha hassas bir şekilde basılması gerektiği anlamına gelir", + "vsrg_player_approach_time": "Yaklaşma Oranı (AR)", + "vsrg_player_approach_time_description": "Notaların göründüğü ve sona ulaştığı zaman arasındaki süre (salise cinsinden)", + "vsrg_player_max_fps": "Max FPS", + "vsrg_player_max_fps_description": "Oynatıcının FPS sınırlayıcısı, çok yüksek değerler takılmaya neden olabilir", + "vsrg_player_keyboard_layout": "Klavye düzeni", + "vsrg_player_keyboard_layout_description": "Oynatıcının Klavye düzeni", + "vsrg_player_offset": "Ses Kayması", + "vsrg_player_offset_description": "Sesin çok erken/geç çalınması durumunda bir ses kayması (salise cinsinden)", + "vsrg_player_vertical_offset": "Dikey pozisyon", + "vsrg_player_vertical_offset_description": "Satır düzeni için dikey kayma", + "vsrg_player_horizontal_offset": "Yatay pozisyon", + "vsrg_player_horizontal_offset_description": "Satır düzeni için yatay kayma", + "zen_instrument": "Enstrüman", + "zen_instrument_description": "Klavyenin ana enstrümanı", + "zen_pitch": "Akort", + "zen_pitch_description": "Klavyenin akordu", + "zen_metronome_beats": "Metronom vuruşları", + "zen_metronome_beats_description": "Daha güçlü bir vuruşun kaç kez çalınacağı", + "zen_metronome_volume": "Metronom ses düzeyi", + "zen_metronome_volume_description": "Metronomun ses düzeyi", + "zen_metronome_bpm": "Metronomun bpm'i", + "zen_metronome_bpm_description": "Metronomun bpm'i (dk başı vuruş sayısı)", + "zen_reverb": "Yankı (mağara modu)", + "zen_reverb_description": "Mağaradaymışsın gibi sesi yankılandır.", + "zen_note_name_type": "Nota metin türü", + "zen_note_name_type_description": "Nota üzerine yazılacak metnin türü", + "zen_keyboard_size": "klavye boyutu", + "zen_keyboard_size_description": "Klavye boyutunu ölçeklendirir", + "zen_keyboard_y_position": "Dikey pozisyon", + "zen_keyboard_y_position_description": "Klavyenin dikey pozisyonu", + "zen_keyboard_spacing": "Tuş aralığı", + "zen_keyboard_spacing_description": "Notalar arasındaki aralık" + }, + "category": { + "keyboard": "Klavye", + "metronome": "Metronom", + "layout_settings": "Düzen ayarları", + "player_settings": "Oynatıcı ayarları", + "song_settings": "Müzik ayarları", + "composer_settings": "Besteleyici ayarları", + "editor_settings": "Düzenleyici ayarları" + }, + "select_language": "Dil seç" + }, + "zen_keyboard": { + "loading_instrument": "{{instrument}} Enstrümanı yükleniyor..." + }, + "vsrg_composer": { + "delete_track_question": "Bu parçayı silmek istediğinizden emin misiniz? Tüm notalar silinecektir.", + "cannot_delete_last_track": "Son parçayı silemezsiniz.", + "snap": "Sabitle", + "background_song": "Arka plan müziği", + "background_song_info": "Müziklerinizden birini arka planda çalmak için seçebilirsiniz", + "no_background_song_selected": "Arka plan Müziği seçilmedi", + "instrument_modifiers": "Enstrüman düzenleyici", + "tap": "Bas", + "hold": "Basılı tut", + "delete": "Sil", + "track_name": "Parça adı", + "remove_background_song": "Arka plan müziğini kaldır", + "click_to_add_time": "Zaman eklemek için tıkla", + "click_to_remove_time": "Zaman kaldırmak için tıkla" + }, + "vsrg_player": { + "amazing": "Efsanevi", + "perfect": "Mükemmel", + "great": "Harika", + "good": "İyi", + "bad": "kötü", + "miss": "Eksik", + "combo": "Kombo" + }, + "transfer": { + "connecting_please_wait": "Bağlanıyor lütfen bekleyin...", + "error_connecting": "Bğlantı hatası, Siteyi tekrar ziyaret edin, Yeni gelenler listesini kontrol edin.", + "import_data_from_other_domains_title": "Başka siteden veri aktar", + "import_data_from_other_domains_description": "Buradan diğer Sitelerden veri alabilirsiniz. Almak istediğiniz Site adını seçin ve içe aktar butonuna tıklayın.\n\nDiğer Sitelerdeki tüm veriler size gösterilecek ve hepsini birden ya da sadece ihtiyacınız olanları seçerek içe aktarabilirsiniz.", + "select_a_website_to_import_data": "Veri içe aktaracağınız siteyi seçin", + "data": "Veri", + "import_all": "Tümünü içe aktar", + "no_data_to_import": "İçe aktarılacak veri yok" + }, + "theme": { + "error_importing_theme": "Temayı içe aktarırken bir sorun oluştu, bu doğru dosya olmayabilir mi?", + "choose_theme_name": "Temayı nasıl adlandırmak istersiniz?", + "confirm_delete_theme": "\"{{theme_name}}\" isimli temayı silmek istediğinize emin misiniz?", + "import_theme": "Tema içe aktar", + "theme_prop": { + "background_image": "Arka plan resmi (link URL)", + "composer_background_image": "Besteleyici arka plan resmi(link URL)", + "theme_name": "Tema adı" + }, + "opaque_performance_warning": "GIF arka planları ve saydam renkler performansı azaltabilir.", + "your_themes": "Senin temaların", + "new_theme": "Yeni tema", + "default_themes": "Varsayılan temalar", + "preview": "Ön izlenim ", + "view_player": "Oynatıcıyı göster", + "view_composer": "Besteleyiciyi göster", + "colors": { + "background": "Arka plan", + "primary": "Birincil", + "secondary": "İkincil", + "accent": "Vurgu", + "composer_accent": "Besteleyici Vurgusu", + "composer_main_layer": "Besteleyici ana katmanı", + "composer_secondary_layer": "Besteleyici ikincil katmanı", + "icon_color": "İkon rengi", + "menu_background": "Menü arka planı", + "note_background": "Nota arka planı" + } + }, + "sheet_visualizer": { + "note_names": "Nota isimleri", + "merge_empty_spaces": "Fazla boşlukları birleştir", + "no_song_selected": "Müzik seçilmedi", + "print_as_pdf": "PDF olarak yazdır", + "sheet_visualizer_instructions": "Soldaki menüden müzik seç\n buradan bir şarkıyı interaktif olarak öğrenebileceğini unutma\n Pratik aracı oynatma menüsünde", + "per_row": "Satır sayısı", + "invalid_song_to_visualize": "Geçersiz müzik, bu müzik bestelenmedi yada kaydedilmedi", + "error_converting_to_visual_song_try_convert_in_recorded": "Müzik görselleştirme hatası, önce kaydedilmiş müzik dönüştürmeye çalışılıyor...", + "error_converting_to_visual_song": "Müzik görselleştirme hatası" + }, + "player": { + "finish_recording": "Kaydı bitir", + "record_audio": "Ses kaydet", + "change_speed": "Hızı değiştir", + "stop_song": "Müziği durdur", + "accuracy": "Doğruluk", + "score": "Skor", + "combo": "Kombo", + "practice_mode": "Pratik", + "practice_mode_description": "\"{{song_name}}\" isimli müzikte pratik yap", + "approach_mode": "Nota yakalama oyunu", + "approach_mode_description": "\"{{song_name}}\" isimli müziği Nota yakalama modunda çal", + "song_search_no_results": "Sonuç yok", + "song_search_description": "Burada öğrenebileceğiniz müzikleri bulabilirsiniz, bunlar Sky Music kütüphanesinden sağlanıyor.", + "midi_or_audio_import_redirect_warning": "Bu dosya formatını doğrudan içe aktaramazsın. MIDI, Video ve ses dosyaları Besteleyicide dönüştürülmeli, açmak ister misin?" + }, + "keybinds": { + "already_used_keybind": "Bu tuş düzeni zaten \"{{note_name}}\" notasında kullanılıyor", + "midi_keybinds": "MIDI tuş düzenleri", + "keyboard_keybinds": "Klavye tuş düzenleri", + "keyboard_keybinds_description": "Klavyenizdeki tuşları yeniden atayabilirsiniz,\n Yeniden eşlemek istediğiniz notayı seçin, ardından atamak istediğiniz tuşa basın.", + "composer_shortcuts": "Besteleyici kısayolları", + "player_shortcuts": "Oynatıcı kısayolları", + "vsrg_composer_shortcuts": "Vsrg Besteleyici kısayolları", + "vsrg_player_shortcuts": "Vsrg Oynatıcı kısayolları", + "vsrg_keybinds": "Vsrg Tuş düzeni", + "connected_midi_devices": "MIDI cihazı bağlandı", + "no_connected_devices": "Hiçbir cihaz bağlanmadı", + "midi_layout_preset": "MIDI düzen Şablonu", + "delete_midi_preset": "Şablonu sil", + "create_midi_preset": "Yeni Şablon oluştur", + "midi_note_selection_description": "Seçmek istediğin notaya tıkla daha sonra MIDI klavyendeki tuşa bas. \n Tekrar değiştirmek için notaya tekrar tıkla.", + "midi_shortcuts": "MIDI Kısayolları", + "confirm_delete_preset": "\"{{preset_name}}\" isimli şablonu silmek istediğine emin misin?", + "cannot_delete_builtin_preset": "Varsayılan Şablon silinemiyor", + "already_existing_preset": "Bu şablon ismi zaten mevcut", + "ask_preset_name": "Şablon ismi yaz", + "key_already_used": "Tuş zaten atandı", + "cannot_edit_builtin_preset": "Varsayılan Şablonu düzenleyemezsin, düzenlemek için yeni bir tane oluştur", + "midi_status": "MIDI durumu", + "midi_access_denied": "MIDI erişimi reddedildi, Lütfen tarayıcı ayarlarından erişim izni verin ve siteyi yenileyin", + "midi_access_unsupported": "Bu tarayıcıda MIDI desteği yok", + "midi_access_pending": "MIDI erişim izni için bekleniyor...", + "midi_access_granted": "MIDI Algılandı!", + "shortcuts": { + "toggle_play": "Oynatmayı durdur/devam ettir", + "next_column": "Sonraki sütun", + "previous_column": "Önceki sütun", + "add_column": "Sütun ekle", + "remove_column": "Sütun kaldır", + "change_layer": "Katmanı değiştir" + } + }, + "error": { + "confirm_delete_all_songs": "TÜM müzikleri silmek istediğinize emin misiniz?", + "settings_reset_notice": "Tüm ayarlar sıfırlandı", + "error_page_description": "Eğer beklenmedik bir şekilde bu sayfayı görürseniz, bu bir hatanın meydana geldiği anlamına gelir.\n Burada şarkılarınızı indirebilir veya silebilirsiniz, eğer biri hataya neden olduysa silin.\n Yardıma ihtiyacınız varsa discord sunucumuza katılın ve aşağıdaki Hata kaydı dosyasını gönderin.", + "reset_settings": "Ayarları sıfırla", + "delete_all_songs": "Tüm müzikleri sil", + "error_logs": "Hata kayıtları", + "download_logs": "Hata kayıtlarını indir" + }, + "donate": { + "donate_message": "Her uygulama geliştirme süreci aylar alır ve bu süre çok fazla öğrenme ve iyileştirme içerir. \n Bunun yanı sıra, site yayınlama maliyetleri de göz önünde bulundurulmalıdır. \n Ne kadar para harcadığımızı umursamaksızın, size en iyi deneyimi sunmaya odaklanıyoruz. \n Kullanıcılar için tüm özellikleri ücretsiz sunmak ve onlardan herhangi bir ücret talep etmemek veya rahatsız edici reklamlarla karşılaştırmamak önemlidir.\n Ancak bu nedenle, gelir kaynağımız sadece bağışlara dayanmaktadır. \n Geliştirme ve diğer masrafları karşılamak için bağış yapmayı düşünürseniz, bu büyük bir yardım olur ve bunun için gerçekten minnettar oluruz." + }, + "cache": { + "cache": "Önbellek", + "reset_cache": "Önbelleği temizle", + "reset_cache_message": "Bu sayfa uygulamanın önbelleğini temizleyecek. Önbellek dosyaları silindiğinden sayfa yenilenecek.\n bu dosyalarınızı ve müziklerinizi silmez,\n sadece önbellek dosyaları silinir. Bu sayfayı ziyaret ettiğiniz anda, Önbellek otomatik temizlenecek\n Ayrıca aşağıdaki butondan manüel olarak da temizleyebilirsiniz.", + "clear_cache": "Önbelleği temizle" + }, + "changelog": { + "view_error_logs": "Hata kayıtlarını göster" + }, + "page404": { + "page_not_found": "Sayfa bulunamadı, Ana sayfaya dönmek için buraya basın" + }, + "backup": { + "confirm_after_songs_validation_error": "Bazı müzikler doğrulanırken hata oluştu, İndirmeyi sürdürmek istediğinize emin misiniz?", + "confirm_after_folders_validation_error": "Bazı klasörler doğrulanırken hata oluştu, İndirmeyi sürdürmek istediğinize emin misiniz?", + "confirm_after_themes_validation_error": "Bazı temalar doğrulanırken hata oluştu, İndirmeyi sürdürmek istediğinize emin misiniz?", + "confirm_delete_songs_step_1": "Tüm müzikleri silmek için 'delete' yazın, silmek istemiyorsanız iptale basın", + "confirm_delete_songs_step_2": "Tüm müzikleri silmek istediğinize EMİN MİSİNİZ?", + "confirm_delete_themes_step_1": "Tüm temaları silmek için 'delete' yazın, silmek istemiyorsanız iptale basın", + "confirm_delete_themes_step_2": "Tüm temaları silmek istediğinize EMİN MİSİNİZ?", + "deleted_all_songs_notice": "Tüm şarkıları sil", + "deleted_all_themes_notice": "Tüm temaları sil", + "error_validating_song": "\"{{song_name}}\" isimli müzikte doğrulama hatası\"", + "error_validating_folder": "\"{{folder_name}}\" isimli klasörde doğrulama hatası.", + "error_validating_theme": "\"{{theme_name}}\" isimli temada doğrulama hatası", + "validating_songs": "Müzikler doğrulanıyor", + "validating_folders": "Klasörler doğrulanıyor", + "validating_themes": "Temalar doğrulanıyor", + "action_cancelled": "İşlem iptal edildi", + "zipping_files": "Dosyalar sıkıştırılıyor", + "transfer_from_other_domain": "Diğer sitelerden dosyalarını al ", + "transfer_data_notice": "Eğer diğer Sitelerdeki müziklerinizi içe aktarmak istiyorsanız buraya tıklayın", + "transfer": "Transfer", + "backup_as": "Farklı yedekle", + "backup_advice": "Ara sıra bir yedek oluşturduğunuzdan emin olun. Özellikle yeni bir şarkıyı bitirdiğinizde.\n Uygulamayı yüklediyseniz tarayıcının verilerinizi silmemesi gerekir ancak bu ihtimal her zaman vardır.", + "backup_download_tooltip": "Uygulamadaki tüm verilerini indir, yani: Temalar, Müzikler, Klasörler", + "backup_downloaded": "Yedek indirildi", + "backup_download_error": "Yedek indirilirken hata oluştu", + "download_all_backup": "Tüm yedekleri indir", + "download_all_backup_tooltip": "Tüm şarkıları ve klasörleri içeren bir yedekleme indirir", + "no_items_to_backup": "Yedeklenecek hiçbir şey yok", + "download_songs_tooltip": "Tüm şarkıları ve klasörleri içeren bir yedekleme indirir", + "downloaded_songs_notice": "Müziklerin yedeği indirildi", + "download_songs_backup": "Müziklerin yedeğini indir", + "download_themes_tooltip": "Tüm özel temaları içeren bir yedekleme indirir", + "no_themes_to_backup": "Burada yedeklenecek tema yok", + "downloaded_themes_notice": "Tema yedeği indirildi", + "download_themes_backup": "Tema yedeğini indir", + "import_backup": "Yedeği içe aktar", + "import_backup_description": "Eğer bir yedeğiniz varsa buradan içe aktarabilirsiniz. Varsayılan müziklerinize eklenecektir.\n (aynı müzikten zaten varsa bir kopyası daha oluşur).", + "error_reading_file": "Dosya okunurken bir hata oluştu", + "import_backup_tooltip": "Sahip olduğunuz herhangi bir yedeği buradan içe aktarabilirsiniz", + "songs": "Müzikler", + "themes": "Temalar", + "delete_data": "Veriyi sil", + "delete_data_description": "Buradan tüm verilerinizi silebilirsiniz, Bu işlem geri alınamaz,\n Endişelenmeyin silmeden önce size emin olup olmadığınız sorulacaktır.", + "delete_songs_and_folders": "Müzikleri ve klasörleri sil", + "delete_songs_and_folders_tooltip": "Buradan tüm temalarını silebilirsin", + "delete_themes_tooltip": "Buradan tüm temalarını silebilirsin", + "delete_themes": "Temaları sil" + }, + "composer": { + "add_new_page": "Yeni sayfa ekle", + "remove_column": "Sütunu kaldır", + "add_column": "Sütun ekle", + "open_tools": "Araçları aç", + "clone_song": "Müziği klonla", + "remove_breakpoint": "Yer imini kaldır", + "add_breakpoint": "Yer imi ekle", + "cant_remove_all_layers": "Tüm katmanları kaldıramazsın!", + "confirm_layer_remove": "\"{{layer_name}}\" isimli katmanı kaldırmak istediğine emin misin? BU KATMANDAKİ TÜM NOTALAR SİLİNECEK!", + "cant_add_more_than_n_layers": "{{max_layers}} sayısından fazla katman ekleyemezsin!", + "ask_song_name_for_composed_song_version": "Bestelenmiş versiyon için müzik adı yaz, yazmak istemiyorsan iptale bas", + "start_recording_audio": "Ses kaydını başlat", + "stop_recording_audio": "Ses kaydını durdur", + "create_new_song": "Yeni müzik oluştur", + "create_from_midi_or_audio": "Ses/MIDI den oluştur", + "previous_breakpoint": "Önceki yer imi", + "next_breakpoint": "Sonraki yer imi", + "tempo": "Tempo", + "error_with_this_layer": "Bu katmanla ilgili bir sorun oluştu", + "recording_audio": "Ses kaydediliyor", + "tools": { + "move_notes_up": "Notaları yukarı taşı", + "move_notes_up_description": "Notaları bir üst konuma taşı", + "move_notes_down": "Notaları aşağı taşı", + "move_notes_down_description": "Notaları bir alt konuma taşı", + "only_layer": "Geçerli katman", + "clear_selection": "Seçimi temizle", + "all_layers": "Tüm katmanlar", + "all_layers_description": "Tüm vurgulanmış sütunlardaki katmanları seç", + "paste_in_layer_n": "{{layer_number}}. katmana yapıştır", + "insert_in_layer_n": "{{layer_number}}. katmana ekle", + "paste_all_layers": "Tümünü yapıştır", + "insert_all_layers": "Tümünü ekle", + "select_layer_description": "Vurgulanmış sütunlardaki tüm notaları seç veya geçerli katmandakileri seç", + "delete_selected_columns": "Seçili sütunu sil", + "erase_all_selected_notes": "Tüm seçili notaları sil", + "insert_copied_notes": "Kopyalanan notaları ekle", + "paste_copied_notes": "Kopyalanan notaları yapıştır", + "copy_notes": "Tüm notaları kopyala" + }, + "midi_parser": { + "out_of_range": "Menzil dışında", + "accidentals": "Arızalar", + "total_notes": "Toplam notalar", + "select_midi_tracks": "MIDI parçalarını seçin", + "ignore_empty_tracks": "Boş parçaları görmezden gel", + "include_accidentals": "Arızaları dahil et", + "global_note_offset": "Global nota kaydırma", + "global_note_offset_description": "Her notanın dizini bu miktarla yukarı/aşağı taşınacak. Şarkının uygulama menziline sığmasını sağlamak için kullanabilirsiniz. \n Ayrıca, her katmanın kaydırmasını değiştirebilirsiniz.", + "local_note_offset": "Yerel parça nota kaydırma", + "local_note_offset_description": "Her notanın dizinini bu miktarla değiştirir.", + "max_octave_scaling": "Maksimum oktav ölçekleme", + "max_octave_scaling_description": "Menzil dışındaki notaları bu oktavlarla aşağı/yukarı ölçekleyin.", + "number_of_notes": "Nota sayısı", + "open_midi_audio_file": "MIDI/Ses/Video dosyasını aç", + "there_are_no_notes": "Burada nota yok", + "error_is_file_midi": "Dosyayı içe aktarırken bir sorun oluştu, Bu dosyanın uzantısının .mid olduğundan emin ol", + "converting_audio_to_midi": "Ses midiye dönüştürülüyor (Bu biraz sürebilir)..", + "detecting_notes": "Notalar algılanıyor", + "loading_converter": "Dönüştürücü yükleniyor", + "audio_conversion_warning": "🔬 Bu özellik deneyseldir; çalışmayabilir veya takılabilir.\n\n Ses ve video dönüştürme, MIDI'den daha az doğrudur; eğer mümkünse, MIDI kullanmak veya manuel olarak bestelemek daha iyidir.\n\n Sadece tek bir enstrümanın çaldığı ses ve videoları kullanın." + }, + "warning_opening_midi_importer": "MIDI dosyasını içe aktarmak için MIDI içe aktarıcıyı açılıyor, lütfen dosyayı tekrar seçin.", + "warning_opening_audio_importer": "Video/ses dosyasını içe aktarmak için MIDI içe aktarıcıyı açılıyor... Lütfen dosyayı tekrar seçin. Video/ses dönüştürme genellikle tam doğru değildir.", + "error_importing_file_invalid_format": "İçe aktarma hatası, Geçersiz dosya biçimi", + "error_importing_file_invalid_format_audio_video": "İçe aktarma hatası, Geçersiz dosya biçimi. Eğer bu bir MIDI, video veya ses dosyasıysa \"Midi den oluştur\" butonunu kullan", + "ask_download_of_current_song": "Şu anda (\"{{song_name}}\") isimli müziği düzenliyorsunuz, indirmeden önce kaydetmek ister misiniz?" + }, + "instrument_settings": { + "no_instrument_selected": "Enstrüman seçilmedi", + "layer_name": "Katman adı", + "use_song_pitch": "Şarkı akordunu kullan", + "use_song_reverb": "Şarkı yankısını kullan", + "note_icon": "Nota simgesi", + "volume": "Ses seviyesi", + "volume_high_warning": "Eğer bir bozulma duyarsan ses seviyesini düşür", + "move_down": "Aşağı kaydır", + "move_up": "Yukarı kaydır" + }, + "tutorials": { + "composer": { + "li_1": "Şarkı adına tıklayarak yükleyin.", + "li_2": "Her katman için farklı Enstrüman ve Akort kullanabilirsin.", + "li_3": "Tempo değiştiriciler, şarkının çok yüksek bpm'e sahip olmadan daha hızlı bölümler yapmanıza yardımcı olur", + "li_4": "MIDI dosyasını içe aktararak hızlıca bir şarkı oluşturabilirsin. ve onu düzenleyebilirsiniz, ancak tüm şarkılar doğrudan dönüştürülebilir değil, bazılarını biraz düzenlemeniz gerekebilir.", + "li_5": "Ayrıca ses/Video dosyasından hızlıca bir şarkı oluşturabilirsin, Bu deneysel bir özelliktir tam doğru çalışmayabilir", + "li_6": "Şarkının parçaları arasında hızlıca geçiş yapmak için zaman çizelgesine (besteleyicinin altındaki çubuk) Yer imi ekleyebilirsiniz." + }, + "player": { + "li_1": "Şarkı adına tıklayarak çalın", + "li_2": "Başka kullanıcıların müziklerini(ses dosyaları değil) içe aktar butonuyla buraya yükleyebilirsiniz veya kendi yaptığınızı paylaşabilirsiniz.", + "li_3": "Kendi müziğini yapmak için çaldığınız notaları kaydedin veya Besteleyicide yenisini oluşturun.", + "li_4": "Pratik modunu başlat", + "li_5": "Nota yakalama modunu başlat", + "li_6": "Çalmak için MIDI klavyenizi bağlayabilirsiniz." + }, + "help": { + "question_mark_description": "Açıklamayı görmek için butonların üzerine gelin.\n Bu butona tıkladığınızda (?), daha fazla bilgi gösterecek.", + "example_help": "Örnek Yardım", + "learn_how_to_use_player": "Oynatıcıyı nasıl kullanacağınızı öğrenin.", + "learn_how_to_use_composer": "Besteleyiciyi nasıl kullanacağınızı öğrenin.", + "learn_how_to_use_vsrg_composer": "Vsrg Besteleyiciyi nasıl kullanacağınızı öğrenin.", + "click_to_visit_blog": "Kılavuzu görmek için buraya tıklayın.", + "change_keybinds": "Tuş düzenini değiştir.", + "composer_shortcuts": "Besteleyici kısayolları.", + "vsrg_composer_shortcuts": "Vsrg besteleyici kısayolları.", + "player_shortcuts": "Oynatıcı kısayolları" + } + }, + "shortcuts": { + "holdable": "Basılı tutulabilir", + "props": { + "toggle_play": "Oynatmayı durdur/devam ettir", + "previous_column": "Önceki sütun", + "next_column": "Sonraki sütun", + "remove_column": "Sütunu kaldır", + "add_column": "Sütun ekle", + "previous_layer": "Önceki katman", + "next_layer": "Sonraki katman", + "next_breakpoint": "Sonraki yer imi", + "previous_breakpoint": "Önceki yer imi", + "toggle_record": "Kaydı durdur/devam ettir", + "stop": "Durdur", + "restart": "Yeniden başlat", + "toggle_menu": "Menüyü aç/kapat", + "close_menu": "Menüyü kapat", + "move_up": "Yukarı kaldır", + "move_down": "Aşağı indir", + "move_left": "Sola ilerlet", + "move_right": "Sağa ilerlet", + "deselect": "Seçimi kaldır", + "delete": "Sil", + "next_track": "Sonraki parça", + "previous_track": "Önceki parça", + "set_tap_hand": "Dokunma Modunu Ayarla", + "set_hold_hand": "Basılı Tutma Modunu Ayarla", + "set_delete_hand": "Silme Modunu Ayarla", + "toggle_play_description": "Aç kapat Oynat/Durdur", + "previous_column_description": "Önceki sütunu seç", + "next_column_description": "Sonraki sütunu seç", + "remove_column_description": "Seçili Sütunu kaldır", + "add_column_description": "Seçili sütunun önüne bir Sütun daha ekle", + "previous_layer_description": "Seçili sütunun arkasına bir Sütun daha ekle", + "next_layer_description": "Sonraki Sütunu seç", + "next_breakpoint_description": "Sonraki Yer imini seç", + "previous_breakpoint_description": "Önceki Yer imini seç", + "toggle_record_description": "Klavye kaydını Aç/Kapat", + "stop_description": "Oynatmayı/Kaydı/pratiği durdur", + "restart_description": "Şarkı veya pratiği yeniden başlat", + "toggle_menu_description": "Menüyü Aç/Kapat", + "close_menu_description": "Menüyü kapat", + "move_up_description": "Seçili notayı yukarı kaldır", + "move_down_description": "Seçili notayı aşağı indir", + "move_left_description": "Seçili notayı sola ilerlet", + "move_right_description": "Seçili notayı sağa ilerlet", + "deselect_description": "Seçili notanın seçimini iptal et", + "delete_description": "Seçili notayı sil", + "next_track_description": "Sonraki parçayı seç", + "previous_track_description": "Önceki parçayı seç", + "set_tap_hand_description": "Dokunma Modu ile Notayı Ekleyin", + "set_hold_hand_description": "Basılı Tutma Modu ile Notayı Ekleyin", + "set_delete_hand_description": "Silme Modu ile Notayı Silin", + "vsrg_add_hit_object": "Vuruş nesnesi ekle (kayıtlı tuş atamalarına senkronize edilir)" + } + }, + "instruments": { + "Lyre": "Lir", + "Vintage-Lyre": "Vintage Lir", + "Zither": "Ziter", + "Old-Zither": "Eski Ziter", + "DunDun": "DunDun", + "Piano": "Piyano", + "Contrabass": "Kontrabas", + "Guitar": "Gitar", + "LightGuitar": "Hafif Gitar", + "Harp": "Arp", + "Horn": "Korno", + "Trumpet": "Trompet", + "Pipa": "Pipa", + "WinterPiano": "Winter Piyano", + "Xylophone": "Ksilofon", + "Flute": "Flüt", + "Panflute": "Pan Flüt", + "Ocarina": "Okarina", + "MantaOcarina": "Manta Okarina", + "Aurora": "Aurora", + "Kalimba": "Kalimba", + "ToyUkulele": "Oyuncak Ukulele", + "Drum": "Davul", + "Bells": "Çan", + "HandPan": "HandPan", + "SFX_SineSynth": "Sine Sentezi", + "SFX_BassSynth": "Bas Sentezi", + "SFX_ChimeSynth": "Çan Sentezi", + "SFX_TR-909": "TR-909", + "SFX_Dance": "Dans", + "SFX_BirdCall": "Kuş Çağrısı", + "SFX_CrabCall": "Yengeç Çağrısı", + "SFX_FishCall": "Balık Çağrısı", + "SFX_SpiritMantaCall": "Ruh Manta Çağrısı", + "SFX_JellyCall": "Jöle Çağrısı", + "SFX_MantaCall": "Manta Çağrısı", + "SFX_MothCall": "Kelebek Çağrısı" + } +} \ No newline at end of file diff --git a/public/locales/zh.json b/public/locales/zh.json index da6a5f7a..54a24ea8 100644 --- a/public/locales/zh.json +++ b/public/locales/zh.json @@ -469,7 +469,7 @@ "deleted_all_songs_notice": "删除所有歌曲", "deleted_all_themes_notice": "删除所有主题", "error_validating_song": "验证歌曲“{{song_name}}”时出错", - "error_validating_folder": "验证文件夹“{{folder_name}}时出错”", + "error_validating_folder": "验证文件夹“{{folder_name}}”时出错”", "error_validating_theme": "验证主题“{{theme_name}}”时出错", "validating_songs": "正在验证歌曲", "validating_folders": "正在验证文件夹", diff --git a/src/Config.ts b/src/Config.ts index ad1ee3bb..70a58217 100644 --- a/src/Config.ts +++ b/src/Config.ts @@ -2,20 +2,20 @@ import type {Tauri} from "$types/TauriTypes" import type {NoteImage} from "$cmp/shared/SvgNotes" export const APP_NAME: AppName = process.env.NEXT_PUBLIC_APP_NAME as AppName || ["Sky", "Genshin"][1] -export const APP_VERSION = '3.4.1' as const +export const APP_VERSION = '3.5.0' as const console.log(`${APP_NAME}-V${APP_VERSION}`) export const UPDATE_MESSAGE = (APP_NAME === 'Genshin' ? ` - - Added chinese, indonesian, portuguese translations for the app, we are looking for translators! - - Added button to install app to home screen - - Added custom keyboard layout as a note name type - - MIDI bug fixes + - Added looping of song section + - Added ability to hide notes in practice mode + - Select how many chunks to show in the visual sheet + - Added Turkish translation ` : ` - - Added chinese, indonesian, portuguese translations for the app, we are looking for translators! - - Added button to install app to home screen - - Added custom keyboard layout as a note name type - - MIDI bug fixes + - Added looping of song section + - Added ability to hide notes in practice mode + - Select how many chunks to show in the visual sheet + - Added Turkish translation `).trim() export const UPDATE_URL = process.env.NODE_ENV === 'development' @@ -37,9 +37,9 @@ export const NOTES_CSS_CLASSES = { export const BASE_THEME_CONFIG = { text: { - light: '#edeae5', + light: '#eae8e6', dark: '#151414', - note: APP_NAME === 'Genshin' ? '#aaaa82' : '#edeae5' + note: APP_NAME === 'Genshin' ? '#aaaa82' : '#eae8e6' } } export const INSTRUMENTS = APP_NAME === "Genshin" diff --git a/src/PagesVersions.ts b/src/PagesVersions.ts index b7392929..a201158d 100644 --- a/src/PagesVersions.ts +++ b/src/PagesVersions.ts @@ -14,10 +14,10 @@ export const PAGES_VERSIONS = { error: makePageVersion('error', 0), keybinds: makePageVersion('keybinds', 1, ['Fixed bug not allowing MIDI connection']), partners: makePageVersion('partners', 0), - player: makePageVersion('player', 2, + player: makePageVersion('player', 3, APP_NAME === "Genshin" - ? ["Added indonesian and portuguese translations", "⚠️ I know of the Nightwind Horn, it needs a lot of work to implement sustained notes"] - : ["Added indonesian and portuguese translations"] + ? ["Added sheet looping, note hiding in practice mode, custom visual sheet size, turkish translation", "Work on the Nightwind Horn, needs more time"] + : ["Added sheet looping, note hiding in practice mode, custom visual sheet size, turkish translation"] ), privacy: makePageVersion('privacy', 0), sheetVisualizer: makePageVersion('sheetVisualizer', 0), diff --git a/src/changelog.ts b/src/changelog.ts index 7cdd4c85..724f5d26 100644 --- a/src/changelog.ts +++ b/src/changelog.ts @@ -6,6 +6,18 @@ type Update = { } export const CHANGELOG: Update[] = [ + { + version: '3.5.0', + title: "Loop, Visual sheets settings, Turkish translation", + date: new Date('2024-07-02'), + changes: [ + 'Added looping of section for practice/playing/approaching mode', + 'The notes of the section to repeat can now be also be written as a number', + 'Added ability to hide notes in practice mode, to help you test your memory of the song', + 'You can now select how many chunks to show in the visual sheet', + 'Added Turkish translation', + ] + }, { version: '3.4.1', title: "Indonesian, Portuguese translations", diff --git a/src/components/AppBase.tsx b/src/components/AppBase.tsx index 3fb9dd4e..2bf684f5 100644 --- a/src/components/AppBase.tsx +++ b/src/components/AppBase.tsx @@ -102,7 +102,7 @@ function AppBase() { } } } catch (e) { - console.log(e) + console.error(e) logger.error(t('logs:storage_persisted_error'), 5000) } closeWelcomeScreen() diff --git a/src/components/pages/Player/PlayerKeyboard.tsx b/src/components/pages/Player/PlayerKeyboard.tsx index 4304bb28..13b7dcc7 100644 --- a/src/components/pages/Player/PlayerKeyboard.tsx +++ b/src/components/pages/Player/PlayerKeyboard.tsx @@ -27,10 +27,13 @@ interface KeyboardPlayerProps { approachRate: number keyboardYPosition: number speedChanger: typeof SPEED_CHANGERS[number] + visualSheetSize: number + hideNotesInPracticeMode: boolean } functions: { playSound: (index: number, layer?: NoteLayer) => void setHasSong: (override: boolean) => void + onSongFinished: () => void } } @@ -53,7 +56,7 @@ export default class KeyboardPlayer extends Component void)[] = [] timeouts: Timer[] = [] debouncedStateUpdate: Timer = 0 - + mode: 'play' | 'practice' | 'approaching' | undefined = 'play' constructor(props: KeyboardPlayerProps) { super(props) this.state = { @@ -66,7 +69,6 @@ export default class KeyboardPlayer extends Component { const {name} = shortcut if (name === "restart") { @@ -127,6 +129,14 @@ export default class KeyboardPlayer extends Component { + if (enabled) { + clearInterval(this.tickInterval) + this.tickInterval = setInterval(this.tick, this.tickTime) as unknown as number + } else { + clearInterval(this.tickInterval) + } + } componentWillUnmount() { this.cleanup.forEach(d => d()) this.songTimestamp = 0 @@ -153,6 +163,8 @@ export default class KeyboardPlayer extends Component { + this.mode = 'approaching' + this.setTicker(true) end = end ? end : song.notes.length const {speedChanger} = this.props.data const notes = [] @@ -168,7 +180,8 @@ export default class KeyboardPlayer extends Component { - if (!this.props.data.hasSong) return + if (!this.props.data.hasSong || this.mode !== "approaching") return const {approachingNotes} = this.state const {speedChanger} = this.props.data const stateNotes = approachingNotes @@ -187,7 +200,6 @@ export default class KeyboardPlayer extends Component { for (let i = 0; i < approachingNotes.length; i++) { const note = approachingNotes[i] @@ -227,6 +240,10 @@ export default class KeyboardPlayer extends Component arr.slice()), //removes ref @@ -234,12 +251,14 @@ export default class KeyboardPlayer extends Component { + this.mode = 'play' end = end ? end : song.notes.length this.songTimestamp = song.timestamp const {keyboard} = this.state + const { visualSheetSize} = this.props.data const notes = this.applySpeedChange(song.notes).slice(start, end) const mergedNotes = RecordedSong.mergeNotesIntoChunks(notes.map(n => n.clone())) - playerControlsStore.setPages(groupArrayEvery(mergedNotes, 10)) + playerControlsStore.setPages(groupArrayEvery(mergedNotes, visualSheetSize)) await delay(200) //add small start offset const startOffset = notes[0].time let previous = startOffset @@ -261,6 +280,7 @@ export default class KeyboardPlayer extends Component { const {speedChanger} = this.props.data @@ -271,9 +291,11 @@ export default class KeyboardPlayer extends Component { + this.mode = 'practice' //TODO move this to the song class end = end ? end : song.notes.length const {keyboard} = this.state + const {visualSheetSize} = this.props.data const notes = this.applySpeedChange(song.notes).slice(start, end) const chunks = RecordedSong.mergeNotesIntoChunks(notes.map(n => n.clone())) if (chunks.length === 0) return @@ -292,7 +314,7 @@ export default class KeyboardPlayer extends Component { const {keyboard, songToPractice} = this.state if (songToPractice.length > 0) { @@ -340,6 +363,9 @@ export default class KeyboardPlayer extends Component 0) { const nextChunk = songToPractice[0] const nextNextChunk = songToPractice[1] @@ -404,6 +430,7 @@ export default class KeyboardPlayer extends Component
void } //TODO use css vars for the colors -function Note({note, approachingNotes, handleClick, noteText, data}: NoteProps) { +function Note({note, approachingNotes, handleClick, noteText, data, hideNote}: NoteProps) { const [textColor, setTextColor] = useState(getTextColor()) useEffect(() => { const dispose = observe(ThemeProvider.state.data, () => { @@ -75,7 +76,7 @@ function Note({note, approachingNotes, handleClick, noteText, data}: NoteProps) /> }
{APP_NAME === 'Genshin' && } { return p.note === n.note && p.data.approachRate === n.data.approachRate && p.data.instrument === n.data.instrument && p.handleClick === n.handleClick && p.noteText === n.noteText && p.approachingNotes === n.approachingNotes + && p.hideNote === n.hideNote }) as typeof Note function getApproachCircleColor(index: number) { @@ -134,13 +136,23 @@ const ApproachCircle = memo(function ApproachCircle({approachRate, index}: Appro return prev.approachRate === next.approachRate && prev.index === next.index }) -function parseBorderFill(status: NoteStatus) { +function parseBorderFill(status: NoteStatus, disabled: boolean) { + if (disabled) return 'var(--note-border-fill)' if (status === "clicked") return "transparent" else if (status === 'toClickNext' || status === 'toClickAndNext') return '#63aea7' return 'var(--note-border-fill)' } -function parseClass(status: NoteStatus) { +function parseClass(status: NoteStatus, disabled: boolean) { + //TODO there is a bug where if two notes to be clicked are the same, the first click will not be shown, as the transition is the same + if (disabled) { + switch (status) { + case 'clicked': + return "click-event" + default: + return '' + } + } switch (status) { case 'clicked': return "click-event" diff --git a/src/components/pages/Player/PlayerPagesRenderer.tsx b/src/components/pages/Player/PlayerPagesRenderer.tsx index 65027345..89bf7210 100644 --- a/src/components/pages/Player/PlayerPagesRenderer.tsx +++ b/src/components/pages/Player/PlayerPagesRenderer.tsx @@ -8,12 +8,19 @@ import s from './VisualSheet.module.css' const layoutType = APP_NAME === 'Genshin' ? 'Keyboard layout' : 'ABC' -function _PlayerVisualSheetRenderer() { + +interface PlayerVisualSheetRendererProps { + columns: number +} +function _PlayerVisualSheetRenderer({columns}: PlayerVisualSheetRendererProps) { const pagesState = useObservableObject(playerControlsStore.pagesState) const [theme] = useTheme() return <> {pagesState.pages.length > 0 && -
+
{pagesState.currentPage?.map((e, i) => } -export const PlayerVisualSheetRenderer = memo(_PlayerVisualSheetRenderer, () => true) \ No newline at end of file +export const PlayerVisualSheetRenderer = memo( + _PlayerVisualSheetRenderer, + (prev, next) => prev.columns === next.columns +) \ No newline at end of file diff --git a/src/components/pages/Player/PlayerSlider.tsx b/src/components/pages/Player/PlayerSlider.tsx index ac50ba2b..a0e1e17c 100644 --- a/src/components/pages/Player/PlayerSlider.tsx +++ b/src/components/pages/Player/PlayerSlider.tsx @@ -2,20 +2,25 @@ import {DEFAULT_DOM_RECT} from "$config" import Memoized from "$cmp/shared/Utility/Memoized" import {useObservableObject} from "$lib/Hooks/useObservable" import {clamp} from "$lib/utils/Utilities" -import {memo, useEffect, useRef, useState} from "react" +import {memo, MouseEvent, useCallback, useEffect, useRef, useState} from "react" import {BsTriangleFill} from "react-icons/bs" import {playerControlsStore} from "$stores/PlayerControlsStore" import sl from "./Slider.module.css" +import {setTimeout} from "worker-timers"; -export function _PlayerSlider() { +interface PlayerSliderProps{ + onChange?: (start: number, end: number) => void +} + +export function _PlayerSlider({onChange}: PlayerSliderProps) { const sliderState = useObservableObject(playerControlsStore.state) const [selectedThumb, setSelectedThumb] = useState<'start' | 'end' | null>(null) const [inputDimension, setInputDimension] = useState(DEFAULT_DOM_RECT) const thumb1 = useRef(null) const thumb2 = useRef(null) const slider = useRef(null) - + const [inputsEnabled, setInputsEnabled] = useState(true) useEffect(() => { //TODO remove the dependency and instead use the callback for the set state if (selectedThumb === null) return @@ -32,6 +37,15 @@ export function _PlayerSlider() { } }, [selectedThumb]) + function handleSelectChange(val: number, type: 'start' | "end") { + if (type === 'start') { + playerControlsStore.setPosition(Math.max(0, Math.min(val, sliderState.end))) + } else { + playerControlsStore.setState({end: Math.min(sliderState.size, Math.max(val, sliderState.position))}) + } + onChange?.(playerControlsStore.current, playerControlsStore.end) + } + const handleSliderClick = (event: React.PointerEvent) => { if (slider.current && thumb1.current && thumb2.current) { const size = slider.current.getBoundingClientRect() @@ -51,6 +65,17 @@ export function _PlayerSlider() { setSelectedThumb(null) } + const enableInputs = useCallback((e: MouseEvent) => { + setInputsEnabled(true) + setTimeout(() => { + // @ts-ignore + e.currentTarget?.focus() + }, 50) + }, []) + const disableInputs = useCallback(() => { + setInputsEnabled(false) + }, []) + const handleSliderMove = (event: React.PointerEvent, override?: 'start' | 'end') => { if (selectedThumb === null && !override) return const currentThumb = override || selectedThumb @@ -64,6 +89,8 @@ export function _PlayerSlider() { } else { if (value - sliderState.position > 1) playerControlsStore.setState({end: value}) } + onChange?.(playerControlsStore.current, playerControlsStore.end) + } const start = sliderState.size !== 0 ? sliderState.position / sliderState.size * 100 : 0 const end = sliderState.size !== 0 ? sliderState.end / sliderState.size * 100 : 100 @@ -84,18 +111,32 @@ export function _PlayerSlider() {
-
- {sliderState.end} -
+ handleSelectChange(+e.target.value, 'end')} + />
-
- {sliderState.position} -
+ handleSelectChange(+e.target.value, 'start')} + /> @@ -105,4 +146,6 @@ export function _PlayerSlider() { } -export const PlayerSlider = memo(_PlayerSlider, () => true) \ No newline at end of file +export const PlayerSlider = memo(_PlayerSlider, (p,v) => { + return p.onChange === v.onChange +}) \ No newline at end of file diff --git a/src/components/pages/Player/PlayerSongControls.tsx b/src/components/pages/Player/PlayerSongControls.tsx index 8513a752..fc8fcd3a 100644 --- a/src/components/pages/Player/PlayerSongControls.tsx +++ b/src/components/pages/Player/PlayerSongControls.tsx @@ -1,7 +1,7 @@ import {SPEED_CHANGERS} from "$config" import {MemoizedIcon} from "$cmp/shared/Utility/Memoized"; -import {FaStop, FaSyncAlt} from "react-icons/fa"; -import {ChangeEvent, memo} from "react"; +import {FaEye, FaEyeSlash, FaStop} from "react-icons/fa"; +import {ChangeEvent, memo, useCallback, useEffect, useState} from "react"; import {playerStore} from "$stores/PlayerStore"; import {playerControlsStore} from "$stores/PlayerControlsStore"; import {hasTooltip, Tooltip} from '$cmp/shared/Utility/Tooltip' @@ -14,6 +14,7 @@ import {PlayerVisualSheetRenderer} from "./PlayerPagesRenderer"; import s from './Slider.module.css' import svs from './VisualSheet.module.css' import {useTranslation} from "react-i18next"; +import {VscDebugRestart} from "react-icons/vsc"; interface PlayerSongControlsProps { onRestart: () => void @@ -21,7 +22,13 @@ interface PlayerSongControlsProps { onToggleRecordAudio: (override: boolean) => void onToggleMetronome: () => void speedChanger: typeof SPEED_CHANGERS[number] + loopEnabled: boolean + + hidePracticeNotes: boolean | undefined + setHidePracticeNotes: (hide: boolean) => void + setLoopEnabled: (enabled: boolean) => void isVisualSheetVisible: boolean + visualSheetColumns: number hasSong: boolean isMetronomePlaying: boolean isRecordingAudio: boolean @@ -36,10 +43,24 @@ function _PlayerSongControls({ onToggleMetronome, isRecordingAudio, onToggleRecordAudio, - isVisualSheetVisible + isVisualSheetVisible, + visualSheetColumns, + loopEnabled, + setLoopEnabled, + hidePracticeNotes, + setHidePracticeNotes, }: PlayerSongControlsProps) { + const [needsRefresh, setNeedsRefresh] = useState(false) const songData = useObservableObject(playerStore.state) - const {t} = useTranslation(["player", 'common', "settings"]) + const {t} = useTranslation(["player", 'common', "settings", "shortcuts"]) + + const toggleNeedsRefresh = useCallback(() => { + setNeedsRefresh(true) + }, []) + + useEffect(() => { + setNeedsRefresh(false) + }, [songData.key]); return <> {songData.eventType === 'approaching' && @@ -57,8 +78,32 @@ function _PlayerSongControls({ }
-
-
+
+ {hidePracticeNotes !== undefined && + setHidePracticeNotes(!hidePracticeNotes)} + tooltip={t('hide_practice_notes')} + toggled={hidePracticeNotes} + ariaLabel={t("hide_practice_notes")} + > + {hidePracticeNotes + ? + : + } + + } + setLoopEnabled(!loopEnabled)} + > + {t('loop')} + +
+
+