33 Commits
0.5.0 ... 0.5.5

Author SHA1 Message Date
jeffser
6fc30bf2a7 Merge branch 'main' of github.com-jeffser:Jeffser/Alpaca 2024-05-20 19:20:40 -06:00
jeffser
b16e2aa7f7 Preparing for 0.5.5 2024-05-20 19:20:29 -06:00
Jeffry Samuel
b64b96461c maybe 2024-05-20 19:02:51 -06:00
jeffser
c7f8c560a1 Better UI for 'Manage Models' dialog 2024-05-20 17:36:22 -06:00
jeffser
26bc4fe37f Replaced model description with a button to open Ollama's website for the model 2024-05-20 16:29:48 -06:00
jeffser
ce427feee4 Added myself to the credits as the spanish translator 2024-05-20 16:06:04 -06:00
jeffser
9c1f239f53 Better UI on the sidebar 2024-05-20 15:46:25 -06:00
jeffser
478c699aff Using XDG properly to get config folder '.var/app/com.jeffser.Alpaca/config' 2024-05-20 15:25:33 -06:00
jeffser
5eef0887eb Better summary 2024-05-20 15:19:07 -06:00
jeffser
3438c1716e Merge branch 'main' of github.com-jeffser:Jeffser/Alpaca 2024-05-20 14:46:29 -06:00
jeffser
113602dea7 Updated README 2024-05-20 14:46:23 -06:00
Alex K
ac93581045 Update Russian translation (#16)
* Add files via upload

* Add files via upload

* Update ru.po

* Add files via upload

* Update ru.po

* Add files via upload

---------

Co-authored-by: Jeffry Samuel <69224322+Jeffser@users.noreply.github.com>
2024-05-20 13:07:34 -06:00
Alex K
94f8e9550e Update Russian translation (#15)
* Add files via upload

* Add files via upload

---------

Co-authored-by: Jeffry Samuel <69224322+Jeffser@users.noreply.github.com>
2024-05-19 22:01:28 -06:00
jeffser
f4ea0b7389 Quick fix 2024-05-19 21:54:42 -06:00
jeffser
849867728c I forgot this text 2024-05-19 21:33:43 -06:00
jeffser
9fba69566d Updating template for translations 2024-05-19 21:29:47 -06:00
jeffser
86d2ee0be0 Preparing for 0.5.1 2024-05-19 21:29:06 -06:00
jeffser
f333f50016 User can now leave chat name empty when creating a new one, it will at a placeholder text 2024-05-19 21:13:30 -06:00
jeffser
47faa4581e Fix: Spanish translation wasn't working 2024-05-19 20:28:19 -06:00
jeffser
c8cc4f3960 Spanish translation 2024-05-19 20:18:02 -06:00
jeffser
8834a4bb88 Added template for translations and an empty spanish .po 2024-05-19 19:45:27 -06:00
jeffser
51c01a5afa Removed _ from some text 2024-05-19 19:41:27 -06:00
jeffser
e550f49a18 Merge branch 'main' of github.com-jeffser:Jeffser/Alpaca 2024-05-19 19:30:46 -06:00
jeffser
65c46570c5 Fixes for translating 2024-05-19 19:30:00 -06:00
Alex K
126f588fcb Add files via upload (#5) 2024-05-19 19:08:11 -06:00
jeffser
6fbf6e139b Better translation support, adding dialogs 2024-05-19 19:06:11 -06:00
jeffser
15fdd0ae1a Added interrupt 'stop' button 2024-05-19 18:29:20 -06:00
jeffser
0096346b0c Quick fixes 2024-05-19 17:55:01 -06:00
jeffser
e19aece78a Quick fix 2024-05-19 17:36:32 -06:00
jeffser
d540114ae5 Added support for background pulling of models 2024-05-19 17:09:58 -06:00
jeffser
454aeac5e2 Better scalling for different window sizes 2024-05-19 14:35:37 -06:00
jeffser
f6cc6ac894 Fixed: can't close app normally if first time setup fails 2024-05-19 12:33:24 -06:00
jeffser
adef5b5671 Added basic shortcuts 2024-05-19 12:10:14 -06:00
14 changed files with 3467 additions and 294 deletions

View File

@@ -27,7 +27,8 @@ An [Ollama](https://github.com/ollama/ollama) client made with GTK4 and Adwaita.
## Future features!
- Document recognition
- Import / Export chats
- Delete / Edit messages
- Snap Package (maybe)
## Screenies
Login to Ollama instance | Chatting with models | Managing models

View File

@@ -5,9 +5,8 @@
<project_license>GPL-3.0-or-later</project_license>
<launchable type="desktop-id">com.jeffser.Alpaca.desktop</launchable>
<name>Alpaca</name>
<summary>An Ollama client</summary>
<summary>Chat with multiple AI models</summary>
<description>
<p>Chat with multiple AI models</p>
<p>An Ollama client</p>
<p>Features</p>
<ul>
@@ -52,6 +51,54 @@
<url type="homepage">https://github.com/Jeffser/Alpaca</url>
<url type="donation">https://github.com/sponsors/Jeffser</url>
<releases>
<release version="0.5.5" date="2024-05-20">
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.5.5</url>
<description>
<p>Yet Another Daily Update</p>
<ul>
<li>Added better UI for 'Manage Models' dialog</li>
<li>Added better UI for the chat sidebar</li>
<li>Replaced model description with a button to open Ollama's website for the model</li>
<li>Added myself to the credits as the spanish translator</li>
<li>Using XDG properly to get config folder</li>
<li>Update for translations</li>
</ul>
<p>
Please report any errors to the issues page, thank you.
</p>
</description>
</release>
<release version="0.5.2" date="2024-05-19">
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.5.2</url>
<description>
<p>Quick Fix</p>
<ul>
<li>The last update had some mistakes in the description of the update</li>
</ul>
<p>
Please report any errors to the issues page, thank you.
</p>
</description>
</release>
<release version="0.5.1" date="2024-05-19">
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.5.1</url>
<description>
<p>Another Daily Update</p>
<ul>
<li>Added full Spanish translation</li>
<li>Added support for background pulling of multiple models</li>
<li>Added interrupt button</li>
<li>Added basic shortcuts</li>
<li>Better translation support</li>
<li>User can now leave chat name empty when creating a new one, it will add a placeholder name</li>
<li>Better scalling for different window sizes</li>
<li>Fixed: Can't close app if first time setup fails</li>
</ul>
<p>
Please report any errors to the issues page, thank you.
</p>
</description>
</release>
<release version="0.5.0" date="2024-05-19">
<url type="details">https://github.com/Jeffser/Alpaca/releases/tag/0.5.0</url>
<description>

View File

@@ -1,5 +1,5 @@
project('Alpaca',
version: '0.5.0',
version: '0.5.5',
meson_version: '>= 0.62.0',
default_options: [ 'warning_level=2', 'werror=false', ],
)

View File

@@ -1 +1,2 @@
ru
es

616
po/alpaca.pot Normal file
View File

@@ -0,0 +1,616 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-20 19:15-0600\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: data/com.jeffser.Alpaca.desktop.in:3
#: data/com.jeffser.Alpaca.metainfo.xml.in:7
msgid "Alpaca"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:8
msgid "Chat with multiple AI models"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:10
msgid "An Ollama client"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:11
#: data/com.jeffser.Alpaca.metainfo.xml.in:209
msgid "Features"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:13
#: data/com.jeffser.Alpaca.metainfo.xml.in:211
msgid "Talk to multiple models in the same conversation"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:14
#: data/com.jeffser.Alpaca.metainfo.xml.in:212
msgid "Pull and delete models from the app"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:16 src/window.ui:392
msgid "Disclaimer"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:17
msgid ""
"This project is not affiliated at all with Ollama, I'm not responsible for "
"any damages to your device or software caused by running code given by any "
"models."
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:20
msgid "Jeffry Samuel Eduarte Rojas"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:38
msgid "Welcome dialog"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:42
msgid "A conversation involving multiple models"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:46
msgid "Managing models"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:57
msgid "Yet Another Daily Update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:59
msgid "Added better UI for 'Manage Models' dialog"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:60
msgid "Added better UI for the chat sidebar"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:61
msgid ""
"Replaced model description with a button to open Ollama's website for the "
"model"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:62
msgid "Added myself to the credits as the spanish translator"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:63
msgid "Using XDG properly to get config folder"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:64
msgid "Update for translations"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:66
#: data/com.jeffser.Alpaca.metainfo.xml.in:78
#: data/com.jeffser.Alpaca.metainfo.xml.in:97
#: data/com.jeffser.Alpaca.metainfo.xml.in:118
#: data/com.jeffser.Alpaca.metainfo.xml.in:134
#: data/com.jeffser.Alpaca.metainfo.xml.in:150
#: data/com.jeffser.Alpaca.metainfo.xml.in:164
#: data/com.jeffser.Alpaca.metainfo.xml.in:174
#: data/com.jeffser.Alpaca.metainfo.xml.in:192
#: data/com.jeffser.Alpaca.metainfo.xml.in:214
msgid "Please report any errors to the issues page, thank you."
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:74
msgid "Quick Fix"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:76
msgid "The last update had some mistakes in the description of the update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:86
msgid "Another Daily Update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:88
msgid "Added full Spanish translation"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:89
msgid "Added support for background pulling of multiple models"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:90
msgid "Added interrupt button"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:91
msgid "Added basic shortcuts"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:92
msgid "Better translation support"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:93
msgid ""
"User can now leave chat name empty when creating a new one, it will add a "
"placeholder name"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:94
msgid "Better scalling for different window sizes"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:95
msgid "Fixed: Can't close app if first time setup fails"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:105
msgid "Really Big Update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:107
msgid "Added multiple chats support!"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:108
msgid "Added Pango Markup support (bold, list, title, subtitle, monospace)"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:109
msgid "Added autoscroll if the user is at the bottom of the chat"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:110
msgid "Added support for multiple tags on a single model"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:111
msgid "Added better model management dialog"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:112
msgid "Added loading spinner when sending message"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:113
msgid "Added notifications if app is not active and a model pull finishes"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:114
msgid "Added new symbolic icon"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:115
msgid "Added frame to message textview widget"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:116
msgid "Fixed \"code blocks shouldn't be editable\""
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:126
#: data/com.jeffser.Alpaca.metainfo.xml.in:183
msgid "Big Update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:128
msgid "Added code highlighting"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:129
msgid "Added image recognition (llava model)"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:130
msgid "Added multiline prompt"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:131
msgid "Fixed some small bugs"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:132
msgid "General optimization"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:142
msgid "Fixes and features"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:144
msgid "Russian translation (thanks github/alexkdeveloper)"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:145
msgid "Fixed: Cannot close app on first setup"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:146
msgid "Fixed: Brand colors for Flathub"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:147
msgid "Fixed: App description"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:148
msgid "Fixed: Only show 'save changes dialog' when you actually change the url"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:158
msgid "0.2.2 Bug fixes"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:160
msgid "Toast messages appearing behind dialogs"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:161
msgid "Local model list not updating when changing servers"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:162
msgid "Closing the setup dialog closes the whole app"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:172
msgid "0.2.1 Data saving fix"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:173
msgid ""
"The app didn't save the config files and chat history to the right "
"directory, this is now fixed"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:182
msgid "0.2.0"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:184
msgid "New Features"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:186
msgid "Restore chat after closing the app"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:187
msgid "A button to clear the chat"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:188
msgid "Fixed multiple bugs involving how messages are shown"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:189
msgid "Added welcome dialog"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:190
msgid "More stability"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:200
msgid "0.1.2 Quick fixes"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:201
msgid ""
"This release fixes some metadata needed to have a proper Flatpak application"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:207
msgid "0.1.1 Stable Release"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:208
msgid "This is the first public version of Alpaca"
msgstr ""
#: src/window.py:47 src/window.py:776
msgid "New Chat"
msgstr ""
#: src/window.py:86
msgid "An error occurred"
msgstr ""
#: src/window.py:87
msgid "Failed to connect to server"
msgstr ""
#: src/window.py:88
msgid "Could not list local models"
msgstr ""
#: src/window.py:89
msgid "Could not delete model"
msgstr ""
#: src/window.py:90
msgid "Could not pull model"
msgstr ""
#: src/window.py:91
msgid "Cannot open image"
msgstr ""
#: src/window.py:92
msgid "Cannot delete chat because it's the only one left"
msgstr ""
#: src/window.py:95
msgid "Please select a model before chatting"
msgstr ""
#: src/window.py:96
msgid "Chat cannot be cleared while receiving a message"
msgstr ""
#: src/window.py:99
msgid "Model deleted successfully"
msgstr ""
#: src/window.py:100
msgid "Model pulled successfully"
msgstr ""
#: src/window.py:425
msgid "Task Complete"
msgstr ""
#: src/window.py:425
msgid "Model '{}' pulled successfully."
msgstr ""
#: src/window.py:430
msgid "Pull Model Error"
msgstr ""
#: src/window.py:430
msgid "Failed to pull model '{}' due to network error."
msgstr ""
#: src/window.py:446
msgid "Stop Model"
msgstr ""
#: src/window.py:447
msgid "Are you sure you want to stop pulling '{}'?"
msgstr ""
#: src/window.py:450 src/window.py:489 src/window.py:512 src/window.py:593
#: src/window.py:654 src/window.py:703 src/window.py:730 src/window.py:763
#: src/window.py:803
msgid "Cancel"
msgstr ""
#: src/window.py:451
msgid "Stop"
msgstr ""
#: src/window.py:485
msgid "Delete Model"
msgstr ""
#: src/window.py:486 src/window.py:727
msgid "Are you sure you want to delete '{}'?"
msgstr ""
#: src/window.py:490 src/window.py:731
msgid "Delete"
msgstr ""
#: src/window.py:507
msgid "Pull Model"
msgstr ""
#: src/window.py:508
msgid "Please select a tag to pull '{}'"
msgstr ""
#: src/window.py:513
msgid "Pull"
msgstr ""
#: src/window.py:589 src/window.ui:426
msgid "Clear Chat"
msgstr ""
#: src/window.py:590
msgid "Are you sure you want to clear the chat?"
msgstr ""
#: src/window.py:594
msgid "Clear"
msgstr ""
#: src/window.py:650
msgid "Save Changes"
msgstr ""
#: src/window.py:651
msgid "Do you want to save the URL change?"
msgstr ""
#: src/window.py:655
msgid "Discard"
msgstr ""
#: src/window.py:656
msgid "Save"
msgstr ""
#: src/window.py:699
msgid "Remove Image"
msgstr ""
#: src/window.py:700
msgid "Are you sure you want to remove image?"
msgstr ""
#: src/window.py:704
msgid "Remove"
msgstr ""
#: src/window.py:726
msgid "Delete Chat"
msgstr ""
#: src/window.py:757
msgid "Rename Chat"
msgstr ""
#: src/window.py:764
msgid "Rename"
msgstr ""
#: src/window.py:784
msgid "The name '{}' is already in use"
msgstr ""
#: src/window.py:797
msgid "Create Chat"
msgstr ""
#: src/window.py:804
msgid "Create"
msgstr ""
#: src/window.ui:54
msgid "Chats"
msgstr ""
#: src/window.ui:64
msgid "New chat"
msgstr ""
#: src/window.ui:100
msgid "Toggle Sidebar"
msgstr ""
#: src/window.ui:121 src/window.ui:257
msgid "Manage models"
msgstr ""
#: src/window.ui:135
msgid "Menu"
msgstr ""
#: src/window.ui:213
msgid "Send"
msgstr ""
#: src/window.ui:222
msgid "Requires model 'llava' to be selected"
msgstr ""
#: src/window.ui:225
msgid "Image"
msgstr ""
#: src/window.ui:331
msgid "Previous"
msgstr ""
#: src/window.ui:346
msgid "Next"
msgstr ""
#: src/window.ui:372
msgid "Welcome to Alpaca"
msgstr ""
#: src/window.ui:373
msgid ""
"To get started, please ensure you have an Ollama instance set up. You can "
"either run Ollama locally on your machine or connect to a remote instance."
msgstr ""
#: src/window.ui:376
msgid "Ollama Website"
msgstr ""
#: src/window.ui:393
msgid ""
"Alpaca and its developers are not liable for any damages to devices or "
"software resulting from the execution of code generated by an AI model. "
"Please exercise caution and review the code carefully before running it."
msgstr ""
#: src/window.ui:405
msgid "Setup"
msgstr ""
#: src/window.ui:406
msgid ""
"If you are running an Ollama instance locally and haven't modified the "
"default ports, you can use the default URL. Otherwise, please enter the URL "
"of your Ollama instance."
msgstr ""
#: src/window.ui:430
msgid "Change Server"
msgstr ""
#: src/window.ui:434
msgid "Keyboard Shortcuts"
msgstr ""
#: src/window.ui:438
msgid "About Alpaca"
msgstr ""
#: src/window.ui:460
msgid "General"
msgstr ""
#: src/window.ui:464
msgid "Close application"
msgstr ""
#: src/window.ui:470
msgid "Clear chat"
msgstr ""
#: src/window.ui:476
msgid "Change server"
msgstr ""
#: src/window.ui:482
msgid "Show shortcuts window"
msgstr ""
#: src/window.ui:489
msgid "Editor"
msgstr ""
#: src/window.ui:493
msgid "Copy"
msgstr ""
#: src/window.ui:499
msgid "Paste"
msgstr ""
#: src/window.ui:505
msgid "Send Message"
msgstr ""

653
po/es.po Normal file
View File

@@ -0,0 +1,653 @@
# Spanish translations for PACKAGE package.
# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Jeffry Samuel Eduarte Rojas <jeffrysamuer@gmail.com>, 2024.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-20 19:15-0600\n"
"PO-Revision-Date: 2024-05-19 19:44-0600\n"
"Last-Translator: Jeffry Samuel Eduarte Rojas <jeffrysamuer@gmail.com>\n"
"Language-Team: Spanish <es@tp.org.es>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: data/com.jeffser.Alpaca.desktop.in:3
#: data/com.jeffser.Alpaca.metainfo.xml.in:7
msgid "Alpaca"
msgstr "Alpaca"
#: data/com.jeffser.Alpaca.metainfo.xml.in:8
msgid "Chat with multiple AI models"
msgstr "Chatea con multiples modelos de IA"
#: data/com.jeffser.Alpaca.metainfo.xml.in:10
msgid "An Ollama client"
msgstr "Un cliente de Ollama"
#: data/com.jeffser.Alpaca.metainfo.xml.in:11
#: data/com.jeffser.Alpaca.metainfo.xml.in:209
msgid "Features"
msgstr "Funcionalidades"
#: data/com.jeffser.Alpaca.metainfo.xml.in:13
#: data/com.jeffser.Alpaca.metainfo.xml.in:211
msgid "Talk to multiple models in the same conversation"
msgstr "Habla con multiples modelos en la misma conversación"
#: data/com.jeffser.Alpaca.metainfo.xml.in:14
#: data/com.jeffser.Alpaca.metainfo.xml.in:212
msgid "Pull and delete models from the app"
msgstr "Descarga y elimina modelos desde la app"
#: data/com.jeffser.Alpaca.metainfo.xml.in:16 src/window.ui:392
msgid "Disclaimer"
msgstr "Aviso Legal"
#: data/com.jeffser.Alpaca.metainfo.xml.in:17
msgid ""
"This project is not affiliated at all with Ollama, I'm not responsible for "
"any damages to your device or software caused by running code given by any "
"models."
msgstr ""
"Este proyecto no está afiliado del todo con Ollama, no soy responsable por "
"cualquier daño a tu dispositivo o software causado por correr codigo "
"proveido por cualquier modelo."
#: data/com.jeffser.Alpaca.metainfo.xml.in:20
msgid "Jeffry Samuel Eduarte Rojas"
msgstr "Jeffry Samuel Eduarte Rojas"
#: data/com.jeffser.Alpaca.metainfo.xml.in:38
msgid "Welcome dialog"
msgstr "Dialogo de Bienvenida"
#: data/com.jeffser.Alpaca.metainfo.xml.in:42
msgid "A conversation involving multiple models"
msgstr "Una conversación incluyendo multiples modelos"
#: data/com.jeffser.Alpaca.metainfo.xml.in:46
msgid "Managing models"
msgstr "Gestionando modelos"
#: data/com.jeffser.Alpaca.metainfo.xml.in:57
#, fuzzy
msgid "Yet Another Daily Update"
msgstr "Otra Actulización Diaria"
#: data/com.jeffser.Alpaca.metainfo.xml.in:59
#, fuzzy
msgid "Added better UI for 'Manage Models' dialog"
msgstr "Añadida mejor interfaz para el dialogo 'gestión de modelos'"
#: data/com.jeffser.Alpaca.metainfo.xml.in:60
msgid "Added better UI for the chat sidebar"
msgstr "Añadida mejor interfaz para la barra de lado de chat"
#: data/com.jeffser.Alpaca.metainfo.xml.in:61
msgid ""
"Replaced model description with a button to open Ollama's website for the "
"model"
msgstr ""
"Remplazada la descripción de modelo por un botón para abrir la página web "
"de Ollama para el modelo"
#: data/com.jeffser.Alpaca.metainfo.xml.in:62
msgid "Added myself to the credits as the spanish translator"
msgstr "Agregue mi nombre en los creditos como el traductor a Español"
#: data/com.jeffser.Alpaca.metainfo.xml.in:63
msgid "Using XDG properly to get config folder"
msgstr "Usando XDG apropiadamente para obtener el folder de configuración"
#: data/com.jeffser.Alpaca.metainfo.xml.in:64
#, fuzzy
msgid "Update for translations"
msgstr "Mejor soporte para traducciones"
#: data/com.jeffser.Alpaca.metainfo.xml.in:66
#: data/com.jeffser.Alpaca.metainfo.xml.in:78
#: data/com.jeffser.Alpaca.metainfo.xml.in:97
#: data/com.jeffser.Alpaca.metainfo.xml.in:118
#: data/com.jeffser.Alpaca.metainfo.xml.in:134
#: data/com.jeffser.Alpaca.metainfo.xml.in:150
#: data/com.jeffser.Alpaca.metainfo.xml.in:164
#: data/com.jeffser.Alpaca.metainfo.xml.in:174
#: data/com.jeffser.Alpaca.metainfo.xml.in:192
#: data/com.jeffser.Alpaca.metainfo.xml.in:214
msgid "Please report any errors to the issues page, thank you."
msgstr "Por favor reporta cualquier error a la página de problemas, gracias."
#: data/com.jeffser.Alpaca.metainfo.xml.in:74
#, fuzzy
msgid "Quick Fix"
msgstr "0.1.2 Arreglos rápidos"
#: data/com.jeffser.Alpaca.metainfo.xml.in:76
msgid "The last update had some mistakes in the description of the update"
msgstr ""
"La última actualización tenía unos errores en la descripción de la "
"actualización"
#: data/com.jeffser.Alpaca.metainfo.xml.in:86
msgid "Another Daily Update"
msgstr "Otra Actulización Diaria"
#: data/com.jeffser.Alpaca.metainfo.xml.in:88
msgid "Added full Spanish translation"
msgstr "Añadida traducción completa a Español"
#: data/com.jeffser.Alpaca.metainfo.xml.in:89
#, fuzzy
msgid "Added support for background pulling of multiple models"
msgstr "Añadido soporte para multiples etiquetas con un solo modelo"
#: data/com.jeffser.Alpaca.metainfo.xml.in:90
msgid "Added interrupt button"
msgstr "Añadido botón de interrupción"
#: data/com.jeffser.Alpaca.metainfo.xml.in:91
#, fuzzy
msgid "Added basic shortcuts"
msgstr "Atajos de Teclado"
#: data/com.jeffser.Alpaca.metainfo.xml.in:92
msgid "Better translation support"
msgstr "Mejor soporte para traducciones"
#: data/com.jeffser.Alpaca.metainfo.xml.in:93
msgid ""
"User can now leave chat name empty when creating a new one, it will add a "
"placeholder name"
msgstr ""
"El usuario ahora puede dejar el nombre del chat vacio durante la creación, "
"la aplicación añadira un placeholder"
#: data/com.jeffser.Alpaca.metainfo.xml.in:94
msgid "Better scalling for different window sizes"
msgstr "Mejor escalado para distintos tamaños de ventana"
#: data/com.jeffser.Alpaca.metainfo.xml.in:95
#, fuzzy
msgid "Fixed: Can't close app if first time setup fails"
msgstr "Arreglado: No se puede cerrar la aplicación en el primer setup"
#: data/com.jeffser.Alpaca.metainfo.xml.in:105
msgid "Really Big Update"
msgstr "Actualización Bastante Grande"
#: data/com.jeffser.Alpaca.metainfo.xml.in:107
msgid "Added multiple chats support!"
msgstr "Añadido soporte para multiples chats!"
#: data/com.jeffser.Alpaca.metainfo.xml.in:108
msgid "Added Pango Markup support (bold, list, title, subtitle, monospace)"
msgstr ""
"Añadido soporte para Pango Markup (negrita, lista, titulo, subtitulo, "
"monoespaciado)"
#: data/com.jeffser.Alpaca.metainfo.xml.in:109
msgid "Added autoscroll if the user is at the bottom of the chat"
msgstr ""
"Añadido autoscroll si el usuario se encuentra en la parte inferior del chat"
#: data/com.jeffser.Alpaca.metainfo.xml.in:110
msgid "Added support for multiple tags on a single model"
msgstr "Añadido soporte para multiples etiquetas con un solo modelo"
#: data/com.jeffser.Alpaca.metainfo.xml.in:111
msgid "Added better model management dialog"
msgstr "Añadido mejor gestión de modelos"
#: data/com.jeffser.Alpaca.metainfo.xml.in:112
msgid "Added loading spinner when sending message"
msgstr "Añadido spinner de carga cuando se envia un mensaje"
#: data/com.jeffser.Alpaca.metainfo.xml.in:113
msgid "Added notifications if app is not active and a model pull finishes"
msgstr ""
"Añadidas notificaciones si la aplicación no está activa y la descarga de un "
"modelo finaliza"
#: data/com.jeffser.Alpaca.metainfo.xml.in:114
msgid "Added new symbolic icon"
msgstr "Añadido nuevo icono simbolico"
#: data/com.jeffser.Alpaca.metainfo.xml.in:115
msgid "Added frame to message textview widget"
msgstr "Añadido borde al objeto textview del mensaje"
#: data/com.jeffser.Alpaca.metainfo.xml.in:116
msgid "Fixed \"code blocks shouldn't be editable\""
msgstr "Arreglado \"bloques de codigo no deberían de ser editables\""
#: data/com.jeffser.Alpaca.metainfo.xml.in:126
#: data/com.jeffser.Alpaca.metainfo.xml.in:183
msgid "Big Update"
msgstr "Gran Actualización"
#: data/com.jeffser.Alpaca.metainfo.xml.in:128
msgid "Added code highlighting"
msgstr "Añadido resaltado de código"
#: data/com.jeffser.Alpaca.metainfo.xml.in:129
msgid "Added image recognition (llava model)"
msgstr "Añadido reconocimiento de imagenes (modelo llava)"
#: data/com.jeffser.Alpaca.metainfo.xml.in:130
msgid "Added multiline prompt"
msgstr "Añadido caja de texto de multiples lineas"
#: data/com.jeffser.Alpaca.metainfo.xml.in:131
msgid "Fixed some small bugs"
msgstr "Arreglados unos pequeños errores"
#: data/com.jeffser.Alpaca.metainfo.xml.in:132
msgid "General optimization"
msgstr "Optimización general"
#: data/com.jeffser.Alpaca.metainfo.xml.in:142
msgid "Fixes and features"
msgstr "Arreglos y funcionalidades"
#: data/com.jeffser.Alpaca.metainfo.xml.in:144
msgid "Russian translation (thanks github/alexkdeveloper)"
msgstr "Traducción a Ruso (gracias github/alexkdeveloper)"
#: data/com.jeffser.Alpaca.metainfo.xml.in:145
msgid "Fixed: Cannot close app on first setup"
msgstr "Arreglado: No se puede cerrar la aplicación en el primer setup"
#: data/com.jeffser.Alpaca.metainfo.xml.in:146
msgid "Fixed: Brand colors for Flathub"
msgstr "Arreglado: Colores de marca para Flathub"
#: data/com.jeffser.Alpaca.metainfo.xml.in:147
msgid "Fixed: App description"
msgstr "Arreglado: Descripción de aplicación"
#: data/com.jeffser.Alpaca.metainfo.xml.in:148
msgid "Fixed: Only show 'save changes dialog' when you actually change the url"
msgstr ""
"Arreglado: Solo mostrar el dialogo 'guardar cambios' cuando se cambia el url"
#: data/com.jeffser.Alpaca.metainfo.xml.in:158
msgid "0.2.2 Bug fixes"
msgstr "0.2.2 Arreglo de errores"
#: data/com.jeffser.Alpaca.metainfo.xml.in:160
msgid "Toast messages appearing behind dialogs"
msgstr "Mensajes toast apareciendo detrás de dialogos"
#: data/com.jeffser.Alpaca.metainfo.xml.in:161
msgid "Local model list not updating when changing servers"
msgstr ""
"Lista de modelos locales no es actualizada cuando se cambia el servidor"
#: data/com.jeffser.Alpaca.metainfo.xml.in:162
msgid "Closing the setup dialog closes the whole app"
msgstr "Cerrar el dialogo de setup cierra toda la aplicación"
#: data/com.jeffser.Alpaca.metainfo.xml.in:172
msgid "0.2.1 Data saving fix"
msgstr "0.2.1 Arreglo en el guardado de datos"
#: data/com.jeffser.Alpaca.metainfo.xml.in:173
msgid ""
"The app didn't save the config files and chat history to the right "
"directory, this is now fixed"
msgstr ""
"La aplicación no guardaba los archivos de configuración o los chats en el "
"directorio correcto, esto ahora ha sido arreglado"
#: data/com.jeffser.Alpaca.metainfo.xml.in:182
msgid "0.2.0"
msgstr "0.2.0"
#: data/com.jeffser.Alpaca.metainfo.xml.in:184
msgid "New Features"
msgstr "Nuevas funcionalidades"
#: data/com.jeffser.Alpaca.metainfo.xml.in:186
msgid "Restore chat after closing the app"
msgstr "Restaurar chat despues de cerrar la aplicación"
#: data/com.jeffser.Alpaca.metainfo.xml.in:187
msgid "A button to clear the chat"
msgstr "Un botón para limpiar el chat"
#: data/com.jeffser.Alpaca.metainfo.xml.in:188
msgid "Fixed multiple bugs involving how messages are shown"
msgstr "Arreglados multiples errores acerca de como los mensajes son mostrados"
#: data/com.jeffser.Alpaca.metainfo.xml.in:189
msgid "Added welcome dialog"
msgstr "Añadido dialogo de bienvenida"
#: data/com.jeffser.Alpaca.metainfo.xml.in:190
msgid "More stability"
msgstr "Más estabilidad"
#: data/com.jeffser.Alpaca.metainfo.xml.in:200
msgid "0.1.2 Quick fixes"
msgstr "0.1.2 Arreglos rápidos"
#: data/com.jeffser.Alpaca.metainfo.xml.in:201
msgid ""
"This release fixes some metadata needed to have a proper Flatpak application"
msgstr ""
"Esta versión arregla metadatos necesarios para tener un aplicación de "
"Flatpak justa"
#: data/com.jeffser.Alpaca.metainfo.xml.in:207
msgid "0.1.1 Stable Release"
msgstr "0.1.1"
#: data/com.jeffser.Alpaca.metainfo.xml.in:208
msgid "This is the first public version of Alpaca"
msgstr "Esta es la primera versión publica de Alpaca"
#: src/window.py:47 src/window.py:776
msgid "New Chat"
msgstr "Nuevo Chat"
#: src/window.py:86
msgid "An error occurred"
msgstr "Ocurrio un error"
#: src/window.py:87
msgid "Failed to connect to server"
msgstr "No se pudo conectar al servidor"
#: src/window.py:88
msgid "Could not list local models"
msgstr "No se pudieron listar los modelos locales"
#: src/window.py:89
msgid "Could not delete model"
msgstr "No se pudo eliminar el modelo"
#: src/window.py:90
msgid "Could not pull model"
msgstr "No se pudo descargar el modelo"
#: src/window.py:91
msgid "Cannot open image"
msgstr "No se pudo abrir la imagen"
#: src/window.py:92
msgid "Cannot delete chat because it's the only one left"
msgstr "No se pudo eliminar el chat por que es el único que queda"
#: src/window.py:95
msgid "Please select a model before chatting"
msgstr "Por favor selecciona un modelo antes de enviar un mensaje"
#: src/window.py:96
msgid "Chat cannot be cleared while receiving a message"
msgstr "El chat no puede ser limpiado mientras se recibe un mensaje"
#: src/window.py:99
msgid "Model deleted successfully"
msgstr "Modelo eliminado exitosamente"
#: src/window.py:100
msgid "Model pulled successfully"
msgstr "Modelo descargado exitosamente"
#: src/window.py:425
msgid "Task Complete"
msgstr "Tarea completada"
#: src/window.py:425
msgid "Model '{}' pulled successfully."
msgstr "El modelo '{}' fue descargado exitosamente"
#: src/window.py:430
msgid "Pull Model Error"
msgstr "Error Descargando Modelo"
#: src/window.py:430
msgid "Failed to pull model '{}' due to network error."
msgstr "No se pudo descargar el modelo '{}' debido a un error de red"
#: src/window.py:446
msgid "Stop Model"
msgstr "Parar Modelo"
#: src/window.py:447
msgid "Are you sure you want to stop pulling '{}'?"
msgstr "¿Estás seguro de que quieres parar la descarga de '{}'?"
#: src/window.py:450 src/window.py:489 src/window.py:512 src/window.py:593
#: src/window.py:654 src/window.py:703 src/window.py:730 src/window.py:763
#: src/window.py:803
msgid "Cancel"
msgstr "Cancelar"
#: src/window.py:451
msgid "Stop"
msgstr "Parar"
#: src/window.py:485
msgid "Delete Model"
msgstr "Eliminar Modelo"
#: src/window.py:486 src/window.py:727
msgid "Are you sure you want to delete '{}'?"
msgstr "¿Estás seguro de que quieres eliminar '{}'?"
#: src/window.py:490 src/window.py:731
msgid "Delete"
msgstr "Eliminar"
#: src/window.py:507
msgid "Pull Model"
msgstr "Descargar Modelo"
#: src/window.py:508
msgid "Please select a tag to pull '{}'"
msgstr "Por favor selecciona una etiqueta para descargar '{}'"
#: src/window.py:513
msgid "Pull"
msgstr "Descargar"
#: src/window.py:589 src/window.ui:426
msgid "Clear Chat"
msgstr "Limpiar Chat"
#: src/window.py:590
msgid "Are you sure you want to clear the chat?"
msgstr "¿Estás seguro de que quieres limpiar el chat?"
#: src/window.py:594
msgid "Clear"
msgstr "Limpiar"
#: src/window.py:650
msgid "Save Changes"
msgstr "Guardar Cambios"
#: src/window.py:651
msgid "Do you want to save the URL change?"
msgstr "¿Deseas guardar el cambio de URL?"
#: src/window.py:655
msgid "Discard"
msgstr "Descartar"
#: src/window.py:656
msgid "Save"
msgstr "Guardar"
#: src/window.py:699
msgid "Remove Image"
msgstr "Remover Imagen"
#: src/window.py:700
msgid "Are you sure you want to remove image?"
msgstr "¿Estás seguro de que quieres eliminar la imagen?"
#: src/window.py:704
msgid "Remove"
msgstr "Remover"
#: src/window.py:726
msgid "Delete Chat"
msgstr "Eliminar Chat"
#: src/window.py:757
msgid "Rename Chat"
msgstr "Renombrar Chat"
#: src/window.py:764
msgid "Rename"
msgstr "Renombrar"
#: src/window.py:784
msgid "The name '{}' is already in use"
msgstr "El nombre '{}' ya está en uso"
#: src/window.py:797
msgid "Create Chat"
msgstr "Crear Chat"
#: src/window.py:804
msgid "Create"
msgstr "Crear"
#: src/window.ui:54
msgid "Chats"
msgstr "Chats"
#: src/window.ui:64
msgid "New chat"
msgstr "Nuevo chat"
#: src/window.ui:100
msgid "Toggle Sidebar"
msgstr "Alternar barra de lado"
#: src/window.ui:121 src/window.ui:257
msgid "Manage models"
msgstr "Gestionar modelos"
#: src/window.ui:135
msgid "Menu"
msgstr "Menu"
#: src/window.ui:213
msgid "Send"
msgstr "Enviar"
#: src/window.ui:222
msgid "Requires model 'llava' to be selected"
msgstr "Requiere que el modelo 'llava' sea seleccionado"
#: src/window.ui:225
msgid "Image"
msgstr "Imagen"
#: src/window.ui:331
msgid "Previous"
msgstr "Anterior"
#: src/window.ui:346
msgid "Next"
msgstr "Siguiente"
#: src/window.ui:372
msgid "Welcome to Alpaca"
msgstr "Bienvenido a Alpaca"
#: src/window.ui:373
msgid ""
"To get started, please ensure you have an Ollama instance set up. You can "
"either run Ollama locally on your machine or connect to a remote instance."
msgstr ""
"Para iniciar, por favor asegurate de tener una instancia de Ollama "
"funcional. Puedes correr Ollama localmente o conectarte a una instancia "
"remota."
#: src/window.ui:376
msgid "Ollama Website"
msgstr "Sitio Web de Ollama"
#: src/window.ui:393
msgid ""
"Alpaca and its developers are not liable for any damages to devices or "
"software resulting from the execution of code generated by an AI model. "
"Please exercise caution and review the code carefully before running it."
msgstr ""
"Alpaca y sus desarrolladores no son responsables por cualquier daño a "
"dispositivos o software resultados por la ejecución de codigo generado por "
"un modelo de IA. Por favor sea precavido y revise el codigo cuidadosamente "
"antes de correrlo"
#: src/window.ui:405
msgid "Setup"
msgstr "Setup"
#: src/window.ui:406
msgid ""
"If you are running an Ollama instance locally and haven't modified the "
"default ports, you can use the default URL. Otherwise, please enter the URL "
"of your Ollama instance."
msgstr ""
"Si estás corriendo una instancia local de Ollama y no modificaste los "
"puertos por defecto, puedes usar la URL por defecto. De otra forma, por "
"favor ingresa la URL de tu instancia de Ollama"
#: src/window.ui:430
msgid "Change Server"
msgstr "Cambiar Servidor"
#: src/window.ui:434
msgid "Keyboard Shortcuts"
msgstr "Atajos de Teclado"
#: src/window.ui:438
msgid "About Alpaca"
msgstr "Sobre Alpaca"
#: src/window.ui:460
msgid "General"
msgstr "General"
#: src/window.ui:464
msgid "Close application"
msgstr "Cerrar aplicación"
#: src/window.ui:470
msgid "Clear chat"
msgstr "Limpiar chat"
#: src/window.ui:476
msgid "Change server"
msgstr "Cambiar servidor"
#: src/window.ui:482
msgid "Show shortcuts window"
msgstr "Mostrar ventana de atajos"
#: src/window.ui:489
msgid "Editor"
msgstr "Editor"
#: src/window.ui:493
msgid "Copy"
msgstr "Copiar"
#: src/window.ui:499
msgid "Paste"
msgstr "Pegar"
#: src/window.ui:505
msgid "Send Message"
msgstr "Enviar Mensaje"

617
po/es.po~ Normal file
View File

@@ -0,0 +1,617 @@
# Spanish translations for PACKAGE package.
# Copyright (C) 2024 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Jeffry Samuel Eduarte Rojas <jeffrysamuer@gmail.com>, 2024.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-19 21:53-0600\n"
"PO-Revision-Date: 2024-05-19 19:44-0600\n"
"Last-Translator: Jeffry Samuel Eduarte Rojas <jeffrysamuer@gmail.com>\n"
"Language-Team: Spanish <es@tp.org.es>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: data/com.jeffser.Alpaca.desktop.in:3
#: data/com.jeffser.Alpaca.metainfo.xml.in:7
msgid "Alpaca"
msgstr "Alpaca"
#: data/com.jeffser.Alpaca.metainfo.xml.in:8
#: data/com.jeffser.Alpaca.metainfo.xml.in:11
msgid "An Ollama client"
msgstr "Un cliente de Ollama"
#: data/com.jeffser.Alpaca.metainfo.xml.in:10
msgid "Chat with multiple AI models"
msgstr "Chatea con multiples modelos de IA"
#: data/com.jeffser.Alpaca.metainfo.xml.in:12
#: data/com.jeffser.Alpaca.metainfo.xml.in:193
msgid "Features"
msgstr "Funcionalidades"
#: data/com.jeffser.Alpaca.metainfo.xml.in:14
#: data/com.jeffser.Alpaca.metainfo.xml.in:195
msgid "Talk to multiple models in the same conversation"
msgstr "Habla con multiples modelos en la misma conversación"
#: data/com.jeffser.Alpaca.metainfo.xml.in:15
#: data/com.jeffser.Alpaca.metainfo.xml.in:196
msgid "Pull and delete models from the app"
msgstr "Descarga y elimina modelos desde la app"
#: data/com.jeffser.Alpaca.metainfo.xml.in:17 src/window.ui:405
msgid "Disclaimer"
msgstr "Aviso Legal"
#: data/com.jeffser.Alpaca.metainfo.xml.in:18
msgid ""
"This project is not affiliated at all with Ollama, I'm not responsible for "
"any damages to your device or software caused by running code given by any "
"models."
msgstr ""
"Este proyecto no está afiliado del todo con Ollama, no soy responsable por "
"cualquier daño a tu dispositivo o software causado por correr codigo "
"proveido por cualquier modelo."
#: data/com.jeffser.Alpaca.metainfo.xml.in:21
msgid "Jeffry Samuel Eduarte Rojas"
msgstr "Jeffry Samuel Eduarte Rojas"
#: data/com.jeffser.Alpaca.metainfo.xml.in:39
msgid "Welcome dialog"
msgstr "Dialogo de Bienvenida"
#: data/com.jeffser.Alpaca.metainfo.xml.in:43
msgid "A conversation involving multiple models"
msgstr "Una conversación incluyendo multiples modelos"
#: data/com.jeffser.Alpaca.metainfo.xml.in:47
msgid "Managing models"
msgstr "Gestionando modelos"
#: data/com.jeffser.Alpaca.metainfo.xml.in:58
#, fuzzy
msgid "Quick Fix"
msgstr "0.1.2 Arreglos rápidos"
#: data/com.jeffser.Alpaca.metainfo.xml.in:60
msgid "The last update had some mistakes in the description of the update"
msgstr "La última actualización tenía unos errores en la descripción de la "
"actualización"
#: data/com.jeffser.Alpaca.metainfo.xml.in:62
#: data/com.jeffser.Alpaca.metainfo.xml.in:81
#: data/com.jeffser.Alpaca.metainfo.xml.in:102
#: data/com.jeffser.Alpaca.metainfo.xml.in:118
#: data/com.jeffser.Alpaca.metainfo.xml.in:134
#: data/com.jeffser.Alpaca.metainfo.xml.in:148
#: data/com.jeffser.Alpaca.metainfo.xml.in:158
#: data/com.jeffser.Alpaca.metainfo.xml.in:176
#: data/com.jeffser.Alpaca.metainfo.xml.in:198
msgid "Please report any errors to the issues page, thank you."
msgstr "Por favor reporta cualquier error a la página de problemas, gracias."
#: data/com.jeffser.Alpaca.metainfo.xml.in:70
msgid "Another Daily Update"
msgstr "Otra Actulización Diaria"
#: data/com.jeffser.Alpaca.metainfo.xml.in:72
msgid "Added full Spanish translation"
msgstr "Añadida traducción completa a Español"
#: data/com.jeffser.Alpaca.metainfo.xml.in:73
#, fuzzy
msgid "Added support for background pulling of multiple models"
msgstr "Añadido soporte para multiples etiquetas con un solo modelo"
#: data/com.jeffser.Alpaca.metainfo.xml.in:74
msgid "Added interrupt button"
msgstr "Añadido botón de interrupción"
#: data/com.jeffser.Alpaca.metainfo.xml.in:75
#, fuzzy
msgid "Added basic shortcuts"
msgstr "Atajos de Teclado"
#: data/com.jeffser.Alpaca.metainfo.xml.in:76
msgid "Better translation support"
msgstr "Mejor soporte para traducciones"
#: data/com.jeffser.Alpaca.metainfo.xml.in:77
msgid ""
"User can now leave chat name empty when creating a new one, it will add a "
"placeholder name"
msgstr ""
"El usuario ahora puede dejar el nombre del chat vacio durante la creación, "
"la aplicación añadira un placeholder"
#: data/com.jeffser.Alpaca.metainfo.xml.in:78
msgid "Better scalling for different window sizes"
msgstr "Mejor escalado para distintos tamaños de ventana"
#: data/com.jeffser.Alpaca.metainfo.xml.in:79
#, fuzzy
msgid "Fixed: Can't close app if first time setup fails"
msgstr "Arreglado: No se puede cerrar la aplicación en el primer setup"
#: data/com.jeffser.Alpaca.metainfo.xml.in:89
msgid "Really Big Update"
msgstr "Actualización Bastante Grande"
#: data/com.jeffser.Alpaca.metainfo.xml.in:91
msgid "Added multiple chats support!"
msgstr "Añadido soporte para multiples chats!"
#: data/com.jeffser.Alpaca.metainfo.xml.in:92
msgid "Added Pango Markup support (bold, list, title, subtitle, monospace)"
msgstr ""
"Añadido soporte para Pango Markup (negrita, lista, titulo, subtitulo, "
"monoespaciado)"
#: data/com.jeffser.Alpaca.metainfo.xml.in:93
msgid "Added autoscroll if the user is at the bottom of the chat"
msgstr ""
"Añadido autoscroll si el usuario se encuentra en la parte inferior del chat"
#: data/com.jeffser.Alpaca.metainfo.xml.in:94
msgid "Added support for multiple tags on a single model"
msgstr "Añadido soporte para multiples etiquetas con un solo modelo"
#: data/com.jeffser.Alpaca.metainfo.xml.in:95
msgid "Added better model management dialog"
msgstr "Añadido mejor gestión de modelos"
#: data/com.jeffser.Alpaca.metainfo.xml.in:96
msgid "Added loading spinner when sending message"
msgstr "Añadido spinner de carga cuando se envia un mensaje"
#: data/com.jeffser.Alpaca.metainfo.xml.in:97
msgid "Added notifications if app is not active and a model pull finishes"
msgstr ""
"Añadidas notificaciones si la aplicación no está activa y la descarga de un "
"modelo finaliza"
#: data/com.jeffser.Alpaca.metainfo.xml.in:98
msgid "Added new symbolic icon"
msgstr "Añadido nuevo icono simbolico"
#: data/com.jeffser.Alpaca.metainfo.xml.in:99
msgid "Added frame to message textview widget"
msgstr "Añadido borde al objeto textview del mensaje"
#: data/com.jeffser.Alpaca.metainfo.xml.in:100
msgid "Fixed \"code blocks shouldn't be editable\""
msgstr "Arreglado \"bloques de codigo no deberían de ser editables\""
#: data/com.jeffser.Alpaca.metainfo.xml.in:110
#: data/com.jeffser.Alpaca.metainfo.xml.in:167
msgid "Big Update"
msgstr "Gran Actualización"
#: data/com.jeffser.Alpaca.metainfo.xml.in:112
msgid "Added code highlighting"
msgstr "Añadido resaltado de código"
#: data/com.jeffser.Alpaca.metainfo.xml.in:113
msgid "Added image recognition (llava model)"
msgstr "Añadido reconocimiento de imagenes (modelo llava)"
#: data/com.jeffser.Alpaca.metainfo.xml.in:114
msgid "Added multiline prompt"
msgstr "Añadido caja de texto de multiples lineas"
#: data/com.jeffser.Alpaca.metainfo.xml.in:115
msgid "Fixed some small bugs"
msgstr "Arreglados unos pequeños errores"
#: data/com.jeffser.Alpaca.metainfo.xml.in:116
msgid "General optimization"
msgstr "Optimización general"
#: data/com.jeffser.Alpaca.metainfo.xml.in:126
msgid "Fixes and features"
msgstr "Arreglos y funcionalidades"
#: data/com.jeffser.Alpaca.metainfo.xml.in:128
msgid "Russian translation (thanks github/alexkdeveloper)"
msgstr "Traducción a Ruso (gracias github/alexkdeveloper)"
#: data/com.jeffser.Alpaca.metainfo.xml.in:129
msgid "Fixed: Cannot close app on first setup"
msgstr "Arreglado: No se puede cerrar la aplicación en el primer setup"
#: data/com.jeffser.Alpaca.metainfo.xml.in:130
msgid "Fixed: Brand colors for Flathub"
msgstr "Arreglado: Colores de marca para Flathub"
#: data/com.jeffser.Alpaca.metainfo.xml.in:131
msgid "Fixed: App description"
msgstr "Arreglado: Descripción de aplicación"
#: data/com.jeffser.Alpaca.metainfo.xml.in:132
msgid "Fixed: Only show 'save changes dialog' when you actually change the url"
msgstr ""
"Arreglado: Solo mostrar el dialogo 'guardar cambios' cuando se cambia el url"
#: data/com.jeffser.Alpaca.metainfo.xml.in:142
msgid "0.2.2 Bug fixes"
msgstr "0.2.2 Arreglo de errores"
#: data/com.jeffser.Alpaca.metainfo.xml.in:144
msgid "Toast messages appearing behind dialogs"
msgstr "Mensajes toast apareciendo detrás de dialogos"
#: data/com.jeffser.Alpaca.metainfo.xml.in:145
msgid "Local model list not updating when changing servers"
msgstr ""
"Lista de modelos locales no es actualizada cuando se cambia el servidor"
#: data/com.jeffser.Alpaca.metainfo.xml.in:146
msgid "Closing the setup dialog closes the whole app"
msgstr "Cerrar el dialogo de setup cierra toda la aplicación"
#: data/com.jeffser.Alpaca.metainfo.xml.in:156
msgid "0.2.1 Data saving fix"
msgstr "0.2.1 Arreglo en el guardado de datos"
#: data/com.jeffser.Alpaca.metainfo.xml.in:157
msgid ""
"The app didn't save the config files and chat history to the right "
"directory, this is now fixed"
msgstr ""
"La aplicación no guardaba los archivos de configuración o los chats en el "
"directorio correcto, esto ahora ha sido arreglado"
#: data/com.jeffser.Alpaca.metainfo.xml.in:166
msgid "0.2.0"
msgstr "0.2.0"
#: data/com.jeffser.Alpaca.metainfo.xml.in:168
msgid "New Features"
msgstr "Nuevas funcionalidades"
#: data/com.jeffser.Alpaca.metainfo.xml.in:170
msgid "Restore chat after closing the app"
msgstr "Restaurar chat despues de cerrar la aplicación"
#: data/com.jeffser.Alpaca.metainfo.xml.in:171
msgid "A button to clear the chat"
msgstr "Un botón para limpiar el chat"
#: data/com.jeffser.Alpaca.metainfo.xml.in:172
msgid "Fixed multiple bugs involving how messages are shown"
msgstr "Arreglados multiples errores acerca de como los mensajes son mostrados"
#: data/com.jeffser.Alpaca.metainfo.xml.in:173
msgid "Added welcome dialog"
msgstr "Añadido dialogo de bienvenida"
#: data/com.jeffser.Alpaca.metainfo.xml.in:174
msgid "More stability"
msgstr "Más estabilidad"
#: data/com.jeffser.Alpaca.metainfo.xml.in:184
msgid "0.1.2 Quick fixes"
msgstr "0.1.2 Arreglos rápidos"
#: data/com.jeffser.Alpaca.metainfo.xml.in:185
msgid ""
"This release fixes some metadata needed to have a proper Flatpak application"
msgstr ""
"Esta versión arregla metadatos necesarios para tener un aplicación de "
"Flatpak justa"
#: data/com.jeffser.Alpaca.metainfo.xml.in:191
msgid "0.1.1 Stable Release"
msgstr "0.1.1"
#: data/com.jeffser.Alpaca.metainfo.xml.in:192
msgid "This is the first public version of Alpaca"
msgstr "Esta es la primera versión publica de Alpaca"
#: src/window.py:47 src/window.py:758
msgid "New Chat"
msgstr "Nuevo Chat"
#: src/window.py:86
msgid "An error occurred"
msgstr "Ocurrio un error"
#: src/window.py:87
msgid "Failed to connect to server"
msgstr "No se pudo conectar al servidor"
#: src/window.py:88
msgid "Could not list local models"
msgstr "No se pudieron listar los modelos locales"
#: src/window.py:89
msgid "Could not delete model"
msgstr "No se pudo eliminar el modelo"
#: src/window.py:90
msgid "Could not pull model"
msgstr "No se pudo descargar el modelo"
#: src/window.py:91
msgid "Cannot open image"
msgstr "No se pudo abrir la imagen"
#: src/window.py:92
msgid "Cannot delete chat because it's the only one left"
msgstr "No se pudo eliminar el chat por que es el único que queda"
#: src/window.py:95
msgid "Please select a model before chatting"
msgstr "Por favor selecciona un modelo antes de enviar un mensaje"
#: src/window.py:96
msgid "Chat cannot be cleared while receiving a message"
msgstr "El chat no puede ser limpiado mientras se recibe un mensaje"
#: src/window.py:99
msgid "Model deleted successfully"
msgstr "Modelo eliminado exitosamente"
#: src/window.py:100
msgid "Model pulled successfully"
msgstr "Modelo descargado exitosamente"
#: src/window.py:418
msgid "Task Complete"
msgstr "Tarea completada"
#: src/window.py:418
msgid "Model '{}' pulled successfully."
msgstr "El modelo '{}' fue descargado exitosamente"
#: src/window.py:424
msgid "Pull Model Error"
msgstr "Error Descargando Modelo"
#: src/window.py:424
msgid "Failed to pull model '{}' due to network error."
msgstr "No se pudo descargar el modelo '{}' debido a un error de red"
#: src/window.py:436
msgid "Stop Model"
msgstr "Parar Modelo"
#: src/window.py:437
msgid "Are you sure you want to stop pulling '{}'?"
msgstr "¿Estás seguro de que quieres parar la descarga de '{}'?"
#: src/window.py:440 src/window.py:478 src/window.py:501 src/window.py:575
#: src/window.py:636 src/window.py:685 src/window.py:712 src/window.py:745
#: src/window.py:785
msgid "Cancel"
msgstr "Cancelar"
#: src/window.py:441
msgid "Stop"
msgstr "Parar"
#: src/window.py:474
msgid "Delete Model"
msgstr "Eliminar Modelo"
#: src/window.py:475 src/window.py:709
msgid "Are you sure you want to delete '{}'?"
msgstr "¿Estás seguro de que quieres eliminar '{}'?"
#: src/window.py:479 src/window.py:713
msgid "Delete"
msgstr "Eliminar"
#: src/window.py:496
msgid "Pull Model"
msgstr "Descargar Modelo"
#: src/window.py:497
msgid "Please select a tag to pull '{}'"
msgstr "Por favor selecciona una etiqueta para descargar '{}'"
#: src/window.py:502
msgid "Pull"
msgstr "Descargar"
#: src/window.py:571 src/window.ui:439
msgid "Clear Chat"
msgstr "Limpiar Chat"
#: src/window.py:572
msgid "Are you sure you want to clear the chat?"
msgstr "¿Estás seguro de que quieres limpiar el chat?"
#: src/window.py:576
msgid "Clear"
msgstr "Limpiar"
#: src/window.py:632
msgid "Save Changes"
msgstr "Guardar Cambios"
#: src/window.py:633
msgid "Do you want to save the URL change?"
msgstr "¿Deseas guardar el cambio de URL?"
#: src/window.py:637
msgid "Discard"
msgstr "Descartar"
#: src/window.py:638
msgid "Save"
msgstr "Guardar"
#: src/window.py:681
msgid "Remove Image"
msgstr "Remover Imagen"
#: src/window.py:682
msgid "Are you sure you want to remove image?"
msgstr "¿Estás seguro de que quieres eliminar la imagen?"
#: src/window.py:686
msgid "Remove"
msgstr "Remover"
#: src/window.py:708
msgid "Delete Chat"
msgstr "Eliminar Chat"
#: src/window.py:739
msgid "Rename Chat"
msgstr "Renombrar Chat"
#: src/window.py:746
msgid "Rename"
msgstr "Renombrar"
#: src/window.py:766
msgid "The name '{}' is already in use"
msgstr "El nombre '{}' ya está en uso"
#: src/window.py:779
msgid "Create Chat"
msgstr "Crear Chat"
#: src/window.py:786
msgid "Create"
msgstr "Crear"
#: src/window.ui:55
msgid "Chats"
msgstr "Chats"
#: src/window.ui:65
msgid "New chat"
msgstr "Nuevo chat"
#: src/window.ui:101
msgid "Toggle Sidebar"
msgstr "Alternar barra de lado"
#: src/window.ui:122 src/window.ui:259
msgid "Manage models"
msgstr "Gestionar modelos"
#: src/window.ui:136
msgid "Menu"
msgstr "Menu"
#: src/window.ui:215
msgid "Send"
msgstr "Enviar"
#: src/window.ui:224
msgid "Requires model 'llava' to be selected"
msgstr "Requiere que el modelo 'llava' sea seleccionado"
#: src/window.ui:227
msgid "Image"
msgstr "Imagen"
#: src/window.ui:344
msgid "Previous"
msgstr "Anterior"
#: src/window.ui:359
msgid "Next"
msgstr "Siguiente"
#: src/window.ui:385
msgid "Welcome to Alpaca"
msgstr "Bienvenido a Alpaca"
#: src/window.ui:386
msgid ""
"To get started, please ensure you have an Ollama instance set up. You can "
"either run Ollama locally on your machine or connect to a remote instance."
msgstr ""
"Para iniciar, por favor asegurate de tener una instancia de Ollama "
"funcional. Puedes correr Ollama localmente o conectarte a una instancia "
"remota."
#: src/window.ui:389
msgid "Ollama Website"
msgstr "Sitio Web de Ollama"
#: src/window.ui:406
msgid ""
"Alpaca and its developers are not liable for any damages to devices or "
"software resulting from the execution of code generated by an AI model. "
"Please exercise caution and review the code carefully before running it."
msgstr ""
"Alpaca y sus desarrolladores no son responsables por cualquier daño a "
"dispositivos o software resultados por la ejecución de codigo generado por "
"un modelo de IA. Por favor sea precavido y revise el codigo cuidadosamente "
"antes de correrlo"
#: src/window.ui:418
msgid "Setup"
msgstr "Setup"
#: src/window.ui:419
msgid ""
"If you are running an Ollama instance locally and haven't modified the "
"default ports, you can use the default URL. Otherwise, please enter the URL "
"of your Ollama instance."
msgstr ""
"Si estás corriendo una instancia local de Ollama y no modificaste los "
"puertos por defecto, puedes usar la URL por defecto. De otra forma, por "
"favor ingresa la URL de tu instancia de Ollama"
#: src/window.ui:443
msgid "Change Server"
msgstr "Cambiar Servidor"
#: src/window.ui:447
msgid "Keyboard Shortcuts"
msgstr "Atajos de Teclado"
#: src/window.ui:451
msgid "About Alpaca"
msgstr "Sobre Alpaca"
#: src/window.ui:473
msgid "General"
msgstr "General"
#: src/window.ui:477
msgid "Close application"
msgstr "Cerrar aplicación"
#: src/window.ui:483
msgid "Clear chat"
msgstr "Limpiar chat"
#: src/window.ui:489
msgid "Change server"
msgstr "Cambiar servidor"
#: src/window.ui:495
msgid "Show shortcuts window"
msgstr "Mostrar ventana de atajos"
#: src/window.ui:502
msgid "Editor"
msgstr "Editor"
#: src/window.ui:506
msgid "Copy"
msgstr "Copiar"
#: src/window.ui:512
msgid "Paste"
msgstr "Pegar"
#: src/window.ui:518
msgid "Send Message"
msgstr "Enviar Mensaje"

619
po/ru.po
View File

@@ -1,95 +1,572 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: 2024-05-16 19:29+0800\n"
"PO-Revision-Date: 2024-05-16 19:59+0800\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-20 19:15-0600\n"
"PO-Revision-Date: 2024-05-20 16:59+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: ru_RU\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.4.2\n"
"X-Generator: Poedit 3.4.4\n"
"X-Poedit-Basepath: ../src\n"
"X-Poedit-SearchPath-0: .\n"
#: gtk/help-overlay.ui:11
msgctxt "shortcut window"
msgid "General"
msgstr "Общие"
#: data/com.jeffser.Alpaca.desktop.in:3
#: data/com.jeffser.Alpaca.metainfo.xml.in:7
msgid "Alpaca"
msgstr ""
#: gtk/help-overlay.ui:14
msgctxt "shortcut window"
msgid "Show Shortcuts"
#: data/com.jeffser.Alpaca.metainfo.xml.in:8
msgid "Chat with multiple AI models"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:10
msgid "An Ollama client"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:11
#: data/com.jeffser.Alpaca.metainfo.xml.in:209
msgid "Features"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:13
#: data/com.jeffser.Alpaca.metainfo.xml.in:211
msgid "Talk to multiple models in the same conversation"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:14
#: data/com.jeffser.Alpaca.metainfo.xml.in:212
msgid "Pull and delete models from the app"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:16 src/window.ui:392
msgid "Disclaimer"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:17
msgid ""
"This project is not affiliated at all with Ollama, I'm not responsible for "
"any damages to your device or software caused by running code given by any "
"models."
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:20
msgid "Jeffry Samuel Eduarte Rojas"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:38
msgid "Welcome dialog"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:42
msgid "A conversation involving multiple models"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:46
msgid "Managing models"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:57
msgid "Yet Another Daily Update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:59
msgid "Added better UI for 'Manage Models' dialog"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:60
msgid "Added better UI for the chat sidebar"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:61
msgid ""
"Replaced model description with a button to open Ollama's website for the "
"model"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:62
msgid "Added myself to the credits as the spanish translator"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:63
msgid "Using XDG properly to get config folder"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:64
msgid "Update for translations"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:66
#: data/com.jeffser.Alpaca.metainfo.xml.in:78
#: data/com.jeffser.Alpaca.metainfo.xml.in:97
#: data/com.jeffser.Alpaca.metainfo.xml.in:118
#: data/com.jeffser.Alpaca.metainfo.xml.in:134
#: data/com.jeffser.Alpaca.metainfo.xml.in:150
#: data/com.jeffser.Alpaca.metainfo.xml.in:164
#: data/com.jeffser.Alpaca.metainfo.xml.in:174
#: data/com.jeffser.Alpaca.metainfo.xml.in:192
#: data/com.jeffser.Alpaca.metainfo.xml.in:214
msgid "Please report any errors to the issues page, thank you."
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:74
msgid "Quick Fix"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:76
msgid "The last update had some mistakes in the description of the update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:86
msgid "Another Daily Update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:88
msgid "Added full Spanish translation"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:89
msgid "Added support for background pulling of multiple models"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:90
msgid "Added interrupt button"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:91
#, fuzzy
msgid "Added basic shortcuts"
msgstr "Показывать ярлыки"
#: gtk/help-overlay.ui:20
msgctxt "shortcut window"
msgid "Quit"
msgstr "Выйти"
#: data/com.jeffser.Alpaca.metainfo.xml.in:92
msgid "Better translation support"
msgstr ""
#: window.ui:30
#: data/com.jeffser.Alpaca.metainfo.xml.in:93
msgid ""
"User can now leave chat name empty when creating a new one, it will add a "
"placeholder name"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:94
msgid "Better scalling for different window sizes"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:95
msgid "Fixed: Can't close app if first time setup fails"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:105
msgid "Really Big Update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:107
msgid "Added multiple chats support!"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:108
msgid "Added Pango Markup support (bold, list, title, subtitle, monospace)"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:109
msgid "Added autoscroll if the user is at the bottom of the chat"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:110
msgid "Added support for multiple tags on a single model"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:111
msgid "Added better model management dialog"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:112
msgid "Added loading spinner when sending message"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:113
msgid "Added notifications if app is not active and a model pull finishes"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:114
msgid "Added new symbolic icon"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:115
msgid "Added frame to message textview widget"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:116
msgid "Fixed \"code blocks shouldn't be editable\""
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:126
#: data/com.jeffser.Alpaca.metainfo.xml.in:183
msgid "Big Update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:128
msgid "Added code highlighting"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:129
msgid "Added image recognition (llava model)"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:130
msgid "Added multiline prompt"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:131
msgid "Fixed some small bugs"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:132
msgid "General optimization"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:142
msgid "Fixes and features"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:144
msgid "Russian translation (thanks github/alexkdeveloper)"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:145
msgid "Fixed: Cannot close app on first setup"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:146
msgid "Fixed: Brand colors for Flathub"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:147
msgid "Fixed: App description"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:148
msgid "Fixed: Only show 'save changes dialog' when you actually change the url"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:158
msgid "0.2.2 Bug fixes"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:160
msgid "Toast messages appearing behind dialogs"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:161
msgid "Local model list not updating when changing servers"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:162
msgid "Closing the setup dialog closes the whole app"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:172
msgid "0.2.1 Data saving fix"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:173
msgid ""
"The app didn't save the config files and chat history to the right "
"directory, this is now fixed"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:182
msgid "0.2.0"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:184
msgid "New Features"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:186
msgid "Restore chat after closing the app"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:187
msgid "A button to clear the chat"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:188
msgid "Fixed multiple bugs involving how messages are shown"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:189
msgid "Added welcome dialog"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:190
msgid "More stability"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:200
msgid "0.1.2 Quick fixes"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:201
msgid ""
"This release fixes some metadata needed to have a proper Flatpak application"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:207
msgid "0.1.1 Stable Release"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:208
msgid "This is the first public version of Alpaca"
msgstr ""
#: src/window.py:47 src/window.py:776
msgid "New Chat"
msgstr "Новый Чат"
#: src/window.py:86
msgid "An error occurred"
msgstr "Произошла ошибка"
#: src/window.py:87
msgid "Failed to connect to server"
msgstr "Не удалось подключиться к серверу"
#: src/window.py:88
msgid "Could not list local models"
msgstr "Не удалось перечислить локальные модели"
#: src/window.py:89
msgid "Could not delete model"
msgstr "Не удалось удалить модель"
#: src/window.py:90
msgid "Could not pull model"
msgstr "Не удалось извлечь модель"
#: src/window.py:91
msgid "Cannot open image"
msgstr "Не удается открыть изображение"
#: src/window.py:92
msgid "Cannot delete chat because it's the only one left"
msgstr "Не удается удалить чат, потому что он единственный оставшийся"
#: src/window.py:95
msgid "Please select a model before chatting"
msgstr "Пожалуйста, выберите модель перед началом общения"
#: src/window.py:96
msgid "Chat cannot be cleared while receiving a message"
msgstr "Чат не может быть удален при получении сообщения"
#: src/window.py:99
msgid "Model deleted successfully"
msgstr "Модель успешно удалена"
#: src/window.py:100
msgid "Model pulled successfully"
msgstr "Модель успешно извлечена"
#: src/window.py:425
msgid "Task Complete"
msgstr "Задача выполнена"
#: src/window.py:425
msgid "Model '{}' pulled successfully."
msgstr "Модель '{}' успешно извлечена."
#: src/window.py:430
msgid "Pull Model Error"
msgstr "Ошибка Извлечения Модели"
#: src/window.py:430
msgid "Failed to pull model '{}' due to network error."
msgstr "Не удалось извлечь модель '{}' из-за сетевой ошибки."
#: src/window.py:446
msgid "Stop Model"
msgstr "Остановить Модель"
#: src/window.py:447
msgid "Are you sure you want to stop pulling '{}'?"
msgstr "Вы уверены, что хотите прекратить извлечение '{}'?"
#: src/window.py:450 src/window.py:489 src/window.py:512 src/window.py:593
#: src/window.py:654 src/window.py:703 src/window.py:730 src/window.py:763
#: src/window.py:803
msgid "Cancel"
msgstr "Отмена"
#: src/window.py:451
msgid "Stop"
msgstr "Стоп"
#: src/window.py:485
msgid "Delete Model"
msgstr "Удалить Модель"
#: src/window.py:486 src/window.py:727
msgid "Are you sure you want to delete '{}'?"
msgstr "Вы уверены, что хотите удалить '{}'?"
#: src/window.py:490 src/window.py:731
msgid "Delete"
msgstr "Удалить"
#: src/window.py:507
msgid "Pull Model"
msgstr "Извлечение модели"
#: src/window.py:508
msgid "Please select a tag to pull '{}'"
msgstr "Пожалуйста, выберите тег для извлечения '{}'"
#: src/window.py:513
msgid "Pull"
msgstr "Извлечение"
#: src/window.py:589 src/window.ui:426
msgid "Clear Chat"
msgstr "Очистить Чат"
#: src/window.py:590
msgid "Are you sure you want to clear the chat?"
msgstr "Вы уверены, что хотите очистить чат?"
#: src/window.py:594
msgid "Clear"
msgstr "Очистить"
#: src/window.py:650
msgid "Save Changes"
msgstr "Сохранить Изменения"
#: src/window.py:651
msgid "Do you want to save the URL change?"
msgstr "Хотите сохранить изменение URL?"
#: src/window.py:655
msgid "Discard"
msgstr "Отказаться"
#: src/window.py:656
msgid "Save"
msgstr "Сохранить"
#: src/window.py:699
msgid "Remove Image"
msgstr "Удалить Изображение"
#: src/window.py:700
msgid "Are you sure you want to remove image?"
msgstr "Вы уверены, что хотите удалить изображение?"
#: src/window.py:704
msgid "Remove"
msgstr "Удалить"
#: src/window.py:726
msgid "Delete Chat"
msgstr "Удалить Чат"
#: src/window.py:757
msgid "Rename Chat"
msgstr "Переименовать Чат"
#: src/window.py:764
msgid "Rename"
msgstr "Переименовать"
#: src/window.py:784
msgid "The name '{}' is already in use"
msgstr "Имя '{}' уже используется"
#: src/window.py:797
msgid "Create Chat"
msgstr "Создать Чат"
#: src/window.py:804
msgid "Create"
msgstr "Создать"
#: src/window.ui:54
msgid "Chats"
msgstr "Чаты"
#: src/window.ui:64
msgid "New chat"
msgstr "Новый чат"
#: src/window.ui:100
msgid "Toggle Sidebar"
msgstr "Переключение боковой панели"
#: src/window.ui:121 src/window.ui:257
msgid "Manage models"
msgstr "Управление моделями"
#: window.ui:44
#: src/window.ui:135
msgid "Menu"
msgstr "Меню"
#: window.ui:106
#: src/window.ui:213
msgid "Send"
msgstr "Отправить"
#: window.ui:137
msgid "Pulling Model"
msgstr "Тянущая модель"
#: src/window.ui:222
msgid "Requires model 'llava' to be selected"
msgstr "Требуется выбрать модель \"llava\""
#: window.ui:218
#: src/window.ui:225
msgid "Image"
msgstr "Изображение"
#: src/window.ui:331
msgid "Previous"
msgstr "Предыдущий"
#: window.ui:233
#: src/window.ui:346
msgid "Next"
msgstr "Следующий"
#: window.ui:259
#: src/window.ui:372
msgid "Welcome to Alpaca"
msgstr "Добро пожаловать в Alpaca"
#: window.ui:260
#: src/window.ui:373
msgid ""
"To get started, please ensure you have an Ollama instance set up. You can "
"either run Ollama locally on your machine or connect to a remote instance."
msgstr ""
"Для начала, пожалуйста, убедитесь, что у вас настроен экземпляр Ollama. Вы "
"можете либо запустить Ollama локально на своем компьютере, либо "
"подключиться к удаленному экземпляру."
"можете либо запустить Ollama локально на своем компьютере, либо подключиться "
"к удаленному экземпляру."
#: window.ui:263
#: src/window.ui:376
msgid "Ollama Website"
msgstr "Веб-сайт Ollama"
#: window.ui:279
msgid "Disclaimer"
msgstr "Отказ от ответственности"
#: window.ui:280
#: src/window.ui:393
msgid ""
"Alpaca and its developers are not liable for any damages to devices or "
"software resulting from the execution of code generated by an AI model. "
"Please exercise caution and review the code carefully before running it."
msgstr ""
"Alpaca и ее разработчики не несут ответственности за любой ущерб, "
"причиненный устройствам или программному обеспечению в результате "
"выполнения кода, сгенерированного с помощью модели искусственного "
"интеллекта. Пожалуйста, будьте осторожны и внимательно ознакомьтесь с кодом "
"перед его запуском."
"причиненный устройствам или программному обеспечению в результате выполнения "
"кода, сгенерированного с помощью модели искусственного интеллекта. "
"Пожалуйста, будьте осторожны и внимательно ознакомьтесь с кодом перед его "
"запуском."
#: window.ui:292
#: src/window.ui:405
msgid "Setup"
msgstr "Установка"
#: window.ui:293
#: src/window.ui:406
msgid ""
"If you are running an Ollama instance locally and haven't modified the "
"default ports, you can use the default URL. Otherwise, please enter the URL "
@@ -99,14 +576,62 @@ msgstr ""
"умолчанию, вы можете использовать URL-адрес по умолчанию. В противном "
"случае, пожалуйста, введите URL-адрес вашего экземпляра Ollama."
#: window.ui:313
msgid "_Clear Conversation"
msgstr "_Очистить разговор"
#: src/window.ui:430
msgid "Change Server"
msgstr "Изменить Сервер"
#: window.ui:317
msgid "_Change Server"
msgstr "_Изменить Сервер"
#: src/window.ui:434
msgid "Keyboard Shortcuts"
msgstr "Комбинации Клавиш"
#: window.ui:321
msgid "_About Alpaca"
msgstr "_О Программе"
#: src/window.ui:438
msgid "About Alpaca"
msgstr "О Программе"
#: src/window.ui:460
msgid "General"
msgstr "Общие"
#: src/window.ui:464
msgid "Close application"
msgstr "Закрыть приложение"
#: src/window.ui:470
msgid "Clear chat"
msgstr "Очистить чат"
#: src/window.ui:476
msgid "Change server"
msgstr "Изменить Сервер"
#: src/window.ui:482
msgid "Show shortcuts window"
msgstr "Показать окно комбинаций клавиш"
#: src/window.ui:489
msgid "Editor"
msgstr "Редактор"
#: src/window.ui:493
msgid "Copy"
msgstr "Копировать"
#: src/window.ui:499
msgid "Paste"
msgstr "Вставить"
#: src/window.ui:505
msgid "Send Message"
msgstr ""
#~ msgctxt "shortcut window"
#~ msgid "General"
#~ msgstr "Общие"
#~ msgctxt "shortcut window"
#~ msgid "Show Shortcuts"
#~ msgstr "Показывать комбинации клавиш"
#~ msgctxt "shortcut window"
#~ msgid "Quit"
#~ msgstr "Выйти"

583
po/ru.po~ Normal file
View File

@@ -0,0 +1,583 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-05-19 21:53-0600\n"
"PO-Revision-Date: 2024-05-20 16:59+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: ru_RU\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.4.4\n"
"X-Poedit-Basepath: ../src\n"
"X-Poedit-SearchPath-0: .\n"
#: gtk/help-overlay.ui:11
msgctxt "shortcut window"
msgid "General"
msgstr "Общие"
#: gtk/help-overlay.ui:14
msgctxt "shortcut window"
msgid "Show Shortcuts"
msgstr "Показывать комбинации клавиш"
#: gtk/help-overlay.ui:20
msgctxt "shortcut window"
msgid "Quit"
msgstr "Выйти"
#: data/com.jeffser.Alpaca.desktop.in:3
#: data/com.jeffser.Alpaca.metainfo.xml.in:7
msgid "Alpaca"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:8
#: data/com.jeffser.Alpaca.metainfo.xml.in:11
msgid "An Ollama client"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:10
msgid "Chat with multiple AI models"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:12
#: data/com.jeffser.Alpaca.metainfo.xml.in:193
msgid "Features"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:14
#: data/com.jeffser.Alpaca.metainfo.xml.in:195
msgid "Talk to multiple models in the same conversation"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:15
#: data/com.jeffser.Alpaca.metainfo.xml.in:196
msgid "Pull and delete models from the app"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:18
msgid "This project is not affiliated at all with Ollama, I'm not responsible for any damages to your device or software caused by running code given by any models."
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:21
msgid "Jeffry Samuel Eduarte Rojas"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:39
msgid "Welcome dialog"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:43
msgid "A conversation involving multiple models"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:47
msgid "Managing models"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:58
msgid "Quick Fix"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:60
msgid "The last update had some mistakes in the description of the update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:62
#: data/com.jeffser.Alpaca.metainfo.xml.in:81
#: data/com.jeffser.Alpaca.metainfo.xml.in:102
#: data/com.jeffser.Alpaca.metainfo.xml.in:118
#: data/com.jeffser.Alpaca.metainfo.xml.in:134
#: data/com.jeffser.Alpaca.metainfo.xml.in:148
#: data/com.jeffser.Alpaca.metainfo.xml.in:158
#: data/com.jeffser.Alpaca.metainfo.xml.in:176
#: data/com.jeffser.Alpaca.metainfo.xml.in:198
msgid "Please report any errors to the issues page, thank you."
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:70
msgid "Another Daily Update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:72
msgid "Added full Spanish translation"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:73
msgid "Added support for background pulling of multiple models"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:74
msgid "Added interrupt button"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:75
#, fuzzy
msgid "Added basic shortcuts"
msgstr "Показывать ярлыки"
#: data/com.jeffser.Alpaca.metainfo.xml.in:76
msgid "Better translation support"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:77
msgid "User can now leave chat name empty when creating a new one, it will add a placeholder name"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:78
msgid "Better scalling for different window sizes"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:79
msgid "Fixed: Can't close app if first time setup fails"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:89
msgid "Really Big Update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:91
msgid "Added multiple chats support!"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:92
msgid "Added Pango Markup support (bold, list, title, subtitle, monospace)"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:93
msgid "Added autoscroll if the user is at the bottom of the chat"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:94
msgid "Added support for multiple tags on a single model"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:95
msgid "Added better model management dialog"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:96
msgid "Added loading spinner when sending message"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:97
msgid "Added notifications if app is not active and a model pull finishes"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:98
msgid "Added new symbolic icon"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:99
msgid "Added frame to message textview widget"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:100
msgid "Fixed \"code blocks shouldn't be editable\""
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:110
#: data/com.jeffser.Alpaca.metainfo.xml.in:167
msgid "Big Update"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:112
msgid "Added code highlighting"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:113
msgid "Added image recognition (llava model)"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:114
msgid "Added multiline prompt"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:115
msgid "Fixed some small bugs"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:116
msgid "General optimization"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:126
msgid "Fixes and features"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:128
msgid "Russian translation (thanks github/alexkdeveloper)"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:129
msgid "Fixed: Cannot close app on first setup"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:130
msgid "Fixed: Brand colors for Flathub"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:131
msgid "Fixed: App description"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:132
msgid "Fixed: Only show 'save changes dialog' when you actually change the url"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:142
msgid "0.2.2 Bug fixes"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:144
msgid "Toast messages appearing behind dialogs"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:145
msgid "Local model list not updating when changing servers"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:146
msgid "Closing the setup dialog closes the whole app"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:156
msgid "0.2.1 Data saving fix"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:157
msgid "The app didn't save the config files and chat history to the right directory, this is now fixed"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:166
msgid "0.2.0"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:168
msgid "New Features"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:170
msgid "Restore chat after closing the app"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:171
msgid "A button to clear the chat"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:172
msgid "Fixed multiple bugs involving how messages are shown"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:173
msgid "Added welcome dialog"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:174
msgid "More stability"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:184
msgid "0.1.2 Quick fixes"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:185
msgid "This release fixes some metadata needed to have a proper Flatpak application"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:191
msgid "0.1.1 Stable Release"
msgstr ""
#: data/com.jeffser.Alpaca.metainfo.xml.in:192
msgid "This is the first public version of Alpaca"
msgstr ""
#: window.py:47
msgid "New Chat"
msgstr "Новый Чат"
#: window.py:86
msgid "An error occurred"
msgstr "Произошла ошибка"
#: window.py:87
msgid "Failed to connect to server"
msgstr "Не удалось подключиться к серверу"
#: window.py:88
msgid "Could not list local models"
msgstr "Не удалось перечислить локальные модели"
#: window.py:89
msgid "Could not delete model"
msgstr "Не удалось удалить модель"
#: window.py:90
msgid "Could not pull model"
msgstr "Не удалось извлечь модель"
#: window.py:91
msgid "Cannot open image"
msgstr "Не удается открыть изображение"
#: window.py:92
msgid "Cannot delete chat because it's the only one left"
msgstr "Не удается удалить чат, потому что он единственный оставшийся"
#: window.py:95
msgid "Please select a model before chatting"
msgstr "Пожалуйста, выберите модель перед началом общения"
#: window.py:96
msgid "Chat cannot be cleared while receiving a message"
msgstr "Чат не может быть удален при получении сообщения"
#: window.py:99
msgid "Model deleted successfully"
msgstr "Модель успешно удалена"
#: window.py:100
msgid "Model pulled successfully"
msgstr "Модель успешно извлечена"
#: window.py:418
msgid "Task Complete"
msgstr "Задача выполнена"
#: window.py:418
msgid "Model '{}' pulled successfully."
msgstr "Модель '{}' успешно извлечена."
#: window.py:424
msgid "Pull Model Error"
msgstr "Ошибка Извлечения Модели"
#: window.py:424
msgid "Failed to pull model '{}' due to network error."
msgstr "Не удалось извлечь модель '{}' из-за сетевой ошибки."
#: window.py:436
msgid "Stop Model"
msgstr "Остановить Модель"
#: window.py:437
msgid "Are you sure you want to stop pulling '{}'?"
msgstr "Вы уверены, что хотите прекратить извлечение '{}'?"
#: window.py:440 window.py:478 window.py:501 window.py:575 window.py:636
#: window.py:685 window.py:712 window.py:745 window.py:778
msgid "Cancel"
msgstr "Отмена"
#: window.py:441
msgid "Stop"
msgstr "Стоп"
#: window.py:474
msgid "Delete Model"
msgstr "Удалить Модель"
#: window.py:475 window.py:709
msgid "Are you sure you want to delete '{}'?"
msgstr "Вы уверены, что хотите удалить '{}'?"
#: window.py:479 window.py:713
msgid "Delete"
msgstr "Удалить"
#: window.py:496
msgid "Pull Model"
msgstr "Извлечение модели"
#: window.py:497
msgid "Please select a tag to pull '{}'"
msgstr "Пожалуйста, выберите тег для извлечения '{}'"
#: window.py:502
msgid "Pull"
msgstr "Извлечение"
#: window.py:571 window.ui:439
msgid "Clear Chat"
msgstr "Очистить Чат"
#: window.py:572
msgid "Are you sure you want to clear the chat?"
msgstr "Вы уверены, что хотите очистить чат?"
#: window.py:576
msgid "Clear"
msgstr "Очистить"
#: window.py:632
msgid "Save Changes"
msgstr "Сохранить Изменения"
#: window.py:633
msgid "Do you want to save the URL change?"
msgstr "Хотите сохранить изменение URL?"
#: window.py:637
msgid "Discard"
msgstr "Отказаться"
#: window.py:638
msgid "Save"
msgstr "Сохранить"
#: window.py:681
msgid "Remove Image"
msgstr "Удалить Изображение"
#: window.py:682
msgid "Are you sure you want to remove image?"
msgstr "Вы уверены, что хотите удалить изображение?"
#: window.py:686
msgid "Remove"
msgstr "Удалить"
#: window.py:708
msgid "Delete Chat"
msgstr "Удалить Чат"
#: window.py:739
msgid "Rename Chat"
msgstr "Переименовать Чат"
#: window.py:746
msgid "Rename"
msgstr "Переименовать"
#: window.py:759
msgid "The name '{}' is already in use"
msgstr "Имя '{}' уже используется"
#: window.py:772
msgid "Create Chat"
msgstr "Создать Чат"
#: window.py:779
msgid "Create"
msgstr "Создать"
#: window.ui:55
msgid "Chats"
msgstr "Чаты"
#: window.ui:65
msgid "New chat"
msgstr "Новый чат"
#: window.ui:101
msgid "Toggle Sidebar"
msgstr "Переключение боковой панели"
#: window.ui:122
msgid "Manage models"
msgstr "Управление моделями"
#: window.ui:136
msgid "Menu"
msgstr "Меню"
#: window.ui:215
msgid "Send"
msgstr "Отправить"
#: window.ui:224
msgid "Requires model 'llava' to be selected"
msgstr "Требуется выбрать модель \"llava\""
#: window.ui:227
msgid "Image"
msgstr "Изображение"
#: window.ui:344
msgid "Previous"
msgstr "Предыдущий"
#: window.ui:359
msgid "Next"
msgstr "Следующий"
#: window.ui:385
msgid "Welcome to Alpaca"
msgstr "Добро пожаловать в Alpaca"
#: window.ui:386
msgid "To get started, please ensure you have an Ollama instance set up. You can either run Ollama locally on your machine or connect to a remote instance."
msgstr "Для начала, пожалуйста, убедитесь, что у вас настроен экземпляр Ollama. Вы можете либо запустить Ollama локально на своем компьютере, либо подключиться к удаленному экземпляру."
#: window.ui:389
msgid "Ollama Website"
msgstr "Веб-сайт Ollama"
#: window.ui:405
msgid "Disclaimer"
msgstr ""
#: window.ui:406
msgid "Alpaca and its developers are not liable for any damages to devices or software resulting from the execution of code generated by an AI model. Please exercise caution and review the code carefully before running it."
msgstr "Alpaca и ее разработчики не несут ответственности за любой ущерб, причиненный устройствам или программному обеспечению в результате выполнения кода, сгенерированного с помощью модели искусственного интеллекта. Пожалуйста, будьте осторожны и внимательно ознакомьтесь с кодом перед его запуском."
#: window.ui:418
msgid "Setup"
msgstr "Установка"
#: window.ui:419
msgid "If you are running an Ollama instance locally and haven't modified the default ports, you can use the default URL. Otherwise, please enter the URL of your Ollama instance."
msgstr "Если вы запускаете локальный экземпляр Ollama и не изменили порты по умолчанию, вы можете использовать URL-адрес по умолчанию. В противном случае, пожалуйста, введите URL-адрес вашего экземпляра Ollama."
#: window.ui:443
msgid "Change Server"
msgstr "Изменить Сервер"
#: window.ui:447
msgid "Keyboard Shortcuts"
msgstr "Комбинации Клавиш"
#: window.ui:451
msgid "About Alpaca"
msgstr "О Программе"
#: window.ui:473
msgid "General"
msgstr "Общие"
#: window.ui:477
msgid "Close application"
msgstr "Закрыть приложение"
#: window.ui:483
msgid "Clear chat"
msgstr "Очистить чат"
#: window.ui:489
msgid "Change server"
msgstr "Изменить Сервер"
#: window.ui:495
msgid "Show shortcuts window"
msgstr "Показать окно комбинаций клавиш"
#: window.ui:502
msgid "Editor"
msgstr "Редактор"
#: window.ui:506
msgid "Copy"
msgstr "Копировать"
#: window.ui:512
msgid "Paste"
msgstr "Вставить"
#: window.ui:518
msgid "Send Message"
msgstr ""

File diff suppressed because one or more lines are too long

View File

@@ -33,7 +33,7 @@ class AlpacaApplication(Adw.Application):
super().__init__(application_id='com.jeffser.Alpaca',
flags=Gio.ApplicationFlags.DEFAULT_FLAGS)
self.create_action('quit', lambda *_: self.quit(), ['<primary>q'])
self.create_action('clear', lambda *_: AlpacaWindow.clear_conversation_dialog(self.props.active_window), ['<primary>e'])
self.create_action('clear', lambda *_: AlpacaWindow.clear_chat_dialog(self.props.active_window), ['<primary>e'])
self.create_action('reconnect', lambda *_: AlpacaWindow.show_connection_dialog(self.props.active_window), ['<primary>r'])
self.create_action('about', self.on_about_action)
@@ -44,17 +44,17 @@ class AlpacaApplication(Adw.Application):
win.present()
def on_about_action(self, widget, _):
about = Adw.AboutWindow(transient_for=self.props.active_window,
about = Adw.AboutDialog(#transient_for=self.props.active_window,
application_name='Alpaca',
application_icon='com.jeffser.Alpaca',
developer_name='Jeffry Samuel Eduarte Rojas',
version='0.5.0',
version='0.5.5',
developers=['Jeffser https://jeffser.com'],
designers=['Jeffser https://jeffser.com'],
translator_credits='Alex K (Russian) https://github.com/alexkdeveloper',
translator_credits='Alex K (Russian) https://github.com/alexkdeveloper\nJeffser (Spanish) https://jeffser.com',
copyright='© 2024 Jeffser',
issue_url='https://github.com/Jeffser/Alpaca/issues')
about.present()
about.present(parent=self.props.active_window)
def create_action(self, name, callback, shortcuts=None):
action = Gio.SimpleAction.new(name, None)

View File

@@ -21,7 +21,7 @@ import gi
gi.require_version('GtkSource', '5')
gi.require_version('GdkPixbuf', '2.0')
from gi.repository import Adw, Gtk, Gdk, GLib, GtkSource, Gio, GdkPixbuf
import json, requests, threading, os, re, base64
import json, requests, threading, os, re, base64, sys, gettext, locale, webbrowser
from io import BytesIO
from PIL import Image
from datetime import datetime
@@ -30,16 +30,26 @@ from .available_models import available_models
@Gtk.Template(resource_path='/com/jeffser/Alpaca/window.ui')
class AlpacaWindow(Adw.ApplicationWindow):
config_dir = os.path.join(os.getenv("XDG_CONFIG_HOME"), "/", os.path.expanduser("~/.var/app/com.jeffser.Alpaca/config"))
config_dir = os.getenv("XDG_CONFIG_HOME")
__gtype_name__ = 'AlpacaWindow'
localedir = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'locale')
locale.setlocale(locale.LC_ALL, '')
gettext.bindtextdomain('com.jeffser.Alpaca', localedir)
gettext.textdomain('com.jeffser.Alpaca')
_ = gettext.gettext
#Variables
ollama_url = None
local_models = []
#In the future I will at multiple chats, for now I'll save it like this so that past chats don't break in the future
chats = {"chats": {"0": {"messages": []}}, "selected_chat": "0"}
pulling_models = {}
chats = {"chats": {_("New Chat"): {"messages": []}}, "selected_chat": "New Chat"}
attached_image = {"path": None, "base64": None}
first_time_setup = False
#Elements
shortcut_window : Gtk.ShortcutsWindow = Gtk.Template.Child()
bot_message : Gtk.TextBuffer = None
bot_message_box : Gtk.Box = None
bot_message_view : Gtk.TextView = None
@@ -49,7 +59,6 @@ class AlpacaWindow(Adw.ApplicationWindow):
connection_next_button = Gtk.Template.Child()
connection_url_entry = Gtk.Template.Child()
main_overlay = Gtk.Template.Child()
pull_overlay = Gtk.Template.Child()
manage_models_overlay = Gtk.Template.Child()
connection_overlay = Gtk.Template.Child()
chat_container = Gtk.Template.Child()
@@ -63,12 +72,9 @@ class AlpacaWindow(Adw.ApplicationWindow):
manage_models_button = Gtk.Template.Child()
manage_models_dialog = Gtk.Template.Child()
available_model_list_box = Gtk.Template.Child()
pulling_model_list_box = Gtk.Template.Child()
local_model_list_box = Gtk.Template.Child()
pull_model_dialog = Gtk.Template.Child()
pull_model_status_page = Gtk.Template.Child()
pull_model_progress_bar = Gtk.Template.Child()
available_model_list_box = Gtk.Template.Child()
chat_list_box = Gtk.Template.Child()
add_chat_button = Gtk.Template.Child()
@@ -77,21 +83,21 @@ class AlpacaWindow(Adw.ApplicationWindow):
toast_messages = {
"error": [
"An error occurred",
"Failed to connect to server",
"Could not list local models",
"Could not delete model",
"Could not pull model",
"Cannot open image",
"Cannot delete chat because it's the only one left"
_("An error occurred"),
_("Failed to connect to server"),
_("Could not list local models"),
_("Could not delete model"),
_("Could not pull model"),
_("Cannot open image"),
_("Cannot delete chat because it's the only one left")
],
"info": [
"Please select a model before chatting",
"Conversation cannot be cleared while receiving a message"
_("Please select a model before chatting"),
_("Chat cannot be cleared while receiving a message")
],
"good": [
"Model deleted successfully",
"Model pulled successfully"
_("Model deleted successfully"),
_("Model pulled successfully")
]
}
@@ -115,7 +121,7 @@ class AlpacaWindow(Adw.ApplicationWindow):
def show_message(self, msg:str, bot:bool, footer:str=None, image_base64:str=None):
message_text = Gtk.TextView(
editable=False,
focusable=False,
focusable=True,
wrap_mode= Gtk.WrapMode.WORD,
margin_top=12,
margin_bottom=12,
@@ -145,7 +151,7 @@ class AlpacaWindow(Adw.ApplicationWindow):
texture = Gdk.Texture.new_for_pixbuf(pixbuf)
image = Gtk.Image.new_from_paintable(texture)
image.set_size_request(360, 360)
image.set_size_request(240, 240)
image.set_margin_top(10)
image.set_margin_start(10)
image.set_margin_end(10)
@@ -179,7 +185,26 @@ class AlpacaWindow(Adw.ApplicationWindow):
for i in range(self.model_string_list.get_n_items() -1, -1, -1):
self.model_string_list.remove(i)
if response['status'] == 'ok':
self.local_model_list_box.remove_all()
if len(json.loads(response['text'])['models']) == 0:
self.local_model_list_box.set_visible(False)
else:
self.local_model_list_box.set_visible(True)
for model in json.loads(response['text'])['models']:
model_row = Adw.ActionRow(
title = model["name"].split(":")[0],
subtitle = model["name"].split(":")[1]
)
button = Gtk.Button(
icon_name = "user-trash-symbolic",
vexpand = False,
valign = 3,
css_classes = ["error"]
)
button.connect("clicked", lambda button=button, model_name=model["name"]: self.model_delete_button_activate(model_name))
model_row.add_suffix(button)
self.local_model_list_box.append(model_row)
self.model_string_list.append(model["name"])
self.local_models.append(model["name"])
self.model_drop_down.set_selected(0)
@@ -229,7 +254,7 @@ class AlpacaWindow(Adw.ApplicationWindow):
if part['type'] == 'normal':
message_text = Gtk.TextView(
editable=False,
focusable=False,
focusable=True,
wrap_mode= Gtk.WrapMode.WORD,
margin_top=12,
margin_bottom=12,
@@ -281,6 +306,9 @@ class AlpacaWindow(Adw.ApplicationWindow):
self.bot_message_box = None
def update_bot_message(self, data):
if self.bot_message is None:
self.save_history()
sys.exit()
vadjustment = self.chat_window.get_vadjustment()
if vadjustment.get_value() + 50 >= vadjustment.get_upper() - vadjustment.get_page_size():
GLib.idle_add(vadjustment.set_value, vadjustment.get_upper())
@@ -305,51 +333,74 @@ class AlpacaWindow(Adw.ApplicationWindow):
def run_message(self, messages, model):
response = stream_post(f"{self.ollama_url}/api/chat", data=json.dumps({"model": model, "messages": messages}), callback=self.update_bot_message)
GLib.idle_add(self.add_code_blocks)
GLib.idle_add(self.send_button.set_sensitive, True)
GLib.idle_add(self.image_button.set_sensitive, True)
GLib.idle_add(self.send_button.set_css_classes, ["suggested-action"])
GLib.idle_add(self.send_button.get_child().set_label, "Send")
GLib.idle_add(self.send_button.get_child().set_icon_name, "send-to-symbolic")
GLib.idle_add(self.chat_list_box.set_sensitive, True)
GLib.idle_add(self.add_chat_button.set_sensitive, True)
if self.verify_if_image_can_be_used(): GLib.idle_add(self.image_button.set_sensitive, True)
GLib.idle_add(self.image_button.set_css_classes, [])
GLib.idle_add(self.image_button.get_child().set_icon_name, "image-x-generic-symbolic")
self.attached_image = {"path": None, "base64": None}
GLib.idle_add(self.message_text_view.set_sensitive, True)
GLib.idle_add(self.message_text_view.set_sensitive, True)
if response['status'] == 'error':
GLib.idle_add(self.show_toast, 'error', 1, self.connection_overlay)
GLib.idle_add(self.show_connection_dialog, True)
def send_message(self, button):
if not self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False): return
current_model = self.model_drop_down.get_selected_item()
if current_model is None:
self.show_toast("info", 0, self.main_overlay)
return
formated_datetime = datetime.now().strftime("%Y/%m/%d %H:%M")
self.chats["chats"][self.chats["selected_chat"]]["messages"].append({
"role": "user",
"model": "User",
"date": formated_datetime,
"content": self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False)
})
data = {
"model": current_model.get_string(),
"messages": self.chats["chats"][self.chats["selected_chat"]]["messages"]
}
if self.verify_if_image_can_be_used() and self.attached_image["base64"] is not None:
data["messages"][-1]["images"] = [self.attached_image["base64"]]
self.message_text_view.set_sensitive(False)
self.send_button.set_sensitive(False)
self.image_button.set_sensitive(False)
self.show_message(self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False), False, f"\n\n<small>{formated_datetime}</small>", self.attached_image["base64"])
self.message_text_view.get_buffer().set_text("", 0)
self.show_message("", True)
self.loading_spinner = Gtk.Spinner(spinning=True, margin_top=12, margin_bottom=12, hexpand=True)
self.chat_container.append(self.loading_spinner)
thread = threading.Thread(target=self.run_message, args=(data['messages'], data['model']))
thread.start()
def send_message(self, button=None):
if button and self.bot_message: #STOP BUTTON
if self.loading_spinner: self.chat_container.remove(self.loading_spinner)
if self.verify_if_image_can_be_used(): self.image_button.set_sensitive(True)
self.image_button.set_css_classes([])
self.image_button.get_child().set_icon_name("image-x-generic-symbolic")
self.attached_image = {"path": None, "base64": None}
self.chat_list_box.set_sensitive(True)
self.add_chat_button.set_sensitive(True)
self.message_text_view.set_sensitive(True)
self.send_button.set_css_classes(["suggested-action"])
self.send_button.get_child().set_label("Send")
self.send_button.get_child().set_icon_name("send-to-symbolic")
self.bot_message = None
self.bot_message_box = None
self.bot_message_view = None
else:
if not self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False): return
current_model = self.model_drop_down.get_selected_item()
if current_model is None:
self.show_toast("info", 0, self.main_overlay)
return
formated_datetime = datetime.now().strftime("%Y/%m/%d %H:%M")
self.chats["chats"][self.chats["selected_chat"]]["messages"].append({
"role": "user",
"model": "User",
"date": formated_datetime,
"content": self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False)
})
data = {
"model": current_model.get_string(),
"messages": self.chats["chats"][self.chats["selected_chat"]]["messages"]
}
if self.verify_if_image_can_be_used() and self.attached_image["base64"] is not None:
data["messages"][-1]["images"] = [self.attached_image["base64"]]
self.message_text_view.set_sensitive(False)
self.send_button.set_css_classes(["destructive-action"])
self.send_button.get_child().set_label("Stop")
self.send_button.get_child().set_icon_name("edit-delete-symbolic")
self.chat_list_box.set_sensitive(False)
self.add_chat_button.set_sensitive(False)
self.image_button.set_sensitive(False)
self.show_message(self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False), False, f"\n\n<small>{formated_datetime}</small>", self.attached_image["base64"])
self.message_text_view.get_buffer().set_text("", 0)
self.show_message("", True)
self.loading_spinner = Gtk.Spinner(spinning=True, margin_top=12, margin_bottom=12, hexpand=True)
self.chat_container.append(self.loading_spinner)
thread = threading.Thread(target=self.run_message, args=(data['messages'], data['model']))
thread.start()
def delete_model(self, dialog, task, model_name):
if dialog.choose_finish(task) == "delete":
response = simple_delete(self.ollama_url + "/api/delete", data={"name": model_name})
self.update_list_local_models()
self.update_list_available_models()
if response['status'] == 'ok':
self.show_toast("good", 0, self.manage_models_overlay)
else:
@@ -357,67 +408,86 @@ class AlpacaWindow(Adw.ApplicationWindow):
self.manage_models_dialog.close()
self.show_connection_dialog(True)
def pull_model_update(self, data):
try:
GLib.idle_add(self.pull_model_progress_bar.set_text, data['status'])
if 'completed' in data:
if 'total' in data: GLib.idle_add(self.pull_model_progress_bar.set_fraction, data['completed'] / data['total'])
else: GLib.idle_add(self.pull_model_progress_bar.set_fraction, 1.0)
else:
GLib.idle_add(self.pull_model_progress_bar.set_fraction, 0.0)
except Exception as e: print(e)
def pull_model_update(self, data, model_name):
if model_name in list(self.pulling_models.keys()):
GLib.idle_add(self.pulling_models[model_name].set_subtitle, data['status'] + (f" | {round(data['completed'] / data['total'] * 100, 2)}%" if 'completed' in data and 'total' in data else ""))
else:
if len(list(self.pulling_models.keys())) == 0:
GLib.idle_add(self.pulling_model_list_box.set_visible, False)
sys.exit()
def pull_model(self, dialog, task, model_name, tag):
if dialog.choose_finish(task) == "pull":
data = {"name":f"{model_name}:{tag}"}
def pull_model(self, model_name, tag):
data = {"name":f"{model_name}:{tag}"}
response = stream_post(f"{self.ollama_url}/api/pull", data=json.dumps(data), callback=lambda data, model_name=f"{model_name}:{tag}": self.pull_model_update(data, model_name))
GLib.idle_add(self.update_list_local_models)
GLib.idle_add(self.pull_model_dialog.present, self.manage_models_dialog)
response = stream_post(f"{self.ollama_url}/api/pull", data=json.dumps(data), callback=self.pull_model_update)
if response['status'] == 'ok':
GLib.idle_add(self.show_notification, _("Task Complete"), _("Model '{}' pulled successfully.").format(f"{model_name}:{tag}"), True, Gio.ThemedIcon.new("emblem-ok-symbolic"))
GLib.idle_add(self.show_toast, "good", 1, self.manage_models_overlay)
GLib.idle_add(self.pulling_models[f"{model_name}:{tag}"].get_parent().remove, self.pulling_models[f"{model_name}:{tag}"])
del self.pulling_models[f"{model_name}:{tag}"]
else:
GLib.idle_add(self.show_notification, _("Pull Model Error"), _("Failed to pull model '{}' due to network error.").format(f"{model_name}:{tag}"), True, Gio.ThemedIcon.new("dialog-error-symbolic"))
GLib.idle_add(self.show_toast, "error", 4, self.connection_overlay)
GLib.idle_add(self.pulling_models[f"{model_name}:{tag}"].get_parent().remove, self.pulling_models[f"{model_name}:{tag}"])
del self.pulling_models[f"{model_name}:{tag}"]
GLib.idle_add(self.manage_models_dialog.close)
GLib.idle_add(self.show_connection_dialog, True)
if len(list(self.pulling_models.keys())) == 0:
GLib.idle_add(self.pulling_model_list_box.set_visible, False)
GLib.idle_add(self.update_list_local_models)
GLib.idle_add(self.update_list_available_models)
GLib.idle_add(self.pull_model_dialog.force_close)
if response['status'] == 'ok':
GLib.idle_add(self.show_notification, "Task Complete", f"Model '{model_name}:{tag}' pulled successfully.", True, Gio.ThemedIcon.new("emblem-ok-symbolic"))
GLib.idle_add(self.show_toast, "good", 1, self.manage_models_overlay)
else:
GLib.idle_add(self.show_notification, "Pull Model Error", f"Failed to pull model '{model_name}:{tag}' due to network error.", True, Gio.ThemedIcon.new("dialog-error-symbolic"))
GLib.idle_add(self.show_toast, "error", 4, self.connection_overlay)
GLib.idle_add(self.manage_models_dialog.close)
GLib.idle_add(self.show_connection_dialog, True)
def stop_pull_model(self, dialog, task, model_name):
if dialog.choose_finish(task) == "stop":
GLib.idle_add(self.pulling_models[model_name].get_parent().remove, self.pulling_models[model_name])
del self.pulling_models[model_name]
def pull_model_start(self, dialog, task, model_name, tag_drop_down):
tag = tag_drop_down.get_selected_item().get_string()
self.pull_model_status_page.set_description(f"{model_name}:{tag}")
thread = threading.Thread(target=self.pull_model, args=(dialog, task, model_name, tag))
thread.start()
def model_action_button_activate(self, button, model_name):
action = list(set(button.get_css_classes()) & set(["delete", "pull"]))[0]
def stop_pull_model_dialog(self, model_name):
dialog = Adw.AlertDialog(
heading=f"{action.capitalize()} Model",
body=f"Are you sure you want to {action} '{model_name}'?",
heading=_("Stop Model"),
body=_("Are you sure you want to stop pulling '{}'?").format(model_name),
close_response="cancel"
)
dialog.add_response("cancel", "Cancel")
dialog.add_response(action, action.capitalize())
dialog.set_response_appearance(action, Adw.ResponseAppearance.DESTRUCTIVE if action == "delete" else Adw.ResponseAppearance.SUGGESTED)
dialog.add_response("cancel", _("Cancel"))
dialog.add_response("stop", _("Stop"))
dialog.set_response_appearance("stop", Adw.ResponseAppearance.DESTRUCTIVE)
dialog.choose(
parent = self.manage_models_dialog,
cancellable = None,
callback = lambda dialog, task, model_name = model_name, button = button:
self.delete_model(dialog, task, model_name, button) if action == "delete" else self.pull_model_start(dialog, task, model_name,button)
callback = lambda dialog, task, model_name = model_name: self.stop_pull_model(dialog, task, model_name)
)
def pull_model_start(self, dialog, task, model_name, tag_drop_down):
if dialog.choose_finish(task) == "pull":
tag = tag_drop_down.get_selected_item().get_string()
if f"{model_name}:{tag}" in list(self.pulling_models.keys()): return ##TODO add message: 'already being pulled'
if f"{model_name}:{tag}" in self.local_models: return ##TODO add message 'already pulled'
#self.pull_model_status_page.set_description(f"{model_name}:{tag}")
self.pulling_model_list_box.set_visible(True)
model_row = Adw.ActionRow(
title = f"{model_name}:{tag}",
subtitle = ""
)
thread = threading.Thread(target=self.pull_model, args=(model_name, tag))
self.pulling_models[f"{model_name}:{tag}"] = model_row
button = Gtk.Button(
icon_name = "media-playback-stop-symbolic",
vexpand = False,
valign = 3,
css_classes = ["error"]
)
button.connect("clicked", lambda button, model_name=f"{model_name}:{tag}" : self.stop_pull_model_dialog(model_name))
model_row.add_suffix(button)
self.pulling_model_list_box.append(model_row)
thread.start()
def model_delete_button_activate(self, model_name):
dialog = Adw.AlertDialog(
heading="Delete Model",
body=f"Are you sure you want to delete '{model_name}'?",
heading=_("Delete Model"),
body=_("Are you sure you want to delete '{}'?").format(model_name),
close_response="cancel"
)
dialog.add_response("cancel", "Cancel")
dialog.add_response("delete", "Delete")
dialog.add_response("cancel", _("Cancel"))
dialog.add_response("delete", _("Delete"))
dialog.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE)
dialog.choose(
parent = self.manage_models_dialog,
@@ -434,13 +504,13 @@ class AlpacaWindow(Adw.ApplicationWindow):
model=tag_list
)
dialog = Adw.AlertDialog(
heading="Pull Model",
body=f"Please select a tag to pull '{model_name}'",
heading=_("Pull Model"),
body=_("Please select a tag to pull '{}'").format(model_name),
extra_child=tag_drop_down,
close_response="cancel"
)
dialog.add_response("cancel", "Cancel")
dialog.add_response("pull", "Pull")
dialog.add_response("cancel", _("Cancel"))
dialog.add_response("pull", _("Pull"))
dialog.set_response_appearance("pull", Adw.ResponseAppearance.SUGGESTED)
dialog.choose(
parent = self.manage_models_dialog,
@@ -449,41 +519,31 @@ class AlpacaWindow(Adw.ApplicationWindow):
)
def update_list_available_models(self):
self.local_model_list_box.remove_all()
self.available_model_list_box.remove_all()
for model_name in self.local_models:
model = Adw.ActionRow(
title = model_name.split(":")[0],
subtitle = model_name.split(":")[1]
)
button = Gtk.Button(
icon_name = "user-trash-symbolic",
vexpand = False,
valign = 3,
css_classes = ["error", "delete"]
)
button.connect("clicked", lambda button=button, model_name=model_name: self.model_delete_button_activate(model_name))
model.add_suffix(button)
self.local_model_list_box.append(model)
for name, model_info in available_models.items():
model = Adw.ActionRow(
title = name,
subtitle = model_info['description'],
title = name
)
button = Gtk.Button(
link_button = Gtk.Button(
icon_name = "web-browser-symbolic",
vexpand = False,
valign = 3,
css_classes = ["success"]
)
pull_button = Gtk.Button(
icon_name = "folder-download-symbolic",
vexpand = False,
valign = 3,
css_classes = ["accent", "pull"]
css_classes = ["accent"]
)
button.connect("clicked", lambda button=button, model_name=name: self.model_pull_button_activate(model_name))
model.add_suffix(button)
link_button.connect("clicked", lambda button=link_button, link=model_info["url"]: webbrowser.open(link))
pull_button.connect("clicked", lambda button=pull_button, model_name=name: self.model_pull_button_activate(model_name))
model.add_suffix(link_button)
model.add_suffix(pull_button)
self.available_model_list_box.append(model)
def manage_models_button_activate(self, button=None):
self.update_list_local_models()
self.update_list_available_models()
self.manage_models_dialog.present(self)
def connection_carousel_page_changed(self, carousel, index):
@@ -512,31 +572,31 @@ class AlpacaWindow(Adw.ApplicationWindow):
else: self.connection_url_entry.set_css_classes([])
self.connection_dialog.present(self)
def clear_conversation(self):
def clear_chat(self):
for widget in list(self.chat_container): self.chat_container.remove(widget)
self.chats["chats"][self.chats["selected_chat"]]["messages"] = []
def clear_conversation_dialog_response(self, dialog, task):
if dialog.choose_finish(task) == "empty":
self.clear_conversation()
def clear_chat_dialog_response(self, dialog, task):
if dialog.choose_finish(task) == "clear":
self.clear_chat()
self.save_history()
def clear_conversation_dialog(self):
def clear_chat_dialog(self):
if self.bot_message is not None:
self.show_toast("info", 1, self.main_overlay)
return
dialog = Adw.AlertDialog(
heading=f"Clear Conversation",
body=f"Are you sure you want to clear the conversation?",
heading=_("Clear Chat"),
body=_("Are you sure you want to clear the chat?"),
close_response="cancel"
)
dialog.add_response("cancel", "Cancel")
dialog.add_response("empty", "Empty")
dialog.set_response_appearance("empty", Adw.ResponseAppearance.DESTRUCTIVE)
dialog.add_response("cancel", _("Cancel"))
dialog.add_response("clear", _("Clear"))
dialog.set_response_appearance("clear", Adw.ResponseAppearance.DESTRUCTIVE)
dialog.choose(
parent = self,
cancellable = None,
callback = self.clear_conversation_dialog_response
callback = self.clear_chat_dialog_response
)
def save_history(self):
@@ -555,7 +615,7 @@ class AlpacaWindow(Adw.ApplicationWindow):
def load_history(self):
if os.path.exists(os.path.join(self.config_dir, "chats.json")):
self.clear_conversation()
self.clear_chat()
try:
with open(os.path.join(self.config_dir, "chats.json"), "r") as f:
self.chats = json.load(f)
@@ -578,21 +638,22 @@ class AlpacaWindow(Adw.ApplicationWindow):
def closing_connection_dialog(self, dialog):
if self.ollama_url is None: self.destroy()
if self.ollama_url is None or self.first_time_setup: self.destroy()
if self.ollama_url == self.connection_url_entry.get_text():
self.connection_dialog.force_close()
if self.ollama_url is None or self.verify_connection() == False:
self.show_connection_dialog(True)
self.show_toast("error", 1, self.connection_overlay)
else: self.first_time_setup = False
return
dialog = Adw.AlertDialog(
heading=f"Save Changes?",
body=f"Do you want to save the URL change?",
heading=_("Save Changes"),
body=_("Do you want to save the URL change?"),
close_response="cancel"
)
dialog.add_response("cancel", "Cancel")
dialog.add_response("discard", "Discard")
dialog.add_response("save", "Save")
dialog.add_response("cancel", _("Cancel"))
dialog.add_response("discard", _("Discard"))
dialog.add_response("save", _("Save"))
dialog.set_response_appearance("discard", Adw.ResponseAppearance.DESTRUCTIVE)
dialog.set_response_appearance("save", Adw.ResponseAppearance.SUGGESTED)
dialog.choose(
@@ -606,8 +667,6 @@ class AlpacaWindow(Adw.ApplicationWindow):
except: return
try:
self.attached_image["path"] = file.get_path()
'''with open(self.attached_image["path"], "rb") as image_file:
self.attached_image["base64"] = base64.b64encode(image_file.read()).decode("utf-8")'''
with Image.open(self.attached_image["path"]) as img:
width, height = img.size
max_size = 240
@@ -637,12 +696,12 @@ class AlpacaWindow(Adw.ApplicationWindow):
def open_image(self, button):
if "destructive-action" in button.get_css_classes():
dialog = Adw.AlertDialog(
heading=f"Remove Image?",
body=f"Are you sure you want to remove image?",
heading=_("Remove Image"),
body=_("Are you sure you want to remove image?"),
close_response="cancel"
)
dialog.add_response("cancel", "Cancel")
dialog.add_response("remove", "Remove")
dialog.add_response("cancel", _("Cancel"))
dialog.add_response("remove", _("Remove"))
dialog.set_response_appearance("remove", Adw.ResponseAppearance.DESTRUCTIVE)
dialog.choose(
parent = self,
@@ -664,12 +723,12 @@ class AlpacaWindow(Adw.ApplicationWindow):
self.show_toast("error", 6, self.main_overlay)
return
dialog = Adw.AlertDialog(
heading=f"Delete Chat",
body=f"Are you sure you want to delete '{chat_name}'?",
heading=_("Delete Chat"),
body=_("Are you sure you want to delete '{}'?").format(chat_name),
close_response="cancel"
)
dialog.add_response("cancel", "Cancel")
dialog.add_response("delete", "Delete")
dialog.add_response("cancel", _("Cancel"))
dialog.add_response("delete", _("Delete"))
dialog.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE)
dialog.choose(
parent = self,
@@ -695,14 +754,14 @@ class AlpacaWindow(Adw.ApplicationWindow):
css_classes = ["error"] if error else None
)
dialog = Adw.AlertDialog(
heading=f"Rename Chat",
heading=_("Rename Chat"),
body=body,
extra_child=entry,
close_response="cancel"
)
entry.connect("activate", lambda entry, dialog=dialog, old_chat_name=chat_name: self.chat_rename(dialog=dialog, old_chat_name=old_chat_name, entry=entry))
dialog.add_response("cancel", "Cancel")
dialog.add_response("rename", "Rename")
dialog.add_response("cancel", _("Cancel"))
dialog.add_response("rename", _("Rename"))
dialog.set_response_appearance("rename", Adw.ResponseAppearance.SUGGESTED)
dialog.choose(
parent = self,
@@ -713,9 +772,16 @@ class AlpacaWindow(Adw.ApplicationWindow):
def chat_new(self, dialog=None, task=None, entry=None):
if not entry: return
chat_name = entry.get_text()
if chat_name and (not task or dialog.choose_finish(task) == "create"):
if not chat_name:
chat_name=_("New Chat")
if chat_name in self.chats["chats"]:
for i in range(len(list(self.chats["chats"].keys()))):
if chat_name + f" {i+1}" not in self.chats["chats"]:
chat_name += f" {i+1}"
break
if not task or dialog.choose_finish(task) == "create":
dialog.force_close()
if chat_name in self.chats["chats"]: self.chat_new_dialog(f"The name '{chat_name}' is already in use", True)
if chat_name in self.chats["chats"]: self.chat_new_dialog(_("The name '{}' is already in use").format(chat_name), True)
else:
self.chats["chats"][chat_name] = {"messages": []}
self.chats["selected_chat"] = chat_name
@@ -728,14 +794,14 @@ class AlpacaWindow(Adw.ApplicationWindow):
css_classes = ["error"] if error else None
)
dialog = Adw.AlertDialog(
heading=f"Create Chat",
heading=_("Create Chat"),
body=body,
extra_child=entry,
close_response="cancel"
)
entry.connect("activate", lambda entry, dialog=dialog: self.chat_new(dialog=dialog, entry=entry))
dialog.add_response("cancel", "Cancel")
dialog.add_response("create", "Create")
dialog.add_response("cancel", _("Cancel"))
dialog.add_response("create", _("Create"))
dialog.set_response_appearance("rename", Adw.ResponseAppearance.SUGGESTED)
dialog.choose(
parent = self,
@@ -754,7 +820,7 @@ class AlpacaWindow(Adw.ApplicationWindow):
css_classes = ["card"]
)
button_delete = Gtk.Button(
icon_name = "edit-delete-symbolic",
icon_name = "user-trash-symbolic",
vexpand = False,
valign = 3,
css_classes = ["error", "flat"]
@@ -783,19 +849,20 @@ class AlpacaWindow(Adw.ApplicationWindow):
self.model_drop_down.set_selected(i)
break
def selected_model_changed(self, pspec=None, user_data=None):
self.verify_if_image_can_be_used()
def __init__(self, **kwargs):
super().__init__(**kwargs)
GtkSource.init()
self.set_help_overlay(self.shortcut_window)
self.get_application().set_accels_for_action("win.show-help-overlay", ['<primary>slash'])
self.get_application().create_action('send', lambda *_: self.send_message(self), ['<primary>Return'])
self.manage_models_button.connect("clicked", self.manage_models_button_activate)
self.send_button.connect("clicked", self.send_message)
self.image_button.connect("clicked", self.open_image)
self.add_chat_button.connect("clicked", lambda button : self.chat_new_dialog("Enter name for new chat", False))
self.set_default_widget(self.send_button)
self.model_drop_down.connect("notify", self.selected_model_changed)
self.model_drop_down.connect("notify", self.verify_if_image_can_be_used)
self.chat_list_box.connect("row-selected", self.chat_changed)
#self.message_text_view.set_activates_default(self.send_button)
self.connection_carousel.connect("page-changed", self.connection_carousel_page_changed)
@@ -808,5 +875,8 @@ class AlpacaWindow(Adw.ApplicationWindow):
with open(os.path.join(self.config_dir, "server.conf"), "r") as f:
self.ollama_url = f.read()
if self.verify_connection() is False: self.show_connection_dialog(True)
else: self.connection_dialog.present(self)
else:
self.first_time_setup = True
self.connection_dialog.present(self)
self.update_list_available_models()
self.update_chat_list()

View File

@@ -4,20 +4,36 @@
<requires lib="Adw" version="1.0"/>
<template class="AlpacaWindow" parent="AdwApplicationWindow">
<property name="resizable">True</property>
<property name="width-request">600</property>
<property name="height-request">800</property>
<property name="width-request">350</property>
<property name="height-request">500</property>
<property name="default-width">1300</property>
<property name="default-height">800</property>
<!--
<property name="min-content-width">500</property>
<property name="min-content-height">600</property>
-->
<child>
<object class="AdwBreakpoint">
<condition>max-width: 800sp</condition>
<setter object="split_view_overlay" property="collapsed">true</setter>
</object>
</child>
<child>
</child>
<child>
<object class="AdwBreakpoint">
<condition>max-width: 500sp</condition>
<setter object="split_view_overlay" property="collapsed">true</setter>
<setter object="connection_dialog" property="width-request">400</setter>
<setter object="connection_dialog" property="height-request">400</setter>
<setter object="manage_models_dialog" property="width-request">400</setter>
</object>
</child>
<child>
<object class="AdwBreakpoint">
<condition>max-width: 400sp</condition>
<setter object="split_view_overlay" property="collapsed">true</setter>
<setter object="connection_dialog" property="width-request">300</setter>
<setter object="connection_dialog" property="height-request">300</setter>
<setter object="manage_models_dialog" property="width-request">300</setter>
</object>
</child>
<property name="content">
<object class="AdwToastOverlay" id="main_overlay">
<child>
@@ -26,13 +42,12 @@
<property name="sidebar">
<object class="GtkBox">
<property name="spacing">12</property>
<property name="margin-top">12</property>
<property name="margin-bottom">12</property>
<property name="margin-start">12</property>
<property name="margin-end">12</property>
<property name="orientation">1</property>
<child>
<object class="GtkBox">
<property name="margin-top">12</property>
<property name="margin-start">12</property>
<property name="margin-end">12</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel">
@@ -65,10 +80,9 @@
<property name="hexpand">true</property>
<child>
<object class="GtkListBox" id="chat_list_box">
<property name="selection-mode">single</property>
<style>
<class name="boxed-list"/>
<class name="navigation-sidebar"></class>
</style>
</object>
</child>
@@ -83,7 +97,7 @@
<child type="start">
<object class="GtkToggleButton" id="show_sidebar_button">
<property name="icon-name">sidebar-show-symbolic</property>
<property name="tooltip-text" translatable="true">Toggle Sidebar</property>
<property name="tooltip-text" translatable="yes">Toggle Sidebar</property>
<property name="active" bind-source="split_view_overlay" bind-property="show-sidebar" bind-flags="sync-create"/>
</object>
</child>
@@ -136,10 +150,7 @@
<child>
<object class="GtkScrolledWindow" id="chat_window">
<property name="margin-bottom">12</property>
<property name="has-frame">true</property>
<property name="propagate-natural-height">true</property>
<property name="min-content-width">500</property>
<property name="min-content-height">600</property>
<property name="kinetic-scrolling">1</property>
<property name="vexpand">true</property>
<style>
@@ -199,7 +210,7 @@
</style>
<child>
<object class="AdwButtonContent">
<property name="label" translatable="true">Send</property>
<property name="label" translatable="yes">Send</property>
<property name="icon-name">send-to-symbolic</property>
</object>
</child>
@@ -208,10 +219,10 @@
<child>
<object class="GtkButton" id="image_button">
<property name="sensitive">false</property>
<property name="tooltip-text" translatable="true">Requires model 'llava' to be selected</property>
<property name="tooltip-text" translatable="yes">Requires model 'llava' to be selected</property>
<child>
<object class="AdwButtonContent">
<property name="label" translatable="true">Image</property>
<property name="label" translatable="yes">Image</property>
<property name="icon-name">image-x-generic-symbolic</property>
</object>
</child>
@@ -231,35 +242,6 @@
</object>
</property>
<object class="AdwDialog" id="pull_model_dialog">
<property name="can-close">false</property>
<property name="width-request">400</property>
<child>
<object class="AdwToastOverlay" id="pull_overlay">
<child>
<object class="AdwToolbarView">
<child>
<object class="AdwStatusPage" id="pull_model_status_page">
<property name="hexpand">true</property>
<property name="vexpand">true</property>
<property name="margin-top">24</property>
<property name="margin-bottom">24</property>
<property name="margin-start">24</property>
<property name="margin-end">24</property>
<property name="title" translatable="yes">Pulling Model</property>
<child>
<object class="GtkProgressBar" id="pull_model_progress_bar">
<property name="show-text">true</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<object class="AdwDialog" id="manage_models_dialog">
<property name="can-close">true</property>
<property name="width-request">400</property>
@@ -272,7 +254,7 @@
<object class="AdwHeaderBar">
<property name="title-widget">
<object class="AdwWindowTitle">
<property name="title">Manage models</property>
<property name="title" translatable="yes">Manage models</property>
</object>
</property>
</object>
@@ -281,26 +263,30 @@
<object class="GtkScrolledWindow">
<property name="hexpand">true</property>
<property name="vexpand">true</property>
<property name="margin-top">0</property>
<property name="margin-bottom">24</property>
<property name="margin-start">24</property>
<property name="margin-end">24</property>
<child>
<object class="GtkBox">
<property name="margin-start">12</property>
<property name="margin-end">12</property>
<property name="margin-top">12</property>
<property name="margin-bottom">12</property>
<property name="orientation">1</property>
<property name="spacing">12</property>
<child>
<object class="GtkListBox" id="pulling_model_list_box">
<property name="visible">false</property>
<property name="selection-mode">none</property>
<style>
<class name="boxed-list"/>
<class name="card"/>
</style>
</object>
</child>
<child>
<object class="GtkListBox" id="local_model_list_box">
<property name="selection-mode">none</property>
<style>
<class name="boxed-list"/>
</style>
</object>
</child>
<child>
<object class="GtkSeparator">
<style>
<class name="spacer"/>
<class name="card"/>
</style>
</object>
</child>
@@ -387,7 +373,7 @@
<property name="description" translatable="yes">To get started, please ensure you have an Ollama instance set up. You can either run Ollama locally on your machine or connect to a remote instance.</property>
<child>
<object class="GtkLinkButton">
<property name="label" translatable="true">Ollama Website</property>
<property name="label" translatable="yes">Ollama Website</property>
<property name="uri">https://ollama.com/</property>
<property name="margin-top">12</property>
</object>
@@ -437,15 +423,19 @@
<menu id="primary_menu">
<section>
<item>
<attribute name="label" translatable="yes">_Clear Chat</attribute>
<attribute name="label" translatable="yes">Clear Chat</attribute>
<attribute name="action">app.clear</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Change Server</attribute>
<attribute name="label" translatable="yes">Change Server</attribute>
<attribute name="action">app.reconnect</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_About Alpaca</attribute>
<attribute name="label" translatable="yes">Keyboard Shortcuts</attribute>
<attribute name="action">win.show-help-overlay</attribute>
</item>
<item>
<attribute name="label" translatable="yes">About Alpaca</attribute>
<attribute name="action">app.about</attribute>
</item>
</section>
@@ -459,4 +449,66 @@
<mime-type>image/gif</mime-type>
</mime-types>
</object>
<object class="GtkShortcutsWindow" id="shortcut_window">
<property name="modal">1</property>
<child>
<object class="GtkShortcutsSection">
<property name="section-name">shortcuts</property>
<property name="max-height">10</property>
<child>
<object class="GtkShortcutsGroup">
<property name="title" translatable="yes">General</property>
<child>
<object class="GtkShortcutsShortcut">
<property name="accelerator">&lt;ctrl&gt;Q</property>
<property name="title" translatable="yes">Close application</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="accelerator">&lt;ctrl&gt;E</property>
<property name="title" translatable="yes">Clear chat</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="accelerator">&lt;ctrl&gt;R</property>
<property name="title" translatable="yes">Change server</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="accelerator">&lt;ctrl&gt;slash</property>
<property name="title" translatable="yes">Show shortcuts window</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkShortcutsGroup">
<property name="title" translatable="yes">Editor</property>
<child>
<object class="GtkShortcutsShortcut">
<property name="accelerator">&lt;ctrl&gt;C</property>
<property name="title" translatable="yes">Copy</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="accelerator">&lt;ctrl&gt;V</property>
<property name="title" translatable="yes">Paste</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="accelerator">&lt;ctrl&gt;Return</property>
<property name="title" translatable="yes">Send Message</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>

8
update_translation_files.sh Executable file
View File

@@ -0,0 +1,8 @@
#!/usr/bin/env bash
cd "$(dirname "$0")"
echo "Preparing template..."
xgettext --output=po/alpaca.pot --files-from=po/POTFILES
echo "Updating Spanish..."
msgmerge -U po/es.po po/alpaca.pot
echo "Updating Russian..."
msgmerge -U po/ru.po po/alpaca.pot