Spaces:
Build error
Build error
add feedback system
Browse files- README.md +2 -0
- locales/en.json +1 -35
- locales/ru.json +1 -35
- ui_components.py +20 -0
README.md
CHANGED
|
@@ -18,6 +18,7 @@ license: mit
|
|
| 18 |
[](https://huggingface.co/datasets/loim/ru_fantasy_characters)
|
| 19 |
|
| 20 |
## ✨ Features
|
|
|
|
| 21 |
- **Search** by name, description, or tags
|
| 22 |
- **Filters**: absurdity, mood, tags
|
| 23 |
- **RPG character cards** in Markdown (one-click copy)
|
|
@@ -54,6 +55,7 @@ license: mit
|
|
| 54 |
[](https://huggingface.co/datasets/loim/ru_fantasy_characters)
|
| 55 |
|
| 56 |
## ✨ Особенности
|
|
|
|
| 57 |
- **Поиск** по имени, описанию или тегам
|
| 58 |
- **Фильтры**: абсурдность, настроение, теги
|
| 59 |
- **RPG-карточки** в формате Markdown (копирование в 1 клик)
|
|
|
|
| 18 |
[](https://huggingface.co/datasets/loim/ru_fantasy_characters)
|
| 19 |
|
| 20 |
## ✨ Features
|
| 21 |
+
- ***Now you can leave feedback!***
|
| 22 |
- **Search** by name, description, or tags
|
| 23 |
- **Filters**: absurdity, mood, tags
|
| 24 |
- **RPG character cards** in Markdown (one-click copy)
|
|
|
|
| 55 |
[](https://huggingface.co/datasets/loim/ru_fantasy_characters)
|
| 56 |
|
| 57 |
## ✨ Особенности
|
| 58 |
+
- ***Теперь вы можете оставить отзыв!***
|
| 59 |
- **Поиск** по имени, описанию или тегам
|
| 60 |
- **Фильтры**: абсурдность, настроение, теги
|
| 61 |
- **RPG-карточки** в формате Markdown (копирование в 1 клик)
|
locales/en.json
CHANGED
|
@@ -1,35 +1 @@
|
|
| 1 |
-
{
|
| 2 |
-
"filter_lang": "Languages",
|
| 3 |
-
"filter_all": "All",
|
| 4 |
-
"filter_title": "🔮 Filters",
|
| 5 |
-
"filter_search": "🔍 Search by name/description",
|
| 6 |
-
"filter_sort_title": "Sorting",
|
| 7 |
-
"filter_sort": ["By name (A→Z)", "By name (Z→A)", "By absurdity (↑)", "By absurdity (↓)", "Random (🎲)"],
|
| 8 |
-
"filter_absurd": "Absurdity level",
|
| 9 |
-
"filter_mood": "Mood",
|
| 10 |
-
"filter_tags": "Tags",
|
| 11 |
-
"main_not_found": "No characters found. Try adjusting the filters.",
|
| 12 |
-
"main_counter": "Characters per page",
|
| 13 |
-
"main_page": "Page",
|
| 14 |
-
"main_found": "**Characters found:** {} (Page {}/{})",
|
| 15 |
-
"pages_first": "⏪ First",
|
| 16 |
-
"pages_before": "◀️ Back",
|
| 17 |
-
"pages_next": "Next ▶️",
|
| 18 |
-
"pages_last": "Last ⏩",
|
| 19 |
-
"char_world": "🌍 World:",
|
| 20 |
-
"char_mood": "🎭 Mood:",
|
| 21 |
-
"char_absurd": "🌀 Absurdity:",
|
| 22 |
-
"char_tags": "🏷️ Tags:",
|
| 23 |
-
"char_desc": "📖 Description:",
|
| 24 |
-
"char_style": "💬 Speech style:",
|
| 25 |
-
"char_rpg_card": "📋 RPG card",
|
| 26 |
-
"rpt_card_world": "World:",
|
| 27 |
-
"rpt_card_name": "Name:",
|
| 28 |
-
"rpt_card_desc": "Appearance:",
|
| 29 |
-
"rpt_card_story": "Personality:",
|
| 30 |
-
"rpt_card_style": "Speech:",
|
| 31 |
-
"rpt_card_msg": "First message:",
|
| 32 |
-
"rating_text": "Rating: 👍 {} | 👎 {}",
|
| 33 |
-
"rating_like": "👍 Like",
|
| 34 |
-
"rating_dislike": "👎 Dislike"
|
| 35 |
-
}
|
|
|
|
| 1 |
+
{"filter_lang":"Languages","filter_all":"All","filter_title":"🔮 Filters","filter_search":"🔍 Search by name/description","filter_sort_title":"Sorting","filter_sort":["By name (A→Z)","By name (Z→A)","By absurdity (↑)","By absurdity (↓)","Random (🎲)"],"filter_absurd":"Absurdity level","filter_mood":"Mood","filter_tags":"Tags","main_not_found":"No characters found. Try adjusting the filters.","main_counter":"Characters per page","main_page":"Page","main_found":"**Characters found:** {} (Page {}/{})","pages_first":"⏪ First","pages_before":"◀️ Back","pages_next":"Next ▶️","pages_last":"Last ⏩","char_world":"🌍 World:","char_mood":"🎭 Mood:","char_absurd":"🌀 Absurdity:","char_tags":"🏷️ Tags:","char_desc":"📖 Description:","char_style":"💬 Speech style:","char_rpg_card":"📋 RPG card","rpt_card_world":"World:","rpt_card_name":"Name:","rpt_card_desc":"Appearance:","rpt_card_story":"Personality:","rpt_card_style":"Speech:","rpt_card_msg":"First message:","rating_text":"Rating: 👍 {} | 👎 {}","rating_like":"👍 Like","rating_dislike":"👎 Dislike","feedback_quest":"Would you like to leave feedback or suggest an improvement?","feedback_header":"Leave your feedback or suggest an improvement","feedback_rating":"Rate the project (1 - very poor, 5 - excellent)","feedback_comment_label":"Your comment","feedback_comment_help":"Leave your feedback or suggestion for improvement","feedback_send_btn":"Submit feedback","feedback_warn":"Please write a comment or select a rating before submitting","feedback_suc":"Thank you for your feedback!"}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
locales/ru.json
CHANGED
|
@@ -1,35 +1 @@
|
|
| 1 |
-
{
|
| 2 |
-
"filter_lang": "Языки",
|
| 3 |
-
"filter_all": "Все",
|
| 4 |
-
"filter_title": "🔮 Фильтры",
|
| 5 |
-
"filter_search": "🔍 Поиск по имени/описанию",
|
| 6 |
-
"filter_sort_title": "Сортировка",
|
| 7 |
-
"filter_sort": ["По имени (А→Я)", "По имени (Я→А)", "По абсурдности (↑)", "По абсурдности (↓)", "Случайно (🎲)"],
|
| 8 |
-
"filter_absurd": "Уровень абсурдности",
|
| 9 |
-
"filter_mood": "Настроение",
|
| 10 |
-
"filter_tags": "Теги",
|
| 11 |
-
"main_not_found": "Персонажи не найдены. Попробуйте изменить фильтры.",
|
| 12 |
-
"main_counter": "Персонажей на странице",
|
| 13 |
-
"main_page": "Страница",
|
| 14 |
-
"main_found": "**Найдено персонажей:** {} (Страница {}/{})",
|
| 15 |
-
"pages_first": "⏪ Начало",
|
| 16 |
-
"pages_before": "◀️ Назад",
|
| 17 |
-
"pages_next": "Вперед ▶️",
|
| 18 |
-
"pages_last": "Конец ⏩",
|
| 19 |
-
"char_world": "🌍 Мир:",
|
| 20 |
-
"char_mood": "🎭 Настроение:",
|
| 21 |
-
"char_absurd": "🌀 Абсурдность:",
|
| 22 |
-
"char_tags": "🏷️ Теги:",
|
| 23 |
-
"char_desc": "📖 Описание:",
|
| 24 |
-
"char_style": "💬 Стиль речи:",
|
| 25 |
-
"char_rpg_card": "📋 RPG-карточка",
|
| 26 |
-
"rpt_card_world": "Мир:",
|
| 27 |
-
"rpt_card_name": "Имя:",
|
| 28 |
-
"rpt_card_desc": "Внешность:",
|
| 29 |
-
"rpt_card_story": "Характер:",
|
| 30 |
-
"rpt_card_style": "Речь:",
|
| 31 |
-
"rpt_card_msg": "Первая реплика:",
|
| 32 |
-
"rating_text": "Рейтинг: 👍 {} | 👎 {}",
|
| 33 |
-
"rating_like": "👍 Нравится",
|
| 34 |
-
"rating_dislike": "👎 Не нравится"
|
| 35 |
-
}
|
|
|
|
| 1 |
+
{"filter_lang":"Языки","filter_all":"Все","filter_title":"🔮 Фильтры","filter_search":"🔍 Поиск по имени/описанию","filter_sort_title":"Сортировка","filter_sort":["По имени (А→Я)","По имени (Я→А)","По абсурдности (↑)","По абсурдности (↓)","Случайно (🎲)"],"filter_absurd":"Уровень абсурдности","filter_mood":"Настроение","filter_tags":"Теги","main_not_found":"Персонажи не найдены. Попробуйте изменить фильтры.","main_counter":"Персонажей на странице","main_page":"Страница","main_found":"**Найдено персонажей:** {} (Страница {}/{})","pages_first":"⏪ Начало","pages_before":"◀️ Назад","pages_next":"Вперед ▶️","pages_last":"Конец ⏩","char_world":"🌍 Мир:","char_mood":"🎭 Настроение:","char_absurd":"🌀 Абсурдность:","char_tags":"🏷️ Теги:","char_desc":"📖 Описание:","char_style":"💬 Стиль речи:","char_rpg_card":"📋 RPG-карточка","rpt_card_world":"Мир:","rpt_card_name":"Имя:","rpt_card_desc":"Внешность:","rpt_card_story":"Характер:","rpt_card_style":"Речь:","rpt_card_msg":"Первая реплика:","rating_text":"Рейтинг: 👍 {} | 👎 {}","rating_like":"👍 Нравится","rating_dislike":"👎 Не нравится","feedback_quest":"Хотите оставить отзыв или предложить улучшение?","feedback_header":"Оставьте ваш отзыв или предложите улучшение","feedback_rating":"Оцените проект (1 - очень плохо, 5 - отлично)","feedback_comment_label":"Ваш комментарий","feedback_comment_help":"Оставьте ваш отзыв или предложение по улучшению","feedback_send_btn":"Отправить отзыв","feedback_warn":"Пожалуйста, напишите комментарий или выберите оценку перед отправкой","feedback_suc":"Спасибо за ваш отзыв!"}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ui_components.py
CHANGED
|
@@ -113,8 +113,28 @@ def render_character_rating(locale, database, localS, row):
|
|
| 113 |
localS.setItem("rated", st.session_state.rated)
|
| 114 |
st.rerun()
|
| 115 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 116 |
|
| 117 |
def render_main_content(locale, database, localS, filtered_df):
|
|
|
|
|
|
|
| 118 |
"""Рендеринг основного контента с пагинацией"""
|
| 119 |
st.title("🧙 Fantasy Characters Explorer")
|
| 120 |
|
|
|
|
| 113 |
localS.setItem("rated", st.session_state.rated)
|
| 114 |
st.rerun()
|
| 115 |
|
| 116 |
+
def feedback_system(locale, database, localS):
|
| 117 |
+
if 'feedback_enabled' not in st.session_state:
|
| 118 |
+
st.session_state.feedback_enabled = False
|
| 119 |
+
|
| 120 |
+
if st.session_state.feedback_enabled:
|
| 121 |
+
st.header(locale["feedback_header"])
|
| 122 |
+
rating = st.slider(locale["feedback_rating"], 1, 5, 3)
|
| 123 |
+
comment = st.text_area(locale["feedback_comment_label"], help=locale["feedback_comment_help"])
|
| 124 |
+
if st.button(locale["feedback_send_btn"]):
|
| 125 |
+
if comment.strip() == "" and rating == 3:
|
| 126 |
+
st.warning(locale["feedback_warn"])
|
| 127 |
+
else:
|
| 128 |
+
upsert_data(database, "feedback", {"text": comment.strip(), "rating": rating})
|
| 129 |
+
st.success(locale["feedback_suc"])
|
| 130 |
+
else:
|
| 131 |
+
if st.button(locale["feedback_quest"]):
|
| 132 |
+
st.session_state.feedback_enabled = True
|
| 133 |
+
st.rerun()
|
| 134 |
|
| 135 |
def render_main_content(locale, database, localS, filtered_df):
|
| 136 |
+
feedback_system(locale, database, localS)
|
| 137 |
+
|
| 138 |
"""Рендеринг основного контента с пагинацией"""
|
| 139 |
st.title("🧙 Fantasy Characters Explorer")
|
| 140 |
|